]> git.saurik.com Git - wxWidgets.git/blob - wxPython/demo/wxPopupWindow.py
Applied patch [ 827011 ] Event-based processing of item tooltips in wxTreeCtrl
[wxWidgets.git] / wxPython / demo / wxPopupWindow.py
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
15
16 havePopupWindow = 1
17 try:
18 wx.PopupWindow
19 except NameError:
20 havePopupWindow = 0
21 wx.PopupWindow = wx.PopupTransientWindow = wx.Window
22
23 #---------------------------------------------------------------------------
24
25 class TestPopup(wx.PopupWindow):
26 """Adds a bit of text and mouse movement to the wxPopupWindow"""
27 def __init__(self, parent, style):
28 wx.PopupWindow.__init__(self, parent, style)
29 self.SetBackgroundColour("CADET BLUE")
30
31 st = wx.StaticText(self, -1,
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))
44
45 sz = st.GetBestSize()
46 self.SetSize( (sz.width+20, sz.height+20) )
47
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)
57
58 def OnMouseLeftDown(self, evt):
59 self.ldPos = evt.GetEventObject().ClientToScreen(evt.GetPosition())
60 self.wPos = self.GetPosition()
61 self.CaptureMouse()
62
63 def OnMouseMotion(self, evt):
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)
69
70 def OnMouseLeftUp(self, evt):
71 self.ReleaseMouse()
72
73 def OnRightUp(self, evt):
74 self.Show(False)
75 self.Destroy()
76
77
78 class TestTransientPopup(wx.PopupTransientWindow):
79 """Adds a bit of text and mouse movement to the wxPopupWindow"""
80 def __init__(self, parent, style, log):
81 wx.PopupTransientWindow.__init__(self, parent, style)
82 self.log = log
83 panel = wx.Panel(self, -1)
84 panel.SetBackgroundColour("#FFB6C1")
85 st = wx.StaticText(panel, -1,
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()
94 panel.SetSize( (sz.width+20, sz.height+20) )
95 self.SetSize(panel.GetSize())
96
97 def ProcessLeftDown(self, evt):
98 self.log.write("ProcessLeftDown\n")
99 return False
100
101 def OnDismiss(self):
102 self.log.write("OnDismiss\n")
103
104
105
106 class TestPanel(wx.Panel):
107 def __init__(self, parent, log):
108 wx.Panel.__init__(self, parent, -1)
109 self.log = log
110
111 b = wx.Button(self, -1, "Show wxPopupWindow", (25, 50))
112 self.Bind(wx.EVT_BUTTON, self.OnShowPopup, b)
113
114 b = wx.Button(self, -1, "Show wxPopupTransientWindow", (25, 95))
115 self.Bind(wx.EVT_BUTTON, self.OnShowPopupTransient, b)
116
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)
122
123
124 def OnShowPopup(self, evt):
125 win = TestPopup(self, wx.SIMPLE_BORDER)
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()
132 win.Position(pos, (0, sz[1]))
133
134 win.Show(True)
135
136
137 def OnShowPopupTransient(self, evt):
138 win = TestTransientPopup(self, wx.SIMPLE_BORDER, self.log)
139
140 # Show the popup right below or above the button
141 # depending on available screen space...
142 btn = evt.GetEventObject()
143 pos = btn.ClientToScreen( (0,0) )
144 sz = btn.GetSize()
145 win.Position(pos, (0, sz[1]))
146
147 win.Popup()
148
149
150 def OnShowPopupListbox(self, evt):
151 win = TestPopupWithListbox(self, wx.NO_BORDER, self.log)
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()
158 win.Position(pos, (0, sz[1]))
159
160 win.Show(True)
161
162 class TestPopupWithListbox(wx.PopupWindow):
163 def __init__(self, parent, style, log):
164 wx.PopupWindow.__init__(self, parent, style)
165
166 import keyword
167
168 self.lb = wx.ListBox(self, -1, choices = keyword.kwlist)
169 #sz = self.lb.GetBestSize()
170 self.SetSize((150, 75)) #sz)
171 self.lb.SetSize(self.GetClientSize())
172 self.lb.SetFocus()
173 self.Bind(wx.EVT_LISTBOX, self.OnListBox)
174 self.lb.Bind(wx.EVT_LEFT_DOWN, self.OnLeft)
175
176 def OnLeft(self, evt):
177 obj = evt.GetEventObject()
178 print "OnLeft", obj
179 print 'Selected: %s' % obj.GetStringSelection()
180 obj.Show(False)
181 evt.Skip()
182
183 def OnListBox(self, evt):
184 obj = evt.GetEventObject()
185 print "OnListBox", obj
186 print 'Selected: %s' % obj.GetString()
187 evt.Skip()
188
189
190
191 #---------------------------------------------------------------------------
192
193 def runTest(frame, nb, log):
194 if havePopupWindow:
195 win = TestPanel(nb, log)
196 return win
197 else:
198 dlg = wx.MessageDialog(
199 frame, 'wxPopupWindow is not available on this platform.',
200 'Sorry', wx.OK | wx.ICON_INFORMATION
201 )
202
203 dlg.ShowModal()
204 dlg.Destroy()
205
206 #---------------------------------------------------------------------------
207
208
209 overview = """\
210 """
211
212
213 if __name__ == '__main__':
214 import sys,os
215 import run
216 run.main(['', os.path.basename(sys.argv[0])])
217