%PDF- %PDF-
| Direktori : /usr/lib/calibre/calibre/gui2/actions/ |
| Current File : //usr/lib/calibre/calibre/gui2/actions/similar_books.py |
#!/usr/bin/env python3
__license__ = 'GPL v3'
__copyright__ = '2010, Kovid Goyal <kovid@kovidgoyal.net>'
__docformat__ = 'restructuredtext en'
from qt.core import QToolButton
from calibre.gui2.actions import InterfaceAction
from polyglot.builtins import string_or_bytes
class SimilarBooksAction(InterfaceAction):
name = 'Similar Books'
action_spec = (_('Similar books'), 'similar.png', _('Show books similar to the current book'), None)
popup_type = QToolButton.ToolButtonPopupMode.InstantPopup
action_type = 'current'
action_add_menu = True
def genesis(self):
m = self.qaction.menu()
for text, icon, target, shortcut in [
(_('Books by same author'), 'user_profile.png', 'authors', 'Alt+A'),
(_('Books in this series'), 'books_in_series.png', 'series',
'Alt+Shift+S'),
(_('Books by this publisher'), 'publisher.png', 'publisher', 'Alt+P'),
(_('Books with the same tags'), 'tags.png', 'tags', 'Alt+T'),]:
ac = self.create_action(spec=(text, icon, None, shortcut),
attr=target)
ac.setObjectName(target)
m.addAction(ac)
connect_lambda(ac.triggered, self, lambda self: self.show_similar_books(self.gui.sender().objectName()))
self.qaction.setMenu(m)
def show_similar_books(self, typ, *args):
idx = self.gui.library_view.currentIndex()
if not idx.isValid():
return
db = idx.model().db
row = idx.row()
# Get the parameters for this search
col = db.prefs['similar_' + typ + '_search_key']
match = db.prefs['similar_' + typ + '_match_kind']
if match == 'match_all':
join = ' and '
else:
join = ' or '
# Get all the data for the current record
mi = db.get_metadata(row)
# Get the definitive field name to use for this search. If the field
# is a grouped search term, the function returns the list of fields that
# are to be searched, otherwise it returns the field name.
loc = db.field_metadata.search_term_to_field_key(icu_lower(col))
if isinstance(loc, list):
# Grouped search terms are a list of fields. Get all the values,
# pruning duplicates
val = set()
for f in loc:
v = mi.get(f, None)
if not v:
continue
if isinstance(v, list):
val.update(v)
else:
val.add(v)
else:
# Get the value of the requested field. Can be a list or a simple val
val = mi.get(col, None)
if not val:
return
if isinstance(val, string_or_bytes):
val = [val]
search = [col + ':"='+t.replace('"', '\\"')+'"' for t in val]
if search:
self.gui.search.set_search_string(join.join(search),
store_in_history=True)