tuikit/core/coords.py
author Radek Brich <radek.brich@devl.cz>
Mon, 17 Mar 2014 23:44:18 +0100
changeset 87 ee5ea9671f28
parent 86 tuikit/core/size.py@0978fb755d31
child 91 de80e140b0ec
permissions -rw-r--r--
Add core Widget, Container. Add widgets Label.

class Point:

    """Point in cartesian space.

    Implements attribute access (.x, .y) and list-like access([0],[1]).

    """

    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

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

    def __repr__(self):
        return 'Point(x={0.x},y={0.y})'.format(self)

    def update(self, *args, **kwargs):
        """Update point.

        Accepts positional or keyword arguments:
        - (point: Point)
        - (x: int, y: int)

        """
        if len(args) == 2:
            self.x, self.y = args
        elif len(args) == 1:
            self.x, self.y = args[0]
        elif len(args):
            raise ValueError('Too many args.')
        for key, val in kwargs.items():
            if key == 'point':
                self.x, self.y = val
            elif key in ('x', 'y'):
                setattr(self, key, val)
            else:
                raise ValueError('Bad keyword arg: %r' % key)


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):
        """Update size.

        Accepts positional or keyword arguments:
        - (size: Size)
        - (w: int, h: int)

        """
        if len(args) == 2:
            self.w, self.h = args
        elif len(args) == 1:
            self.w, self.h = args[0]
        elif len(args):
            raise ValueError('Too many args.')
        for key, val in kwargs.items():
            if key == 'size':
                self.w, self.h = val
            elif 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)