]> git.saurik.com Git - wxWidgets.git/blame - wxPython/demo/MultiSplitterWindow.py
Avoid assert on Mac
[wxWidgets.git] / wxPython / demo / MultiSplitterWindow.py
CommitLineData
0263d0bb
RD
1
2import wx
3from wx.lib.splitter import MultiSplitterWindow
4
5#----------------------------------------------------------------------
6
7class SamplePane(wx.Panel):
8 """
9 Just a simple test window to put into the splitter.
10 """
11 def __init__(self, parent, colour, label):
12 wx.Panel.__init__(self, parent, style=wx.BORDER_SUNKEN)
13 self.SetBackgroundColour(colour)
14 wx.StaticText(self, -1, label, (5,5))
15
16 def SetOtherLabel(self, label):
17 wx.StaticText(self, -1, label, (5, 30))
18
19
20
21class ControlPane(wx.Panel):
22 def __init__(self, parent):
23 wx.Panel.__init__(self, parent)
24
25 hvBox = wx.RadioBox(self, -1, "Orientation",
26 choices=["Horizontal", "Vertical"],
27 style=wx.RA_SPECIFY_COLS,
28 majorDimension=1)
29 hvBox.SetSelection(0)
30 self.Bind(wx.EVT_RADIOBOX, self.OnSetHV, hvBox)
31
32 luCheck = wx.CheckBox(self, -1, "Live Update")
33 luCheck.SetValue(True)
34 self.Bind(wx.EVT_CHECKBOX, self.OnSetLiveUpdate, luCheck)
35
36 btn = wx.Button(self, -1, "Swap 2 && 4")
37 self.Bind(wx.EVT_BUTTON, self.OnSwapButton, btn)
38
39 sizer = wx.BoxSizer(wx.VERTICAL)
40 sizer.Add(hvBox)
41 sizer.Add(luCheck, 0, wx.TOP, 5)
42 sizer.Add(btn, 0, wx.TOP, 5)
43 border = wx.BoxSizer()
44 border.Add(sizer, 1, wx.EXPAND|wx.ALL, 5)
45 self.SetSizer(border)
46
47
48 def OnSetHV(self, evt):
49 rb = evt.GetEventObject()
50 self.GetParent().SetOrientation(rb.GetSelection())
51
52
53 def OnSetLiveUpdate(self, evt):
54 check = evt.GetEventObject()
55 self.GetParent().SetLiveUpdate(check.GetValue())
56
57
58 def OnSwapButton(self, evt):
59 self.GetParent().Swap2and4()
60
61
62
63class TestPanel(wx.Panel):
64 def __init__(self, parent, log):
65 self.log = log
66 wx.Panel.__init__(self, parent, -1)
67
68 cp = ControlPane(self)
69
70 splitter = MultiSplitterWindow(self, style=wx.SP_LIVE_UPDATE)
71 self.splitter = splitter
72 sizer = wx.BoxSizer(wx.HORIZONTAL)
73 sizer.Add(cp)
74 sizer.Add(splitter, 1, wx.EXPAND)
75 self.SetSizer(sizer)
76
77
78 p1 = SamplePane(splitter, "pink", "Panel One")
79 p1.SetOtherLabel(
80 "There are two sash\n"
81 "drag modes. Try\n"
82 "dragging with and\n"
83 "without the Shift\n"
84 "key held down."
85 )
86 splitter.AppendWindow(p1, 140)
87
88 p2 = SamplePane(splitter, "sky blue", "Panel Two")
89 p2.SetOtherLabel("This window\nhas a\nminsize.")
90 p2.SetMinSize(p2.GetBestSize())
91 splitter.AppendWindow(p2, 150)
92
93 p3 = SamplePane(splitter, "yellow", "Panel Three")
94 splitter.AppendWindow(p3, 125)
95
96 p4 = SamplePane(splitter, "Lime Green", "Panel Four")
97 splitter.AppendWindow(p4)
98
99 self.Bind(wx.EVT_SPLITTER_SASH_POS_CHANGED, self.OnChanged)
100 self.Bind(wx.EVT_SPLITTER_SASH_POS_CHANGING, self.OnChanging)
101
102
103 def OnChanging(self, evt):
104 self.log.write( "Changing sash:%d %s\n" %
105 (evt.GetSashIdx(), evt.GetSashPosition()))
106 # This is one way to control the sash limits
107 #if evt.GetSashPosition() < 50:
108 # evt.Veto()
109
110 # Or you can reset the sash position to whatever you want
111 #if evt.GetSashPosition() < 5:
112 # evt.SetSashPosition(25)
113
114
115 def OnChanged(self, evt):
116 self.log.write( "Changed sash:%d %s\n" %
117 (evt.GetSashIdx(), evt.GetSashPosition()))
118
119
120 def SetOrientation(self, value):
121 if value:
122 self.splitter.SetOrientation(wx.VERTICAL)
123 else:
124 self.splitter.SetOrientation(wx.HORIZONTAL)
125 self.splitter.SizeWindows()
126
127
128 def SetLiveUpdate(self, enable):
129 if enable:
130 self.splitter.SetWindowStyle(wx.SP_LIVE_UPDATE)
131 else:
132 self.splitter.SetWindowStyle(0)
133
134
135 def Swap2and4(self):
136 win2 = self.splitter.GetWindow(1)
137 win4 = self.splitter.GetWindow(3)
138 self.splitter.ExchangeWindows(win2, win4)
139
140#----------------------------------------------------------------------
141
142def runTest(frame, nb, log):
143 win = TestPanel(nb, log)
144 return win
145
146#----------------------------------------------------------------------
147
148
149
150overview = """<html><body>
151<h2><center>MultiSplitterWindow</center></h2>
152
153This class is very similar to wx.SplitterWindow except that it
154allows for more than two windows and more than one sash. Many of
155the same styles, constants, and methods behave the same as in
156wx.SplitterWindow.
157
158</body></html>
159"""
160
161
162
163if __name__ == '__main__':
164 import sys,os
165 import run
166 run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])
167