mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Make the tag browser expand and collapse menu items consistent.
1) add separate lines to expand item and expand item and children 2) add collapse lines for all parent nodes, not just the immediate parent and the category root
This commit is contained in:
parent
d8e502507b
commit
e6c02ec611
@ -806,19 +806,6 @@ class TagsView(QTreeView): # {{{
|
|||||||
_('Manage User categories'),
|
_('Manage User categories'),
|
||||||
partial(self.context_menu_handler, action='manage_categories',
|
partial(self.context_menu_handler, action='manage_categories',
|
||||||
category=None))
|
category=None))
|
||||||
|
|
||||||
node_name = tag_item.tag.name
|
|
||||||
parent = tag_item.parent
|
|
||||||
if parent.type != TagTreeItem.ROOT:
|
|
||||||
# We have an internal node. Find its immediate parent
|
|
||||||
parent_index = self._model.parent(index)
|
|
||||||
parent_node = parent
|
|
||||||
parent_name = parent.tag.name
|
|
||||||
else:
|
|
||||||
# We have a top-level node.
|
|
||||||
parent_index = index
|
|
||||||
parent_node = tag_item
|
|
||||||
parent_name = tag_item.name
|
|
||||||
if self.hidden_categories:
|
if self.hidden_categories:
|
||||||
if not self.context_menu.isEmpty():
|
if not self.context_menu.isEmpty():
|
||||||
self.context_menu.addSeparator()
|
self.context_menu.addSeparator()
|
||||||
@ -850,47 +837,70 @@ class TagsView(QTreeView): # {{{
|
|||||||
da.setToolTip('*')
|
da.setToolTip('*')
|
||||||
pa.setToolTip('*')
|
pa.setToolTip('*')
|
||||||
|
|
||||||
|
# Add expand menu items
|
||||||
|
node_name = self._model.get_node(index).tag.name
|
||||||
self.context_menu.addSeparator()
|
self.context_menu.addSeparator()
|
||||||
if index.isValid() and self.model().rowCount(index) > 0:
|
if self.has_children(index) and not self.isExpanded(index):
|
||||||
if self.isExpanded(index):
|
self.context_menu.addAction(_('Expand {0}').format(node_name),
|
||||||
self.context_menu.addAction(_("Collapse {0}").format(node_name),
|
partial(self.expand, index))
|
||||||
partial(self.collapse_node, index))
|
if self.has_unexpanded_children(index):
|
||||||
else:
|
self.context_menu.addAction(_('Expand {0} and all children').format(node_name),
|
||||||
self.context_menu.addAction(_('Expand {0}').format(node_name),
|
partial(self.expand_node_and_children, index))
|
||||||
partial(self.expand_node_and_descendants, index))
|
|
||||||
if parent_index is not None and parent_index != index:
|
# Add menu items to collapse parent nodes
|
||||||
if self.isExpanded(parent_index):
|
idx = index
|
||||||
# Don't bother to collapse if it isn't expanded
|
paths = []
|
||||||
self.context_menu.addAction(_("Collapse {0}").format(parent_name),
|
while True:
|
||||||
partial(self.collapse_node, parent_index))
|
# First walk up the node tree getting the displayed names of
|
||||||
if parent_node.parent.type != TagTreeItem.ROOT:
|
# expanded parent nodes
|
||||||
# Add the top level node if the current parent is an internal node
|
node = self._model.get_node(idx)
|
||||||
while parent_node.parent.type != TagTreeItem.ROOT:
|
if node.type == TagTreeItem.ROOT:
|
||||||
parent_node = parent_node.parent
|
break
|
||||||
idx = self._model.index_for_category(parent_node.category_key)
|
if self.has_children(idx):
|
||||||
self.context_menu.addAction(_("Collapse {0}").format(parent_node.name),
|
# leaf nodes don't have children so can't be expanded.
|
||||||
partial(self.collapse_node, idx))
|
paths.append((node.tag.name, idx))
|
||||||
|
idx = self._model.parent(idx)
|
||||||
|
for p in paths:
|
||||||
|
# Now add the menu items
|
||||||
|
self.context_menu.addAction(_("Collapse {0}").format(p[0]),
|
||||||
|
partial(self.collapse_node, p[1]))
|
||||||
self.context_menu.addAction(_('Collapse all'), self.collapseAll)
|
self.context_menu.addAction(_('Collapse all'), self.collapseAll)
|
||||||
|
|
||||||
if not self.context_menu.isEmpty():
|
if not self.context_menu.isEmpty():
|
||||||
self.context_menu.popup(self.mapToGlobal(point))
|
self.context_menu.popup(self.mapToGlobal(point))
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
def has_children(self, idx):
|
||||||
|
return self.model().rowCount(idx) > 0
|
||||||
|
|
||||||
|
def collapse_node_and_children(self, idx):
|
||||||
|
self.collapse(idx)
|
||||||
|
for r in range(self.model().rowCount(idx)):
|
||||||
|
self.collapse_node_and_children(idx.child(r, 0))
|
||||||
|
|
||||||
def collapse_node(self, idx):
|
def collapse_node(self, idx):
|
||||||
def collapse_node_and_children(idx):
|
if not idx.isValid():
|
||||||
self.collapse(idx)
|
return
|
||||||
for r in range(self.model().rowCount(idx)):
|
self.collapse_node_and_children(idx)
|
||||||
collapse_node_and_children(idx.child(r, 0))
|
|
||||||
collapse_node_and_children(idx)
|
|
||||||
self.setCurrentIndex(idx)
|
self.setCurrentIndex(idx)
|
||||||
self.scrollTo(idx)
|
self.scrollTo(idx)
|
||||||
|
|
||||||
def expand_node_and_descendants(self, index):
|
def expand_node_and_children(self, index):
|
||||||
if not index.isValid():
|
if not index.isValid():
|
||||||
return
|
return
|
||||||
self.expand(index)
|
self.expand(index)
|
||||||
for r in range(self.model().rowCount(index)):
|
for r in range(self.model().rowCount(index)):
|
||||||
self.expand_node_and_descendants(index.child(r, 0))
|
self.expand_node_and_children(index.child(r, 0))
|
||||||
|
|
||||||
|
def has_unexpanded_children(self, index):
|
||||||
|
if not index.isValid():
|
||||||
|
return
|
||||||
|
if self.has_children(index) and not self.isExpanded(index):
|
||||||
|
return True
|
||||||
|
for r in range(self.model().rowCount(index)):
|
||||||
|
if self.has_unexpanded_children(index.child(r, 0)):
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
def collapse_menu_hovered(self, action):
|
def collapse_menu_hovered(self, action):
|
||||||
tip = action.toolTip()
|
tip = action.toolTip()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user