mirror of
https://github.com/freedomofpress/dangerzone.git
synced 2025-04-28 18:02:38 +02:00
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:
parent
dca290fb6b
commit
649e427486
5 changed files with 36 additions and 66 deletions
|
@ -12,7 +12,6 @@ from PySide2 import QtCore, QtGui, QtWidgets
|
|||
|
||||
from .. import args, errors
|
||||
from ..document import Document
|
||||
from ..logic import DangerzoneCore
|
||||
from .logic import DangerzoneGui
|
||||
from .main_window import MainWindow
|
||||
from .systray import SysTray
|
||||
|
@ -71,14 +70,13 @@ def gui_main(filename: Optional[str]) -> bool:
|
|||
app = app_wrapper.app
|
||||
|
||||
# Common objects
|
||||
dangerzone = DangerzoneCore()
|
||||
gui_common = DangerzoneGui(app, dangerzone)
|
||||
dangerzone = DangerzoneGui(app)
|
||||
|
||||
# Allow Ctrl-C to smoothly quit the program instead of throwing an exception
|
||||
signal.signal(signal.SIGINT, signal.SIG_DFL)
|
||||
|
||||
# Create the system tray
|
||||
systray = SysTray(dangerzone, gui_common, app, app_wrapper)
|
||||
systray = SysTray(dangerzone, app, app_wrapper)
|
||||
|
||||
closed_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:
|
||||
document = Document(input_filename)
|
||||
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)
|
||||
windows[window_id] = window
|
||||
|
||||
|
|
|
@ -24,18 +24,17 @@ from ..util import get_resource_path
|
|||
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
|
||||
self.app = app
|
||||
|
||||
# Global common singleton
|
||||
self.dangerzone = dangerzone
|
||||
|
||||
# Preload font
|
||||
self.fixed_font = QtGui.QFontDatabase.systemFont(QtGui.QFontDatabase.FixedFont)
|
||||
|
||||
|
@ -64,9 +63,7 @@ class DangerzoneGui(object):
|
|||
|
||||
elif platform.system() == "Linux":
|
||||
# Get the PDF reader command
|
||||
args = shlex.split(
|
||||
self.pdf_viewers[self.dangerzone.settings.get("open_app")]
|
||||
)
|
||||
args = shlex.split(self.pdf_viewers[self.settings.get("open_app")])
|
||||
# %f, %F, %u, and %U are filenames or URLS -- so replace with the file to open
|
||||
for i in range(len(args)):
|
||||
if (
|
||||
|
@ -115,18 +112,16 @@ class DangerzoneGui(object):
|
|||
class Alert(QtWidgets.QDialog):
|
||||
def __init__(
|
||||
self,
|
||||
dangerzone_gui: DangerzoneGui,
|
||||
dangerzone: DangerzoneCore,
|
||||
gui_common: DangerzoneGui,
|
||||
message: str,
|
||||
ok_text: str = "Ok",
|
||||
extra_button_text: str = None,
|
||||
) -> None:
|
||||
super(Alert, self).__init__()
|
||||
self.dangerzone = dangerzone
|
||||
self.dangerzone_gui = dangerzone_gui
|
||||
self.gui_common = gui_common
|
||||
|
||||
self.setWindowTitle("dangerzone")
|
||||
self.setWindowIcon(self.dangerzone_gui.get_window_icon())
|
||||
self.setWindowIcon(self.gui_common.get_window_icon())
|
||||
self.setModal(True)
|
||||
|
||||
flags = (
|
||||
|
|
|
@ -13,7 +13,6 @@ from PySide2 import QtCore, QtGui, QtWidgets
|
|||
from .. import container
|
||||
from ..container import convert
|
||||
from ..document import Document
|
||||
from ..logic import DangerzoneCore
|
||||
from ..util import get_resource_path, get_subprocess_startupinfo
|
||||
from .logic import DangerzoneGui
|
||||
|
||||
|
@ -25,19 +24,17 @@ class MainWindow(QtWidgets.QMainWindow):
|
|||
|
||||
def __init__(
|
||||
self,
|
||||
dangerzone: DangerzoneCore,
|
||||
gui_common: DangerzoneGui,
|
||||
dangerzone: DangerzoneGui,
|
||||
window_id: str,
|
||||
document: Document,
|
||||
) -> None:
|
||||
super(MainWindow, self).__init__()
|
||||
self.dangerzone = dangerzone
|
||||
self.gui_common = gui_common
|
||||
self.window_id = window_id
|
||||
self.document = document
|
||||
|
||||
self.setWindowTitle("Dangerzone")
|
||||
self.setWindowIcon(self.gui_common.get_window_icon())
|
||||
self.setWindowIcon(self.dangerzone.get_window_icon())
|
||||
|
||||
self.setMinimumWidth(600)
|
||||
self.setMinimumHeight(400)
|
||||
|
@ -48,7 +45,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|||
QtGui.QPixmap.fromImage(QtGui.QImage(get_resource_path("icon.png")))
|
||||
)
|
||||
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_layout = QtWidgets.QHBoxLayout()
|
||||
header_layout.addStretch()
|
||||
|
@ -58,17 +55,15 @@ class MainWindow(QtWidgets.QMainWindow):
|
|||
header_layout.addStretch()
|
||||
|
||||
# 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)
|
||||
|
||||
# Content widget, contains all the window content except waiting widget
|
||||
self.content_widget = ContentWidget(
|
||||
self.dangerzone, self.gui_common, self.document
|
||||
)
|
||||
self.content_widget = ContentWidget(self.dangerzone, self.document)
|
||||
self.content_widget.close_window.connect(self.close)
|
||||
|
||||
# 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.content_widget.show()
|
||||
else:
|
||||
|
@ -88,7 +83,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
|||
self.show()
|
||||
|
||||
def waiting_finished(self) -> None:
|
||||
self.gui_common.is_waiting_finished = True
|
||||
self.dangerzone.is_waiting_finished = True
|
||||
self.waiting_widget.hide()
|
||||
self.content_widget.show()
|
||||
|
||||
|
@ -97,15 +92,14 @@ class MainWindow(QtWidgets.QMainWindow):
|
|||
self.delete_window.emit(self.window_id)
|
||||
|
||||
if platform.system() != "Darwin":
|
||||
self.gui_common.app.quit()
|
||||
self.dangerzone.app.quit()
|
||||
|
||||
|
||||
class InstallContainerThread(QtCore.QThread):
|
||||
finished = QtCore.Signal()
|
||||
|
||||
def __init__(self, dangerzone: DangerzoneCore) -> None:
|
||||
def __init__(self) -> None:
|
||||
super(InstallContainerThread, self).__init__()
|
||||
self.dangerzone = dangerzone
|
||||
|
||||
def run(self) -> None:
|
||||
container.install()
|
||||
|
@ -124,10 +118,9 @@ class WaitingWidget(QtWidgets.QWidget):
|
|||
# - "install_container"
|
||||
finished = QtCore.Signal()
|
||||
|
||||
def __init__(self, dangerzone: DangerzoneCore, gui_common: DangerzoneGui) -> None:
|
||||
def __init__(self, dangerzone: DangerzoneGui) -> None:
|
||||
super(WaitingWidget, self).__init__()
|
||||
self.dangerzone = dangerzone
|
||||
self.gui_common = gui_common
|
||||
|
||||
self.label = QtWidgets.QLabel()
|
||||
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..."
|
||||
)
|
||||
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.start()
|
||||
|
||||
|
@ -209,13 +202,10 @@ class WaitingWidget(QtWidgets.QWidget):
|
|||
class ContentWidget(QtWidgets.QWidget):
|
||||
close_window = QtCore.Signal()
|
||||
|
||||
def __init__(
|
||||
self, dangerzone: DangerzoneCore, gui_common: DangerzoneGui, document: Document
|
||||
) -> None:
|
||||
def __init__(self, dangerzone: DangerzoneGui, document: Document) -> None:
|
||||
super(ContentWidget, self).__init__()
|
||||
|
||||
self.dangerzone = dangerzone
|
||||
self.gui_common = gui_common
|
||||
self.document = document
|
||||
|
||||
# Doc selection widget
|
||||
|
@ -223,9 +213,7 @@ class ContentWidget(QtWidgets.QWidget):
|
|||
self.doc_selection_widget.document_selected.connect(self.document_selected)
|
||||
|
||||
# Settings
|
||||
self.settings_widget = SettingsWidget(
|
||||
self.dangerzone, self.gui_common, self.document
|
||||
)
|
||||
self.settings_widget = SettingsWidget(self.dangerzone, self.document)
|
||||
self.doc_selection_widget.document_selected.connect(
|
||||
self.settings_widget.document_selected
|
||||
)
|
||||
|
@ -234,9 +222,7 @@ class ContentWidget(QtWidgets.QWidget):
|
|||
self.settings_widget.hide()
|
||||
|
||||
# Convert
|
||||
self.convert_widget = ConvertWidget(
|
||||
self.dangerzone, self.gui_common, self.document
|
||||
)
|
||||
self.convert_widget = ConvertWidget(self.dangerzone, self.document)
|
||||
self.convert_widget.close_window.connect(self._close_window)
|
||||
self.doc_selection_widget.document_selected.connect(
|
||||
self.convert_widget.document_selected
|
||||
|
@ -308,12 +294,9 @@ class SettingsWidget(QtWidgets.QWidget):
|
|||
start_clicked = QtCore.Signal()
|
||||
close_window = QtCore.Signal()
|
||||
|
||||
def __init__(
|
||||
self, dangerzone: DangerzoneCore, gui_common: DangerzoneGui, document: Document
|
||||
) -> None:
|
||||
def __init__(self, dangerzone: DangerzoneGui, document: Document) -> None:
|
||||
super(SettingsWidget, self).__init__()
|
||||
self.dangerzone = dangerzone
|
||||
self.gui_common = gui_common
|
||||
self.document = document
|
||||
|
||||
# Dangerous document label
|
||||
|
@ -358,8 +341,8 @@ class SettingsWidget(QtWidgets.QWidget):
|
|||
)
|
||||
self.open_checkbox.clicked.connect(self.update_ui)
|
||||
self.open_combobox = QtWidgets.QComboBox()
|
||||
for k in self.gui_common.pdf_viewers:
|
||||
self.open_combobox.addItem(k, self.gui_common.pdf_viewers[k])
|
||||
for k in self.dangerzone.pdf_viewers:
|
||||
self.open_combobox.addItem(k, self.dangerzone.pdf_viewers[k])
|
||||
|
||||
if platform.system() == "Darwin" or platform.system() == "Linux":
|
||||
open_layout = QtWidgets.QHBoxLayout()
|
||||
|
@ -498,7 +481,7 @@ class ConvertThread(QtCore.QThread):
|
|||
finished = QtCore.Signal(bool)
|
||||
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__()
|
||||
self.dangerzone = dangerzone
|
||||
self.document = document
|
||||
|
@ -546,12 +529,9 @@ class ConvertThread(QtCore.QThread):
|
|||
class ConvertWidget(QtWidgets.QWidget):
|
||||
close_window = QtCore.Signal()
|
||||
|
||||
def __init__(
|
||||
self, dangerzone: DangerzoneCore, gui_common: DangerzoneGui, document: Document
|
||||
) -> None:
|
||||
def __init__(self, dangerzone: DangerzoneGui, document: Document) -> None:
|
||||
super(ConvertWidget, self).__init__()
|
||||
self.dangerzone = dangerzone
|
||||
self.gui_common = gui_common
|
||||
self.document = document
|
||||
|
||||
self.error = False
|
||||
|
@ -629,11 +609,11 @@ class ConvertWidget(QtWidgets.QWidget):
|
|||
|
||||
# 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
|
||||
if platform.system() == "Darwin":
|
||||
# In macOS, just close the window
|
||||
self.close_window.emit()
|
||||
else:
|
||||
self.gui_common.app.quit()
|
||||
self.dangerzone.app.quit()
|
||||
|
|
|
@ -3,7 +3,6 @@ from typing import TYPE_CHECKING
|
|||
|
||||
from PySide2 import QtWidgets
|
||||
|
||||
from ..logic import DangerzoneCore
|
||||
from .logic import DangerzoneGui
|
||||
|
||||
if TYPE_CHECKING:
|
||||
|
@ -13,18 +12,16 @@ if TYPE_CHECKING:
|
|||
class SysTray(QtWidgets.QSystemTrayIcon):
|
||||
def __init__(
|
||||
self,
|
||||
dangerzone: DangerzoneCore,
|
||||
gui_common: DangerzoneGui,
|
||||
dangerzone: DangerzoneGui,
|
||||
app: QtWidgets.QApplication,
|
||||
app_wrapper: "ApplicationWrapper",
|
||||
) -> None:
|
||||
super(SysTray, self).__init__()
|
||||
self.dangerzone = dangerzone
|
||||
self.gui_common = gui_common
|
||||
self.app = app
|
||||
self.app_wrapper = app_wrapper
|
||||
|
||||
self.setIcon(self.gui_common.get_window_icon())
|
||||
self.setIcon(self.dangerzone.get_window_icon())
|
||||
|
||||
menu = QtWidgets.QMenu()
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@ log = logging.getLogger(__name__)
|
|||
|
||||
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:
|
||||
|
|
Loading…
Reference in a new issue