Merge pull request #22 from firstlookmedia/17_windows_pdf_reader

Good UX in Windows for opening safe PDFs
This commit is contained in:
Micah Lee 2020-02-20 17:01:23 -08:00 committed by GitHub
commit 37366d7bda
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 69 additions and 36 deletions

View file

@ -269,7 +269,7 @@ class Common(object):
path = self.get_resource_path("logo.png") path = self.get_resource_path("logo.png")
return QtGui.QIcon(path) return QtGui.QIcon(path)
def open_find_viewer(self, filename): def open_pdf_viewer(self, filename):
if self.settings.get("open_app") in self.pdf_viewers: if self.settings.get("open_app") in self.pdf_viewers:
if platform.system() == "Darwin": if platform.system() == "Darwin":
# Get the PDF reader bundle command # Get the PDF reader bundle command

View file

@ -1,5 +1,6 @@
import os import os
import subprocess import subprocess
import platform
from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5 import QtCore, QtGui, QtWidgets
@ -20,28 +21,40 @@ class SettingsWidget(QtWidgets.QWidget):
# Save safe version # Save safe version
self.save_checkbox = QtWidgets.QCheckBox("Save safe PDF") self.save_checkbox = QtWidgets.QCheckBox("Save safe PDF")
self.save_checkbox.clicked.connect(self.update_ui) 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 = QtWidgets.QLineEdit()
self.save_lineedit.setReadOnly(True) self.save_lineedit.setReadOnly(True)
self.save_browse_button = QtWidgets.QPushButton("Save as...") self.save_browse_button = QtWidgets.QPushButton("Save as...")
self.save_browse_button.clicked.connect(self.save_browse_button_clicked) self.save_browse_button.clicked.connect(self.save_browse_button_clicked)
save_layout = QtWidgets.QHBoxLayout() save_layout = QtWidgets.QHBoxLayout()
save_layout.addWidget(self.save_checkbox) save_layout.addWidget(self.save_checkbox)
save_layout.addWidget(self.save_label)
save_layout.addWidget(self.save_lineedit) save_layout.addWidget(self.save_lineedit)
save_layout.addWidget(self.save_browse_button) save_layout.addWidget(self.save_browse_button)
save_layout.addStretch() save_layout.addStretch()
# Open safe document if platform.system() != "Windows":
self.open_checkbox = QtWidgets.QCheckBox( # Open safe document
"Open safe document after converting, using" self.open_checkbox = QtWidgets.QCheckBox(
) "Open safe document after converting, using"
self.open_checkbox.clicked.connect(self.update_ui) )
self.open_combobox = QtWidgets.QComboBox() self.open_checkbox.clicked.connect(self.update_ui)
for k in self.common.pdf_viewers: self.open_combobox = QtWidgets.QComboBox()
self.open_combobox.addItem(k, QtCore.QVariant(self.common.pdf_viewers[k])) for k in self.common.pdf_viewers:
open_layout = QtWidgets.QHBoxLayout() self.open_combobox.addItem(
open_layout.addWidget(self.open_checkbox) k, QtCore.QVariant(self.common.pdf_viewers[k])
open_layout.addWidget(self.open_combobox) )
open_layout.addStretch() open_layout = QtWidgets.QHBoxLayout()
open_layout.addWidget(self.open_checkbox)
open_layout.addWidget(self.open_combobox)
open_layout.addStretch()
# OCR document # OCR document
self.ocr_checkbox = QtWidgets.QCheckBox("OCR document, language") self.ocr_checkbox = QtWidgets.QCheckBox("OCR document, language")
@ -75,7 +88,8 @@ class SettingsWidget(QtWidgets.QWidget):
layout.addWidget(self.dangerous_doc_label) layout.addWidget(self.dangerous_doc_label)
layout.addSpacing(20) layout.addSpacing(20)
layout.addLayout(save_layout) layout.addLayout(save_layout)
layout.addLayout(open_layout) if platform.system() != "Windows":
layout.addLayout(open_layout)
layout.addLayout(ocr_layout) layout.addLayout(ocr_layout)
layout.addLayout(update_layout) layout.addLayout(update_layout)
layout.addSpacing(20) layout.addSpacing(20)
@ -98,14 +112,15 @@ class SettingsWidget(QtWidgets.QWidget):
if index != -1: if index != -1:
self.ocr_combobox.setCurrentIndex(index) self.ocr_combobox.setCurrentIndex(index)
if self.common.settings.get("open"): if platform.system() != "Windows":
self.open_checkbox.setCheckState(QtCore.Qt.Checked) if self.common.settings.get("open"):
else: self.open_checkbox.setCheckState(QtCore.Qt.Checked)
self.open_checkbox.setCheckState(QtCore.Qt.Unchecked) else:
self.open_checkbox.setCheckState(QtCore.Qt.Unchecked)
index = self.open_combobox.findText(self.common.settings.get("open_app")) index = self.open_combobox.findText(self.common.settings.get("open_app"))
if index != -1: if index != -1:
self.open_combobox.setCurrentIndex(index) self.open_combobox.setCurrentIndex(index)
if self.common.settings.get("update_container"): if self.common.settings.get("update_container"):
self.update_checkbox.setCheckState(QtCore.Qt.Checked) self.update_checkbox.setCheckState(QtCore.Qt.Checked)
@ -122,14 +137,19 @@ class SettingsWidget(QtWidgets.QWidget):
self.update_checkbox.setEnabled(False) self.update_checkbox.setEnabled(False)
def update_ui(self): def update_ui(self):
# Either save or open must be checked if platform.system() == "Windows":
if ( # Because the save checkbox is always checked in Windows, the
self.save_checkbox.checkState() == QtCore.Qt.Checked # start button can be enabled
or self.open_checkbox.checkState() == QtCore.Qt.Checked
):
self.start_button.setEnabled(True) self.start_button.setEnabled(True)
else: 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): def document_selected(self):
# Update the danger doc label # Update the danger doc label
@ -163,10 +183,11 @@ class SettingsWidget(QtWidgets.QWidget):
"ocr", self.ocr_checkbox.checkState() == QtCore.Qt.Checked "ocr", self.ocr_checkbox.checkState() == QtCore.Qt.Checked
) )
self.common.settings.set("ocr_language", self.ocr_combobox.currentText()) self.common.settings.set("ocr_language", self.ocr_combobox.currentText())
self.common.settings.set( if platform.system() != "Windows":
"open", self.open_checkbox.checkState() == QtCore.Qt.Checked 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("open_app", self.open_combobox.currentText())
self.common.settings.set( self.common.settings.set(
"update_container", self.update_checkbox.checkState() == QtCore.Qt.Checked "update_container", self.update_checkbox.checkState() == QtCore.Qt.Checked
) )

View file

@ -1,6 +1,8 @@
import shutil import shutil
import tempfile import tempfile
import os import os
import platform
import subprocess
from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5 import QtCore, QtGui, QtWidgets
from .tasks import PullImageTask, BuildContainerTask, ConvertToPixels, ConvertToPDF from .tasks import PullImageTask, BuildContainerTask, ConvertToPixels, ConvertToPDF
@ -97,9 +99,16 @@ class TasksWidget(QtWidgets.QWidget):
dest_filename = tmp[1] dest_filename = tmp[1]
shutil.move(source_filename, dest_filename) 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 # Open
if self.common.settings.get("open"): if self.common.settings.get("open"):
self.common.open_find_viewer(dest_filename) self.common.open_pdf_viewer(dest_filename)
# Clean up # Clean up
self.common.pixel_dir.cleanup() self.common.pixel_dir.cleanup()

View file

@ -14,6 +14,9 @@
<UIRef Id="WixUI_Minimal" /> <UIRef Id="WixUI_Minimal" />
<UIRef Id="WixUI_ErrorProgressText" /> <UIRef Id="WixUI_ErrorProgressText" />
<WixVariable Id="WixUILicenseRtf" Value="..\..\install\windows\license.rtf" />
<WixVariable Id="WixUIDialogBmp" Value="..\..\install\windows\dialog.bmp" />
<Upgrade Id="$(var.ProductUpgradeCode)"> <Upgrade Id="$(var.ProductUpgradeCode)">
<UpgradeVersion Minimum="$(var.ProductVersion)" OnlyDetect="yes" Property="NEWERVERSIONDETECTED"/> <UpgradeVersion Minimum="$(var.ProductVersion)" OnlyDetect="yes" Property="NEWERVERSIONDETECTED"/>
<UpgradeVersion Minimum="0.0.0" Maximum="$(var.ProductVersion)" IncludeMinimum="yes" IncludeMaximum="no" Property="OLDERVERSIONBEINGUPGRADED"/> <UpgradeVersion Minimum="0.0.0" Maximum="$(var.ProductVersion)" IncludeMinimum="yes" IncludeMaximum="no" Property="OLDERVERSIONBEINGUPGRADED"/>

4
poetry.lock generated
View file

@ -204,7 +204,7 @@ version = "12.7.1"
[[package]] [[package]]
category = "main" category = "main"
description = "Python for Window Extensions" description = "Python for Window Extensions"
marker = "sys_platform == \"win32\"" marker = "sys_platform == \"windows\""
name = "pywin32" name = "pywin32"
optional = false optional = false
python-versions = "*" python-versions = "*"
@ -284,7 +284,7 @@ python-versions = "*"
version = "1.4.9" version = "1.4.9"
[metadata] [metadata]
content-hash = "28c51f60ace8c8578c21279f8c46ba095d0ec1f1f86bb155c24cba67ac3291ee" content-hash = "8a375835b3ed53e46bb4aaf31cb5cca43d33ed03ac217cf247ed65724d3ee3a8"
python-versions = "^3.7" python-versions = "^3.7"
[metadata.files] [metadata.files]

View file

@ -15,13 +15,13 @@ pyxdg = {version = "^0.26", platform = "linux"}
pyobjc-core = {version = "^6.1", platform = "darwin"} pyobjc-core = {version = "^6.1", platform = "darwin"}
pyobjc-framework-launchservices = {version = "^6.1", platform = "darwin"} pyobjc-framework-launchservices = {version = "^6.1", platform = "darwin"}
macholib = "^1.14" macholib = "^1.14"
pywin32 = {version = "^227", platform = "win32"} pywin32 = {version = "^227", platform = "windows"}
wmi = {version = "^1.4.9", platform = "windows"} wmi = {version = "^1.4.9", platform = "windows"}
[tool.poetry.dev-dependencies] [tool.poetry.dev-dependencies]
black = "^19.10b0" black = "^19.10b0"
pyinstaller = {version = "^3.6", platform = "darwin"} pyinstaller = {version = "^3.6", platform = "darwin"}
setuptools = {version = "^45.2.0", platform = "win32"} setuptools = {version = "^45.2.0", platform = "windows"}
[build-system] [build-system]
requires = ["poetry>=0.12"] requires = ["poetry>=0.12"]