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)