mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Merge branch 'master' of https://github.com/cbhaley/calibre
Fixes #1946417 [Rename in VL and User Category behaviour](https://bugs.launchpad.net/calibre/+bug/1946417)
This commit is contained in:
commit
e369c5095c
@ -76,7 +76,11 @@
|
|||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string><p>Show items only if they appear in the
|
<string><p>Show items only if they appear in the
|
||||||
current Virtual library. Edits already done may be hidden but will
|
current Virtual library. Edits already done may be hidden but will
|
||||||
not be forgotten.</p></string>
|
not be forgotten.
|
||||||
|
</p><p>
|
||||||
|
Note that this box affects only what is displayed. Changes
|
||||||
|
will affect all books in your library even if this box
|
||||||
|
is checked.</p></string>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Only show items in the current &Virtual library</string>
|
<string>Only show items in the current &Virtual library</string>
|
||||||
|
@ -968,7 +968,6 @@ class TagsModel(QAbstractItemModel): # {{{
|
|||||||
self.db.new_api.set_pref('user_categories', user_cats)
|
self.db.new_api.set_pref('user_categories', user_cats)
|
||||||
self.refresh_required.emit()
|
self.refresh_required.emit()
|
||||||
self.user_category_added.emit()
|
self.user_category_added.emit()
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def do_drop_from_library(self, md, action, row, column, parent):
|
def do_drop_from_library(self, md, action, row, column, parent):
|
||||||
@ -1315,9 +1314,7 @@ class TagsModel(QAbstractItemModel): # {{{
|
|||||||
an_item.tag.name = new_name
|
an_item.tag.name = new_name
|
||||||
an_item.tag.state = TAG_SEARCH_STATES['clear']
|
an_item.tag.state = TAG_SEARCH_STATES['clear']
|
||||||
self.use_position_based_index_on_next_recount = True
|
self.use_position_based_index_on_next_recount = True
|
||||||
if not restrict_to_books:
|
self.add_renamed_item_to_user_categories(lookup_key, original_name, new_name)
|
||||||
self.rename_item_in_all_user_categories(original_name,
|
|
||||||
lookup_key, new_name)
|
|
||||||
|
|
||||||
children = item.all_children()
|
children = item.all_children()
|
||||||
restrict_to_book_ids=self.get_book_ids_to_use() if item.use_vl else None
|
restrict_to_book_ids=self.get_book_ids_to_use() if item.use_vl else None
|
||||||
@ -1341,6 +1338,7 @@ class TagsModel(QAbstractItemModel): # {{{
|
|||||||
new_name = to_what + child_item.tag.original_name[len(search_name):]
|
new_name = to_what + child_item.tag.original_name[len(search_name):]
|
||||||
do_one_item(key, child_item, child_item.tag.original_name,
|
do_one_item(key, child_item, child_item.tag.original_name,
|
||||||
new_name, restrict_to_book_ids)
|
new_name, restrict_to_book_ids)
|
||||||
|
self.clean_items_from_user_categories()
|
||||||
self.refresh_required.emit()
|
self.refresh_required.emit()
|
||||||
|
|
||||||
def rename_item_in_all_user_categories(self, item_name, item_category, new_name):
|
def rename_item_in_all_user_categories(self, item_name, item_category, new_name):
|
||||||
@ -1386,6 +1384,53 @@ class TagsModel(QAbstractItemModel): # {{{
|
|||||||
if user_categories is None:
|
if user_categories is None:
|
||||||
self.db.new_api.set_pref('user_categories', user_cats)
|
self.db.new_api.set_pref('user_categories', user_cats)
|
||||||
|
|
||||||
|
def add_renamed_item_to_user_categories(self, lookup_key, original_name, new_name):
|
||||||
|
'''
|
||||||
|
Add new_name to any user category that contains original name if new_name
|
||||||
|
isn't already there. The original name isn't deleted. This is the first
|
||||||
|
step when renaming user categories that might be in virtual libraries
|
||||||
|
because when finished both names may still exist. You should call
|
||||||
|
clean_items_from_user_categories() when done to remove any keys that no
|
||||||
|
longer exist from all user categories. The caller must arrange to
|
||||||
|
redisplay the tree as appropriate.
|
||||||
|
'''
|
||||||
|
user_cats = self.db.new_api.pref('user_categories', {})
|
||||||
|
for cat in user_cats.keys():
|
||||||
|
found_original = False
|
||||||
|
found_new = False
|
||||||
|
for name,key,_ in user_cats[cat]:
|
||||||
|
if key == lookup_key:
|
||||||
|
if name == original_name:
|
||||||
|
found_original = True
|
||||||
|
if name == new_name:
|
||||||
|
found_new = True
|
||||||
|
if found_original and not found_new:
|
||||||
|
user_cats[cat].append([new_name, lookup_key, 0])
|
||||||
|
self.db.new_api.set_pref('user_categories', user_cats)
|
||||||
|
|
||||||
|
def clean_items_from_user_categories(self):
|
||||||
|
'''
|
||||||
|
Remove any items that no longer exist from user categories. This can
|
||||||
|
happen when renaming items in virtual libraries, where sometimes the
|
||||||
|
old name still exists on some book not in the VL and sometimes it
|
||||||
|
doesn't. The caller must arrange to redisplay the tree as appropriate.
|
||||||
|
'''
|
||||||
|
user_cats = self.db.new_api.pref('user_categories', {})
|
||||||
|
cache = self.db.new_api
|
||||||
|
all_cats = {}
|
||||||
|
for cat in user_cats.keys():
|
||||||
|
new_cat = []
|
||||||
|
for val, key, _ in user_cats[cat]:
|
||||||
|
datatype = cache.field_metadata.get(key, {}).get('datatype', '*****')
|
||||||
|
if datatype != 'composite':
|
||||||
|
id_ = cache.get_item_id(key, val)
|
||||||
|
v = cache.books_for_field(key, id_)
|
||||||
|
if v:
|
||||||
|
new_cat.append([val, key, 0])
|
||||||
|
if new_cat:
|
||||||
|
all_cats[cat] = new_cat
|
||||||
|
self.db.new_api.set_pref('user_categories', all_cats)
|
||||||
|
|
||||||
def headerData(self, *args):
|
def headerData(self, *args):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user