tuikit/core/size.py
changeset 86 0978fb755d31
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tuikit/core/size.py	Mon Mar 17 20:40:04 2014 +0100
@@ -0,0 +1,58 @@
+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)