tuikit/core/widget.py
changeset 119 dd91747504dd
parent 118 8c7970520632
equal deleted inserted replaced
118:8c7970520632 119:dd91747504dd
    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