  def add_command(name, func):
      """ For controls that execute commands, the command must be added to the _COMMAND list so that
          it can be added back to the widget during cloning """
      logger.debug("Adding to commands: %s - %s", name, func)
      _COMMANDS[name] = func
  
  
  def set_slider_rounding(value, var, d_type, round_to, min_max):
      """ Set the underlying variable to correct number based on slider rounding """
      if d_type == float:
 
</s> remove     def __init__(self, parent, options, label_width=20, columns=1, option_columns=4,
                 header_text=None, blank_nones=True):
 </s> add     Parameters
    ----------
    parent: tk object
        Parent widget that should hold this control panel
    options: list of  ControlPanelOptions objects
        The list of controls that are to be built into this control panel
    label_width: int, optional
        The width that labels for controls should be set to.
        Defaults to 20
    columns: int, optional
        The maximum number of columns that this control panel should be able
        to accomodate. Setting to 1 means that there will only be 1 column
        regardless of how wide the control panel is. Higher numbers will
        dynamically fill extra columns if space permits. Defaults to 1
    option_columns: int, optional
        For checkbutton and radiobutton containers, how many options should
        be displayed on each row. Defaults to 4
    header_text: str, optional
        If provided, will place an information box at the top of the control
        panel with these contents.
    blank_nones: bool, optional
        How the control panel should handle Nones. If set to True then Nones
        will be converted to empty strings. Default: False
    """

    def __init__(self, parent, options,  # pylint:disable=too-many-arguments
                 label_width=20, columns=1, option_columns=4, header_text=None, blank_nones=True): </s> remove     def slider_control(self, dtype, rounding, min_max):
 </s> add     def slider_control(self): </s> remove     def format_helptext(self, helptext):
        """ Format the help text for tooltips """
        if helptext is None:
            return helptext
        logger.debug("Format control help: '%s'", self.title)
        if helptext.startswith("R|"):
            helptext = helptext[2:].replace("\nL|", "\n - ").replace("\n", "\n\n")
        else:
            helptext = helptext.replace("\n\t", "\n - ").replace("%%", "%")
        helptext = ". ".join(i.capitalize() for i in helptext.split(". "))
        helptext = self.title + " - " + helptext
        logger.debug("Formatted control help: (title: '%s', help: '%s'", self.title, helptext)
        return helptext

    def set_control(self, dtype, choices, is_radio):
        """ Set the correct control type based on the datatype or for this option """
        if choices and is_radio:
            control = ttk.Radiobutton
        elif choices:
            control = ttk.Combobox
        elif dtype == bool:
            control = ttk.Checkbutton
        elif dtype in (int, float):
            control = ttk.Scale
        else:
            control = ttk.Entry
        logger.debug("Setting control '%s' to %s", self.title, control)
        return control

    def set_tk_var(self, dtype, selected_value, blank_nones):
 </s> add     def set_tk_var(self, blank_nones): </s> remove             logger.debug("Adding radio option %s to column %s", choice, frame_id)
 </s> add             logger.debug("Added radio option %s", choice)
    _RECREATE_OBJECTS["commands"][name] = func
  def add_command(name, func):
      """ For controls that execute commands, the command must be added to the _COMMAND list so that
          it can be added back to the widget during cloning """
      logger.debug("Adding to commands: %s - %s", name, func)
    _RECREATE_OBJECTS["commands"][name] = func
  
  
  def set_slider_rounding(value, var, d_type, round_to, min_max):
      """ Set the underlying variable to correct number based on slider rounding """
      if d_type == float:
keep keep keep keep replace keep keep keep keep keep
 GUI Fixups

- GUI Bugfix: Startup options - fix min/max thresholds
- GUI Bugfix: Make console read-only
- GUI Bugfix: Rightclick menu for recreated widgets
- Enhancement: Create ControlPanelOptions Class + migrate options 
lib/gui/control_helper.py