tuikit/container.py
changeset 0 a35731b5e31a
child 1 69318aba22bf
equal deleted inserted replaced
-1:000000000000 0:a35731b5e31a
       
     1 # -*- coding: utf-8 -*-
       
     2 
       
     3 from .widget import Widget
       
     4 
       
     5 
       
     6 class Container(Widget):
       
     7     def __init__(self, width = 10, height = 10):
       
     8         Widget.__init__(self, width, height)
       
     9 
       
    10         self.children = []
       
    11         self.focuschild = None
       
    12         self.mousechild = None
       
    13 
       
    14         self.borders = (0, 0, 0, 0) # left, top, right, bottom
       
    15         self.widthrequest = (None, None)
       
    16         self.heightrequest = (None, None)
       
    17 
       
    18 
       
    19     def add(self, widget):
       
    20         self.children.append(widget)
       
    21         widget.parent = self
       
    22         widget.settop(self.top)
       
    23 
       
    24 
       
    25     def layout(self, layout):
       
    26         self.layout = layout
       
    27         layout.container = self
       
    28         self.connect('resize', layout.resize)
       
    29 
       
    30 
       
    31     def settop(self, top):
       
    32         self.top = top
       
    33         for child in self.children:
       
    34             child.settop(top)
       
    35 
       
    36 
       
    37     ### focus
       
    38 
       
    39 
       
    40     def canfocus(self):
       
    41         return True
       
    42 
       
    43 
       
    44     def setfocus(self):
       
    45         self.focus = True
       
    46         if self.focuschild is None and len(self.children) > 0:
       
    47             for child in self.children:
       
    48                 if self.focuschild is None:
       
    49                     if child.canfocus():
       
    50                         self.focuschild = child
       
    51                         child.setfocus()
       
    52                 else:
       
    53                     if child.focus:
       
    54                         child.unfocus()
       
    55 
       
    56     def unfocus(self):
       
    57         self.focus = False
       
    58         for child in self.children:
       
    59             child.unfocus()
       
    60 
       
    61 
       
    62     ###
       
    63 
       
    64 
       
    65     def draw(self, screen, x=0, y=0):
       
    66         #if self._redraw:
       
    67             #self.fill(screen, self.y, self.x, self.height, self.width)
       
    68         self.handle('draw', screen, x, y)
       
    69 
       
    70         l, t, r, b = self.borders
       
    71         screen.pushclip(x + l, y + t, self.width - l - r, self.height - t - b)
       
    72 
       
    73         for child in self.children:
       
    74             #if self._redraw:
       
    75              #   child._redraw = True
       
    76             child.draw(screen, x + child.x, y + child.y)
       
    77 
       
    78         screen.popclip()
       
    79 
       
    80         #self._redraw = False
       
    81 
       
    82 
       
    83     def keypress(self, keyname, char):
       
    84         # always relay key event to some child
       
    85         if self.focus:
       
    86             self.handle('keypress', keyname, char)
       
    87             if self.focuschild:
       
    88                 self.focuschild.keypress(keyname, char)
       
    89 
       
    90 
       
    91     def mousedown(self, ev):
       
    92         handled = False
       
    93         for child in reversed(self.children):
       
    94             if child.enclose(ev.wx, ev.wy):
       
    95                 childev = ev.childevent(child)
       
    96                 child.mousedown(childev)
       
    97                 self.mousechild = child
       
    98                 handled = True
       
    99                 break
       
   100         if not handled:
       
   101             self.handle('mousedown', ev)
       
   102 
       
   103 
       
   104     def mouseup(self, ev):
       
   105         if self.mousechild:
       
   106             childev = ev.childevent(self.mousechild)
       
   107             self.mousechild.mouseup(childev)
       
   108             self.mousechild = None
       
   109         else:
       
   110             self.handle('mouseup', ev)
       
   111         #handled = False
       
   112         #for child in self.children:
       
   113             #if child.enclose(ev.wx, ev.wy):
       
   114                 #childev = ev.childevent(child)
       
   115                 #child.mouseup(childev)
       
   116                 #self.mousechild = child
       
   117                 #handled = True
       
   118         #if not handled:
       
   119             #self.handle('mouseup', ev)
       
   120 
       
   121 
       
   122     def mousemove(self, ev):
       
   123         if self.mousechild:
       
   124             childev = ev.childevent(self.mousechild)
       
   125             self.mousechild.mousemove(childev)
       
   126         else:
       
   127             self.handle('mousemove', ev)
       
   128 
       
   129 
       
   130     def mousewheel(self, ev):
       
   131         handled = False
       
   132         for child in reversed(self.children):
       
   133             if child.enclose(ev.wx, ev.wy):
       
   134                 childev = ev.childevent(child)
       
   135                 child.mousewheel(childev)
       
   136                 handled = True
       
   137                 break
       
   138         if not handled:
       
   139             self.handle('mousewheel', ev)