]> git.saurik.com Git - wxWidgets.git/blame - wxPython/demo/wxPopupWindow.py
Applied patch [ 827011 ] Event-based processing of item tooltips in wxTreeCtrl
[wxWidgets.git] / wxPython / demo / wxPopupWindow.py
CommitLineData
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
14import wx
0122b7e3 15
eb0f373c
RD
16havePopupWindow = 1
17try:
8fa876ca 18 wx.PopupWindow
eb0f373c
RD
19except NameError:
20 havePopupWindow = 0
8fa876ca 21 wx.PopupWindow = wx.PopupTransientWindow = wx.Window
eb0f373c 22
0122b7e3
RD
23#---------------------------------------------------------------------------
24
8fa876ca 25class 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 78class 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 106class 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 162class 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
193def 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
209overview = """\
210"""
29c1c7f7
RD
211
212
29c1c7f7
RD
213if __name__ == '__main__':
214 import sys,os
215 import run
216 run.main(['', os.path.basename(sys.argv[0])])
217