]> 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 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:
 
@@ -114,9 +114,11 @@ supported are:
     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.
@@ -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.
 
+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',
+        'wxKeyEvents',
         ]),
 
     # managed windows == things with a caption you can close
@@ -116,12 +117,12 @@ _treeList = [
         'wxDynamicSashWindow',
         'wxEditableListBox',
         'wxEditor',
-        'wxFloatBar',
+        #'wxFloatBar',          deprecated
         'wxHtmlWindow',
         'wxIEHtmlWin',
         'wxLEDNumberCtrl',
         'wxMimeTypesManager',
-        'wxMVCTree',
+        #'wxMVCTree',           deprecated
         'wxRightTextCtrl',
         'wxStyledTextCtrl_1',
         'wxStyledTextCtrl_2',
@@ -146,6 +147,7 @@ _treeList = [
         'Threads',
         'wxProcess',
         'wxTimer',
+        'wxKeyEvents',
         ]),
 
     # 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])])
+