]> git.saurik.com Git - wxWidgets.git/blame - wxPython/demo/PopupWindow.py
Add BitmapFromBuffer demo
[wxWidgets.git] / wxPython / demo / PopupWindow.py
CommitLineData
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
9import wx
0122b7e3 10
eb0f373c 11havePopupWindow = 1
08b89fa8 12if wx.Platform == '__WXMAC__':
eb0f373c 13 havePopupWindow = 0
8fa876ca 14 wx.PopupWindow = wx.PopupTransientWindow = wx.Window
eb0f373c 15
0122b7e3
RD
16#---------------------------------------------------------------------------
17
8fa876ca 18class 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 74class 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 101class 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 166class 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
191def 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
204overview = """\
205"""
29c1c7f7
RD
206
207
29c1c7f7
RD
208if __name__ == '__main__':
209 import sys,os
210 import run
8eca4fef 211 run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])
29c1c7f7 212