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()