tuikit/core/widget.py
changeset 119 dd91747504dd
parent 118 8c7970520632
--- a/tuikit/core/widget.py	Sat Feb 21 12:01:57 2015 +0100
+++ b/tuikit/core/widget.py	Sun Feb 22 09:53:13 2015 +0100
@@ -23,6 +23,8 @@
         self.window = None
         #: Theme
         self.theme = default_theme
+        #: Timer
+        self.timer = None
 
         #: Position inside parent widget. Modified by layout manager.
         self.pos = Point()
@@ -43,6 +45,8 @@
         #: Cursor is displayed on screen only when the widget is focused.
         self._cursor_visible = False
 
+        #: True if this widget requests redraw
+        self.need_draw = True
         #: Hidden widget does not affect layout.
         self.hidden = False
         #: Allow keyboard focus for this widget.
@@ -50,7 +54,8 @@
 
         self.sig_keypress = Signal(allow_stop=True)
 
-    ## position and size ##
+    # -------------------------------------------------------------------------
+    #   Position and size
 
     @property
     def x(self):
@@ -82,14 +87,24 @@
 
     @property
     def boundaries(self):
-        return Rect._make(self.pos, self._size)
+        return Rect(self.pos, self._size)
 
-    ## drawing, looks ##
+    # -------------------------------------------------------------------------
+    #   Presentation
+
+    def draw_if_needed(self, buffer):
+        if self.need_draw:
+            self.draw(buffer)
 
     def draw(self, buffer):
         """Draw self into buffer."""
         self.log.debug('Draw into %r at %s (exposed %s)',
                        buffer, buffer.origin, self.exposed(buffer))
+        self.need_draw = False
+
+    def redraw(self):
+        """Request redraw."""
+        self.need_draw = True
 
     def set_theme(self, theme):
         self.theme = theme
@@ -113,14 +128,15 @@
         Returns None if cursor is set outside of widget boundaries.
         
         """
-        if self._cursor in Rect._make((0, 0), self._size):
+        if self._cursor in Rect(0, 0, *self._size):
             return self._cursor
 
     @property
     def cursor_visible(self):
         return self._cursor_visible
 
-    ## events ##
+    # -------------------------------------------------------------------------
+    #   Events
 
     def resize_event(self, ev):
         self.resize(ev.w, ev.h)
@@ -149,21 +165,8 @@
     def mousemove_event(self, ev):
         self.log.debug('Not consumed: %s', ev)
 
-    ## timeouts ##
-
-    def add_timeout(self, delay, callback, *args):
-        """Register `callback` to be called after `delay` seconds."""
-        self.parent.add_timeout(self, delay, callback, *args)
-
-    def remove_timeout(self, callback, *args):
-        """Unregister callback previously registered with add_timeout.
-
-        Removes all timeouts with the `callback` and `args`.
-
-        """
-        self.parent.remove_timeout(self, callback, *args)
-
-    ## focus ##
+    # -------------------------------------------------------------------------
+    #   Focus
 
     def can_focus(self):
         return not self.hidden and self.allow_focus
@@ -171,10 +174,11 @@
     def has_focus(self):
         if self.parent is None:
             return True
-        return (self.parent.has_focus()
-            and self.parent.focus_widget == self)
+        return (self.parent.has_focus() and
+                self.parent.focus_widget == self)
 
-    ## utilities ##
+    # -------------------------------------------------------------------------
+    #   Utilities
 
     @property
     def log(self):