Allow right clicking on an author in Book Details

Allow right clicking on an author in Book Details to manage that author,
i.e. change the author name, sort value or link. Fixes #1186192 [Book Details Author right click - no options if file](https://bugs.launchpad.net/calibre/+bug/1186192)
This commit is contained in:
Kovid Goyal 2013-05-31 18:55:53 +05:30
parent 2692326607
commit d930de8753
3 changed files with 37 additions and 18 deletions

View file

@ -28,7 +28,7 @@
from calibre.utils.localization import calibre_langcode_to_name
from calibre.utils.config import tweaks
def render_html(mi, css, vertical, widget, all_fields=False): # {{{
def render_html(mi, css, vertical, widget, all_fields=False): # {{{
table = render_data(mi, all_fields=all_fields,
use_roman_numbers=config['use_roman_numerals_for_series_number'])
@ -158,14 +158,15 @@ def render_data(mi, use_roman_numbers=True, all_fields=False):
if isdevice:
durl = url
if durl.startswith('mtp:::'):
durl = ':::'.join( (durl.split(':::'))[2:] )
durl = ':::'.join((durl.split(':::'))[2:])
extra = '<br><span style="font-size:smaller">%s</span>'%(
prepare_string_for_xml(durl))
link = u'<a href="%s:%s" title="%s">%s</a>%s' % (scheme, url,
prepare_string_for_xml(path, True), pathstr, extra)
ans.append((field, u'<td class="title">%s</td><td>%s</td>'%(name, link)))
elif field == 'formats':
if isdevice: continue
if isdevice:
continue
fmts = [u'<a href="format:%s:%s">%s</a>' % (mi.id, x, x) for x
in mi.formats]
ans.append((field, u'<td class="title">%s</td><td>%s</td>'%(name,
@ -195,7 +196,7 @@ def render_data(mi, use_roman_numbers=True, all_fields=False):
gprefs.get('default_author_link'), vals, '', vals)
if link:
link = prepare_string_for_xml(link)
authors.append(u'<a href="%s">%s</a>'%(link, aut))
authors.append(u'<a calibre-data="authors" href="%s">%s</a>'%(link, aut))
else:
authors.append(aut)
ans.append((field, u'<td class="title">%s</td><td>%s</td>'%(name,
@ -246,7 +247,7 @@ def classname(field):
# }}}
class CoverView(QWidget): # {{{
class CoverView(QWidget): # {{{
cover_changed = pyqtSignal(object, object)
cover_removed = pyqtSignal(object)
@ -314,11 +315,13 @@ def paintEvent(self, event):
canvas_size = self.rect()
width = self.current_pixmap_size.width()
extrax = canvas_size.width() - width
if extrax < 0: extrax = 0
if extrax < 0:
extrax = 0
x = int(extrax/2.)
height = self.current_pixmap_size.height()
extray = canvas_size.height() - height
if extray < 0: extray = 0
if extray < 0:
extray = 0
y = int(extray/2.)
target = QRect(x, y, width, height)
p = QPainter(self)
@ -407,6 +410,7 @@ class BookInfo(QWebView):
save_format = pyqtSignal(int, object)
restore_format = pyqtSignal(int, object)
copy_link = pyqtSignal(object)
manage_author = pyqtSignal(object)
def __init__(self, vertical, parent=None):
QWebView.__init__(self, parent)
@ -420,7 +424,10 @@ def __init__(self, vertical, parent=None):
palette.setBrush(QPalette.Base, Qt.transparent)
self.page().setPalette(palette)
self.css = P('templates/book_details.css', data=True).decode('utf-8')
for x, icon in [('remove_format', 'trash.png'), ('save_format', 'save.png'), ('restore_format', 'edit-undo.png'), ('copy_link','edit-copy.png')]:
for x, icon in [
('remove_format', 'trash.png'), ('save_format', 'save.png'),
('restore_format', 'edit-undo.png'), ('copy_link','edit-copy.png'),
('manage_author', 'user_profile.png')]:
ac = QAction(QIcon(I(icon)), '', self)
ac.current_fmt = None
ac.current_url = None
@ -448,6 +455,9 @@ def restore_format_triggerred(self):
def copy_link_triggerred(self):
self.context_action_triggered('copy_link')
def manage_author_triggerred(self):
self.manage_author.emit(self.manage_author_action.current_fmt)
def link_activated(self, link):
self._link_clicked = True
if unicode(link.scheme()) in ('http', 'https'):
@ -483,14 +493,21 @@ def contextMenuEvent(self, ev):
if action is not ca:
menu.removeAction(action)
if not r.isNull():
if url.startswith('http'):
if url.startswith('http') or url.startswith('file:'):
el = r.linkElement()
author = el.toPlainText() if unicode(el.attribute('calibre-data')) == u'authors' else None
for a, t in [('copy', _('&Copy Link')),
]:
ac = getattr(self, '%s_link_action'%a)
ac.current_url = url
ac.setText(t)
menu.addAction(ac)
if author is not None:
ac = self.manage_author_action
ac.current_fmt = author
ac.setText(_('Manage %s') % author)
menu.addAction(ac)
if url.startswith('format:'):
parts = url.split(':')
try:
@ -515,7 +532,7 @@ def contextMenuEvent(self, ev):
# }}}
class DetailsLayout(QLayout): # {{{
class DetailsLayout(QLayout): # {{{
def __init__(self, vertical, parent):
QLayout.__init__(self, parent)
@ -558,7 +575,8 @@ def setGeometry(self, r):
self.do_layout(r)
def cover_height(self, r):
if not self._children[0].widget().isVisible(): return 0
if not self._children[0].widget().isVisible():
return 0
mh = min(int(r.height()/2.), int(4/3. * r.width())+1)
try:
ph = self._children[0].widget().pixmap.height()
@ -569,7 +587,8 @@ def cover_height(self, r):
return mh
def cover_width(self, r):
if not self._children[0].widget().isVisible(): return 0
if not self._children[0].widget().isVisible():
return 0
mw = 1 + int(3/4. * r.height())
try:
pw = self._children[0].widget().pixmap.width()
@ -579,7 +598,6 @@ def cover_width(self, r):
mw = min(mw, pw)
return mw
def do_layout(self, rect):
if len(self._children) != 2:
return
@ -603,7 +621,7 @@ def do_layout(self, rect):
# }}}
class BookDetails(QWidget): # {{{
class BookDetails(QWidget): # {{{
show_book_info = pyqtSignal()
open_containing_folder = pyqtSignal(int)
@ -617,6 +635,7 @@ class BookDetails(QWidget): # {{{
cover_changed = pyqtSignal(object, object)
cover_removed = pyqtSignal(object)
view_device_book = pyqtSignal(object)
manage_author = pyqtSignal(object)
# Drag 'n drop {{{
DROPABBLE_EXTENSIONS = IMAGE_EXTENSIONS+BOOK_EXTENSIONS
@ -659,7 +678,6 @@ def dropEvent(self, event):
self.remote_file_dropped.emit(urls[0], filenames[0])
event.accept()
def dragMoveEvent(self, event):
event.acceptProposedAction()
@ -683,6 +701,7 @@ def __init__(self, vertical, parent=None):
self.book_info.save_format.connect(self.save_specific_format)
self.book_info.restore_format.connect(self.restore_specific_format)
self.book_info.copy_link.connect(self.copy_link)
self.book_info.manage_author.connect(self.manage_author)
self.setCursor(Qt.PointingHandCursor)
def handle_click(self, link):
@ -701,7 +720,6 @@ def handle_click(self, link):
import traceback
traceback.print_exc()
def mouseDoubleClickEvent(self, ev):
ev.accept()
self.show_book_info.emit()

View file

@ -71,7 +71,7 @@ def __init__(self, parent, db, id_to_select, select_sort, select_link):
self.table.setItem(row, 0, aut)
self.table.setItem(row, 1, sort)
self.table.setItem(row, 2, link)
if id == id_to_select:
if id_to_select in (id, author):
if select_sort:
select_item = sort
elif select_link:

View file

@ -305,6 +305,7 @@ def finalize_layout(self):
type=Qt.QueuedConnection)
self.book_details.view_device_book.connect(
self.iactions['View'].view_device_book)
self.book_details.manage_author.connect(lambda author:self.do_author_sort_edit(self, author, select_sort=False, select_link=False))
m = self.library_view.model()
if m.rowCount(None) > 0: