diff --git a/dangerzone/gui/main_window.py b/dangerzone/gui/main_window.py index 6b23f6a..a3fc781 100644 --- a/dangerzone/gui/main_window.py +++ b/dangerzone/gui/main_window.py @@ -885,7 +885,8 @@ class SettingsWidget(QtWidgets.QWidget): class ConvertTask(QtCore.QObject): finished = QtCore.Signal(bool) - update = QtCore.Signal(bool, str, int) + update_progress = QtCore.Signal(bool, str, int) + update_preview = QtCore.Signal(int, int, bytes) def __init__( self, @@ -904,6 +905,7 @@ class ConvertTask(QtCore.QObject): self.document, self.ocr_lang, self.progress_callback, + self.preview_callback, ) self.finished.emit(self.error) @@ -911,7 +913,10 @@ class ConvertTask(QtCore.QObject): if error: self.error = True - self.update.emit(error, text, percentage) + self.update_progress.emit(error, text, percentage) + + def preview_callback(self, width: int, height: int, data: bytes) -> None: + self.update_preview.emit(width, height, data) class DocumentsListWidget(QtWidgets.QListWidget): @@ -933,7 +938,7 @@ class DocumentsListWidget(QtWidgets.QListWidget): def documents_added(self, docs: List[Document]) -> None: for document in docs: item = QtWidgets.QListWidgetItem() - item.setSizeHint(QtCore.QSize(500, 50)) + item.setSizeHint(QtCore.QSize(500, 800)) widget = DocumentWidget(self.dangerzone, document) self.addItem(item) self.setItemWidget(item, widget) @@ -950,7 +955,8 @@ class DocumentsListWidget(QtWidgets.QListWidget): for doc in self.docs_list: task = ConvertTask(self.dangerzone, doc, self.get_ocr_lang()) doc_widget = self.docs_list_widget_map[doc] - task.update.connect(doc_widget.update_progress) + task.update_progress.connect(doc_widget.update_progress) + task.update_preview.connect(doc_widget.update_preview) task.finished.connect(doc_widget.all_done) self.thread_pool.apply_async(task.convert_document) @@ -1005,13 +1011,22 @@ class DocumentWidget(QtWidgets.QWidget): self.progress.setRange(0, 100) self.progress.setValue(0) + # Preview + self.doc_preview = QtWidgets.QLabel() + self.doc_preview.setAlignment( + QtCore.Qt.AlignVCenter | QtCore.Qt.AlignLeft + ) + # Layout layout = QtWidgets.QHBoxLayout() layout.addWidget(self.status_image) layout.addWidget(self.dangerous_doc_label) layout.addWidget(self.progress) layout.addWidget(self.error_label) - self.setLayout(layout) + layout2 = QtWidgets.QVBoxLayout() + layout2.addLayout(layout) + layout2.addWidget(self.doc_preview) + self.setLayout(layout2) def update_progress(self, error: bool, text: str, percentage: int) -> None: self.update_status_image() @@ -1025,6 +1040,16 @@ class DocumentWidget(QtWidgets.QWidget): self.progress.setToolTip(text) self.progress.setValue(percentage) + def update_preview(self, width: int, height: int, data: bytes) -> None: + log.debug(f"UPDATTING PREVIEW {width}, {height}") + # with open("tests/test_docs/sample-ppm.ppm", 'rb') as ppm_file: + ppm_header = f"P6\n{width} {height}\n255\n".encode('ascii') + ppm_data = ppm_header + data + log.info(ppm_data[:20]) + pix = QtGui.QPixmap() + pix.loadFromData(ppm_data) + self.doc_preview.setPixmap(pix) + def load_status_image(self, filename: str) -> QtGui.QPixmap: path = get_resource_path(filename) img = QtGui.QImage(path) diff --git a/dangerzone/isolation_provider/base.py b/dangerzone/isolation_provider/base.py index 24249ca..42e40f5 100644 --- a/dangerzone/isolation_provider/base.py +++ b/dangerzone/isolation_provider/base.py @@ -65,8 +65,10 @@ class IsolationProvider(ABC): document: Document, ocr_lang: Optional[str], progress_callback: Optional[Callable] = None, + preview_callback: Optional[Callable] = None, ) -> None: self.progress_callback = progress_callback + self.preview_callback = preview_callback document.mark_as_converting() try: with tempfile.TemporaryDirectory() as t: @@ -125,6 +127,10 @@ class IsolationProvider(ABC): num_pixels, ) + # Preview + if self.preview_callback: + self.preview_callback(width, height, untrusted_pixels) + # Wrapper code with open(f"{tempdir}/pixels/page-{page}.width", "w") as f_width: f_width.write(str(width))