mirror of
https://github.com/Xevion/bulk-reminders.git
synced 2025-12-07 20:06:33 -06:00
Implement input event load dialog with loading gif and debouncing
This commit is contained in:
52
bulk_reminders/load.py
Normal file
52
bulk_reminders/load.py
Normal file
@@ -0,0 +1,52 @@
|
||||
import os
|
||||
import re
|
||||
from typing import List
|
||||
|
||||
from PyQt5.QtCore import QSize, QTimer
|
||||
from PyQt5.QtGui import QMovie
|
||||
from PyQt5.QtWidgets import QApplication, QDialog, QLabel
|
||||
|
||||
from bulk_reminders.api import Event
|
||||
from bulk_reminders.load_base import Ui_Dialog
|
||||
|
||||
REGEX = re.compile(
|
||||
r'\s*([\w\d\s,.;\'!\[\]()]{1,})\s+\|\s+(\d{4}-\d{2}-\d{2})\s+(\d{1,2}:\d{2}(?:AM|PM))?\s*(\d{4}-\d{2}-\d{2})(\d{1,2}:\d{2}(?:AM|PM))?')
|
||||
|
||||
|
||||
class LoadDialog(QDialog, Ui_Dialog):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(QDialog, self).__init__(*args, **kwargs)
|
||||
self.setupUi(self)
|
||||
|
||||
self.spinner = QLabel()
|
||||
path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'loading.gif')
|
||||
self.movie = QMovie(path)
|
||||
self.movie.setScaledSize(QSize(26, 26))
|
||||
self.spinner.setMovie(self.movie)
|
||||
self.movie.start()
|
||||
self.spinner.hide()
|
||||
self.spinner.setFixedSize(23, 23)
|
||||
self.horizontalLayout.addWidget(self.spinner)
|
||||
|
||||
self.plainTextEdit.textChanged.connect(self.edited)
|
||||
self.parseTimer = QTimer()
|
||||
self.parseTimer.timeout.connect(self.parse)
|
||||
self.parseTimer.setSingleShot(True)
|
||||
|
||||
self.show()
|
||||
self.parse()
|
||||
|
||||
self.parsed: List[Event] = []
|
||||
|
||||
def parse(self) -> None:
|
||||
"""Parse the events entered into the dialog"""
|
||||
self.spinner.hide()
|
||||
results = [result.groups() for result in re.finditer(REGEX, self.plainTextEdit.toPlainText())]
|
||||
self.eventCountLabel.setText(f'{len(results)} group{"s" if len(results) != 0 else ""} found.')
|
||||
self.parsed = list(map(Event.parse_raw, results))
|
||||
|
||||
def edited(self) -> None:
|
||||
"""Prepare a timer to be fired to parse the edited text"""
|
||||
self.parseTimer.stop()
|
||||
self.spinner.show()
|
||||
self.parseTimer.start(500) # 0.5 seconds
|
||||
Reference in New Issue
Block a user