--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tuikit/core/coords.py Mon Mar 17 23:44:18 2014 +0100
@@ -0,0 +1,106 @@
+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)