Start to add the events manager code, I think this should all be nice and event driven

Signed-off-by: R. Tyler Ballance <tyler@monkeypox.org>
This commit is contained in:
R. Tyler Ballance 2009-02-22 22:14:54 -08:00
parent 71859c10ce
commit ecf1558c08
3 changed files with 71 additions and 2 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
*.pyc
*.swp

View File

@ -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)

27
events.py Normal file
View File

@ -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')