]>
Commit | Line | Data |
---|---|---|
8fa876ca RD |
1 | |
2 | import wx | |
95bfd958 | 3 | import wx.wizard as wiz |
8fa876ca | 4 | import images |
af83019e RD |
5 | |
6 | #---------------------------------------------------------------------- | |
7 | ||
85260f24 | 8 | def makePageTitle(wizPg, title): |
8fa876ca | 9 | sizer = wx.BoxSizer(wx.VERTICAL) |
85260f24 | 10 | wizPg.SetSizer(sizer) |
8fa876ca RD |
11 | title = wx.StaticText(wizPg, -1, title) |
12 | title.SetFont(wx.Font(18, wx.SWISS, wx.NORMAL, wx.BOLD)) | |
ab5b7b61 RD |
13 | sizer.Add(title, 0, wx.ALIGN_CENTRE|wx.ALL, 5) |
14 | sizer.Add(wx.StaticLine(wizPg, -1), 0, wx.EXPAND|wx.ALL, 5) | |
85260f24 RD |
15 | return sizer |
16 | ||
17 | #---------------------------------------------------------------------- | |
18 | ||
8fa876ca | 19 | class TitledPage(wiz.WizardPageSimple): |
af83019e | 20 | def __init__(self, parent, title): |
8fa876ca | 21 | wiz.WizardPageSimple.__init__(self, parent) |
85260f24 RD |
22 | self.sizer = makePageTitle(self, title) |
23 | ||
24 | ||
25 | #---------------------------------------------------------------------- | |
26 | ||
8fa876ca | 27 | class SkipNextPage(wiz.PyWizardPage): |
85260f24 | 28 | def __init__(self, parent, title): |
8fa876ca | 29 | wiz.PyWizardPage.__init__(self, parent) |
85260f24 RD |
30 | self.next = self.prev = None |
31 | self.sizer = makePageTitle(self, title) | |
32 | ||
8fa876ca RD |
33 | self.cb = wx.CheckBox(self, -1, "Skip next page") |
34 | self.sizer.Add(self.cb, 0, wx.ALL, 5) | |
af83019e | 35 | |
85260f24 RD |
36 | def SetNext(self, next): |
37 | self.next = next | |
af83019e | 38 | |
85260f24 RD |
39 | def SetPrev(self, prev): |
40 | self.prev = prev | |
af83019e RD |
41 | |
42 | ||
85260f24 RD |
43 | # Classes derived from wxPyWizardPanel must override |
44 | # GetNext and GetPrev, and may also override GetBitmap | |
45 | # as well as all those methods overridable by | |
8fa876ca | 46 | # wx.PyWindow. |
85260f24 RD |
47 | |
48 | def GetNext(self): | |
49 | """If the checkbox is set then return the next page's next page""" | |
50 | next = self.next | |
51 | if self.cb.GetValue(): | |
52 | next = next.GetNext() | |
53 | return next | |
54 | ||
55 | def GetPrev(self): | |
56 | return self.prev | |
57 | ||
6a6ff564 RD |
58 | #---------------------------------------------------------------------- |
59 | ||
8fa876ca | 60 | class UseAltBitmapPage(wiz.PyWizardPage): |
85260f24 | 61 | def __init__(self, parent, title): |
8fa876ca | 62 | wiz.PyWizardPage.__init__(self, parent) |
85260f24 RD |
63 | self.next = self.prev = None |
64 | self.sizer = makePageTitle(self, title) | |
65 | ||
8fa876ca RD |
66 | self.sizer.Add(wx.StaticText(self, -1, "This page uses a different bitmap"), |
67 | 0, wx.ALL, 5) | |
85260f24 RD |
68 | |
69 | def SetNext(self, next): | |
70 | self.next = next | |
71 | ||
72 | def SetPrev(self, prev): | |
73 | self.prev = prev | |
74 | ||
75 | def GetNext(self): | |
76 | return self.next | |
77 | ||
78 | def GetPrev(self): | |
79 | return self.prev | |
80 | ||
81 | def GetBitmap(self): | |
82 | # You usually wouldn't need to override this method | |
83 | # since you can set a non-default bitmap in the | |
84 | # wxWizardPageSimple constructor, but if you need to | |
85 | # dynamically change the bitmap based on the | |
86 | # contents of the wizard, or need to also change the | |
87 | # next/prev order then it can be done by overriding | |
88 | # GetBitmap. | |
89 | return images.getWizTest2Bitmap() | |
6a6ff564 | 90 | |
af83019e RD |
91 | #---------------------------------------------------------------------- |
92 | ||
8fa876ca | 93 | class TestPanel(wx.Panel): |
af83019e RD |
94 | def __init__(self, parent, log): |
95 | self.log = log | |
8fa876ca | 96 | wx.Panel.__init__(self, parent, -1) |
af83019e | 97 | |
8fa876ca RD |
98 | b = wx.Button(self, -1, "Run Simple Wizard", pos=(50, 50)) |
99 | self.Bind(wx.EVT_BUTTON, self.OnRunSimpleWizard, b) | |
af83019e | 100 | |
8fa876ca RD |
101 | b = wx.Button(self, -1, "Run Dynamic Wizard", pos=(50, 100)) |
102 | self.Bind(wx.EVT_BUTTON, self.OnRunDynamicWizard, b) | |
6a6ff564 | 103 | |
95bfd958 RD |
104 | self.Bind(wiz.EVT_WIZARD_PAGE_CHANGED, self.OnWizPageChanged) |
105 | self.Bind(wiz.EVT_WIZARD_PAGE_CHANGING, self.OnWizPageChanging) | |
106 | self.Bind(wiz.EVT_WIZARD_CANCEL, self.OnWizCancel) | |
af83019e RD |
107 | |
108 | ||
109 | def OnWizPageChanged(self, evt): | |
110 | if evt.GetDirection(): | |
111 | dir = "forward" | |
112 | else: | |
113 | dir = "backward" | |
8fa876ca | 114 | |
6a6ff564 RD |
115 | page = evt.GetPage() |
116 | self.log.write("OnWizPageChanged: %s, %s\n" % (dir, page.__class__)) | |
117 | ||
af83019e RD |
118 | |
119 | def OnWizPageChanging(self, evt): | |
120 | if evt.GetDirection(): | |
121 | dir = "forward" | |
122 | else: | |
123 | dir = "backward" | |
8fa876ca | 124 | |
6a6ff564 RD |
125 | page = evt.GetPage() |
126 | self.log.write("OnWizPageChanging: %s, %s\n" % (dir, page.__class__)) | |
127 | ||
af83019e RD |
128 | |
129 | def OnWizCancel(self, evt): | |
85260f24 RD |
130 | page = evt.GetPage() |
131 | self.log.write("OnWizCancel: %s\n" % page.__class__) | |
132 | ||
133 | # Show how to prevent cancelling of the wizard. The | |
134 | # other events can be Veto'd too. | |
135 | if page is self.page1: | |
8fa876ca | 136 | wx.MessageBox("Cancelling on the first page has been prevented.", "Sorry") |
85260f24 | 137 | evt.Veto() |
af83019e | 138 | |
a62df55f | 139 | |
118f4724 RD |
140 | def OnWizFinished(self, evt): |
141 | self.log.write("OnWizFinished\n") | |
142 | ||
af83019e RD |
143 | |
144 | def OnRunSimpleWizard(self, evt): | |
145 | # Create the wizard and the pages | |
95bfd958 | 146 | wizard = wiz.Wizard(self, -1, "Simple Wizard", images.getWizTest1Bitmap()) |
af83019e RD |
147 | page1 = TitledPage(wizard, "Page 1") |
148 | page2 = TitledPage(wizard, "Page 2") | |
149 | page3 = TitledPage(wizard, "Page 3") | |
150 | page4 = TitledPage(wizard, "Page 4") | |
85260f24 | 151 | self.page1 = page1 |
af83019e | 152 | |
8fa876ca | 153 | page1.sizer.Add(wx.StaticText(page1, -1, """ |
af83019e RD |
154 | This wizard is totally useless, but is meant to show how to |
155 | chain simple wizard pages together in a non-dynamic manner. | |
156 | IOW, the order of the pages never changes, and so the | |
6a6ff564 | 157 | wxWizardPageSimple class can easily be used for the pages.""")) |
af83019e | 158 | wizard.FitToPage(page1) |
8fa876ca | 159 | page4.sizer.Add(wx.StaticText(page4, -1, "\nThis is the last page.")) |
af83019e RD |
160 | |
161 | # Use the convenience Chain function to connect the pages | |
8fa876ca RD |
162 | wiz.WizardPageSimple_Chain(page1, page2) |
163 | wiz.WizardPageSimple_Chain(page2, page3) | |
164 | wiz.WizardPageSimple_Chain(page3, page4) | |
af83019e | 165 | |
a62df55f | 166 | wizard.GetPageAreaSizer().Add(page1) |
af83019e | 167 | if wizard.RunWizard(page1): |
8fa876ca | 168 | wx.MessageBox("Wizard completed successfully", "That's all folks!") |
af83019e | 169 | else: |
8fa876ca | 170 | wx.MessageBox("Wizard was cancelled", "That's all folks!") |
af83019e RD |
171 | |
172 | ||
6a6ff564 RD |
173 | |
174 | def OnRunDynamicWizard(self, evt): | |
85260f24 | 175 | # Create the wizard and the pages |
8fa876ca RD |
176 | #wizard = wx.PreWizard() |
177 | #wizard.SetExtraStyle(wx.WIZARD_EX_HELPBUTTON) | |
f94e8b87 RD |
178 | #wizard.Create(self, self.ID_wiz, "Simple Wizard", |
179 | # images.getWizTest1Bitmap()) | |
4e9080bc | 180 | wizard = wiz.Wizard(self, -1, "Dynamic Wizard", images.getWizTest1Bitmap()) |
85260f24 RD |
181 | |
182 | page1 = TitledPage(wizard, "Page 1") | |
183 | page2 = SkipNextPage(wizard, "Page 2") | |
184 | page3 = TitledPage(wizard, "Page 3") | |
185 | page4 = UseAltBitmapPage(wizard, "Page 4") | |
186 | page5 = TitledPage(wizard, "Page 5") | |
187 | self.page1 = page1 | |
188 | ||
8fa876ca | 189 | page1.sizer.Add(wx.StaticText(page1, -1, """ |
85260f24 RD |
190 | This wizard shows the ability to choose at runtime the order |
191 | of the pages and also which bitmap is shown. | |
192 | """)) | |
193 | wizard.FitToPage(page1) | |
8fa876ca | 194 | page5.sizer.Add(wx.StaticText(page5, -1, "\nThis is the last page.")) |
85260f24 RD |
195 | |
196 | # Set the initial order of the pages | |
197 | page1.SetNext(page2) | |
198 | page2.SetPrev(page1) | |
199 | page2.SetNext(page3) | |
200 | page3.SetPrev(page2) | |
201 | page3.SetNext(page4) | |
202 | page4.SetPrev(page3) | |
203 | page4.SetNext(page5) | |
204 | page5.SetPrev(page4) | |
205 | ||
206 | ||
a62df55f | 207 | wizard.GetPageAreaSizer().Add(page1) |
85260f24 | 208 | if wizard.RunWizard(page1): |
8fa876ca | 209 | wx.MessageBox("Wizard completed successfully", "That's all folks!") |
85260f24 | 210 | else: |
8fa876ca | 211 | wx.MessageBox("Wizard was cancelled", "That's all folks!") |
6a6ff564 | 212 | |
af83019e RD |
213 | #---------------------------------------------------------------------- |
214 | ||
215 | def runTest(frame, nb, log): | |
216 | win = TestPanel(nb, log) | |
217 | return win | |
218 | ||
219 | #---------------------------------------------------------------------- | |
220 | ||
221 | ||
222 | ||
223 | overview = """<html><body> | |
224 | <h2><center>wxWizard</center></h2> | |
225 | ||
226 | wxWizard is the central class for implementing 'wizard-like' | |
227 | dialogs. These dialogs are mostly familiar to Windows users and are | |
228 | nothing else but a sequence of 'pages' each of them displayed inside a | |
229 | dialog which has the buttons to pass to the next (and previous) pages. | |
230 | <p> | |
231 | The wizards are typically used to decompose a complex dialog into | |
232 | several simple steps and are mainly useful to the novice users, hence | |
233 | it is important to keep them as simple as possible. | |
234 | ||
235 | </body></html> | |
236 | """ | |
237 | ||
238 | ||
239 | ||
240 | if __name__ == '__main__': | |
241 | import sys,os | |
242 | import run | |
8eca4fef | 243 | run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:]) |
af83019e | 244 |