mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Fix the icon not being updated if notes are changed from within book details.
While fixing this I found other places with both notes and links weren't refreshed in book details.
This commit is contained in:
parent
071145e70c
commit
f099932882
@ -68,6 +68,10 @@ def search_action_with_data(search_term, value, book_id, field=None, **k):
|
|||||||
return search_action(search_term, value, field=field, book_id=book_id, **k)
|
return search_action(search_term, value, field=field, book_id=book_id, **k)
|
||||||
|
|
||||||
|
|
||||||
|
def notes_action(**keys):
|
||||||
|
return 'notes:' + as_hex_unicode(json_dumps(keys))
|
||||||
|
|
||||||
|
|
||||||
DEFAULT_AUTHOR_LINK = f'search-{DEFAULT_AUTHOR_SOURCE}'
|
DEFAULT_AUTHOR_LINK = f'search-{DEFAULT_AUTHOR_SOURCE}'
|
||||||
|
|
||||||
|
|
||||||
@ -128,7 +132,9 @@ def mi_to_html(
|
|||||||
link = ''
|
link = ''
|
||||||
if field_value in all_notes.get(field, set()):
|
if field_value in all_notes.get(field, set()):
|
||||||
note = ' <a title="{0}" href="{1}">{2}</a>'.format(_('Click to open note'),
|
note = ' <a title="{0}" href="{1}">{2}</a>'.format(_('Click to open note'),
|
||||||
action('note', field=field, value=field_value), note_markup)
|
notes_action(field=field, value=field_value,
|
||||||
|
item_id=all_notes.get(field).get(field_value)),
|
||||||
|
note_markup)
|
||||||
else:
|
else:
|
||||||
note = ''
|
note = ''
|
||||||
return link + note
|
return link + note
|
||||||
|
@ -179,7 +179,8 @@ def add_edit_notes_action(menu, book_info, field, value):
|
|||||||
gui = get_gui()
|
gui = get_gui()
|
||||||
from calibre.gui2.dialogs.edit_category_notes import EditNoteDialog
|
from calibre.gui2.dialogs.edit_category_notes import EditNoteDialog
|
||||||
d = EditNoteDialog(field, item_id, gui.current_db.new_api, parent=book_info)
|
d = EditNoteDialog(field, item_id, gui.current_db.new_api, parent=book_info)
|
||||||
d.exec()
|
if d.exec() == QDialog.DialogCode.Accepted:
|
||||||
|
gui.do_field_item_value_changed()
|
||||||
ac = menu.addAction(_('Edit notes for {}').format(escape_for_menu(value)))
|
ac = menu.addAction(_('Edit notes for {}').format(escape_for_menu(value)))
|
||||||
ac.triggered.connect(edit_note)
|
ac.triggered.connect(edit_note)
|
||||||
ac.setIcon(QIcon.ic('edit_input.png'))
|
ac.setIcon(QIcon.ic('edit_input.png'))
|
||||||
@ -321,8 +322,8 @@ def render_data(mi, use_roman_numbers=True, all_fields=False, pref_name='book_di
|
|||||||
field_list = [(x, all_fields or display) for x, display in field_list]
|
field_list = [(x, all_fields or display) for x, display in field_list]
|
||||||
db, _ = db_for_mi(mi)
|
db, _ = db_for_mi(mi)
|
||||||
db = db.new_api
|
db = db.new_api
|
||||||
all_notes = db.get_all_items_that_have_notes()
|
an = db.get_all_items_that_have_notes()
|
||||||
all_notes = {fld: {db.get_item_name(fld, id_) for id_ in all_notes[fld]} for fld in all_notes.keys()}
|
all_notes = {fld: {db.get_item_name(fld, id_):id_ for id_ in an[fld]} for fld in an.keys()}
|
||||||
return mi_to_html(
|
return mi_to_html(
|
||||||
mi, field_list=field_list, use_roman_numbers=use_roman_numbers, rtl=is_rtl(),
|
mi, field_list=field_list, use_roman_numbers=use_roman_numbers, rtl=is_rtl(),
|
||||||
rating_font=rating_font(), default_author_link=default_author_link(),
|
rating_font=rating_font(), default_author_link=default_author_link(),
|
||||||
@ -577,6 +578,11 @@ def details_context_menu_event(view, ev, book_info, add_popup_action=False, edit
|
|||||||
create_copy_links(copy_menu, data)
|
create_copy_links(copy_menu, data)
|
||||||
copy_links_added = True
|
copy_links_added = True
|
||||||
reindex_fmt_added = 'reindex_fmt_added' in data
|
reindex_fmt_added = 'reindex_fmt_added' in data
|
||||||
|
elif url and url.startswith('notes:'):
|
||||||
|
copy_links_added = True
|
||||||
|
search_internet_added = True
|
||||||
|
data = json_loads(from_hex_bytes(url.split(':', 1)[1]))
|
||||||
|
add_edit_notes_action(menu, view, data['field'], data['value'])
|
||||||
elif url and not url.startswith('#'):
|
elif url and not url.startswith('#'):
|
||||||
ac = book_info.copy_link_action
|
ac = book_info.copy_link_action
|
||||||
ac.current_url = url
|
ac.current_url = url
|
||||||
@ -1296,14 +1302,6 @@ class BookDetails(DetailsLayout): # {{{
|
|||||||
if dt == 'search':
|
if dt == 'search':
|
||||||
field = data.get('field')
|
field = data.get('field')
|
||||||
search_term(data['term'], data['value'])
|
search_term(data['term'], data['value'])
|
||||||
elif dt == 'note':
|
|
||||||
field = data.get('field')
|
|
||||||
# It shouldn't be possible for the field to be invalid or the
|
|
||||||
# note not to exist, but ...
|
|
||||||
if field and db.field_supports_notes(field):
|
|
||||||
item_id = db.get_item_id(field, data['value'])
|
|
||||||
if item_id is not None and db.notes_for(field, item_id):
|
|
||||||
return self.show_notes(field, item_id)
|
|
||||||
elif dt == 'author':
|
elif dt == 'author':
|
||||||
url = data['url']
|
url = data['url']
|
||||||
if url == 'calibre':
|
if url == 'calibre':
|
||||||
@ -1322,6 +1320,15 @@ class BookDetails(DetailsLayout): # {{{
|
|||||||
self.open_data_folder.emit(int(data['loc']))
|
self.open_data_folder.emit(int(data['loc']))
|
||||||
elif dt == 'devpath':
|
elif dt == 'devpath':
|
||||||
self.view_device_book.emit(data['loc'])
|
self.view_device_book.emit(data['loc'])
|
||||||
|
elif typ == 'notes':
|
||||||
|
data = json_loads(from_hex_bytes(val))
|
||||||
|
field = data.get('field')
|
||||||
|
# It shouldn't be possible for the field to be invalid or the
|
||||||
|
# note not to exist, but ...
|
||||||
|
if field and db.field_supports_notes(field):
|
||||||
|
item_id = data['item_id']
|
||||||
|
if item_id is not None and db.notes_for(field, item_id):
|
||||||
|
return self.show_notes(field, item_id)
|
||||||
else:
|
else:
|
||||||
browse(link)
|
browse(link)
|
||||||
|
|
||||||
|
@ -124,6 +124,10 @@ class ShowNoteDialog(Dialog):
|
|||||||
def edit(self):
|
def edit(self):
|
||||||
d = EditNoteDialog(self.field, self.item_id, self.db, self)
|
d = EditNoteDialog(self.field, self.item_id, self.db, self)
|
||||||
if d.exec() == QDialog.DialogCode.Accepted:
|
if d.exec() == QDialog.DialogCode.Accepted:
|
||||||
|
# Tell the rest of calibre that the note has changed
|
||||||
|
gui = get_gui()
|
||||||
|
if gui is not None:
|
||||||
|
gui.do_field_item_value_changed()
|
||||||
self.refresh()
|
self.refresh()
|
||||||
|
|
||||||
def find_books(self):
|
def find_books(self):
|
||||||
|
@ -88,7 +88,7 @@ class TagBrowserMixin: # {{{
|
|||||||
self.tags_view.saved_search_edit.connect(self.do_saved_search_edit)
|
self.tags_view.saved_search_edit.connect(self.do_saved_search_edit)
|
||||||
self.tags_view.rebuild_saved_searches.connect(self.do_rebuild_saved_searches)
|
self.tags_view.rebuild_saved_searches.connect(self.do_rebuild_saved_searches)
|
||||||
self.tags_view.author_sort_edit.connect(self.do_author_sort_edit)
|
self.tags_view.author_sort_edit.connect(self.do_author_sort_edit)
|
||||||
self.tags_view.tag_item_renamed.connect(self.do_tag_item_renamed)
|
self.tags_view.tag_item_renamed.connect(self.do_field_item_value_changed)
|
||||||
self.tags_view.search_item_renamed.connect(self.saved_searches_changed)
|
self.tags_view.search_item_renamed.connect(self.saved_searches_changed)
|
||||||
self.tags_view.drag_drop_finished.connect(self.drag_drop_finished)
|
self.tags_view.drag_drop_finished.connect(self.drag_drop_finished)
|
||||||
self.tags_view.restriction_error.connect(self.do_restriction_error,
|
self.tags_view.restriction_error.connect(self.do_restriction_error,
|
||||||
@ -321,7 +321,7 @@ class TagBrowserMixin: # {{{
|
|||||||
db.new_api.set_link_map(category, d.links)
|
db.new_api.set_link_map(category, d.links)
|
||||||
|
|
||||||
# Clean up the library view
|
# Clean up the library view
|
||||||
self.do_tag_item_renamed()
|
self.do_field_item_value_changed()
|
||||||
self.tags_view.recount()
|
self.tags_view.recount()
|
||||||
|
|
||||||
def do_tag_item_delete(self, category, item_id, orig_name,
|
def do_tag_item_delete(self, category, item_id, orig_name,
|
||||||
@ -373,7 +373,7 @@ class TagBrowserMixin: # {{{
|
|||||||
m.delete_item_from_all_user_categories(orig_name, category)
|
m.delete_item_from_all_user_categories(orig_name, category)
|
||||||
|
|
||||||
# Clean up the library view
|
# Clean up the library view
|
||||||
self.do_tag_item_renamed()
|
self.do_field_item_value_changed()
|
||||||
self.tags_view.recount()
|
self.tags_view.recount()
|
||||||
|
|
||||||
def apply_tag_to_selected(self, field_name, item_name, remove):
|
def apply_tag_to_selected(self, field_name, item_name, remove):
|
||||||
@ -451,7 +451,13 @@ class TagBrowserMixin: # {{{
|
|||||||
d.exec()
|
d.exec()
|
||||||
|
|
||||||
def do_tag_item_renamed(self):
|
def do_tag_item_renamed(self):
|
||||||
# Clean up library view and search
|
# The method name was changed. Keep the old one here for compatibility,
|
||||||
|
# in case some plugin uses it.
|
||||||
|
self.do_field_item_value_changed()
|
||||||
|
|
||||||
|
def do_field_item_value_changed(self):
|
||||||
|
# Clean up library view and search, which also cleans up book details
|
||||||
|
|
||||||
# get information to redo the selection
|
# get information to redo the selection
|
||||||
rows = [r.row() for r in
|
rows = [r.row() for r in
|
||||||
self.library_view.selectionModel().selectedRows()]
|
self.library_view.selectionModel().selectedRows()]
|
||||||
@ -495,6 +501,7 @@ class TagBrowserMixin: # {{{
|
|||||||
sort_map = {id_map.get(author_id, author_id):new_sort for author_id, old_author, new_author, new_sort, new_link in editor.result}
|
sort_map = {id_map.get(author_id, author_id):new_sort for author_id, old_author, new_author, new_sort, new_link in editor.result}
|
||||||
affected_books |= db.set_sort_for_authors(sort_map)
|
affected_books |= db.set_sort_for_authors(sort_map)
|
||||||
self.library_view.model().refresh_ids(affected_books, current_row=self.library_view.currentIndex().row())
|
self.library_view.model().refresh_ids(affected_books, current_row=self.library_view.currentIndex().row())
|
||||||
|
self.do_field_item_value_changed()
|
||||||
self.tags_view.recount()
|
self.tags_view.recount()
|
||||||
|
|
||||||
def drag_drop_finished(self, ids):
|
def drag_drop_finished(self, ids):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user