diff --git a/gotify_tray/database/default_settings.py b/gotify_tray/database/default_settings.py index 87d3c94..43f0b80 100644 --- a/gotify_tray/database/default_settings.py +++ b/gotify_tray/database/default_settings.py @@ -1,4 +1,6 @@ DEFAULT_SETTINGS = { + "message/check_missed/notify": False, + "message/last_id": 0, "logging/level": "Disabled", "tray/notifications/priority": 5, "tray/notifications/duration_ms": 5000, diff --git a/gotify_tray/gui/MainApplication.py b/gotify_tray/gui/MainApplication.py index d824a68..4493e65 100644 --- a/gotify_tray/gui/MainApplication.py +++ b/gotify_tray/gui/MainApplication.py @@ -80,6 +80,8 @@ class MainApplication(QtWidgets.QApplication): self.tray = Tray() self.tray.show() + self.first_connect = True + self.gotify_client.listen( new_message_callback=self.new_message_callback, opened_callback=self.listener_opened_callback, @@ -123,10 +125,39 @@ class MainApplication(QtWidgets.QApplication): i + 1, 0, ApplicationModelItem(application, icon), ) + def update_last_id(self, i: int): + if i > settings.value("message/last_id", type=int): + settings.setValue("message/last_id", i) + def listener_opened_callback(self): self.main_window.set_active() self.tray.set_icon_ok() + if self.first_connect: + # Do not check for missed messages on launch + self.first_connect = False + return + + def get_missed_messages_callback(page: gotify.GotifyPagedMessagesModel): + last_id = settings.value("message/last_id", type=int) + ids = [] + + page.messages.reverse() + for message in page.messages: + if message.id > last_id: + if settings.value("message/check_missed/notify", type=bool): + self.new_message_callback(message) + else: + self.add_message_to_model(message) + ids.append(message.id) + + if ids: + self.update_last_id(max(ids)) + + self.get_missed_messages_task = GetMessagesTask(self.gotify_client) + self.get_missed_messages_task.success.connect(get_missed_messages_callback) + self.get_missed_messages_task.start() + def listener_closed_callback(self, close_status_code: int, close_msg: str): self.main_window.set_connecting() self.tray.set_icon_error() @@ -149,6 +180,7 @@ class MainApplication(QtWidgets.QApplication): message: gotify.GotifyMessageModel, application: gotify.GotifyApplicationModel, ): + self.update_last_id(message.id) message_item = MessagesModelItem(message) self.messages_model.insertRow(row, message_item) self.main_window.insert_message_widget( diff --git a/gotify_tray/gui/designs/widget_settings.py b/gotify_tray/gui/designs/widget_settings.py index 218f9bd..310a6ab 100644 --- a/gotify_tray/gui/designs/widget_settings.py +++ b/gotify_tray/gui/designs/widget_settings.py @@ -17,7 +17,11 @@ class Ui_Dialog(object): self.gridLayout.setObjectName("gridLayout") self.buttonBox = QtWidgets.QDialogButtonBox(Dialog) self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal) - self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.StandardButton.Apply|QtWidgets.QDialogButtonBox.StandardButton.Cancel|QtWidgets.QDialogButtonBox.StandardButton.Ok) + self.buttonBox.setStandardButtons( + QtWidgets.QDialogButtonBox.StandardButton.Apply + | QtWidgets.QDialogButtonBox.StandardButton.Cancel + | QtWidgets.QDialogButtonBox.StandardButton.Ok + ) self.buttonBox.setObjectName("buttonBox") self.gridLayout.addWidget(self.buttonBox, 1, 0, 1, 1) self.tabWidget = QtWidgets.QTabWidget(Dialog) @@ -30,29 +34,37 @@ class Ui_Dialog(object): self.groupBox_5.setObjectName("groupBox_5") self.gridLayout_4 = QtWidgets.QGridLayout(self.groupBox_5) self.gridLayout_4.setObjectName("gridLayout_4") + spacerItem = QtWidgets.QSpacerItem( + 40, + 20, + QtWidgets.QSizePolicy.Policy.Expanding, + QtWidgets.QSizePolicy.Policy.Minimum, + ) + self.gridLayout_4.addItem(spacerItem, 0, 2, 1, 1) + self.label_6 = QtWidgets.QLabel(self.groupBox_5) + self.label_6.setObjectName("label_6") + self.gridLayout_4.addWidget(self.label_6, 1, 2, 1, 1) + self.label_4 = QtWidgets.QLabel(self.groupBox_5) + self.label_4.setObjectName("label_4") + self.gridLayout_4.addWidget(self.label_4, 0, 0, 1, 1) + self.label_5 = QtWidgets.QLabel(self.groupBox_5) + self.label_5.setObjectName("label_5") + self.gridLayout_4.addWidget(self.label_5, 1, 0, 1, 1) self.spin_duration = QtWidgets.QSpinBox(self.groupBox_5) self.spin_duration.setMinimum(500) self.spin_duration.setMaximum(30000) self.spin_duration.setSingleStep(100) self.spin_duration.setObjectName("spin_duration") self.gridLayout_4.addWidget(self.spin_duration, 1, 1, 1, 1) - self.label_6 = QtWidgets.QLabel(self.groupBox_5) - self.label_6.setObjectName("label_6") - self.gridLayout_4.addWidget(self.label_6, 1, 2, 1, 1) - self.label_5 = QtWidgets.QLabel(self.groupBox_5) - self.label_5.setObjectName("label_5") - self.gridLayout_4.addWidget(self.label_5, 1, 0, 1, 1) - spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) - self.gridLayout_4.addItem(spacerItem, 0, 2, 1, 1) - self.label_4 = QtWidgets.QLabel(self.groupBox_5) - self.label_4.setObjectName("label_4") - self.gridLayout_4.addWidget(self.label_4, 0, 0, 1, 1) self.spin_priority = QtWidgets.QSpinBox(self.groupBox_5) self.spin_priority.setMinimum(1) self.spin_priority.setMaximum(10) self.spin_priority.setProperty("value", 5) self.spin_priority.setObjectName("spin_priority") self.gridLayout_4.addWidget(self.spin_priority, 0, 1, 1, 1) + self.cb_notify = QtWidgets.QCheckBox(self.groupBox_5) + self.cb_notify.setObjectName("cb_notify") + self.gridLayout_4.addWidget(self.cb_notify, 2, 0, 1, 3) self.verticalLayout_4.addWidget(self.groupBox_5) self.groupBox_4 = QtWidgets.QGroupBox(self.tab_general) self.groupBox_4.setObjectName("groupBox_4") @@ -61,7 +73,12 @@ class Ui_Dialog(object): self.pb_change_server_info = QtWidgets.QPushButton(self.groupBox_4) self.pb_change_server_info.setObjectName("pb_change_server_info") self.gridLayout_3.addWidget(self.pb_change_server_info, 0, 0, 1, 1) - spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + spacerItem1 = QtWidgets.QSpacerItem( + 40, + 20, + QtWidgets.QSizePolicy.Policy.Expanding, + QtWidgets.QSizePolicy.Policy.Minimum, + ) self.gridLayout_3.addItem(spacerItem1, 0, 1, 1, 1) self.verticalLayout_4.addWidget(self.groupBox_4) self.groupBox_7 = QtWidgets.QGroupBox(self.tab_general) @@ -78,10 +95,20 @@ class Ui_Dialog(object): self.pb_open_log.setMaximumSize(QtCore.QSize(30, 16777215)) self.pb_open_log.setObjectName("pb_open_log") self.gridLayout_6.addWidget(self.pb_open_log, 0, 2, 1, 1) - spacerItem2 = QtWidgets.QSpacerItem(190, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) + spacerItem2 = QtWidgets.QSpacerItem( + 190, + 20, + QtWidgets.QSizePolicy.Policy.Expanding, + QtWidgets.QSizePolicy.Policy.Minimum, + ) self.gridLayout_6.addItem(spacerItem2, 0, 3, 1, 1) self.verticalLayout_4.addWidget(self.groupBox_7) - spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) + spacerItem3 = QtWidgets.QSpacerItem( + 20, + 40, + QtWidgets.QSizePolicy.Policy.Minimum, + QtWidgets.QSizePolicy.Policy.Expanding, + ) self.verticalLayout_4.addItem(spacerItem3) self.tabWidget.addTab(self.tab_general, "") self.tab_fonts = QtWidgets.QWidget() @@ -107,7 +134,12 @@ class Ui_Dialog(object): self.horizontalLayout.addWidget(self.pb_font_message_content) self.layout_fonts_message.addLayout(self.horizontalLayout) self.verticalLayout_5.addWidget(self.groupBox_2) - spacerItem4 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) + spacerItem4 = QtWidgets.QSpacerItem( + 20, + 40, + QtWidgets.QSizePolicy.Policy.Minimum, + QtWidgets.QSizePolicy.Policy.Expanding, + ) self.verticalLayout_5.addItem(spacerItem4) self.tabWidget.addTab(self.tab_fonts, "") self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 1) @@ -119,7 +151,8 @@ class Ui_Dialog(object): QtCore.QMetaObject.connectSlotsByName(Dialog) Dialog.setTabOrder(self.tabWidget, self.spin_priority) Dialog.setTabOrder(self.spin_priority, self.spin_duration) - Dialog.setTabOrder(self.spin_duration, self.pb_change_server_info) + Dialog.setTabOrder(self.spin_duration, self.cb_notify) + Dialog.setTabOrder(self.cb_notify, self.pb_change_server_info) Dialog.setTabOrder(self.pb_change_server_info, self.combo_logging) Dialog.setTabOrder(self.combo_logging, self.pb_open_log) Dialog.setTabOrder(self.pb_open_log, self.pb_font_message_title) @@ -131,24 +164,37 @@ class Ui_Dialog(object): Dialog.setWindowTitle(_translate("Dialog", "Dialog")) self.groupBox_5.setTitle(_translate("Dialog", "Notifications")) self.label_6.setText(_translate("Dialog", "ms")) - self.label_5.setText(_translate("Dialog", "Notification duration")) - self.label_4.setText(_translate("Dialog", "Minimum priority to show notifications:")) + self.label_4.setText( + _translate("Dialog", "Minimum priority to show notifications:") + ) + self.label_5.setText(_translate("Dialog", "Notification duration:")) + self.cb_notify.setText( + _translate( + "Dialog", + "Show a notification for missed messages after reconnecting", + ) + ) self.groupBox_4.setTitle(_translate("Dialog", "Server info")) self.pb_change_server_info.setText(_translate("Dialog", "Change server info")) self.groupBox_7.setTitle(_translate("Dialog", "Logging")) self.label_7.setText(_translate("Dialog", "Level")) self.pb_open_log.setToolTip(_translate("Dialog", "Open logfile")) self.pb_open_log.setText(_translate("Dialog", "...")) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_general), _translate("Dialog", "General")) + self.tabWidget.setTabText( + self.tabWidget.indexOf(self.tab_general), _translate("Dialog", "General") + ) self.groupBox_2.setTitle(_translate("Dialog", "Message")) self.pb_font_message_title.setText(_translate("Dialog", "Title")) self.pb_font_message_date.setText(_translate("Dialog", "Date")) self.pb_font_message_content.setText(_translate("Dialog", "Message")) - self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_fonts), _translate("Dialog", "Fonts")) + self.tabWidget.setTabText( + self.tabWidget.indexOf(self.tab_fonts), _translate("Dialog", "Fonts") + ) if __name__ == "__main__": import sys + app = QtWidgets.QApplication(sys.argv) Dialog = QtWidgets.QDialog() ui = Ui_Dialog() diff --git a/gotify_tray/gui/designs/widget_settings.ui b/gotify_tray/gui/designs/widget_settings.ui index cc34928..cda48fe 100644 --- a/gotify_tray/gui/designs/widget_settings.ui +++ b/gotify_tray/gui/designs/widget_settings.ui @@ -40,33 +40,6 @@ Notifications - - - - 500 - - - 30000 - - - 100 - - - - - - - ms - - - - - - - Notification duration - - - @@ -80,6 +53,13 @@ + + + + ms + + + @@ -87,6 +67,26 @@ + + + + Notification duration: + + + + + + + 500 + + + 30000 + + + 100 + + + @@ -100,6 +100,13 @@ + + + + Show a notification for missed messages after reconnecting + + + @@ -272,6 +279,7 @@ tabWidget spin_priority spin_duration + cb_notify pb_change_server_info combo_logging pb_open_log diff --git a/gotify_tray/gui/widgets/SettingsDialog.py b/gotify_tray/gui/widgets/SettingsDialog.py index 57a422a..b1f08c1 100644 --- a/gotify_tray/gui/widgets/SettingsDialog.py +++ b/gotify_tray/gui/widgets/SettingsDialog.py @@ -43,6 +43,10 @@ class SettingsDialog(QtWidgets.QDialog, Ui_Dialog): settings.value("tray/notifications/duration_ms", type=int) ) + self.cb_notify.setChecked( + settings.value("message/check_missed/notify", type=bool) + ) + # Logging self.combo_logging.addItems( [ @@ -97,6 +101,7 @@ class SettingsDialog(QtWidgets.QDialog, Ui_Dialog): # Notifications self.spin_priority.valueChanged.connect(self.settings_changed_callback) self.spin_duration.valueChanged.connect(self.settings_changed_callback) + self.cb_notify.stateChanged.connect(self.settings_changed_callback) # Server info self.pb_change_server_info.clicked.connect(self.change_server_info_callback) @@ -122,6 +127,7 @@ class SettingsDialog(QtWidgets.QDialog, Ui_Dialog): # Priority settings.setValue("tray/notifications/priority", self.spin_priority.value()) settings.setValue("tray/notifications/duration_ms", self.spin_duration.value()) + settings.setValue("message/check_missed/notify", self.cb_notify.isChecked()) # Logging selected_level = self.combo_logging.currentText()