tuikit/core/events.py
author Radek Brich <radek.brich@devl.cz>
Sat, 21 Feb 2015 12:01:57 +0100
changeset 118 8c7970520632
parent 111 b055add74b18
permissions -rw-r--r--
Add mouse events, event demo.

from collections import OrderedDict


class Event:

    """Base class for events."""

    def __init__(self, event_name=None, arg_names=(), arg_values=()):
        self.name = event_name
        self.args = OrderedDict(zip(arg_names, arg_values))

    def __getattr__(self, item):
        if item in self.args:
            return self.args[item]
        else:
            raise AttributeError(item)

    def __getitem__(self, key):
        return self.args[key]

    def __repr__(self):
        return '{}({})'.format(self.__class__.__name__,
                               ', '.join("%s=%r" % (k,v) for k,v
                                         in self.args.items()))


class ResizeEvent(Event):

    def __init__(self, w, h):
        Event.__init__(self, 'resize', ('w', 'h'), (w, h))


class KeypressEvent(Event):

    def __init__(self, keyname, char, mods):
        Event.__init__(self, 'keypress',
                       ('keyname', 'char', 'mods'),
                       (keyname, char, mods))

    def mod_key(self, sep='+'):
        """Return combined key with modifiers.

        E.g. "shift+tab"

        Order of modifiers is fixed: ctrl, alt, meta, shift

        """
        res = []
        for mod in ('ctrl', 'alt', 'meta', 'shift'):
            if mod in self.mods:
                res.append(mod)
        res.append(self.keyname or self.char)
        return sep.join(res)


class MouseEvent(Event):

    def __init__(self, name, button, pos, relpos=None):
        Event.__init__(self, name,
                       ('name', 'button', 'pos', 'relpos'),
                       (name, button, pos, relpos))

    def rebase(self, zero_pos):
        """Return new MouseEvent with position rebased to zero_pos."""
        pos = self.pos - zero_pos
        return MouseEvent(self.name, self.button, pos, self.relpos)