a better main window

This commit is contained in:
dries.k
2022-02-08 22:12:52 +01:00
parent 6c280606b2
commit 0bea6ea14f
27 changed files with 1294 additions and 37 deletions

View File

@@ -3,23 +3,35 @@ import logging
import os
import sys
import tempfile
from typing import List
from typing import List, Union
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.tasks import (
DeleteApplicationMessagesTask,
DeleteAllMessagesTask,
DeleteMessageTask,
GetApplicationsTask,
GetApplicationMessagesTask,
GetMessagesTask,
ServerConnectionWatchdogTask,
)
from gotify_tray.utils import verify_server
from PyQt6 import QtCore, QtGui, QtWidgets
from ..__version__ import __title__
from .ApplicationModel import (
from .models import (
ApplicationAllMessagesItem,
ApplicationItemDataRole,
ApplicationModel,
ApplicationModelItem,
MessagesModel,
MessagesModelItem,
MessageItemDataRole,
)
from .SettingsDialog import SettingsDialog
from .Tray import Tray
from .widgets import MainWindow, SettingsDialog, Tray
settings = Settings("gotify-tray")
logger = logging.getLogger("gotify-tray")
@@ -58,7 +70,11 @@ class MainApplication(QtWidgets.QApplication):
self.downloader = Downloader()
self.messages_model = MessagesModel()
self.application_model = ApplicationModel()
self.main_window = MainWindow(self.application_model, self.messages_model)
self.refresh_applications()
self.tray = Tray()
@@ -77,44 +93,144 @@ class MainApplication(QtWidgets.QApplication):
self.watchdog.start()
def refresh_applications(self):
self.messages_model.clear()
self.application_model.clear()
def get_applications_callback(
applications: List[gotify.GotifyApplicationModel],
):
for i, application in enumerate(applications):
icon = QtGui.QIcon(
self.downloader.get_filename(
f"{self.gotify_client.url}/{application.image}"
)
)
self.application_model.setItem(
i, 0, ApplicationModelItem(application, icon),
)
self.application_model.setItem(0, 0, ApplicationAllMessagesItem())
self.get_applications_task = GetApplicationsTask(self.gotify_client)
self.get_applications_task.success.connect(get_applications_callback)
self.get_applications_task.success.connect(
self.get_applications_success_callback
)
self.get_applications_task.started.connect(
self.main_window.disable_applications
)
self.get_applications_task.finished.connect(
self.main_window.enable_applications
)
self.get_applications_task.start()
def get_applications_success_callback(
self, applications: List[gotify.GotifyApplicationModel],
):
for i, application in enumerate(applications):
icon = QtGui.QIcon(
self.downloader.get_filename(
f"{self.gotify_client.url}/{application.image}"
)
)
self.application_model.setItem(
i + 1, 0, ApplicationModelItem(application, icon),
)
def listener_opened_callback(self):
self.main_window.set_active()
self.tray.set_icon_ok()
# self.tray.actionReconnect.setEnabled(True)
def listener_closed_callback(self, close_status_code: int, close_msg: str):
self.main_window.set_connecting()
self.tray.set_icon_error()
if not self.shutting_down:
self.gotify_client.reconnect()
def refresh_callback(self):
# self.tray.actionReconnect.setDisabled(True)
def reconnect_callback(self):
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 insert_message(
self,
row: int,
message: gotify.GotifyMessageModel,
application: gotify.GotifyApplicationModel,
):
message_item = MessagesModelItem(message)
self.messages_model.insertRow(row, message_item)
self.main_window.insert_message_widget(
message_item,
self.downloader.get_filename(
f"{self.gotify_client.url}/{application.image}"
),
)
def application_selection_changed_callback(
self, item: Union[ApplicationModelItem, ApplicationAllMessagesItem]
):
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 add_message_to_model(self, message: gotify.GotifyMessageModel):
if application_item := self.application_model.itemFromId(message.appid):
application_index = self.main_window.currentApplicationIndex()
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 new_message_callback(self, message: gotify.GotifyMessageModel):
if message.priority < settings.value("tray/notifications/priority", type=int):
self.add_message_to_model(message)
# Show a notification
if (
message.priority < settings.value("tray/notifications/priority", type=int)
or self.main_window.isActiveWindow()
):
return
if settings.value("tray/notifications/icon/show", type=bool):
@@ -130,7 +246,6 @@ class MainApplication(QtWidgets.QApplication):
else:
icon = QtWidgets.QSystemTrayIcon.MessageIcon.Information
# Show a notification
self.tray.showMessage(
message.title,
message.message,
@@ -138,6 +253,30 @@ class MainApplication(QtWidgets.QApplication):
msecs=settings.value("tray/notifications/duration_ms", type=int),
)
def delete_message_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 delete_all_messages_callback(
self, item: Union[ApplicationModelItem, ApplicationAllMessagesItem]
):
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()
else:
return
self.messages_model.clear()
def settings_callback(self):
settings_dialog = SettingsDialog()
accepted = settings_dialog.exec()
@@ -158,10 +297,26 @@ class MainApplication(QtWidgets.QApplication):
if r == QtWidgets.QMessageBox.StandardButton.Yes:
self.quit()
def tray_activated_callback(
self, reason: QtWidgets.QSystemTrayIcon.ActivationReason
):
if reason == QtWidgets.QSystemTrayIcon.ActivationReason.Trigger:
self.main_window.bring_to_front()
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)
self.tray.actionShowWindow.triggered.connect(self.main_window.bring_to_front)
self.tray.actionReconnect.triggered.connect(self.reconnect_callback)
self.tray.messageClicked.connect(self.main_window.bring_to_front)
self.tray.activated.connect(self.tray_activated_callback)
self.main_window.refresh.connect(self.refresh_applications)
self.main_window.delete_all.connect(self.delete_all_messages_callback)
self.main_window.application_selection_changed.connect(
self.application_selection_changed_callback
)
self.main_window.delete_message.connect(self.delete_message_callback)
self.watchdog.closed.connect(lambda: self.listener_closed_callback(None, None))
@@ -175,6 +330,8 @@ class MainApplication(QtWidgets.QApplication):
return self.lock_file.tryLock()
def quit(self) -> None:
self.main_window.store_state()
self.tray.hide()
self.lock_file.unlock()