]> git.saurik.com Git - wxWidgets.git/blob - wxPython/demo/LayoutAnchors.py
workaround sizing bug on Mac
[wxWidgets.git] / wxPython / demo / LayoutAnchors.py
1
2 import wx
3 import wx.lib.anchors as anchors
4
5 #----------------------------------------------------------------------
6
7 # Nifty little trick here; apply wx.NewId() to generate a series of
8 # IDs used later on in the app.
9
10 [ ID_ANCHORSDEMOFRAMEANCHOREDPANEL,
11 ID_ANCHORSDEMOFRAMEHELPSTATICTEXT,
12 ID_ANCHORSDEMOFRAMEMAINPANEL,
13 ID_ANCHORSDEMOFRAMEBACKGROUNDPANEL,
14 ID_ANCHORSDEMOFRAMERIGHTCHECKBOX,
15 ID_ANCHORSDEMOFRAMEOKBUTTON,
16 ID_ANCHORSDEMOFRAMETOPCHECKBOX,
17 ID_ANCHORSDEMOFRAMEBOTTOMCHECKBOX,
18 ID_ANCHORSDEMOFRAME,
19 ID_ANCHORSDEMOFRAMELEFTCHECKBOX,
20 ] = map(lambda _init_ctrls: wx.NewId(), range(10))
21
22 # A small note here: while only certain parts of this frame are actually demonstrating
23 # the capabilities of the LayoutAnchors feature, all the controls are within the same
24 # frame; therefore, all controls and windows within the frame must use LayoutAnchors.
25 # You can't mix LayoutAnchors and sizers.
26 class AnchorsDemoFrame(wx.Frame):
27 def _init_utils(self):
28 pass
29
30 def _init_ctrls(self, prnt):
31 wx.Frame.__init__(
32 self, size=(328, 187), id=ID_ANCHORSDEMOFRAME,
33 title='LayoutAnchors Demonstration', parent=prnt,
34 name='AnchorsDemoFrame',
35 style = wx.DEFAULT_FRAME_STYLE | wx.CLIP_CHILDREN, pos=(261, 123)
36 )
37
38 self._init_utils()
39
40 self.mainPanel = wx.Panel(
41 size=(320, 160), parent=self,
42 id=ID_ANCHORSDEMOFRAMEMAINPANEL, name='panel1',
43 style=wx.TAB_TRAVERSAL | wx.CLIP_CHILDREN
44 | wx.FULL_REPAINT_ON_RESIZE,
45 pos=(0, 0)
46 )
47
48 self.mainPanel.SetAutoLayout(True)
49
50 self.okButton = wx.Button(
51 label='OK', id=ID_ANCHORSDEMOFRAMEOKBUTTON,
52 parent=self.mainPanel, name='okButton',
53 size=(72, 24), style=0, pos=(240, 128)
54 )
55
56 self.okButton.SetConstraints(
57 anchors.LayoutAnchors(self.okButton, False, False, True, True)
58 )
59
60 self.Bind(
61 wx.EVT_BUTTON, self.OnOkButtonButton, id=ID_ANCHORSDEMOFRAMEOKBUTTON
62 )
63
64 self.backgroundPanel = wx.Panel(
65 size=(304, 80), parent=self.mainPanel,
66 id=ID_ANCHORSDEMOFRAMEBACKGROUNDPANEL,
67 name='backgroundPanel',
68 style=wx.SIMPLE_BORDER | wx.CLIP_CHILDREN,
69 pos = (8, 40)
70 )
71
72 self.backgroundPanel.SetBackgroundColour(wx.Colour(255, 255, 255))
73 self.backgroundPanel.SetConstraints(
74 anchors.LayoutAnchors(self.backgroundPanel, True, True, True, True)
75 )
76
77 self.anchoredPanel = wx.Panel(
78 size=(88, 48), id=ID_ANCHORSDEMOFRAMEANCHOREDPANEL,
79 parent=self.backgroundPanel, name='anchoredPanel',
80 style=wx.SIMPLE_BORDER, pos=(104, 16)
81 )
82
83 self.anchoredPanel.SetBackgroundColour(wx.Colour(0, 0, 222))
84 self.anchoredPanel.SetConstraints(
85 anchors.LayoutAnchors(self.anchoredPanel, False, False, False, False)
86 )
87
88 self.leftCheckBox = wx.CheckBox(
89 label='Left', id=ID_ANCHORSDEMOFRAMELEFTCHECKBOX,
90 parent=self.mainPanel, name='leftCheckBox',
91 style=0, pos=(8, 8)
92 )
93
94 self.leftCheckBox.SetConstraints(
95 anchors.LayoutAnchors(self.leftCheckBox, False, True, False, False)
96 )
97
98 self.Bind(
99 wx.EVT_CHECKBOX, self.OnCheckboxCheckbox, source=self.leftCheckBox,
100 id=ID_ANCHORSDEMOFRAMELEFTCHECKBOX
101 )
102
103 self.topCheckBox = wx.CheckBox(
104 label='Top', id=ID_ANCHORSDEMOFRAMETOPCHECKBOX,
105 parent=self.mainPanel, name='topCheckBox',
106 style=0, pos=(88, 8)
107 )
108
109 self.topCheckBox.SetConstraints(
110 anchors.LayoutAnchors(self.topCheckBox, False, True, False, False)
111 )
112
113 self.Bind(
114 wx.EVT_CHECKBOX, self.OnCheckboxCheckbox, source=self.topCheckBox,
115 id=ID_ANCHORSDEMOFRAMETOPCHECKBOX
116 )
117
118 self.rightCheckBox = wx.CheckBox(
119 label='Right', id=ID_ANCHORSDEMOFRAMERIGHTCHECKBOX,
120 parent=self.mainPanel, name='rightCheckBox',
121 style=0, pos=(168, 8)
122 )
123
124 self.rightCheckBox.SetConstraints(
125 anchors.LayoutAnchors(self.rightCheckBox, False, True, False, False)
126 )
127
128 self.Bind(
129 wx.EVT_CHECKBOX, self.OnCheckboxCheckbox, source=self.rightCheckBox,
130 id=ID_ANCHORSDEMOFRAMERIGHTCHECKBOX
131 )
132
133 self.bottomCheckBox = wx.CheckBox(
134 label='Bottom', id=ID_ANCHORSDEMOFRAMEBOTTOMCHECKBOX,
135 parent=self.mainPanel, name='bottomCheckBox',
136 style=0, pos=(248, 8)
137 )
138
139 self.bottomCheckBox.SetConstraints(
140 anchors.LayoutAnchors(self.bottomCheckBox, False, True, False, False)
141 )
142
143 self.Bind(
144 wx.EVT_CHECKBOX, self.OnCheckboxCheckbox, source=self.bottomCheckBox,
145 id=ID_ANCHORSDEMOFRAMEBOTTOMCHECKBOX
146 )
147
148 self.helpStaticText = wx.StaticText(
149 label='Select anchor options above, then resize window to see the effect',
150 id=ID_ANCHORSDEMOFRAMEHELPSTATICTEXT,
151 parent=self.mainPanel, name='helpStaticText',
152 size=(224, 24), style=wx.ST_NO_AUTORESIZE,
153 pos=(8, 128)
154 )
155
156 self.helpStaticText.SetConstraints(
157 anchors.LayoutAnchors(self.helpStaticText, True, False, True, True)
158 )
159
160 def __init__(self, parent):
161 self._init_ctrls(parent)
162
163 # Based on the values of the above checkboxes, we will adjust the layout constraints
164 # on the sample window whenever one of the checkboxes changes state.
165 def OnCheckboxCheckbox(self, event):
166 self.anchoredPanel.SetConstraints(
167 anchors.LayoutAnchors(self.anchoredPanel,
168 self.leftCheckBox.GetValue(), self.topCheckBox.GetValue(),
169 self.rightCheckBox.GetValue(), self.bottomCheckBox.GetValue()
170 )
171 )
172
173 def OnOkButtonButton(self, event):
174 self.Close()
175
176 #---------------------------------------------------------------------------
177
178 class TestPanel(wx.Panel):
179 def __init__(self, parent, log):
180 self.log = log
181 wx.Panel.__init__(self, parent, -1)
182
183 b = wx.Button(self, -1, "Show the LayoutAnchors sample", (50,50))
184 self.Bind(wx.EVT_BUTTON, self.OnButton, b)
185
186
187 def OnButton(self, evt):
188 win = AnchorsDemoFrame(self)
189 win.Show(True)
190
191
192 #---------------------------------------------------------------------------
193
194
195 def runTest(frame, nb, log):
196 win = TestPanel(nb, log)
197 return win
198
199 #----------------------------------------------------------------------
200
201
202 overview = """<html><body>
203 <h2>LayoutAnchors</h2>
204 A class that implements Delphi's Anchors with wxLayoutConstraints.
205 <p>
206 Anchored sides maintain the distance from the edge of the
207 control to the same edge of the parent.
208 When neither side is selected, the control keeps the same
209 relative position to both sides.
210 <p>
211 The current position and size of the control and it's parent
212 is used when setting up the constraints. To change the size or
213 position of an already anchored control, set the constraints to
214 None, reposition or resize and reapply the anchors.
215 <p>
216 Examples:
217 <p>
218 Let's anchor the right and bottom edge of a control and
219 resize it's parent.
220 <p>
221 <pre>
222 ctrl.SetConstraints(LayoutAnchors(ctrl, left=0, top=0, right=1, bottom=1))
223
224 +=========+ +===================+
225 | +-----+ | | |
226 | | * | -> | |
227 | +--*--+ | | +-----+ |
228 +---------+ | | * |
229 | +--*--+ |
230 +-------------------+
231 * = anchored edge
232 </pre>
233 <p>
234 When anchored on both sides the control will stretch horizontally.
235 <p>
236 <pre>
237 ctrl.SetConstraints(LayoutAnchors(ctrl, 1, 0, 1, 1))
238
239 +=========+ +===================+
240 | +-----+ | | |
241 | * * | -> | |
242 | +--*--+ | | +---------------+ |
243 +---------+ | * ctrl * |
244 | +-------*-------+ |
245 +-------------------+
246 * = anchored edge
247 </pre>
248 </html></body>
249 """
250
251
252
253 if __name__ == '__main__':
254 import sys,os
255 import run
256 run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])
257