From 931effc7ce0ec07fbc91e1885dfdf521ed6f6cc4 Mon Sep 17 00:00:00 2001 From: Micah Lee Date: Thu, 20 Feb 2020 16:53:25 -0800 Subject: [PATCH] In Windows, disable opening of safe PDF, make saving PDF required, and after safe PDF has been created, open Windows explorer with the safe PDF selected --- dangerzone/settings_widget.py | 81 ++++++++++++++++++++++------------- dangerzone/tasks_widget.py | 9 ++++ poetry.lock | 4 +- pyproject.toml | 4 +- 4 files changed, 64 insertions(+), 34 deletions(-) diff --git a/dangerzone/settings_widget.py b/dangerzone/settings_widget.py index c44c7b9..18f5c00 100644 --- a/dangerzone/settings_widget.py +++ b/dangerzone/settings_widget.py @@ -1,5 +1,6 @@ import os import subprocess +import platform from PyQt5 import QtCore, QtGui, QtWidgets @@ -20,28 +21,40 @@ class SettingsWidget(QtWidgets.QWidget): # Save safe version self.save_checkbox = QtWidgets.QCheckBox("Save safe PDF") self.save_checkbox.clicked.connect(self.update_ui) + self.save_label = QtWidgets.QLabel("Save safe PDF") # For Windows + self.save_label.hide() + if platform.system() == "Windows": + # In Windows, users must save the PDF, since they can't open it + self.save_checkbox.setCheckState(QtCore.Qt.Checked) + self.save_checkbox.setEnabled(False) + self.save_checkbox.hide() + self.save_label.show() self.save_lineedit = QtWidgets.QLineEdit() self.save_lineedit.setReadOnly(True) self.save_browse_button = QtWidgets.QPushButton("Save as...") self.save_browse_button.clicked.connect(self.save_browse_button_clicked) save_layout = QtWidgets.QHBoxLayout() save_layout.addWidget(self.save_checkbox) + save_layout.addWidget(self.save_label) save_layout.addWidget(self.save_lineedit) save_layout.addWidget(self.save_browse_button) save_layout.addStretch() - # Open safe document - self.open_checkbox = QtWidgets.QCheckBox( - "Open safe document after converting, using" - ) - self.open_checkbox.clicked.connect(self.update_ui) - self.open_combobox = QtWidgets.QComboBox() - for k in self.common.pdf_viewers: - self.open_combobox.addItem(k, QtCore.QVariant(self.common.pdf_viewers[k])) - open_layout = QtWidgets.QHBoxLayout() - open_layout.addWidget(self.open_checkbox) - open_layout.addWidget(self.open_combobox) - open_layout.addStretch() + if platform.system() != "Windows": + # Open safe document + self.open_checkbox = QtWidgets.QCheckBox( + "Open safe document after converting, using" + ) + self.open_checkbox.clicked.connect(self.update_ui) + self.open_combobox = QtWidgets.QComboBox() + for k in self.common.pdf_viewers: + self.open_combobox.addItem( + k, QtCore.QVariant(self.common.pdf_viewers[k]) + ) + open_layout = QtWidgets.QHBoxLayout() + open_layout.addWidget(self.open_checkbox) + open_layout.addWidget(self.open_combobox) + open_layout.addStretch() # OCR document self.ocr_checkbox = QtWidgets.QCheckBox("OCR document, language") @@ -75,7 +88,8 @@ class SettingsWidget(QtWidgets.QWidget): layout.addWidget(self.dangerous_doc_label) layout.addSpacing(20) layout.addLayout(save_layout) - layout.addLayout(open_layout) + if platform.system() != "Windows": + layout.addLayout(open_layout) layout.addLayout(ocr_layout) layout.addLayout(update_layout) layout.addSpacing(20) @@ -98,14 +112,15 @@ class SettingsWidget(QtWidgets.QWidget): if index != -1: self.ocr_combobox.setCurrentIndex(index) - if self.common.settings.get("open"): - self.open_checkbox.setCheckState(QtCore.Qt.Checked) - else: - self.open_checkbox.setCheckState(QtCore.Qt.Unchecked) + if platform.system() != "Windows": + if self.common.settings.get("open"): + self.open_checkbox.setCheckState(QtCore.Qt.Checked) + else: + self.open_checkbox.setCheckState(QtCore.Qt.Unchecked) - index = self.open_combobox.findText(self.common.settings.get("open_app")) - if index != -1: - self.open_combobox.setCurrentIndex(index) + index = self.open_combobox.findText(self.common.settings.get("open_app")) + if index != -1: + self.open_combobox.setCurrentIndex(index) if self.common.settings.get("update_container"): self.update_checkbox.setCheckState(QtCore.Qt.Checked) @@ -122,14 +137,19 @@ class SettingsWidget(QtWidgets.QWidget): self.update_checkbox.setEnabled(False) def update_ui(self): - # Either save or open must be checked - if ( - self.save_checkbox.checkState() == QtCore.Qt.Checked - or self.open_checkbox.checkState() == QtCore.Qt.Checked - ): + if platform.system() == "Windows": + # Because the save checkbox is always checked in Windows, the + # start button can be enabled self.start_button.setEnabled(True) else: - self.start_button.setEnabled(False) + # Either save or open must be checked + if ( + self.save_checkbox.checkState() == QtCore.Qt.Checked + or self.open_checkbox.checkState() == QtCore.Qt.Checked + ): + self.start_button.setEnabled(True) + else: + self.start_button.setEnabled(False) def document_selected(self): # Update the danger doc label @@ -163,10 +183,11 @@ class SettingsWidget(QtWidgets.QWidget): "ocr", self.ocr_checkbox.checkState() == QtCore.Qt.Checked ) self.common.settings.set("ocr_language", self.ocr_combobox.currentText()) - self.common.settings.set( - "open", self.open_checkbox.checkState() == QtCore.Qt.Checked - ) - self.common.settings.set("open_app", self.open_combobox.currentText()) + if platform.system() != "Windows": + self.common.settings.set( + "open", self.open_checkbox.checkState() == QtCore.Qt.Checked + ) + self.common.settings.set("open_app", self.open_combobox.currentText()) self.common.settings.set( "update_container", self.update_checkbox.checkState() == QtCore.Qt.Checked ) diff --git a/dangerzone/tasks_widget.py b/dangerzone/tasks_widget.py index 9193baa..92ce455 100644 --- a/dangerzone/tasks_widget.py +++ b/dangerzone/tasks_widget.py @@ -1,6 +1,8 @@ import shutil import tempfile import os +import platform +import subprocess from PyQt5 import QtCore, QtGui, QtWidgets from .tasks import PullImageTask, BuildContainerTask, ConvertToPixels, ConvertToPDF @@ -97,6 +99,13 @@ class TasksWidget(QtWidgets.QWidget): dest_filename = tmp[1] shutil.move(source_filename, dest_filename) + # In Windows, open Explorer with the safe PDF in focus + if platform.system() == "Windows": + dest_filename_windows = dest_filename.replace("/", "\\") + subprocess.Popen( + f'explorer.exe /select,"{dest_filename_windows}"', shell=True + ) + # Open if self.common.settings.get("open"): self.common.open_pdf_viewer(dest_filename) diff --git a/poetry.lock b/poetry.lock index cc66fb1..dc53a3d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -204,7 +204,7 @@ version = "12.7.1" [[package]] category = "main" description = "Python for Window Extensions" -marker = "sys_platform == \"win32\"" +marker = "sys_platform == \"windows\"" name = "pywin32" optional = false python-versions = "*" @@ -284,7 +284,7 @@ python-versions = "*" version = "1.4.9" [metadata] -content-hash = "28c51f60ace8c8578c21279f8c46ba095d0ec1f1f86bb155c24cba67ac3291ee" +content-hash = "8a375835b3ed53e46bb4aaf31cb5cca43d33ed03ac217cf247ed65724d3ee3a8" python-versions = "^3.7" [metadata.files] diff --git a/pyproject.toml b/pyproject.toml index 90b91e2..732798b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,13 +15,13 @@ pyxdg = {version = "^0.26", platform = "linux"} pyobjc-core = {version = "^6.1", platform = "darwin"} pyobjc-framework-launchservices = {version = "^6.1", platform = "darwin"} macholib = "^1.14" -pywin32 = {version = "^227", platform = "win32"} +pywin32 = {version = "^227", platform = "windows"} wmi = {version = "^1.4.9", platform = "windows"} [tool.poetry.dev-dependencies] black = "^19.10b0" pyinstaller = {version = "^3.6", platform = "darwin"} -setuptools = {version = "^45.2.0", platform = "win32"} +setuptools = {version = "^45.2.0", platform = "windows"} [build-system] requires = ["poetry>=0.12"]