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:
Charles Haley 2020-10-17 12:50:46 +01:00
parent d8e502507b
commit e6c02ec611

View File

@ -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()