mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Image popup: Add a context menu with an option to reset the current zoom. Fixes #2080315 [[Enhancement] Image viewer: View image at 100%](https://bugs.launchpad.net/calibre/+bug/2080315)
This commit is contained in:
parent
2cdb738d90
commit
f4a4f19786
@ -16,6 +16,7 @@ from qt.core import (
|
|||||||
QImage,
|
QImage,
|
||||||
QKeySequence,
|
QKeySequence,
|
||||||
QLabel,
|
QLabel,
|
||||||
|
QMenu,
|
||||||
QPainter,
|
QPainter,
|
||||||
QPalette,
|
QPalette,
|
||||||
QPixmap,
|
QPixmap,
|
||||||
@ -140,14 +141,25 @@ class ImageView(QDialog):
|
|||||||
self.current_url = current_url
|
self.current_url = current_url
|
||||||
self.factor = 1.0
|
self.factor = 1.0
|
||||||
self.geom_name = geom_name
|
self.geom_name = geom_name
|
||||||
self.zoom_in_action = ac = QAction(self)
|
self.zoom_in_action = ac = QAction(QIcon.ic('plus.png'), _('Zoom &in'), self)
|
||||||
ac.triggered.connect(self.zoom_in)
|
ac.triggered.connect(self.zoom_in)
|
||||||
ac.setShortcuts([QKeySequence(QKeySequence.StandardKey.ZoomIn), QKeySequence('+', QKeySequence.SequenceFormat.PortableText)])
|
ac.setShortcuts([QKeySequence(QKeySequence.StandardKey.ZoomIn), QKeySequence('+', QKeySequence.SequenceFormat.PortableText)])
|
||||||
self.addAction(ac)
|
self.addAction(ac)
|
||||||
self.zoom_out_action = ac = QAction(self)
|
self.zoom_out_action = ac = QAction(QIcon.ic('minus.png'), _('Zoom &out'), self)
|
||||||
ac.triggered.connect(self.zoom_out)
|
ac.triggered.connect(self.zoom_out)
|
||||||
ac.setShortcuts([QKeySequence(QKeySequence.StandardKey.ZoomOut), QKeySequence('-', QKeySequence.SequenceFormat.PortableText)])
|
ac.setShortcuts([QKeySequence(QKeySequence.StandardKey.ZoomOut), QKeySequence('-', QKeySequence.SequenceFormat.PortableText)])
|
||||||
self.addAction(ac)
|
self.addAction(ac)
|
||||||
|
self.reset_zoom_action = ac = QAction(QIcon.ic('edit-undo.png'), _('Reset &zoom'), self)
|
||||||
|
ac.triggered.connect(self.reset_zoom)
|
||||||
|
ac.setShortcuts([QKeySequence('=', QKeySequence.SequenceFormat.PortableText)])
|
||||||
|
self.addAction(ac)
|
||||||
|
self.copy_action = ac = QAction(QIcon.ic('edit-copy.png'), _('&Copy'), self)
|
||||||
|
ac.setShortcuts([QKeySequence(QKeySequence.StandardKey.Copy)])
|
||||||
|
self.addAction(ac)
|
||||||
|
ac.triggered.connect(self.copy_image)
|
||||||
|
self.rotate_action = ac = QAction(QIcon.ic('rotate-right.png'), _('&Rotate'), self)
|
||||||
|
self.addAction(ac)
|
||||||
|
ac.triggered.connect(self.rotate_image)
|
||||||
|
|
||||||
self.scrollarea = sa = ScrollArea()
|
self.scrollarea = sa = ScrollArea()
|
||||||
sa.setAlignment(Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignVCenter)
|
sa.setAlignment(Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignVCenter)
|
||||||
@ -160,26 +172,22 @@ class ImageView(QDialog):
|
|||||||
self.bb = bb = QDialogButtonBox(QDialogButtonBox.StandardButton.Close)
|
self.bb = bb = QDialogButtonBox(QDialogButtonBox.StandardButton.Close)
|
||||||
bb.accepted.connect(self.accept)
|
bb.accepted.connect(self.accept)
|
||||||
bb.rejected.connect(self.reject)
|
bb.rejected.connect(self.reject)
|
||||||
self.zi_button = zi = bb.addButton(_('Zoom &in'), QDialogButtonBox.ButtonRole.ActionRole)
|
self.zi_button = zi = bb.addButton(self.zoom_in_action.text(), QDialogButtonBox.ButtonRole.ActionRole)
|
||||||
self.zo_button = zo = bb.addButton(_('Zoom &out'), QDialogButtonBox.ButtonRole.ActionRole)
|
self.zo_button = zo = bb.addButton(self.zoom_out_action.text(), QDialogButtonBox.ButtonRole.ActionRole)
|
||||||
self.save_button = so = bb.addButton(_('&Save as'), QDialogButtonBox.ButtonRole.ActionRole)
|
self.save_button = so = bb.addButton(_('&Save as'), QDialogButtonBox.ButtonRole.ActionRole)
|
||||||
self.copy_button = co = bb.addButton(_('&Copy'), QDialogButtonBox.ButtonRole.ActionRole)
|
self.copy_button = co = bb.addButton(self.copy_action.text(), QDialogButtonBox.ButtonRole.ActionRole)
|
||||||
self.rotate_button = ro = bb.addButton(_('&Rotate'), QDialogButtonBox.ButtonRole.ActionRole)
|
self.rotate_button = ro = bb.addButton(self.rotate_action.text(), QDialogButtonBox.ButtonRole.ActionRole)
|
||||||
self.fullscreen_button = fo = bb.addButton(_('F&ull screen'), QDialogButtonBox.ButtonRole.ActionRole)
|
self.fullscreen_button = fo = bb.addButton(_('F&ull screen'), QDialogButtonBox.ButtonRole.ActionRole)
|
||||||
zi.setIcon(QIcon.ic('plus.png'))
|
zi.setIcon(self.zoom_in_action.icon())
|
||||||
zo.setIcon(QIcon.ic('minus.png'))
|
zo.setIcon(self.zoom_out_action.icon())
|
||||||
so.setIcon(QIcon.ic('save.png'))
|
so.setIcon(QIcon.ic('save.png'))
|
||||||
co.setIcon(QIcon.ic('edit-copy.png'))
|
co.setIcon(self.copy_action.icon())
|
||||||
ro.setIcon(QIcon.ic('rotate-right.png'))
|
ro.setIcon(self.rotate_action.icon())
|
||||||
fo.setIcon(QIcon.ic('page.png'))
|
fo.setIcon(QIcon.ic('page.png'))
|
||||||
zi.clicked.connect(self.zoom_in)
|
zi.clicked.connect(self.zoom_in_action.trigger)
|
||||||
zo.clicked.connect(self.zoom_out)
|
zo.clicked.connect(self.zoom_out_action.trigger)
|
||||||
so.clicked.connect(self.save_image)
|
so.clicked.connect(self.save_image)
|
||||||
co.clicked.connect(self.copy_image)
|
co.clicked.connect(self.copy_action.trigger)
|
||||||
self.copy_action = QAction(self)
|
|
||||||
self.addAction(self.copy_action)
|
|
||||||
self.copy_action.triggered.connect(self.copy_button.click)
|
|
||||||
self.copy_action.setShortcut(QKeySequence.StandardKey.Copy)
|
|
||||||
ro.clicked.connect(self.rotate_image)
|
ro.clicked.connect(self.rotate_image)
|
||||||
fo.setCheckable(True)
|
fo.setCheckable(True)
|
||||||
|
|
||||||
@ -205,6 +213,17 @@ class ImageView(QDialog):
|
|||||||
self.restore_geometry(self.prefs, self.geom_name)
|
self.restore_geometry(self.prefs, self.geom_name)
|
||||||
fo.setChecked(self.isFullScreen())
|
fo.setChecked(self.isFullScreen())
|
||||||
fo.toggled.connect(self.toggle_fullscreen)
|
fo.toggled.connect(self.toggle_fullscreen)
|
||||||
|
self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
|
||||||
|
self.customContextMenuRequested.connect(self.context_menu)
|
||||||
|
|
||||||
|
def context_menu(self, pos):
|
||||||
|
m = QMenu(self)
|
||||||
|
m.addAction(self.reset_zoom_action)
|
||||||
|
m.addAction(self.zoom_in_action)
|
||||||
|
m.addAction(self.zoom_out_action)
|
||||||
|
m.addAction(self.copy_action)
|
||||||
|
m.addAction(self.rotate_action)
|
||||||
|
m.exec(self.mapToGlobal(pos))
|
||||||
|
|
||||||
def set_to_viewport_size(self):
|
def set_to_viewport_size(self):
|
||||||
page_size = self.scrollarea.size()
|
page_size = self.scrollarea.size()
|
||||||
@ -226,12 +245,17 @@ class ImageView(QDialog):
|
|||||||
actual_height = self.current_img.size().height()
|
actual_height = self.current_img.size().height()
|
||||||
if actual_height:
|
if actual_height:
|
||||||
return scaled_height / actual_height
|
return scaled_height / actual_height
|
||||||
return 1
|
return 1.0
|
||||||
|
|
||||||
def zoom_requested(self, zoom_out):
|
def zoom_requested(self, zoom_out):
|
||||||
if (zoom_out and self.zo_button.isEnabled()) or (not zoom_out and self.zi_button.isEnabled()):
|
if (zoom_out and self.zo_button.isEnabled()) or (not zoom_out and self.zi_button.isEnabled()):
|
||||||
(self.zoom_out if zoom_out else self.zoom_in)()
|
(self.zoom_out if zoom_out else self.zoom_in)()
|
||||||
|
|
||||||
|
def reset_zoom(self):
|
||||||
|
self.factor = 1.0
|
||||||
|
self.prefs.set('image_popup_zoom_factor', self.factor)
|
||||||
|
self.adjust_image(1.0)
|
||||||
|
|
||||||
def zoom_in(self):
|
def zoom_in(self):
|
||||||
if self.fit_image.isChecked():
|
if self.fit_image.isChecked():
|
||||||
factor = self.factor_from_fit()
|
factor = self.factor_from_fit()
|
||||||
@ -288,6 +312,9 @@ class ImageView(QDialog):
|
|||||||
self.label.resize(self.factor * self.current_img.size())
|
self.label.resize(self.factor * self.current_img.size())
|
||||||
self.zi_button.setEnabled(self.factor <= 3)
|
self.zi_button.setEnabled(self.factor <= 3)
|
||||||
self.zo_button.setEnabled(self.factor >= 0.3333)
|
self.zo_button.setEnabled(self.factor >= 0.3333)
|
||||||
|
self.zoom_in_action.setEnabled(self.zi_button.isEnabled())
|
||||||
|
self.zoom_out_action.setEnabled(self.zo_button.isEnabled())
|
||||||
|
self.reset_zoom_action.setEnabled(self.factor != 1)
|
||||||
self.adjust_scrollbars(factor)
|
self.adjust_scrollbars(factor)
|
||||||
|
|
||||||
def adjust_scrollbars(self, factor):
|
def adjust_scrollbars(self, factor):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user