Advertisement
Guest User

Untitled

a guest
Mar 1st, 2015
324
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.45 KB | None | 0 0
  1. ###########################################################################
  2. ## pyfatogllepanel.py
  3. ##
  4. ## Author: Darriele - HomeWorld
  5. ##
  6. ## Project home: http://github.com/DarkFenX/Pyfa - pyfa project
  7. ## Some portions of code are based on
  8. ## AGW:pycollapsiblepane generic implementation of wx.CollapsiblePane
  9. ## AGW:pycollapsiblepane credits ( from the original source file used ):
  10. ## Andrea Gavana, @ 09 Aug 2007
  11. ## Latest Revision: 12 Apr 2010, 12.00 GMT
  12. ##
  13. ## Module description:
  14. ## TogglePanel class is a wx.collipsablepane like implementation that uses
  15. ## some optimization from awg::pycollipsablepane to provide certain
  16. ## features tailored for PYFA needs.
  17. ##
  18. ## This module is part of PYFA (PYthon Fitting Assitant) and it shares the same
  19. ## licence ( read PYFA licence notice: gpl.txt )
  20. ##
  21. ## Notes: leave the commented code as it is, those line will be removed someday
  22. ## WHEN ADDING TOGGLEPANEL TO SIZER Ensure:
  23. ## sizer is vertical
  24. ## proportion=0 when adding
  25. ###########################################################################
  26.  
  27. import wx
  28.  
  29. ###########################################################################
  30. ## Class TogglePanel
  31. ###########################################################################
  32.  
  33. class TogglePanel (wx.Panel):
  34.  
  35. def __init__(self, parent, force_layout=False, *args, **kargs):
  36. super().__init__(parent, *args, **kargs)
  37.  
  38. self._toggled = True
  39. self.parent = parent
  40. self.force_layout = force_layout
  41.  
  42. # Create the main sizer of this panel
  43. self.main_sizer = wx.BoxSizer( wx.VERTICAL )
  44. self.SetSizer(self.main_sizer)
  45.  
  46. # Create the header panel, set sizer, and add to main sizer
  47. self.header_panel = wx.Panel(self)
  48. header_sizer = wx.BoxSizer(wx.HORIZONTAL)
  49. self.header_panel.SetSizer(header_sizer)
  50.  
  51. self.main_sizer.Add(self.header_panel, 0, wx.EXPAND | wx.TOP |
  52. wx.BOTTOM | wx.RIGHT, 1)
  53.  
  54. # Add arrow
  55. self.header_arrow = wx.StaticText(self.header_panel, wx.ID_ANY,
  56. "\u25bc")
  57. header_sizer.Add(self.header_arrow, 0, wx.RIGHT, 5)
  58.  
  59. # Add header text
  60. self.header_label = wx.StaticText(self.header_panel, wx.ID_ANY, "")
  61. font = parent.GetFont()
  62. font.SetWeight(wx.BOLD)
  63. self.header_label.SetFont(font)
  64. header_sizer.Add(self.header_label, 0, wx.RIGHT, 5)
  65.  
  66. # Add a sizer for additional header items if we need it
  67. self.hcontent_sizer = wx.BoxSizer(wx.HORIZONTAL)
  68. header_sizer.Add(self.hcontent_sizer, 0, wx.RIGHT, 5)
  69.  
  70. # Create the content panel, set sizer, and add to main sizer
  71. self.content_panel = wx.Panel(self)
  72. self.content_sizer = wx.BoxSizer(wx.VERTICAL)
  73. self.content_panel.SetSizer(self.content_sizer)
  74.  
  75. self.main_sizer.Add(self.content_panel, 0, wx.EXPAND | wx.RIGHT |
  76. wx.LEFT, 5)
  77.  
  78. self.Layout()
  79.  
  80. # Connect Events
  81. self.header_label.Bind(wx.EVT_LEFT_UP, self.ToggleContent)
  82. self.header_arrow.Bind(wx.EVT_LEFT_UP, self.ToggleContent)
  83. self.header_panel.Bind(wx.EVT_LEFT_UP, self.ToggleContent)
  84.  
  85. def __del__(self):
  86. pass
  87.  
  88. def AddToggleItem(self, item):
  89. item.Bind(wx.EVT_LEFT_UP, self.ToggleContent)
  90.  
  91. def GetHeaderContentSizer(self):
  92. return self.hcontent_sizer
  93.  
  94. def GetHeaderPanel(self):
  95. return self.header_panel
  96.  
  97. def InsertItemInHeader(self, item):
  98. self.hcontent_sizer.Add(item, 0, 0, 0)
  99. self.AddToggleItem(item)
  100. self.Layout()
  101.  
  102. def AddSizer(self, sizer):
  103. self.content_sizer.Add(sizer, 0, wx.EXPAND | wx.ALL, 0)
  104. self.Layout()
  105.  
  106. def GetContentPanel(self):
  107. return self.content_panel
  108.  
  109. def SetLabel(self, label):
  110. self.header_label.SetLabel(label)
  111.  
  112. def IsCollapsed(self):
  113. return not self._toggled
  114.  
  115. def IsExpanded(self):
  116. return self._toggled
  117.  
  118. ### DIS IS BROKEN!
  119. def OnStateChange(self, sz):
  120. # minimal size has priority over the best size so set here our min size
  121. self.SetMinSize(sz)
  122. self.SetSize(sz)
  123.  
  124. self.parent.GetSizer().SetSizeHints(self.parent)
  125. self.parent.InvalidateBestSize()
  126. if not self._toggled:
  127. if self.parent.GetSizer():
  128. # we have just set the size hints...
  129. sz = self.parent.GetSizer().CalcMin()
  130.  
  131. # use SetClientSize() and not SetSize() otherwise the size for
  132. # e.g. a wxFrame with a menubar wouldn't be correctly set
  133. self.parent.SetClientSize(sz)
  134. else:
  135. self.parent.Layout()
  136. else:
  137. # collapsed . expanded transition
  138. # force our parent to "fit", i.e. expand so that it can honour
  139. # our minimal size
  140. self.parent.Fit()
  141.  
  142. def ToggleContent(self, event):
  143. self.Freeze()
  144.  
  145. if self._toggled:
  146. # If we are expanded, save previous size and collapse by setting
  147. # content height to 0
  148. self.content_min_size = self.content_panel.GetSize()
  149. self.content_panel.SetMinSize((self.content_min_size[0], 0))
  150. self.header_arrow.SetLabel("\u25b6")
  151. else:
  152. # If we are collapsed, set content size to previously saved value
  153. self.content_panel.SetMinSize(self.content_min_size)
  154. self.header_arrow.SetLabel("\u25bc")
  155.  
  156. self._toggled = not self._toggled
  157.  
  158. self.Thaw()
  159.  
  160. if self.force_layout:
  161. self.parent.Layout()
  162. else:
  163. self.OnStateChange(self.GetBestSize())
  164.  
  165. if __name__ == "__main__":
  166.  
  167. class TestPanel(wx.Panel):
  168. def __init__(self, parent):
  169. super().__init__(parent, size=(-1, -1))
  170.  
  171. if 'wxMSW' in wx.PlatformInfo:
  172. color = wx.SystemSettings.GetColour(wx.SYS_COLOUR_BTNFACE)
  173. self.SetBackgroundColour(color)
  174.  
  175. main_sizer = wx.BoxSizer(wx.VERTICAL)
  176.  
  177. toggle_panel = TogglePanel(self)
  178. toggle_panel.SetLabel("Test Header")
  179.  
  180. content_panel = toggle_panel.GetContentPanel()
  181. content_panel.SetBackgroundColour(wx.WHITE)
  182.  
  183. baseSizer = wx.BoxSizer(wx.HORIZONTAL)
  184. head = wx.StaticText(content_panel, -1, "TogglePanel Test")
  185. head.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.BOLD))
  186. baseSizer.Add(head, 0, wx.ALL, 10)
  187. content_panel.SetSizer(baseSizer)
  188.  
  189. main_sizer.Add(toggle_panel, 0, wx.EXPAND | wx.ALL, 2)
  190.  
  191. toggle_panel = TogglePanel(self)
  192. toggle_panel.SetLabel("Test Header")
  193.  
  194. content_panel = toggle_panel.GetContentPanel()
  195. content_panel.SetBackgroundColour(wx.WHITE)
  196.  
  197. baseSizer = wx.BoxSizer(wx.HORIZONTAL)
  198. head = wx.StaticText(content_panel, -1, "TogglePanel Test")
  199. head.SetFont(wx.Font(14, wx.SWISS, wx.NORMAL, wx.BOLD))
  200. baseSizer.Add(head, 0, wx.ALL, 10)
  201. content_panel.SetSizer(baseSizer)
  202.  
  203. main_sizer.Add(toggle_panel, 0, wx.EXPAND | wx.ALL, 2)
  204. self.SetSizer(main_sizer)
  205.  
  206. class Frame(wx.Frame):
  207. def __init__(self, title):
  208. super().__init__(None, title=title, size=(500, 500))
  209. mainSizer = wx.BoxSizer(wx.VERTICAL)
  210.  
  211. cstatsSizer = wx.BoxSizer(wx.VERTICAL)
  212.  
  213. self.statsPane = TestPanel(self)
  214. cstatsSizer.Add(self.statsPane, 0, wx.EXPAND)
  215.  
  216. mainSizer.Add(cstatsSizer, 0, wx.EXPAND)
  217. btn = wx.Button(self, label='Inspect')
  218. self.Bind( wx.EVT_BUTTON, self.OnClick, btn )
  219. mainSizer.Add(btn, 0, 0)
  220. self.SetSizerAndFit(mainSizer)
  221.  
  222. def OnClick(self, event):
  223. from wx.lib.inspection import InspectionTool
  224. if not InspectionTool().initialized:
  225. InspectionTool().Init()
  226.  
  227. # Find a widget to be selected in the tree. Use either the
  228. # one under the cursor, if any, or this frame.
  229. wnd = wx.FindWindowAtPointer()
  230. if not wnd:
  231. wnd = self
  232. InspectionTool().Show(wnd, True)
  233.  
  234.  
  235. app = wx.App(redirect=False) # Error messages go to popup window
  236. top = Frame("Test Toggle Panel")
  237. top.Show()
  238. app.MainLoop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement