21 self.parent = None |
21 self.parent = None |
22 #: Window owning this Widget |
22 #: Window owning this Widget |
23 self.window = None |
23 self.window = None |
24 #: Theme |
24 #: Theme |
25 self.theme = default_theme |
25 self.theme = default_theme |
|
26 #: Timer |
|
27 self.timer = None |
26 |
28 |
27 #: Position inside parent widget. Modified by layout manager. |
29 #: Position inside parent widget. Modified by layout manager. |
28 self.pos = Point() |
30 self.pos = Point() |
29 #: Actual size. Modified by layout manager. |
31 #: Actual size. Modified by layout manager. |
30 self._size = Size(10, 10) |
32 self._size = Size(10, 10) |
41 #: The cursor coordinates are relative to widget. |
43 #: The cursor coordinates are relative to widget. |
42 self._cursor = Point() |
44 self._cursor = Point() |
43 #: Cursor is displayed on screen only when the widget is focused. |
45 #: Cursor is displayed on screen only when the widget is focused. |
44 self._cursor_visible = False |
46 self._cursor_visible = False |
45 |
47 |
|
48 #: True if this widget requests redraw |
|
49 self.need_draw = True |
46 #: Hidden widget does not affect layout. |
50 #: Hidden widget does not affect layout. |
47 self.hidden = False |
51 self.hidden = False |
48 #: Allow keyboard focus for this widget. |
52 #: Allow keyboard focus for this widget. |
49 self.allow_focus = False |
53 self.allow_focus = False |
50 |
54 |
51 self.sig_keypress = Signal(allow_stop=True) |
55 self.sig_keypress = Signal(allow_stop=True) |
52 |
56 |
53 ## position and size ## |
57 # ------------------------------------------------------------------------- |
|
58 # Position and size |
54 |
59 |
55 @property |
60 @property |
56 def x(self): |
61 def x(self): |
57 return self.pos.x |
62 return self.pos.x |
58 |
63 |
80 """Should be called only by layout manager.""" |
85 """Should be called only by layout manager.""" |
81 self._size.update(w, h) |
86 self._size.update(w, h) |
82 |
87 |
83 @property |
88 @property |
84 def boundaries(self): |
89 def boundaries(self): |
85 return Rect._make(self.pos, self._size) |
90 return Rect(self.pos, self._size) |
86 |
91 |
87 ## drawing, looks ## |
92 # ------------------------------------------------------------------------- |
|
93 # Presentation |
|
94 |
|
95 def draw_if_needed(self, buffer): |
|
96 if self.need_draw: |
|
97 self.draw(buffer) |
88 |
98 |
89 def draw(self, buffer): |
99 def draw(self, buffer): |
90 """Draw self into buffer.""" |
100 """Draw self into buffer.""" |
91 self.log.debug('Draw into %r at %s (exposed %s)', |
101 self.log.debug('Draw into %r at %s (exposed %s)', |
92 buffer, buffer.origin, self.exposed(buffer)) |
102 buffer, buffer.origin, self.exposed(buffer)) |
|
103 self.need_draw = False |
|
104 |
|
105 def redraw(self): |
|
106 """Request redraw.""" |
|
107 self.need_draw = True |
93 |
108 |
94 def set_theme(self, theme): |
109 def set_theme(self, theme): |
95 self.theme = theme |
110 self.theme = theme |
96 |
111 |
97 @staticmethod |
112 @staticmethod |
111 """Return cursor coordinates. |
126 """Return cursor coordinates. |
112 |
127 |
113 Returns None if cursor is set outside of widget boundaries. |
128 Returns None if cursor is set outside of widget boundaries. |
114 |
129 |
115 """ |
130 """ |
116 if self._cursor in Rect._make((0, 0), self._size): |
131 if self._cursor in Rect(0, 0, *self._size): |
117 return self._cursor |
132 return self._cursor |
118 |
133 |
119 @property |
134 @property |
120 def cursor_visible(self): |
135 def cursor_visible(self): |
121 return self._cursor_visible |
136 return self._cursor_visible |
122 |
137 |
123 ## events ## |
138 # ------------------------------------------------------------------------- |
|
139 # Events |
124 |
140 |
125 def resize_event(self, ev): |
141 def resize_event(self, ev): |
126 self.resize(ev.w, ev.h) |
142 self.resize(ev.w, ev.h) |
127 |
143 |
128 def keypress_event(self, ev): |
144 def keypress_event(self, ev): |
147 self.log.debug('Not consumed: %s', ev) |
163 self.log.debug('Not consumed: %s', ev) |
148 |
164 |
149 def mousemove_event(self, ev): |
165 def mousemove_event(self, ev): |
150 self.log.debug('Not consumed: %s', ev) |
166 self.log.debug('Not consumed: %s', ev) |
151 |
167 |
152 ## timeouts ## |
168 # ------------------------------------------------------------------------- |
153 |
169 # Focus |
154 def add_timeout(self, delay, callback, *args): |
|
155 """Register `callback` to be called after `delay` seconds.""" |
|
156 self.parent.add_timeout(self, delay, callback, *args) |
|
157 |
|
158 def remove_timeout(self, callback, *args): |
|
159 """Unregister callback previously registered with add_timeout. |
|
160 |
|
161 Removes all timeouts with the `callback` and `args`. |
|
162 |
|
163 """ |
|
164 self.parent.remove_timeout(self, callback, *args) |
|
165 |
|
166 ## focus ## |
|
167 |
170 |
168 def can_focus(self): |
171 def can_focus(self): |
169 return not self.hidden and self.allow_focus |
172 return not self.hidden and self.allow_focus |
170 |
173 |
171 def has_focus(self): |
174 def has_focus(self): |
172 if self.parent is None: |
175 if self.parent is None: |
173 return True |
176 return True |
174 return (self.parent.has_focus() |
177 return (self.parent.has_focus() and |
175 and self.parent.focus_widget == self) |
178 self.parent.focus_widget == self) |
176 |
179 |
177 ## utilities ## |
180 # ------------------------------------------------------------------------- |
|
181 # Utilities |
178 |
182 |
179 @property |
183 @property |
180 def log(self): |
184 def log(self): |
181 """Logger for widget debugging. |
185 """Logger for widget debugging. |
182 |
186 |