import wx # type: ignore from gooey.gui.util import wx_util class Sidebar(wx.Panel): """ Sidebar handles the show/hide logic so that it mirrors the functionality of the wx.Notebook class (which wants to control everything) """ def __init__(self, parent, buildSpec, configPanels, *args, **kwargs): super(Sidebar, self).__init__(parent, *args, **kwargs) self._parent = parent self.buildSpec = buildSpec self.configPanels = configPanels self.activeSelection = 0 self.options = list(self.buildSpec['widgets'].keys()) self.leftPanel = wx.Panel(self) self.label = wx_util.h1(self.leftPanel, self.buildSpec.get('sidebar_title')) self.listbox = wx.ListBox(self.leftPanel, -1, choices=self.options) self.Bind(wx.EVT_LISTBOX, self.swapConfigPanels, self.listbox) self.layoutComponent() self.listbox.SetSelection(0) def getSelectedGroup(self): """Return the currently active 'group' i.e. the root SubParser """ return self.options[self.activeSelection] def getActiveConfig(self): """Return the currently visible config screen""" return self.configPanels[self.activeSelection] def swapConfigPanels(self, event): """Hide/show configuration panels based on the currently selected option in the sidebar """ for id, panel in enumerate(self.configPanels): panel.Hide() self.activeSelection = event.Selection self.configPanels[event.Selection].Show() self._parent.Layout() def layoutComponent(self): left = self.layoutLeftSide() hsizer = wx.BoxSizer(wx.HORIZONTAL) hsizer.Add(left, 0, wx.EXPAND) if not self.buildSpec['tabbed_groups']: # only add it for non-tabbed layouts as it looks # weird against the tabbed ones hsizer.Add(wx_util.vertical_rule(self), 0, wx.EXPAND) for body in self.configPanels: body.Reparent(self) hsizer.Add(body, 1, wx.EXPAND) body.Hide() self.configPanels[0].Show() self.SetSizer(hsizer) if not self.buildSpec['show_sidebar']: left.Show(False) self.Layout() def layoutLeftSide(self): self.leftPanel.SetBackgroundColour(self.buildSpec['sidebar_bg_color']) self.leftPanel.SetSize((180, 0)) self.leftPanel.SetMinSize((180, 0)) container = wx.BoxSizer(wx.VERTICAL) container.AddSpacer(15) container.Add(self.label, 0, wx.LEFT | wx.RIGHT | wx.EXPAND, 10) container.AddSpacer(5) container.Add(self.listbox, 1, wx.LEFT | wx.RIGHT | wx.EXPAND, 10) container.AddSpacer(20) self.leftPanel.SetSizer(container) return self.leftPanel