diff --git a/gotify_tray/database/default_settings.py b/gotify_tray/database/default_settings.py
index 4384dd2..0ccabd2 100644
--- a/gotify_tray/database/default_settings.py
+++ b/gotify_tray/database/default_settings.py
@@ -1,19 +1,8 @@
DEFAULT_SETTINGS = {
"logging/level": "Disabled",
- "MainWindow/start_minimized": True,
- "MainWindow/theme": "default",
- "MainWidget/status_image/size": 28,
- "MessageWidget/image/show": True,
- "MessageWidget/image/size": 33,
- "MessageWidget/font/title": "Noto Sans,17,-1,5,75,0,0,0,0,0,Bold",
- "MessageWidget/font/date": "Noto Sans,11,-1,5,50,1,0,0,0,0,Italic",
- "MessageWidget/font/content": "Noto Sans,11,-1,5,50,0,0,0,0,0,Regular",
- "ApplicationModelItem/icon/show": True,
- "ApplicationModelItem/icon/size": 33,
+ "MainApplication/theme": "default",
"tray/notifications/enabled": True,
"tray/notifications/priority": 5,
- "tray/show": True,
- "tray/minimize": True,
"tray/notifications/duration_ms": 5000,
"tray/notifications/icon/show": True,
}
diff --git a/gotify_tray/gui/ApplicationModel.py b/gotify_tray/gui/ApplicationModel.py
index 556b232..e6435aa 100644
--- a/gotify_tray/gui/ApplicationModel.py
+++ b/gotify_tray/gui/ApplicationModel.py
@@ -1,6 +1,6 @@
import enum
-from typing import Optional, Union
+from typing import Optional
from PyQt6 import QtCore, QtGui
from gotify_tray import gotify
from gotify_tray.database import Settings
@@ -36,13 +36,6 @@ class ApplicationModelItem(QtGui.QStandardItem):
)
-class ApplicationAllMessagesItem(QtGui.QStandardItem):
- def __init__(self, *args, **kwargs):
- super(ApplicationAllMessagesItem, self).__init__("ALL MESSAGES")
- self.setDropEnabled(False)
- self.setDragEnabled(False)
-
-
class ApplicationModel(QtGui.QStandardItemModel):
def __init__(self):
super(ApplicationModel, self).__init__()
@@ -50,17 +43,10 @@ class ApplicationModel(QtGui.QStandardItemModel):
ApplicationModelItem(gotify.GotifyApplicationModel({"name": ""}), None)
)
- def setItem(
- self,
- row: int,
- column: int,
- item: Union[ApplicationModelItem, ApplicationAllMessagesItem],
- ) -> None:
+ def setItem(self, row: int, column: int, item: ApplicationModelItem,) -> None:
super(ApplicationModel, self).setItem(row, column, item)
- def itemFromIndex(
- self, index: QtCore.QModelIndex
- ) -> Union[ApplicationModelItem, ApplicationAllMessagesItem]:
+ def itemFromIndex(self, index: QtCore.QModelIndex) -> ApplicationModelItem:
return super(ApplicationModel, self).itemFromIndex(index)
def itemFromId(self, appid: int) -> Optional[ApplicationModelItem]:
@@ -71,14 +57,3 @@ class ApplicationModel(QtGui.QStandardItemModel):
if item.data(ApplicationItemDataRole.ApplicationRole).id == appid:
return item
return None
-
- def save_order(self, *args):
- try:
- application_ids = [
- self.item(i, 0).data(ApplicationItemDataRole.ApplicationRole).id
- for i in range(1, self.rowCount())
- ]
- except AttributeError:
- return
-
- settings.setValue("ApplicationModel/order", application_ids)
diff --git a/gotify_tray/gui/MainApplication.py b/gotify_tray/gui/MainApplication.py
new file mode 100644
index 0000000..10607e0
--- /dev/null
+++ b/gotify_tray/gui/MainApplication.py
@@ -0,0 +1,195 @@
+import getpass
+import logging
+import os
+import sys
+import tempfile
+from typing import List
+
+from gotify_tray import gotify
+from gotify_tray.__version__ import __title__
+from gotify_tray.database import Downloader, Settings
+from gotify_tray.tasks import GetApplicationsTask, ServerConnectionWatchdogTask
+from gotify_tray.utils import verify_server
+from PyQt6 import QtCore, QtGui, QtWidgets
+
+from ..__version__ import __title__
+from .ApplicationModel import (
+ ApplicationItemDataRole,
+ ApplicationModel,
+ ApplicationModelItem,
+)
+from .SettingsDialog import SettingsDialog
+from .themes import set_theme
+from .Tray import Tray
+
+settings = Settings("gotify-tray")
+logger = logging.getLogger("gotify-tray")
+downloader = Downloader()
+
+if (level := settings.value("logging/level", type=str)) != "Disabled":
+ logger.setLevel(level)
+else:
+ logging.disable()
+
+
+title = __title__.replace(" ", "-")
+
+
+def init_logger():
+ logdir = QtCore.QStandardPaths.standardLocations(
+ QtCore.QStandardPaths.StandardLocation.AppDataLocation
+ )[0]
+ if not os.path.exists(logdir):
+ os.mkdir(logdir)
+ logging.basicConfig(
+ filename=os.path.join(logdir, f"{title}.log"),
+ format="%(levelname)s > %(name)s > %(asctime)s > %(message)s",
+ )
+
+
+class MainApplication(QtWidgets.QApplication):
+ def __init__(self, argv: List):
+ super(MainApplication, self).__init__(argv)
+ self.shutting_down = False
+
+ def init_ui(self):
+ self.setApplicationName(title)
+ self.setQuitOnLastWindowClosed(False)
+ self.setWindowIcon(QtGui.QIcon("gotify_tray/gui/images/gotify-small.png"))
+ self.setStyle("fusion")
+
+ init_logger()
+
+ self.gotify_client = gotify.GotifyClient(
+ settings.value("Server/url", type=str),
+ settings.value("Server/client_token", type=str),
+ )
+
+ set_theme(self, settings.value("MainApplication/theme", type=str))
+
+ self.application_model = ApplicationModel()
+ self.refresh_applications()
+
+ self.tray = Tray()
+ self.tray.show()
+
+ self.gotify_client.listen(
+ new_message_callback=self.new_message_callback,
+ opened_callback=self.listener_opened_callback,
+ closed_callback=self.listener_closed_callback,
+ )
+
+ self.watchdog = ServerConnectionWatchdogTask(self.gotify_client)
+ self.watchdog.closed.connect(lambda: self.listener_closed_callback(None, None))
+ self.watchdog.start()
+
+ self.link_callbacks()
+
+ def refresh_applications(self):
+ self.application_model.clear()
+
+ def get_applications_callback(
+ applications: List[gotify.GotifyApplicationModel],
+ ):
+ for i, application in enumerate(applications):
+ icon = QtGui.QIcon(
+ downloader.get_filename(
+ f"{self.gotify_client.url}/{application.image}"
+ )
+ )
+ self.application_model.setItem(
+ i, 0, ApplicationModelItem(application, icon),
+ )
+
+ self.get_applications_task = GetApplicationsTask(self.gotify_client)
+ self.get_applications_task.success.connect(get_applications_callback)
+ self.get_applications_task.start()
+
+ def listener_opened_callback(self):
+ self.tray.set_icon_ok()
+ # self.tray.actionReconnect.setEnabled(True)
+
+ def listener_closed_callback(self, close_status_code: int, close_msg: str):
+ self.tray.set_icon_error()
+ if not self.shutting_down:
+ self.gotify_client.reconnect()
+
+ def refresh_callback(self):
+ # self.tray.actionReconnect.setDisabled(True)
+ if not self.gotify_client.is_listening():
+ self.gotify_client.listener.reset_wait_time()
+ else:
+ self.gotify_client.stop(reset_wait=True)
+ self.gotify_client.reconnect(increase_wait_time=False)
+
+ def new_message_callback(self, message: gotify.GotifyMessageModel):
+ # Show a notification
+ if not (application_item := self.application_model.itemFromId(message.appid)):
+ logger.error(
+ f"MainWindow.new_message_callback: App id {message.appid} could not be found. Refreshing applications."
+ )
+ self.refresh_applications()
+ return
+
+ if message.priority >= settings.value("tray/notifications/priority", type=int):
+ image_url = f"{self.gotify_client.url}/{application_item.data(ApplicationItemDataRole.ApplicationRole).image}"
+ self.tray.showMessage(
+ message.title,
+ message.message,
+ QtGui.QIcon(downloader.get_filename(image_url))
+ if settings.value("tray/notifications/icon/show", type=bool)
+ else QtWidgets.QSystemTrayIcon.MessageIcon.Information,
+ msecs=settings.value("tray/notifications/duration_ms", type=int),
+ )
+
+ def settings_callback(self):
+ settings_dialog = SettingsDialog(self)
+ accepted = settings_dialog.exec()
+
+ if accepted and settings_dialog.settings_changed:
+ settings_dialog.apply_settings()
+
+ if settings_dialog.server_changed:
+ mb = QtWidgets.QMessageBox(
+ QtWidgets.QMessageBox.Icon.Information,
+ "Restart",
+ "Restart to apply server changes",
+ QtWidgets.QMessageBox.StandardButton.Yes
+ | QtWidgets.QMessageBox.StandardButton.Cancel,
+ )
+
+ r = mb.exec()
+ if r == QtWidgets.QMessageBox.StandardButton.Yes:
+ self.quit()
+
+ def link_callbacks(self):
+ self.tray.actionQuit.triggered.connect(self.quit)
+ self.tray.actionSettings.triggered.connect(self.settings_callback)
+ self.tray.actionReconnect.triggered.connect(self.refresh_callback)
+
+ def acquire_lock(self) -> bool:
+ temp_dir = tempfile.gettempdir()
+ lock_filename = os.path.join(
+ temp_dir, __title__ + "-" + getpass.getuser() + ".lock"
+ )
+ self.lock_file = QtCore.QLockFile(lock_filename)
+ self.lock_file.setStaleLockTime(0)
+ return self.lock_file.tryLock()
+
+ def quit(self) -> None:
+ self.tray.hide()
+
+ self.lock_file.unlock()
+
+ self.shutting_down = True
+ self.gotify_client.stop()
+ super(MainApplication, self).quit()
+
+
+def start_gui():
+ app = MainApplication(sys.argv)
+
+ # prevent multiple instances
+ if (app.acquire_lock() or "--no-lock" in sys.argv) and verify_server():
+ app.init_ui()
+ sys.exit(app.exec())
diff --git a/gotify_tray/gui/MainWindow.py b/gotify_tray/gui/MainWindow.py
deleted file mode 100644
index 92e6d67..0000000
--- a/gotify_tray/gui/MainWindow.py
+++ /dev/null
@@ -1,505 +0,0 @@
-import getpass
-import logging
-import os
-import sys
-import tempfile
-from typing import List
-
-from gotify_tray import gotify
-from gotify_tray.__version__ import __title__
-from gotify_tray.database import Downloader, Settings
-from gotify_tray.tasks import (
- DeleteAllMessagesTask,
- DeleteApplicationMessagesTask,
- DeleteMessageTask,
- GetApplicationMessagesTask,
- GetApplicationsTask,
- GetMessagesTask,
- ServerConnectionWatchdogTask,
-)
-from gotify_tray.utils import verify_server
-from PyQt6 import QtCore, QtGui, QtWidgets
-
-from ..__version__ import __title__
-from .ApplicationModel import (
- ApplicationAllMessagesItem,
- ApplicationItemDataRole,
- ApplicationModel,
- ApplicationModelItem,
-)
-from .designs.widget_main import Ui_Form as Ui_Main
-from .MessagesModel import MessageItemDataRole, MessagesModel, MessagesModelItem
-from .MessageWidget import MessageWidget
-from .SettingsDialog import SettingsDialog
-from .themes import set_theme
-from .Tray import Tray
-
-settings = Settings("gotify-tray")
-logger = logging.getLogger("gotify-tray")
-downloader = Downloader()
-
-if (level := settings.value("logging/level", type=str)) != "Disabled":
- logger.setLevel(level)
-else:
- logging.disable()
-
-
-class MainWidget(QtWidgets.QWidget, Ui_Main):
- def __init__(
- self, application_model: ApplicationModel, messages_model: MessagesModel
- ):
- super(MainWidget, self).__init__()
- self.setupUi(self)
-
- self.listView_messages.setModel(messages_model)
- self.listView_applications.setModel(application_model)
- self.listView_applications.setFixedWidth(180)
- icon_size = settings.value("ApplicationModelItem/icon/size", type=int)
- self.listView_applications.setIconSize(QtCore.QSize(icon_size, icon_size))
-
- label_size = settings.value("MainWidget/status_image/size", type=int)
- self.label_status.setFixedSize(QtCore.QSize(label_size, label_size))
- self.label_status_connecting()
-
- def label_status_active(self):
- self.label_status.setToolTip("Listening for new messages")
- self.label_status.setStyleSheet("QLabel {background-color: green;}")
-
- def label_status_connecting(self):
- self.label_status.setToolTip("Connecting...")
- self.label_status.setStyleSheet("QLabel {background-color: orange;}")
-
- def label_status_inactive(self):
- self.label_status.setToolTip("Listener inactive")
- self.label_status.setStyleSheet("QLabel {background-color: grey;}")
-
- def label_status_error(self):
- self.label_status.setToolTip("Listener error")
- self.label_status.setStyleSheet("QLabel {background-color: red;}")
-
-
-class MainWindow(QtWidgets.QMainWindow):
- def __init__(self, app: QtWidgets.QApplication):
- super(MainWindow, self).__init__()
- self.app = app
- self.shutting_down = False
-
- def init_ui(self):
- self.gotify_client = gotify.GotifyClient(
- settings.value("Server/url", type=str),
- settings.value("Server/client_token", type=str),
- )
-
- self.setWindowTitle(__title__)
- self.resize(800, 600)
- set_theme(self.app, settings.value("MainWindow/theme", type=str))
-
- self.application_model = ApplicationModel()
- self.messages_model = MessagesModel()
-
- self.main_widget = MainWidget(self.application_model, self.messages_model)
- self.setCentralWidget(self.main_widget)
-
- self.refresh_applications()
-
- self.tray = Tray()
- self.tray.show()
-
- self.restore_window_state()
-
- self.gotify_client.listen(
- new_message_callback=self.new_message_callback,
- opened_callback=self.listener_opened_callback,
- closed_callback=self.listener_closed_callback,
- )
-
- self.watchdog = ServerConnectionWatchdogTask(self.gotify_client)
- self.watchdog.closed.connect(lambda: self.listener_closed_callback(None, None))
- self.watchdog.start()
-
- self.link_callbacks()
-
- self.show()
- self.window_state_to_restore = QtCore.Qt.WindowState.WindowNoState
-
- if settings.value("MainWindow/start_minimized", type=bool) and settings.value(
- "tray/show", type=bool
- ):
- self.tray_activated_callback(
- QtWidgets.QSystemTrayIcon.ActivationReason.Trigger
- )
-
- def refresh_applications(self):
- self.application_model.clear()
- self.messages_model.clear()
-
- self.main_widget.listView_applications.clearSelection()
- self.main_widget.listView_applications.setEnabled(False)
- self.application_model.setItem(0, 0, ApplicationAllMessagesItem())
-
- def get_applications_callback(
- applications: List[gotify.GotifyApplicationModel],
- ):
- stored_application_ids_order = [
- int(x) for x in settings.value("ApplicationModel/order", type=list)
- ]
- fetched_application_ids = [application.id for application in applications]
- # Remove ids from stored_application_ids that are not in fetched_application_ids
- application_ids_order = list(
- filter(
- lambda x: x in fetched_application_ids, stored_application_ids_order
- )
- )
- # Add new ids to the back of the list
- application_ids_order += list(
- filter(
- lambda x: x not in stored_application_ids_order,
- fetched_application_ids,
- )
- )
-
- for i, application_id in enumerate(application_ids_order):
- application = list(
- filter(
- lambda application: application.id == application_id,
- applications,
- )
- )[0]
-
- icon = (
- QtGui.QIcon(
- downloader.get_filename(
- f"{self.gotify_client.url}/{application.image}"
- )
- )
- if settings.value("ApplicationModelItem/icon/show", type=bool)
- else None
- )
- self.application_model.setItem(
- i + 1, 0, ApplicationModelItem(application, icon),
- )
-
- self.application_model.save_order()
-
- self.get_applications_task = GetApplicationsTask(self.gotify_client)
- self.get_applications_task.success.connect(get_applications_callback)
- self.get_applications_task.finished.connect(
- self.get_applications_finished_callback
- )
- self.get_applications_task.start()
-
- def get_applications_finished_callback(self):
- self.main_widget.listView_applications.setEnabled(True)
- self.main_widget.listView_applications.setCurrentIndex(
- self.application_model.index(0, 0)
- )
-
- def insert_message(
- self,
- row: int,
- message: gotify.GotifyMessageModel,
- application: gotify.GotifyApplicationModel,
- ):
- message_item = MessagesModelItem(message)
- self.messages_model.insertRow(row, message_item)
-
- message_widget = MessageWidget(
- message_item,
- image_path=downloader.get_filename(
- f"{self.gotify_client.url}/{application.image}"
- )
- if settings.value("MessageWidget/image/show", type=bool)
- else "",
- )
- self.main_widget.listView_messages.setIndexWidget(
- self.messages_model.indexFromItem(message_item), message_widget
- )
- message_widget.deletion_requested.connect(
- self.message_deletion_requested_callback
- )
-
- def listener_opened_callback(self):
- self.main_widget.label_status_active()
- self.tray.set_icon_ok()
-
- def listener_closed_callback(self, close_status_code: int, close_msg: str):
- self.main_widget.label_status_connecting()
- self.tray.set_icon_error()
- if not self.shutting_down:
- self.gotify_client.reconnect()
-
- def application_selection_changed(
- self, current: QtCore.QModelIndex, previous: QtCore.QModelIndex
- ):
- if item := self.application_model.itemFromIndex(current):
- self.main_widget.label_selected.setText(item.text())
- self.messages_model.clear()
-
- if isinstance(item, ApplicationModelItem):
-
- def get_application_messages_callback(
- page: gotify.GotifyPagedMessagesModel,
- ):
- for i, message in enumerate(page.messages):
- self.insert_message(
- i,
- message,
- item.data(ApplicationItemDataRole.ApplicationRole),
- )
-
- self.get_application_messages_task = GetApplicationMessagesTask(
- item.data(ApplicationItemDataRole.ApplicationRole).id,
- self.gotify_client,
- )
- self.get_application_messages_task.success.connect(
- get_application_messages_callback
- )
- self.get_application_messages_task.start()
-
- elif isinstance(item, ApplicationAllMessagesItem):
-
- def get_messages_callback(page: gotify.GotifyPagedMessagesModel):
- for i, message in enumerate(page.messages):
- if item := self.application_model.itemFromId(message.appid):
- self.insert_message(
- i,
- message,
- item.data(ApplicationItemDataRole.ApplicationRole),
- )
-
- self.get_messages_task = GetMessagesTask(self.gotify_client)
- self.get_messages_task.success.connect(get_messages_callback)
- self.get_messages_task.start()
-
- def refresh_callback(self):
- self.application_model.save_order()
- self.refresh_applications()
- if not self.gotify_client.listener.running:
- self.gotify_client.listener.reset_wait_time()
- else:
- self.gotify_client.stop(reset_wait=True)
- self.gotify_client.reconnect(increase_wait_time=False)
-
- def delete_all_callback(self):
- selection_model = self.main_widget.listView_applications.selectionModel()
- if item := self.application_model.itemFromIndex(selection_model.currentIndex()):
- self.messages_model.clear()
-
- if isinstance(item, ApplicationModelItem):
- self.delete_application_messages_task = DeleteApplicationMessagesTask(
- item.data(ApplicationItemDataRole.ApplicationRole).id,
- self.gotify_client,
- )
- self.delete_application_messages_task.start()
- elif isinstance(item, ApplicationAllMessagesItem):
- self.delete_all_messages_task = DeleteAllMessagesTask(
- self.gotify_client
- )
- self.delete_all_messages_task.start()
-
- def new_message_callback(self, message: gotify.GotifyMessageModel):
- # Show a notification
- if not (application_item := self.application_model.itemFromId(message.appid)):
- logger.error(
- f"MainWindow.new_message_callback: App id {message.appid} could not be found. Refreshing applications."
- )
- self.application_model.save_order()
- self.refresh_applications()
- return
-
- if not self.isActiveWindow() and message.priority >= settings.value(
- "tray/notifications/priority", type=int
- ):
- image_url = f"{self.gotify_client.url}/{application_item.data(ApplicationItemDataRole.ApplicationRole).image}"
- self.tray.showMessage(
- message.title,
- message.message,
- QtGui.QIcon(downloader.get_filename(image_url))
- if settings.value("tray/notifications/icon/show", type=bool)
- else QtWidgets.QSystemTrayIcon.MessageIcon.Information,
- msecs=settings.value("tray/notifications/duration_ms", type=int),
- )
-
- # Add the message to the message_model, if its corresponding application is selected
- application_index = (
- self.main_widget.listView_applications.selectionModel().currentIndex()
- )
- if selected_application_item := self.application_model.itemFromIndex(
- application_index
- ):
- if isinstance(selected_application_item, ApplicationModelItem):
- # A single application is selected
- if (
- message.appid
- == selected_application_item.data(
- ApplicationItemDataRole.ApplicationRole
- ).id
- ):
- self.insert_message(
- 0,
- message,
- application_item.data(ApplicationItemDataRole.ApplicationRole),
- )
- elif isinstance(selected_application_item, ApplicationAllMessagesItem):
- # "All messages' is selected
- self.insert_message(
- 0,
- message,
- application_item.data(ApplicationItemDataRole.ApplicationRole),
- )
-
- def message_deletion_requested_callback(self, message_item: MessagesModelItem):
- self.delete_message_task = DeleteMessageTask(
- message_item.data(MessageItemDataRole.MessageRole).id, self.gotify_client
- )
- self.messages_model.removeRow(message_item.row())
- self.delete_message_task.start()
-
- def tray_activated_callback(
- self, reason: QtWidgets.QSystemTrayIcon.ActivationReason
- ):
- if reason == QtWidgets.QSystemTrayIcon.ActivationReason.Trigger:
- if self.windowState() & QtCore.Qt.WindowState.WindowMinimized or self.windowState() == (
- QtCore.Qt.WindowState.WindowMinimized
- | QtCore.Qt.WindowState.WindowMaximized
- ):
- self.bring_to_front()
- else:
- window_state_temp = self.windowState()
- self.setWindowState(QtCore.Qt.WindowState.WindowMinimized)
- self.hide()
- self.window_state_to_restore = window_state_temp
-
- def message_clicked_callback(self):
- self.main_widget.listView_messages.scrollToTop()
- self.setWindowState(
- self.window_state_to_restore | QtCore.Qt.WindowState.WindowActive
- )
- self.show()
-
- def settings_callback(self):
- settings_dialog = SettingsDialog(self.app)
- accepted = settings_dialog.exec()
-
- if accepted and settings_dialog.settings_changed:
- settings_dialog.apply_settings()
-
- if settings_dialog.server_changed:
- mb = QtWidgets.QMessageBox(
- QtWidgets.QMessageBox.Icon.Information,
- "Restart",
- "Restart to apply server changes",
- QtWidgets.QMessageBox.StandardButton.Yes
- | QtWidgets.QMessageBox.StandardButton.Cancel,
- parent=self,
- )
-
- r = mb.exec()
- if r == QtWidgets.QMessageBox.StandardButton.Yes:
- self.close()
-
- def link_callbacks(self):
- self.main_widget.listView_applications.selectionModel().currentChanged.connect(
- self.application_selection_changed
- )
- self.main_widget.pb_refresh.clicked.connect(self.refresh_callback)
- self.main_widget.pb_delete_all.clicked.connect(self.delete_all_callback)
-
- self.tray.actionQuit.triggered.connect(self.close)
- self.tray.actionSettings.triggered.connect(self.settings_callback)
- self.tray.actionToggleWindow.triggered.connect(
- lambda: self.tray_activated_callback(
- QtWidgets.QSystemTrayIcon.ActivationReason.Trigger
- )
- )
- self.tray.messageClicked.connect(self.message_clicked_callback)
- self.tray.activated.connect(self.tray_activated_callback)
-
- def acquire_lock(self) -> bool:
- temp_dir = tempfile.gettempdir()
- lock_filename = os.path.join(
- temp_dir, __title__ + "-" + getpass.getuser() + ".lock"
- )
- self.lock_file = QtCore.QLockFile(lock_filename)
- self.lock_file.setStaleLockTime(0)
- return self.lock_file.tryLock()
-
- def restore_window_state(self):
- window_geometry = settings.value("MainWindow/geometry", type=QtCore.QByteArray)
- window_state = settings.value("MainWindow/state", type=QtCore.QByteArray)
-
- if window_geometry:
- self.restoreGeometry(window_geometry)
- if window_state:
- self.restoreState(window_state)
-
- def save_window_state(self):
- settings.setValue("MainWindow/geometry", self.saveGeometry())
- settings.setValue("MainWindow/state", self.saveState())
-
- def bring_to_front(self):
- self.ensurePolished()
- self.setWindowState(
- self.window_state_to_restore & ~QtCore.Qt.WindowState.WindowMinimized
- | QtCore.Qt.WindowState.WindowActive
- )
- self.show()
- self.activateWindow()
-
- def changeEvent(self, event: QtCore.QEvent) -> None:
- if event.type() == QtCore.QEvent.Type.WindowStateChange:
- if settings.value("tray/show", type=bool) and settings.value(
- "tray/minimize", type=bool
- ):
- if self.windowState() & QtCore.Qt.WindowState.WindowMinimized:
- self.window_state_to_restore = (
- self.windowState() & ~QtCore.Qt.WindowState.WindowMinimized
- | QtCore.Qt.WindowState.WindowActive
- )
- self.hide()
-
- super(MainWindow, self).changeEvent(event)
-
- def closeEvent(self, e: QtGui.QCloseEvent) -> None:
- self.save_window_state()
- self.application_model.save_order()
-
- if settings.value("tray/show", type=bool):
- self.tray.hide()
-
- self.lock_file.unlock()
-
- self.shutting_down = True
- self.gotify_client.stop()
- super(MainWindow, self).closeEvent(e)
- self.app.quit()
-
-
-def start_gui():
- title = __title__.replace(" ", "-")
-
- app = QtWidgets.QApplication(sys.argv)
- app.setApplicationName(title)
- app.setQuitOnLastWindowClosed(False)
- app.setWindowIcon(QtGui.QIcon("gotify_tray/gui/images/gotify-small.png"))
- app.setStyle("fusion")
-
- logdir = QtCore.QStandardPaths.standardLocations(
- QtCore.QStandardPaths.StandardLocation.AppDataLocation
- )[0]
- if not os.path.exists(logdir):
- os.mkdir(logdir)
- logging.basicConfig(
- filename=os.path.join(logdir, f"{title}.log"),
- format="%(levelname)s > %(name)s > %(asctime)s > %(message)s",
- )
-
- # import from gui has to happen after 'setApplicationName' to make sure the correct cache directory is created
- from gotify_tray.gui import MainWindow
-
- window = MainWindow(app)
-
- # prevent multiple instances
- if (window.acquire_lock() or "--no-lock" in sys.argv) and verify_server():
- window.init_ui()
- sys.exit(app.exec())
diff --git a/gotify_tray/gui/MessageWidget.py b/gotify_tray/gui/MessageWidget.py
deleted file mode 100644
index a82fc84..0000000
--- a/gotify_tray/gui/MessageWidget.py
+++ /dev/null
@@ -1,84 +0,0 @@
-import re
-
-from PyQt6 import QtCore, QtGui, QtWidgets
-
-from .MessagesModel import MessageItemDataRole, MessagesModelItem
-from .designs.widget_message import Ui_Form
-from gotify_tray.database import Settings
-
-
-settings = Settings("gotify-tray")
-
-
-def convert_links(text):
- _link = re.compile(
- r'(?:(https://|http://)|(www\.))(\S+\b/?)([!"#$%&\'()*+,\-./:;<=>?@[\\\]^_`{|}~]*)(\s|$)',
- re.I,
- )
-
- def replace(match):
- groups = match.groups()
- protocol = groups[0] or "" # may be None
- www_lead = groups[1] or "" # may be None
- return '{0}{1}{2}{3}{4}'.format(
- protocol, www_lead, *groups[2:]
- )
-
- return _link.sub(replace, text)
-
-
-class MessageWidget(QtWidgets.QWidget, Ui_Form):
- deletion_requested = QtCore.pyqtSignal(MessagesModelItem)
-
- def __init__(self, message_item: MessagesModelItem, image_path: str = ""):
- super(MessageWidget, self).__init__()
- self.setupUi(self)
- self.setAutoFillBackground(True)
-
- self.message_item = message_item
- message = message_item.data(MessageItemDataRole.MessageRole)
-
- # Fonts
- font_title = QtGui.QFont()
- font_date = QtGui.QFont()
- font_content = QtGui.QFont()
- font_title.fromString(settings.value("MessageWidget/font/title", type=str))
- font_date.fromString(settings.value("MessageWidget/font/date", type=str))
- font_content.fromString(settings.value("MessageWidget/font/content", type=str))
- self.label_title.setFont(font_title)
- self.label_date.setFont(font_date)
- self.text_message.setFont(font_content)
-
- self.label_title.setText(message.title)
- self.label_date.setText(message.date.strftime("%Y-%m-%d, %H:%M"))
-
- if markdown := message.get("extras", {}).get("client::display", {}).get("contentType") == "text/markdown":
- self.text_message.setTextFormat(QtCore.Qt.TextFormat.MarkdownText)
- self.text_message.setText(convert_links(message.message))
-
- if image_path:
- image_size = settings.value("MessageWidget/image/size", type=int)
- self.label_image.setFixedSize(QtCore.QSize(image_size, image_size))
- pixmap = QtGui.QPixmap(image_path).scaled(image_size, image_size, aspectRatioMode=QtCore.Qt.AspectRatioMode.KeepAspectRatioByExpanding)
- self.label_image.setPixmap(pixmap)
- else:
- self.label_image.hide()
-
- # Set MessagesModelItem's size hint based on the size of this widget
- self.gridLayout_frame.setContentsMargins(10, 5, 10, 5)
- self.gridLayout.setContentsMargins(5, 15, 5, 15)
- self.adjustSize()
- size_hint = self.message_item.sizeHint()
- self.message_item.setSizeHint(
- QtCore.QSize(
- size_hint.width(),
- self.height()
- )
- )
- self.pb_delete.setIcon(QtGui.QIcon("gotify_tray/gui/images/trashcan.svg"))
- self.pb_delete.setIconSize(QtCore.QSize(24, 24))
-
- self.link_callbacks()
-
- def link_callbacks(self):
- self.pb_delete.clicked.connect(lambda: self.deletion_requested.emit(self.message_item))
diff --git a/gotify_tray/gui/MessagesModel.py b/gotify_tray/gui/MessagesModel.py
deleted file mode 100644
index ee45b44..0000000
--- a/gotify_tray/gui/MessagesModel.py
+++ /dev/null
@@ -1,23 +0,0 @@
-import enum
-
-from typing import cast
-from PyQt6 import QtCore, QtGui, QtWidgets
-from gotify_tray import gotify
-
-
-class MessageItemDataRole(enum.IntEnum):
- MessageRole = QtCore.Qt.ItemDataRole.UserRole + 1
-
-
-class MessagesModelItem(QtGui.QStandardItem):
- def __init__(self, message: gotify.GotifyMessageModel, *args, **kwargs):
- super(MessagesModelItem, self).__init__()
- self.setData(message, MessageItemDataRole.MessageRole)
-
-
-class MessagesModel(QtGui.QStandardItemModel):
- def setItem(self, row: int, column: int, item: MessagesModelItem) -> None:
- super(MessagesModel, self).setItem(row, column, item)
-
- def itemFromIndex(self, index: QtCore.QModelIndex) -> MessagesModelItem:
- return cast(MessagesModelItem, super(MessagesModel, self).itemFromIndex(index))
diff --git a/gotify_tray/gui/SettingsDialog.py b/gotify_tray/gui/SettingsDialog.py
index b787206..445bcb5 100644
--- a/gotify_tray/gui/SettingsDialog.py
+++ b/gotify_tray/gui/SettingsDialog.py
@@ -34,20 +34,13 @@ class SettingsDialog(QtWidgets.QDialog, Ui_Dialog):
QtWidgets.QDialogButtonBox.StandardButton.Apply
).setEnabled(False)
- # Fonts
- self.set_font_labels()
-
# Theme
self.combo_theme.addItems(["default", "dark"])
- self.combo_theme.setCurrentText(settings.value("MainWindow/theme", type=str))
+ self.combo_theme.setCurrentText(
+ settings.value("MainApplication/theme", type=str)
+ )
# Icons
- self.cb_icons_application.setChecked(
- settings.value("ApplicationModelItem/icon/show", type=bool)
- )
- self.cb_icons_message.setChecked(
- settings.value("MessageWidget/image/show", type=bool)
- )
self.cb_icons_notification.setChecked(
settings.value("tray/notifications/icon/show", type=bool)
)
@@ -73,31 +66,6 @@ class SettingsDialog(QtWidgets.QDialog, Ui_Dialog):
)
self.combo_logging.setCurrentText(settings.value("logging/level", type=str))
- def set_font_labels(self):
- self.label_font_message_title.setText(
- settings.value("MessageWidget/font/title", type=str)
- )
- self.label_font_message_date.setText(
- settings.value("MessageWidget/font/date", type=str)
- )
- self.label_font_message_content.setText(
- settings.value("MessageWidget/font/content", type=str)
- )
-
- def change_font_callback(self, key: str):
- font = QtGui.QFont()
- font.fromString(settings.value(key, type=str))
- font, accepted = QtWidgets.QFontDialog.getFont(font, self, "Select font")
-
- if not accepted:
- return
-
- self.settings_changed_callback()
- label: QtWidgets.QLabel = getattr(
- self, "label_font_message_" + key.split("/")[-1]
- )
- label.setText(font.toString())
-
def change_server_info_callback(self):
self.server_changed = verify_server(force_new=True)
@@ -124,23 +92,10 @@ class SettingsDialog(QtWidgets.QDialog, Ui_Dialog):
QtWidgets.QDialogButtonBox.StandardButton.Apply
).clicked.connect(self.apply_settings)
- # Fonts
- self.pb_font_message_title.clicked.connect(
- lambda: self.change_font_callback("MessageWidget/font/title")
- )
- self.pb_font_message_date.clicked.connect(
- lambda: self.change_font_callback("MessageWidget/font/date")
- )
- self.pb_font_message_content.clicked.connect(
- lambda: self.change_font_callback("MessageWidget/font/content")
- )
-
# Theme
self.combo_theme.currentTextChanged.connect(self.settings_changed_callback)
# Icons
- self.cb_icons_application.stateChanged.connect(self.settings_changed_callback)
- self.cb_icons_message.stateChanged.connect(self.settings_changed_callback)
self.cb_icons_notification.stateChanged.connect(self.settings_changed_callback)
# Notifications
@@ -157,26 +112,11 @@ class SettingsDialog(QtWidgets.QDialog, Ui_Dialog):
)
def apply_settings(self):
- # Fonts
- settings.setValue(
- "MessageWidget/font/title", self.label_font_message_title.text()
- )
- settings.setValue(
- "MessageWidget/font/date", self.label_font_message_date.text()
- )
- settings.setValue(
- "MessageWidget/font/content", self.label_font_message_content.text()
- )
-
# Theme
- settings.setValue("MainWindow/theme", self.combo_theme.currentText())
+ settings.setValue("MainApplication/theme", self.combo_theme.currentText())
set_theme(self.app, self.combo_theme.currentText())
# Icons
- settings.setValue(
- "ApplicationModelItem/icon/show", self.cb_icons_application.isChecked()
- )
- settings.setValue("MessageWidget/image/show", self.cb_icons_message.isChecked())
settings.setValue(
"tray/notifications/icon/show", self.cb_icons_notification.isChecked()
)
diff --git a/gotify_tray/gui/Tray.py b/gotify_tray/gui/Tray.py
index 9872dc8..3f13429 100644
--- a/gotify_tray/gui/Tray.py
+++ b/gotify_tray/gui/Tray.py
@@ -17,8 +17,8 @@ class Tray(QtWidgets.QSystemTrayIcon):
menu.addSeparator()
- self.actionToggleWindow = QtGui.QAction("Toggle Window", self)
- menu.addAction(self.actionToggleWindow)
+ self.actionReconnect = QtGui.QAction("Reconnect", self)
+ menu.addAction(self.actionReconnect)
menu.addSeparator()
diff --git a/gotify_tray/gui/__init__.py b/gotify_tray/gui/__init__.py
index 6fe1a2f..73e901d 100644
--- a/gotify_tray/gui/__init__.py
+++ b/gotify_tray/gui/__init__.py
@@ -1,2 +1,2 @@
-from .MainWindow import MainWindow, start_gui
+from .MainApplication import start_gui
from .ServerInfoDialog import ServerInfoDialog
diff --git a/gotify_tray/gui/designs/widget_main.py b/gotify_tray/gui/designs/widget_main.py
deleted file mode 100644
index 297f9bd..0000000
--- a/gotify_tray/gui/designs/widget_main.py
+++ /dev/null
@@ -1,97 +0,0 @@
-# Form implementation generated from reading ui file 'gotify_tray/gui/designs\widget_main.ui'
-#
-# Created by: PyQt6 UI code generator 6.1.1
-#
-# WARNING: Any manual changes made to this file will be lost when pyuic6 is
-# run again. Do not edit this file unless you know what you are doing.
-
-
-from PyQt6 import QtCore, QtGui, QtWidgets
-
-
-class Ui_Form(object):
- def setupUi(self, Form):
- Form.setObjectName("Form")
- Form.resize(809, 572)
- self.gridLayout_2 = QtWidgets.QGridLayout(Form)
- self.gridLayout_2.setObjectName("gridLayout_2")
- self.listView_applications = QtWidgets.QListView(Form)
- sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.listView_applications.sizePolicy().hasHeightForWidth())
- self.listView_applications.setSizePolicy(sizePolicy)
- font = QtGui.QFont()
- font.setPointSize(13)
- self.listView_applications.setFont(font)
- self.listView_applications.setEditTriggers(QtWidgets.QAbstractItemView.EditTrigger.NoEditTriggers)
- self.listView_applications.setDragEnabled(True)
- self.listView_applications.setDragDropMode(QtWidgets.QAbstractItemView.DragDropMode.InternalMove)
- self.listView_applications.setWordWrap(True)
- self.listView_applications.setObjectName("listView_applications")
- self.gridLayout_2.addWidget(self.listView_applications, 0, 0, 1, 1)
- self.gridLayout = QtWidgets.QGridLayout()
- self.gridLayout.setObjectName("gridLayout")
- self.pb_delete_all = QtWidgets.QPushButton(Form)
- self.pb_delete_all.setMinimumSize(QtCore.QSize(0, 32))
- font = QtGui.QFont()
- font.setPointSize(10)
- self.pb_delete_all.setFont(font)
- self.pb_delete_all.setObjectName("pb_delete_all")
- self.gridLayout.addWidget(self.pb_delete_all, 0, 5, 1, 1)
- spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
- self.gridLayout.addItem(spacerItem, 0, 3, 1, 1)
- self.label_selected = QtWidgets.QLabel(Form)
- self.label_selected.setMinimumSize(QtCore.QSize(0, 32))
- font = QtGui.QFont()
- font.setPointSize(15)
- font.setBold(True)
- self.label_selected.setFont(font)
- self.label_selected.setText("")
- self.label_selected.setObjectName("label_selected")
- self.gridLayout.addWidget(self.label_selected, 0, 2, 1, 1)
- spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
- self.gridLayout.addItem(spacerItem1, 0, 1, 1, 1)
- self.pb_refresh = QtWidgets.QPushButton(Form)
- self.pb_refresh.setMinimumSize(QtCore.QSize(0, 32))
- font = QtGui.QFont()
- font.setPointSize(10)
- self.pb_refresh.setFont(font)
- self.pb_refresh.setObjectName("pb_refresh")
- self.gridLayout.addWidget(self.pb_refresh, 0, 4, 1, 1)
- self.label_status = QtWidgets.QLabel(Form)
- self.label_status.setText("")
- self.label_status.setObjectName("label_status")
- self.gridLayout.addWidget(self.label_status, 0, 0, 1, 1)
- self.listView_messages = QtWidgets.QListView(Form)
- sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.MinimumExpanding, QtWidgets.QSizePolicy.Policy.Expanding)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.listView_messages.sizePolicy().hasHeightForWidth())
- self.listView_messages.setSizePolicy(sizePolicy)
- self.listView_messages.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollMode.ScrollPerPixel)
- self.listView_messages.setObjectName("listView_messages")
- self.gridLayout.addWidget(self.listView_messages, 1, 0, 1, 6)
- self.gridLayout_2.addLayout(self.gridLayout, 0, 1, 1, 1)
-
- self.retranslateUi(Form)
- QtCore.QMetaObject.connectSlotsByName(Form)
- Form.setTabOrder(self.pb_refresh, self.pb_delete_all)
- Form.setTabOrder(self.pb_delete_all, self.listView_messages)
- Form.setTabOrder(self.listView_messages, self.listView_applications)
-
- def retranslateUi(self, Form):
- _translate = QtCore.QCoreApplication.translate
- Form.setWindowTitle(_translate("Form", "Form"))
- self.pb_delete_all.setText(_translate("Form", "Delete All"))
- self.pb_refresh.setText(_translate("Form", "Refresh"))
-
-
-if __name__ == "__main__":
- import sys
- app = QtWidgets.QApplication(sys.argv)
- Form = QtWidgets.QWidget()
- ui = Ui_Form()
- ui.setupUi(Form)
- Form.show()
- sys.exit(app.exec())
diff --git a/gotify_tray/gui/designs/widget_main.ui b/gotify_tray/gui/designs/widget_main.ui
deleted file mode 100644
index a669da1..0000000
--- a/gotify_tray/gui/designs/widget_main.ui
+++ /dev/null
@@ -1,159 +0,0 @@
-
-
- Form
-
-
-
- 0
- 0
- 809
- 572
-
-
-
- Form
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 13
-
-
-
- QAbstractItemView::NoEditTriggers
-
-
- true
-
-
- QAbstractItemView::InternalMove
-
-
- true
-
-
-
- -
-
-
-
-
-
-
- 0
- 32
-
-
-
-
- 10
-
-
-
- Delete All
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
-
- 0
- 32
-
-
-
-
- 15
- true
-
-
-
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
-
- 0
- 32
-
-
-
-
- 10
-
-
-
- Refresh
-
-
-
- -
-
-
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- QAbstractItemView::ScrollPerPixel
-
-
-
-
-
-
-
-
- pb_refresh
- pb_delete_all
- listView_messages
- listView_applications
-
-
-
-
diff --git a/gotify_tray/gui/designs/widget_message.py b/gotify_tray/gui/designs/widget_message.py
deleted file mode 100644
index 66eecc1..0000000
--- a/gotify_tray/gui/designs/widget_message.py
+++ /dev/null
@@ -1,94 +0,0 @@
-# Form implementation generated from reading ui file 'gotify_tray/gui/designs\widget_message.ui'
-#
-# Created by: PyQt6 UI code generator 6.1.1
-#
-# WARNING: Any manual changes made to this file will be lost when pyuic6 is
-# run again. Do not edit this file unless you know what you are doing.
-
-
-from PyQt6 import QtCore, QtGui, QtWidgets
-
-
-class Ui_Form(object):
- def setupUi(self, Form):
- Form.setObjectName("Form")
- Form.resize(454, 122)
- self.gridLayout = QtWidgets.QGridLayout(Form)
- self.gridLayout.setSizeConstraint(QtWidgets.QLayout.SizeConstraint.SetMinimumSize)
- self.gridLayout.setContentsMargins(0, 0, 0, 0)
- self.gridLayout.setObjectName("gridLayout")
- self.frame = QtWidgets.QFrame(Form)
- self.frame.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel)
- self.frame.setFrameShadow(QtWidgets.QFrame.Shadow.Raised)
- self.frame.setObjectName("frame")
- self.gridLayout_frame = QtWidgets.QGridLayout(self.frame)
- self.gridLayout_frame.setSizeConstraint(QtWidgets.QLayout.SizeConstraint.SetMinimumSize)
- self.gridLayout_frame.setContentsMargins(-1, 0, -1, 0)
- self.gridLayout_frame.setObjectName("gridLayout_frame")
- self.label_title = QtWidgets.QLabel(self.frame)
- sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.Minimum)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.label_title.sizePolicy().hasHeightForWidth())
- self.label_title.setSizePolicy(sizePolicy)
- font = QtGui.QFont()
- font.setPointSize(17)
- font.setBold(False)
- font.setWeight(50)
- self.label_title.setFont(font)
- self.label_title.setTextInteractionFlags(QtCore.Qt.TextInteractionFlag.LinksAccessibleByMouse|QtCore.Qt.TextInteractionFlag.TextSelectableByMouse)
- self.label_title.setObjectName("label_title")
- self.gridLayout_frame.addWidget(self.label_title, 0, 1, 1, 1)
- self.text_message = QtWidgets.QLabel(self.frame)
- sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Preferred, QtWidgets.QSizePolicy.Policy.MinimumExpanding)
- sizePolicy.setHorizontalStretch(0)
- sizePolicy.setVerticalStretch(0)
- sizePolicy.setHeightForWidth(self.text_message.sizePolicy().hasHeightForWidth())
- self.text_message.setSizePolicy(sizePolicy)
- font = QtGui.QFont()
- font.setPointSize(11)
- self.text_message.setFont(font)
- self.text_message.setWordWrap(True)
- self.text_message.setOpenExternalLinks(True)
- self.text_message.setTextInteractionFlags(QtCore.Qt.TextInteractionFlag.LinksAccessibleByMouse|QtCore.Qt.TextInteractionFlag.TextSelectableByMouse)
- self.text_message.setObjectName("text_message")
- self.gridLayout_frame.addWidget(self.text_message, 3, 1, 1, 3)
- self.label_date = QtWidgets.QLabel(self.frame)
- font = QtGui.QFont()
- font.setPointSize(11)
- self.label_date.setFont(font)
- self.label_date.setTextInteractionFlags(QtCore.Qt.TextInteractionFlag.LinksAccessibleByMouse|QtCore.Qt.TextInteractionFlag.TextSelectableByMouse)
- self.label_date.setObjectName("label_date")
- self.gridLayout_frame.addWidget(self.label_date, 2, 1, 1, 1)
- self.pb_delete = QtWidgets.QPushButton(self.frame)
- self.pb_delete.setText("")
- self.pb_delete.setFlat(True)
- self.pb_delete.setObjectName("pb_delete")
- self.gridLayout_frame.addWidget(self.pb_delete, 0, 3, 1, 1)
- spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
- self.gridLayout_frame.addItem(spacerItem, 0, 2, 1, 1)
- self.label_image = QtWidgets.QLabel(self.frame)
- self.label_image.setText("")
- self.label_image.setObjectName("label_image")
- self.gridLayout_frame.addWidget(self.label_image, 0, 0, 1, 1)
- self.gridLayout.addWidget(self.frame, 0, 0, 1, 1)
-
- self.retranslateUi(Form)
- QtCore.QMetaObject.connectSlotsByName(Form)
-
- def retranslateUi(self, Form):
- _translate = QtCore.QCoreApplication.translate
- Form.setWindowTitle(_translate("Form", "Form"))
- self.label_title.setText(_translate("Form", "Title"))
- self.text_message.setText(_translate("Form", "TextLabel"))
- self.label_date.setText(_translate("Form", "Date"))
-
-
-if __name__ == "__main__":
- import sys
- app = QtWidgets.QApplication(sys.argv)
- Form = QtWidgets.QWidget()
- ui = Ui_Form()
- ui.setupUi(Form)
- Form.show()
- sys.exit(app.exec())
diff --git a/gotify_tray/gui/designs/widget_message.ui b/gotify_tray/gui/designs/widget_message.ui
deleted file mode 100644
index 718406f..0000000
--- a/gotify_tray/gui/designs/widget_message.ui
+++ /dev/null
@@ -1,152 +0,0 @@
-
-
- Form
-
-
-
- 0
- 0
- 454
- 122
-
-
-
- Form
-
-
-
- QLayout::SetMinimumSize
-
-
- 0
-
-
- 0
-
-
- 0
-
-
- 0
-
- -
-
-
- QFrame::StyledPanel
-
-
- QFrame::Raised
-
-
-
- QLayout::SetMinimumSize
-
-
- 0
-
-
- 0
-
-
-
-
-
-
- 0
- 0
-
-
-
-
- 17
- 50
- false
-
-
-
- Title
-
-
- Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 11
-
-
-
- TextLabel
-
-
- true
-
-
- true
-
-
- Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse
-
-
-
- -
-
-
-
- 11
-
-
-
- Date
-
-
- Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse
-
-
-
- -
-
-
-
-
-
- true
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/gotify_tray/gui/designs/widget_server.py b/gotify_tray/gui/designs/widget_server.py
index b9f0249..b2cba3f 100644
--- a/gotify_tray/gui/designs/widget_server.py
+++ b/gotify_tray/gui/designs/widget_server.py
@@ -15,10 +15,6 @@ class Ui_Dialog(object):
Dialog.resize(300, 130)
self.gridLayout = QtWidgets.QGridLayout(Dialog)
self.gridLayout.setObjectName("gridLayout")
- self.label_server_info = QtWidgets.QLabel(Dialog)
- self.label_server_info.setText("")
- self.label_server_info.setObjectName("label_server_info")
- self.gridLayout.addWidget(self.label_server_info, 1, 2, 1, 1)
self.pb_test = QtWidgets.QPushButton(Dialog)
self.pb_test.setObjectName("pb_test")
self.gridLayout.addWidget(self.pb_test, 1, 4, 1, 1)
@@ -44,6 +40,10 @@ class Ui_Dialog(object):
self.gridLayout.addWidget(self.buttonBox, 2, 4, 1, 1)
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
self.gridLayout.addItem(spacerItem, 1, 3, 1, 1)
+ self.label_server_info = QtWidgets.QLabel(Dialog)
+ self.label_server_info.setText("")
+ self.label_server_info.setObjectName("label_server_info")
+ self.gridLayout.addWidget(self.label_server_info, 1, 1, 1, 2)
self.retranslateUi(Dialog)
self.buttonBox.accepted.connect(Dialog.accept) # type: ignore
diff --git a/gotify_tray/gui/designs/widget_settings.py b/gotify_tray/gui/designs/widget_settings.py
index 62e3279..153ca80 100644
--- a/gotify_tray/gui/designs/widget_settings.py
+++ b/gotify_tray/gui/designs/widget_settings.py
@@ -12,51 +12,9 @@ from PyQt6 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
- Dialog.resize(375, 606)
+ Dialog.resize(375, 392)
self.verticalLayout = QtWidgets.QVBoxLayout(Dialog)
self.verticalLayout.setObjectName("verticalLayout")
- self.groupBox = QtWidgets.QGroupBox(Dialog)
- self.groupBox.setObjectName("groupBox")
- self.gridLayout = QtWidgets.QGridLayout(self.groupBox)
- self.gridLayout.setObjectName("gridLayout")
- self.groupBox_2 = QtWidgets.QGroupBox(self.groupBox)
- self.groupBox_2.setObjectName("groupBox_2")
- self.gridLayout_2 = QtWidgets.QGridLayout(self.groupBox_2)
- self.gridLayout_2.setObjectName("gridLayout_2")
- self.label_3 = QtWidgets.QLabel(self.groupBox_2)
- self.label_3.setObjectName("label_3")
- self.gridLayout_2.addWidget(self.label_3, 2, 0, 1, 1)
- self.label_2 = QtWidgets.QLabel(self.groupBox_2)
- self.label_2.setObjectName("label_2")
- self.gridLayout_2.addWidget(self.label_2, 1, 0, 1, 1)
- self.pb_font_message_content = QtWidgets.QPushButton(self.groupBox_2)
- self.pb_font_message_content.setMaximumSize(QtCore.QSize(30, 16777215))
- self.pb_font_message_content.setObjectName("pb_font_message_content")
- self.gridLayout_2.addWidget(self.pb_font_message_content, 2, 1, 1, 1)
- self.pb_font_message_date = QtWidgets.QPushButton(self.groupBox_2)
- self.pb_font_message_date.setMaximumSize(QtCore.QSize(30, 16777215))
- self.pb_font_message_date.setObjectName("pb_font_message_date")
- self.gridLayout_2.addWidget(self.pb_font_message_date, 1, 1, 1, 1)
- self.label = QtWidgets.QLabel(self.groupBox_2)
- self.label.setObjectName("label")
- self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1)
- self.label_font_message_title = QtWidgets.QLabel(self.groupBox_2)
- self.label_font_message_title.setObjectName("label_font_message_title")
- self.gridLayout_2.addWidget(self.label_font_message_title, 0, 2, 1, 1)
- self.pb_font_message_title = QtWidgets.QPushButton(self.groupBox_2)
- self.pb_font_message_title.setMaximumSize(QtCore.QSize(30, 16777215))
- self.pb_font_message_title.setObjectName("pb_font_message_title")
- self.gridLayout_2.addWidget(self.pb_font_message_title, 0, 1, 1, 1)
- spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
- self.gridLayout_2.addItem(spacerItem, 0, 3, 1, 1)
- self.label_font_message_date = QtWidgets.QLabel(self.groupBox_2)
- self.label_font_message_date.setObjectName("label_font_message_date")
- self.gridLayout_2.addWidget(self.label_font_message_date, 1, 2, 1, 1)
- self.label_font_message_content = QtWidgets.QLabel(self.groupBox_2)
- self.label_font_message_content.setObjectName("label_font_message_content")
- self.gridLayout_2.addWidget(self.label_font_message_content, 2, 2, 1, 1)
- self.gridLayout.addWidget(self.groupBox_2, 0, 0, 1, 1)
- self.verticalLayout.addWidget(self.groupBox)
self.groupBox_6 = QtWidgets.QGroupBox(Dialog)
self.groupBox_6.setObjectName("groupBox_6")
self.gridLayout_5 = QtWidgets.QGridLayout(self.groupBox_6)
@@ -64,19 +22,13 @@ class Ui_Dialog(object):
self.combo_theme = QtWidgets.QComboBox(self.groupBox_6)
self.combo_theme.setObjectName("combo_theme")
self.gridLayout_5.addWidget(self.combo_theme, 0, 0, 1, 1)
- spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
- self.gridLayout_5.addItem(spacerItem1, 0, 1, 1, 1)
+ spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
+ self.gridLayout_5.addItem(spacerItem, 0, 1, 1, 1)
self.verticalLayout.addWidget(self.groupBox_6)
self.groupBox_3 = QtWidgets.QGroupBox(Dialog)
self.groupBox_3.setObjectName("groupBox_3")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.groupBox_3)
self.verticalLayout_2.setObjectName("verticalLayout_2")
- self.cb_icons_application = QtWidgets.QCheckBox(self.groupBox_3)
- self.cb_icons_application.setObjectName("cb_icons_application")
- self.verticalLayout_2.addWidget(self.cb_icons_application)
- self.cb_icons_message = QtWidgets.QCheckBox(self.groupBox_3)
- self.cb_icons_message.setObjectName("cb_icons_message")
- self.verticalLayout_2.addWidget(self.cb_icons_message)
self.cb_icons_notification = QtWidgets.QCheckBox(self.groupBox_3)
self.cb_icons_notification.setObjectName("cb_icons_notification")
self.verticalLayout_2.addWidget(self.cb_icons_notification)
@@ -91,8 +43,8 @@ class Ui_Dialog(object):
self.spin_priority.setProperty("value", 5)
self.spin_priority.setObjectName("spin_priority")
self.gridLayout_4.addWidget(self.spin_priority, 0, 1, 1, 1)
- spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
- self.gridLayout_4.addItem(spacerItem2, 0, 2, 1, 1)
+ spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
+ self.gridLayout_4.addItem(spacerItem1, 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)
@@ -116,8 +68,8 @@ 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)
- spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
- self.gridLayout_3.addItem(spacerItem3, 0, 1, 1, 1)
+ spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
+ self.gridLayout_3.addItem(spacerItem2, 0, 1, 1, 1)
self.verticalLayout.addWidget(self.groupBox_4)
self.groupBox_7 = QtWidgets.QGroupBox(Dialog)
self.groupBox_7.setObjectName("groupBox_7")
@@ -133,8 +85,8 @@ 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)
- spacerItem4 = QtWidgets.QSpacerItem(190, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
- self.gridLayout_6.addItem(spacerItem4, 0, 3, 1, 1)
+ spacerItem3 = QtWidgets.QSpacerItem(190, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum)
+ self.gridLayout_6.addItem(spacerItem3, 0, 3, 1, 1)
self.verticalLayout.addWidget(self.groupBox_7)
self.buttonBox = QtWidgets.QDialogButtonBox(Dialog)
self.buttonBox.setOrientation(QtCore.Qt.Orientation.Horizontal)
@@ -146,33 +98,18 @@ class Ui_Dialog(object):
self.buttonBox.accepted.connect(Dialog.accept) # type: ignore
self.buttonBox.rejected.connect(Dialog.reject) # type: ignore
QtCore.QMetaObject.connectSlotsByName(Dialog)
- Dialog.setTabOrder(self.pb_font_message_title, self.pb_font_message_date)
- Dialog.setTabOrder(self.pb_font_message_date, self.pb_font_message_content)
- Dialog.setTabOrder(self.pb_font_message_content, self.cb_icons_application)
- Dialog.setTabOrder(self.cb_icons_application, self.cb_icons_message)
- Dialog.setTabOrder(self.cb_icons_message, self.cb_icons_notification)
+ Dialog.setTabOrder(self.combo_theme, self.cb_icons_notification)
Dialog.setTabOrder(self.cb_icons_notification, self.spin_priority)
Dialog.setTabOrder(self.spin_priority, self.spin_duration)
Dialog.setTabOrder(self.spin_duration, self.pb_change_server_info)
+ Dialog.setTabOrder(self.pb_change_server_info, self.combo_logging)
+ Dialog.setTabOrder(self.combo_logging, self.pb_open_log)
def retranslateUi(self, Dialog):
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
- self.groupBox.setTitle(_translate("Dialog", "Fonts"))
- self.groupBox_2.setTitle(_translate("Dialog", "Message"))
- self.label_3.setText(_translate("Dialog", "Content"))
- self.label_2.setText(_translate("Dialog", "Date"))
- self.pb_font_message_content.setText(_translate("Dialog", "..."))
- self.pb_font_message_date.setText(_translate("Dialog", "..."))
- self.label.setText(_translate("Dialog", "Title"))
- self.label_font_message_title.setText(_translate("Dialog", "TextLabel"))
- self.pb_font_message_title.setText(_translate("Dialog", "..."))
- self.label_font_message_date.setText(_translate("Dialog", "TextLabel"))
- self.label_font_message_content.setText(_translate("Dialog", "TextLabel"))
self.groupBox_6.setTitle(_translate("Dialog", "Theme"))
self.groupBox_3.setTitle(_translate("Dialog", "Icons"))
- self.cb_icons_application.setText(_translate("Dialog", "Show application icons"))
- self.cb_icons_message.setText(_translate("Dialog", "Show message icons"))
self.cb_icons_notification.setText(_translate("Dialog", "Show notification icons"))
self.groupBox_5.setTitle(_translate("Dialog", "Notifications"))
self.label_4.setText(_translate("Dialog", "Minimum priority to show notifications:"))
diff --git a/gotify_tray/gui/designs/widget_settings.ui b/gotify_tray/gui/designs/widget_settings.ui
index bd31eed..48a6c04 100644
--- a/gotify_tray/gui/designs/widget_settings.ui
+++ b/gotify_tray/gui/designs/widget_settings.ui
@@ -7,125 +7,13 @@
0
0
375
- 606
+ 392
Dialog
- -
-
-
- Fonts
-
-
-
-
-
-
- Message
-
-
-
-
-
-
- Content
-
-
-
- -
-
-
- Date
-
-
-
- -
-
-
-
- 30
- 16777215
-
-
-
- ...
-
-
-
- -
-
-
-
- 30
- 16777215
-
-
-
- ...
-
-
-
- -
-
-
- Title
-
-
-
- -
-
-
- TextLabel
-
-
-
- -
-
-
-
- 30
- 16777215
-
-
-
- ...
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- 40
- 20
-
-
-
-
- -
-
-
- TextLabel
-
-
-
- -
-
-
- TextLabel
-
-
-
-
-
-
-
-
-
-
@@ -157,20 +45,6 @@
Icons
-
-
-
-
- Show application icons
-
-
-
- -
-
-
- Show message icons
-
-
-
-
@@ -340,15 +214,13 @@
- pb_font_message_title
- pb_font_message_date
- pb_font_message_content
- cb_icons_application
- cb_icons_message
+ combo_theme
cb_icons_notification
spin_priority
spin_duration
pb_change_server_info
+ combo_logging
+ pb_open_log
diff --git a/gotify_tray/tasks.py b/gotify_tray/tasks.py
index 11fb52d..ca2ebfc 100644
--- a/gotify_tray/tasks.py
+++ b/gotify_tray/tasks.py
@@ -36,32 +36,6 @@ class BaseTask(QtCore.QThread):
self.running = False
-class DeleteMessageTask(BaseTask):
- deleted = pyqtSignal(bool)
-
- def __init__(self, message_id: int, gotify_client: gotify.GotifyClient):
- super(DeleteMessageTask, self).__init__()
- self.message_id = message_id
- self.gotify_client = gotify_client
-
- def task(self):
- success = self.gotify_client.delete_message(self.message_id)
- self.deleted.emit(success)
-
-
-class DeleteApplicationMessagesTask(BaseTask):
- deleted = pyqtSignal(bool)
-
- def __init__(self, appid: int, gotify_client: gotify.GotifyClient):
- super(DeleteApplicationMessagesTask, self).__init__()
- self.appid = appid
- self.gotify_client = gotify_client
-
- def task(self):
- success = self.gotify_client.delete_application_messages(self.appid)
- self.deleted.emit(success)
-
-
class DeleteAllMessagesTask(BaseTask):
deleted = pyqtSignal(bool)
@@ -90,39 +64,6 @@ class GetApplicationsTask(BaseTask):
self.success.emit(result)
-class GetApplicationMessagesTask(BaseTask):
- success = pyqtSignal(gotify.GotifyPagedMessagesModel)
- error = pyqtSignal(gotify.GotifyErrorModel)
-
- def __init__(self, appid: int, gotify_client: gotify.GotifyClient):
- super(GetApplicationMessagesTask, self).__init__()
- self.appid = appid
- self.gotify_client = gotify_client
-
- def task(self):
- result = self.gotify_client.get_application_messages(self.appid)
- if isinstance(result, gotify.GotifyErrorModel):
- self.error.emit(result)
- else:
- self.success.emit(result)
-
-
-class GetMessagesTask(BaseTask):
- success = pyqtSignal(gotify.GotifyPagedMessagesModel)
- error = pyqtSignal(gotify.GotifyErrorModel)
-
- def __init__(self, gotify_client: gotify.GotifyClient):
- super(GetMessagesTask, self).__init__()
- self.gotify_client = gotify_client
-
- def task(self):
- result = self.gotify_client.get_messages()
- if isinstance(result, gotify.GotifyErrorModel):
- self.error.emit(result)
- else:
- self.success.emit(result)
-
-
class VerifyServerInfoTask(BaseTask):
success = pyqtSignal(GotifyVersionModel)
incorrect_token = pyqtSignal(GotifyVersionModel)