Add a tweak to control how author names are displayed in the Tag Browser

This commit is contained in:
Kovid Goyal 2010-12-18 10:42:03 -07:00
commit ea03a4c6f6
4 changed files with 44 additions and 21 deletions

View File

@ -41,6 +41,20 @@ series_index_auto_increment = 'next'
# selecting 'manage authors', and pressing 'Recalculate all author sort values'.
author_sort_copy_method = 'invert'
# Set which author field to display in the tags pane (the list of authors,
# series, publishers etc on the left hand side). The choices are author and
# author_sort. This tweak affects only the tags pane, and only what is displayed
# under the authors category. Please note that if you set this to author_sort,
# it is very possible to see duplicate names in the list becasue although it is
# guaranteed that author names are unique, there is no such guarantee for
# author_sort values. Showing duplicates won't break anything, but it could
# lead to some confusion. When using 'author_sort', the tooltip will show the
# author's name.
# Examples:
# tags_pane_use_field_for_author_name = 'author'
# tags_pane_use_field_for_author_name = 'author_sort'
tags_pane_use_field_for_author_name = 'author'
# Set whether boolean custom columns are two- or three-valued.
# Two-values for true booleans

View File

@ -18,6 +18,7 @@ from PyQt4.Qt import Qt, QTreeView, QApplication, pyqtSignal, \
from calibre.ebooks.metadata import title_sort
from calibre.gui2 import config, NONE
from calibre.library.field_metadata import TagsIcons, category_icon_map
from calibre.utils.config import tweaks
from calibre.utils.icu import sort_key
from calibre.utils.search_query_parser import saved_searches
from calibre.gui2 import error_dialog
@ -409,17 +410,31 @@ class TagTreeItem(object): # {{{
return NONE
def tag_data(self, role):
if role == Qt.DisplayRole:
if self.tag.count == 0:
return QVariant('%s'%(self.tag.name))
tag = self.tag
if tag.category == 'authors' and \
tweaks['tags_pane_use_field_for_author_name'] == 'author_sort':
name = tag.sort
tt_author = True
else:
return QVariant('[%d] %s'%(self.tag.count, self.tag.name))
name = tag.name
tt_author = False
if role == Qt.DisplayRole:
if tag.count == 0:
return QVariant('%s'%(name))
else:
return QVariant('[%d] %s'%(tag.count, name))
if role == Qt.EditRole:
return QVariant(self.tag.name)
return QVariant(tag.name)
if role == Qt.DecorationRole:
return self.icon_state_map[self.tag.state]
if role == Qt.ToolTipRole and self.tag.tooltip is not None:
return QVariant(self.tag.tooltip)
return self.icon_state_map[tag.state]
if role == Qt.ToolTipRole:
if tt_author:
if tag.tooltip is not None:
return QVariant('(%s) %s'%(tag.name, tag.tooltip))
else:
return QVariant(tag.name)
if tag.tooltip is not None:
return QVariant(tag.tooltip)
return NONE
def toggle(self):

View File

@ -1128,6 +1128,10 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
for l in list:
(id, val, sort_val) = (l[0], l[1], l[2])
tids[category][val] = (id, sort_val)
elif cat['datatype'] == 'rating':
for l in list:
(id, val) = (l[0], l[1])
tids[category][val] = (id, '{0:05.2f}'.format(val))
else:
for l in list:
(id, val) = (l[0], l[1])
@ -1256,12 +1260,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
# sort the list
if sort == 'name':
def get_sort_key(x):
sk = x.s
if isinstance(sk, unicode):
sk = sort_key(sk)
return sk
kf = get_sort_key
kf = lambda x :sort_key(x.s)
reverse=False
elif sort == 'popularity':
kf = lambda x: x.c

View File

@ -373,18 +373,13 @@ class BrowseServer(object):
script='toplevel();', main=main)
def browse_sort_categories(self, items, sort):
def keyg(x):
x = getattr(x, 'sort', x.name)
if isinstance(x, unicode):
return sort_key(x)
return x
if sort not in ('rating', 'name', 'popularity'):
sort = 'name'
items.sort(key=lambda x: sort_key(getattr(x, 'sort', x.name)))
if sort == 'popularity':
items.sort(key=operator.attrgetter('count'), reverse=True)
elif sort == 'rating':
items.sort(key=operator.attrgetter('avg_rating'), reverse=True)
else:
items.sort(key=keyg)
return sort
def browse_category(self, category, sort):