docs: def insert_execution_history(self, parent, execution_history, is_root=False):
          """Insert a list of history items into a the tree store
  
          If there are concurrency history items, the method is called recursively.
  
          :param Gtk.TreeItem parent: the parent to add the next history item to
          :param ExecutionHistory execution_history: all history items of a certain state machine execution
          :param bool is_root: Whether this is the root execution history
          """
          current_parent = parent
          execution_history_iterator = iter(execution_history)
          for history_item in execution_history_iterator:
              if isinstance(history_item, ConcurrencyItem):
                  self.insert_concurrent_execution_histories(current_parent, history_item.execution_histories)
  
              elif isinstance(history_item, CallItem):
                  tree_item = self.insert_history_item(current_parent, history_item, "Enter" if is_root else "Call")
                  if not tree_item:
                      return
                  if history_item.call_type is CallType.EXECUTE:
                      # this is necessary that already the CallType.EXECUTE item opens a new hierarchy in the
                      # tree view and not the CallType.CONTAINER item
                      next_history_item = history_item.next
                      if next_history_item and next_history_item.call_type is CallType.CONTAINER:
                          current_parent = tree_item
                          self.insert_history_item(current_parent, next_history_item, "Enter")
                          try:
                              next(execution_history_iterator)  # skips the next history item in the iterator
                          except StopIteration as e:
                              # the execution engine does not have another item
                              return
  
              else:  # history_item is ReturnItem
                  if current_parent is None:
                      # The reasons here can be: missing history items, items in the wrong order etc.
                      # Does not happen when using RAFCON without plugins
                      logger.error("Invalid execution history: current_parent is None")
                      return
                  if history_item.call_type is CallType.EXECUTE:
                      self.insert_history_item(current_parent, history_item, "Return")
                  else:  # CONTAINER
                      self.insert_history_item(current_parent, history_item, "Exit")
                      current_parent = self.history_tree_store.iter_parent(current_parent)
  
              is_root = False