diff --git a/src/calibre/gui2/dialogs/template_dialog.ui b/src/calibre/gui2/dialogs/template_dialog.ui
index cb98554c12..6ad74354f2 100644
--- a/src/calibre/gui2/dialogs/template_dialog.ui
+++ b/src/calibre/gui2/dialogs/template_dialog.ui
@@ -170,9 +170,7 @@
- -
-
-
-
+
-
T&emplate:
@@ -184,20 +182,9 @@
Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter
-
- -
-
-
- Qt::Horizontal
-
-
-
- 1
- 0
-
-
-
-
+
+ -
+
-
@@ -211,15 +198,9 @@ you the value as well as all the local variables</p>
-
-
-
- QFrame::VLine
-
-
- QFrame::Raised
-
-
- 3
+
+
+ go_button
@@ -241,15 +222,9 @@ you the value as well as all the local variables</p>
-
-
-
- QFrame::VLine
-
-
- QFrame::Raised
-
-
- 3
+
+
+ go_button
@@ -303,15 +278,9 @@ you the value as well as all the local variables</p>
-
-
-
- QFrame::VLine
-
-
- QFrame::Raised
-
-
- 3
+
+
+ go_button
@@ -773,11 +742,21 @@ you the value as well as all the local variables</p>
QPushButton
+
+ FlowLayout
+ QLayout
+
+
BoxLayout
QBoxLayout
calibre/gui2/dialogs/template_dialog_box_layout.h
+
+ Separator
+ QWidget
+
+
CodeEditor
QPlainTextEdit
diff --git a/src/calibre/gui2/library/alternate_views.py b/src/calibre/gui2/library/alternate_views.py
index dc94eb7623..701d4ef847 100644
--- a/src/calibre/gui2/library/alternate_views.py
+++ b/src/calibre/gui2/library/alternate_views.py
@@ -533,9 +533,10 @@ class CoverDelegate(QStyledItemDelegate):
for i, (kind, column, rule) in enumerate(emblem_rules):
icon_name, mi = self.render_emblem(book_id, rule, i, m.cover_grid_emblem_cache, mi, db, m.formatter, m.cover_grid_template_cache)
if icon_name is not None:
- pixmap = self.cached_emblem(m.cover_grid_bitmap_cache, icon_name)
- if pixmap is not None:
- emblems.append(pixmap)
+ for one_icon in filter(None, (i.strip() for i in icon_name.split(':'))):
+ pixmap = self.cached_emblem(m.cover_grid_bitmap_cache, one_icon)
+ if pixmap is not None:
+ emblems.append(pixmap)
if marked:
emblems.insert(0, self.cached_emblem(m.cover_grid_bitmap_cache, ':marked', m.marked_icon))
if on_device:
diff --git a/src/calibre/gui2/preferences/coloring.py b/src/calibre/gui2/preferences/coloring.py
index f78274d69d..180d9922b6 100644
--- a/src/calibre/gui2/preferences/coloring.py
+++ b/src/calibre/gui2/preferences/coloring.py
@@ -6,27 +6,33 @@ __license__ = 'GPL v3'
__copyright__ = '2011, Kovid Goyal '
__docformat__ = 'restructuredtext en'
-import os, textwrap, json
+import json
+import os
+import textwrap
+from qt.core import (
+ QAbstractItemView, QAbstractListModel, QApplication, QCheckBox, QComboBox,
+ QDialog, QDialogButtonBox, QDoubleValidator, QFrame, QGridLayout, QIcon,
+ QIntValidator, QItemSelectionModel, QLabel, QLineEdit, QListView, QMenu,
+ QPalette, QPushButton, QScrollArea, QSize, QSizePolicy, QSpacerItem,
+ QStandardItem, QStandardItemModel, Qt, QToolButton, QVBoxLayout, QWidget,
+ pyqtSignal
+)
-from qt.core import (QWidget, QDialog, QLabel, QGridLayout, QComboBox, QSize,
- QLineEdit, QIntValidator, QDoubleValidator, QFrame, Qt, QIcon, QHBoxLayout,
- QScrollArea, QPushButton, QVBoxLayout, QDialogButtonBox, QToolButton, QItemSelectionModel,
- QListView, QAbstractListModel, pyqtSignal, QSizePolicy, QSpacerItem, QPalette,
- QApplication, QStandardItem, QStandardItemModel, QCheckBox, QMenu, QAbstractItemView,
- QColor, QBrush, QPixmap, QPainter)
-
-from calibre import prepare_string_for_xml, sanitize_file_name, as_unicode
+from calibre import as_unicode, prepare_string_for_xml, sanitize_file_name
from calibre.constants import config_dir
-from calibre.utils.icu import sort_key
-from calibre.gui2 import (error_dialog, choose_files, pixmap_to_data, gprefs,
- choose_save_file, open_local_file)
+from calibre.gui2 import (
+ choose_files, choose_save_file, error_dialog, gprefs, open_local_file,
+ pixmap_to_data
+)
from calibre.gui2.dialogs.template_dialog import TemplateDialog
from calibre.gui2.metadata.single_download import RichTextDelegate
-from calibre.gui2.widgets2 import ColorButton, FlowLayout
-from calibre.library.coloring import (Rule, conditionable_columns,
- displayable_columns, rule_from_template, color_row_key)
+from calibre.gui2.widgets2 import ColorButton, FlowLayout, Separator
+from calibre.library.coloring import (
+ Rule, color_row_key, conditionable_columns, displayable_columns,
+ rule_from_template
+)
+from calibre.utils.icu import lower, sort_key
from calibre.utils.localization import lang_map
-from calibre.utils.icu import lower
from polyglot.builtins import iteritems, unicode_type
all_columns_string = _('All columns')
@@ -896,33 +902,6 @@ class RulesView(QListView): # {{{
# }}}
-class Separator(QWidget): # {{{
-
- def __init__(self, parent, widget_for_height):
- QWidget.__init__(self, parent)
- self.bcol = QColor(QPalette.ColorRole.Text)
- self.update_brush()
- self.widget_for_height = widget_for_height
- self.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.MinimumExpanding)
-
- def update_brush(self):
- self.brush = QBrush(self.bcol)
- self.update()
-
- def sizeHint(self):
- return QSize(1, self.widget_for_height.height())
-
- def paintEvent(self, ev):
- painter = QPainter(self)
- # Purely subjective: shorten the line a bit to look 'better'
- r = ev.rect()
- r.setTop(r.top() + 3)
- r.setBottom(r.bottom() - 3)
- painter.fillRect(r, self.brush)
- painter.end()
-# }}}
-
-
class EditRules(QWidget): # {{{
changed = pyqtSignal()
diff --git a/src/calibre/gui2/widgets2.py b/src/calibre/gui2/widgets2.py
index cc6143e0c3..617d93c651 100644
--- a/src/calibre/gui2/widgets2.py
+++ b/src/calibre/gui2/widgets2.py
@@ -10,7 +10,7 @@ from qt.core import (
QFontInfo, QFontMetrics, QIcon, QKeySequence, QLabel, QLayout, QMenu, QMimeData,
QPalette, QPixmap, QPoint, QPushButton, QRect, QScrollArea, QSize, QSizePolicy,
QStyle, QStyledItemDelegate, Qt, QTabWidget, QTextBrowser, QToolButton, QTextCursor,
- QUndoCommand, QUndoStack, QUrl, QWidget, pyqtSignal
+ QUndoCommand, QUndoStack, QUrl, QWidget, pyqtSignal, QBrush, QPainter
)
from calibre.ebooks.metadata import rating_to_stars
@@ -440,6 +440,43 @@ class FlowLayout(QLayout): # {{{
# }}}
+class Separator(QWidget): # {{{
+
+ ''' Vertical separator lines usable in FlowLayout '''
+
+ def __init__(self, parent, widget_for_height=None):
+ '''
+ You must provide a widget in the layout either here or with setBuddy.
+ The height of the separator is computed using this widget,
+ '''
+ QWidget.__init__(self, parent)
+ self.bcol = QColor(QPalette.ColorRole.Text)
+ self.update_brush()
+ self.widget_for_height = widget_for_height
+ self.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.MinimumExpanding)
+
+ def update_brush(self):
+ self.brush = QBrush(self.bcol)
+ self.update()
+
+ def setBuddy(self, widget_for_height):
+ ''' See __init__. This is repurposed to support Qt Designer .ui files. '''
+ self.widget_for_height = widget_for_height
+
+ def sizeHint(self):
+ return QSize(1, 1 if self.widget_for_height is None else self.widget_for_height.height())
+
+ def paintEvent(self, ev):
+ painter = QPainter(self)
+ # Purely subjective: shorten the line a bit to look 'better'
+ r = ev.rect()
+ r.setTop(r.top() + 3)
+ r.setBottom(r.bottom() - 3)
+ painter.fillRect(r, self.brush)
+ painter.end()
+# }}}
+
+
class HTMLDisplay(QTextBrowser):
anchor_clicked = pyqtSignal(object)