tuikit/container.py
changeset 0 a35731b5e31a
child 1 69318aba22bf
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tuikit/container.py	Wed Feb 16 23:51:30 2011 +0100
@@ -0,0 +1,139 @@
+# -*- coding: utf-8 -*-
+
+from .widget import Widget
+
+
+class Container(Widget):
+    def __init__(self, width = 10, height = 10):
+        Widget.__init__(self, width, height)
+
+        self.children = []
+        self.focuschild = None
+        self.mousechild = None
+
+        self.borders = (0, 0, 0, 0) # left, top, right, bottom
+        self.widthrequest = (None, None)
+        self.heightrequest = (None, None)
+
+
+    def add(self, widget):
+        self.children.append(widget)
+        widget.parent = self
+        widget.settop(self.top)
+
+
+    def layout(self, layout):
+        self.layout = layout
+        layout.container = self
+        self.connect('resize', layout.resize)
+
+
+    def settop(self, top):
+        self.top = top
+        for child in self.children:
+            child.settop(top)
+
+
+    ### focus
+
+
+    def canfocus(self):
+        return True
+
+
+    def setfocus(self):
+        self.focus = True
+        if self.focuschild is None and len(self.children) > 0:
+            for child in self.children:
+                if self.focuschild is None:
+                    if child.canfocus():
+                        self.focuschild = child
+                        child.setfocus()
+                else:
+                    if child.focus:
+                        child.unfocus()
+
+    def unfocus(self):
+        self.focus = False
+        for child in self.children:
+            child.unfocus()
+
+
+    ###
+
+
+    def draw(self, screen, x=0, y=0):
+        #if self._redraw:
+            #self.fill(screen, self.y, self.x, self.height, self.width)
+        self.handle('draw', screen, x, y)
+
+        l, t, r, b = self.borders
+        screen.pushclip(x + l, y + t, self.width - l - r, self.height - t - b)
+
+        for child in self.children:
+            #if self._redraw:
+             #   child._redraw = True
+            child.draw(screen, x + child.x, y + child.y)
+
+        screen.popclip()
+
+        #self._redraw = False
+
+
+    def keypress(self, keyname, char):
+        # always relay key event to some child
+        if self.focus:
+            self.handle('keypress', keyname, char)
+            if self.focuschild:
+                self.focuschild.keypress(keyname, char)
+
+
+    def mousedown(self, ev):
+        handled = False
+        for child in reversed(self.children):
+            if child.enclose(ev.wx, ev.wy):
+                childev = ev.childevent(child)
+                child.mousedown(childev)
+                self.mousechild = child
+                handled = True
+                break
+        if not handled:
+            self.handle('mousedown', ev)
+
+
+    def mouseup(self, ev):
+        if self.mousechild:
+            childev = ev.childevent(self.mousechild)
+            self.mousechild.mouseup(childev)
+            self.mousechild = None
+        else:
+            self.handle('mouseup', ev)
+        #handled = False
+        #for child in self.children:
+            #if child.enclose(ev.wx, ev.wy):
+                #childev = ev.childevent(child)
+                #child.mouseup(childev)
+                #self.mousechild = child
+                #handled = True
+        #if not handled:
+            #self.handle('mouseup', ev)
+
+
+    def mousemove(self, ev):
+        if self.mousechild:
+            childev = ev.childevent(self.mousechild)
+            self.mousechild.mousemove(childev)
+        else:
+            self.handle('mousemove', ev)
+
+
+    def mousewheel(self, ev):
+        handled = False
+        for child in reversed(self.children):
+            if child.enclose(ev.wx, ev.wy):
+                childev = ev.childevent(child)
+                child.mousewheel(childev)
+                handled = True
+                break
+        if not handled:
+            self.handle('mousewheel', ev)