]> git.saurik.com Git - wxWidgets.git/blame - wxPython/demo/GridBagSizer.py
The great wxVScrolledWindow refactoring: allow using it both horizontal and
[wxWidgets.git] / wxPython / demo / GridBagSizer.py
CommitLineData
d14a1e28
RD
1
2import wx # This module uses the new wx namespace
3
4#----------------------------------------------------------------------
5gbsDescription = """\
95bfd958 6The wx.GridBagSizer is similar to the wx.FlexGridSizer except the items are explicitly positioned
d14a1e28
RD
7in a virtual cell of the layout grid, and column or row spanning is allowed. For example, this
8static text is positioned at (0,0) and it spans 7 columns.
9"""
10
11
12class TestFrame(wx.Frame):
13 def __init__(self):
95bfd958 14 wx.Frame.__init__(self, None, -1, "wx.GridBagSizer")
630edaac
RD
15 p = wx.Panel(self, -1, style = wx.TAB_TRAVERSAL
16 | wx.CLIP_CHILDREN
17 | wx.FULL_REPAINT_ON_RESIZE
18 )
bf08dd12
RD
19 p.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
20
21 gbs = self.gbs = wx.GridBagSizer(5, 5)
d14a1e28
RD
22
23 gbs.Add( wx.StaticText(p, -1, gbsDescription),
24 (0,0), (1,7), wx.ALIGN_CENTER | wx.ALL, 5)
25
d14a1e28
RD
26 gbs.Add( wx.TextCtrl(p, -1, "pos(1,0)"), (1,0) )
27 gbs.Add( wx.TextCtrl(p, -1, "pos(1,1)"), (1,1) )
28 gbs.Add( wx.TextCtrl(p, -1, "pos(2,0)"), (2,0) )
29 gbs.Add( wx.TextCtrl(p, -1, "pos(2,1)"), (2,1) )
30
31 gbs.Add( wx.TextCtrl(p, -1, "pos(3,2), span(1,2)\nthis row and col are growable", style=wx.TE_MULTILINE),
32 (3,2), (1,2), flag=wx.EXPAND )
33
34 gbs.Add( wx.TextCtrl(p, -1, "pos(4,3), span(3,1)", style=wx.TE_MULTILINE),
35 (4,3), (3,1), wx.EXPAND)
36
37 gbs.Add( wx.TextCtrl(p, -1, "pos(5,4)"), (5,4), flag=wx.EXPAND )
38 gbs.Add( wx.TextCtrl(p, -1, "pos(6,5)"), (6,5), flag=wx.EXPAND )
39 gbs.Add( wx.TextCtrl(p, -1, "pos(7,6)"), (7,6) )
40
41 moveBtn1 = wx.Button(p, -1, "Move this to (3,6)")
42 moveBtn2 = wx.Button(p, -1, "Move this to (3,6)");
43 gbs.Add( moveBtn1, (10,2) )
44 gbs.Add( moveBtn2, (10,3) )
45
46 hideBtn = wx.Button(p, -1, "Hide this item -->")
47 gbs.Add(hideBtn, (12, 3))
48
49 hideTxt = wx.TextCtrl(p, -1, "pos(12,4), size(150, -1)", size = (150,-1))
50 gbs.Add( hideTxt, (12,4) )
51
52 showBtn = wx.Button(p, -1, "<-- Show it again")
53 gbs.Add(showBtn, (12, 5))
54 showBtn.Disable()
55 self.hideBtn = hideBtn
56 self.showBtn = showBtn
57 self.hideTxt = hideTxt
58
59 self.Bind(wx.EVT_BUTTON, self.OnHideButton, hideBtn)
60 self.Bind(wx.EVT_BUTTON, self.OnShowButton, showBtn)
61 self.Bind(wx.EVT_BUTTON, self.OnMoveButton, moveBtn1)
62 self.Bind(wx.EVT_BUTTON, self.OnMoveButton, moveBtn2)
63
64 # Add a spacer at the end to ensure some extra space at the bottom
bf08dd12 65 gbs.Add((10,10), (14,7))
d14a1e28
RD
66
67 gbs.AddGrowableRow(3)
68 gbs.AddGrowableCol(2)
69
70 p.SetSizerAndFit(gbs)
71 self.SetClientSize(p.GetSize())
72
73
74 def OnHideButton(self, evt):
75 self.gbs.Hide(self.hideTxt)
76 self.hideBtn.Disable()
77 self.showBtn.Enable()
78 self.gbs.Layout()
79
80
81 def OnShowButton(self, evt):
82 self.gbs.Show(self.hideTxt)
83 self.hideBtn.Enable()
84 self.showBtn.Disable()
85 self.gbs.Layout()
86
87
88 def OnMoveButton(self, evt):
89 btn = evt.GetEventObject()
90 curPos = self.gbs.GetItemPosition(btn)
91
92 # if it's already at the "other" spot then move it back
93 if curPos == (3,6):
94 self.gbs.SetItemPosition(btn, self.lastPos)
95 btn.SetLabel("Move this to (3,6)")
96 else:
1005198c 97 if self.gbs.CheckForIntersectionPos( (3,6), (1,1) ):
d14a1e28 98 wx.MessageBox("""\
95bfd958 99wx.GridBagSizer will not allow items to be in the same cell as
1005198c
RD
100another item, so this operation will fail. You will also get an
101assert when compiled in debug mode.""",
d14a1e28
RD
102 "Warning", wx.OK | wx.ICON_INFORMATION)
103
104 try:
105 if self.gbs.SetItemPosition(btn, (3,6)):
106 self.lastPos = curPos
107 btn.SetLabel("Move it back")
108 except wx.PyAssertionError:
109 pass
110
111 self.gbs.Layout()
112
bf08dd12
RD
113
114 def OnLeftDown(self, evt):
115 pt = evt.GetPosition()
116 item = self.gbs.FindItemAtPoint(pt)
117 if item is None:
118 print "no item at", `pt`
119 else:
120 print "item found: ", `item.GetPos()`, "--", `item.GetSpan()`
121
d14a1e28 122
34a544a6
RD
123#---------------------------------------------------------------------------
124
125class TestPanel(wx.Panel):
126 def __init__(self, parent, log):
127 self.log = log
128 wx.Panel.__init__(self, parent, -1)
129
130 b = wx.Button(self, -1, "Show the GridBagSizer sample", (50,50))
131 self.Bind(wx.EVT_BUTTON, self.OnButton, b)
132
133
134 def OnButton(self, evt):
135 win = TestFrame()
136 win.Show(True)
137
138
139
140#---------------------------------------------------------------------------
141
d14a1e28
RD
142
143def runTest(frame, nb, log):
34a544a6
RD
144 win = TestPanel(nb, log)
145 return win
d14a1e28
RD
146
147
148#----------------------------------------------------------------------
149
150
151
152overview = """<html><body>
95bfd958 153<h2><center>wx.GridBagSizer</center></h2>
d14a1e28 154
95bfd958 155The wx.GridBagSizer is more or less a port of the the RowColSizer (that
d14a1e28
RD
156has been in the wxPython.lib package for quite some time) to C++. It
157allows items to be placed at specific layout grid cells, and items can
158span across more than one row or column.
159</body></html>
160"""
161
162
163
164if __name__ == '__main__':
165 import sys,os
166 import run
8eca4fef 167 run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])
d14a1e28 168