a better main window
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user