              self.widget.focus_force()
              self.widget.select_range(0, tk.END)
  
  
  class LongRunningTask(Thread):
      """ For long running tasks, to stop the GUI becoming unresponsive
          Run in a thread and handle cursor events """
      def __init__(self, group=None, target=None, name=None, args=(), kwargs=None, *, daemon=True,
                   widget=None):
          logger.debug("Initializing %s: (group: %s, target: %s, name: %s, args: %s, kwargs: %s, "
                       "daemon: %s)", self.__class__.__name__, group, target, name, args, kwargs,
                       daemon)
 
</s> remove     def standard_actions(self):
        """ Standard menu actions """
        self.add_command(label="Cut", command=lambda: self.widget.event_generate("<<Cut>>"))
        self.add_command(label="Copy", command=lambda: self.widget.event_generate("<<Copy>>"))
        self.add_command(label="Paste", command=lambda: self.widget.event_generate("<<Paste>>"))
        self.add_separator()
        self.add_command(label="Select all", command=self.select_all)

    def cm_bind(self):
        """ Bind the menu to the widget's Right Click event """
        button = "<Button-2>" if platform.system() == "Darwin" else "<Button-3>"
        logger.debug("Binding '%s' to '%s'", button, self.widget.winfo_class())
        scaling_factor = get_config().scaling_factor if get_config() is not None else 1.0
        x_offset = int(34 * scaling_factor)
        self.widget.bind(button,
                         lambda event: self.tk_popup(event.x_root + x_offset, event.y_root, 0))

    def select_all(self):
        """ Select all for Text or Entry widgets """
        logger.debug("Selecting all for '%s'", self.widget.winfo_class())
        if self.widget.winfo_class() == "Text":
            self.widget.focus_force()
            self.widget.tag_add("sel", "1.0", "end")
        else:
            self.widget.focus_force()
            self.widget.select_range(0, tk.END)
 </s> add class LongRunningTask(Thread):
    """ Runs long running tasks in a background thread to prevent the GUI from becoming
    unresponsive. </s> remove                  rounding=None, min_max=None, sysbrowser=None, helptext=None):
 </s> add                  rounding=None, min_max=None, sysbrowser=None, helptext=None,
                 track_modified=False, command=None): </s> remove         Don't call directly. Call get_config()
    """
 </s> add     @property
    def modified_vars(self):
        """ dict: The command notebook modified tkinter variables. """
        return self.command_notebook.modified_vars </s> remove                      "sysbrowser: %s, helptext: '%s')", self.__class__.__name__, title, dtype,
                     group, default, initial_value, choices, is_radio, rounding, min_max,
                     sysbrowser, helptext)
 </s> add                      "sysbrowser: %s, helptext: '%s', track_modified: %s, command: '%s')",
                     self.__class__.__name__, title, dtype, group, default, initial_value, choices,
                     is_radio, rounding, min_max, sysbrowser, helptext, track_modified, command) </s> remove     def __init__(self, tk_var, control_frame, sysbrowser_dict):
 </s> add     def __init__(self, opt_name, tk_var, control_frame, sysbrowser_dict):
    Parameters
    ----------
    widget: tkinter object, optional
        The widget that this :class:`LongRunningTask` is associated with. Used for setting the busy
        cursor in the correct location. Default: ``None``.
    """
              self.widget.focus_force()
              self.widget.select_range(0, tk.END)
  
  
    Parameters
    ----------
    widget: tkinter object, optional
        The widget that this :class:`LongRunningTask` is associated with. Used for setting the busy
        cursor in the correct location. Default: ``None``.
    """
    Parameters
    ----------
    widget: tkinter object, optional
        The widget that this :class:`LongRunningTask` is associated with. Used for setting the busy
        cursor in the correct location. Default: ``None``.
    """
    Parameters
    ----------
    widget: tkinter object, optional
        The widget that this :class:`LongRunningTask` is associated with. Used for setting the busy
        cursor in the correct location. Default: ``None``.
    """
      def __init__(self, group=None, target=None, name=None, args=(), kwargs=None, *, daemon=True,
                   widget=None):
          logger.debug("Initializing %s: (group: %s, target: %s, name: %s, args: %s, kwargs: %s, "
                       "daemon: %s)", self.__class__.__name__, group, target, name, args, kwargs,
                       daemon)
keep keep keep keep replace replace replace keep keep keep keep keep
 GUI Updates (#940)

* lib.gui: Update icons
* tools.cli: Add video filetype flag to mask input
* lib.gui.popup_configure: Refresh GUI on config save
* lib.gui._config: Add Icon size and load last session options
* lib.gui.control_helper - Add control modification tracking
* lib.gui - Add Projects and Last Session
- Main root title handled by projects
- Add Hotkeys
- Create projects module
- split fsw and fst filetypes
- Add last_session saving

* lib.project
- Documentation
- Ask confirm on closing unsaved project
-Fixups

* Track model folder changes
- Shuffle some globals
- Activate System Verbosity for GUI

* lib.gui.utils - Documentation and clean up
- lib.gui.custom_widgets - Create and document

* Add GUI config option to disable auto loading model stats 
lib/gui/utils.py