mirror of https://github.com/chriskiehl/Gooey.git
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
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
|
|
|
|
|
|
|