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:
parent
c3797918d2
commit
8103cb3664
@ -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)
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user