mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Book details: Add actions to trim the cover to the right-click menu. Fixes #1961129 [[Enhancement] Action to trim cover borders in context menu of Book details panel](https://bugs.launchpad.net/calibre/+bug/1961129)
This commit is contained in:
parent
4f92e975bf
commit
c0e7520954
@ -7,9 +7,10 @@ import re
|
|||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
from functools import partial
|
from functools import partial
|
||||||
from qt.core import (
|
from qt.core import (
|
||||||
QAction, QApplication, QColor, QEasingCurve, QIcon, QKeySequence, QLayout, QMenu,
|
QAction, QApplication, QClipboard, QColor, QDialog, QEasingCurve, QIcon,
|
||||||
QMimeData, QPainter, QPen, QPixmap, QPropertyAnimation, QRect, QSize, QClipboard,
|
QKeySequence, QLayout, QMenu, QMimeData, QPainter, QPen, QPixmap,
|
||||||
QSizePolicy, Qt, QUrl, QWidget, pyqtProperty, pyqtSignal
|
QPropertyAnimation, QRect, QSize, QSizePolicy, Qt, QUrl, QWidget, pyqtProperty,
|
||||||
|
pyqtSignal
|
||||||
)
|
)
|
||||||
|
|
||||||
from calibre import fit_image, sanitize_file_name
|
from calibre import fit_image, sanitize_file_name
|
||||||
@ -517,6 +518,7 @@ class CoverView(QWidget): # {{{
|
|||||||
self.pixmap = self.default_pixmap
|
self.pixmap = self.default_pixmap
|
||||||
self.pwidth = self.pheight = None
|
self.pwidth = self.pheight = None
|
||||||
self.data = {}
|
self.data = {}
|
||||||
|
self.last_trim_id = self.last_trim_pixmap = None
|
||||||
|
|
||||||
self.do_layout()
|
self.do_layout()
|
||||||
|
|
||||||
@ -605,6 +607,15 @@ class CoverView(QWidget): # {{{
|
|||||||
remove = cm.addAction(QIcon.ic('trash.png'), _('Remove cover'))
|
remove = cm.addAction(QIcon.ic('trash.png'), _('Remove cover'))
|
||||||
gc = cm.addAction(QIcon.ic('default_cover.png'), _('Generate cover from metadata'))
|
gc = cm.addAction(QIcon.ic('default_cover.png'), _('Generate cover from metadata'))
|
||||||
cm.addSeparator()
|
cm.addSeparator()
|
||||||
|
if self.pixmap is not self.default_pixmap and self.data.get('id'):
|
||||||
|
book_id = self.data['id']
|
||||||
|
cm.tc = QMenu(_('Trim cover'))
|
||||||
|
cm.tc.addAction(QIcon.ic('trim.png'), _('Automatically trim borders'), self.trim_cover)
|
||||||
|
cm.tc.addAction(_('Trim borders manually'), self.manual_trim_cover)
|
||||||
|
cm.tc.addSeparator()
|
||||||
|
cm.tc.addAction(QIcon.ic('edit-undo.png'), _('Undo last trim'), self.undo_last_trim).setEnabled(self.last_trim_id == book_id)
|
||||||
|
cm.addMenu(cm.tc)
|
||||||
|
cm.addSeparator()
|
||||||
if not QApplication.instance().clipboard().mimeData().hasImage():
|
if not QApplication.instance().clipboard().mimeData().hasImage():
|
||||||
paste.setEnabled(False)
|
paste.setEnabled(False)
|
||||||
copy.triggered.connect(self.copy_to_clipboard)
|
copy.triggered.connect(self.copy_to_clipboard)
|
||||||
@ -617,6 +628,39 @@ class CoverView(QWidget): # {{{
|
|||||||
cm.addMenu(m)
|
cm.addMenu(m)
|
||||||
cm.exec(ev.globalPos())
|
cm.exec(ev.globalPos())
|
||||||
|
|
||||||
|
def trim_cover(self):
|
||||||
|
book_id = self.data.get('id')
|
||||||
|
if not book_id:
|
||||||
|
return
|
||||||
|
from calibre.utils.img import image_from_x, remove_borders_from_image
|
||||||
|
img = image_from_x(self.pixmap)
|
||||||
|
nimg = remove_borders_from_image(img)
|
||||||
|
if nimg is not img:
|
||||||
|
self.last_trim_id = book_id
|
||||||
|
self.last_trim_pixmap = self.pixmap
|
||||||
|
self.update_cover(QPixmap.fromImage(nimg))
|
||||||
|
|
||||||
|
def manual_trim_cover(self):
|
||||||
|
book_id = self.data.get('id')
|
||||||
|
if not book_id:
|
||||||
|
return
|
||||||
|
from calibre.gui2.dialogs.trim_image import TrimImage
|
||||||
|
from calibre.utils.img import image_to_data
|
||||||
|
cdata = image_to_data(image_from_x(self.pixmap), fmt='PNG', png_compression_level=1)
|
||||||
|
d = TrimImage(cdata, parent=self)
|
||||||
|
if d.exec() == QDialog.DialogCode.Accepted and d.image_data is not None:
|
||||||
|
self.last_trim_id = book_id
|
||||||
|
self.last_trim_pixmap = self.pixmap
|
||||||
|
self.update_cover(cdata=d.image_data)
|
||||||
|
|
||||||
|
def undo_last_trim(self):
|
||||||
|
book_id = self.data.get('id')
|
||||||
|
if not book_id or book_id != self.last_trim_id:
|
||||||
|
return
|
||||||
|
pmap = self.last_trim_pixmap
|
||||||
|
self.last_trim_pixmap = self.last_trim_id = None
|
||||||
|
self.update_cover(pmap)
|
||||||
|
|
||||||
def open_with(self, entry):
|
def open_with(self, entry):
|
||||||
id_ = self.data.get('id', None)
|
id_ = self.data.get('id', None)
|
||||||
if id_ is not None:
|
if id_ is not None:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user