diff --git a/bulk_reminders/load.py b/bulk_reminders/load.py new file mode 100644 index 0000000..80960d6 --- /dev/null +++ b/bulk_reminders/load.py @@ -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 diff --git a/bulk_reminders/load.ui b/bulk_reminders/load.ui new file mode 100644 index 0000000..7e9de6b --- /dev/null +++ b/bulk_reminders/load.ui @@ -0,0 +1,88 @@ + + + Dialog + + + + 0 + 0 + 400 + 300 + + + + Load Events + + + + + + + + + + + ... + + + + + + + 3 events found. + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + false + + + + + + + + + + + buttonBox + accepted() + Dialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + Dialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/bulk_reminders/load_base.py b/bulk_reminders/load_base.py new file mode 100644 index 0000000..57caabb --- /dev/null +++ b/bulk_reminders/load_base.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'load.ui' +# +# Created by: PyQt5 UI code generator 5.15.4 +# +# WARNING: Any manual changes made to this file will be lost when pyuic5 is +# run again. Do not edit this file unless you know what you are doing. + + +from PyQt5 import QtCore, QtGui, QtWidgets + + +class Ui_Dialog(object): + def setupUi(self, Dialog): + Dialog.setObjectName("Dialog") + Dialog.resize(400, 300) + self.gridLayout = QtWidgets.QGridLayout(Dialog) + self.gridLayout.setObjectName("gridLayout") + self.plainTextEdit = QtWidgets.QPlainTextEdit(Dialog) + self.plainTextEdit.setObjectName("plainTextEdit") + self.gridLayout.addWidget(self.plainTextEdit, 0, 0, 1, 1) + self.horizontalLayout = QtWidgets.QHBoxLayout() + self.horizontalLayout.setObjectName("horizontalLayout") + self.toolButton = QtWidgets.QToolButton(Dialog) + self.toolButton.setObjectName("toolButton") + self.horizontalLayout.addWidget(self.toolButton) + self.eventCountLabel = QtWidgets.QLabel(Dialog) + self.eventCountLabel.setObjectName("eventCountLabel") + self.horizontalLayout.addWidget(self.eventCountLabel) + self.buttonBox = QtWidgets.QDialogButtonBox(Dialog) + self.buttonBox.setOrientation(QtCore.Qt.Horizontal) + self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok) + self.buttonBox.setCenterButtons(False) + self.buttonBox.setObjectName("buttonBox") + self.horizontalLayout.addWidget(self.buttonBox) + self.gridLayout.addLayout(self.horizontalLayout, 1, 0, 1, 1) + + self.retranslateUi(Dialog) + self.buttonBox.accepted.connect(Dialog.accept) + self.buttonBox.rejected.connect(Dialog.reject) + QtCore.QMetaObject.connectSlotsByName(Dialog) + + def retranslateUi(self, Dialog): + _translate = QtCore.QCoreApplication.translate + Dialog.setWindowTitle(_translate("Dialog", "Load Events")) + self.toolButton.setText(_translate("Dialog", "...")) + self.eventCountLabel.setText(_translate("Dialog", "3 events found.")) diff --git a/bulk_reminders/loading.gif b/bulk_reminders/loading.gif new file mode 100644 index 0000000..cbb2c0b Binary files /dev/null and b/bulk_reminders/loading.gif differ