|
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) |