X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0122b7e3fcfd78f879470053c91a60e3c66537a3..61940a7061d0b5d5122b1e1e939cfa2d72596999:/wxPython/demo/wxPopupWindow.py diff --git a/wxPython/demo/wxPopupWindow.py b/wxPython/demo/wxPopupWindow.py index 58133946bb..ad769d447d 100644 --- a/wxPython/demo/wxPopupWindow.py +++ b/wxPython/demo/wxPopupWindow.py @@ -1,62 +1,218 @@ -from wxPython.wx import * +# 11/20/2003 - Jeff Grimmett (grimmtooth@softhome.net) +# +# o Updated for wx namespace +# +# 11/30/2003 - Jeff Grimmett (grimmtooth@softhome.net) +# +# o Some issues with the listbox example; I tried correcting +# it but it's still not working the way it should. Commented +# out for now but will be revisited. +# o The math in determining the popup window's position is +# a bit off. +# + +import wx + +havePopupWindow = 1 +try: + wx.PopupWindow +except NameError: + havePopupWindow = 0 + wx.PopupWindow = wx.PopupTransientWindow = wx.Window #--------------------------------------------------------------------------- -class TestPopup(wxPopupWindow): +class TestPopup(wx.PopupWindow): + """Adds a bit of text and mouse movement to the wxPopupWindow""" def __init__(self, parent, style): - wxPopupWindow.__init__(self, parent, style) - - EVT_LEFT_DOWN(self, self.OnMouseLeftDown) - EVT_MOTION(self, self.OnMouseMotion) - EVT_LEFT_UP(self, self.OnMouseLeftUp) + wx.PopupWindow.__init__(self, parent, style) + self.SetBackgroundColour("CADET BLUE") + + st = wx.StaticText(self, -1, + "This is a special kind of top level\n" + "window that can be used for\n" + "popup menus, combobox popups\n" + "and such.\n\n" + "Try positioning the demo near\n" + "the bottom of the screen and \n" + "hit the button again.\n\n" + "In this demo this window can\n" + "be dragged with the left button\n" + "and closed with the right." + , + pos=(10,10)) + + sz = st.GetBestSize() + self.SetSize( (sz.width+20, sz.height+20) ) + + self.Bind(wx.EVT_LEFT_DOWN, self.OnMouseLeftDown) + self.Bind(wx.EVT_MOTION, self.OnMouseMotion) + self.Bind(wx.EVT_LEFT_UP, self.OnMouseLeftUp) + self.Bind(wx.EVT_RIGHT_UP, self.OnRightUp) + + st.Bind(wx.EVT_LEFT_DOWN, self.OnMouseLeftDown) + st.Bind(wx.EVT_MOTION, self.OnMouseMotion) + st.Bind(wx.EVT_LEFT_UP, self.OnMouseLeftUp) + st.Bind(wx.EVT_RIGHT_UP, self.OnRightUp) def OnMouseLeftDown(self, evt): - self.ldPos = evt.GetPosition() + self.ldPos = evt.GetEventObject().ClientToScreen(evt.GetPosition()) + self.wPos = self.GetPosition() self.CaptureMouse() def OnMouseMotion(self, evt): - if evt.Dragging(): - wPos = self.GetPosition() - dPos = evt.GetPosition() - self.Move((wPos.x + (dPos.x - self.ldPos.x), - wPos.y + (dPos.y - self.ldPos.y))) - print self.GetPosition() + if evt.Dragging() and evt.LeftIsDown(): + dPos = evt.GetEventObject().ClientToScreen(evt.GetPosition()) + nPos = (self.wPos.x + (dPos.x - self.ldPos.x), + self.wPos.y + (dPos.y - self.ldPos.y)) + self.Move(nPos) def OnMouseLeftUp(self, evt): self.ReleaseMouse() - pass + def OnRightUp(self, evt): + self.Show(False) + self.Destroy() -class TestPanel(wxPanel): +class TestTransientPopup(wx.PopupTransientWindow): + """Adds a bit of text and mouse movement to the wxPopupWindow""" + def __init__(self, parent, style, log): + wx.PopupTransientWindow.__init__(self, parent, style) + self.log = log + panel = wx.Panel(self, -1) + panel.SetBackgroundColour("#FFB6C1") + st = wx.StaticText(panel, -1, + "wxPopupTransientWindow is a\n" + "wxPopupWindow which disappears\n" + "automatically when the user\n" + "clicks the mouse outside it or if it\n" + "(or its first child) loses focus in \n" + "any other way." + , + pos=(10,10)) + sz = st.GetBestSize() + panel.SetSize( (sz.width+20, sz.height+20) ) + self.SetSize(panel.GetSize()) + + def ProcessLeftDown(self, evt): + self.log.write("ProcessLeftDown\n") + return False + + def OnDismiss(self): + self.log.write("OnDismiss\n") + + + +class TestPanel(wx.Panel): def __init__(self, parent, log): - wxPanel.__init__(self, parent, -1) + wx.Panel.__init__(self, parent, -1) self.log = log - b = wxButton(self, -1, "Show popup window", (25, 50)) - EVT_BUTTON(self, b.GetId(), self.OnShowPopup) + b = wx.Button(self, -1, "Show wxPopupWindow", (25, 50)) + self.Bind(wx.EVT_BUTTON, self.OnShowPopup, b) + + b = wx.Button(self, -1, "Show wxPopupTransientWindow", (25, 95)) + self.Bind(wx.EVT_BUTTON, self.OnShowPopupTransient, b) + + # This isn't working so well, not sure why. Commented out for + # now. + +# b = wx.Button(self, -1, "Show wxPopupWindow with listbox", (25, 140)) +# self.Bind(wx.EVT_BUTTON, self.OnShowPopupListbox, b) def OnShowPopup(self, evt): - win = TestPopup(self, wxSIMPLE_BORDER) - #win.SetPosition((200, 200)) - #win.SetSize((150, 150)) - win.Position((200, 200), (150, 150)) - win.SetBackgroundColour("CADET BLUE") - win.Show(true) + win = TestPopup(self, wx.SIMPLE_BORDER) + # Show the popup right below or above the button + # depending on available screen space... + btn = evt.GetEventObject() + pos = btn.ClientToScreen( (0,0) ) + sz = btn.GetSize() + win.Position(pos, (0, sz[1])) + win.Show(True) + + + def OnShowPopupTransient(self, evt): + win = TestTransientPopup(self, wx.SIMPLE_BORDER, self.log) + + # Show the popup right below or above the button + # depending on available screen space... + btn = evt.GetEventObject() + pos = btn.ClientToScreen( (0,0) ) + sz = btn.GetSize() + win.Position(pos, (0, sz[1])) + + win.Popup() + + + def OnShowPopupListbox(self, evt): + win = TestPopupWithListbox(self, wx.NO_BORDER, self.log) + + # Show the popup right below or above the button + # depending on available screen space... + btn = evt.GetEventObject() + pos = btn.ClientToScreen( (0,0) ) + sz = btn.GetSize() + win.Position(pos, (0, sz[1])) + + win.Show(True) + +class TestPopupWithListbox(wx.PopupWindow): + def __init__(self, parent, style, log): + wx.PopupWindow.__init__(self, parent, style) + + import keyword + + self.lb = wx.ListBox(self, -1, choices = keyword.kwlist) + #sz = self.lb.GetBestSize() + self.SetSize((150, 75)) #sz) + self.lb.SetSize(self.GetClientSize()) + self.lb.SetFocus() + self.Bind(wx.EVT_LISTBOX, self.OnListBox) + self.lb.Bind(wx.EVT_LEFT_DOWN, self.OnLeft) + + def OnLeft(self, evt): + obj = evt.GetEventObject() + print "OnLeft", obj + print 'Selected: %s' % obj.GetStringSelection() + obj.Show(False) + evt.Skip() + + def OnListBox(self, evt): + obj = evt.GetEventObject() + print "OnListBox", obj + print 'Selected: %s' % obj.GetString() + evt.Skip() -#--------------------------------------------------------------------------- -def runTest(frame, nb, log): - win = TestPanel(nb, log) - return win #--------------------------------------------------------------------------- +def runTest(frame, nb, log): + if havePopupWindow: + win = TestPanel(nb, log) + return win + else: + dlg = wx.MessageDialog( + frame, 'wxPopupWindow is not available on this platform.', + 'Sorry', wx.OK | wx.ICON_INFORMATION + ) + + dlg.ShowModal() + dlg.Destroy() +#--------------------------------------------------------------------------- overview = """\ """ + + +if __name__ == '__main__': + import sys,os + import run + run.main(['', os.path.basename(sys.argv[0])]) +