def test_lib_agw_hypertreelistSetItemColour(self):
        tree = HTL.HyperTreeList(self.frame)
        tree.AddColumn("First column")
        root = tree.AddRoot('root item')
        child = tree.AppendItem(root, 'child item')

        self.assertEqual(None, tree.GetItemBackgroundColour(root))

        colour = wx.RED
        tree.SetItemBackgroundColour(child, colour)
        self.assertEqual(colour, tree.GetItemBackgroundColour(child))
    def test_lib_agw_hypertreelistColourWholeItemColumns(self):

        tree = HTL.HyperTreeList(self.frame,
                                 agwStyle=HTL.TR_DEFAULT_STYLE
                                 | HTL.TR_FILL_WHOLE_COLUMN_BACKGROUND)
        tree.AddColumn("First column")
        tree.AddColumn("Second column")
        root = tree.AddRoot('root item')

        tree.SetItemBackgroundColour(root, wx.RED)
        tree.SetItemBackgroundColour(root, wx.GREEN, column=1)
Exemple #3
0
    def __init__(self):

       wx.Frame.__init__(self, None, -1, pos = (0,0), size=(700, 900), title= "HyperTreeList Demo")


       # ------------------------------------------
       # Algo for creating Files' List Starts here
       # ------------------------------------------
       allFiles = []
       for root, dirs, files in os.walk("/tmp", topdown = True):
           for name in files:
               location = os.path.join(root, name)
               allFiles.append(location)

       treeList= HTL.HyperTreeList(self, agwStyle= wx.TR_DEFAULT_STYLE| 0x4000 )
       treeList.AddColumn("List View")
       treeList.SetColumnWidth(0, 600)

       TLRoot = treeList.AddRoot ("D:", ct_type= 1)
       allDirs = []
       allDirsItem = []
       allDirs.append ("D:")
       allDirsItem.append(TLRoot)


       # --------------------------------------
       # Algo for filling Tree List Starts here
       # --------------------------------------
       for eachName in allFiles:
           nameSplit = eachName.split(os.sep)
           matchingDirFound = 0

           lenNS= len(nameSplit)
           i=lenNS -1
           for eachNameSplit in reversed(nameSplit):
               for eachDoneDir in reversed(allDirs):
                   if eachNameSplit == eachDoneDir:
                       matchingDirFound = 1
                       break

               if matchingDirFound == 1:
                   break
               i= i-1

           if matchingDirFound ==1:
               for k in range(i, lenNS-1):
                   allDirsItem.append([])
                   allDirsItem[k+1] = treeList.AppendItem (allDirsItem[k], nameSplit[k+1], ct_type= 1)

                   if len(allDirs)> k+1:
                       allDirs[k+1] = nameSplit[k+1]
                   else:
                       allDirs.append (nameSplit[k+1])
Exemple #4
0
    def test_lib_agw_hypertreelistTreeItem(self):
        tree = HTL.HyperTreeList(self.frame)
        tree.AddColumn("First column")

        root = tree.AddRoot('root item')
        self.assertTrue(isinstance(root, CT.GenericTreeItem))
        self.assertTrue(root.IsOk())

        r = tree.GetRootItem()
        self.assertTrue(r is root)
        self.assertTrue(r == root)

        child = tree.AppendItem(root, 'child item')
        self.assertTrue(child is not root)
        self.assertTrue(child != root)
Exemple #5
0
    def test_lib_agw_hypertreelistColumns(self):
        tree = HTL.HyperTreeList(self.frame)
        tree.AddColumn("First column")
        tree.AddColumn("Second column")

        self.assertEqual(tree.GetColumnCount(), 2)
        tree.RemoveColumn(0)
        self.assertEqual(tree.GetColumnCount(), 1)

        self.assertEqual(tree.GetColumnWidth(0), HTL._DEFAULT_COL_WIDTH)

        tree.AddColumn("Second column")
        tree.SetColumnShown(1, False)
        self.assertTrue(not tree.IsColumnShown(1))

        tree.SetColumnEditable(0, True)
        self.assertTrue(tree.IsColumnEditable(0))
Exemple #6
0
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1, style=0)
        self.parent = parent
        sizer = wx.BoxSizer(wx.VERTICAL)
        self.tree = HTL.HyperTreeList(self, -1, style=wx.TR_DEFAULT_STYLE | wx.TR_FULL_ROW_HIGHLIGHT | wx.TR_HIDE_ROOT)
        sizer.Add(self.tree, 1, wx.EXPAND | wx.ALL)

        self.init()

        self.SetSizer(sizer)
        self.SetAutoLayout(True)

        self.currentItem = None

        self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnItemActivated, self.tree)
        self.tree.GetMainWindow().Bind(wx.EVT_RIGHT_UP, self.OnPopupMenu)
        self.Bind(wx.EVT_TREE_SEL_CHANGED, self.OnItemSelected, self.tree)
    def test_lib_agw_hypertreelistSetItemColourOfColumns(self):
        tree = HTL.HyperTreeList(self.frame)
        tree.AddColumn("First column")
        tree.AddColumn("Second column")
        tree.AddColumn("Third column")
        root = tree.AddRoot('root item')
        child = tree.AppendItem(root, 'child item')

        colColour0 = wx.GREEN
        colColour2 = wx.RED
        tree.SetItemBackgroundColour(child, colColour0)
        tree.SetItemBackgroundColour(child, colColour2, column=2)

        self.assertEqual(colColour2,
                         tree.GetItemBackgroundColour(child, column=2))
        self.assertNotEqual(tree.GetItemBackgroundColour(child),
                            tree.GetItemBackgroundColour(child, column=2))
        self.assertEqual(None, tree.GetItemBackgroundColour(child, column=1))
Exemple #8
0
    def __init__(self, *args, **kwds):
        self.cbOnTreeCheck = kwds.pop('cbOnTreeCheck', None)
        wx.Panel.__init__(self, *args, **kwds)
        
        agwStyle  = 0
        agwStyle |= HTL.TR_HIDE_ROOT
        agwStyle |= HTL.TR_DEFAULT_STYLE
        agwStyle |= HTL.TR_HAS_BUTTONS
        agwStyle |= HTL.TR_HAS_VARIABLE_ROW_HEIGHT
        agwStyle |= HTL.TR_AUTO_CHECK_CHILD
        agwStyle |= HTL.TR_AUTO_TOGGLE_CHILD
        agwStyle |= HTL.TR_AUTO_CHECK_PARENT
        agwStyle |= HTL.TR_ELLIPSIZE_LONG_ITEMS
        
        self.tree = HTL.HyperTreeList(self, wx.ID_ANY, agwStyle=agwStyle)

        self.__set_properties()
        self.__do_layout()

        self.tree.Bind(HTL.EVT_TREE_ITEM_CHECKED, self.onTreeCheck)
Exemple #9
0
    def __init__(self, *args, **kwds):
        wx.Panel.__init__(self, *args, **kwds)

        agwStyle = 0
        agwStyle |= HTL.TR_HIDE_ROOT
        agwStyle |= HTL.TR_DEFAULT_STYLE
        agwStyle |= HTL.TR_HAS_BUTTONS
        agwStyle |= HTL.TR_HAS_VARIABLE_ROW_HEIGHT
        agwStyle |= HTL.TR_AUTO_CHECK_CHILD
        agwStyle |= HTL.TR_AUTO_TOGGLE_CHILD
        agwStyle |= HTL.TR_AUTO_CHECK_PARENT
        agwStyle |= HTL.TR_ELLIPSIZE_LONG_ITEMS

        self.tree = HTL.HyperTreeList(self, wx.ID_ANY, agwStyle=agwStyle)

        self.__set_properties()
        self.__do_layout()

        self.tree.Bind(HTL.EVT_TREE_ITEM_CHECKED, self.onTreeCheck)
        # http://wxpython-users.1045709.n5.nabble.com/Tooltips-on-CustomTreeCtrl-HyperTreeList-leaves-td5718763.html
        self.tree.GetMainWindow().Bind(wx.EVT_TREE_ITEM_GETTOOLTIP,
                                       self.onToolTip)
Exemple #10
0
    def __init__(self, parent, frame, col_width=400):
        """Constructor
        
        You can also use the function `self.BindAnalyze` to determine
        where the data file list goes.
        
        Use the method `self.SetProjectTree` to display projects.
        
        """
        wx.Panel.__init__(self, parent)
        self.frame = frame
        # Parameters important to determine size of htree control
        # (not important for one-column mode, just use something large)
        self.s_mult = 10
        self.s_off = 55
        self.col_width = col_width

        self.treelist = []

        # Set up box
        box = wx.StaticBox(self, label="Measurement browser")
        sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
        # Load tree control
        self.htreectrl = HT.HyperTreeList(self,
                agwStyle=wx.TR_DEFAULT_STYLE|wx.TR_HIDE_ROOT|\
                         wx.TR_ROW_LINES|HT.TR_AUTO_CHECK_CHILD|\
                         HT.TR_AUTO_CHECK_PARENT|HT.TR_NO_HEADER)

        sizer.Add(self.htreectrl, 1, wx.EXPAND, 3)

        self.btn_selall = wx.Button(self, label="Select all")
        self.btn_selnon = wx.Button(self, label="Deselect all")
        # to add more butons, use
        # wx.NewId and give it to the buttons as second argument
        # -> buttons can be identified with this id from the event
        self.btn_selflow1 = wx.Button(self, label="-")
        self.btn_selflow2 = wx.Button(self, label="-")
        self.btn_selflow3 = wx.Button(self, label="-")
        self.btn_add = wx.Button(self, label="Analyze")

        self.sizer_bag = wx.GridBagSizer()
        # Set size of buttons
        maxs = max(self.btn_selall.GetSize(), self.btn_selnon.GetSize())
        self.btn_selall.SetMinSize((maxs[0] * 1.5, maxs[1]))
        self.btn_selnon.SetMinSize((maxs[0] * 1.5, maxs[1]))
        self.btn_selflow1.SetMinSize(maxs)
        self.btn_selflow2.SetMinSize(maxs)
        self.btn_selflow3.SetMinSize(maxs)
        self.btn_add.SetMinSize((maxs[0] * 2, maxs[1]))

        self.sizer_bag.Add(self.btn_selall, (0, 0), span=wx.GBSpan(1, 3))
        self.sizer_bag.Add(self.btn_selnon, (0, 3), span=wx.GBSpan(1, 3))
        self.sizer_bag.Add(self.btn_selflow1, (1, 0), span=wx.GBSpan(1, 2))
        self.sizer_bag.Add(self.btn_selflow2, (1, 2), span=wx.GBSpan(1, 2))
        self.sizer_bag.Add(self.btn_selflow3, (1, 4), span=wx.GBSpan(1, 2))
        self.sizer_bag.Add(self.btn_add, (2, 1), span=wx.GBSpan(1, 4))

        minsize = self.sizer_bag.GetMinSize()
        box.SetMinSize(minsize)

        self.normal_width = box.GetMinSize()[0] + 10

        sizer.Add(self.sizer_bag)
        self.SetSizer(sizer)

        # sets self.flowrates
        self.Update()

        self.Bind(wx.EVT_BUTTON, self.OnSelectAll, self.btn_selall)
        self.Bind(wx.EVT_BUTTON, self.OnSelectNone, self.btn_selnon)
        self.Bind(wx.EVT_BUTTON, self.OnSelectFlow1, self.btn_selflow1)
        self.Bind(wx.EVT_BUTTON, self.OnSelectFlow2, self.btn_selflow2)
        self.Bind(wx.EVT_BUTTON, self.OnSelectFlow3, self.btn_selflow3)
        self.Bind(wx.EVT_BUTTON, self.OnAnalyze, self.btn_add)

        self.BindAnalyze(lambda x: None)

        self.Disable()
Exemple #11
0
 def test_lib_agw_hypertreelistCtor(self):
     tree = HTL.HyperTreeList(self.frame)
     self.assertEqual(tree.GetAGWWindowStyleFlag(), CT.TR_DEFAULT_STYLE)
     self.assertEqual(tree.GetRootItem(), None)
Exemple #12
0
    def __init__(self, cbhal_handler, nt, config):
        """
        The main window for the control board application. Implements a wxFrame.

        :param cbhal_handler: cbhal.ControlBoardBase
        :param nt: NetworkTableAbstractionLayer
        :param config: config.ConfigFile
        """
        wx.Frame.__init__(self, None, title=APP_NAME)

        self.logger = logging.getLogger(__name__)

        self.cbhal_handler = cbhal_handler
        self.nt = nt
        self.config = config

        self.log_window = wx.LogWindow(self, 'Control Board Log', False)

        # Set Icon
        # Setup the icon
        icon = wx.Icon()
        icon.CopyFromBitmap(wx.Bitmap(MAIN_ICON, wx.BITMAP_TYPE_ANY))
        self.SetIcon(icon)
        # Windows isn't smart enough to pull the right icon (it looks at the EXE), point it to look at this script's
        # icon
        # from http://stackoverflow.com/questions/1551605/how-to-set-applications-taskbar-icon-in-windows-
        # 7/1552105#1552105
        myappid = u'ControlBoardApp.1'  # arbitrary string
        ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid)

        # Set Taskbar Icon
        self.tb_icon = TaskBarIcon(self)

        self.v_sizer = wx.BoxSizer(wx.VERTICAL)

        ########################################
        # Menu bar configuration

        # File menu
        self.menu_file = wx.Menu()
        self.menu_file_hide = self.menu_file.Append(
            wx.ID_ANY, 'Hide',
            'Hide this window. Application continues running in the background.'
        )
        self.menu_file_quit = self.menu_file.Append(wx.ID_EXIT, 'Quit',
                                                    'Quit application')
        self.Bind(wx.EVT_MENU, self.hide_window, self.menu_file_hide)
        self.Bind(wx.EVT_MENU, self.exit_app, self.menu_file_quit)

        # Settings menu
        self.menu_settings = wx.Menu()
        self.test_mode_enabled = False
        self.menu_settings_testmode = self.menu_settings.AppendCheckItem(
            wx.ID_ANY, 'Test Mode', 'Enable/Disable Test Mode')
        self.menu_settings_setaddy = self.menu_settings.Append(
            wx.ID_ANY, 'Set NT Address',
            'Set the robot\'s address to access the Network Table server')
        self.menu_settings_setcb = self.menu_settings.Append(
            wx.ID_ANY, 'Set Control Board Type',
            'Sets the type of control board you are using')
        self.Bind(wx.EVT_MENU, self.OnTestModeChanged,
                  self.menu_settings_testmode)
        self.Bind(wx.EVT_MENU, self.OnSetNtAddress, self.menu_settings_setaddy)
        self.Bind(wx.EVT_MENU, self.OnCbSet, self.menu_settings_setcb)

        # Settings menu -> Logging Level menu
        self.menu_settings_logging_lvl = wx.Menu()
        self.menu_settings_logging_lvls = []
        for level in self.config.get_logging_levels():
            self.menu_settings_logging_lvls.append(
                self.menu_settings_logging_lvl.AppendRadioItem(
                    wx.ID_ANY, level))

        self.menu_settings_logging_lvl_menu = self.menu_settings.AppendSubMenu(
            self.menu_settings_logging_lvl, 'Logging Level',
            'Sets the logging level')
        check_id = next(
            filter(
                lambda x: x.GetName().upper(
                ) == self.config.get_logging_level_str().upper(),
                self.menu_settings_logging_lvl.MenuItems)).GetId()
        self.menu_settings_logging_lvl.Check(check_id, True)
        for level in self.menu_settings_logging_lvls:
            self.Bind(wx.EVT_MENU, self.OnLoggingLevelSet, level)

        # Help menu
        self.menu_help = wx.Menu()
        self.menu_help_log = self.menu_help.Append(
            wx.ID_ANY, 'Show Log', 'Shows the current run log')
        self.menu_help_help = self.menu_help.Append(
            wx.ID_ANY, 'Help',
            'Shows the documentation for the control board and application')
        self.menu_help_about = self.menu_help.Append(wx.ID_ANY, 'About',
                                                     'About this application')
        self.Bind(wx.EVT_MENU, self.OnShowLog, self.menu_help_log)
        self.Bind(wx.EVT_MENU, self.OnHelp, self.menu_help_help)
        self.Bind(wx.EVT_MENU, self.OnAbout, self.menu_help_about)

        # Create menu bar
        self.menu = wx.MenuBar()
        self.menu.Append(self.menu_file, 'File')
        self.menu.Append(self.menu_settings, 'Settings')
        self.menu.Append(self.menu_help, 'Help')

        self.SetMenuBar(self.menu)
        # End menu bar configuration
        ########################################

        self.tree = HTL.HyperTreeList(
            parent=self,
            id=wx.ID_ANY,
            agwStyle=wx.TR_DEFAULT_STYLE | wx.TR_EDIT_LABELS | wx.TR_HIDE_ROOT,
        )
        self.tree.AddColumn('Name')
        self.tree.AddColumn('Status')
        self.tree.AddColumn('Test Mode')
        self.tree.AddRoot('Root')
        self.tree.SetMainColumn(0)

        label = self.tree.AppendItem(self.tree.GetRootItem(),
                                     'Control Board Type')
        self.hal_type = wx.StaticText(
            self, label=self.cbhal_handler.get_cbhal_inst_name())
        self.tree.SetItemWindow(label, self.hal_type, 1)

        label = self.tree.AppendItem(self.tree.GetRootItem(),
                                     'Control Board Status')
        self.hal_status = wx.StaticText(self, label=self.DEFAULT_STATUS)
        self.tree.SetItemWindow(label, self.hal_status, 1)

        label = self.tree.AppendItem(self.tree.GetRootItem(),
                                     'NT Server Address')
        self.nt_address = wx.StaticText(self, label=self.DEFAULT_STATUS)
        self.tree.SetItemWindow(label, self.nt_address, 1)

        label = self.tree.AppendItem(self.tree.GetRootItem(), 'NT Status')
        self.ntal_status = wx.StaticText(self, label=self.DEFAULT_STATUS)
        self.tree.SetItemWindow(label, self.ntal_status, 1)

        # Create I/O Tree Objects
        self.io_object = {}
        self.create_io_tree()
        self.tree.CalculateAndSetHeaderHeight()
        self.tree.DoHeaderLayout()
        self.tree.SetColumnWidth(0, self.tree.DoGetBestSize().GetWidth())

        # Add the hyper tree list to the sizer
        self.v_sizer.Add(self.tree, 1, wx.EXPAND, 0)
        self.tree.InvalidateBestSize()
        self.v_sizer.SetMinSize(self.tree.GetBestSize())

        # Set the main sizer
        self.SetSizer(self.v_sizer)

        # Bind the X close button to the hide_window method
        self.Bind(wx.EVT_CLOSE, self.hide_window)

        # Create a wxTimer to update the window statuses periodically
        self.update_timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.OnUpdateTimerEvent, self.update_timer)
        self.OnTimerStart()

        self.busy_updating = False
        self.update_indicators()

        self.SetAutoLayout(True)
        self.Layout()

        self.update_test_elements()
Exemple #13
0
    def __init__(self, parent,\
            schema, params=None, filename=None, readonly=False):

        wx.Dialog.__init__(self, parent, title="", size=(600,700),\
                style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)

        self.schema = schema
        self.readonly = readonly
        self._modified = False

        if params == None:
            params = {}

        sizerFlags = wx.SizerFlags(0).Border(wx.ALL, 4)

        mainSizer = wx.BoxSizer(wx.VERTICAL)
        self.SetSizer(mainSizer)

        # Filename text
        self._filenameLabel = wx.StaticText(self, label="File:")
        mainSizer.AddF(self._filenameLabel, sizerFlags)

        # Buttons for file operations
        newButton = wx.Button(self, wx.ID_ANY, "New")
        openButton = wx.Button(self, wx.ID_ANY, "Open")
        saveButton = wx.Button(self, wx.ID_ANY, "Save")
        saveAsButton = wx.Button(self, wx.ID_ANY, "Save As...")
        saveAndCloseButton = wx.Button(self, wx.ID_ANY, "Save and Close")
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        hbox.Add(newButton)
        hbox.Add(openButton)
        hbox.Add(saveButton)
        hbox.Add(saveAsButton)
        hbox.Add(saveAndCloseButton)
        mainSizer.AddF(hbox, sizerFlags)
        self.Bind(wx.EVT_BUTTON, self._onNewClicked, newButton)
        self.Bind(wx.EVT_BUTTON, self._onOpenClicked, openButton)
        self.Bind(wx.EVT_BUTTON, self._onSaveClicked, saveButton)
        self.Bind(wx.EVT_BUTTON, self._onSaveAsClicked, saveAsButton)
        self.Bind(wx.EVT_BUTTON, self._onSaveAndCloseClicked,
                  saveAndCloseButton)

        editorSizer = wx.BoxSizer(wx.HORIZONTAL)

        self._tree = HTL.HyperTreeList(self, wx.ID_ANY,\
                style=wx.TR_DEFAULT_STYLE\
                #|wx.TR_MULTIPLE\
                |wx.TR_FULL_ROW_HIGHLIGHT\
                |wx.TR_ROW_LINES\
                ^wx.TR_NO_LINES) # doesn't work
        self._tree.AddColumn("Key")
        self._tree.AddColumn("Value")
        self._tree.SetMainColumn(0)
        self._tree.SetColumnWidth(0, 200)
        #self._tree.SetColumnEditable(1, True)

        self._tree.OnCompareItems = self._onCompareItems

        editorSizer.Add(self._tree, 1, flag=wx.EXPAND)

        # Create the parameter info pane
        self._infoPane = wx.TextCtrl(self, wx.ID_ANY,\
                size=(200, -1),\
                style=wx.TE_MULTILINE|wx.TE_READONLY)

        editorSizer.Add(self._infoPane, 0, flag=wx.EXPAND)

        mainSizer.Add(editorSizer, 1, flag=wx.EXPAND)

        # Create the image list for type icons
        self.typeNames = ['object', 'array', 'number', 'integer', 'string',\
                'boolean']
        imageList = wx.ImageList(16, 16, True, len(self.typeNames))
        for name in self.typeNames:
            fname = os.path.join(os.path.dirname(__file__), 'icons',\
                    name + '.png')
            bitmap = wx.Bitmap(fname)
            imageList.Add(bitmap)
        self._tree.AssignImageList(imageList)

        # Create other bitmaps
        #self.addBitmap = wx.Bitmap('icons/add.png')

        # Make a dictionary for mapping window IDs of buttons to the tree items
        # to which the buttons are associated.
        #self._treeItemsByButtonID = {}
        #self.buttonID = 0

        self._tree.GetMainWindow().Bind(wx.EVT_LEFT_DOWN, self._onLeftDown)
        self._tree.GetMainWindow().Bind(wx.EVT_LEFT_UP, self._onLeftUp)
        self._tree.GetMainWindow().Bind(wx.EVT_RIGHT_DOWN, self._onRightDown)
        self._tree.GetMainWindow().Bind(wx.EVT_RIGHT_DOWN, self._onRightDown)
        self.Bind(wx.EVT_TREE_BEGIN_DRAG, self._onBeginDrag, self._tree)
        self.Bind(wx.EVT_TREE_END_DRAG, self._onEndDrag, self._tree)
        self.Bind(wx.EVT_TREE_END_LABEL_EDIT, self._onEndLabelEdit, self._tree)

        self._tree.GetMainWindow().Bind(wx.EVT_TREE_ITEM_GETTOOLTIP,\
                self._onGetToolTip)

        # FIXME: why doesn't this work?
        self._tree.GetMainWindow().Bind(wx.EVT_MENU_HIGHLIGHT_ALL,\
                self._onMenuHighlight)

        self.Bind(wx.EVT_CLOSE, self._onClose)

        # Create the root item
        item = self._tree.AddRoot("Parameters")
        self._tree.SetItemPyData(item, {'schema': self.schema})
        self._setItemValue(item, params)
        self._tree.ExpandAll()

        # Automatically adjust width when items are expanded
        self._tree.GetMainWindow().Bind(wx.EVT_TREE_ITEM_EXPANDED,\
                self._onItemExpanded)
        wx.CallAfter(self._onItemExpanded, None)

        self.setFilename(filename)
 def __init__(self):
     debug = False
     cc = output.get_cc()
     self.title = _('Make Report Table')
     wx.Dialog.__init__(
         self,
         parent=None,
         id=-1,
         title=self.title,
         pos=(mg.HORIZ_OFFSET, 0),  ## -1 positions too low on 768v
         style=wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.RESIZE_BORDER
         | wx.CLOSE_BOX
         | wx.SYSTEM_MENU | wx.CAPTION | wx.CLIP_CHILDREN)
     config_ui.ConfigUI.__init__(self,
                                 autoupdate=True,
                                 multi_page_items=True)
     self.SetFont(mg.GEN_FONT)
     dimtree.DimTree.__init__(self)
     self.output_modules = [
         (None, 'my_globals as mg'),
         ('tables', 'dimtables'),
         ('tables', 'rawtables'),
         (None, 'output'),
         (None, 'getdata'),
     ]
     self.Bind(wx.EVT_CLOSE, self.set_exiting)
     self.url_load = True  ## btn_expand
     (self.var_labels, self.var_notes, self.var_types,
      self.val_dics) = lib.get_var_dets(cc[mg.CURRENT_VDTS_PATH])
     self.col_no_vars_item = None  ## needed if no variable in columns. Must reset to None if deleted all vars
     ## set up panel for frame
     self.panel = wx.Panel(self)
     config_output.add_icon(frame=self)
     ## sizers
     szr_main = wx.BoxSizer(wx.VERTICAL)
     szr_top = wx.BoxSizer(wx.HORIZONTAL)
     ## key settings
     self.drop_tbls_panel = self.panel
     self.drop_tbls_system_font_size = False
     self.drop_tbls_sel_evt = self.on_table_sel
     hide_db = projects.get_hide_db()
     self.drop_tbls_idx_in_szr = 3 if not hide_db else 1  ## the 2 database items are missing)
     self.drop_tbls_rmargin = 10
     self.drop_tbls_can_grow = False
     (self.szr_data, self.szr_output_config) = self.get_gen_config_szrs(
         self.panel, hide_db=hide_db)  ## mixin
     self.drop_tbls_szr = self.szr_data
     getdata.data_dropdown_settings_correct(parent=self)
     szr_tab_type = wx.BoxSizer(wx.HORIZONTAL)
     szr_opts = wx.BoxSizer(wx.HORIZONTAL)
     szr_raw_display_opts = wx.BoxSizer(wx.VERTICAL)
     szr_titles = wx.BoxSizer(wx.HORIZONTAL)
     szr_bottom = wx.BoxSizer(wx.HORIZONTAL)
     szr_trees = wx.BoxSizer(wx.HORIZONTAL)
     szr_rows = wx.BoxSizer(wx.VERTICAL)
     szr_cols = wx.BoxSizer(wx.VERTICAL)
     szr_col_btns = wx.BoxSizer(wx.HORIZONTAL)
     szr_html = wx.BoxSizer(wx.VERTICAL)
     self.szr_output_display = self.get_szr_output_display(
         self.panel, idx_style=2)  ## mixin
     self.btn_help = wx.Button(self.panel, wx.ID_HELP)
     self.btn_help.Bind(wx.EVT_BUTTON, self.on_btn_help)
     ## title details
     lbl_titles = wx.StaticText(self.panel, -1, _('Title:'))
     lbl_titles.SetFont(mg.LABEL_FONT)
     title_height = 40 if mg.PLATFORM == mg.MAC else 20
     self.txt_titles = wx.TextCtrl(self.panel,
                                   -1,
                                   size=(250, title_height),
                                   style=wx.TE_MULTILINE)
     self.txt_titles.Bind(wx.EVT_TEXT, self.on_title_change)
     lbl_subtitles = wx.StaticText(self.panel, -1, _('Subtitle:'))
     lbl_subtitles.SetFont(mg.LABEL_FONT)
     self.txt_subtitles = wx.TextCtrl(self.panel,
                                      -1,
                                      size=(250, title_height),
                                      style=wx.TE_MULTILINE)
     self.txt_subtitles.Bind(wx.EVT_TEXT, self.on_subtitle_change)
     ## table type. NB max indiv width sets width for all items in Win or OSX
     self.rad_opts = RptTypeOpts(parent=self, panel=self.panel)
     self.tab_type = self.rad_opts.GetSelection()
     ## option checkboxs
     self.chk_totals_row = wx.CheckBox(self.panel, -1, _('Totals Row?'))
     self.chk_totals_row.SetFont(mg.GEN_FONT)
     self.chk_totals_row.Bind(wx.EVT_CHECKBOX, self.on_chk_totals_row)
     self.chk_first_as_label = wx.CheckBox(self.panel, -1,
                                           _('First col as label?'))
     self.chk_first_as_label.SetFont(mg.GEN_FONT)
     self.chk_first_as_label.Bind(wx.EVT_CHECKBOX,
                                  self.on_chk_first_as_label)
     self.enable_raw_display_opts(enable=False)
     self.chk_show_perc_symbol = wx.CheckBox(self.panel, -1,
                                             _('Show percent symbol?'))
     self.chk_show_perc_symbol.SetFont(mg.GEN_FONT)
     self.chk_show_perc_symbol.Bind(wx.EVT_CHECKBOX,
                                    self.on_chk_show_perc_symbol)
     has_perc = not mg.RPT_CONFIG[self.tab_type][mg.VAR_SUMMARISED_KEY]
     self.enable_show_perc_symbol_opt(enable=has_perc)
     self.chk_show_perc_symbol.SetValue(True)  ## True is default
     ## dp spinner
     self.lbl_dp_spinner = wx.StaticText(self.panel, -1,
                                         _('Max dec points'))
     self.dp_spinner = self.get_dp_spinner(self.panel,
                                           dp_val=mg.DEFAULT_REPORT_DP)
     ## text labels
     lbl_rows = wx.StaticText(self.panel, -1, _('Rows:'))
     lbl_rows.SetFont(mg.LABEL_FONT)
     lbl_cols = wx.StaticText(self.panel, -1, _('Columns:'))
     lbl_cols.SetFont(mg.LABEL_FONT)
     ## buttons
     ## rows
     self.btn_row_add = wx.Button(self.panel, -1, _('Add'))
     self.btn_row_add.SetFont(mg.BTN_FONT)
     self.btn_row_add.Bind(wx.EVT_BUTTON, self.on_row_add)
     self.btn_row_add_under = wx.Button(self.panel, -1, _('Add Under'))
     self.btn_row_add_under.SetFont(mg.BTN_FONT)
     self.btn_row_add_under.Bind(wx.EVT_BUTTON, self.on_row_add_under)
     self.btn_row_del = wx.Button(self.panel, -1, _('Delete'))
     self.btn_row_del.SetFont(mg.BTN_FONT)
     self.btn_row_del.Bind(wx.EVT_BUTTON, self.on_row_delete)
     self.btn_row_conf = wx.Button(self.panel, -1, _('Config'))
     self.btn_row_conf.SetFont(mg.BTN_FONT)
     self.btn_row_conf.Bind(wx.EVT_BUTTON, self.on_row_config)
     ## cols
     self.btn_col_add = wx.Button(self.panel, -1, _('Add'))
     self.btn_col_add.SetFont(mg.BTN_FONT)
     self.btn_col_add.Bind(wx.EVT_BUTTON, self.on_col_add)
     self.btn_col_add_under = wx.Button(self.panel, -1, _('Add Under'))
     self.btn_col_add_under.SetFont(mg.BTN_FONT)
     self.btn_col_add_under.Bind(wx.EVT_BUTTON, self.on_col_add_under)
     self.btn_col_del = wx.Button(self.panel, -1, _('Delete'))
     self.btn_col_del.SetFont(mg.BTN_FONT)
     self.btn_col_del.Bind(wx.EVT_BUTTON, self.on_col_delete)
     self.btn_col_conf = wx.Button(self.panel, -1, _('Config'))
     self.btn_col_conf.SetFont(mg.BTN_FONT)
     self.btn_col_conf.Bind(wx.EVT_BUTTON, self.on_col_config)
     ## trees
     self.rowtree = HTL.HyperTreeList(self.panel,
                                      -1,
                                      agwStyle=wx.TR_FULL_ROW_HIGHLIGHT
                                      | wx.TR_HIDE_ROOT | wx.TR_MULTIPLE)
     self.rowtree.Bind(wx.EVT_TREE_ITEM_ACTIVATED,
                       self.on_row_item_activated)
     self.rowtree.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK,
                       self.on_row_item_rclick)
     self.rowtree.SetToolTip(
         _('Right click variables to view/edit details'))
     self.rowroot = self.setup_dim_tree(self.rowtree)
     self.coltree = HTL.HyperTreeList(self.panel,
                                      -1,
                                      agwStyle=wx.TR_FULL_ROW_HIGHLIGHT
                                      | wx.TR_HIDE_ROOT | wx.TR_MULTIPLE)
     self.coltree.Bind(wx.EVT_TREE_ITEM_ACTIVATED,
                       self.on_col_item_activated)
     self.coltree.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK,
                       self.on_col_item_rclick)
     self.coltree.SetToolTip(
         _('Right click variables to view/edit details'))
     self.colroot = self.setup_dim_tree(self.coltree)
     ## setup demo table type
     if debug: print(cc[mg.CURRENT_CSS_PATH])
     self.prev_demo = None
     self.demo_tab = demotables.DemoDimTable(
         txt_titles=self.txt_titles,
         txt_subtitles=self.txt_subtitles,
         tab_type=mg.FREQS,  ## the default
         colroot=self.colroot,
         rowroot=self.rowroot,
         rowtree=self.rowtree,
         coltree=self.coltree,
         col_no_vars_item=self.col_no_vars_item,
         var_labels=self.var_labels,
         val_dics=self.val_dics)
     ## freqs tbl is default
     self.setup_row_btns()
     self.setup_col_btns()
     self.add_default_column_config()  ## must set up after coltree and demo
     ## html (esp height)
     if mg.PLATFORM == mg.MAC:
         min_height = 80
         grow_from = 768
     else:
         min_height = 150
         grow_from = 600
     if mg.MAX_HEIGHT <= grow_from:
         myheight = min_height
     else:
         myheight = min_height + ((mg.MAX_HEIGHT - grow_from) * 0.2)
     myheight = 350 if myheight > 350 else myheight
     self.html = wx.html2.WebView.New(self.panel,
                                      -1,
                                      size=wx.Size(200, myheight))
     if mg.PLATFORM == mg.MAC:
         self.html.Bind(wx.EVT_WINDOW_CREATE, self.on_show)
     else:
         self.Bind(wx.EVT_SHOW, self.on_show)
     self.btn_run.Enable(False)
     self.chk_add_to_report.Enable(False)
     help_down_by = 27 if mg.PLATFORM == mg.MAC else 17
     szr_top.Add(self.btn_help, 0, wx.TOP, help_down_by)
     szr_top.Add(self.szr_data, 1, wx.LEFT, 5)
     try:
         szr_tab_type.Add(self.rad_opts, 0, wx.LEFT | wx.RIGHT, 10)
     except TypeError:
         szr_tab_type.Add(self.rad_opts.get_szr(), 0, wx.LEFT | wx.RIGHT,
                          10)
     szr_titles.Add(lbl_titles, 0, wx.RIGHT, 5)
     szr_titles.Add(self.txt_titles, 1, wx.RIGHT, 10)
     szr_titles.Add(lbl_subtitles, 0, wx.RIGHT, 5)
     szr_titles.Add(self.txt_subtitles, 1)
     szr_raw_display_opts.Add(self.chk_totals_row, 0)
     szr_raw_display_opts.Add(self.chk_first_as_label, 0)
     szr_opts.Add(szr_raw_display_opts, 0)
     szr_opts.Add(self.chk_show_perc_symbol, 0, wx.RIGHT, 20)
     szr_opts.Add(self.lbl_dp_spinner, 0, wx.RIGHT | wx.TOP, 5)
     szr_opts.Add(self.dp_spinner, 0)
     szr_tab_type.Add(szr_opts, 0)
     szr_rows.Add(lbl_rows, 0)
     szr_row_btns = wx.BoxSizer(wx.HORIZONTAL)
     szr_row_btns.Add(self.btn_row_add, 0, wx.RIGHT, 2)
     szr_row_btns.Add(self.btn_row_add_under, 0, wx.RIGHT, 2)
     szr_row_btns.Add(self.btn_row_del, 0, wx.RIGHT, 2)
     szr_row_btns.Add(self.btn_row_conf)
     szr_rows.Add(szr_row_btns, 0)
     szr_rows.Add(self.rowtree, 1, wx.GROW)
     szr_cols.Add(lbl_cols, 0)
     szr_col_btns.Add(self.btn_col_add, 0, wx.RIGHT, 2)
     szr_col_btns.Add(self.btn_col_add_under, 0, wx.RIGHT, 2)
     szr_col_btns.Add(self.btn_col_del, 0, wx.RIGHT, 2)
     szr_col_btns.Add(self.btn_col_conf)
     szr_cols.Add(szr_col_btns)
     szr_cols.Add(self.coltree, 1, wx.GROW)
     szr_trees.Add(szr_rows, 1, wx.GROW | wx.RIGHT, 2)
     szr_trees.Add(szr_cols, 1, wx.GROW | wx.LEFT, 2)
     szr_html.Add(self.html, 1, wx.GROW)
     szr_bottom.Add(szr_html, 1, wx.GROW | wx.LEFT | wx.RIGHT, 10)
     szr_bottom.Add(self.szr_output_display, 0, wx.GROW | wx.RIGHT, 5)
     static_box_gap = 0 if mg.PLATFORM == mg.MAC else 5
     if static_box_gap:
         szr_main.Add(wx.BoxSizer(wx.VERTICAL), 0, wx.TOP, static_box_gap)
     szr_main.Add(szr_top, 0, wx.GROW | wx.LEFT | wx.RIGHT, 10)
     if static_box_gap:
         szr_main.Add(wx.BoxSizer(wx.VERTICAL), 0, wx.TOP, static_box_gap)
     szr_main.Add(szr_tab_type, 0, wx.BOTTOM, 5)
     szr_main.Add(szr_trees, 1, wx.GROW | wx.LEFT | wx.RIGHT, 10)
     szr_main.Add(szr_titles, 0,
                  wx.GROW | wx.LEFT | wx.TOP | wx.RIGHT | wx.BOTTOM, 10)
     szr_main.Add(self.szr_output_config, 0, wx.GROW | wx.LEFT | wx.RIGHT,
                  10)
     szr_main.Add(szr_bottom, 2, wx.GROW | wx.TOP | wx.BOTTOM, 5)
     self.panel.SetSizer(szr_main)
     szr_lst = [
         szr_top, szr_tab_type, szr_trees, szr_titles,
         self.szr_output_config, szr_bottom
     ]
     lib.GuiLib.set_size(window=self, szr_lst=szr_lst, width_init=1024)
    def __init__(self, parent, hal, title):
        """
            wxPython frame used to show the simulator on your screen

        :param parent: wx Main Window
        :param hal: CBHAL instance
        :param title: Title to give the simulator
        """
        self.parent = parent
        self.hal = hal
        wx.Frame.__init__(self,
                          parent=parent,
                          title=title,
                          style=wx.DEFAULT_FRAME_STYLE & (~wx.CLOSE_BOX))

        self.v_sizer = wx.BoxSizer(wx.VERTICAL)

        ##########################################
        # Setup the Hyper Tree List
        #
        self.tree = HTL.HyperTreeList(
            parent=self,
            id=wx.ID_ANY,
            agwStyle=wx.TR_DEFAULT_STYLE | wx.TR_EDIT_LABELS | wx.TR_HIDE_ROOT,
        )
        self.tree.AddColumn('Name')
        self.tree.AddColumn('Status')

        self.tree.AddRoot('Root')

        self.tree.SetMainColumn(0)

        label = self.tree.AppendItem(self.tree.GetRootItem(),
                                     'Control Board Connected?')
        self.connection_status = wx.CheckBox(self)
        self.connection_status.SetValue(True)
        self.tree.SetItemWindow(label, self.connection_status, 1)

        self.analog_status = self.tree.AppendItem(self.tree.GetRootItem(),
                                                  'Analog Inputs')
        self.led_status = self.tree.AppendItem(self.tree.GetRootItem(),
                                               'LED Outputs')
        self.pwm_status = self.tree.AppendItem(self.tree.GetRootItem(),
                                               'PWM Outputs')
        self.switch_status = self.tree.AppendItem(self.tree.GetRootItem(),
                                                  'Switch Inputs')

        self.LED_Status = []

        for array_index in range(self.hal.LED_OUTPUTS):
            label = self.tree.AppendItem(self.led_status,
                                         'LED ' + str(array_index))
            item = wx.StaticText(self, label=self.DEFAULT_STATUS)
            self.LED_Status.append(item)
            self.tree.SetItemWindow(label, item, 1)

        self.PWM_Status = []
        for array_index in range(self.hal.PWM_OUTPUTS):
            label = self.tree.AppendItem(self.pwm_status,
                                         'PWM ' + str(array_index))
            item = wx.StaticText(self, label=self.DEFAULT_STATUS)
            self.PWM_Status.append(item)
            self.tree.SetItemWindow(label, item, 1)

        self.ANA_Status = []
        for array_index in range(self.hal.ANALOG_INPUTS):
            label = self.tree.AppendItem(self.analog_status,
                                         'ANA ' + str(array_index))
            item = wx.Slider(self)
            item.SetMin(0)
            item.SetMax(255)
            self.ANA_Status.append(item)
            self.tree.SetItemWindow(label, item, 1)

        self.SW_Status = []
        for array_index in range(self.hal.SWITCH_INPUTS):
            label = self.tree.AppendItem(self.switch_status,
                                         'SW ' + str(array_index))
            item = wx.CheckBox(self)
            self.SW_Status.append(item)
            self.tree.SetItemWindow(label, item, 1)

        self.analogs_out = [0] * self.hal.ANALOG_INPUTS
        self.switches_out = [False] * self.hal.SWITCH_INPUTS
        self.pwm_in = [0] * self.hal.PWM_OUTPUTS
        self.led_in = [False] * self.hal.LED_OUTPUTS

        self.tree.CalculateAndSetHeaderHeight()
        self.tree.DoHeaderLayout()
        self.tree.SetColumnWidth(0, self.tree.DoGetBestSize().GetWidth())
        #
        # Done setting up the Hyper Tree List
        ##########################################

        self.v_sizer.Add(self.tree, 1, wx.EXPAND, 0)
        self.tree.InvalidateBestSize()
        self.v_sizer.SetMinSize(self.tree.GetBestSize())

        self.SetAutoLayout(True)
        self.SetSizer(self.v_sizer)
        self.Layout()

        self.Refresh()