commit-gnue
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnue] r9382 - trunk/gnue-forms/src/uidrivers/curses/widgets


From: johannes
Subject: [gnue] r9382 - trunk/gnue-forms/src/uidrivers/curses/widgets
Date: Wed, 14 Feb 2007 07:23:15 -0600 (CST)

Author: johannes
Date: 2007-02-14 07:23:15 -0600 (Wed, 14 Feb 2007)
New Revision: 9382

Modified:
   trunk/gnue-forms/src/uidrivers/curses/widgets/form.py
   trunk/gnue-forms/src/uidrivers/curses/widgets/menu.py
   trunk/gnue-forms/src/uidrivers/curses/widgets/menuitem.py
Log:
Added support for hotkeys to the menu


Modified: trunk/gnue-forms/src/uidrivers/curses/widgets/form.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/curses/widgets/form.py       2007-02-14 
08:36:18 UTC (rev 9381)
+++ trunk/gnue-forms/src/uidrivers/curses/widgets/form.py       2007-02-14 
13:23:15 UTC (rev 9382)
@@ -46,6 +46,7 @@
         self.__pages = []
         self.__currentPage = None
         self.__main_menu = None
+        self.__hotkeys = {}
         self.__close_in_progress = False
 
         # Status bar values
@@ -86,6 +87,22 @@
 
 
     # -------------------------------------------------------------------------
+    # Register a menu item with a given set of hotkeys
+    # -------------------------------------------------------------------------
+
+    def register_hotkey(self, item, keycodes):
+        """
+        Register a menu item with a set of hotkeys
+
+        @param item: the UIMenuItem to assocatiate with the hotkeys
+        @param keycodes: tuple with the keycodes of the hotkey
+        """
+
+        for key in keycodes:
+            self.__hotkeys[key] = item
+
+
+    # -------------------------------------------------------------------------
     # Set form title
     # -------------------------------------------------------------------------
 
@@ -202,11 +219,17 @@
                 self.__main_menu.show(self.__currentPage)
                 result = None
 
+            if result in self.__hotkeys:
+                gDebug(2, "MenuItem is called via hotkey: %r" % result)
+                self.__hotkeys[result]._event_fire()
+                result  = None
+
             if self.__close_in_progress:
                 break
 
         return result
 
+
     # -------------------------------------------------------------------------
     # Get free area in the window
     # -------------------------------------------------------------------------

Modified: trunk/gnue-forms/src/uidrivers/curses/widgets/menu.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/curses/widgets/menu.py       2007-02-14 
08:36:18 UTC (rev 9381)
+++ trunk/gnue-forms/src/uidrivers/curses/widgets/menu.py       2007-02-14 
13:23:15 UTC (rev 9382)
@@ -46,6 +46,7 @@
         Creates a new Menu widget.
         """
 
+        self.hotkey = None
         if self._gfObject.name == '__main_menu__' \
                 and not self._form._features['GUI:MENUBAR:SUPPRESS']:
             # Menu bar of the form
@@ -84,8 +85,9 @@
         self.__data = []
         for item in self.__menu_items:
             if item._gfObject.label:
-                add = self.__pattern % {'text': item._gfObject.label,
-                                 'hotk': getattr(item._gfObject, 'hotkey', '')}
+                add = self.__pattern % \
+                        {'text': item._gfObject.label,
+                         'hotk': item.hotkey or ''}
                 self.__data.append(' %s ' % add)
             else:
                 self.__data.append(self.__separator)
@@ -156,7 +158,7 @@
         for item in self.__menu_items:
             add = item._gfObject.label or ''
             text.append(add)
-            hotk.append(getattr(item._gfObject, 'hotkey', '') or '')
+            hotk.append(item.hotkey or '')
 
         max_text = max([len(i) for i in text])
         max_hotk = max([len(i) for i in hotk])
@@ -261,7 +263,7 @@
                     elif key != curses.KEY_RIGHT:
                         # Don't fire an event on separators
                         if current._gfObject.label is not None:
-                            current._gfObject._event_fire()
+                            current._event_fire()
                             break
 
                 elif key == curses.KEY_LEFT:

Modified: trunk/gnue-forms/src/uidrivers/curses/widgets/menuitem.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/curses/widgets/menuitem.py   2007-02-14 
08:36:18 UTC (rev 9381)
+++ trunk/gnue-forms/src/uidrivers/curses/widgets/menuitem.py   2007-02-14 
13:23:15 UTC (rev 9382)
@@ -21,6 +21,8 @@
 #
 # $Id$
 
+import curses
+
 from gnue.forms.uidrivers.curses.widgets._base import UIHelper
 
 
@@ -42,17 +44,15 @@
         Creates a new MenuItem widget.
         """
 
-        # These are the relevant parameters
-        label = self._gfObject.label
-        description = self._gfObject.description
-        hotkey = self._gfObject.hotkey
-        check = (self._gfObject.action_off is not None)
+        self.hotkey = self._gfObject.hotkey
+        self.check = (self._gfObject.action_off is not None)
 
-        if label is not None:
-            if hotkey is not None:
-                text = label + u"\t" + hotkey
+        if self._gfObject.label is not None:
+            if self.hotkey is not None and self.hotkey in _HOTKEYS:
+                item = _HOTKEYS[self.hotkey]
+                self._uiForm.register_hotkey(self, item)
             else:
-                text = label
+                self.hotkey = ''
 
         event.container.add_subitem(self)
 
@@ -60,6 +60,19 @@
 
 
     # -------------------------------------------------------------------------
+    # Events
+    # -------------------------------------------------------------------------
+
+    def _event_fire(self):
+        """
+        Call the action bound to this menu item
+        """
+
+        if self._gfObject.label is not None:
+            self._gfObject._event_fire()
+
+
+    # -------------------------------------------------------------------------
     # Check/uncheck menu item
     # -------------------------------------------------------------------------
 
@@ -89,6 +102,52 @@
 
 
 # =============================================================================
+# Definition of the available hotkeys
+# =============================================================================
+
+_HOTKEYS = {
+    "INS"  : (curses.KEY_IC,),
+    "DEL"  : (curses.KEY_DC,),
+    "HOME" : (curses.KEY_HOME, curses.KEY_FIND),
+    "END"  : (curses.KEY_END,),
+    "PGUP" : (curses.KEY_PPAGE,),
+    "PGDN" : (curses.KEY_NPAGE,),
+    "UP"   : (curses.KEY_UP,),
+    "DOWN" : (curses.KEY_DOWN,),
+    "LEFT" : (curses.KEY_LEFT,),
+    "RIGHT": (curses.KEY_RIGHT,),
+    "TAB"  : (9,),
+    "ENTER": (10, curses.KEY_ENTER,),
+    "BACK" : (curses.KEY_BACKSPACE,),
+
+    "SHIFT+INS"  : (curses.KEY_SIC,),
+    "SHIFT+DEL"  : (curses.KEY_SDC,),
+    "SHIFT+HOME" : (curses.KEY_SHOME,),
+    "SHIFT+END"  : (curses.KEY_SEND,),
+    "SHIFT+LEFT" : (curses.KEY_SLEFT,),
+    "SHIFT+RIGHT": (curses.KEY_SRIGHT,),
+    "SHIFT+TAB"  : (curses.KEY_BTAB,),
+}
+
+# Add the function keys to the map.  We treat the modifiers SHIFT, CTRL and the
+# combination of both to add a multiple of 12 to the function key name.  So F1
+# is F1, SHIFT+F1 is F13, CTRL+F1 is F25 and SHIFT+CTRL-F1 is F37.
+
+for i in range(1, 13):
+    for mul,mod in enumerate(["", "SHIFT+", "CTRL+", "SHIFT+CTRL+"]):
+        hot_name = "%sF%d" % (mod, i)
+        key_name = "KEY_F%d" % (i + mul * 12)
+
+        key = getattr(curses, key_name, None)
+        if key is not None:
+            _HOTKEYS[hot_name] = (key,)
+
+# Add the Control-Characters for A - Z (CTRL+A, CTRL+B, ...)
+for i in range(26):
+    _HOTKEYS["CTRL+%c" % (65 + i)] = chr(i+1)
+
+
+# =============================================================================
 # Configuration data
 # =============================================================================
 





reply via email to

[Prev in Thread] Current Thread [Next in Thread]