E-book viewer: Image popup: Add a checkbox to remember the last used zoom level. Fixes #2038862 [[Enhancement] E-book viewer: options for a better comic book reading experience](https://bugs.launchpad.net/calibre/+bug/2038862)

This commit is contained in:
Kovid Goyal 2023-10-10 20:39:09 +05:30
parent ff7e9006b1
commit ac0e00e60b
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -176,9 +176,16 @@ class ImageView(QDialog):
i.setToolTip(_('Fit image inside the available space')) i.setToolTip(_('Fit image inside the available space'))
i.setChecked(bool(self.prefs.get('image_popup_fit_image'))) i.setChecked(bool(self.prefs.get('image_popup_fit_image')))
i.stateChanged.connect(self.fit_changed) i.stateChanged.connect(self.fit_changed)
h.addWidget(i), h.addStretch(), h.addWidget(bb) self.remember_zoom = z = QCheckBox(_('&Remember zoom'))
z.setChecked(not i.isChecked() and bool(self.prefs.get('image_popup_remember_zoom', False)))
z.stateChanged.connect(self.remember_zoom_changed)
h.addWidget(i), h.addWidget(z), h.addStretch(), h.addWidget(bb)
if self.fit_image.isChecked(): if self.fit_image.isChecked():
self.set_to_viewport_size() self.set_to_viewport_size()
elif z.isChecked():
factor = self.prefs.get('image_popup_zoom_factor', self.factor)
if factor != self.factor and not self.fit_image.isChecked():
self.factor = factor
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)
@ -213,6 +220,7 @@ class ImageView(QDialog):
self.fit_image.setChecked(False) self.fit_image.setChecked(False)
self.factor = factor self.factor = factor
self.factor *= 1.25 self.factor *= 1.25
self.prefs.set('image_popup_zoom_factor', self.factor)
self.adjust_image(1.25) self.adjust_image(1.25)
def zoom_out(self): def zoom_out(self):
@ -221,6 +229,7 @@ class ImageView(QDialog):
self.fit_image.setChecked(False) self.fit_image.setChecked(False)
self.factor = factor self.factor = factor
self.factor *= 0.8 self.factor *= 0.8
self.prefs.set('image_popup_zoom_factor', self.factor)
self.adjust_image(0.8) self.adjust_image(0.8)
def save_image(self): def save_image(self):
@ -241,10 +250,16 @@ class ImageView(QDialog):
self.prefs.set('image_popup_fit_image', fitted) self.prefs.set('image_popup_fit_image', fitted)
if self.fit_image.isChecked(): if self.fit_image.isChecked():
self.set_to_viewport_size() self.set_to_viewport_size()
self.remember_zoom.setChecked(False)
else: else:
self.factor = 1 self.factor = 1
self.prefs.set('image_popup_zoom_factor', self.factor)
self.adjust_image(1) self.adjust_image(1)
def remember_zoom_changed(self):
val = bool(self.remember_zoom.isChecked())
self.prefs.set('image_popup_remember_zoom', val)
def toggle_fit(self): def toggle_fit(self):
self.fit_image.toggle() self.fit_image.toggle()
@ -273,6 +288,7 @@ class ImageView(QDialog):
self.set_to_viewport_size() self.set_to_viewport_size()
else: else:
self.factor = 1 self.factor = 1
self.prefs.set('image_popup_zoom_factor', self.factor)
for sb in (self.scrollarea.horizontalScrollBar(), for sb in (self.scrollarea.horizontalScrollBar(),
self.scrollarea.verticalScrollBar()): self.scrollarea.verticalScrollBar()):
sb.setValue(0) sb.setValue(0)
@ -289,6 +305,8 @@ class ImageView(QDialog):
self.current_image_name = self.current_url self.current_image_name = self.current_url
reso = '' reso = ''
if self.current_img and not self.current_img.isNull(): if self.current_img and not self.current_img.isNull():
if self.factor != 1:
self.adjust_image(self.factor)
reso = f'[{self.current_img.width()}x{self.current_img.height()}]' reso = f'[{self.current_img.width()}x{self.current_img.height()}]'
title = _('Image: {name} {resolution}').format(name=self.current_image_name, resolution=reso) title = _('Image: {name} {resolution}').format(name=self.current_image_name, resolution=reso)
self.setWindowTitle(title) self.setWindowTitle(title)
@ -349,6 +367,5 @@ def show_image(path=None):
d() d()
app.exec() app.exec()
if __name__ == '__main__': if __name__ == '__main__':
show_image() show_image()