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)
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])
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)
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))
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))
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)
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)
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()
def test_lib_agw_hypertreelistCtor(self): tree = HTL.HyperTreeList(self.frame) self.assertEqual(tree.GetAGWWindowStyleFlag(), CT.TR_DEFAULT_STYLE) self.assertEqual(tree.GetRootItem(), None)
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()
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()