[Top][All Lists]
[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
# =============================================================================
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [gnue] r9382 - trunk/gnue-forms/src/uidrivers/curses/widgets,
johannes <=