          info.bind("<Configure>", adjust_wraplength)
  
  
  class ControlBuilder():
      # TODO Expand out for cli options
      """
      Builds and returns a frame containing a tkinter control with label
  
      Currently only setup for config items
  
 
</s> remove     def add_info(self):
        """ Plugin information """
        info_frame = ttk.Frame(self.optsframe)
        info_frame.pack(fill=tk.X, expand=True)
        lbl = ttk.Label(info_frame, text="About:", width=20, anchor=tk.W)
        lbl.pack(padx=5, pady=5, side=tk.LEFT, anchor=tk.N)
        info = ttk.Label(info_frame, text=self.header_text)
        info.pack(padx=5, pady=5, fill=tk.X, expand=True)
        info.bind("<Configure>", adjust_wraplength)
 </s> add     def checkbuttons_frame(self, frame):
        """ Build and format frame for holding the check buttons
            if is_master then check buttons will be placed in a LabelFrame
            otherwise in a standard frame """
        logger.debug("Add Options CheckButtons Frame")
        chk_frame = ttk.Frame(frame, name="chkbuttons")
        holder = AutoFillContainer(chk_frame, self.radio_columns)
        logger.debug("Added Options CheckButtons Frame")
        return holder


class AutoFillContainer():
    """ A container object that autofills columns """
    def __init__(self, parent, columns):
        logger.debug("Initializing: %s: (parent: %s, columns: %s)", self.__class__.__name__,
                     parent, columns)
        self.parent = parent
        self.columns = columns
        self._items = 0
        self._idx = 0
        self.subframes = self.set_subframes()
        logger.debug("Initialized: %s: (items: %s)", self.__class__.__name__, self.items)

    @property
    def items(self):
        """ Returns the number if items held in this containter """
        return self._items

    @property
    def subframe(self):
        """ Returns the next subframe to be populated """
        frame = self.subframes[self._idx]
        next_idx = self._idx + 1 if self._idx + 1 != self.columns else 0
        logger.debug("current_idx: %s, next_idx: %s", self._idx, next_idx)
        self._idx = next_idx
        return frame

    @property
    def last_subframe(self):
        """ Returns the last column """
        return self.subframes[self.columns - 1]

    def set_subframes(self):
        """ Set a subrame for each requested column """
        subframes = []
        for idx in range(self.columns):
            if self.columns != 1:
                name = "{}_{}".format(self.parent.winfo_name(), idx)
                subframe = ttk.Frame(self.parent, name=name)
                subframe.pack(padx=5, pady=5, side=tk.LEFT, anchor=tk.N, expand=True, fill=tk.X)
                subframes.append(subframe)
                logger.debug("Added subframe: %s", name)
            else:
                subframes.append(self.parent)
                logger.debug("Using parent as subframe: %s", self.parent.winfo_name())
            self._items += 1
        return subframes </s> remove     def control_frame(self, parent, helptext):
 </s> add     @staticmethod
    def control_frame(parent): </s> remove from .utils import ContextMenu, FileHandler, get_images, get_config
 </s> add from .utils import get_images, get_config </s> remove     def build_panel(self, radio_columns):
 </s> add     def get_opts_frame(self):
        """ Return an autofill container for the options inside a main frame """
        mainframe = ttk.Frame(self.canvas)
        if self.header_text is not None:
            self.add_info(mainframe)
        optsframe = ttk.Frame(mainframe)
        optsframe.pack(expand=True, fill=tk.BOTH)
        holder = AutoFillContainer(optsframe, self.columns)
        logger.debug("Opts frames: '%s'", holder)
        return mainframe, holder

    def add_info(self, frame):
        """ Plugin information """
        gui_style = ttk.Style()
        gui_style.configure('White.TFrame', background='#FFFFFF')
        gui_style.configure('Header.TLabel', background='#FFFFFF', font=("", 9, "bold"))
        gui_style.configure('Body.TLabel', background='#FFFFFF', font=("", 9))

        info_frame = ttk.Frame(frame, style='White.TFrame', relief=tk.SOLID)
        info_frame.pack(fill=tk.X, side=tk.TOP, expand=True, padx=10, pady=10)
        label_frame = ttk.Frame(info_frame, style='White.TFrame')
        label_frame.pack(padx=5, pady=5, fill=tk.X, expand=True)
        for idx, line in enumerate(self.header_text.splitlines()):
            if not line:
                continue
            style = "Header.TLabel" if idx == 0 else "Body.TLabel"
            info = ttk.Label(label_frame, text=line, style=style, anchor=tk.W)
            info.pack(fill=tk.X, padx=0, pady=0, expand=True, side=tk.TOP)
        info.bind("<Configure>", adjust_wraplength)

    def build_panel(self, radio_columns, blank_nones):
          info.bind("<Configure>", adjust_wraplength)
  
  
  class ControlBuilder():

      """
      Builds and returns a frame containing a tkinter control with label
  
      Currently only setup for config items
  
keep keep keep keep replace keep keep keep keep keep
 GUI Update


- Launch in fullscreen
- Expand Control Helper. Clean up config popup
- Standardize and overhaul GUI for CliOpts 
lib/gui/control_helper.py