diff --git a/dangerzone/gui/__init__.py b/dangerzone/gui/__init__.py index 10fd44f..149bcbe 100644 --- a/dangerzone/gui/__init__.py +++ b/dangerzone/gui/__init__.py @@ -93,8 +93,8 @@ def gui_main(custom_container, filename): # Allow Ctrl-C to smoothly quit the program instead of throwing an exception signal.signal(signal.SIGINT, signal.SIG_DFL) - # See if we need to install Docker... - if (platform.system() == "Darwin" or platform.system() == "Windows") and ( + # See if we need to install Docker (Windows-only) + if platform.system() == "Windows" and ( not is_docker_installed() or not is_docker_ready(global_common) ): click.echo("Docker is either not installed or not running") @@ -102,7 +102,7 @@ def gui_main(custom_container, filename): docker_installer.start() return - # The dangerzone VM, for non-Linux platforms + # The dangerzone VM (Mac-only) if platform.system() == "Darwin": vm = Vm(global_common) else: @@ -110,8 +110,10 @@ def gui_main(custom_container, filename): # Create the system tray systray = SysTray(global_common, gui_common, app, vm) - if vm: - vm.start() + + # Start the VM + # if vm: + # vm.start() closed_windows = {} windows = {} @@ -129,7 +131,7 @@ def gui_main(custom_container, filename): window = windows[list(windows.keys())[0]] else: window_id = uuid.uuid4().hex - window = MainWindow(global_common, gui_common, window_id) + window = MainWindow(global_common, gui_common, vm, window_id) window.delete_window.connect(delete_window) windows[window_id] = window diff --git a/dangerzone/gui/main_window.py b/dangerzone/gui/main_window.py index 4477f6c..c82aef2 100644 --- a/dangerzone/gui/main_window.py +++ b/dangerzone/gui/main_window.py @@ -3,6 +3,7 @@ import os import platform from PySide2 import QtCore, QtGui, QtWidgets +from .waiting_widget import WaitingWidget from .doc_selection_widget import DocSelectionWidget from .settings_widget import SettingsWidget from .tasks_widget import TasksWidget @@ -12,10 +13,11 @@ from ..common import Common class MainWindow(QtWidgets.QMainWindow): delete_window = QtCore.Signal(str) - def __init__(self, global_common, gui_common, window_id): + def __init__(self, global_common, gui_common, vm, window_id): super(MainWindow, self).__init__() self.global_common = global_common self.gui_common = gui_common + self.vm = vm self.window_id = window_id self.common = Common() @@ -42,10 +44,21 @@ class MainWindow(QtWidgets.QMainWindow): header_layout.addWidget(header_label) header_layout.addStretch() + # Waiting widget + self.waiting_widget = WaitingWidget(self.gui_common, self.vm) + self.waiting_widget.vm_started.connect(self.vm_started) + # Doc selection widget self.doc_selection_widget = DocSelectionWidget(self.common) self.doc_selection_widget.document_selected.connect(self.document_selected) - self.doc_selection_widget.show() + + # Only use the waiting widget if we have a VM + if self.vm: + self.waiting_widget.show() + self.doc_selection_widget.hide() + else: + self.waiting_widget.hide() + self.doc_selection_widget.show() # Settings self.settings_widget = SettingsWidget( @@ -75,6 +88,7 @@ class MainWindow(QtWidgets.QMainWindow): # Layout layout = QtWidgets.QVBoxLayout() layout.addLayout(header_layout) + layout.addWidget(self.waiting_widget, stretch=1) layout.addWidget(self.doc_selection_widget, stretch=1) layout.addWidget(self.settings_widget, stretch=1) layout.addWidget(self.tasks_widget, stretch=1) @@ -85,6 +99,10 @@ class MainWindow(QtWidgets.QMainWindow): self.show() + def vm_started(self): + self.waiting_widget.hide() + self.doc_selection_widget.show + def document_selected(self): self.doc_selection_widget.hide() self.settings_widget.show() diff --git a/dangerzone/gui/settings_widget.py b/dangerzone/gui/settings_widget.py index d27092f..4fca7a5 100644 --- a/dangerzone/gui/settings_widget.py +++ b/dangerzone/gui/settings_widget.py @@ -42,15 +42,14 @@ class SettingsWidget(QtWidgets.QWidget): save_layout.addWidget(self.save_browse_button) save_layout.addStretch() + # Open safe document if platform.system() == "Darwin": - # Open safe document self.open_checkbox = QtWidgets.QCheckBox( "Open safe document after converting" ) self.open_checkbox.clicked.connect(self.update_ui) elif platform.system() != "Linux": - # Open safe document self.open_checkbox = QtWidgets.QCheckBox( "Open safe document after converting, using" ) @@ -58,9 +57,12 @@ class SettingsWidget(QtWidgets.QWidget): self.open_combobox = QtWidgets.QComboBox() for k in self.gui_common.pdf_viewers: self.open_combobox.addItem(k, self.gui_common.pdf_viewers[k]) + + if platform.system() == "Darwin" or platform.system() == "Linux": open_layout = QtWidgets.QHBoxLayout() open_layout.addWidget(self.open_checkbox) - open_layout.addWidget(self.open_combobox) + if platform.system() == "Linux": + open_layout.addWidget(self.open_combobox) open_layout.addStretch() # OCR document diff --git a/dangerzone/gui/vm.py b/dangerzone/gui/vm.py index 03db391..b991ea8 100644 --- a/dangerzone/gui/vm.py +++ b/dangerzone/gui/vm.py @@ -81,7 +81,7 @@ class Vm(QtCore.QObject): self.hyperkit_p = subprocess.Popen( args, stdout=sys.stdout, - stderr=sys.stderr, + stderr=subprocess.STDOUT, ) def restart(self): diff --git a/dangerzone/gui/waiting_widget.py b/dangerzone/gui/waiting_widget.py new file mode 100644 index 0000000..10153c5 --- /dev/null +++ b/dangerzone/gui/waiting_widget.py @@ -0,0 +1,48 @@ +from PySide2 import QtCore, QtWidgets + + +class WaitingWidget(QtWidgets.QWidget): + vm_started = QtCore.Signal() + + def __init__(self, gui_common, vm): + super(WaitingWidget, self).__init__() + self.gui_common = gui_common + self.vm = vm + + self.vm.vm_state_change.connect(self.vm_state_change) + + self.label = QtWidgets.QLabel( + "Waiting for the Dangerzone virtual machine to start..." + ) + self.label.setAlignment(QtCore.Qt.AlignCenter) + self.label.setStyleSheet("QLabel { font-size: 20px; }") + + self.details = QtWidgets.QLabel() + self.details.setStyleSheet( + "QLabel { background-color: #ffffff; font-size: 12px; padding: 10px; }" + ) + self.details.setFont(self.gui_common.fixed_font) + self.details.setAlignment(QtCore.Qt.AlignTop) + + self.details_scrollarea = QtWidgets.QScrollArea() + self.details_scrollarea.setMinimumHeight(200) + self.details_scrollarea.setWidgetResizable(True) + self.details_scrollarea.setWidget(self.details) + self.details_scrollarea.verticalScrollBar().rangeChanged.connect( + self.scroll_to_bottom + ) + + # Layout + layout = QtWidgets.QVBoxLayout() + layout.addStretch() + layout.addWidget(self.label) + layout.addWidget(self.details_scrollarea) + layout.addStretch() + self.setLayout(layout) + + def vm_state_change(self, state): + if state == self.vm.STATE_ON: + self.vm_started.emit() + + def scroll_to_bottom(self, minimum, maximum): + self.scrollarea.verticalScrollBar().setValue(maximum)