mirror of
https://github.com/arsenetar/dupeguru.git
synced 2025-03-10 05:34:36 +00:00
drag mouse with ImageViewer class
This commit is contained in:
parent
468a736bfb
commit
ea6197626b
@ -4,8 +4,8 @@
|
|||||||
# which should be included with this package. The terms are also available at
|
# which should be included with this package. The terms are also available at
|
||||||
# http://www.gnu.org/licenses/gpl-3.0.html
|
# http://www.gnu.org/licenses/gpl-3.0.html
|
||||||
|
|
||||||
from PyQt5.QtCore import Qt, QSize
|
from PyQt5.QtCore import Qt, QSize, QRectF, QPointF
|
||||||
from PyQt5.QtGui import QPixmap, QIcon, QKeySequence
|
from PyQt5.QtGui import QPixmap, QIcon, QKeySequence, QPainter, QPalette
|
||||||
from PyQt5.QtWidgets import (
|
from PyQt5.QtWidgets import (
|
||||||
QVBoxLayout,
|
QVBoxLayout,
|
||||||
QAbstractItemView,
|
QAbstractItemView,
|
||||||
@ -16,7 +16,10 @@ from PyQt5.QtWidgets import (
|
|||||||
QToolButton,
|
QToolButton,
|
||||||
QGridLayout,
|
QGridLayout,
|
||||||
QStyle,
|
QStyle,
|
||||||
QAction
|
QAction,
|
||||||
|
QWidget,
|
||||||
|
QScrollArea,
|
||||||
|
QApplication
|
||||||
)
|
)
|
||||||
|
|
||||||
from hscommon.trans import trget
|
from hscommon.trans import trget
|
||||||
@ -27,6 +30,65 @@ from qtlib.util import createActions
|
|||||||
|
|
||||||
tr = trget("ui")
|
tr = trget("ui")
|
||||||
|
|
||||||
|
class ImageViewer(QWidget):
|
||||||
|
def __init__(self, parent):
|
||||||
|
QWidget.__init__(self, parent)
|
||||||
|
self.app = QApplication
|
||||||
|
self.pixmap = QPixmap()
|
||||||
|
self.m_rect = QRectF()
|
||||||
|
self.reference = QPointF()
|
||||||
|
self.delta = QPointF()
|
||||||
|
self.scale = 1.0
|
||||||
|
self.label = QLabel(parent)
|
||||||
|
self.area = QScrollArea()
|
||||||
|
|
||||||
|
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.area.setBackgroundRole(QPalette.Dark)
|
||||||
|
self.area.setWidget(self.label)
|
||||||
|
self.area.setVisible(False)
|
||||||
|
|
||||||
|
def paintEvent(self, event):
|
||||||
|
painter = QPainter(self)
|
||||||
|
painter.translate(self.rect().center())
|
||||||
|
painter.scale(self.scale, self.scale)
|
||||||
|
painter.translate(self.delta)
|
||||||
|
painter.drawPixmap(self.m_rect.topLeft(), self.pixmap)
|
||||||
|
|
||||||
|
def mousePressEvent(self, event):
|
||||||
|
self.reference = event.pos()
|
||||||
|
self.app.setOverrideCursor(Qt.ClosedHandCursor)
|
||||||
|
self.setMouseTracking(True)
|
||||||
|
|
||||||
|
def mouseMoveEvent(self, event):
|
||||||
|
self.delta += (event.pos() - self.reference) * 1.0/self.scale
|
||||||
|
self.reference = event.pos()
|
||||||
|
self.update()
|
||||||
|
|
||||||
|
def mouseReleaseEvent(self, event):
|
||||||
|
self.app.restoreOverrideCursor()
|
||||||
|
self.setMouseTracking(False)
|
||||||
|
|
||||||
|
def setPixmap(self, pixmap):
|
||||||
|
self.pixmap = pixmap
|
||||||
|
self.m_rect = self.pixmap.rect()
|
||||||
|
self.m_rect.translate(-self.m_rect.center())
|
||||||
|
self.update()
|
||||||
|
|
||||||
|
def scale(self, factor):
|
||||||
|
self.scale *= factor
|
||||||
|
self.update()
|
||||||
|
|
||||||
|
def sizeHint(self):
|
||||||
|
return QSize(400, 400)
|
||||||
|
|
||||||
|
|
||||||
class DetailsDialog(DetailsDialogBase):
|
class DetailsDialog(DetailsDialogBase):
|
||||||
def __init__(self, parent, app):
|
def __init__(self, parent, app):
|
||||||
@ -34,6 +96,7 @@ class DetailsDialog(DetailsDialogBase):
|
|||||||
self.selectedPixmap = None
|
self.selectedPixmap = None
|
||||||
self.referencePixmap = None
|
self.referencePixmap = None
|
||||||
self.scaleFactor = 1.0
|
self.scaleFactor = 1.0
|
||||||
|
self.app = app
|
||||||
|
|
||||||
def _setupActions(self):
|
def _setupActions(self):
|
||||||
# (name, shortcut, icon, desc, func)
|
# (name, shortcut, icon, desc, func)
|
||||||
@ -65,7 +128,7 @@ class DetailsDialog(DetailsDialogBase):
|
|||||||
"zoom-normal",
|
"zoom-normal",
|
||||||
tr("Normal size"),
|
tr("Normal size"),
|
||||||
self.zoomNormalSize,
|
self.zoomNormalSize,
|
||||||
)
|
),
|
||||||
(
|
(
|
||||||
"actionBestFit",
|
"actionBestFit",
|
||||||
QKeySequence.Refresh,
|
QKeySequence.Refresh,
|
||||||
@ -91,17 +154,18 @@ class DetailsDialog(DetailsDialogBase):
|
|||||||
self.horizontalLayout.setColumnStretch(1,0)
|
self.horizontalLayout.setColumnStretch(1,0)
|
||||||
self.horizontalLayout.setColumnStretch(2,1)
|
self.horizontalLayout.setColumnStretch(2,1)
|
||||||
self.horizontalLayout.setSpacing(4)
|
self.horizontalLayout.setSpacing(4)
|
||||||
self.selectedImage = QLabel(self)
|
self.selectedImage = ImageViewer(self)
|
||||||
sizePolicy = QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
|
# self.selectedImage = QLabel(self)
|
||||||
sizePolicy.setHorizontalStretch(0)
|
# sizePolicy = QSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
|
||||||
sizePolicy.setVerticalStretch(0)
|
# sizePolicy.setHorizontalStretch(0)
|
||||||
sizePolicy.setHeightForWidth(
|
# sizePolicy.setVerticalStretch(0)
|
||||||
self.selectedImage.sizePolicy().hasHeightForWidth()
|
# sizePolicy.setHeightForWidth(
|
||||||
)
|
# self.selectedImage.sizePolicy().hasHeightForWidth()
|
||||||
self.selectedImage.setSizePolicy(sizePolicy)
|
# )
|
||||||
self.selectedImage.setScaledContents(False)
|
# self.selectedImage.setSizePolicy(sizePolicy)
|
||||||
self.selectedImage.setAlignment(Qt.AlignCenter)
|
# self.selectedImage.setScaledContents(False)
|
||||||
# self.horizontalLayout.addWidget(self.selectedImage)
|
# self.selectedImage.setAlignment(Qt.AlignCenter)
|
||||||
|
# # self.horizontalLayout.addWidget(self.selectedImage)
|
||||||
self.horizontalLayout.addWidget(self.selectedImage, 0, 0, 3, 1)
|
self.horizontalLayout.addWidget(self.selectedImage, 0, 0, 3, 1)
|
||||||
|
|
||||||
self.verticalToolBar = QToolBar(self)
|
self.verticalToolBar = QToolBar(self)
|
||||||
@ -140,7 +204,7 @@ class DetailsDialog(DetailsDialogBase):
|
|||||||
|
|
||||||
self.buttonBestFit = QToolButton(self.verticalToolBar)
|
self.buttonBestFit = QToolButton(self.verticalToolBar)
|
||||||
self.buttonBestFit.setToolButtonStyle(Qt.ToolButtonIconOnly)
|
self.buttonBestFit.setToolButtonStyle(Qt.ToolButtonIconOnly)
|
||||||
self.buttonBestFit.setDefaultAction(self.actionZoomReset)
|
self.buttonBestFit.setDefaultAction(self.actionBestFit)
|
||||||
self.buttonBestFit.setText('BestFit')
|
self.buttonBestFit.setText('BestFit')
|
||||||
self.buttonBestFit.setIcon(QIcon.fromTheme('zoom-best-fit'))
|
self.buttonBestFit.setIcon(QIcon.fromTheme('zoom-best-fit'))
|
||||||
self.buttonBestFit.setEnabled(False)
|
self.buttonBestFit.setEnabled(False)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user