You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

86 lines
2.8 KiB

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