mirror of
https://github.com/freedomofpress/dangerzone.git
synced 2025-04-28 18:02:38 +02:00
Merge pull request #22 from firstlookmedia/17_windows_pdf_reader
Good UX in Windows for opening safe PDFs
This commit is contained in:
commit
37366d7bda
6 changed files with 69 additions and 36 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
)
|
)
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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
4
poetry.lock
generated
|
@ -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]
|
||||||
|
|
|
@ -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"]
|
||||||
|
|
Loading…
Reference in a new issue