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:
parent
71859c10ce
commit
ecf1558c08
|
@ -0,0 +1,2 @@
|
|||
*.pyc
|
||||
*.swp
|
44
__init__.py
44
__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)
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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')
|
Loading…
Reference in New Issue