1
0
mirror of https://github.com/arsenetar/dupeguru.git synced 2025-03-10 05:34:36 +00:00

Implement mostly working ScrollArea viewer

Using a QWidget inside the QScrollArea mostly works
but we only move around the pixmap inside the QWidget,
not the QWidget itself, which doesn't update scrollbars.
Need a better implementation.
This commit is contained in:
glubsy 2020-06-16 21:14:28 +02:00
parent b7abcf2989
commit a706d0ebe5
2 changed files with 598 additions and 273 deletions

View File

@ -15,8 +15,9 @@ from hscommon import desktop
from ..details_dialog import DetailsDialog as DetailsDialogBase from ..details_dialog import DetailsDialog as DetailsDialogBase
from ..details_table import DetailsTable from ..details_table import DetailsTable
from qtlib.util import createActions from qtlib.util import createActions
from qt.pe.image_viewer import (QWidgetImageViewer, ScrollAreaImageViewer, from qt.pe.image_viewer import (
QWidgetImageViewerController, QLabelImageViewerController) QWidgetImageViewer, ScrollAreaImageViewer, GraphicsViewViewer,
QWidgetController, ScrollAreaController, GraphicsViewController)
tr = trget("ui") tr = trget("ui")
class DetailsDialog(DetailsDialogBase): class DetailsDialog(DetailsDialogBase):
@ -83,7 +84,7 @@ class DetailsDialog(DetailsDialogBase):
self.horizontalLayout.setColumnStretch(2,1) self.horizontalLayout.setColumnStretch(2,1)
self.horizontalLayout.setSpacing(4) self.horizontalLayout.setSpacing(4)
self.selectedImageViewer = QWidgetImageViewer( self.selectedImageViewer = ScrollAreaImageViewer(
self, "selectedImage") self, "selectedImage")
# self.selectedImage = QLabel(self) # self.selectedImage = QLabel(self)
# sizePolicy = QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) # sizePolicy = QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
@ -111,7 +112,7 @@ class DetailsDialog(DetailsDialogBase):
self.buttonImgSwap.setText('Swap images') self.buttonImgSwap.setText('Swap images')
self.buttonImgSwap.setToolTip('Swap images') self.buttonImgSwap.setToolTip('Swap images')
self.buttonImgSwap.pressed.connect(self.swapImages) self.buttonImgSwap.pressed.connect(self.swapImages)
self.buttonImgSwap.released.connect(self.deswapImages) self.buttonImgSwap.released.connect(self.swapImages)
self.buttonZoomIn = QToolButton(self.verticalToolBar) self.buttonZoomIn = QToolButton(self.verticalToolBar)
self.buttonZoomIn.setToolButtonStyle(Qt.ToolButtonIconOnly) self.buttonZoomIn.setToolButtonStyle(Qt.ToolButtonIconOnly)
@ -149,7 +150,7 @@ class DetailsDialog(DetailsDialogBase):
self.horizontalLayout.addWidget(self.verticalToolBar, 1, 1, 1, 1, Qt.AlignCenter) self.horizontalLayout.addWidget(self.verticalToolBar, 1, 1, 1, 1, Qt.AlignCenter)
# self.horizontalLayout.addWidget(self.verticalToolBar, Qt.AlignVCenter) # self.horizontalLayout.addWidget(self.verticalToolBar, Qt.AlignVCenter)
self.referenceImageViewer = QWidgetImageViewer( self.referenceImageViewer = ScrollAreaImageViewer(
self, "referenceImage") self, "referenceImage")
# self.referenceImage = QLabel(self) # self.referenceImage = QLabel(self)
# sizePolicy = QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) # sizePolicy = QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
@ -186,20 +187,25 @@ class DetailsDialog(DetailsDialogBase):
# underlying widgets we use to display images # underlying widgets we use to display images
# because their interface methods might differ # because their interface methods might differ
if isinstance(self.selectedImageViewer, QWidgetImageViewer): if isinstance(self.selectedImageViewer, QWidgetImageViewer):
self.vController = QWidgetImageViewerController( self.vController = QWidgetController(
self.selectedImageViewer, self.selectedImageViewer,
self.referenceImageViewer, self.referenceImageViewer,
self) self)
elif isinstance(self.selectedImageViewer, ScrollAreaImageViewer): elif isinstance(self.selectedImageViewer, ScrollAreaImageViewer):
self.vController = QLabelImageViewerController( self.vController = ScrollAreaController(
self.selectedImageViewer,
self.referenceImageViewer,
self)
elif isinstance(self.selectedImageViewer, GraphicsViewViewer):
self.vController = GraphicsViewController(
self.selectedImageViewer, self.selectedImageViewer,
self.referenceImageViewer, self.referenceImageViewer,
self) self)
def _update(self): def _update(self):
if not self.app.model.selected_dupes: if not self.app.model.selected_dupes:
self.clear_all() # No item from the model, disable and clear everything.
self.vController.clear_all()
return return
dupe = self.app.model.selected_dupes[0] dupe = self.app.model.selected_dupes[0]
group = self.app.model.results.get_group_of_duplicate(dupe) group = self.app.model.results.get_group_of_duplicate(dupe)
@ -214,14 +220,11 @@ class DetailsDialog(DetailsDialogBase):
return return
self.vController._updateImages() self.vController._updateImages()
def clear_all(self):
"""No item from the model, disable and clear everything."""
self.vController.clear_all()
# --- Override # --- Override
def resizeEvent(self, event): def resizeEvent(self, event):
if self.vController is None: if self.vController is None:
return return
# update scaled down pixmaps
self._updateImages() self._updateImages()
def show(self): def show(self):
@ -235,32 +238,23 @@ class DetailsDialog(DetailsDialogBase):
self._update() self._update()
# ImageViewers # ImageViewers
def scaleImages(self, factor):
self.vController.scaleImages(factor)
@pyqtSlot() @pyqtSlot()
def swapImages(self): def swapImages(self):
"""Swap pixmaps between ImageViewers."""
self.vController.swapPixmaps() self.vController.swapPixmaps()
# swap the columns in the details table as well # swap the columns in the details table as well
self.tableView.horizontalHeader().swapSections(1, 2) self.tableView.horizontalHeader().swapSections(1, 2)
@pyqtSlot() @pyqtSlot()
def zoomIn(self): def zoomIn(self):
self.vController.scaleImages(1.25) self.vController.zoom_in()
@pyqtSlot() @pyqtSlot()
def zoomOut(self): def zoomOut(self):
self.vController.scaleImages(0.8) self.vController.zoom_out()
@pyqtSlot()
def scale_to_bestfit(self):
self.vController.scale_to_bestfit()
@pyqtSlot() @pyqtSlot()
def zoomBestFit(self): def zoomBestFit(self):
self.vController.zoomBestFit() self.vController.scale_to_bestfit()
self.scale_to_bestfit()
@pyqtSlot() @pyqtSlot()
def zoomNormalSize(self): def zoomNormalSize(self):

File diff suppressed because it is too large Load Diff