Validate safe-extension (-safe.pdf) before converting

Avoid conversion issues when saving the output file when it is set
wrongly. Inform the user with a red box saying "must end in .pdf"
and prevent the user from clicking "convert" before that is fixed.

Combines the validation logic with the already-existing 'update_ui()'
This commit is contained in:
deeplow 2022-10-07 11:26:50 +01:00
parent 1790231db0
commit e64954acfa
No known key found for this signature in database
GPG key ID: 577982871529A52A
2 changed files with 47 additions and 12 deletions

View file

@ -12,7 +12,7 @@ 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 SAFE_EXTENSION, Document
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
@ -317,12 +317,21 @@ class SettingsWidget(QtWidgets.QWidget):
# Save safe as... [filename]-safe.pdf # Save safe as... [filename]-safe.pdf
self.safe_extension_label = QtWidgets.QLabel("Save as") self.safe_extension_label = QtWidgets.QLabel("Save as")
self.safe_extension_filename = QtWidgets.QLabel("document")
self.safe_extension = QtWidgets.QLineEdit() self.safe_extension = QtWidgets.QLineEdit()
self.safe_extension.textChanged.connect(self.update_ui)
self.safe_extension_invalid = QtWidgets.QLabel("(must end in .pdf)")
self.safe_extension_invalid.setStyleSheet("color: red")
self.safe_extension_invalid.hide()
dot_pdf_regex = QtCore.QRegExp(r".*\.[Pp][Dd][Ff]")
self.safe_extension.setValidator(QtGui.QRegExpValidator(dot_pdf_regex))
self.safe_extension_layout = QtWidgets.QHBoxLayout() self.safe_extension_layout = QtWidgets.QHBoxLayout()
self.safe_extension_layout.setContentsMargins(20, 0, 0, 0) self.safe_extension_layout.setContentsMargins(20, 0, 0, 0)
self.safe_extension_layout.addWidget(self.safe_extension_label) self.safe_extension_layout.addWidget(self.safe_extension_label)
self.safe_extension_layout.addWidget(self.safe_extension_filename)
self.safe_extension_layout.addWidget(self.save_label) self.safe_extension_layout.addWidget(self.save_label)
self.safe_extension_layout.addWidget(self.safe_extension) self.safe_extension_layout.addWidget(self.safe_extension)
self.safe_extension_layout.addWidget(self.safe_extension_invalid)
self.safe_extension_layout.addStretch() self.safe_extension_layout.addStretch()
# Open safe document # Open safe document
@ -388,6 +397,11 @@ class SettingsWidget(QtWidgets.QWidget):
else: else:
self.save_checkbox.setCheckState(QtCore.Qt.Unchecked) self.save_checkbox.setCheckState(QtCore.Qt.Unchecked)
if self.dangerzone.settings.get("safe_extension"):
self.safe_extension.setText(self.dangerzone.settings.get("safe_extension"))
else:
self.safe_extension.setText(SAFE_EXTENSION)
if self.dangerzone.settings.get("ocr"): if self.dangerzone.settings.get("ocr"):
self.ocr_checkbox.setCheckState(QtCore.Qt.Checked) self.ocr_checkbox.setCheckState(QtCore.Qt.Checked)
else: else:
@ -410,20 +424,35 @@ class SettingsWidget(QtWidgets.QWidget):
if index != -1: if index != -1:
self.open_combobox.setCurrentIndex(index) self.open_combobox.setCurrentIndex(index)
def check_safe_extension_is_valid(self) -> bool:
if self.save_checkbox.checkState() == QtCore.Qt.Unchecked:
# ignore validity if not saving file
self.safe_extension_invalid.hide()
return True
if self.safe_extension.hasAcceptableInput():
self.safe_extension_invalid.hide()
return True
else:
# prevent starting conversion until correct
self.safe_extension_invalid.show()
return False
def check_either_save_or_open(self) -> bool:
return (
self.save_checkbox.checkState() == QtCore.Qt.Checked
or self.open_checkbox.checkState() == QtCore.Qt.Checked
)
def update_ui(self) -> None: def update_ui(self) -> None:
if platform.system() == "Windows": conversion_readiness_conditions = [
# Because the save checkbox is always checked in Windows, the self.check_safe_extension_is_valid(),
# start button can be enabled self.check_either_save_or_open(),
]
if all(conversion_readiness_conditions):
self.start_button.setEnabled(True) self.start_button.setEnabled(True)
else: else:
# Either save or open must be checked self.start_button.setDisabled(True)
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, filenames: List[str]) -> None: def document_selected(self, filenames: List[str]) -> None:
# set the default save location as the directory for the first document # set the default save location as the directory for the first document
@ -431,6 +460,8 @@ class SettingsWidget(QtWidgets.QWidget):
save_dir = os.path.basename(save_path) save_dir = os.path.basename(save_path)
self.save_location.setText(save_dir) self.save_location.setText(save_dir)
self.update_ui()
def select_output_directory(self) -> None: def select_output_directory(self) -> None:
dialog = QtWidgets.QFileDialog() dialog = QtWidgets.QFileDialog()
dialog.setLabelText(QtWidgets.QFileDialog.Accept, "Select output directory") dialog.setLabelText(QtWidgets.QFileDialog.Accept, "Select output directory")
@ -471,6 +502,7 @@ class SettingsWidget(QtWidgets.QWidget):
self.dangerzone.settings.set( self.dangerzone.settings.set(
"save", self.save_checkbox.checkState() == QtCore.Qt.Checked "save", self.save_checkbox.checkState() == QtCore.Qt.Checked
) )
self.dangerzone.settings.set("safe_extension", self.safe_extension.text())
self.dangerzone.settings.set( self.dangerzone.settings.set(
"ocr", self.ocr_checkbox.checkState() == QtCore.Qt.Checked "ocr", self.ocr_checkbox.checkState() == QtCore.Qt.Checked
) )

View file

@ -3,6 +3,8 @@ import logging
import os import os
from typing import TYPE_CHECKING, Any, Dict, Optional from typing import TYPE_CHECKING, Any, Dict, Optional
from .document import SAFE_EXTENSION
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
if TYPE_CHECKING: if TYPE_CHECKING:
@ -23,6 +25,7 @@ class Settings:
"ocr_language": "English", "ocr_language": "English",
"open": True, "open": True,
"open_app": None, "open_app": None,
"safe_extension": SAFE_EXTENSION,
} }
self.load() self.load()