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