diff --git a/dangerzone/gui/__init__.py b/dangerzone/gui/__init__.py index ac5736e..0d0f899 100644 --- a/dangerzone/gui/__init__.py +++ b/dangerzone/gui/__init__.py @@ -6,41 +6,14 @@ from typing import Optional import click import uuid -from PySide6 import QtCore -from PySide6.QtCore import QEvent -from PySide6.QtWidgets import QApplication +from .application import Application from .common import GuiCommon from .main_window import MainWindow from .systray import SysTray from ..global_common import GlobalCommon -class Application(QApplication): - document_selected = QtCore.Signal(str) - new_window = QtCore.Signal() - application_activated = QtCore.Signal() - - def __init__(self): - super(Application, self).__init__() - self.setQuitOnLastWindowClosed(False) - self.original_event = self.event - - def monkeypatch_event(event: QEvent): - # In macOS, handle the file open event - if event.type() == QtCore.QEvent.FileOpen: - # Skip file open events in dev mode - if not hasattr(sys, "dangerzone_dev"): - self.document_selected.emit(event.file()) - return True - elif event.type() == QtCore.QEvent.ApplicationActivate: - self.application_activated.emit() - return True - return self.original_event(event) - - self.event = monkeypatch_event - - @click.command() @click.argument("filename", required=False) def gui_main(filename): @@ -50,7 +23,7 @@ def gui_main(filename): # Strip ANSI colors from stdout output, to prevent terminal colors from breaking # the macOS GUI app - from strip_ansi import strip_ansi + from strip_ansi import strip_ansi # type: ignore class StdoutFilter: def __init__(self, stream): @@ -95,7 +68,7 @@ def gui_main(filename): len(windows) == 1 and windows[list(windows.keys())[0]].common.input_filename is None ): - window = windows[list(windows.keys())[0]] + window: MainWindow = windows[list(windows.keys())[0]] else: window_id = uuid.uuid4().hex window = MainWindow(global_common, gui_common, window_id) diff --git a/dangerzone/gui/application.py b/dangerzone/gui/application.py new file mode 100644 index 0000000..565ae2e --- /dev/null +++ b/dangerzone/gui/application.py @@ -0,0 +1,30 @@ +import sys + +from PySide6 import QtCore +from PySide6.QtCore import QEvent +from PySide6.QtWidgets import QApplication + + +class Application(QApplication): + document_selected = QtCore.Signal(str) + new_window = QtCore.Signal() + application_activated = QtCore.Signal() + + def __init__(self): + super(Application, self).__init__() + self.setQuitOnLastWindowClosed(False) + self.original_event = self.event + + def monkeypatch_event(event: QEvent): + # In macOS, handle the file open event + if event.type() == QtCore.QEvent.FileOpen: + # Skip file open events in dev mode + if not hasattr(sys, "dangerzone_dev"): + self.document_selected.emit(event.file()) + return True + elif event.type() == QtCore.QEvent.ApplicationActivate: + self.application_activated.emit() + return True + return self.original_event(event) + + self.event = monkeypatch_event diff --git a/dangerzone/gui/common.py b/dangerzone/gui/common.py index 9fc5f84..7628adf 100644 --- a/dangerzone/gui/common.py +++ b/dangerzone/gui/common.py @@ -6,13 +6,16 @@ import pipes from PySide6 import QtCore, QtGui, QtWidgets from colorama import Fore +from . import Application +from ..global_common import GlobalCommon + if platform.system() == "Darwin": import plistlib elif platform.system() == "Linux": import grp import getpass - from xdg.DesktopEntry import DesktopEntry + from xdg.DesktopEntry import DesktopEntry # type: ignore from ..settings import Settings @@ -22,7 +25,7 @@ class GuiCommon(object): The GuiCommon class is a singleton of shared functionality for the GUI """ - def __init__(self, app, global_common): + def __init__(self, app: Application, global_common: GlobalCommon): # Qt app self.app = app @@ -45,7 +48,7 @@ class GuiCommon(object): path = self.global_common.get_resource_path("icon.png") return QtGui.QIcon(path) - def open_pdf_viewer(self, filename): + def open_pdf_viewer(self, filename: str): if platform.system() == "Darwin": # Open in Preview args = ["open", "-a", "Preview.app", filename] @@ -75,7 +78,8 @@ class GuiCommon(object): print(Fore.YELLOW + "> " + Fore.CYAN + args_str) subprocess.Popen(args) - def _find_pdf_viewers(self): + @staticmethod + def _find_pdf_viewers(): pdf_viewers = {} if platform.system() == "Linux": # Find all .desktop files diff --git a/dangerzone/gui/main_window.py b/dangerzone/gui/main_window.py index c0893b2..56ca217 100644 --- a/dangerzone/gui/main_window.py +++ b/dangerzone/gui/main_window.py @@ -7,14 +7,16 @@ import shutil from PySide6 import QtCore, QtGui, QtWidgets from colorama import Style, Fore +from . import GuiCommon from ..common import Common from ..container import convert +from ..global_common import GlobalCommon class MainWindow(QtWidgets.QMainWindow): delete_window = QtCore.Signal(str) - def __init__(self, global_common, gui_common, window_id): + def __init__(self, global_common: GlobalCommon, gui_common: GuiCommon, window_id: str): super(MainWindow, self).__init__() self.global_common = global_common self.gui_common = gui_common @@ -90,7 +92,7 @@ class MainWindow(QtWidgets.QMainWindow): class InstallContainerThread(QtCore.QThread): finished = QtCore.Signal() - def __init__(self, global_common): + def __init__(self, global_common: GlobalCommon): super(InstallContainerThread, self).__init__() self.global_common = global_common @@ -111,7 +113,7 @@ class WaitingWidget(QtWidgets.QWidget): # - "install_container" finished = QtCore.Signal() - def __init__(self, global_common, gui_common): + def __init__(self, global_common: GlobalCommon, gui_common: GuiCommon): super(WaitingWidget, self).__init__() self.global_common = global_common self.gui_common = gui_common @@ -145,7 +147,7 @@ class WaitingWidget(QtWidgets.QWidget): self.check_state() def check_state(self): - state = None + state: str # Can we find the container runtime binary binary if platform.system() == "Linux": @@ -200,7 +202,7 @@ class WaitingWidget(QtWidgets.QWidget): class ContentWidget(QtWidgets.QWidget): close_window = QtCore.Signal() - def __init__(self, global_common, gui_common, common): + def __init__(self, global_common: GlobalCommon, gui_common: GuiCommon, common: Common): super(ContentWidget, self).__init__() self.global_common = global_common @@ -255,7 +257,7 @@ class ContentWidget(QtWidgets.QWidget): class DocSelectionWidget(QtWidgets.QWidget): document_selected = QtCore.Signal() - def __init__(self, common): + def __init__(self, common: Common): super(DocSelectionWidget, self).__init__() self.common = common @@ -298,7 +300,7 @@ class SettingsWidget(QtWidgets.QWidget): start_clicked = QtCore.Signal() close_window = QtCore.Signal() - def __init__(self, global_common, gui_common, common): + def __init__(self, global_common: GlobalCommon, gui_common: GuiCommon, common: Common): super(SettingsWidget, self).__init__() self.global_common = global_common self.gui_common = gui_common @@ -489,7 +491,7 @@ class ConvertThread(QtCore.QThread): is_finished = QtCore.Signal(bool) update = QtCore.Signal(bool, str, int) - def __init__(self, global_common, common): + def __init__(self, global_common: GlobalCommon, common: Common): super(ConvertThread, self).__init__() self.global_common = global_common self.common = common @@ -536,7 +538,7 @@ class ConvertThread(QtCore.QThread): class ConvertWidget(QtWidgets.QWidget): close_window = QtCore.Signal() - def __init__(self, global_common, gui_common, common): + def __init__(self, global_common: GlobalCommon, gui_common: GuiCommon, common: Common): super(ConvertWidget, self).__init__() self.global_common = global_common self.gui_common = gui_common diff --git a/dangerzone/gui/systray.py b/dangerzone/gui/systray.py index ff962f2..080b4ef 100644 --- a/dangerzone/gui/systray.py +++ b/dangerzone/gui/systray.py @@ -1,12 +1,12 @@ from PySide6 import QtWidgets from dangerzone.global_common import GlobalCommon -from dangerzone.gui import GuiCommon +from dangerzone.gui import GuiCommon, Application class SysTray(QtWidgets.QSystemTrayIcon): def __init__( - self, global_common: GlobalCommon, gui_common: GuiCommon, app + self, global_common: GlobalCommon, gui_common: GuiCommon, app: Application ): super(SysTray, self).__init__() self.global_common = global_common