          Sets the width of the control label. Defaults to 20
      checkbuttons_frame: tk.frame, optional
          If a checkbutton frame is passed in, then checkbuttons will be placed in this frame
          rather than the main options frame
      control_width: int, optional
          Sets the width of the control. Default is to auto expand
      blank_nones: bool, optional
          Sets selected values to an empty string rather than None if this is true. Default is true
      """
      def __init__(self, parent, title, dtype, default,
                   selected_value=None, choices=None, is_radio=False, rounding=None,
                   min_max=None, sysbrowser=None, helptext=None, option_columns=3, label_width=20,
                   checkbuttons_frame=None, control_width=None, blank_nones=True):
 
</s> remove     title: str
        Title of the control. Will be used for label text
    dtype: datatype object
        Datatype of the control.
    default: str
        Default value for the control
    selected_value: str, optional
        Selected value for the control. If None, default will be used
    choices: list or tuple, object
        Used for combo boxes and radio control option setting
    is_radio: bool, optional
        Specifies to use a Radio control instead of combobox if choices are passed
    rounding: int or float, optional
        For slider controls. Sets the stepping
    min_max: int or float, optional
        For slider controls. Sets the min and max values
    sysbrowser: dict, optional
        Adds Filesystem browser buttons to ttk.Entry options.
        Expects a dict: {sysbrowser: str, filetypes: str}
    helptext: str, optional
        Sets the tooltip text
    option_columns: int, optional
        Sets the number of columns to use for grouping radio buttons
    label_width: int, optional
        Sets the width of the control label. Defaults to 20
    checkbuttons_frame: tk.frame, optional
 </s> add     option: ControlPanelOption object
        Holds all of the required option information
    option_columns: int
        Number of options to put on a single row for checkbuttons/radiobuttons
    label_width: int
        Sets the width of the control label
    checkbuttons_frame: tk.frame </s> remove     def __init__(self, parent, title, dtype, default,
                 selected_value=None, choices=None, is_radio=False, rounding=None,
                 min_max=None, sysbrowser=None, helptext=None, option_columns=3, label_width=20,
                 checkbuttons_frame=None, control_width=None, blank_nones=True):
        logger.debug("Initializing %s: (parent: %s, title: %s, dtype: %s, default: %s, "
                     "selected_value: %s, choices: %s, is_radio: %s, rounding: %s, min_max: %s, "
                     "sysbrowser: %s, helptext: %s, option_columns: %s, label_width: %s, "
                     "checkbuttons_frame: %s, control_width: %s, blank_nones: %s)",
                     self.__class__.__name__, parent, title, dtype, default, selected_value,
                     choices, is_radio, rounding, min_max, sysbrowser, helptext, option_columns,
                     label_width, checkbuttons_frame, control_width, blank_nones)

        self.title = title
        self.default = default
        self.helptext = self.format_helptext(helptext)
 </s> add     def __init__(self, parent, option, option_columns, label_width,  # pylint: disable=too-many-arguments
                 checkbuttons_frame, blank_nones):
        logger.debug("Initializing %s: (parent: %s, option: %s, option_columns: %s, "
                     "label_width: %s, checkbuttons_frame: %s, blank_nones: %s)",
                     self.__class__.__name__, parent, option, option_columns, label_width,
                     checkbuttons_frame, blank_nones)

        self.option = option
        self.option_columns = option_columns </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     """ A Panel for holding controls
        Also keeps tally if groups passed in, so that any options with special
        processing needs are processed in the correct group frame """
 </s> add     """
    A Control Panel to hold control panel options.
    This class handles all of the formatting, placing and TK_Variables
    in a consistent manner.

    It can also provide dynamic columns for resizing widgets </s> remove         logger.debug("Add control checkframe: '%s'", self.title)
 </s> add         logger.debug("Add control checkframe: '%s'", self.option.name)
    blank_nones: bool
        Sets selected values to an empty string rather than None if this is true.
          Sets the width of the control label. Defaults to 20
      checkbuttons_frame: tk.frame, optional
          If a checkbutton frame is passed in, then checkbuttons will be placed in this frame
          rather than the main options frame
    blank_nones: bool
        Sets selected values to an empty string rather than None if this is true.
    blank_nones: bool
        Sets selected values to an empty string rather than None if this is true.
    blank_nones: bool
        Sets selected values to an empty string rather than None if this is true.
    blank_nones: bool
        Sets selected values to an empty string rather than None if this is true.
      """
      def __init__(self, parent, title, dtype, default,
                   selected_value=None, choices=None, is_radio=False, rounding=None,
                   min_max=None, sysbrowser=None, helptext=None, option_columns=3, label_width=20,
                   checkbuttons_frame=None, control_width=None, blank_nones=True):
keep keep keep keep replace replace replace 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