docs: def _store_expansion_state(self):
          """Iter recursively all tree items and store expansion state"""
  
          def store_tree_expansion(child_tree_iter, expansion_state):
  
              tree_item_path = self.history_tree_store.get_path(child_tree_iter)
              history_item = self.get_history_item_for_tree_iter(child_tree_iter)
  
              # store expansion state if tree item path is valid and expansion state was not stored already
              if tree_item_path is not None:
                  # if first element of sub-tree has same history_item as the parent ignore it's expansion state
                  if history_item not in expansion_state:
                      expansion_state[history_item] = self.history_tree.row_expanded(tree_item_path)
  
              for n in range(self.history_tree_store.iter_n_children(child_tree_iter)):
                  child_iter = self.history_tree_store.iter_nth_child(child_tree_iter, n)
                  store_tree_expansion(child_iter, expansion_state)
  
          root_iter = self.history_tree_store.get_iter_first()
          if not root_iter:
              return
          current_expansion_state = {}
          # this can be the case when the execution history tree is currently being deleted
          if not self.get_history_item_for_tree_iter(root_iter).state_reference:
              return
          state_machine = self.get_history_item_for_tree_iter(root_iter).state_reference.get_state_machine()
          self._expansion_state[state_machine.state_machine_id] = current_expansion_state
          while root_iter:
              store_tree_expansion(root_iter, current_expansion_state)
              root_iter = self.history_tree_store.iter_next(root_iter)