From b89de1ccf1bd06ab948b4e0f8dbe93d3e014bb31 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 31 Mar 2023 10:39:57 +0530 Subject: [PATCH] Use the library broker for showing book info popups for non-current libraries Also use an icon for the external links --- imgsrc/external-link-for-dark-theme.svg | 1 + imgsrc/external-link.svg | 1 + .../images/external-link-for-dark-theme.png | Bin 0 -> 1290 bytes resources/images/external-link.png | Bin 0 -> 1290 bytes src/calibre/ebooks/metadata/book/render.py | 24 +++++++-------- src/calibre/gui2/book_details.py | 29 +++++++++--------- src/calibre/gui2/dialogs/book_info.py | 8 ++--- 7 files changed, 32 insertions(+), 31 deletions(-) create mode 100644 imgsrc/external-link-for-dark-theme.svg create mode 100644 imgsrc/external-link.svg create mode 100644 resources/images/external-link-for-dark-theme.png create mode 100644 resources/images/external-link.png 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 0000000000000000000000000000000000000000..afb19352e312ada0f74950236ec39126ddbcff2b GIT binary patch literal 1290 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD~={fzdI*C&U%V4PEuWVgLWMGyfY_ z{mbW~GRQg{2s+(Fm zI=i}iCQq3*ea6gL^EPkUx_!saU3>QK+kf!Tu@fgxoj!B+`psK+A3S{gKb5{~4z~FA3SP+xqa#nXfJ1e!sr=_4CJv&dHve`P#yhUtnQQ$Pemp7EvBaYBkbBrJg(>eob=dze;$;bz{r>oPnWKsQ zq-@mkx!OLxnHd}>(9!mc`R^RJfJ7D zXZae<1gVrwcBf320~u+-vd_IGSq|BM{c)_(?d-&J(~sGud-dKgp7~lgi}Oir)Y%=^ z5;nhfY)_SKWW63Qoo<)$!M;*vv&8+$&)@f1%6XoUFX*tI*I7IL>HFU@AAfw-3{m|l ze_ZB%k51>_-npzt4Cn9vy5NHF%KD!(nthEfKRIS@Jef~*;meY5yw?-A2bs;~vV^4H a&(c#b$RA18Z(j|}j|`r!elF{r5}E)uE1~lM literal 0 HcmV?d00001 diff --git a/resources/images/external-link.png b/resources/images/external-link.png new file mode 100644 index 0000000000000000000000000000000000000000..4bd53578af619ede933fec7c98371b79e41a75a2 GIT binary patch literal 1290 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD~={fzdI*C&U%VWnlO}ipUNDU;TH& zz#z;j3GxeOU}j-uW9Q`J;pGz$5|))$P}I=U*3s3|H!w6ZHZe7`wh4@ij!DbR$<50z zEGj9hs%~oO=-HTxckS7`Z~wtV$4;C)b^6TN>o;%Reem${ zlc&#~zj*oT^_zFUe*gV<@ZX~o3=GVCo-U3d6}R5b{v9q9C~#bS(uV2Z7(_PeRJVWo zBI?EAIPpfa$HpMxM}nXK|7V=~yd-4DZtKG{XTG+4`~CXf*UujxIwyN>=4%VbCKk>j zFX4GJ&ri+1ZOwCY-PGb@^Ft~%SzB4pWUlpF`0=Dr#}bRiL+)X_6sElU)M5X>h?gZ; z_WR@GWsWBHlkWZLG~-x4_e0IU-wN|=`~4Mzm|H`X*D+}?n51f6w`j5Qg}Ehy8jV3* zdSAo4`E5V%-my%LLGtmx>z9Nx+IX0Z7tF|PKCow*!!3mgmqj9sIi{SfUplq6=DfN8 z=lwj}_nC4`I9-q^a{d0D9G-i>Z*IuzKJmXw>~`W^sT#KEw$#!^2b^oVe^xzsX4QNk zbk6}}!A9+hMt3Eq@?7pK`VnFcURO3T?2+H9(_khbd_d|1rvfhvYXRFNCJp95#-7GC z42K*d4%~N$Vi5cPSv}#mb;57m4YBMw;ZC=!8{gi&P-dU7TiNMzE6ax(Nk*o4mxe>r z1#T4l_Z5ikImKP^=l{j>=J1=Wdww=w-^u#t2ebAJ);~Z0W>>Hp{Mi?}hRNdJ$zSTz1DzWV%D43mkS!_z+xmns=>2K;2O{yupn`~3z_hTngW zr${jR{WD-%^GA`T;%5nCnq6eWY=6;&=fbQ%ewr{c+Ic!O`3nj>6lO{JQPJr8>EB`P z3p+FpyK~!!KU&P1*7_r(@wQXVmIJ#4k7f=YwQnCc~r+N zW|wJfm3iRs^4#Ocd1w4M()Q#;L$`nK$$yd?KA!Y_c`(s-#}>{>O!J&|=6w*iyE9-yGX!bR_{N$Lq@nk;Lg)d9K@m^2d i9%MF`%My})KTA)&Ab%uTzkM~RO!IX0b6Mw<&;$UHd@un3 literal 0 HcmV?d00001 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