mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
UI to edit templates used for cover generation
This commit is contained in:
parent
cc38a40fae
commit
d875710f01
@ -7,12 +7,13 @@ __license__ = 'GPL v3'
|
|||||||
__copyright__ = '2014, Kovid Goyal <kovid at kovidgoyal.net>'
|
__copyright__ = '2014, Kovid Goyal <kovid at kovidgoyal.net>'
|
||||||
|
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
|
from functools import partial
|
||||||
|
|
||||||
from PyQt5.Qt import (
|
from PyQt5.Qt import (
|
||||||
QWidget, QHBoxLayout, QTabWidget, QLabel, QSizePolicy, QSize, QFormLayout,
|
QWidget, QHBoxLayout, QTabWidget, QLabel, QSizePolicy, QSize, QFormLayout,
|
||||||
QSpinBox, pyqtSignal, QPixmap, QDialog, QVBoxLayout, QDialogButtonBox,
|
QSpinBox, pyqtSignal, QPixmap, QDialog, QVBoxLayout, QDialogButtonBox,
|
||||||
QListWidget, QListWidgetItem, Qt, QGridLayout, QPushButton, QIcon,
|
QListWidget, QListWidgetItem, Qt, QGridLayout, QPushButton, QIcon,
|
||||||
QColorDialog, QToolButton, QLineEdit, QColor)
|
QColorDialog, QToolButton, QLineEdit, QColor, QFrame)
|
||||||
|
|
||||||
from calibre.ebooks.covers import all_styles, cprefs, generate_cover, override_prefs, default_color_themes
|
from calibre.ebooks.covers import all_styles, cprefs, generate_cover, override_prefs, default_color_themes
|
||||||
from calibre.gui2 import gprefs, error_dialog
|
from calibre.gui2 import gprefs, error_dialog
|
||||||
@ -219,6 +220,44 @@ class CoverSettingsWidget(QWidget):
|
|||||||
fs.valueChanged.connect(self.emit_changed)
|
fs.valueChanged.connect(self.emit_changed)
|
||||||
l.addRow(size_label, fs)
|
l.addRow(size_label, fs)
|
||||||
|
|
||||||
|
self.templates_page = tp = QWidget(st)
|
||||||
|
st.addTab(tp, _('Text'))
|
||||||
|
tp.l = l = QVBoxLayout()
|
||||||
|
tp.setLayout(l)
|
||||||
|
tp.la = la = QLabel(_(
|
||||||
|
'The text on the generated cover is taken from the metadata of the book.'
|
||||||
|
' This is controlled via templates. You can use the <b>, <i> and <br> tags'
|
||||||
|
' in the templates for bold, italic and line breaks, respectively. The'
|
||||||
|
' default templates use the title, series and authors. You can change them to use'
|
||||||
|
' whatever metadata you like.'))
|
||||||
|
la.setWordWrap(True), la.setTextFormat(Qt.PlainText)
|
||||||
|
l.addWidget(la)
|
||||||
|
|
||||||
|
def create_template_widget(title, which, button):
|
||||||
|
attr = which + '_template'
|
||||||
|
heading = QLabel('<h2>' + title)
|
||||||
|
setattr(tp, attr + '_heading', heading)
|
||||||
|
l.addWidget(heading)
|
||||||
|
la = QLabel(prefs[attr])
|
||||||
|
setattr(self, attr, la)
|
||||||
|
l.addWidget(la), la.setTextFormat(Qt.PlainText), la.setStyleSheet('QLabel {font-family: monospace}')
|
||||||
|
la.setWordWrap(True)
|
||||||
|
b = QPushButton(button)
|
||||||
|
b.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
|
||||||
|
b.clicked.connect(partial(self.change_template, which))
|
||||||
|
setattr(self, attr + '_button', b)
|
||||||
|
l.addWidget(b)
|
||||||
|
if which != 'footer':
|
||||||
|
f = QFrame(tp)
|
||||||
|
setattr(tp, attr + '_sep', f), f.setFrameShape(QFrame.HLine)
|
||||||
|
l.addWidget(f)
|
||||||
|
l.addSpacing(10)
|
||||||
|
|
||||||
|
create_template_widget(_('The title template'), 'title', _('Change the &title template'))
|
||||||
|
create_template_widget(_('The sub-title template'), 'subtitle', _('Change the &sub-title template'))
|
||||||
|
create_template_widget(_('The footer template'), 'footer', _('Change the &footer template'))
|
||||||
|
l.addStretch(2)
|
||||||
|
|
||||||
self.apply_prefs(prefs)
|
self.apply_prefs(prefs)
|
||||||
self.changed.connect(self.update_preview)
|
self.changed.connect(self.update_preview)
|
||||||
self.styles_list.itemSelectionChanged.connect(self.update_preview)
|
self.styles_list.itemSelectionChanged.connect(self.update_preview)
|
||||||
@ -283,9 +322,12 @@ class CoverSettingsWidget(QWidget):
|
|||||||
prefs[attr] = getattr(self, attr).font_family
|
prefs[attr] = getattr(self, attr).font_family
|
||||||
attr = '%s_font_size' % x
|
attr = '%s_font_size' % x
|
||||||
prefs[attr] = getattr(self, attr).value()
|
prefs[attr] = getattr(self, attr).value()
|
||||||
prefs['color_themes'] = self.custom_colors
|
prefs['color_themes'] = self.custom_colors
|
||||||
prefs['disabled_styles'] = list(self.disabled_styles)
|
prefs['disabled_styles'] = list(self.disabled_styles)
|
||||||
prefs['disabled_colors'] = list(self.disabled_colors)
|
prefs['disabled_colors'] = list(self.disabled_colors)
|
||||||
|
for x in ('title', 'subtitle', 'footer'):
|
||||||
|
x += '_template'
|
||||||
|
prefs[x] = getattr(self, x).text()
|
||||||
return prefs
|
return prefs
|
||||||
|
|
||||||
def insert_scheme(self, name, li):
|
def insert_scheme(self, name, li):
|
||||||
@ -343,6 +385,22 @@ class CoverSettingsWidget(QWidget):
|
|||||||
self.emit_changed()
|
self.emit_changed()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def change_template(self, which):
|
||||||
|
from calibre.gui2.dialogs.template_dialog import TemplateDialog
|
||||||
|
from calibre.gui2.ui import get_gui
|
||||||
|
gui = get_gui()
|
||||||
|
if gui is None:
|
||||||
|
from calibre.ebooks.metadata.book.base import field_metadata
|
||||||
|
else:
|
||||||
|
field_metadata = gui.current_db.new_api.field_metadata
|
||||||
|
attr = which + '_template'
|
||||||
|
templ = getattr(self, attr).text()
|
||||||
|
d = TemplateDialog(self, templ, mi=self.mi, fm=field_metadata)
|
||||||
|
if d.exec_() == d.Accepted:
|
||||||
|
templ = d.rule[1]
|
||||||
|
getattr(self, attr).setText(templ)
|
||||||
|
self.emit_changed()
|
||||||
|
|
||||||
def update_preview(self):
|
def update_preview(self):
|
||||||
if self.ignore_changed:
|
if self.ignore_changed:
|
||||||
return
|
return
|
||||||
|
Loading…
x
Reference in New Issue
Block a user