From 6e9f48b1758cd5f988402bec8ee0a8b82ebd9d19 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 2 Dec 2013 19:29:53 +0530 Subject: [PATCH] Allow customizing the text that appears below covers in the cover grid You can now show any metadata field below the covers in the cover grid view, not just title. To change the displayed field go to Preferences->Look & Feel->Cover Grid. --- src/calibre/db/backend.py | 1 + src/calibre/gui2/library/alternate_views.py | 22 ++++++++- src/calibre/gui2/preferences/look_feel.py | 5 ++ src/calibre/gui2/preferences/look_feel.ui | 53 +++++++++++++++++++-- 4 files changed, 76 insertions(+), 5 deletions(-) diff --git a/src/calibre/db/backend.py b/src/calibre/db/backend.py index 45ea9b05a4..bb8c23e3e8 100644 --- a/src/calibre/db/backend.py +++ b/src/calibre/db/backend.py @@ -428,6 +428,7 @@ class DB(object): defs['virtual_lib_on_startup'] = defs['cs_virtual_lib_on_startup'] = '' defs['virt_libs_hidden'] = defs['virt_libs_order'] = () defs['update_all_last_mod_dates_on_start'] = False + defs['field_under_covers_in_grid'] = 'title' # Migrate the bool tristate tweak defs['bools_are_tristate'] = \ diff --git a/src/calibre/gui2/library/alternate_views.py b/src/calibre/gui2/library/alternate_views.py index 44c361e129..56315822f6 100644 --- a/src/calibre/gui2/library/alternate_views.py +++ b/src/calibre/gui2/library/alternate_views.py @@ -20,7 +20,8 @@ from PyQt4.Qt import ( QPropertyAnimation, QEasingCurve, pyqtSlot, QHelpEvent, QAbstractItemView, QStyleOptionViewItem, QToolTip, QByteArray, QBuffer, QBrush) -from calibre import fit_image, prints, prepare_string_for_xml +from calibre import fit_image, prints, prepare_string_for_xml, human_readable +from calibre.constants import DEBUG from calibre.ebooks.metadata import fmt_sidx from calibre.utils import join_with_timeout from calibre.gui2 import gprefs, config @@ -369,6 +370,23 @@ class CoverDelegate(QStyledItemDelegate): def sizeHint(self, option, index): return self.item_size + def render_field(self, db, book_id): + try: + field = db.pref('field_under_covers_in_grid', 'title') + if field == 'size': + ans = human_readable(db.field_for(field, book_id, default_value=0)) + else: + mi = db.get_proxy_metadata(book_id) + display_name, ans, val, fm = mi.format_field_extended(field) + if fm and fm['datatype'] == 'rating': + ans = u'\u2605' * int(val/2.0) + return unicode(ans) + except Exception: + if DEBUG: + import traceback + traceback.print_exc() + return '' + def paint(self, painter, option, index): QStyledItemDelegate.paint(self, painter, option, QModelIndex()) # draw the hover and selection highlights m = index.model() @@ -418,7 +436,7 @@ class CoverDelegate(QStyledItemDelegate): rect = trect rect.setTop(rect.bottom() - self.title_height + 5) painter.setRenderHint(QPainter.TextAntialiasing, True) - title = db.field_for('title', book_id, default_value='') + title = self.render_field(db, book_id) metrics = painter.fontMetrics() painter.drawText(rect, Qt.AlignCenter|Qt.TextSingleLine, metrics.elidedText(title, Qt.ElideRight, rect.width())) diff --git a/src/calibre/gui2/preferences/look_feel.py b/src/calibre/gui2/preferences/look_feel.py index 9e26db4563..e886cf8dec 100644 --- a/src/calibre/gui2/preferences/look_feel.py +++ b/src/calibre/gui2/preferences/look_feel.py @@ -212,6 +212,11 @@ class ConfigWidget(ConfigWidgetBase, Ui_Form): r('categories_using_hierarchy', db.prefs, setting=CommaSeparatedList, choices=sorted(list(choices), key=sort_key)) + fm = db.field_metadata + choices = sorted(((fm[k]['name'], k) for k in fm.displayable_field_keys() if fm[k]['name']), + key=lambda x:sort_key(x[0])) + r('field_under_covers_in_grid', db.prefs, choices=choices) + self.current_font = self.initial_font = None self.change_font_button.clicked.connect(self.change_font) diff --git a/src/calibre/gui2/preferences/look_feel.ui b/src/calibre/gui2/preferences/look_feel.ui index af09d6d50d..c1153d49b3 100644 --- a/src/calibre/gui2/preferences/look_feel.ui +++ b/src/calibre/gui2/preferences/look_feel.ui @@ -7,7 +7,7 @@ 0 0 820 - 519 + 546 @@ -261,10 +261,40 @@ - Show the book &title below the cover + Show a field (such as title) &under the covers + + + + + + &Field to show under the covers: + + + opt_field_under_covers_in_grid + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + @@ -926,5 +956,22 @@ a few top-level elements. - + + + opt_cover_grid_show_title + toggled(bool) + opt_field_under_covers_in_grid + setEnabled(bool) + + + 75 + 102 + + + 289 + 118 + + + +