diff --git a/app_gui.py b/app_gui.py index 9377e5c..49d34f1 100644 --- a/app_gui.py +++ b/app_gui.py @@ -1,9 +1,19 @@ from functools import partial from PySide6.QtCore import Qt -from PySide6.QtWidgets import QVBoxLayout, QHBoxLayout, QComboBox, QLabel, QPushButton, \ - QWidget, QFileDialog, QStatusBar, QMessageBox - +from PySide6.QtWidgets import ( + QVBoxLayout, + QHBoxLayout, + QComboBox, + QLabel, + QPushButton, + QWidget, + QFileDialog, + QStatusBar, + QMessageBox, +) + +from graphics_view import GraphicsView from image_view import ImageView @@ -82,57 +92,53 @@ def __init__(self, parent=None): self.addLayout(self.bottom_settings_layout) def add_image_view(self): - image_view = ImageView() - image_view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) - image_view.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) - image_view.horizontalScrollBar().valueChanged.connect( + graphics_view = GraphicsView() + graphics_view.image_view.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) + graphics_view.image_view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) + graphics_view.image_view.horizontalScrollBar().valueChanged.connect( partial(self.slider_sync, "horizontal") ) - image_view.verticalScrollBar().valueChanged.connect( + graphics_view.image_view.verticalScrollBar().valueChanged.connect( partial(self.slider_sync, "vertical") ) - image_view.photoAdded.connect(self.add_resolution) - image_view.tranformChanged.connect(self.set_transform) - image_view.multipleUrls.connect(self.load_multiple_images) + graphics_view.image_view.photoAdded.connect(self.add_resolution) + graphics_view.image_view.tranformChanged.connect(self.set_transform) + graphics_view.image_view.multipleUrls.connect(self.load_multiple_images) - self.image_views_layout.addWidget(image_view) - self.image_views.append(image_view) + self.image_views_layout.addLayout(graphics_view) + self.image_views.append(graphics_view) def load_multiple_images(self, urls): dialog = QMessageBox() - dialog.setWindowTitle('Multiple files') + dialog.setWindowTitle("Multiple files") dialog.setText("Do you want to load multiple files?") dialog.setStandardButtons(QMessageBox.Yes | QMessageBox.No) result = dialog.exec_() urls = urls if result == QMessageBox.Yes: - missing_count = (len(urls) - len(self.image_views)) + len([item for item in self.image_views if item.original_image]) - for i in range(missing_count): - self.add_image_view() - for item in self.image_views: - if not item.original_image: - item.loadImage(urls[0].toLocalFile()) + if not item.image_view.url: + item.image_view.url = urls[0] urls.remove(urls[0]) - self.image_views_layout.removeWidget(item) - for item in self.image_views: - self.image_views_layout.addWidget(item) + item.image_view.loadImage(item.image_view.url.toLocalFile()) elif result == QMessageBox.No: return def remove_image_view(self): if len(self.image_views) > 2: - self.image_views_layout.removeWidget(self.image_views[-1]) + self.image_views_layout.removeItem(self.image_views[-1]) self.image_views[-1].deleteLater() + self.image_views[-1].image_view.deleteLater() + self.image_views[-1].text_view.deleteLater() self.image_views.remove(self.image_views[-1]) def set_transform(self, *args): for item in self.image_views: - item.set_transform(*args) + item.image_view.set_transform(*args) def slider_sync( self, @@ -141,20 +147,21 @@ def slider_sync( ): for item in self.image_views: if orientation == "horizontal": - item.horizontalScrollBar().setValue(value) + item.image_view.horizontalScrollBar().setValue(value) else: - item.verticalScrollBar().setValue(value) + item.image_view.verticalScrollBar().setValue(value) def set_resolution(self, resolution): resolution = resolution.split("x") for item in self.image_views: - if item.scene().items(): - item.scene().items()[0].setPixmap( - item.original_image - .scaled(int(resolution[0]), int(resolution[1])) + if item.image_view.scene().items(): + item.image_view.scene().items()[0].setPixmap( + item.image_view.original_image.scaled( + int(resolution[0]), int(resolution[1]) + ) ) - item.setSceneRect(0, 0, int(resolution[0]), int(resolution[1])) - item.setSceneRect(0, 0, int(resolution[0]), int(resolution[1])) + item.image_view.setSceneRect(0, 0, int(resolution[0]), int(resolution[1])) + item.image_view.setSceneRect(0, 0, int(resolution[0]), int(resolution[1])) self.resolution_status.setText("x".join(resolution)) self.resolution_status.setStyleSheet("color: lime") @@ -173,9 +180,11 @@ def save_comparison(self): file_dialog = QFileDialog() file_dialog.setNameFilter("JPEG Image Files (*.jpg)") - file_path, _ = file_dialog.getSaveFileName(None, "Save Comparison Screenshot", "", "JPEG Image Files (*.jpg)") + file_path, _ = file_dialog.getSaveFileName( + None, "Save Comparison Screenshot", "", "JPEG Image Files (*.jpg)" + ) if file_path: screenshot = self.images_widget.grab() - screenshot.save(file_path, 'jpg') - print(f'Saved screenshot as {file_path}') + screenshot.save(file_path, "jpg") + print(f"Saved screenshot as {file_path}") diff --git a/graphics_view.py b/graphics_view.py new file mode 100644 index 0000000..0babbe5 --- /dev/null +++ b/graphics_view.py @@ -0,0 +1,38 @@ +import random + +from PySide6.QtGui import QFont, Qt +from PySide6.QtWidgets import QVBoxLayout, QLineEdit + +from image_view import ImageView + + +class GraphicsView(QVBoxLayout): + def __init__(self): + super().__init__() + self.text_view = QLineEdit() + color = random.choice( + [ + "#37874c", + "#374687", + "#873783", + "#873746", + "#909639", + "#966939", + "#399681", + "#399658", + "#07677a", + "#650a8c", + "#802d06", + ] + ) + font = QFont() + font.setBold(True) + font.setPointSize(14) + self.text_view.setFont(font) + self.text_view.setStyleSheet(f"background-color: {color}") + self.text_view.setAlignment(Qt.AlignCenter) + + self.image_view = ImageView() + + self.addWidget(self.image_view) + self.addWidget(self.text_view) diff --git a/image_view.py b/image_view.py index 8b3cd1d..a347877 100644 --- a/image_view.py +++ b/image_view.py @@ -26,6 +26,7 @@ def __init__(self): self.setDragMode(QGraphicsView.ScrollHandDrag) self.zoom_factor = 0 self.original_image = None + self.url = None def dragEnterEvent(self, event: QDragEnterEvent): mime_data = event.mimeData() @@ -37,9 +38,7 @@ def dropEvent(self, event: QDropEvent): if mime_data.hasUrls(): file_path = mime_data.urls()[0].toLocalFile() if len(mime_data.urls()) > 1: - self.multipleUrls.emit( - mime_data.urls() - ) + self.multipleUrls.emit(mime_data.urls()) else: self.loadImage(file_path) @@ -63,7 +62,9 @@ def loadImage(self, file_path): image_reader = QImageReader(file_path) pixmap = QPixmap.fromImageReader(image_reader) if pixmap.width() == 0: - QMessageBox.critical(self, 'Error', 'Unable to load the image.', QMessageBox.Ok) + QMessageBox.critical( + self, "Error", "Unable to load the image.", QMessageBox.Ok + ) return if self.scene().items(): @@ -72,6 +73,7 @@ def loadImage(self, file_path): self.original_image = pixmap self.scene().addPixmap(pixmap) self.photoAdded.emit(pixmap.width(), pixmap.height()) + self.url = file_path def set_transform(self, transform): horz_blocked = self.horizontalScrollBar().blockSignals(True)