Make DangerzoneGui a subclass of DangerzoneCore

Simplify state sharing by having all dangerzone core logic in one
single class instead of two.
This commit is contained in:
deeplow 2022-10-11 12:35:42 +03:00
parent dca290fb6b
commit 649e427486
No known key found for this signature in database
GPG key ID: 577982871529A52A
5 changed files with 36 additions and 66 deletions

View file

@ -12,7 +12,6 @@ from PySide2 import QtCore, QtGui, QtWidgets
from .. import args, errors from .. import args, errors
from ..document import Document from ..document import Document
from ..logic import DangerzoneCore
from .logic import DangerzoneGui from .logic import DangerzoneGui
from .main_window import MainWindow from .main_window import MainWindow
from .systray import SysTray from .systray import SysTray
@ -71,14 +70,13 @@ def gui_main(filename: Optional[str]) -> bool:
app = app_wrapper.app app = app_wrapper.app
# Common objects # Common objects
dangerzone = DangerzoneCore() dangerzone = DangerzoneGui(app)
gui_common = DangerzoneGui(app, dangerzone)
# Allow Ctrl-C to smoothly quit the program instead of throwing an exception # Allow Ctrl-C to smoothly quit the program instead of throwing an exception
signal.signal(signal.SIGINT, signal.SIG_DFL) signal.signal(signal.SIGINT, signal.SIG_DFL)
# Create the system tray # Create the system tray
systray = SysTray(dangerzone, gui_common, app, app_wrapper) systray = SysTray(dangerzone, app, app_wrapper)
closed_windows: Dict[str, MainWindow] = {} closed_windows: Dict[str, MainWindow] = {}
windows: Dict[str, MainWindow] = {} windows: Dict[str, MainWindow] = {}
@ -91,7 +89,7 @@ def gui_main(filename: Optional[str]) -> bool:
def new_window(input_filename: Optional[str] = None) -> None: def new_window(input_filename: Optional[str] = None) -> None:
document = Document(input_filename) document = Document(input_filename)
window_id = uuid.uuid4().hex window_id = uuid.uuid4().hex
window = MainWindow(dangerzone, gui_common, window_id, document) window = MainWindow(dangerzone, window_id, document)
window.delete_window.connect(delete_window) window.delete_window.connect(delete_window)
windows[window_id] = window windows[window_id] = window

View file

@ -24,18 +24,17 @@ from ..util import get_resource_path
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
class DangerzoneGui(object): class DangerzoneGui(DangerzoneCore):
""" """
The DangerzoneGui class is a singleton of shared functionality for the GUI Singleton of shared state / functionality for the GUI and core app logic
""" """
def __init__(self, app: QtWidgets.QApplication, dangerzone: DangerzoneCore) -> None: def __init__(self, app: QtWidgets.QApplication) -> None:
super().__init__()
# Qt app # Qt app
self.app = app self.app = app
# Global common singleton
self.dangerzone = dangerzone
# Preload font # Preload font
self.fixed_font = QtGui.QFontDatabase.systemFont(QtGui.QFontDatabase.FixedFont) self.fixed_font = QtGui.QFontDatabase.systemFont(QtGui.QFontDatabase.FixedFont)
@ -64,9 +63,7 @@ class DangerzoneGui(object):
elif platform.system() == "Linux": elif platform.system() == "Linux":
# Get the PDF reader command # Get the PDF reader command
args = shlex.split( args = shlex.split(self.pdf_viewers[self.settings.get("open_app")])
self.pdf_viewers[self.dangerzone.settings.get("open_app")]
)
# %f, %F, %u, and %U are filenames or URLS -- so replace with the file to open # %f, %F, %u, and %U are filenames or URLS -- so replace with the file to open
for i in range(len(args)): for i in range(len(args)):
if ( if (
@ -115,18 +112,16 @@ class DangerzoneGui(object):
class Alert(QtWidgets.QDialog): class Alert(QtWidgets.QDialog):
def __init__( def __init__(
self, self,
dangerzone_gui: DangerzoneGui, gui_common: DangerzoneGui,
dangerzone: DangerzoneCore,
message: str, message: str,
ok_text: str = "Ok", ok_text: str = "Ok",
extra_button_text: str = None, extra_button_text: str = None,
) -> None: ) -> None:
super(Alert, self).__init__() super(Alert, self).__init__()
self.dangerzone = dangerzone self.gui_common = gui_common
self.dangerzone_gui = dangerzone_gui
self.setWindowTitle("dangerzone") self.setWindowTitle("dangerzone")
self.setWindowIcon(self.dangerzone_gui.get_window_icon()) self.setWindowIcon(self.gui_common.get_window_icon())
self.setModal(True) self.setModal(True)
flags = ( flags = (

View file

@ -13,7 +13,6 @@ from PySide2 import QtCore, QtGui, QtWidgets
from .. import container from .. import container
from ..container import convert from ..container import convert
from ..document import Document from ..document import Document
from ..logic import DangerzoneCore
from ..util import get_resource_path, get_subprocess_startupinfo from ..util import get_resource_path, get_subprocess_startupinfo
from .logic import DangerzoneGui from .logic import DangerzoneGui
@ -25,19 +24,17 @@ class MainWindow(QtWidgets.QMainWindow):
def __init__( def __init__(
self, self,
dangerzone: DangerzoneCore, dangerzone: DangerzoneGui,
gui_common: DangerzoneGui,
window_id: str, window_id: str,
document: Document, document: Document,
) -> None: ) -> None:
super(MainWindow, self).__init__() super(MainWindow, self).__init__()
self.dangerzone = dangerzone self.dangerzone = dangerzone
self.gui_common = gui_common
self.window_id = window_id self.window_id = window_id
self.document = document self.document = document
self.setWindowTitle("Dangerzone") self.setWindowTitle("Dangerzone")
self.setWindowIcon(self.gui_common.get_window_icon()) self.setWindowIcon(self.dangerzone.get_window_icon())
self.setMinimumWidth(600) self.setMinimumWidth(600)
self.setMinimumHeight(400) self.setMinimumHeight(400)
@ -48,7 +45,7 @@ class MainWindow(QtWidgets.QMainWindow):
QtGui.QPixmap.fromImage(QtGui.QImage(get_resource_path("icon.png"))) QtGui.QPixmap.fromImage(QtGui.QImage(get_resource_path("icon.png")))
) )
header_label = QtWidgets.QLabel("dangerzone") header_label = QtWidgets.QLabel("dangerzone")
header_label.setFont(self.gui_common.fixed_font) header_label.setFont(self.dangerzone.fixed_font)
header_label.setStyleSheet("QLabel { font-weight: bold; font-size: 50px; }") header_label.setStyleSheet("QLabel { font-weight: bold; font-size: 50px; }")
header_layout = QtWidgets.QHBoxLayout() header_layout = QtWidgets.QHBoxLayout()
header_layout.addStretch() header_layout.addStretch()
@ -58,17 +55,15 @@ class MainWindow(QtWidgets.QMainWindow):
header_layout.addStretch() header_layout.addStretch()
# Waiting widget, replaces content widget while container runtime isn't available # Waiting widget, replaces content widget while container runtime isn't available
self.waiting_widget = WaitingWidget(self.dangerzone, self.gui_common) self.waiting_widget = WaitingWidget(self.dangerzone)
self.waiting_widget.finished.connect(self.waiting_finished) self.waiting_widget.finished.connect(self.waiting_finished)
# Content widget, contains all the window content except waiting widget # Content widget, contains all the window content except waiting widget
self.content_widget = ContentWidget( self.content_widget = ContentWidget(self.dangerzone, self.document)
self.dangerzone, self.gui_common, self.document
)
self.content_widget.close_window.connect(self.close) self.content_widget.close_window.connect(self.close)
# Only use the waiting widget if container runtime isn't available # Only use the waiting widget if container runtime isn't available
if self.gui_common.is_waiting_finished: if self.dangerzone.is_waiting_finished:
self.waiting_widget.hide() self.waiting_widget.hide()
self.content_widget.show() self.content_widget.show()
else: else:
@ -88,7 +83,7 @@ class MainWindow(QtWidgets.QMainWindow):
self.show() self.show()
def waiting_finished(self) -> None: def waiting_finished(self) -> None:
self.gui_common.is_waiting_finished = True self.dangerzone.is_waiting_finished = True
self.waiting_widget.hide() self.waiting_widget.hide()
self.content_widget.show() self.content_widget.show()
@ -97,15 +92,14 @@ class MainWindow(QtWidgets.QMainWindow):
self.delete_window.emit(self.window_id) self.delete_window.emit(self.window_id)
if platform.system() != "Darwin": if platform.system() != "Darwin":
self.gui_common.app.quit() self.dangerzone.app.quit()
class InstallContainerThread(QtCore.QThread): class InstallContainerThread(QtCore.QThread):
finished = QtCore.Signal() finished = QtCore.Signal()
def __init__(self, dangerzone: DangerzoneCore) -> None: def __init__(self) -> None:
super(InstallContainerThread, self).__init__() super(InstallContainerThread, self).__init__()
self.dangerzone = dangerzone
def run(self) -> None: def run(self) -> None:
container.install() container.install()
@ -124,10 +118,9 @@ class WaitingWidget(QtWidgets.QWidget):
# - "install_container" # - "install_container"
finished = QtCore.Signal() finished = QtCore.Signal()
def __init__(self, dangerzone: DangerzoneCore, gui_common: DangerzoneGui) -> None: def __init__(self, dangerzone: DangerzoneGui) -> None:
super(WaitingWidget, self).__init__() super(WaitingWidget, self).__init__()
self.dangerzone = dangerzone self.dangerzone = dangerzone
self.gui_common = gui_common
self.label = QtWidgets.QLabel() self.label = QtWidgets.QLabel()
self.label.setAlignment(QtCore.Qt.AlignCenter) self.label.setAlignment(QtCore.Qt.AlignCenter)
@ -201,7 +194,7 @@ class WaitingWidget(QtWidgets.QWidget):
"Installing the Dangerzone container image.<br><br>This might take a few minutes..." "Installing the Dangerzone container image.<br><br>This might take a few minutes..."
) )
self.buttons.hide() self.buttons.hide()
self.install_container_t = InstallContainerThread(self.dangerzone) self.install_container_t = InstallContainerThread()
self.install_container_t.finished.connect(self.finished) self.install_container_t.finished.connect(self.finished)
self.install_container_t.start() self.install_container_t.start()
@ -209,13 +202,10 @@ class WaitingWidget(QtWidgets.QWidget):
class ContentWidget(QtWidgets.QWidget): class ContentWidget(QtWidgets.QWidget):
close_window = QtCore.Signal() close_window = QtCore.Signal()
def __init__( def __init__(self, dangerzone: DangerzoneGui, document: Document) -> None:
self, dangerzone: DangerzoneCore, gui_common: DangerzoneGui, document: Document
) -> None:
super(ContentWidget, self).__init__() super(ContentWidget, self).__init__()
self.dangerzone = dangerzone self.dangerzone = dangerzone
self.gui_common = gui_common
self.document = document self.document = document
# Doc selection widget # Doc selection widget
@ -223,9 +213,7 @@ class ContentWidget(QtWidgets.QWidget):
self.doc_selection_widget.document_selected.connect(self.document_selected) self.doc_selection_widget.document_selected.connect(self.document_selected)
# Settings # Settings
self.settings_widget = SettingsWidget( self.settings_widget = SettingsWidget(self.dangerzone, self.document)
self.dangerzone, self.gui_common, self.document
)
self.doc_selection_widget.document_selected.connect( self.doc_selection_widget.document_selected.connect(
self.settings_widget.document_selected self.settings_widget.document_selected
) )
@ -234,9 +222,7 @@ class ContentWidget(QtWidgets.QWidget):
self.settings_widget.hide() self.settings_widget.hide()
# Convert # Convert
self.convert_widget = ConvertWidget( self.convert_widget = ConvertWidget(self.dangerzone, self.document)
self.dangerzone, self.gui_common, self.document
)
self.convert_widget.close_window.connect(self._close_window) self.convert_widget.close_window.connect(self._close_window)
self.doc_selection_widget.document_selected.connect( self.doc_selection_widget.document_selected.connect(
self.convert_widget.document_selected self.convert_widget.document_selected
@ -308,12 +294,9 @@ class SettingsWidget(QtWidgets.QWidget):
start_clicked = QtCore.Signal() start_clicked = QtCore.Signal()
close_window = QtCore.Signal() close_window = QtCore.Signal()
def __init__( def __init__(self, dangerzone: DangerzoneGui, document: Document) -> None:
self, dangerzone: DangerzoneCore, gui_common: DangerzoneGui, document: Document
) -> None:
super(SettingsWidget, self).__init__() super(SettingsWidget, self).__init__()
self.dangerzone = dangerzone self.dangerzone = dangerzone
self.gui_common = gui_common
self.document = document self.document = document
# Dangerous document label # Dangerous document label
@ -358,8 +341,8 @@ class SettingsWidget(QtWidgets.QWidget):
) )
self.open_checkbox.clicked.connect(self.update_ui) self.open_checkbox.clicked.connect(self.update_ui)
self.open_combobox = QtWidgets.QComboBox() self.open_combobox = QtWidgets.QComboBox()
for k in self.gui_common.pdf_viewers: for k in self.dangerzone.pdf_viewers:
self.open_combobox.addItem(k, self.gui_common.pdf_viewers[k]) self.open_combobox.addItem(k, self.dangerzone.pdf_viewers[k])
if platform.system() == "Darwin" or platform.system() == "Linux": if platform.system() == "Darwin" or platform.system() == "Linux":
open_layout = QtWidgets.QHBoxLayout() open_layout = QtWidgets.QHBoxLayout()
@ -498,7 +481,7 @@ class ConvertThread(QtCore.QThread):
finished = QtCore.Signal(bool) finished = QtCore.Signal(bool)
update = QtCore.Signal(bool, str, int) update = QtCore.Signal(bool, str, int)
def __init__(self, dangerzone: DangerzoneCore, document: Document) -> None: def __init__(self, dangerzone: DangerzoneGui, document: Document) -> None:
super(ConvertThread, self).__init__() super(ConvertThread, self).__init__()
self.dangerzone = dangerzone self.dangerzone = dangerzone
self.document = document self.document = document
@ -546,12 +529,9 @@ class ConvertThread(QtCore.QThread):
class ConvertWidget(QtWidgets.QWidget): class ConvertWidget(QtWidgets.QWidget):
close_window = QtCore.Signal() close_window = QtCore.Signal()
def __init__( def __init__(self, dangerzone: DangerzoneGui, document: Document) -> None:
self, dangerzone: DangerzoneCore, gui_common: DangerzoneGui, document: Document
) -> None:
super(ConvertWidget, self).__init__() super(ConvertWidget, self).__init__()
self.dangerzone = dangerzone self.dangerzone = dangerzone
self.gui_common = gui_common
self.document = document self.document = document
self.error = False self.error = False
@ -629,11 +609,11 @@ class ConvertWidget(QtWidgets.QWidget):
# Open # Open
if self.dangerzone.settings.get("open"): if self.dangerzone.settings.get("open"):
self.gui_common.open_pdf_viewer(self.document.output_filename) self.dangerzone.open_pdf_viewer(self.document.output_filename)
# Quit # Quit
if platform.system() == "Darwin": if platform.system() == "Darwin":
# In macOS, just close the window # In macOS, just close the window
self.close_window.emit() self.close_window.emit()
else: else:
self.gui_common.app.quit() self.dangerzone.app.quit()

View file

@ -3,7 +3,6 @@ from typing import TYPE_CHECKING
from PySide2 import QtWidgets from PySide2 import QtWidgets
from ..logic import DangerzoneCore
from .logic import DangerzoneGui from .logic import DangerzoneGui
if TYPE_CHECKING: if TYPE_CHECKING:
@ -13,18 +12,16 @@ if TYPE_CHECKING:
class SysTray(QtWidgets.QSystemTrayIcon): class SysTray(QtWidgets.QSystemTrayIcon):
def __init__( def __init__(
self, self,
dangerzone: DangerzoneCore, dangerzone: DangerzoneGui,
gui_common: DangerzoneGui,
app: QtWidgets.QApplication, app: QtWidgets.QApplication,
app_wrapper: "ApplicationWrapper", app_wrapper: "ApplicationWrapper",
) -> None: ) -> None:
super(SysTray, self).__init__() super(SysTray, self).__init__()
self.dangerzone = dangerzone self.dangerzone = dangerzone
self.gui_common = gui_common
self.app = app self.app = app
self.app_wrapper = app_wrapper self.app_wrapper = app_wrapper
self.setIcon(self.gui_common.get_window_icon()) self.setIcon(self.dangerzone.get_window_icon())
menu = QtWidgets.QMenu() menu = QtWidgets.QMenu()

View file

@ -20,7 +20,7 @@ log = logging.getLogger(__name__)
class DangerzoneCore(object): class DangerzoneCore(object):
""" """
The DangerzoneCore class is a singleton of shared functionality throughout the app Singleton of shared state / functionality throughout the app
""" """
def __init__(self) -> None: def __init__(self) -> None: