mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Tag browser: Fix preservation of state when recounting and the visible categories have changed. Fixes #1696596 [VL library tag browser category expansion not consistent](https://bugs.launchpad.net/calibre/+bug/1696596)
This commit is contained in:
parent
3f0954f0c7
commit
acff645c32
@ -83,6 +83,14 @@ class TagTreeItem(object): # {{{
|
|||||||
|
|
||||||
self.tooltip = tooltip or ''
|
self.tooltip = tooltip or ''
|
||||||
|
|
||||||
|
@property
|
||||||
|
def name_id(self):
|
||||||
|
if self.type == self.CATEGORY:
|
||||||
|
return self.category_key + ':' + self.name
|
||||||
|
elif self.type == self.TAG:
|
||||||
|
return self.tag.original_name
|
||||||
|
return ''
|
||||||
|
|
||||||
def break_cycles(self):
|
def break_cycles(self):
|
||||||
del self.parent
|
del self.parent
|
||||||
del self.children
|
del self.children
|
||||||
@ -104,10 +112,9 @@ class TagTreeItem(object): # {{{
|
|||||||
if self.type == self.ROOT:
|
if self.type == self.ROOT:
|
||||||
return 'ROOT'
|
return 'ROOT'
|
||||||
if self.type == self.CATEGORY:
|
if self.type == self.CATEGORY:
|
||||||
return 'CATEGORY:'+str(
|
return 'CATEGORY(category_key={!r}, name={!r}, num_children={!r})'.format(
|
||||||
self.name)+':%d'%len(getattr(self,
|
self.category_key, self.name, len(self.children))
|
||||||
'children', []))
|
return 'TAG(name=%r)'%self.tag.name
|
||||||
return 'TAG: %s'%self.tag.name
|
|
||||||
|
|
||||||
def row(self):
|
def row(self):
|
||||||
if self.parent is not None:
|
if self.parent is not None:
|
||||||
@ -1039,7 +1046,7 @@ class TagsModel(QAbstractItemModel): # {{{
|
|||||||
return idx
|
return idx
|
||||||
|
|
||||||
def index_for_category(self, name):
|
def index_for_category(self, name):
|
||||||
for row, category in enumerate(self.category_nodes):
|
for row, category in enumerate(self.root_item.children):
|
||||||
if category.category_key == name:
|
if category.category_key == name:
|
||||||
return self.index(row, 0, QModelIndex())
|
return self.index(row, 0, QModelIndex())
|
||||||
|
|
||||||
@ -1203,6 +1210,31 @@ class TagsModel(QAbstractItemModel): # {{{
|
|||||||
def supportedDropActions(self):
|
def supportedDropActions(self):
|
||||||
return Qt.CopyAction|Qt.MoveAction
|
return Qt.CopyAction|Qt.MoveAction
|
||||||
|
|
||||||
|
def named_path_for_index(self, index):
|
||||||
|
ans = []
|
||||||
|
while index.isValid():
|
||||||
|
node = self.get_node(index)
|
||||||
|
if node is self.root_item:
|
||||||
|
break
|
||||||
|
ans.append(node.name_id)
|
||||||
|
index = self.parent(index)
|
||||||
|
return ans
|
||||||
|
|
||||||
|
def index_for_named_path(self, named_path):
|
||||||
|
parent = self.root_item
|
||||||
|
ipath = []
|
||||||
|
path = named_path[:]
|
||||||
|
while path:
|
||||||
|
q = path.pop()
|
||||||
|
for i, c in enumerate(parent.children):
|
||||||
|
if c.name_id == q:
|
||||||
|
ipath.append(i)
|
||||||
|
parent = c
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
return self.index_for_path(ipath)
|
||||||
|
|
||||||
def path_for_index(self, index):
|
def path_for_index(self, index):
|
||||||
ans = []
|
ans = []
|
||||||
while index.isValid():
|
while index.isValid():
|
||||||
|
@ -770,7 +770,7 @@ class TagsView(QTreeView): # {{{
|
|||||||
ci = self.currentIndex()
|
ci = self.currentIndex()
|
||||||
if not ci.isValid():
|
if not ci.isValid():
|
||||||
ci = self.indexAt(QPoint(10, 10))
|
ci = self.indexAt(QPoint(10, 10))
|
||||||
path = self.model().path_for_index(ci) if self.is_visible(ci) else None
|
path = self.model().named_path_for_index(ci) if self.is_visible(ci) else None
|
||||||
expanded_categories, state_map = self.get_state()
|
expanded_categories, state_map = self.get_state()
|
||||||
self._model.rebuild_node_tree(state_map=state_map)
|
self._model.rebuild_node_tree(state_map=state_map)
|
||||||
self.blockSignals(True)
|
self.blockSignals(True)
|
||||||
@ -778,7 +778,10 @@ class TagsView(QTreeView): # {{{
|
|||||||
idx = self._model.index_for_category(category)
|
idx = self._model.index_for_category(category)
|
||||||
if idx is not None and idx.isValid():
|
if idx is not None and idx.isValid():
|
||||||
self.expand(idx)
|
self.expand(idx)
|
||||||
self.show_item_at_path(path)
|
if path is not None:
|
||||||
|
index = self._model.index_for_named_path(path)
|
||||||
|
if index.isValid():
|
||||||
|
self.show_item_at_index(index)
|
||||||
self.blockSignals(False)
|
self.blockSignals(False)
|
||||||
|
|
||||||
def show_item_at_path(self, path, box=False,
|
def show_item_at_path(self, path, box=False,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user