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

Disable unused methods from controller

* setPixmap() now disables the QWidget automatically if the pixmap passed is null.
* the controller relays repaint events to the other widget
This commit is contained in:
glubsy 2020-06-10 18:23:48 +02:00
parent c3797918d2
commit 8103cb3664
2 changed files with 100 additions and 85 deletions

View File

@ -15,7 +15,7 @@ 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, from qt.pe.image_viewer import (QWidgetImageViewer, ScrollAreaImageViewer,
QWidgetImageViewerController, QLabelImageViewerController) QWidgetImageViewerController, QLabelImageViewerController)
tr = trget("ui") tr = trget("ui")
@ -186,7 +186,7 @@ class DetailsDialog(DetailsDialogBase):
self.referenceImageViewer, self.referenceImageViewer,
self) self)
elif isinstance(self.selectedImageViewer, ScrollAreaImageViewer): elif isinstance(self.selectedImageViewer, ScrollAreaImageViewer):
self.vController = ( self.vController = QLabelImageViewerController(
self.selectedImageViewer, self.selectedImageViewer,
self.referenceImageViewer, self.referenceImageViewer,
self) self)

View File

@ -12,7 +12,7 @@ from PyQt5.QtWidgets import ( QLabel, QSizePolicy, QWidget, QScrollArea,
#TODO: add keyboard shortcuts #TODO: add keyboard shortcuts
class BaseController(QObject): class BaseController(QObject):
"""Base interface to keep image viewers synchronized. """Base proxy interface to keep image viewers synchronized.
Relays function calls. Singleton. """ Relays function calls. Singleton. """
def __init__(self, selectedViewer, referenceViewer, parent): def __init__(self, selectedViewer, referenceViewer, parent):
@ -26,6 +26,8 @@ class BaseController(QObject):
self.scaleFactor = 1.0 self.scaleFactor = 1.0
self.bestFit = True self.bestFit = True
self.parent = parent #needed to change buttons' states self.parent = parent #needed to change buttons' states
self.selectedViewer.controller = self
self.referenceViewer.controller = self
self._setupConnections() self._setupConnections()
def _setupConnections(self): #virtual def _setupConnections(self): #virtual
@ -34,28 +36,25 @@ class BaseController(QObject):
def update(self, ref, dupe): def update(self, ref, dupe):
self.resetState() self.resetState()
self.selectedPixmap = QPixmap(str(dupe.path)) self.selectedPixmap = QPixmap(str(dupe.path))
if ref is dupe: # currently selected file is the ref if ref is dupe: # currently selected file is the actual reference file
self.referencePixmap = QPixmap() self.referencePixmap = QPixmap()
self.scaledReferencePixmap = QPixmap() self.scaledReferencePixmap = QPixmap()
self.parent.buttonImgSwap.setEnabled(False) self.parent.buttonImgSwap.setEnabled(False)
# disable the blank widget. # disable the blank widget.
self.disable_widget(self.referenceViewer) self.referenceViewer.setPixmap(self.referencePixmap)
else: else:
self.referencePixmap = QPixmap(str(ref.path)) self.referencePixmap = QPixmap(str(ref.path))
self.parent.buttonImgSwap.setEnabled(True) self.parent.buttonImgSwap.setEnabled(True)
self.enable_widget(self.referenceViewer) # self.enable_widget(self.referenceViewer)
self.update_selected_widget() # self.update_selected_widget()
self.update_reference_widget() # self.update_reference_widget()
self._updateImages() self._updateImages()
def _updateImages(self): def _updateImages(self):
target_size = None target_size = None
if self.selectedPixmap.isNull(): if not self.selectedPixmap.isNull():
# self.disable_widget(self.selectedViewer, self.referenceViewer)
pass
else:
target_size = self.selectedViewer.size() target_size = self.selectedViewer.size()
if not self.bestFit: if not self.bestFit:
# zoomed in state, expand # zoomed in state, expand
@ -67,10 +66,7 @@ class BaseController(QObject):
target_size, Qt.KeepAspectRatio, Qt.SmoothTransformation) target_size, Qt.KeepAspectRatio, Qt.SmoothTransformation)
self.selectedViewer.setPixmap(self.scaledSelectedPixmap) self.selectedViewer.setPixmap(self.scaledSelectedPixmap)
if self.referencePixmap.isNull(): if not self.referencePixmap.isNull():
# self.disable_widget(self.referenceViewer, self.selectedViewer)
pass
else:
# the selectedImage viewer widget sometimes ends up being bigger # the selectedImage viewer widget sometimes ends up being bigger
# than the referenceImage viewer, which distorts by one pixel the # than the referenceImage viewer, which distorts by one pixel the
# scaled down pixmap for the reference, hence we'll reuse its size here. # scaled down pixmap for the reference, hence we'll reuse its size here.
@ -156,12 +152,12 @@ class BaseController(QObject):
self.selectedViewer.setPixmap(self.selectedPixmap) self.selectedViewer.setPixmap(self.selectedPixmap)
self.referenceViewer.setPixmap(self.referencePixmap) self.referenceViewer.setPixmap(self.referencePixmap)
# self.update_selected_widget()
# self.update_reference_widget()
self.selectedViewer.pixmapReset() self.selectedViewer.pixmapReset()
self.referenceViewer.pixmapReset() self.referenceViewer.pixmapReset()
self.update_selected_widget()
self.update_reference_widget()
self.parent.buttonNormalSize.setEnabled(False) self.parent.buttonNormalSize.setEnabled(False)
self.parent.buttonZoomIn.setEnabled(True) self.parent.buttonZoomIn.setEnabled(True)
self.parent.buttonZoomOut.setEnabled(True) self.parent.buttonZoomOut.setEnabled(True)
@ -177,63 +173,65 @@ class BaseController(QObject):
self.referenceViewer.setCenter() self.referenceViewer.setCenter()
def update_selected_widget(self): # def update_selected_widget(self):
print("update_selected_widget()") # print("update_selected_widget()")
if not self.selectedPixmap.isNull(): # if not self.selectedPixmap.isNull():
self.enable_widget(self.selectedViewer) # self.enable_widget(self.selectedViewer)
self.connect_signal(self.selectedViewer, self.referenceViewer) # self.connect_signal(self.selectedViewer, self.referenceViewer)
else: # else:
self.disable_widget(self.selectedViewer) # self.disable_widget(self.selectedViewer)
self.disconnect_signal(self.referenceViewer) # self.disconnect_signal(self.referenceViewer)
def update_reference_widget(self): # def update_reference_widget(self):
print("update_reference_widget()") # print("update_reference_widget()")
if not self.referencePixmap.isNull(): # if not self.referencePixmap.isNull():
self.enable_widget(self.referenceViewer) # self.enable_widget(self.referenceViewer)
self.connect_signal(self.referenceViewer, self.selectedViewer) # self.connect_signal(self.referenceViewer, self.selectedViewer)
else: # else:
self.disable_widget(self.referenceViewer) # self.disable_widget(self.referenceViewer)
self.disconnect_signal(self.selectedViewer) # self.disconnect_signal(self.selectedViewer)
def enable_widget(self, widget): # def enable_widget(self, widget):
"""We want to receive signals from the other_widget.""" # if not widget.isEnabled():
print(f"enable_widget({widget})") # widget.setEnabled(True)
if not widget.isEnabled():
widget.setEnabled(True)
def disable_widget(self, widget): # def disable_widget(self, widget):
"""Disables this widget and prevents receiving signals from other_widget.""" # """Disables this widget and prevents receiving signals from other_widget."""
print(f"disable_widget({widget})") # print(f"disable_widget({widget})")
widget.setPixmap(QPixmap()) # widget.setPixmap(QPixmap())
widget.setDisabled(True) # widget.setDisabled(True)
def connect_signal(self, widget, other_widget): # def connect_signal(self, widget, other_widget):
"""We want this widget to send its signal to the other_widget.""" # """We want this widget to send its signal to the other_widget."""
print(f"connect_signal({widget}, {other_widget})") # print(f"connect_signal({widget}, {other_widget})")
if widget.connection is None: # if widget.connection is None:
if other_widget.isEnabled(): # if other_widget.isEnabled():
widget.connection = widget.mouseDragged.connect(other_widget.slot_paint_event) # widget.connection = widget.mouseDragged.connect(other_widget.slot_paint_event)
print(f"Connected signal from {widget} to slot of {other_widget}") # print(f"Connected signal from {widget} to slot of {other_widget}")
# def disconnect_signal(self, other_widget):
# """We don't want this widget to send its signal anymore to the other_widget."""
# print(f"disconnect_signal({other_widget}")
# if other_widget.connection:
# other_widget.mouseDragged.disconnect()
# other_widget.connection = None
# print(f"Disconnected signal from {other_widget}")
def disconnect_signal(self, other_widget):
"""We don't want this widget to send its signal anymore to the other_widget."""
print(f"disconnect_signal({other_widget}")
if other_widget.connection:
other_widget.mouseDragged.disconnect()
other_widget.connection = None
print(f"Disconnected signal from {other_widget}")
class QWidgetImageViewerController(BaseController): class QWidgetImageViewerController(BaseController):
"""Specialized version for QWidget-based viewers"""
def __init__(self, selectedViewer, referenceViewer, parent): def __init__(self, selectedViewer, referenceViewer, parent):
super().__init__(selectedViewer, referenceViewer, parent) super().__init__(selectedViewer, referenceViewer, parent)
# self._setupConnections() # self._setupConnections()
def _setupConnections(self): def _setupConnections(self):
self.selectedViewer.mouseWheeled.connect( # self.selectedViewer._wheelConnection = \
self.scaleImages) # self.selectedViewer.mouseWheeled.connect(self.scaleImages)
self.referenceViewer.mouseWheeled.connect( # self.referenceViewer._wheelConnection = \
self.scaleImages) # self.referenceViewer.mouseWheeled.connect(self.scaleImages)
self.selectedViewer.connect_signals()
self.referenceViewer.connect_signals()
def scale(self, factor): def scale(self, factor):
self.selectedViewer.scale(factor) self.selectedViewer.scale(factor)
@ -251,10 +249,17 @@ class QWidgetImageViewerController(BaseController):
super().setCenter() super().setCenter()
super()._updateImages() super()._updateImages()
@pyqtSlot(QPointF)
def slot_paint_event(self, delta):
if self.sender() is self.referenceViewer:
self.selectedViewer.slot_paint_event(delta)
else:
self.referenceViewer.slot_paint_event(delta)
class QLabelImageViewerController(BaseController): class QLabelImageViewerController(BaseController):
"""Specialized version fro QLabel-based viewers"""
def __init__(self, selectedViewer, referenceViewer, parent): def __init__(self, selectedViewer, referenceViewer, parent):
super().__init__(selectedViewer, referenceViewer, parent) super().__init__(selectedViewer, referenceViewer, parent)
@ -269,6 +274,8 @@ class QLabelImageViewerController(BaseController):
self.referenceViewer.scale(self.scaleFactor) self.referenceViewer.scale(self.scaleFactor)
class GraphicsViewController(BaseController): class GraphicsViewController(BaseController):
"""Specialized version fro QGraphicsView-based viewers"""
#TODO
pass pass
@ -286,29 +293,11 @@ class QWidgetImageViewer(QWidget):
self._delta = QPointF() self._delta = QPointF()
self._scaleFactor = 1.0 self._scaleFactor = 1.0
self._drag = False self._drag = False
self.connection = None # signal bound to a slot self._dragConnection = None
self._wheelConnection = None
self._instance_name = name self._instance_name = name
self.bestFit = True self.bestFit = True
self.controller = None
# self.label = QLabel()
# sizePolicy = QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
# sizePolicy.setHorizontalStretch(0)
# sizePolicy.setVerticalStretch(0)
# sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())
# self.label.setBackgroundRole(QPalette.Base)
# self.label.setSizePolicy(sizePolicy)
# self.label.setAlignment(Qt.AlignCenter)
# self.label.setScaledContents(True)
# self.scrollarea = QScrollArea(self)
# self.scrollarea.setBackgroundRole(QPalette.Dark)
# self.scrollarea.setWidgetResizable(True)
# self.scrollarea.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents)
# # self.scrollarea.viewport().setAttribute(Qt.WA_StaticContents)
# self.scrollarea.setWidget(self.label)
# self.scrollarea.setVisible(True)
def __repr__(self): def __repr__(self):
return f'{self._instance_name}' return f'{self._instance_name}'
@ -331,6 +320,10 @@ class QWidgetImageViewer(QWidget):
def changeEvent(self, event): def changeEvent(self, event):
if event.type() == QEvent.EnabledChange: if event.type() == QEvent.EnabledChange:
print(f"{self} is now {'enabled' if self.isEnabled() else 'disabled'}") print(f"{self} is now {'enabled' if self.isEnabled() else 'disabled'}")
if self.isEnabled():
self.connect_signals()
return
self.disconnect_signals()
def mousePressEvent(self, event): def mousePressEvent(self, event):
if self.bestFit: if self.bestFit:
@ -378,15 +371,36 @@ class QWidgetImageViewer(QWidget):
if pixmap.isNull(): if pixmap.isNull():
if not self._pixmap.isNull(): if not self._pixmap.isNull():
self._pixmap = pixmap self._pixmap = pixmap
self.disconnect_signals()
self.update() self.update()
return return
elif not self.isEnabled(): elif not self.isEnabled():
self.connect_signals()
self.setEnabled(True) self.setEnabled(True)
self._pixmap = pixmap self._pixmap = pixmap
self._rect = self._pixmap.rect() self._rect = self._pixmap.rect()
self._rect.translate(-self._rect.center()) self._rect.translate(-self._rect.center())
self.update() self.update()
def isActive(self):
return True if not self.pixmap.isNull() else False
def disconnect_signals(self):
if self._dragConnection:
self.mouseDragged.disconnect()
self._dragConnection = None
if self._wheelConnection:
self.mouseWheeled.disconnect()
self._wheelConnection = None
def connect_signals(self):
if not self._dragConnection:
self._dragConnection = self.mouseDragged.connect(
self.controller.slot_paint_event)
if not self._wheelConnection:
self._wheelConnection = self.mouseWheeled.connect(
self.controller.scaleImages)
def scale(self, factor): def scale(self, factor):
self._scaleFactor = factor self._scaleFactor = factor
self.update() self.update()
@ -404,7 +418,7 @@ class QWidgetImageViewer(QWidget):
def slot_paint_event(self, delta): def slot_paint_event(self, delta):
self._delta = delta self._delta = delta
self.update() self.update()
print(f"{self} received signal from {self.sender()}") # print(f"{self} received drag signal from {self.sender()}")
class ScrollAreaImageViewer(QScrollArea): class ScrollAreaImageViewer(QScrollArea):
@ -423,6 +437,7 @@ class ScrollAreaImageViewer(QScrollArea):
self._drag = False self._drag = False
self.connection = None # signal bound to a slot self.connection = None # signal bound to a slot
self._instance_name = name self._instance_name = name
self.controller = None
self.label = QLabel() self.label = QLabel()
sizePolicy = QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) sizePolicy = QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)