mirror of
https://github.com/arsenetar/dupeguru.git
synced 2025-03-09 21:24:36 +00:00
Move buttons into the toolbar class.
* Moved the QToolbar into the image viewer's translation unit. * QAction are still attached to the dialog window for shortcuts to work
This commit is contained in:
parent
370b582c9b
commit
36ab84423a
@ -5,10 +5,8 @@
|
||||
# http://www.gnu.org/licenses/gpl-3.0.html
|
||||
|
||||
from PyQt5.QtCore import Qt, QSize, pyqtSlot, pyqtSignal
|
||||
from PyQt5.QtGui import QPixmap, QIcon, QKeySequence
|
||||
from PyQt5.QtWidgets import (QLayout, QVBoxLayout, QAbstractItemView, QHBoxLayout,
|
||||
QLabel, QSizePolicy, QToolBar, QToolButton, QGridLayout, QStyle, QAction,
|
||||
QWidget, QApplication, QSpacerItem, QSplitter, QFrame )
|
||||
QSizePolicy, QGridLayout, QWidget, QSpacerItem, QSplitter, QFrame )
|
||||
|
||||
from hscommon.trans import trget
|
||||
from hscommon import desktop
|
||||
@ -16,7 +14,7 @@ from ..details_dialog import DetailsDialog as DetailsDialogBase
|
||||
from ..details_table import DetailsTable
|
||||
from qtlib.util import createActions
|
||||
from qt.pe.image_viewer import (
|
||||
QWidgetImageViewer, ScrollAreaImageViewer, GraphicsViewViewer,
|
||||
ViewerToolBar, QWidgetImageViewer, ScrollAreaImageViewer, GraphicsViewViewer,
|
||||
QWidgetController, ScrollAreaController, GraphicsViewController)
|
||||
tr = trget("ui")
|
||||
|
||||
@ -25,42 +23,7 @@ class DetailsDialog(DetailsDialogBase):
|
||||
self.vController = None
|
||||
super().__init__(parent, app)
|
||||
|
||||
def setupActions(self):
|
||||
# (name, shortcut, icon, desc, func)
|
||||
ACTIONS = [
|
||||
(
|
||||
"actionZoomIn",
|
||||
QKeySequence.ZoomIn,
|
||||
"zoom-in",
|
||||
tr("Increase zoom"),
|
||||
self.zoomIn,
|
||||
),
|
||||
(
|
||||
"actionZoomOut",
|
||||
QKeySequence.ZoomOut,
|
||||
"zoom-out",
|
||||
tr("Decrease zoom"),
|
||||
self.zoomOut,
|
||||
),
|
||||
(
|
||||
"actionNormalSize",
|
||||
QKeySequence.Refresh,
|
||||
"zoom-original",
|
||||
tr("Normal size"),
|
||||
self.zoomNormalSize,
|
||||
),
|
||||
(
|
||||
"actionBestFit",
|
||||
tr("Ctrl+p"),
|
||||
"zoom-best-fit",
|
||||
tr("Best fit"),
|
||||
self.zoomBestFit,
|
||||
)
|
||||
]
|
||||
createActions(ACTIONS, self)
|
||||
|
||||
def _setupUi(self):
|
||||
self.setupActions()
|
||||
self.setWindowTitle(tr("Details"))
|
||||
self.resize(502, 502)
|
||||
self.setMinimumSize(QSize(250, 250))
|
||||
@ -80,7 +43,12 @@ class DetailsDialog(DetailsDialogBase):
|
||||
self.horizontalLayout.setColumnStretch(0,24)
|
||||
self.horizontalLayout.setColumnStretch(1,1)
|
||||
self.horizontalLayout.setColumnStretch(2,24)
|
||||
# self.horizontalLayout.setColumnStretch(3,0)
|
||||
|
||||
# This avoids toolbar getting incorrectly resized when window resizes
|
||||
self.horizontalLayout.setRowStretch(0,1)
|
||||
self.horizontalLayout.setRowStretch(1,24)
|
||||
self.horizontalLayout.setRowStretch(2,1)
|
||||
|
||||
self.horizontalLayout.setSpacing(1)
|
||||
|
||||
self.selectedImageViewer = GraphicsViewViewer(self, "selectedImage")
|
||||
@ -97,63 +65,26 @@ class DetailsDialog(DetailsDialogBase):
|
||||
# # self.horizontalLayout.addWidget(self.selectedImage)
|
||||
self.horizontalLayout.addWidget(self.selectedImageViewer, 0, 0, 3, 1)
|
||||
|
||||
# We use different types of controller depending on the
|
||||
# underlying widgets we use to display images
|
||||
# because their interface and methods might differ
|
||||
if isinstance(self.selectedImageViewer, QWidgetImageViewer):
|
||||
self.vController = QWidgetController(self)
|
||||
elif isinstance(self.selectedImageViewer, ScrollAreaImageViewer):
|
||||
self.vController = ScrollAreaController(self)
|
||||
elif isinstance(self.selectedImageViewer, GraphicsViewViewer):
|
||||
self.vController = GraphicsViewController(self)
|
||||
|
||||
# self.horizontalLayout.addItem(QSpacerItem(5,0, QSizePolicy.Minimum),
|
||||
# 1, 3, 1, 1, Qt.Alignment(Qt.AlignRight))
|
||||
|
||||
# FIXME make a subclass to initialize buttons later
|
||||
# FIXME use qwidgetaction to make the popup on resize work -> QWidgetAction::createWidget()
|
||||
# FIXME figure out why margins are changing when the window is updating (after Normal Size, on resize)
|
||||
# it seems toggling the scrollbars reduce viewport size and messes up sizeHint returned?
|
||||
# thus shrinking the space available for the toolbar?
|
||||
self.verticalToolBar = QToolBar(self)
|
||||
self.verticalToolBar = ViewerToolBar(self, self.vController)
|
||||
# self.verticalToolBar.setMaximumWidth(10)
|
||||
self.verticalToolBar.setOrientation(Qt.Orientation(Qt.Vertical))
|
||||
# self.subVLayout = QVBoxLayout(self)
|
||||
# self.subVLayout.addWidget(self.verticalToolBar)
|
||||
# self.horizontalLayout.addLayout(self.subVLayout)
|
||||
|
||||
self.buttonImgSwap = QToolButton(self.verticalToolBar)
|
||||
self.buttonImgSwap.setToolButtonStyle(Qt.ToolButtonIconOnly)
|
||||
self.buttonImgSwap.setIcon(QIcon.fromTheme('view-refresh', \
|
||||
self.style().standardIcon(QStyle.SP_BrowserReload)))
|
||||
self.buttonImgSwap.setText('Swap images')
|
||||
self.buttonImgSwap.setToolTip('Swap images')
|
||||
self.buttonImgSwap.pressed.connect(self.swapImages)
|
||||
self.buttonImgSwap.released.connect(self.swapImages)
|
||||
|
||||
self.buttonZoomIn = QToolButton(self.verticalToolBar)
|
||||
self.buttonZoomIn.setToolButtonStyle(Qt.ToolButtonIconOnly)
|
||||
self.buttonZoomIn.setDefaultAction(self.actionZoomIn)
|
||||
self.buttonZoomIn.setText('ZoomIn')
|
||||
self.buttonZoomIn.setIcon(QIcon.fromTheme('zoom-in'))
|
||||
|
||||
self.buttonZoomOut = QToolButton(self.verticalToolBar)
|
||||
self.buttonZoomOut.setToolButtonStyle(Qt.ToolButtonIconOnly)
|
||||
self.buttonZoomOut.setDefaultAction(self.actionZoomOut)
|
||||
self.buttonZoomOut.setText('ZoomOut')
|
||||
self.buttonZoomOut.setIcon(QIcon.fromTheme('zoom-out'))
|
||||
self.buttonZoomOut.setEnabled(False)
|
||||
|
||||
self.buttonNormalSize = QToolButton(self.verticalToolBar)
|
||||
self.buttonNormalSize.setToolButtonStyle(Qt.ToolButtonIconOnly)
|
||||
self.buttonNormalSize.setDefaultAction(self.actionNormalSize)
|
||||
self.buttonNormalSize.setText('Normal Size')
|
||||
self.buttonNormalSize.setIcon(QIcon.fromTheme('zoom-original'))
|
||||
self.buttonNormalSize.setEnabled(True)
|
||||
|
||||
self.buttonBestFit = QToolButton(self.verticalToolBar)
|
||||
self.buttonBestFit.setToolButtonStyle(Qt.ToolButtonIconOnly)
|
||||
self.buttonBestFit.setDefaultAction(self.actionBestFit)
|
||||
self.buttonBestFit.setText('BestFit')
|
||||
self.buttonBestFit.setIcon(QIcon.fromTheme('zoom-best-fit'))
|
||||
self.buttonBestFit.setEnabled(False)
|
||||
|
||||
self.verticalToolBar.addWidget(self.buttonImgSwap)
|
||||
self.verticalToolBar.addWidget(self.buttonZoomIn)
|
||||
self.verticalToolBar.addWidget(self.buttonZoomOut)
|
||||
self.verticalToolBar.addWidget(self.buttonNormalSize)
|
||||
self.verticalToolBar.addWidget(self.buttonBestFit)
|
||||
|
||||
self.horizontalLayout.addWidget(self.verticalToolBar, 1, 1, 1, 1, Qt.AlignCenter)
|
||||
|
||||
self.referenceImageViewer = GraphicsViewViewer(self, "referenceImage")
|
||||
@ -197,30 +128,7 @@ class DetailsDialog(DetailsDialogBase):
|
||||
|
||||
# self.tableView.hide()
|
||||
|
||||
self.buttonImgSwap.setEnabled(False)
|
||||
self.buttonZoomIn.setEnabled(False)
|
||||
self.buttonZoomOut.setEnabled(False)
|
||||
self.buttonNormalSize.setEnabled(False)
|
||||
self.buttonBestFit.setEnabled(False)
|
||||
|
||||
# We use different types of controller depending on the
|
||||
# underlying widgets we use to display images
|
||||
# because their interface and methods might differ
|
||||
if isinstance(self.selectedImageViewer, QWidgetImageViewer):
|
||||
self.vController = QWidgetController(
|
||||
self.selectedImageViewer,
|
||||
self.referenceImageViewer,
|
||||
self)
|
||||
elif isinstance(self.selectedImageViewer, ScrollAreaImageViewer):
|
||||
self.vController = ScrollAreaController(
|
||||
self.selectedImageViewer,
|
||||
self.referenceImageViewer,
|
||||
self)
|
||||
elif isinstance(self.selectedImageViewer, GraphicsViewViewer):
|
||||
self.vController = GraphicsViewController(
|
||||
self.selectedImageViewer,
|
||||
self.referenceImageViewer,
|
||||
self)
|
||||
self.vController.setupViewers(self.selectedImageViewer, self.referenceImageViewer)
|
||||
|
||||
def _update(self):
|
||||
if self.vController is None: # Not yet constructed!
|
||||
@ -274,25 +182,3 @@ class DetailsDialog(DetailsDialogBase):
|
||||
if self.isVisible():
|
||||
self._update()
|
||||
|
||||
# ImageViewers
|
||||
@pyqtSlot()
|
||||
def swapImages(self):
|
||||
self.vController.swapPixmaps()
|
||||
# swap the columns in the details table as well
|
||||
self.tableView.horizontalHeader().swapSections(1, 2)
|
||||
|
||||
@pyqtSlot()
|
||||
def zoomIn(self):
|
||||
self.vController.zoomIn()
|
||||
|
||||
@pyqtSlot()
|
||||
def zoomOut(self):
|
||||
self.vController.zoomOut()
|
||||
|
||||
@pyqtSlot()
|
||||
def zoomBestFit(self):
|
||||
self.vController.ScaleToBestFit()
|
||||
|
||||
@pyqtSlot()
|
||||
def zoomNormalSize(self):
|
||||
self.vController.zoomNormalSize()
|
||||
|
@ -3,25 +3,130 @@
|
||||
# http://www.gnu.org/licenses/gpl-3.0.html
|
||||
|
||||
from PyQt5.QtCore import QObject, Qt, QSize, QRectF, QPointF, QPoint, pyqtSlot, pyqtSignal, QEvent
|
||||
from PyQt5.QtGui import QPixmap, QPainter, QPalette, QCursor, QTransform
|
||||
from PyQt5.QtWidgets import ( QLabel, QSizePolicy, QWidget, QScrollArea,
|
||||
QScrollBar, QApplication, QAbstractScrollArea )
|
||||
from PyQt5.QtGui import QPixmap, QPainter, QPalette, QCursor, QTransform, QIcon, QKeySequence
|
||||
from PyQt5.QtWidgets import ( QToolBar, QToolButton, QAction, QLabel, QSizePolicy, QWidget, QScrollArea,
|
||||
QScrollBar, QApplication, QAbstractScrollArea, QStyle)
|
||||
from hscommon.trans import trget
|
||||
tr = trget("ui")
|
||||
|
||||
MAX_SCALE = 12.0
|
||||
MIN_SCALE = 0.1
|
||||
|
||||
|
||||
class ViewerToolBar(QToolBar):
|
||||
def __init__(self, parent, controller):
|
||||
super().__init__()
|
||||
self.parent = parent
|
||||
self.controller = controller
|
||||
self.setupActions(controller)
|
||||
self.createButtons()
|
||||
self.buttonImgSwap.setEnabled(False)
|
||||
self.buttonZoomIn.setEnabled(False)
|
||||
self.buttonZoomOut.setEnabled(False)
|
||||
self.buttonNormalSize.setEnabled(False)
|
||||
self.buttonBestFit.setEnabled(False)
|
||||
|
||||
def createActions(self, actions, target):
|
||||
# TODO try with QWidgetAction() instead in order to have
|
||||
# the popup menu work in the toolbar (if resized below minimum height)
|
||||
# actions = [(name, shortcut, icon, desc, func)]
|
||||
for name, shortcut, icon, desc, func in actions:
|
||||
action = QAction(target)
|
||||
if icon:
|
||||
action.setIcon(QIcon(QPixmap(":/" + icon)))
|
||||
if shortcut:
|
||||
action.setShortcut(shortcut)
|
||||
action.setText(desc)
|
||||
action.triggered.connect(func)
|
||||
setattr(target, name, action)
|
||||
|
||||
def setupActions(self, controller):
|
||||
ACTIONS = [
|
||||
(
|
||||
"actionZoomIn",
|
||||
QKeySequence.ZoomIn,
|
||||
"zoom-in",
|
||||
tr("Increase zoom"),
|
||||
controller.zoomIn,
|
||||
),
|
||||
(
|
||||
"actionZoomOut",
|
||||
QKeySequence.ZoomOut,
|
||||
"zoom-out",
|
||||
tr("Decrease zoom"),
|
||||
controller.zoomOut,
|
||||
),
|
||||
(
|
||||
"actionNormalSize",
|
||||
QKeySequence.Refresh,
|
||||
"zoom-original",
|
||||
tr("Normal size"),
|
||||
controller.zoomNormalSize,
|
||||
),
|
||||
(
|
||||
"actionBestFit",
|
||||
tr("Ctrl+p"),
|
||||
"zoom-best-fit",
|
||||
tr("Best fit"),
|
||||
controller.zoomBestFit,
|
||||
)
|
||||
]
|
||||
self.createActions(ACTIONS, self.parent)
|
||||
|
||||
|
||||
def createButtons(self):
|
||||
self.buttonImgSwap = QToolButton(self)
|
||||
self.buttonImgSwap.setToolButtonStyle(Qt.ToolButtonIconOnly)
|
||||
self.buttonImgSwap.setIcon(QIcon.fromTheme('view-refresh', \
|
||||
self.style().standardIcon(QStyle.SP_BrowserReload)))
|
||||
self.buttonImgSwap.setText('Swap images')
|
||||
self.buttonImgSwap.setToolTip('Swap images')
|
||||
self.buttonImgSwap.pressed.connect(self.controller.swapImages)
|
||||
self.buttonImgSwap.released.connect(self.controller.swapImages)
|
||||
|
||||
self.buttonZoomIn = QToolButton(self)
|
||||
self.buttonZoomIn.setToolButtonStyle(Qt.ToolButtonIconOnly)
|
||||
self.buttonZoomIn.setDefaultAction(self.parent.actionZoomIn)
|
||||
self.buttonZoomIn.setText('ZoomIn')
|
||||
self.buttonZoomIn.setIcon(QIcon.fromTheme('zoom-in'))
|
||||
|
||||
self.buttonZoomOut = QToolButton(self)
|
||||
self.buttonZoomOut.setToolButtonStyle(Qt.ToolButtonIconOnly)
|
||||
self.buttonZoomOut.setDefaultAction(self.parent.actionZoomOut)
|
||||
self.buttonZoomOut.setText('ZoomOut')
|
||||
self.buttonZoomOut.setIcon(QIcon.fromTheme('zoom-out'))
|
||||
self.buttonZoomOut.setEnabled(False)
|
||||
|
||||
self.buttonNormalSize = QToolButton(self)
|
||||
self.buttonNormalSize.setToolButtonStyle(Qt.ToolButtonIconOnly)
|
||||
self.buttonNormalSize.setDefaultAction(self.parent.actionNormalSize)
|
||||
self.buttonNormalSize.setText('Normal Size')
|
||||
self.buttonNormalSize.setIcon(QIcon.fromTheme('zoom-original'))
|
||||
self.buttonNormalSize.setEnabled(True)
|
||||
|
||||
self.buttonBestFit = QToolButton(self)
|
||||
self.buttonBestFit.setToolButtonStyle(Qt.ToolButtonIconOnly)
|
||||
self.buttonBestFit.setDefaultAction(self.parent.actionBestFit)
|
||||
self.buttonBestFit.setText('BestFit')
|
||||
self.buttonBestFit.setIcon(QIcon.fromTheme('zoom-best-fit'))
|
||||
self.buttonBestFit.setEnabled(False)
|
||||
|
||||
self.addWidget(self.buttonImgSwap)
|
||||
self.addWidget(self.buttonZoomIn)
|
||||
self.addWidget(self.buttonZoomOut)
|
||||
self.addWidget(self.buttonNormalSize)
|
||||
self.addWidget(self.buttonBestFit)
|
||||
|
||||
|
||||
class BaseController(QObject):
|
||||
"""Abstract Base class. Singleton.
|
||||
Base proxy interface to keep image viewers synchronized.
|
||||
Relays function calls, keep tracks of things."""
|
||||
|
||||
def __init__(self, selectedViewer, referenceViewer, parent):
|
||||
def __init__(self, parent):
|
||||
super().__init__()
|
||||
self.selectedViewer = selectedViewer
|
||||
self.referenceViewer = referenceViewer
|
||||
self.selectedViewer.controller = self
|
||||
self.referenceViewer.controller = self
|
||||
self._setupConnections()
|
||||
self.selectedViewer = None
|
||||
self.referenceViewer = None
|
||||
# cached pixmaps
|
||||
self.selectedPixmap = QPixmap()
|
||||
self.referencePixmap = QPixmap()
|
||||
@ -33,6 +138,13 @@ class BaseController(QObject):
|
||||
self.parent = parent #To change buttons' states
|
||||
self.cached_group = None
|
||||
|
||||
def setupViewers(self, selectedViewer, referenceViewer):
|
||||
self.selectedViewer = selectedViewer
|
||||
self.referenceViewer = referenceViewer
|
||||
self.selectedViewer.controller = self
|
||||
self.referenceViewer.controller = self
|
||||
self._setupConnections()
|
||||
|
||||
def _setupConnections(self):
|
||||
self.selectedViewer.connectMouseSignals()
|
||||
self.referenceViewer.connectMouseSignals()
|
||||
@ -51,12 +163,12 @@ class BaseController(QObject):
|
||||
if ref is dupe: # currently selected file is the actual reference file
|
||||
self.referencePixmap = QPixmap()
|
||||
self.scaledReferencePixmap = QPixmap()
|
||||
self.parent.buttonImgSwap.setEnabled(False)
|
||||
self.parent.buttonNormalSize.setEnabled(True)
|
||||
self.parent.verticalToolBar.buttonImgSwap.setEnabled(False)
|
||||
self.parent.verticalToolBar.buttonNormalSize.setEnabled(True)
|
||||
else:
|
||||
self.referencePixmap = QPixmap(str(ref.path))
|
||||
self.parent.buttonImgSwap.setEnabled(True)
|
||||
self.parent.buttonNormalSize.setEnabled(True)
|
||||
self.parent.verticalToolBar.buttonImgSwap.setEnabled(True)
|
||||
self.parent.verticalToolBar.buttonNormalSize.setEnabled(True)
|
||||
|
||||
self.updateBothImages(same_group)
|
||||
self.centerViews(same_group and self.referencePixmap.isNull())
|
||||
@ -123,10 +235,10 @@ class BaseController(QObject):
|
||||
self.centerViews()
|
||||
|
||||
#FIXME move buttons somwhere else
|
||||
self.parent.buttonZoomIn.setEnabled(False)
|
||||
self.parent.buttonZoomOut.setEnabled(False)
|
||||
self.parent.buttonBestFit.setEnabled(False) # active mode by default
|
||||
self.parent.buttonNormalSize.setEnabled(True)
|
||||
self.parent.verticalToolBar.buttonZoomIn.setEnabled(False)
|
||||
self.parent.verticalToolBar.buttonZoomOut.setEnabled(False)
|
||||
self.parent.verticalToolBar.buttonBestFit.setEnabled(False) # active mode by default
|
||||
self.parent.verticalToolBar.buttonNormalSize.setEnabled(True)
|
||||
|
||||
def resetViewersState(self):
|
||||
"""No item from the model, disable and clear everything."""
|
||||
@ -146,11 +258,11 @@ class BaseController(QObject):
|
||||
self.centerViews()
|
||||
|
||||
#FIXME move buttons somwhere else
|
||||
self.parent.buttonZoomIn.setEnabled(False)
|
||||
self.parent.buttonZoomOut.setEnabled(False)
|
||||
self.parent.buttonBestFit.setEnabled(False) # active mode by default
|
||||
self.parent.buttonImgSwap.setEnabled(False)
|
||||
self.parent.buttonNormalSize.setEnabled(False)
|
||||
self.parent.verticalToolBar.buttonZoomIn.setEnabled(False)
|
||||
self.parent.verticalToolBar.buttonZoomOut.setEnabled(False)
|
||||
self.parent.verticalToolBar.buttonBestFit.setEnabled(False) # active mode by default
|
||||
self.parent.verticalToolBar.buttonImgSwap.setEnabled(False)
|
||||
self.parent.verticalToolBar.buttonNormalSize.setEnabled(False)
|
||||
|
||||
self.selectedViewer.setImage(self.selectedPixmap) # null
|
||||
self.selectedViewer.setEnabled(False)
|
||||
@ -182,13 +294,13 @@ class BaseController(QObject):
|
||||
self.updateButtons()
|
||||
|
||||
def updateButtons(self):
|
||||
self.parent.buttonZoomIn.setEnabled(self.current_scale < MAX_SCALE)
|
||||
self.parent.buttonZoomOut.setEnabled(self.current_scale > MIN_SCALE)
|
||||
self.parent.buttonBestFit.setEnabled(self.bestFit is False)
|
||||
self.parent.buttonNormalSize.setEnabled(round(self.current_scale, 1) != 1.0)
|
||||
self.parent.verticalToolBar.buttonZoomIn.setEnabled(self.current_scale < MAX_SCALE)
|
||||
self.parent.verticalToolBar.buttonZoomOut.setEnabled(self.current_scale > MIN_SCALE)
|
||||
self.parent.verticalToolBar.buttonBestFit.setEnabled(self.bestFit is False)
|
||||
self.parent.verticalToolBar.buttonNormalSize.setEnabled(round(self.current_scale, 1) != 1.0)
|
||||
|
||||
@pyqtSlot()
|
||||
def ScaleToBestFit(self):
|
||||
def zoomBestFit(self):
|
||||
"""Setup before scaling to bestfit"""
|
||||
self.setBestFit(True)
|
||||
self.current_scale = 1.0
|
||||
@ -205,10 +317,10 @@ class BaseController(QObject):
|
||||
self._updateImage(self.referencePixmap, self.scaledReferencePixmap, self.referenceViewer, target_size, True)
|
||||
self.centerViews()
|
||||
|
||||
self.parent.buttonBestFit.setEnabled(False)
|
||||
self.parent.buttonZoomOut.setEnabled(False)
|
||||
self.parent.buttonZoomIn.setEnabled(False)
|
||||
self.parent.buttonNormalSize.setEnabled(True)
|
||||
self.parent.verticalToolBar.buttonBestFit.setEnabled(False)
|
||||
self.parent.verticalToolBar.buttonZoomOut.setEnabled(False)
|
||||
self.parent.verticalToolBar.buttonZoomIn.setEnabled(False)
|
||||
self.parent.verticalToolBar.buttonNormalSize.setEnabled(True)
|
||||
|
||||
def setBestFit(self, value):
|
||||
self.bestFit = value
|
||||
@ -228,10 +340,10 @@ class BaseController(QObject):
|
||||
self.selectedViewer.scaleToNormalSize()
|
||||
self.referenceViewer.scaleToNormalSize()
|
||||
|
||||
self.parent.buttonNormalSize.setEnabled(False)
|
||||
self.parent.buttonZoomIn.setEnabled(True)
|
||||
self.parent.buttonZoomOut.setEnabled(True)
|
||||
self.parent.buttonBestFit.setEnabled(True)
|
||||
self.parent.verticalToolBar.buttonNormalSize.setEnabled(False)
|
||||
self.parent.verticalToolBar.buttonZoomIn.setEnabled(True)
|
||||
self.parent.verticalToolBar.buttonZoomOut.setEnabled(True)
|
||||
self.parent.verticalToolBar.buttonBestFit.setEnabled(True)
|
||||
|
||||
def centerViews(self, only_selected=False):
|
||||
self.selectedViewer.centerViewAndUpdate()
|
||||
@ -239,11 +351,16 @@ class BaseController(QObject):
|
||||
return
|
||||
self.referenceViewer.centerViewAndUpdate()
|
||||
|
||||
@pyqtSlot()
|
||||
def swapImages(self):
|
||||
# swap the columns in the details table as well
|
||||
self.parent.tableView.horizontalHeader().swapSections(1, 2)
|
||||
|
||||
|
||||
class QWidgetController(BaseController):
|
||||
"""Specialized version for QWidget-based viewers."""
|
||||
def __init__(self, selectedViewer, referenceViewer, parent):
|
||||
super().__init__(selectedViewer, referenceViewer, parent)
|
||||
def __init__(self, parent):
|
||||
super().__init__(parent)
|
||||
|
||||
@pyqtSlot(QPointF)
|
||||
def onDraggedMouse(self, delta):
|
||||
@ -253,16 +370,17 @@ class QWidgetController(BaseController):
|
||||
self.referenceViewer.onDraggedMouse(delta)
|
||||
|
||||
@pyqtSlot()
|
||||
def swapPixmaps(self):
|
||||
def swapImages(self):
|
||||
self.selectedViewer.getPixmap().swap(self.referenceViewer.getPixmap())
|
||||
self.selectedViewer.centerViewAndUpdate()
|
||||
self.referenceViewer.centerViewAndUpdate()
|
||||
super().swapImages()
|
||||
|
||||
|
||||
class ScrollAreaController(BaseController):
|
||||
"""Specialized version fro QLabel-based viewers."""
|
||||
def __init__(self, selectedViewer, referenceViewer, parent):
|
||||
super().__init__(selectedViewer, referenceViewer, parent)
|
||||
def __init__(self, parent):
|
||||
super().__init__(parent)
|
||||
|
||||
def _setupConnections(self):
|
||||
super()._setupConnections()
|
||||
@ -290,10 +408,11 @@ class ScrollAreaController(BaseController):
|
||||
self.referenceViewer.ignore_signal = False
|
||||
|
||||
@pyqtSlot()
|
||||
def swapPixmaps(self):
|
||||
def swapImages(self):
|
||||
self.referenceViewer._pixmap.swap(self.selectedViewer._pixmap)
|
||||
self.referenceViewer.setCachedPixmap()
|
||||
self.selectedViewer.setCachedPixmap()
|
||||
super().swapImages()
|
||||
|
||||
@pyqtSlot(float, QPointF)
|
||||
def onMouseWheel(self, scale, delta):
|
||||
@ -327,9 +446,9 @@ class ScrollAreaController(BaseController):
|
||||
# self.selectedViewer.adjustScrollBarsFactor(factor)
|
||||
|
||||
@pyqtSlot()
|
||||
def ScaleToBestFit(self):
|
||||
def zoomBestFit(self):
|
||||
# Disable scrollbars to avoid GridLayout size rounding "error"
|
||||
super().ScaleToBestFit()
|
||||
super().zoomBestFit()
|
||||
print("toggling scrollbars")
|
||||
self.selectedViewer.toggleScrollBars()
|
||||
self.referenceViewer.toggleScrollBars()
|
||||
@ -338,8 +457,8 @@ class ScrollAreaController(BaseController):
|
||||
|
||||
class GraphicsViewController(BaseController):
|
||||
"""Specialized version fro QGraphicsView-based viewers."""
|
||||
def __init__(self, selectedViewer, referenceViewer, parent):
|
||||
super().__init__(selectedViewer, referenceViewer, parent)
|
||||
def __init__(self, parent):
|
||||
super().__init__(parent)
|
||||
|
||||
def _setupConnections(self):
|
||||
super()._setupConnections()
|
||||
@ -386,13 +505,14 @@ class GraphicsViewController(BaseController):
|
||||
self.referenceViewer._horizontalScrollBar.setValue(value)
|
||||
|
||||
@pyqtSlot()
|
||||
def swapPixmaps(self):
|
||||
def swapImages(self):
|
||||
self.referenceViewer._pixmap.swap(self.selectedViewer._pixmap)
|
||||
self.referenceViewer.setCachedPixmap()
|
||||
self.selectedViewer.setCachedPixmap()
|
||||
super().swapImages()
|
||||
|
||||
@pyqtSlot()
|
||||
def ScaleToBestFit(self):
|
||||
def zoomBestFit(self):
|
||||
"""Setup before scaling to bestfit"""
|
||||
self.setBestFit(True)
|
||||
self.current_scale = 1.0
|
||||
@ -400,10 +520,10 @@ class GraphicsViewController(BaseController):
|
||||
self.selectedViewer.fitScale()
|
||||
self.referenceViewer.fitScale()
|
||||
|
||||
self.parent.buttonBestFit.setEnabled(False)
|
||||
self.parent.buttonZoomOut.setEnabled(False)
|
||||
self.parent.buttonZoomIn.setEnabled(False)
|
||||
self.parent.buttonNormalSize.setEnabled(True)
|
||||
self.parent.verticalToolBar.buttonBestFit.setEnabled(False)
|
||||
self.parent.verticalToolBar.buttonZoomOut.setEnabled(False)
|
||||
self.parent.verticalToolBar.buttonZoomIn.setEnabled(False)
|
||||
self.parent.verticalToolBar.buttonNormalSize.setEnabled(True)
|
||||
|
||||
def updateView(self, ref, dupe, group):
|
||||
# Keep current scale accross dupes from the same group
|
||||
@ -417,12 +537,12 @@ class GraphicsViewController(BaseController):
|
||||
self.selectedPixmap = QPixmap(str(dupe.path))
|
||||
if ref is dupe: # currently selected file is the actual reference file
|
||||
self.referencePixmap = QPixmap()
|
||||
self.parent.buttonImgSwap.setEnabled(False)
|
||||
self.parent.buttonNormalSize.setEnabled(True)
|
||||
self.parent.verticalToolBar.buttonImgSwap.setEnabled(False)
|
||||
self.parent.verticalToolBar.buttonNormalSize.setEnabled(True)
|
||||
else:
|
||||
self.referencePixmap = QPixmap(str(ref.path))
|
||||
self.parent.buttonImgSwap.setEnabled(True)
|
||||
self.parent.buttonNormalSize.setEnabled(True)
|
||||
self.parent.verticalToolBar.buttonImgSwap.setEnabled(True)
|
||||
self.parent.verticalToolBar.buttonNormalSize.setEnabled(True)
|
||||
|
||||
self.selectedViewer.setImage(self.selectedPixmap)
|
||||
self.referenceViewer.setImage(self.referencePixmap)
|
||||
@ -469,10 +589,10 @@ class GraphicsViewController(BaseController):
|
||||
# self.centerViews()
|
||||
|
||||
#FIXME move buttons somwhere else
|
||||
self.parent.buttonZoomIn.setEnabled(False)
|
||||
self.parent.buttonZoomOut.setEnabled(False)
|
||||
self.parent.buttonBestFit.setEnabled(False) # active mode by default
|
||||
self.parent.buttonNormalSize.setEnabled(True)
|
||||
self.parent.verticalToolBar.buttonZoomIn.setEnabled(False)
|
||||
self.parent.verticalToolBar.buttonZoomOut.setEnabled(False)
|
||||
self.parent.verticalToolBar.buttonBestFit.setEnabled(False) # active mode by default
|
||||
self.parent.verticalToolBar.buttonNormalSize.setEnabled(True)
|
||||
|
||||
def resetViewersState(self):
|
||||
"""No item from the model, disable and clear everything."""
|
||||
@ -490,11 +610,11 @@ class GraphicsViewController(BaseController):
|
||||
# self.centerViews()
|
||||
|
||||
#FIXME move buttons somwhere else
|
||||
self.parent.buttonZoomIn.setEnabled(False)
|
||||
self.parent.buttonZoomOut.setEnabled(False)
|
||||
self.parent.buttonBestFit.setEnabled(False) # active mode by default
|
||||
self.parent.buttonImgSwap.setEnabled(False)
|
||||
self.parent.buttonNormalSize.setEnabled(False)
|
||||
self.parent.verticalToolBar.buttonZoomIn.setEnabled(False)
|
||||
self.parent.verticalToolBar.buttonZoomOut.setEnabled(False)
|
||||
self.parent.verticalToolBar.buttonBestFit.setEnabled(False) # active mode by default
|
||||
self.parent.verticalToolBar.buttonImgSwap.setEnabled(False)
|
||||
self.parent.verticalToolBar.buttonNormalSize.setEnabled(False)
|
||||
|
||||
self.selectedViewer.setImage(self.selectedPixmap) # null
|
||||
self.selectedViewer.setEnabled(False)
|
||||
@ -517,13 +637,6 @@ class GraphicsViewController(BaseController):
|
||||
|
||||
self.selectedViewer.centerOn(self.selectedViewer._centerPoint)
|
||||
|
||||
# self.selectedViewer.updateCenterPoint()
|
||||
# self.referenceViewer.setCenter(self.selectedViewer.getCenter())
|
||||
# self.selectedViewer.setCenter(self.referenceViewer.getCenter())
|
||||
# self.referenceViewer.setCenter(self.selectedViewer.getCenter())
|
||||
# The other is automatically updated via sigals
|
||||
# self.selectedViewer.adjustScrollBarsFactor(factor)
|
||||
|
||||
|
||||
|
||||
|
||||
@ -1156,7 +1269,7 @@ class GraphicsViewViewer(QGraphicsView):
|
||||
super().mouseMoveEvent(event)
|
||||
|
||||
def updateCenterPoint(self):
|
||||
self._centerPoint = self.mapToScene( self.viewport().rect().center())
|
||||
self._centerPoint = self.mapToScene( self.rect().center())
|
||||
|
||||
def wheelEvent(self, event):
|
||||
if self.bestFit or MIN_SCALE > self.current_scale > MAX_SCALE:
|
||||
|
Loading…
x
Reference in New Issue
Block a user