diff --git a/imgsrc/external-link-for-dark-theme.svg b/imgsrc/external-link-for-dark-theme.svg new file mode 100644 index 0000000000..433c2264dc --- /dev/null +++ b/imgsrc/external-link-for-dark-theme.svg @@ -0,0 +1 @@ + diff --git a/imgsrc/external-link.svg b/imgsrc/external-link.svg new file mode 100644 index 0000000000..6ffb2e7475 --- /dev/null +++ b/imgsrc/external-link.svg @@ -0,0 +1 @@ + diff --git a/resources/images/external-link-for-dark-theme.png b/resources/images/external-link-for-dark-theme.png new file mode 100644 index 0000000000..afb19352e3 Binary files /dev/null and b/resources/images/external-link-for-dark-theme.png differ diff --git a/resources/images/external-link.png b/resources/images/external-link.png new file mode 100644 index 0000000000..4bd53578af Binary files /dev/null and b/resources/images/external-link.png differ diff --git a/src/calibre/ebooks/metadata/book/render.py b/src/calibre/ebooks/metadata/book/render.py index 432be82ad4..ec9d71a28d 100644 --- a/src/calibre/ebooks/metadata/book/render.py +++ b/src/calibre/ebooks/metadata/book/render.py @@ -89,25 +89,25 @@ def mi_to_html( mi, field_list=None, default_author_link=None, use_roman_numbers=True, rating_font='Liberation Serif', rtl=False, comments_heading_pos='hide', - for_qt=False, vertical_fields=() + for_qt=False, vertical_fields=(), show_links=True, ): - show_links = not hasattr(mi, '_bd_dbwref') - + link_markup = '↗️' + if for_qt: + link_markup = '' def get_link_map(column): - if not show_links: - return {} try: return mi.link_maps[column] - except (KeyError, ValueError): - return {column:{}} + except Exception: + return {} def add_other_link(field, field_value): - link = get_link_map(field).get(field_value, None) - if link: - return (' %s'%(_('Click to open {}').format(link), link, _('(item link)'))) - else: - return '' + if show_links: + link = get_link_map(field).get(field_value) + if link: + link = prepare_string_for_xml(link, True) + return ' {2}'.format(_('Click to open'), link, link_markup) + return '' if field_list is None: field_list = get_field_list(mi) diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py index f39fbf5b12..b567c86d50 100644 --- a/src/calibre/gui2/book_details.py +++ b/src/calibre/gui2/book_details.py @@ -41,14 +41,18 @@ from polyglot.binary import from_hex_bytes InternetSearch = namedtuple('InternetSearch', 'author where') +def db_for_mi(mi): + from calibre.gui2.ui import get_gui + lp = getattr(mi, 'external_library_path', None) + if lp: + return get_gui().library_broker.get_library(lp), True + return get_gui().current_db, False + + def set_html(mi, html, text_browser): - if hasattr(mi, '_bd_dbwref') and mi._bd_dbwref is not None: - db = mi._bd_dbwref - else: - from calibre.gui2.ui import get_gui - db = get_gui().current_db book_id = getattr(mi, 'id', None) search_paths = [] + db, _ = db_for_mi(mi) if db and book_id is not None: path = db.abspath(book_id, index_is_id=True) if path: @@ -209,18 +213,15 @@ def comments_pat(): def render_html(mi, vertical, widget, all_fields=False, render_data_func=None, pref_name='book_display_fields', pref_value=None): # {{{ - if hasattr(mi, '_bd_dbwref') and mi._bd_dbwref is not None: - db = mi._bd_dbwref - else: - from calibre.gui2.ui import get_gui - db = get_gui().current_db + db, is_external = db_for_mi(mi) + show_links = not is_external func = render_data_func or partial(render_data, vertical_fields=db.prefs.get('book_details_vertical_categories') or ()) try: - table, comment_fields = func(mi, all_fields=all_fields, + table, comment_fields = func(mi, all_fields=all_fields, show_links=show_links, use_roman_numbers=config['use_roman_numerals_for_series_number'], pref_name=pref_name) except TypeError: - table, comment_fields = func(mi, all_fields=all_fields, + table, comment_fields = func(mi, all_fields=all_fields, show_links=show_links, use_roman_numbers=config['use_roman_numerals_for_series_number']) def color_to_string(col): @@ -278,7 +279,7 @@ def get_field_list(fm, use_defaults=False, pref_name='book_display_fields', mi=N def render_data(mi, use_roman_numbers=True, all_fields=False, pref_name='book_display_fields', - vertical_fields=()): + vertical_fields=(), show_links=True): field_list = get_field_list(getattr(mi, 'field_metadata', field_metadata), pref_name=pref_name, mi=mi) field_list = [(x, all_fields or display) for x, display in field_list] @@ -286,7 +287,7 @@ def render_data(mi, use_roman_numbers=True, all_fields=False, pref_name='book_di mi, field_list=field_list, use_roman_numbers=use_roman_numbers, rtl=is_rtl(), rating_font=rating_font(), default_author_link=default_author_link(), comments_heading_pos=gprefs['book_details_comments_heading_pos'], for_qt=True, - vertical_fields=vertical_fields + vertical_fields=vertical_fields, show_links=show_links ) # }}} diff --git a/src/calibre/gui2/dialogs/book_info.py b/src/calibre/gui2/dialogs/book_info.py index e205a21119..c56ec17900 100644 --- a/src/calibre/gui2/dialogs/book_info.py +++ b/src/calibre/gui2/dialogs/book_info.py @@ -3,7 +3,6 @@ import textwrap -import weakref from qt.core import ( QAction, QApplication, QBrush, QCheckBox, QDialog, QDialogButtonBox, QGridLayout, @@ -201,13 +200,12 @@ class BookInfo(QDialog): self.slave_connected = False if library_path is not None: self.view = None - from calibre.db.legacy import LibraryDatabase - db = LibraryDatabase(library_path, read_only=True, is_second_db=True) + db = get_gui().library_broker.get_library(library_path) if book_id is None: ids = db.new_api.search(query) if len(ids) == 0: raise ValueError(_('Query "{}" found no books').format(query)) - book_id = sorted([i for i in ids])[0] + book_id = sorted(ids)[0] if not db.new_api.has_id(book_id): raise ValueError(_("Book {} doesn't exist").format(book_id)) mi = db.new_api.get_metadata(book_id, get_cover=False) @@ -216,7 +214,7 @@ class BookInfo(QDialog): mi.format_files = dict() mi.formats = list() mi.marked = '' - mi._bd_dbwref = weakref.proxy(db) + mi.external_library_path = library_path self.refresh(row, mi) else: self.view = view