@@ -101,14 +101,6 @@ def nodeToFilterIndex(self, node: SidebarNode) -> QModelIndex:
101101 assert index .model () is self .sidebarModel
102102 return self .filterModel .mapFromSource (index )
103103
104- def onIndexExpanded (self , index : QModelIndex ):
105- node = self .filterIndexToNode (index )
106- self .sidebarModel .cacheNodeCollapsedState (node , collapsed = False )
107-
108- def onIndexCollapsed (self , index : QModelIndex ):
109- node = self .filterIndexToNode (index )
110- self .sidebarModel .cacheNodeCollapsedState (node , collapsed = True )
111-
112104 def drawBranches (self , painter , rect , index ):
113105 """
114106 (overridden function)
@@ -861,6 +853,9 @@ def revealStashParent(self, oid: Oid):
861853 parent = commit .parent_ids [0 ]
862854 Jump .invoke (self , NavLocator .inCommit (parent ))
863855
856+ # -------------------------------------------------------------------------
857+ # Sidebar nodes
858+
864859 def walk (self ):
865860 return self .sidebarModel .rootNode .walk ()
866861
@@ -937,8 +932,16 @@ def selectAnyRef(self, *refs: str) -> QModelIndex | None:
937932 self .clearSelection ()
938933 return None
939934
935+ # -------------------------------------------------------------------------
936+ # Collapse/expand
937+
940938 @benchmark
941939 def restoreExpandedItems (self ):
940+ """
941+ Assumes all collapsible rows are collapsed before this is called.
942+ (After rebuilding the model, all rows are collapsed by default.)
943+ """
944+
942945 model = self .sidebarModel
943946
944947 frontier = model .rootNode .children [:]
@@ -954,23 +957,52 @@ def restoreExpandedItems(self):
954957
955958 frontier .extend (node .children )
956959
957- def collapseChildFolders (self , node : SidebarNode ):
960+ def expandChildFolders (self , node : SidebarNode , collapse : bool = False ):
961+ operation = self .collapse if collapse else self .expand
958962 frontier = node .children [:]
959963 while frontier :
960964 node = frontier .pop ()
961965 if node .kind == SidebarItem .RefFolder :
962966 frontier .extend (node .children )
963967 index = self .nodeToFilterIndex (node )
964- self . collapse (index )
968+ operation (index )
965969
966- def expandChildFolders (self , node : SidebarNode ):
967- frontier = node .children [:]
968- while frontier :
969- node = frontier .pop ()
970- if node .kind == SidebarItem .RefFolder :
971- frontier .extend (node .children )
972- index = self .nodeToFilterIndex (node )
973- self .expand (index )
970+ def collapseChildFolders (self , node : SidebarNode ):
971+ self .expandChildFolders (node , collapse = True )
972+
973+ def onIndexExpanded (self , index : QModelIndex ):
974+ node = self .filterIndexToNode (index )
975+ self .sidebarModel .cacheNodeCollapsedState (node , collapsed = False )
976+
977+ def onIndexCollapsed (self , index : QModelIndex ):
978+ node = self .filterIndexToNode (index )
979+ self .sidebarModel .cacheNodeCollapsedState (node , collapsed = True )
980+
981+ def setCollapseStateLayer (self , transient : bool ):
982+ model = self .sidebarModel
983+ currentLayer = len (model .collapseCacheLayers ) - 1
984+ targetLayer = 1 if transient else 0
985+
986+ # No-op if switching to same layer
987+ if targetLayer == currentLayer :
988+ return
989+
990+ if currentLayer == 0 :
991+ # Create layer 1 (transient)
992+ model .collapseCacheLayers .append (set ())
993+ elif currentLayer == 1 :
994+ # Collapse everything first so restoreExpandedItems will work,
995+ # then drop down to layer 0 (permanent)
996+ self .collapseAll ()
997+ model .collapseCacheLayers .pop ()
998+ else :
999+ raise NotImplementedError (f"unsupported layer { currentLayer } " )
1000+
1001+ assert targetLayer == len (model .collapseCacheLayers ) - 1
1002+
1003+ self .restoreExpandedItems ()
1004+
1005+ # -------------------------------------------------------------------------
9741006
9751007 def copyToClipboard (self , text : str ):
9761008 QApplication .clipboard ().setText (text )
0 commit comments