tuikit/core/container.py
changeset 113 6796adfdc7eb
parent 112 ce2e67e7bbb8
parent 108 11dac45bfba4
child 114 26c02bd94bd9
equal deleted inserted replaced
112:ce2e67e7bbb8 113:6796adfdc7eb
     1 from tuikit.core.widget import Widget
     1 from tuikit.core.widget import Widget
     2 from tuikit.core.coords import Point
     2 from tuikit.core.coords import Point, Rect
     3 from tuikit.layouts.fixed import FixedLayout
     3 from tuikit.layouts.fixed import FixedLayout
     4 
     4 
     5 
     5 
     6 class Container(Widget):
     6 class Container(Widget):
     7 
     7 
    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.