docs: def updates_selection(update_selection):
      """ Decorator indicating that the decorated method could change the selection"""
      def handle_update(selection, *args, **kwargs):
          """Check for changes in the selection
  
          If the selection is changed by the decorated method, the internal core element lists are updated and a signal is
          emitted with the old and new selection as well as the name of the method that caused the change..
          """
          old_selection = selection.get_all()
          update_selection(selection, *args, **kwargs)
          new_selection = selection.get_all()
  
          affected_models = old_selection ^ new_selection
          if len(affected_models) != 0:  # The selection was updated
              deselected_models = old_selection - new_selection
              selected_models = new_selection - old_selection
              map(selection.relieve_model, deselected_models)
              map(selection.observe_model, selected_models)
  
              # Maintain internal lists for fast access
              selection.update_core_element_lists()
  
              # Clear focus if no longer in selection
              if selection.focus and selection.focus not in new_selection:
                  del selection.focus
  
              # Send notifications about changes
              affected_classes = set(model.core_element.__class__ for model in affected_models)
              msg_namedtuple = SelectionChangedSignalMsg(update_selection.__name__, new_selection, old_selection,
                                                         affected_classes)
              selection.selection_changed_signal.emit(msg_namedtuple)
              if selection.parent_signal is not None:
                  selection.parent_signal.emit(msg_namedtuple)
      return handle_update