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.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
111
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     1
from collections import OrderedDict
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     2
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     3
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     4
class Event:
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     5
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     6
    """Base class for events."""
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     7
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     8
    def __init__(self, event_name=None, arg_names=(), arg_values=()):
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     9
        self.name = event_name
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    10
        self.args = OrderedDict(zip(arg_names, arg_values))
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    11
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    12
    def __getattr__(self, item):
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    13
        if item in self.args:
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    14
            return self.args[item]
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    15
        else:
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    16
            raise AttributeError(item)
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    17
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    18
    def __getitem__(self, key):
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    19
        return self.args[key]
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    20
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    21
    def __repr__(self):
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    22
        return '{}({})'.format(self.__class__.__name__,
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    23
                               ', '.join("%s=%r" % (k,v) for k,v
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    24
                                         in self.args.items()))
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    25
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    26
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    27
class ResizeEvent(Event):
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    28
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    29
    def __init__(self, w, h):
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    30
        Event.__init__(self, 'resize', ('w', 'h'), (w, h))
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    31
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    32
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    33
class KeypressEvent(Event):
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    34
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    35
    def __init__(self, keyname, char, mods):
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    36
        Event.__init__(self, 'keypress',
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    37
                       ('keyname', 'char', 'mods'),
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    38
                       (keyname, char, mods))
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    39
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    40
    def mod_key(self, sep='+'):
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    41
        """Return combined key with modifiers.
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    42
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    43
        E.g. "shift+tab"
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    44
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    45
        Order of modifiers is fixed: ctrl, alt, meta, shift
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    46
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    47
        """
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    48
        res = []
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    49
        for mod in ('ctrl', 'alt', 'meta', 'shift'):
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    50
            if mod in self.mods:
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    51
                res.append(mod)
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    52
        res.append(self.keyname or self.char)
b055add74b18 Refactor events.
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    53
        return sep.join(res)
118
8c7970520632 Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents: 111
diff changeset
    54
8c7970520632 Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents: 111
diff changeset
    55
8c7970520632 Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents: 111
diff changeset
    56
class MouseEvent(Event):
8c7970520632 Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents: 111
diff changeset
    57
8c7970520632 Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents: 111
diff changeset
    58
    def __init__(self, name, button, pos, relpos=None):
8c7970520632 Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents: 111
diff changeset
    59
        Event.__init__(self, name,
8c7970520632 Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents: 111
diff changeset
    60
                       ('name', 'button', 'pos', 'relpos'),
8c7970520632 Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents: 111
diff changeset
    61
                       (name, button, pos, relpos))
8c7970520632 Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents: 111
diff changeset
    62
8c7970520632 Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents: 111
diff changeset
    63
    def rebase(self, zero_pos):
8c7970520632 Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents: 111
diff changeset
    64
        """Return new MouseEvent with position rebased to zero_pos."""
8c7970520632 Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents: 111
diff changeset
    65
        pos = self.pos - zero_pos
8c7970520632 Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents: 111
diff changeset
    66
        return MouseEvent(self.name, self.button, pos, self.relpos)