Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ###########################################################################
- ## pyfatogllepanel.py
- ##
- ## Author: Darriele - HomeWorld
- ##
- ## Project home: http://github.com/DarkFenX/Pyfa - pyfa project
- ## Some portions of code are based on
- ## AGW:pycollapsiblepane generic implementation of wx.CollapsiblePane
- ## AGW:pycollapsiblepane credits ( from the original source file used ):
- ## Andrea Gavana, @ 09 Aug 2007
- ## Latest Revision: 12 Apr 2010, 12.00 GMT
- ##
- ## Module description:
- ## TogglePanel class is a wx.collipsablepane like implementation that uses
- ## some optimization from awg::pycollipsablepane to provide certain
- ## features tailored for PYFA needs.
- ##
- ## This module is part of PYFA (PYthon Fitting Assitant) and it shares the same
- ## licence ( read PYFA licence notice: gpl.txt )
- ##
- ## Notes: leave the commented code as it is, those line will be removed someday
- ## WHEN ADDING TOGGLEPANEL TO SIZER Ensure:
- ## sizer is vertical
- ## proportion=0 when adding
- ###########################################################################
- import wx
- ###########################################################################
- ## Class TogglePanel
- ###########################################################################
- class TogglePanel (wx.Panel):
- def __init__(self, parent, force_layout=False, *args, **kargs):
- super().__init__(parent, *args, **kargs)
- self._toggled = True
- self.parent = parent
- self.force_layout = force_layout
- # Create the main sizer of this panel
- self.main_sizer = wx.BoxSizer( wx.VERTICAL )
- self.SetSizer(self.main_sizer)
- # Create the header panel, set sizer, and add to main sizer
- self.header_panel = wx.Panel(self)
- header_sizer = wx.BoxSizer(wx.HORIZONTAL)
- self.header_panel.SetSizer(header_sizer)
- self.main_sizer.Add(self.header_panel, 0, wx.EXPAND | wx.TOP |
- wx.BOTTOM | wx.RIGHT, 1)
- # Add arrow
- self.header_arrow = wx.StaticText(self.header_panel, wx.ID_ANY,
- "\u25bc")
- header_sizer.Add(self.header_arrow, 0, wx.RIGHT, 5)
- # Add header text
- self.header_label = wx.StaticText(self.header_panel, wx.ID_ANY, "")
- font = parent.GetFont()
- font.SetWeight(wx.BOLD)
- self.header_label.SetFont(font)
- header_sizer.Add(self.header_label, 0, wx.RIGHT, 5)
- # Add a sizer for additional header items if we need it
- self.hcontent_sizer = wx.BoxSizer(wx.HORIZONTAL)
- header_sizer.Add(self.hcontent_sizer, 0, wx.RIGHT, 5)
- # Create the content panel, set sizer, and add to main sizer
- self.content_panel = wx.Panel(self)
- self.content_sizer = wx.BoxSizer(wx.VERTICAL)
- self.content_panel.SetSizer(self.content_sizer)
- self.main_sizer.Add(self.content_panel, 0, wx.EXPAND | wx.RIGHT |
- wx.LEFT, 5)
- self.Layout()
- # Connect Events
- self.header_label.Bind(wx.EVT_LEFT_UP, self.ToggleContent)
- self.header_arrow.Bind(wx.EVT_LEFT_UP, self.ToggleContent)
- self.header_panel.Bind(wx.EVT_LEFT_UP, self.ToggleContent)
- def __del__(self):
- pass
- def AddToggleItem(self, item):
- item.Bind(wx.EVT_LEFT_UP, self.ToggleContent)
- def GetHeaderContentSizer(self):
- return self.hcontent_sizer
- def GetHeaderPanel(self):
- return self.header_panel
- def InsertItemInHeader(self, item):
- self.hcontent_sizer.Add(item, 0, 0, 0)
- self.AddToggleItem(item)
- self.Layout()
- def AddSizer(self, sizer):
- self.content_sizer.Add(sizer, 0, wx.EXPAND | wx.ALL, 0)
- self.Layout()
- def GetContentPanel(self):
- return self.content_panel
- def SetLabel(self, label):
- self.header_label.SetLabel(label)
- def IsCollapsed(self):
- return not self._toggled
- def IsExpanded(self):
- return self._toggled
- ### DIS IS BROKEN!
- def OnStateChange(self, sz):
- # minimal size has priority over the best size so set here our min size
- self.SetMinSize(sz)
- self.SetSize(sz)
- self.parent.GetSizer().SetSizeHints(self.parent)
- self.parent.InvalidateBestSize()
- if not self._toggled:
- if self.parent.GetSizer():
- # we have just set the size hints...
- sz = self.parent.GetSizer().CalcMin()
- # use SetClientSize() and not SetSize() otherwise the size for
- # e.g. a wxFrame with a menubar wouldn't be correctly set
- self.parent.SetClientSize(sz)
- else:
- self.parent.Layout()
- else:
- # collapsed . expanded transition
- # force our parent to "fit", i.e. expand so that it can honour
- # our minimal size
- self.parent.Fit()
- def ToggleContent(self, event):
- self.Freeze()
- if self._toggled:
- # If we are expanded, save previous size and collapse by setting
- # content height to 0
- self.content_min_size = self.content_panel.GetSize()
- self.content_panel.SetMinSize((self.content_min_size[0], 0))
- self.header_arrow.SetLabel("\u25b6")
- else:
- # If we are collapsed, set content size to previously saved value
- self.content_panel.SetMinSize(self.content_min_size)
- self.header_arrow.SetLabel("\u25bc")
- self._toggled = not self._toggled
- self.Thaw()
- if self.force_layout:
- self.parent.Layout()
- else:
- self.OnStateChange(self.GetBestSize())
- if __name__ == "__main__":
- class TestPanel(wx.Panel):
- def __init__(self, parent):
- super().__init__(parent, size=(-1, -1))
- if 'wxMSW' in wx.PlatformInfo:
- color = wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNFACE)
- self.SetBackgroundColour(color)
- main_sizer = wx.BoxSizer(wx.VERTICAL)
- toggle_panel = TogglePanel(self)
- toggle_panel.SetLabel("Test Header")
- content_panel = toggle_panel.GetContentPanel()
- content_panel.SetBackgroundColour(wx.WHITE)
- baseSizer = wx.BoxSizer(wx.HORIZONTAL)
- head = wx.StaticText(content_panel, -1, "TogglePanel Test")
- head.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.BOLD))
- baseSizer.Add(head, 0, wx.ALL, 10)
- content_panel.SetSizer(baseSizer)
- main_sizer.Add(toggle_panel, 0, wx.EXPAND | wx.ALL, 2)
- toggle_panel = TogglePanel(self)
- toggle_panel.SetLabel("Test Header")
- content_panel = toggle_panel.GetContentPanel()
- content_panel.SetBackgroundColour(wx.WHITE)
- baseSizer = wx.BoxSizer(wx.HORIZONTAL)
- head = wx.StaticText(content_panel, -1, "TogglePanel Test")
- head.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.BOLD))
- baseSizer.Add(head, 0, wx.ALL, 10)
- content_panel.SetSizer(baseSizer)
- main_sizer.Add(toggle_panel, 0, wx.EXPAND | wx.ALL, 2)
- self.SetSizer(main_sizer)
- class Frame(wx.Frame):
- def __init__(self, title):
- super().__init__(None, title=title, size=(500, 500))
- mainSizer = wx.BoxSizer(wx.VERTICAL)
- cstatsSizer = wx.BoxSizer(wx.VERTICAL)
- self.statsPane = TestPanel(self)
- cstatsSizer.Add(self.statsPane, 0, wx.EXPAND)
- mainSizer.Add(cstatsSizer, 0, wx.EXPAND)
- btn = wx.Button(self, label='Inspect')
- self.Bind( wx.EVT_BUTTON, self.OnClick, btn )
- mainSizer.Add(btn, 0, 0)
- self.SetSizerAndFit(mainSizer)
- def OnClick(self, event):
- from wx.lib.inspection import InspectionTool
- if not InspectionTool().initialized:
- InspectionTool().Init()
- # Find a widget to be selected in the tree. Use either the
- # one under the cursor, if any, or this frame.
- wnd = wx.FindWindowAtPointer()
- if not wnd:
- wnd = self
- InspectionTool().Show(wnd, True)
- app = wx.App(redirect=False) # Error messages go to popup window
- top = Frame("Test Toggle Panel")
- top.Show()
- app.MainLoop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement