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