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 + + + +