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