From ecf1558c08496674f0396681ccdaee6048e00420 Mon Sep 17 00:00:00 2001 From: "R. Tyler Ballance" Date: Sun, 22 Feb 2009 22:14:54 -0800 Subject: [PATCH] Start to add the events manager code, I think this should all be nice and event driven Signed-off-by: R. Tyler Ballance --- .gitignore | 2 ++ __init__.py | 44 ++++++++++++++++++++++++++++++++++++++++++-- events.py | 27 +++++++++++++++++++++++++++ 3 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 .gitignore create mode 100644 events.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c9b568f --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.pyc +*.swp diff --git a/__init__.py b/__init__.py index a1af107..a488b33 100644 --- a/__init__.py +++ b/__init__.py @@ -1,3 +1,4 @@ +import copy import curses import weakref @@ -45,7 +46,7 @@ class Menu(Widget): self.parent.addstr(y, x, element[under+2:], self.NORMAL) x = x + len(element[under+2:]) else: - self.parent.addstr(y, x, element) + self.parent.addstr(y, x, element, self.NORMAL) x = x + len(element) if element != self.elements[-1]: @@ -56,4 +57,43 @@ class Window(Widget): pass class Submenu(Widget): - pass + ''' Submenu is a basic class for handling vertically drawn, i.e. sub-menus ''' + HOTKEY = curses.A_BOLD | curses.A_UNDERLINE + NORMAL = curses.A_NORMAL + def __init__(self, *args, **kwargs): + super(Submenu, self).__init__(*args, **kwargs) + self.elements = kwargs['elements'] + self._window = None + self._width = 0 + + def render(self): + assert self.parent, ('Parent cannot be None to render a submenu!') + assert isinstance(self.parent, Menu), (self.parent, 'Expecting parent widget to be a Menu') + startx, starty = 1, 3 + + elms = copy.deepcopy(self.elements) + elms.sort(key=lambda e: len(e), reverse=True) + self._width = elms[0] + 1 + + self._window = curses.newwin(len(self.elements), self._width, starty, startx) + + for element in self.elements: + y = starty + 1 + x = startx + under = None + try: + under = element.index('_') + except ValueError: + pass + + if not under == None: + self._window.addstr(y, x, element[under+1:under+2], self.HOTKEY) + x = x + 1 + self._window.addstr(y, x, element[under+2:], self.NORMAL) + elif element == '---': + self._window.hline(y, x, curses.ACS_HLINE, self._width) + else: + self._window.addstr(y, x, element, self.NORMAL) + + + diff --git a/events.py b/events.py new file mode 100644 index 0000000..629309f --- /dev/null +++ b/events.py @@ -0,0 +1,27 @@ +import types + +class StandardEvents(object): + QuitApplication = 'ConsoleUIQuit' + CloseWIndow = 'ConsoleUICloseWindow' + +class EventManagerError(Exception): + pass + +class EventManager(object): + def __init__(self, *args, **kwargs): + self.name = kwargs['name'] + self.observers = {} + + def register_handler(self, event, handler): + if not isinstance(handler, types.MethodType) or not isinstance(handler, types.FunctionType): + raise EventManagerError('When using register_handler(event, handler) the handler argument must be a method or function') + if not self.observers.get(event): + self.observers[event] = [] + self.observers[event].append(handler) + + def raise_event(self, event, **kwargs): + if self.observers.get(event): + for handler in self.observers[event]: + handler(event, **kwargs) + +manager = EventManager(name='Global Event Manager')