]>
Commit | Line | Data |
---|---|---|
8fa876ca RD |
1 | # 11/20/2003 - Jeff Grimmett (grimmtooth@softhome.net) |
2 | # | |
3 | # o Updated for wx namespace | |
4 | # | |
5 | # 11/30/2003 - Jeff Grimmett (grimmtooth@softhome.net) | |
6 | # | |
7 | # o Some issues with the listbox example; I tried correcting | |
8 | # it but it's still not working the way it should. Commented | |
9 | # out for now but will be revisited. | |
10 | # o The math in determining the popup window's position is | |
11 | # a bit off. | |
12 | # | |
13 | ||
14 | import wx | |
0122b7e3 | 15 | |
eb0f373c RD |
16 | havePopupWindow = 1 |
17 | try: | |
8fa876ca | 18 | wx.PopupWindow |
eb0f373c RD |
19 | except NameError: |
20 | havePopupWindow = 0 | |
8fa876ca | 21 | wx.PopupWindow = wx.PopupTransientWindow = wx.Window |
eb0f373c | 22 | |
0122b7e3 RD |
23 | #--------------------------------------------------------------------------- |
24 | ||
8fa876ca | 25 | class TestPopup(wx.PopupWindow): |
c0c84fa0 | 26 | """Adds a bit of text and mouse movement to the wxPopupWindow""" |
0122b7e3 | 27 | def __init__(self, parent, style): |
8fa876ca | 28 | wx.PopupWindow.__init__(self, parent, style) |
c0c84fa0 | 29 | self.SetBackgroundColour("CADET BLUE") |
8fa876ca RD |
30 | |
31 | st = wx.StaticText(self, -1, | |
c0c84fa0 RD |
32 | "This is a special kind of top level\n" |
33 | "window that can be used for\n" | |
34 | "popup menus, combobox popups\n" | |
35 | "and such.\n\n" | |
36 | "Try positioning the demo near\n" | |
37 | "the bottom of the screen and \n" | |
38 | "hit the button again.\n\n" | |
39 | "In this demo this window can\n" | |
40 | "be dragged with the left button\n" | |
41 | "and closed with the right." | |
42 | , | |
43 | pos=(10,10)) | |
8fa876ca | 44 | |
c0c84fa0 RD |
45 | sz = st.GetBestSize() |
46 | self.SetSize( (sz.width+20, sz.height+20) ) | |
0122b7e3 | 47 | |
8fa876ca RD |
48 | self.Bind(wx.EVT_LEFT_DOWN, self.OnMouseLeftDown) |
49 | self.Bind(wx.EVT_MOTION, self.OnMouseMotion) | |
50 | self.Bind(wx.EVT_LEFT_UP, self.OnMouseLeftUp) | |
51 | self.Bind(wx.EVT_RIGHT_UP, self.OnRightUp) | |
52 | ||
53 | st.Bind(wx.EVT_LEFT_DOWN, self.OnMouseLeftDown) | |
54 | st.Bind(wx.EVT_MOTION, self.OnMouseMotion) | |
55 | st.Bind(wx.EVT_LEFT_UP, self.OnMouseLeftUp) | |
56 | st.Bind(wx.EVT_RIGHT_UP, self.OnRightUp) | |
0122b7e3 RD |
57 | |
58 | def OnMouseLeftDown(self, evt): | |
c0c84fa0 | 59 | self.ldPos = evt.GetEventObject().ClientToScreen(evt.GetPosition()) |
f0db4f38 | 60 | self.wPos = self.GetPosition() |
0122b7e3 RD |
61 | self.CaptureMouse() |
62 | ||
63 | def OnMouseMotion(self, evt): | |
c0c84fa0 RD |
64 | if evt.Dragging() and evt.LeftIsDown(): |
65 | dPos = evt.GetEventObject().ClientToScreen(evt.GetPosition()) | |
66 | nPos = (self.wPos.x + (dPos.x - self.ldPos.x), | |
67 | self.wPos.y + (dPos.y - self.ldPos.y)) | |
68 | self.Move(nPos) | |
0122b7e3 RD |
69 | |
70 | def OnMouseLeftUp(self, evt): | |
71 | self.ReleaseMouse() | |
c0c84fa0 | 72 | |
c0c84fa0 | 73 | def OnRightUp(self, evt): |
1e4a197e | 74 | self.Show(False) |
c0c84fa0 RD |
75 | self.Destroy() |
76 | ||
77 | ||
8fa876ca | 78 | class TestTransientPopup(wx.PopupTransientWindow): |
c0c84fa0 | 79 | """Adds a bit of text and mouse movement to the wxPopupWindow""" |
a57d56d6 | 80 | def __init__(self, parent, style, log): |
8fa876ca | 81 | wx.PopupTransientWindow.__init__(self, parent, style) |
a57d56d6 | 82 | self.log = log |
8fa876ca | 83 | panel = wx.Panel(self, -1) |
a57d56d6 | 84 | panel.SetBackgroundColour("#FFB6C1") |
8fa876ca | 85 | st = wx.StaticText(panel, -1, |
c0c84fa0 RD |
86 | "wxPopupTransientWindow is a\n" |
87 | "wxPopupWindow which disappears\n" | |
88 | "automatically when the user\n" | |
89 | "clicks the mouse outside it or if it\n" | |
90 | "loses focus in any other way." | |
91 | , | |
92 | pos=(10,10)) | |
93 | sz = st.GetBestSize() | |
a57d56d6 RD |
94 | panel.SetSize( (sz.width+20, sz.height+20) ) |
95 | self.SetSize(panel.GetSize()) | |
0122b7e3 | 96 | |
a57d56d6 RD |
97 | def ProcessLeftDown(self, evt): |
98 | self.log.write("ProcessLeftDown\n") | |
1e4a197e | 99 | return False |
a57d56d6 RD |
100 | |
101 | def OnDismiss(self): | |
102 | self.log.write("OnDismiss\n") | |
103 | ||
0122b7e3 | 104 | |
2d3a90ce | 105 | |
8fa876ca | 106 | class TestPanel(wx.Panel): |
0122b7e3 | 107 | def __init__(self, parent, log): |
8fa876ca | 108 | wx.Panel.__init__(self, parent, -1) |
0122b7e3 RD |
109 | self.log = log |
110 | ||
8fa876ca RD |
111 | b = wx.Button(self, -1, "Show wxPopupWindow", (25, 50)) |
112 | self.Bind(wx.EVT_BUTTON, self.OnShowPopup, b) | |
0122b7e3 | 113 | |
8fa876ca RD |
114 | b = wx.Button(self, -1, "Show wxPopupTransientWindow", (25, 95)) |
115 | self.Bind(wx.EVT_BUTTON, self.OnShowPopupTransient, b) | |
c0c84fa0 | 116 | |
8fa876ca RD |
117 | # This isn't working so well, not sure why. Commented out for |
118 | # now. | |
119 | ||
120 | # b = wx.Button(self, -1, "Show wxPopupWindow with listbox", (25, 140)) | |
121 | # self.Bind(wx.EVT_BUTTON, self.OnShowPopupListbox, b) | |
2d3a90ce | 122 | |
0122b7e3 RD |
123 | |
124 | def OnShowPopup(self, evt): | |
8fa876ca | 125 | win = TestPopup(self, wx.SIMPLE_BORDER) |
c0c84fa0 RD |
126 | |
127 | # Show the popup right below or above the button | |
128 | # depending on available screen space... | |
129 | btn = evt.GetEventObject() | |
130 | pos = btn.ClientToScreen( (0,0) ) | |
131 | sz = btn.GetSize() | |
8fa876ca | 132 | win.Position(pos, (0, sz[1])) |
c0c84fa0 | 133 | |
1e4a197e | 134 | win.Show(True) |
0122b7e3 RD |
135 | |
136 | ||
c0c84fa0 | 137 | def OnShowPopupTransient(self, evt): |
8fa876ca | 138 | win = TestTransientPopup(self, wx.SIMPLE_BORDER, self.log) |
c0c84fa0 | 139 | |
a57d56d6 RD |
140 | # Show the popup right below or above the button |
141 | # depending on available screen space... | |
c0c84fa0 RD |
142 | btn = evt.GetEventObject() |
143 | pos = btn.ClientToScreen( (0,0) ) | |
144 | sz = btn.GetSize() | |
8fa876ca | 145 | win.Position(pos, (0, sz[1])) |
c0c84fa0 | 146 | |
a57d56d6 | 147 | win.Popup() |
c0c84fa0 RD |
148 | |
149 | ||
25e92d2d | 150 | def OnShowPopupListbox(self, evt): |
8fa876ca | 151 | win = TestPopupWithListbox(self, wx.NO_BORDER, self.log) |
25e92d2d RD |
152 | |
153 | # Show the popup right below or above the button | |
154 | # depending on available screen space... | |
155 | btn = evt.GetEventObject() | |
156 | pos = btn.ClientToScreen( (0,0) ) | |
157 | sz = btn.GetSize() | |
8fa876ca | 158 | win.Position(pos, (0, sz[1])) |
25e92d2d | 159 | |
1e4a197e | 160 | win.Show(True) |
25e92d2d | 161 | |
8fa876ca | 162 | class TestPopupWithListbox(wx.PopupWindow): |
25e92d2d | 163 | def __init__(self, parent, style, log): |
8fa876ca RD |
164 | wx.PopupWindow.__init__(self, parent, style) |
165 | ||
25e92d2d | 166 | import keyword |
8fa876ca RD |
167 | |
168 | self.lb = wx.ListBox(self, -1, choices = keyword.kwlist) | |
25e92d2d RD |
169 | #sz = self.lb.GetBestSize() |
170 | self.SetSize((150, 75)) #sz) | |
171 | self.lb.SetSize(self.GetClientSize()) | |
172 | self.lb.SetFocus() | |
8fa876ca RD |
173 | self.Bind(wx.EVT_LISTBOX, self.OnListBox) |
174 | self.lb.Bind(wx.EVT_LEFT_DOWN, self.OnLeft) | |
25e92d2d RD |
175 | |
176 | def OnLeft(self, evt): | |
8fa876ca RD |
177 | obj = evt.GetEventObject() |
178 | print "OnLeft", obj | |
179 | print 'Selected: %s' % obj.GetStringSelection() | |
180 | obj.Show(False) | |
25e92d2d | 181 | evt.Skip() |
8fa876ca | 182 | |
25e92d2d | 183 | def OnListBox(self, evt): |
8fa876ca RD |
184 | obj = evt.GetEventObject() |
185 | print "OnListBox", obj | |
186 | print 'Selected: %s' % obj.GetString() | |
25e92d2d | 187 | evt.Skip() |
2d3a90ce | 188 | |
2d3a90ce | 189 | |
0122b7e3 RD |
190 | |
191 | #--------------------------------------------------------------------------- | |
192 | ||
193 | def runTest(frame, nb, log): | |
eb0f373c RD |
194 | if havePopupWindow: |
195 | win = TestPanel(nb, log) | |
196 | return win | |
197 | else: | |
8fa876ca RD |
198 | dlg = wx.MessageDialog( |
199 | frame, 'wxPopupWindow is not available on this platform.', | |
200 | 'Sorry', wx.OK | wx.ICON_INFORMATION | |
201 | ) | |
202 | ||
eb0f373c RD |
203 | dlg.ShowModal() |
204 | dlg.Destroy() | |
0122b7e3 RD |
205 | |
206 | #--------------------------------------------------------------------------- | |
207 | ||
208 | ||
0122b7e3 RD |
209 | overview = """\ |
210 | """ | |
29c1c7f7 RD |
211 | |
212 | ||
29c1c7f7 RD |
213 | if __name__ == '__main__': |
214 | import sys,os | |
215 | import run | |
216 | run.main(['', os.path.basename(sys.argv[0])]) | |
217 |