15 Widget.__init__(self) |
15 Widget.__init__(self) |
16 #: List of child widgets. |
16 #: List of child widgets. |
17 self._widgets = [] |
17 self._widgets = [] |
18 #: Widget with keyboard focus |
18 #: Widget with keyboard focus |
19 self.focus_widget = None |
19 self.focus_widget = None |
|
20 #: Widget on last mouse position |
|
21 self.mouse_widget = None |
20 #: If True, tab cycles inside container |
22 #: If True, tab cycles inside container |
21 self.trap_focus = False |
23 self.trap_focus = False |
22 self.layout = layout_class() |
24 self.layout = layout_class() |
23 |
25 |
24 def add(self, widget): |
26 def add(self, widget): |
49 for child in self._widgets: |
51 for child in self._widgets: |
50 child.set_theme(theme) |
52 child.set_theme(theme) |
51 |
53 |
52 @property |
54 @property |
53 def cursor(self): |
55 def cursor(self): |
|
56 """Return cursor coordinates or None if cursor is not set |
|
57 or is set outside of widget boundaries. |
|
58 |
|
59 If this container has child with focus, return its cursor position instead. |
|
60 |
|
61 """ |
54 if self.focus_widget: |
62 if self.focus_widget: |
55 cursor = self.focus_widget.cursor |
63 cursor = self.focus_widget.cursor |
56 return cursor.moved(*self.focus_widget.pos) |
64 if not cursor: |
|
65 return None |
|
66 cursor = cursor.moved(*self.focus_widget.pos) |
57 else: |
67 else: |
58 return self._cursor |
68 cursor = self._cursor.immutable() |
|
69 if cursor in Rect._make((0, 0), self._size): |
|
70 return cursor |
59 |
71 |
60 @property |
72 @property |
61 def cursor_visible(self): |
73 def cursor_visible(self): |
62 if self.focus_widget: |
74 if self.focus_widget: |
63 return self.focus_widget.cursor_visible |
75 return self.focus_widget.cursor_visible |
76 return self.focus_next(-1 if 'shift' in ev.mods else 1) |
88 return self.focus_next(-1 if 'shift' in ev.mods else 1) |
77 # Finally, handle default keys by Widget |
89 # Finally, handle default keys by Widget |
78 # and send keypress signal |
90 # and send keypress signal |
79 if Widget.keypress_event(self, ev): |
91 if Widget.keypress_event(self, ev): |
80 return True |
92 return True |
|
93 |
|
94 def mousedown(self, button, pos): |
|
95 self.mouse_child = None |
|
96 for child in reversed(self.children): |
|
97 if pos in child.boundaries: |
|
98 child.mousedown(button, pos - child.pos) |
|
99 self.mouse_child = child |
|
100 |
|
101 def mouseup(self, button, pos): |
|
102 if self.mouse_child: |
|
103 self.mouse_child.mouseup(button, pos - self.mouse_child.pos) |
|
104 |
|
105 def mousemove(self, button, pos, relpos): |
|
106 if self.mouse_child: |
|
107 self.mouse_child.mousemove(button, |
|
108 pos - self.mouse_child.pos, relpos) |
81 |
109 |
82 ## focus ## |
110 ## focus ## |
83 |
111 |
84 def focus_next(self, step=1): |
112 def focus_next(self, step=1): |
85 """Focus next child. |
113 """Focus next child. |