tuikit/core/size.py
author Radek Brich <radek.brich@devl.cz>
Mon, 17 Mar 2014 20:40:04 +0100
changeset 86 0978fb755d31
permissions -rw-r--r--
Add core Application (adjusted), Window (new version), Signal (replaces Emitter), Size (adjusted). Add application demo.

class Size:

    """Size class.

    Implements attribute access (.w, .h) and list-like access([0],[1]).

    """

    def __init__(self, *args, **kwargs):
        self.w = 0
        self.h = 0
        self.update(*args, **kwargs)

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

    def __repr__(self):
        return 'Size(w={0.w},h={0.h})'.format(self)

    def update(self, *args, **kwargs):
        if len(args) == 2:
            # (w:int, h:int)
            self.w, self.h = args
        elif len(args) == 1:
            # (size:Size)
            self.w, self.h = args[0]
        elif len(args):
            raise ValueError('Too many args.')
        for key, val in kwargs.items():
            if key in ('w', 'h'):
                setattr(self, key, val)
            else:
                raise ValueError('Bad keyword arg: %r' % key)

    def readonly(self):
        return ReadonlySize(self)


class ReadonlySize:

    """Wrapper for Size which makes it read-only."""

    def __init__(self, size):
        self._size = size

    @property
    def w(self):
        return self._size.w

    @property
    def h(self):
        return self._size.h

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

    def __repr__(self):
        return 'ReadonlySize(w={0.w},h={0.h})'.format(self._size)