mirror of
https://github.com/wxWidgets/Phoenix.git
synced 2026-01-04 11:00:07 +01:00
309 lines
9.3 KiB
Python
309 lines
9.3 KiB
Python
#!/usr/bin/env python
|
|
|
|
import wx
|
|
import wx.lib.buttons as buttons
|
|
|
|
import os
|
|
import sys
|
|
|
|
try:
|
|
dirName = os.path.dirname(os.path.abspath(__file__))
|
|
except:
|
|
dirName = os.path.dirname(os.path.abspath(sys.argv[0]))
|
|
|
|
sys.path.append(os.path.split(dirName)[0])
|
|
|
|
try:
|
|
from agw import pycollapsiblepane as PCP
|
|
except ImportError: # if it's not there locally, try the wxPython lib.
|
|
import wx.lib.agw.pycollapsiblepane as PCP
|
|
|
|
import images
|
|
|
|
btnlbl1 = "call Expand(True)"
|
|
btnlbl2 = "call Expand(False)"
|
|
|
|
choices = ["wx.Button",
|
|
"GenButton",
|
|
"GenBitmapButton",
|
|
"GenBitmapTextButton",
|
|
"ThemedGenButton",
|
|
"ThemedGenBitmapTextButton"]
|
|
|
|
gtkChoices = ["3, 6",
|
|
"4, 8",
|
|
"5, 10"]
|
|
|
|
styles = ["CP_NO_TLW_RESIZE",
|
|
"CP_LINE_ABOVE",
|
|
"CP_USE_STATICBOX",
|
|
"CP_GTK_EXPANDER"]
|
|
|
|
|
|
class PyCollapsiblePaneDemo(wx.Panel):
|
|
|
|
def __init__(self, parent, log):
|
|
|
|
wx.Panel.__init__(self, parent)
|
|
|
|
self.log = log
|
|
|
|
self.label1 = "Click here to show pane"
|
|
self.label2 = "Click here to hide pane"
|
|
|
|
title = wx.StaticText(self, label="PyCollapsiblePane")
|
|
title.SetFont(wx.Font(18, wx.FONTFAMILY_SWISS, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD))
|
|
title.SetForegroundColour("blue")
|
|
|
|
self.cpStyle = wx.CP_NO_TLW_RESIZE
|
|
self.cp = cp = PCP.PyCollapsiblePane(self, label=self.label1,
|
|
agwStyle=self.cpStyle)
|
|
self.Bind(wx.EVT_COLLAPSIBLEPANE_CHANGED, self.OnPaneChanged, cp)
|
|
self.MakePaneContent(cp.GetPane())
|
|
|
|
self.btnRB = radioBox = wx.RadioBox(self, -1, "Button Types",
|
|
choices=choices, style=wx.RA_SPECIFY_ROWS)
|
|
self.static1 = wx.StaticText(self, -1, "Collapsed Button Text:")
|
|
self.static2 = wx.StaticText(self, -1, "Expanded Button Text:")
|
|
|
|
self.buttonText1 = wx.TextCtrl(self, -1, self.label1)
|
|
self.buttonText2 = wx.TextCtrl(self, -1, self.label2)
|
|
self.updateButton = wx.Button(self, -1, "Update!")
|
|
|
|
sbox = wx.StaticBox(self, -1, 'Styles')
|
|
sboxsizer = wx.StaticBoxSizer(sbox, wx.VERTICAL)
|
|
self.styleCBs = list()
|
|
for styleName in styles:
|
|
cb = wx.CheckBox(self, -1, styleName)
|
|
if styleName == "CP_NO_TLW_RESIZE":
|
|
cb.SetValue(True)
|
|
cb.Disable()
|
|
cb.Bind(wx.EVT_CHECKBOX, self.OnStyleChoice)
|
|
self.styleCBs.append(cb)
|
|
sboxsizer.Add(cb, 0, wx.ALL, 4)
|
|
|
|
self.gtkText = wx.StaticText(self, -1, "Expander Size")
|
|
self.gtkChoice = wx.ComboBox(self, -1, choices=gtkChoices)
|
|
self.gtkChoice.SetSelection(0)
|
|
|
|
self.gtkText.Enable(False)
|
|
self.gtkChoice.Enable(False)
|
|
|
|
sizer = wx.BoxSizer(wx.VERTICAL)
|
|
radioSizer = wx.BoxSizer(wx.HORIZONTAL)
|
|
dummySizer = wx.BoxSizer(wx.VERTICAL)
|
|
|
|
dummySizer.Add(self.gtkText, 0, wx.EXPAND|wx.BOTTOM, 2)
|
|
dummySizer.Add(self.gtkChoice, 0, wx.EXPAND)
|
|
|
|
radioSizer.Add(radioBox, 0, wx.EXPAND)
|
|
radioSizer.Add(sboxsizer, 0, wx.EXPAND|wx.LEFT, 10)
|
|
radioSizer.Add(dummySizer, 0, wx.ALIGN_BOTTOM|wx.LEFT, 10)
|
|
|
|
self.SetSizer(sizer)
|
|
sizer.Add((0, 10))
|
|
sizer.Add(title, 0, wx.LEFT|wx.RIGHT, 25)
|
|
sizer.Add((0, 10))
|
|
sizer.Add(radioSizer, 0, wx.LEFT, 25)
|
|
|
|
sizer.Add((0, 10))
|
|
subSizer = wx.FlexGridSizer(2, 3, 5, 5)
|
|
subSizer.Add(self.static1, 0, wx.LEFT|wx.ALIGN_CENTER_VERTICAL, 5)
|
|
subSizer.Add(self.buttonText1, 0, wx.EXPAND)
|
|
subSizer.Add((0, 0))
|
|
subSizer.Add(self.static2, 0, wx.LEFT|wx.ALIGN_CENTER_VERTICAL, 5)
|
|
subSizer.Add(self.buttonText2, 0, wx.EXPAND)
|
|
subSizer.Add(self.updateButton, 0, wx.LEFT|wx.RIGHT, 10)
|
|
|
|
subSizer.AddGrowableCol(1)
|
|
|
|
sizer.Add(subSizer, 0, wx.EXPAND|wx.LEFT, 20)
|
|
sizer.Add((0, 15))
|
|
sizer.Add(cp, 0, wx.RIGHT|wx.LEFT|wx.EXPAND, 20)
|
|
|
|
self.btn = wx.Button(self, label=btnlbl1)
|
|
sizer.Add(self.btn, 0, wx.ALL, 25)
|
|
|
|
self.Bind(wx.EVT_BUTTON, self.OnToggle, self.btn)
|
|
self.Bind(wx.EVT_BUTTON, self.OnUpdate, self.updateButton)
|
|
self.Bind(wx.EVT_RADIOBOX, self.OnButtonChoice)
|
|
self.Bind(wx.EVT_COMBOBOX, self.OnUserChoice, self.gtkChoice)
|
|
|
|
|
|
def OnToggle(self, event):
|
|
|
|
self.cp.Collapse(self.cp.IsExpanded())
|
|
self.OnPaneChanged()
|
|
|
|
|
|
def OnUpdate(self, event):
|
|
|
|
self.label1 = self.buttonText1.GetValue()
|
|
self.label2 = self.buttonText2.GetValue()
|
|
|
|
self.OnPaneChanged(None)
|
|
|
|
|
|
def OnStyleChoice(self, evt):
|
|
style = 0
|
|
for cb in self.styleCBs:
|
|
if cb.IsChecked():
|
|
style |= getattr(wx, cb.GetLabel(), 0)
|
|
|
|
self.cpStyle = style
|
|
self.Rebuild()
|
|
|
|
|
|
def OnButtonChoice(self, event):
|
|
|
|
#self.gtkText.Enable(selection == 4)
|
|
#self.gtkChoice.Enable(selection == 4)
|
|
|
|
self.Rebuild()
|
|
|
|
|
|
def MakeButton(self):
|
|
|
|
if self.cpStyle & wx.CP_GTK_EXPANDER:
|
|
return None
|
|
|
|
selection = self.btnRB.GetSelection()
|
|
|
|
if selection == 0: # standard wx.Button
|
|
btn = wx.Button(self.cp, -1, self.label1)
|
|
elif selection == 1: # buttons.GenButton
|
|
btn = buttons.GenButton(self.cp, -1, self.label1)
|
|
elif selection == 2: # buttons.GenBitmapButton
|
|
bmp = images.Smiles.GetBitmap()
|
|
btn = buttons.GenBitmapButton(self.cp, -1, bmp)
|
|
elif selection == 3: # buttons.GenBitmapTextButton
|
|
bmp = images.Mondrian.GetBitmap()
|
|
btn = buttons.GenBitmapTextButton(self.cp, -1, bmp, self.label1)
|
|
elif selection == 4: # buttons.ThemedGenButton
|
|
btn = buttons.ThemedGenButton(self.cp, -1, self.label1)
|
|
elif selection == 5: # buttons.ThemedGenBitmapTextButton
|
|
bmp = images.Mondrian.GetBitmap()
|
|
btn = buttons.ThemedGenBitmapTextButton(self.cp, -1, bmp, self.label1)
|
|
|
|
return btn
|
|
|
|
|
|
def Rebuild(self):
|
|
|
|
isExpanded = self.cp.IsExpanded()
|
|
self.Freeze()
|
|
cp = PCP.PyCollapsiblePane(self, label=self.label1, agwStyle=self.cpStyle)
|
|
cp.Bind(wx.EVT_COLLAPSIBLEPANE_CHANGED, self.OnPaneChanged)
|
|
self.MakePaneContent(cp.GetPane())
|
|
cp.SetExpanderDimensions(*self.GetUserSize())
|
|
self.GetSizer().Replace(self.cp, cp)
|
|
self.cp.Destroy()
|
|
self.cp = cp
|
|
|
|
btn = self.MakeButton()
|
|
if btn:
|
|
self.cp.SetButton(btn)
|
|
self.gtkText.Enable(btn is None)
|
|
self.gtkChoice.Enable(btn is None)
|
|
self.btnRB.Enable(btn is not None)
|
|
|
|
if isExpanded:
|
|
self.cp.Expand()
|
|
self.Thaw()
|
|
|
|
self.OnPaneChanged(None)
|
|
self.Layout()
|
|
|
|
|
|
def OnPaneChanged(self, event=None):
|
|
|
|
if event:
|
|
self.log.write('wx.EVT_COLLAPSIBLEPANE_CHANGED: %s\n' % event.Collapsed)
|
|
|
|
# redo the layout
|
|
self.Layout()
|
|
|
|
# and also change the labels
|
|
if self.cp.IsExpanded():
|
|
self.cp.SetLabel(self.label2)
|
|
self.btn.SetLabel(btnlbl2)
|
|
else:
|
|
self.cp.SetLabel(self.label1)
|
|
self.btn.SetLabel(btnlbl1)
|
|
|
|
self.btn.SetInitialSize()
|
|
|
|
|
|
def OnUserChoice(self, event):
|
|
|
|
self.cp.SetExpanderDimensions(*self.GetUserSize(event.GetSelection()))
|
|
|
|
|
|
def GetUserSize(self, selection=None):
|
|
|
|
if selection is None:
|
|
selection = self.gtkChoice.GetSelection()
|
|
|
|
choice = gtkChoices[selection]
|
|
width, height = choice.split(",")
|
|
|
|
return int(width), int(height)
|
|
|
|
|
|
def MakePaneContent(self, pane):
|
|
'''Just make a few controls to put on the collapsible pane'''
|
|
|
|
nameLbl = wx.StaticText(pane, -1, "Name:")
|
|
name = wx.TextCtrl(pane, -1, "");
|
|
|
|
addrLbl = wx.StaticText(pane, -1, "Address:")
|
|
addr1 = wx.TextCtrl(pane, -1, "");
|
|
addr2 = wx.TextCtrl(pane, -1, "");
|
|
|
|
cstLbl = wx.StaticText(pane, -1, "City, State, Zip:")
|
|
city = wx.TextCtrl(pane, -1, "", size=(150,-1));
|
|
state = wx.TextCtrl(pane, -1, "", size=(50,-1));
|
|
zip = wx.TextCtrl(pane, -1, "", size=(70,-1));
|
|
|
|
addrSizer = wx.FlexGridSizer(cols=2, hgap=5, vgap=5)
|
|
addrSizer.AddGrowableCol(1)
|
|
addrSizer.Add(nameLbl, 0,
|
|
wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL)
|
|
addrSizer.Add(name, 0, wx.EXPAND)
|
|
addrSizer.Add(addrLbl, 0,
|
|
wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL)
|
|
addrSizer.Add(addr1, 0, wx.EXPAND)
|
|
addrSizer.Add((5,5))
|
|
addrSizer.Add(addr2, 0, wx.EXPAND)
|
|
|
|
addrSizer.Add(cstLbl, 0,
|
|
wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL)
|
|
|
|
cstSizer = wx.BoxSizer(wx.HORIZONTAL)
|
|
cstSizer.Add(city, 1)
|
|
cstSizer.Add(state, 0, wx.LEFT|wx.RIGHT, 5)
|
|
cstSizer.Add(zip)
|
|
addrSizer.Add(cstSizer, 0, wx.EXPAND)
|
|
|
|
border = wx.BoxSizer()
|
|
border.Add(addrSizer, 1, wx.EXPAND|wx.ALL, 5)
|
|
pane.SetSizer(border)
|
|
|
|
|
|
#----------------------------------------------------------------------
|
|
|
|
def runTest(frame, nb, log):
|
|
win = PyCollapsiblePaneDemo(nb, log)
|
|
return win
|
|
|
|
#----------------------------------------------------------------------
|
|
|
|
overview = PCP.__doc__
|
|
|
|
if __name__ == '__main__':
|
|
import sys,os
|
|
import run
|
|
run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])
|
|
|
|
|