Prepare loading of events from load dialog into main window

Add nicer label for counting events by type
This commit is contained in:
Xevion
2021-08-25 07:13:24 -05:00
parent 0d6909a9b1
commit ce3759bd60
5 changed files with 57 additions and 12 deletions

View File

@@ -140,7 +140,7 @@ class Event(object):
table.setItem(row, 3, QTableWidgetItem(self.end.strftime(formatString)))
@classmethod
def parse_raw(self, input: Tuple[str]) -> 'Event':
def parse_raw(cls, input: Tuple[str]) -> 'Event':
"""Takes in input that has been separated by a RegEx expression into groups and creates a Event object"""
first_time = re.match(TIME_REGEX, input[2]) is not None
second_time = re.match(TIME_REGEX, input[3 + (1 if first_time else 0)])

View File

@@ -1,11 +1,13 @@
import dateutil
import itertools
from typing import Iterator, List
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QDialog, QMainWindow, QTableWidgetItem
from dateutil.parser import isoparse
from PyQt5.QtWidgets import QMainWindow, QMessageBox
from bulk_reminders import api, undo
from bulk_reminders.api import Event
from bulk_reminders.gui_base import Ui_MainWindow
from bulk_reminders.load import LoadDialog
from bulk_reminders.oauth import OAuthDialog
@@ -36,6 +38,9 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.calendarCombobox.setModel(self.comboModel)
self.calendarCombobox.currentIndexChanged[int].connect(self.comboBoxChanged)
# Make sure the current calendar ID matches up
self.currentCalendarID = self.comboModel.item(self.calendarCombobox.currentIndex()).data()
# Setup Column View headers
self.eventsView.setColumnCount(4)
self.eventsView.setHorizontalHeaderLabels(['Summary', 'Status', 'Start', 'End'])
@@ -53,8 +58,24 @@ class MainWindow(QMainWindow, Ui_MainWindow):
if len(undo.stages) == 0:
self.undoButton.setDisabled(True)
self.loadEventsButton.clicked.connect(self.load_events)
self.cachedLoadText = ''
self.readyEvents = []
self.populate()
def load_events(self) -> None:
"""Open the event loading dialog"""
dial = LoadDialog()
dial.plainTextEdit.setPlainText(self.cachedLoadText)
result = dial.exec()
if result == QMessageBox.Accepted:
self.cachedLoadText = dial.plainTextEdit.toPlainText()
self.readyEvents = dial.parsed
self.populate()
elif result == QMessageBox.Cancel:
pass
def undo(self) -> None:
# Get the latest undo stage and delete all events in that stage
latest = undo.stages.pop(0)
@@ -65,13 +86,23 @@ class MainWindow(QMainWindow, Ui_MainWindow):
if len(undo.stages) == 0:
self.undoButton.setDisabled(True)
def getForeign(self) -> List[Event]:
"""Returns all events currently tracked that are not stored in the undo."""
events = {event['id'] : event for event in self.apiEvents}
undoableIDs = itertools.chain.from_iterable([[undoable['id'] for undoable in stage] for stage in undo.stages])
foreignIDs = events.keys() - undoableIDs
return [events[foreignID] for foreignID in foreignIDs]
def submit(self) -> None:
pass
def populate(self) -> None:
"""Re-populate the table with all of the events"""
self.events = [Event.from_api(event) for event in self.calendar.getEvents(self.currentCalendarID)]
self.apiEvents = self.calendar.getEvents(self.currentCalendarID)
self.events = [Event.from_api(event) for event in self.apiEvents]
ready, undoable, stage, foreign = len(self.readyEvents), undo.getTotal(), len(undo.stages), len(self.getForeign())
total = ready + undoable + stage + foreign
self.eventCountLabel.setText(f'{len(self.readyEvents)} ready, {undoable} undoable in {stage} stages, {foreign} foreign ({total})')
self.eventsView.setRowCount(len(self.events))
for row, event in enumerate(self.events):
event.fill_row(row, self.eventsView)

View File

@@ -52,6 +52,14 @@ class Ui_MainWindow(object):
self.calendarCombobox.setMinimumSize(QtCore.QSize(140, 0))
self.calendarCombobox.setObjectName("calendarCombobox")
self.horizontalLayout.addWidget(self.calendarCombobox)
self.eventCountLabel = QtWidgets.QLabel(self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.eventCountLabel.sizePolicy().hasHeightForWidth())
self.eventCountLabel.setSizePolicy(sizePolicy)
self.eventCountLabel.setObjectName("eventCountLabel")
self.horizontalLayout.addWidget(self.eventCountLabel)
spacerItem = QtWidgets.QSpacerItem(30, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout.addItem(spacerItem)
self.undoButton = QtWidgets.QPushButton(self.centralwidget)
@@ -73,7 +81,8 @@ class Ui_MainWindow(object):
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
MainWindow.setWindowTitle(_translate("MainWindow", "Bulk Reminders"))
self.loadEventsButton.setText(_translate("MainWindow", "Load events"))
self.submitButton.setText(_translate("MainWindow", "Submit"))
self.eventCountLabel.setText(_translate("MainWindow", "34 ready, 26 undoable in 3 stages, 18 prexisting (94)"))
self.undoButton.setText(_translate("MainWindow", "Undo"))

View File

@@ -1,6 +1,6 @@
import os
import re
from typing import List
from typing import List, Optional
from PyQt5.QtCore import QSize, QTimer
from PyQt5.QtGui import QMovie
@@ -33,16 +33,16 @@ class LoadDialog(QDialog, Ui_Dialog):
self.parseTimer.timeout.connect(self.parse)
self.parseTimer.setSingleShot(True)
self.show()
self.parse()
self.parsed: List[Event] = []
self.eventCountLabel.setText('0 groups found.')
self.show()
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.eventCountLabel.setText(f'{len(results)} group{"s" if len(results) != 1 else ""} found.')
self.parsed = list(map(Event.parse_raw, results))
def edited(self) -> None:

View File

@@ -18,3 +18,8 @@ def save() -> None:
if os.path.exists('history.json'):
load()
def getTotal() -> int:
"""Returns the total number of undoable events known."""
return sum(len(stage) for stage in stages)