]> git.saurik.com Git - wxWidgets.git/commitdiff
Added a sample to the demo that catches various key events and
authorRobin Dunn <robin@alldunn.com>
Tue, 13 Aug 2002 23:12:25 +0000 (23:12 +0000)
committerRobin Dunn <robin@alldunn.com>
Tue, 13 Aug 2002 23:12:25 +0000 (23:12 +0000)
displays the details of the event.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16496 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

wxPython/CHANGES.txt
wxPython/demo/Main.py
wxPython/demo/wxKeyEvents.py [new file with mode: 0644]

index bb5c94c72a7494ef7ad35e550128da13a57b974b..11db24b6cef08acc0ee94fd1b5909add994ebc11 100644 (file)
@@ -93,8 +93,8 @@ the image data.  (Patch #546009)
 Added a sample that shows how to embed wxPython in a wxWindows C++
 application.
 
 Added a sample that shows how to embed wxPython in a wxWindows C++
 application.
 
-Added wxPyWindow and wxPyControl which are just like their wx
-counterparts except they allow some of the more common C++ virtual
+Added wxPyWindow, wxPyPanel and wxPyControl which are just like their
+wx counterparts except they allow some of the more common C++ virtual
 methods to be overridden in Python derived classes.  The methods
 supported are:
 
 methods to be overridden in Python derived classes.  The methods
 supported are:
 
@@ -114,9 +114,11 @@ supported are:
     AcceptsFocus
     AcceptsFocusFromKeyboard
     GetMaxSize
     AcceptsFocus
     AcceptsFocusFromKeyboard
     GetMaxSize
+    AddChild
+    RemoveChild
 
 
-    If there are other methods that should be supported please let me
-    know.
+    If there are other methods that you think should be supported
+    please let me know.
 
 Changed wxGenButton to derive from wxPyControl and overload
 DoGetBestSize and AcceptsFocus.
 
 Changed wxGenButton to derive from wxPyControl and overload
 DoGetBestSize and AcceptsFocus.
@@ -159,6 +161,9 @@ Moved tools to be a Python package in wxPython.tools, added scripts to
 import and launch each tool.  This will let you import and use the
 tools in your own scripts or apps as needed.
 
 import and launch each tool.  This will let you import and use the
 tools in your own scripts or apps as needed.
 
+Added a sample to the demo that catches various key events and
+displays the details of the event.
+
 
 
 
 
 
 
index d7fc3a4fd3f4c7e9d1020f7c59c9a6f7398fe149..b06f4da5c9e08073126e472fc37d46104f566b0a 100644 (file)
@@ -34,6 +34,7 @@ _treeList = [
         'ScrolledPanel',
         'wxMenu',
         'wxIEHtmlWin',
         'ScrolledPanel',
         'wxMenu',
         'wxIEHtmlWin',
+        'wxKeyEvents',
         ]),
 
     # managed windows == things with a caption you can close
         ]),
 
     # managed windows == things with a caption you can close
@@ -116,12 +117,12 @@ _treeList = [
         'wxDynamicSashWindow',
         'wxEditableListBox',
         'wxEditor',
         'wxDynamicSashWindow',
         'wxEditableListBox',
         'wxEditor',
-        'wxFloatBar',
+        #'wxFloatBar',          deprecated
         'wxHtmlWindow',
         'wxIEHtmlWin',
         'wxLEDNumberCtrl',
         'wxMimeTypesManager',
         'wxHtmlWindow',
         'wxIEHtmlWin',
         'wxLEDNumberCtrl',
         'wxMimeTypesManager',
-        'wxMVCTree',
+        #'wxMVCTree',           deprecated
         'wxRightTextCtrl',
         'wxStyledTextCtrl_1',
         'wxStyledTextCtrl_2',
         'wxRightTextCtrl',
         'wxStyledTextCtrl_1',
         'wxStyledTextCtrl_2',
@@ -146,6 +147,7 @@ _treeList = [
         'Threads',
         'wxProcess',
         'wxTimer',
         'Threads',
         'wxProcess',
         'wxTimer',
+        'wxKeyEvents',
         ]),
 
     # Clipboard and DnD
         ]),
 
     # Clipboard and DnD
diff --git a/wxPython/demo/wxKeyEvents.py b/wxPython/demo/wxKeyEvents.py
new file mode 100644 (file)
index 0000000..4811892
--- /dev/null
@@ -0,0 +1,343 @@
+
+from wxPython.wx import *
+
+#----------------------------------------------------------------------
+
+keyMap = {
+    WXK_BACK : "WXK_BACK",
+    WXK_TAB : "WXK_TAB",
+    WXK_RETURN : "WXK_RETURN",
+    WXK_ESCAPE : "WXK_ESCAPE",
+    WXK_SPACE : "WXK_SPACE",
+    WXK_DELETE : "WXK_DELETE",
+    WXK_START : "WXK_START",
+    WXK_LBUTTON : "WXK_LBUTTON",
+    WXK_RBUTTON : "WXK_RBUTTON",
+    WXK_CANCEL : "WXK_CANCEL",
+    WXK_MBUTTON : "WXK_MBUTTON",
+    WXK_CLEAR : "WXK_CLEAR",
+    WXK_SHIFT : "WXK_SHIFT",
+    WXK_ALT : "WXK_ALT",
+    WXK_CONTROL : "WXK_CONTROL",
+    WXK_MENU : "WXK_MENU",
+    WXK_PAUSE : "WXK_PAUSE",
+    WXK_CAPITAL : "WXK_CAPITAL",
+    WXK_PRIOR : "WXK_PRIOR",
+    WXK_NEXT : "WXK_NEXT",
+    WXK_END : "WXK_END",
+    WXK_HOME : "WXK_HOME",
+    WXK_LEFT : "WXK_LEFT",
+    WXK_UP : "WXK_UP",
+    WXK_RIGHT : "WXK_RIGHT",
+    WXK_DOWN : "WXK_DOWN",
+    WXK_SELECT : "WXK_SELECT",
+    WXK_PRINT : "WXK_PRINT",
+    WXK_EXECUTE : "WXK_EXECUTE",
+    WXK_SNAPSHOT : "WXK_SNAPSHOT",
+    WXK_INSERT : "WXK_INSERT",
+    WXK_HELP : "WXK_HELP",
+    WXK_NUMPAD0 : "WXK_NUMPAD0",
+    WXK_NUMPAD1 : "WXK_NUMPAD1",
+    WXK_NUMPAD2 : "WXK_NUMPAD2",
+    WXK_NUMPAD3 : "WXK_NUMPAD3",
+    WXK_NUMPAD4 : "WXK_NUMPAD4",
+    WXK_NUMPAD5 : "WXK_NUMPAD5",
+    WXK_NUMPAD6 : "WXK_NUMPAD6",
+    WXK_NUMPAD7 : "WXK_NUMPAD7",
+    WXK_NUMPAD8 : "WXK_NUMPAD8",
+    WXK_NUMPAD9 : "WXK_NUMPAD9",
+    WXK_MULTIPLY : "WXK_MULTIPLY",
+    WXK_ADD : "WXK_ADD",
+    WXK_SEPARATOR : "WXK_SEPARATOR",
+    WXK_SUBTRACT : "WXK_SUBTRACT",
+    WXK_DECIMAL : "WXK_DECIMAL",
+    WXK_DIVIDE : "WXK_DIVIDE",
+    WXK_F1 : "WXK_F1",
+    WXK_F2 : "WXK_F2",
+    WXK_F3 : "WXK_F3",
+    WXK_F4 : "WXK_F4",
+    WXK_F5 : "WXK_F5",
+    WXK_F6 : "WXK_F6",
+    WXK_F7 : "WXK_F7",
+    WXK_F8 : "WXK_F8",
+    WXK_F9 : "WXK_F9",
+    WXK_F10 : "WXK_F10",
+    WXK_F11 : "WXK_F11",
+    WXK_F12 : "WXK_F12",
+    WXK_F13 : "WXK_F13",
+    WXK_F14 : "WXK_F14",
+    WXK_F15 : "WXK_F15",
+    WXK_F16 : "WXK_F16",
+    WXK_F17 : "WXK_F17",
+    WXK_F18 : "WXK_F18",
+    WXK_F19 : "WXK_F19",
+    WXK_F20 : "WXK_F20",
+    WXK_F21 : "WXK_F21",
+    WXK_F22 : "WXK_F22",
+    WXK_F23 : "WXK_F23",
+    WXK_F24 : "WXK_F24",
+    WXK_NUMLOCK : "WXK_NUMLOCK",
+    WXK_SCROLL : "WXK_SCROLL",
+    WXK_PAGEUP : "WXK_PAGEUP",
+    WXK_PAGEDOWN : "WXK_PAGEDOWN",
+    WXK_NUMPAD_SPACE : "WXK_NUMPAD_SPACE",
+    WXK_NUMPAD_TAB : "WXK_NUMPAD_TAB",
+    WXK_NUMPAD_ENTER : "WXK_NUMPAD_ENTER",
+    WXK_NUMPAD_F1 : "WXK_NUMPAD_F1",
+    WXK_NUMPAD_F2 : "WXK_NUMPAD_F2",
+    WXK_NUMPAD_F3 : "WXK_NUMPAD_F3",
+    WXK_NUMPAD_F4 : "WXK_NUMPAD_F4",
+    WXK_NUMPAD_HOME : "WXK_NUMPAD_HOME",
+    WXK_NUMPAD_LEFT : "WXK_NUMPAD_LEFT",
+    WXK_NUMPAD_UP : "WXK_NUMPAD_UP",
+    WXK_NUMPAD_RIGHT : "WXK_NUMPAD_RIGHT",
+    WXK_NUMPAD_DOWN : "WXK_NUMPAD_DOWN",
+    WXK_NUMPAD_PRIOR : "WXK_NUMPAD_PRIOR",
+    WXK_NUMPAD_PAGEUP : "WXK_NUMPAD_PAGEUP",
+    WXK_NUMPAD_NEXT : "WXK_NUMPAD_NEXT",
+    WXK_NUMPAD_PAGEDOWN : "WXK_NUMPAD_PAGEDOWN",
+    WXK_NUMPAD_END : "WXK_NUMPAD_END",
+    WXK_NUMPAD_BEGIN : "WXK_NUMPAD_BEGIN",
+    WXK_NUMPAD_INSERT : "WXK_NUMPAD_INSERT",
+    WXK_NUMPAD_DELETE : "WXK_NUMPAD_DELETE",
+    WXK_NUMPAD_EQUAL : "WXK_NUMPAD_EQUAL",
+    WXK_NUMPAD_MULTIPLY : "WXK_NUMPAD_MULTIPLY",
+    WXK_NUMPAD_ADD : "WXK_NUMPAD_ADD",
+    WXK_NUMPAD_SEPARATOR : "WXK_NUMPAD_SEPARATOR",
+    WXK_NUMPAD_SUBTRACT : "WXK_NUMPAD_SUBTRACT",
+    WXK_NUMPAD_DECIMAL : "WXK_NUMPAD_DECIMAL",
+    WXK_NUMPAD_DIVIDE : "WXK_NUMPAD_DIVIDE",
+}
+
+
+#----------------------------------------------------------------------
+
+class KeySink(wxWindow):
+    def __init__(self, parent):
+        wxWindow.__init__(self, parent, -1,
+                          style=wxRAISED_BORDER | wxWANTS_CHARS)
+        self.SetBackgroundColour(wxBLUE)
+        self.haveFocus = false
+        self.callSkip = false
+        self.logKeyDn = true
+        self.logKeyUp = true
+        self.logChar = true
+
+        EVT_PAINT(self, self.OnPaint)
+        EVT_SET_FOCUS(self, self.OnSetFocus)
+        EVT_KILL_FOCUS(self, self.OnKillFocus)
+        EVT_MOUSE_EVENTS(self, self.OnMouse)
+
+        EVT_KEY_DOWN(self, self.OnKeyDown)
+        EVT_KEY_UP(self, self.OnKeyUp)
+        EVT_CHAR(self, self.OnChar)
+
+
+    def SetCallSkip(self, skip):
+        self.callSkip = skip
+
+    def SetLogKeyUp(self, val):
+        self.logKeyUp = val
+
+    def SetLogKeyDn(self, val):
+        self.logKeyDn = val
+
+    def SetLogChar(self, val):
+        self.logChar = val
+
+
+    def OnPaint(self, evt):
+        dc = wxPaintDC(self)
+        rect = self.GetClientRect()
+        dc.SetTextForeground(wxWHITE)
+        dc.DrawLabel("Click here and then press some keys",
+                     rect, wxALIGN_CENTER | wxALIGN_TOP)
+        if self.haveFocus:
+            dc.SetTextForeground(wxGREEN)
+            dc.DrawLabel("Have Focus", rect, wxALIGN_RIGHT | wxALIGN_BOTTOM)
+        else:
+            dc.SetTextForeground(wxRED)
+            dc.DrawLabel("Need Focus!", rect, wxALIGN_RIGHT | wxALIGN_BOTTOM)
+
+
+    def OnSetFocus(self, evt):
+        self.haveFocus = true
+        self.Refresh()
+
+    def OnKillFocus(self, evt):
+        self.haveFocus = false
+        self.Refresh()
+
+    def OnMouse(self, evt):
+        if evt.ButtonDown():
+            self.SetFocus()
+
+
+    def OnKeyDown(self, evt):
+        if self.logKeyDn:
+            self.GetParent().keylog.LogKeyEvent("KeyDown", evt)
+        if self.callSkip:
+            evt.Skip()
+
+    def OnKeyUp(self, evt):
+        if self.logKeyUp:
+            self.GetParent().keylog.LogKeyEvent("KeyUp", evt)
+        if self.callSkip:
+            evt.Skip()
+
+    def OnChar(self, evt):
+        if self.logChar:
+            self.GetParent().keylog.LogKeyEvent("Char", evt)
+
+
+#----------------------------------------------------------------------
+
+from wxPython.lib.mixins.listctrl import wxListCtrlAutoWidthMixin
+
+class KeyLog(wxListCtrl, wxListCtrlAutoWidthMixin):
+
+    def __init__(self, parent):
+        wxListCtrl.__init__(self, parent, -1,
+                            style = wxLC_REPORT|wxLC_VRULES|wxLC_HRULES)
+        wxListCtrlAutoWidthMixin.__init__(self)
+
+        self.InsertColumn(0, "Event Type")
+        self.InsertColumn(1, "Key Name")
+        self.InsertColumn(2, "Key Code")
+        self.InsertColumn(3, "Modifiers")
+        self.InsertColumn(4, "RawKeyCode")
+        self.InsertColumn(5, "RawKeyFlags")
+        self.InsertColumn(6, "")
+
+        for x in range(6):
+            self.SetColumnWidth(x, wxLIST_AUTOSIZE_USEHEADER)
+
+        self.SetColumnWidth(1, 125)
+
+
+    def LogKeyEvent(self, evType, evt):
+        keycode = evt.GetKeyCode()
+        keyname = keyMap.get(keycode, None)
+        if keyname is None:
+            if keycode < 256:
+                if keycode == 0:
+                    keyname = "NUL"
+                elif keycode < 27:
+                    keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
+                else:
+                    keyname = "\"%s\"" % chr(keycode)
+            else:
+                keyname = "unknown (%s)" % keycode
+
+        modifiers = ""
+        for mod, ch in [(evt.ControlDown(), 'C'),
+                        (evt.AltDown(),     'A'),
+                        (evt.ShiftDown(),   'S'),
+                        (evt.MetaDown(),    'M')]:
+            if mod:
+                modifiers += ch
+            else:
+                modifiers += '-'
+
+        id = self.InsertStringItem(0xffffff, evType)
+        self.SetStringItem(id, 1, keyname)
+        self.SetStringItem(id, 2, str(keycode))
+        self.SetStringItem(id, 3, modifiers)
+        self.SetStringItem(id, 4, str(evt.GetRawKeyCode()))
+        self.SetStringItem(id, 5, str(evt.GetRawKeyFlags()))
+
+        #print ( id, evType, keyname, str(keycode), modifiers, str(evt.GetRawKeyCode()), str(evt.GetRawKeyFlags()))
+
+        self.EnsureVisible(id)
+
+
+    def ClearLog(self):
+        self.DeleteAllItems()
+
+
+#----------------------------------------------------------------------
+
+
+class TestPanel(wxPanel):
+    def __init__(self, parent, log):
+        self.log = log
+        wxPanel.__init__(self, parent, -1, style=0)
+        self.keysink = KeySink(self)
+        self.keysink.SetSize((100, 65))
+        self.keylog = KeyLog(self)
+
+        btn = wxButton(self, -1, "Clear Log")
+        EVT_BUTTON(self, btn.GetId(), self.OnClearBtn)
+
+        cb1 = wxCheckBox(self, -1, "Call evt.Skip for Key Up/Dn events")
+        EVT_CHECKBOX(self, cb1.GetId(), self.OnSkipCB)
+
+        cb2 = wxCheckBox(self, -1, "EVT_KEY_UP")
+        EVT_CHECKBOX(self, cb2.GetId(), self.OnKeyUpCB)
+        cb2.SetValue(true)
+
+        cb3 = wxCheckBox(self, -1, "EVT_KEY_DOWN")
+        EVT_CHECKBOX(self, cb3.GetId(), self.OnKeyDnCB)
+        cb3.SetValue(true)
+
+        cb4 = wxCheckBox(self, -1, "EVT_CHAR")
+        EVT_CHECKBOX(self, cb4.GetId(), self.OnCharCB)
+        cb4.SetValue(true)
+
+        buttons = wxBoxSizer(wxHORIZONTAL)
+        buttons.Add(btn, 0, wxALL, 4)
+        buttons.Add(cb1, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 6)
+        buttons.Add(cb2, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 6)
+        buttons.Add(cb3, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 6)
+        buttons.Add(cb4, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 6)
+
+        sizer = wxBoxSizer(wxVERTICAL)
+        sizer.Add(self.keysink, 0, wxGROW)
+        sizer.Add(buttons)
+        sizer.Add(self.keylog, 1, wxGROW)
+
+        self.SetSizer(sizer)
+
+
+    def OnClearBtn(self, evt):
+        self.keylog.ClearLog()
+
+    def OnSkipCB(self, evt):
+        self.keysink.SetCallSkip(evt.GetInt())
+
+    def OnKeyUpCB(self, evt):
+        self.keysink.SetLogKeyUp(evt.GetInt())
+
+    def OnKeyDnCB(self, evt):
+        self.keysink.SetLogKeyDn(evt.GetInt())
+
+    def OnCharCB(self, evt):
+        self.keysink.SetLogChar(evt.GetInt())
+
+
+#----------------------------------------------------------------------
+
+def runTest(frame, nb, log):
+    win = TestPanel(nb, log)
+    return win
+
+#----------------------------------------------------------------------
+
+
+
+overview = """<html><body>
+<h2><center>wxKeyEvents</center></h2>
+
+This demo simply lets catches all key events and prints info about them.
+It is meant to be used as a compatibility test for cross platform work.
+
+</body></html>
+"""
+
+
+
+if __name__ == '__main__':
+    import sys,os
+    import run
+    run.main(['', os.path.basename(sys.argv[0])])
+