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 .. 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
|
||||||
|
|
||||||
|
|
|
@ -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 = (
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Reference in a new issue