tuikit/widgets/scrollbar.py
author Radek Brich <radek.brich@devl.cz>
Sun, 22 Feb 2015 09:53:13 +0100
changeset 119 dd91747504dd
parent 118 8c7970520632
permissions -rw-r--r--
Redraw widgets on request. Add scrollbar demo.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
118
8c7970520632 Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents: 76
diff changeset
     1
from tuikit.core.widget import Widget
8c7970520632 Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents: 76
diff changeset
     2
from tuikit.core.signal import Signal
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     3
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     4
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
     5
class Scrollbar(Widget):
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     6
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
     7
    """Abstract base class for scrollbars."""
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
     8
119
dd91747504dd Redraw widgets on request. Add scrollbar demo.
Radek Brich <radek.brich@devl.cz>
parents: 118
diff changeset
     9
    def __init__(self, scroll_max):
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    10
        Widget.__init__(self)
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    11
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    12
        # Scrolling range is 0 .. _scroll_max
119
dd91747504dd Redraw widgets on request. Add scrollbar demo.
Radek Brich <radek.brich@devl.cz>
parents: 118
diff changeset
    13
        self._scroll_max = scroll_max
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    14
        # Current position of scrollbar in scrolling range.
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    15
        self._scroll_pos = 0
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    16
        # Current position of thumb on scrollbar - used for draw.
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    17
        self._thumb_pos = 0
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    18
        # Auxilliary variable, True when user holds mouse on thumb.
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    19
        self._dragging = False
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    20
        # Auxilliary variable, 'up' or 'down' depending on last move direction.
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    21
        self._move = None
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    22
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    23
        #: delay before continuous scrolling when user holds mouse on scrollbar arrow
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    24
        self.scroll_delay = 0.150
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    25
        #: interval for continuous scrolling
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    26
        self.scroll_interval = 0.030
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    27
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    28
        # change event is emitted when user moves scrollbar (even programmatically)
118
8c7970520632 Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents: 76
diff changeset
    29
        self.sig_changed = Signal()
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    30
40
5faa38c10b67 Add ScrollView widget. Update Emitter, rename "on_event" methods to "_handle_event". Update VScrollbar, Layout.
Radek Brich <radek.brich@devl.cz>
parents: 34
diff changeset
    31
    @property
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    32
    def scroll_max(self):
40
5faa38c10b67 Add ScrollView widget. Update Emitter, rename "on_event" methods to "_handle_event". Update VScrollbar, Layout.
Radek Brich <radek.brich@devl.cz>
parents: 34
diff changeset
    33
        """Maximum for scrolling position."""
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    34
        return self._scroll_max
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    35
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    36
    @scroll_max.setter
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    37
    def scroll_max(self, value):
76
fa5301e58eca Update demo_input, demo_editor. Update ScrollView: show/hide scrollbars as needed on child size requests.
Radek Brich <radek.brich@devl.cz>
parents: 75
diff changeset
    38
        if value < 0:
fa5301e58eca Update demo_input, demo_editor. Update ScrollView: show/hide scrollbars as needed on child size requests.
Radek Brich <radek.brich@devl.cz>
parents: 75
diff changeset
    39
            value = 0
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    40
        self._scroll_max = value
75
2430c643838a Clean up hints - add methods update_hint, hint_value to Widget. Split ScrollView into OffsetView and Scrolling components. Reimplement ScrollWindow using Scrolling component.
Radek Brich <radek.brich@devl.cz>
parents: 63
diff changeset
    41
        if self._scroll_pos > value:
2430c643838a Clean up hints - add methods update_hint, hint_value to Widget. Split ScrollView into OffsetView and Scrolling components. Reimplement ScrollWindow using Scrolling component.
Radek Brich <radek.brich@devl.cz>
parents: 63
diff changeset
    42
            self._scroll_pos = value
118
8c7970520632 Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents: 76
diff changeset
    43
            self.sig_changed()
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    44
        self._update_thumb_pos()
40
5faa38c10b67 Add ScrollView widget. Update Emitter, rename "on_event" methods to "_handle_event". Update VScrollbar, Layout.
Radek Brich <radek.brich@devl.cz>
parents: 34
diff changeset
    45
5faa38c10b67 Add ScrollView widget. Update Emitter, rename "on_event" methods to "_handle_event". Update VScrollbar, Layout.
Radek Brich <radek.brich@devl.cz>
parents: 34
diff changeset
    46
    @property
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    47
    def scroll_pos(self):
40
5faa38c10b67 Add ScrollView widget. Update Emitter, rename "on_event" methods to "_handle_event". Update VScrollbar, Layout.
Radek Brich <radek.brich@devl.cz>
parents: 34
diff changeset
    48
        """Scrolling position.
5faa38c10b67 Add ScrollView widget. Update Emitter, rename "on_event" methods to "_handle_event". Update VScrollbar, Layout.
Radek Brich <radek.brich@devl.cz>
parents: 34
diff changeset
    49
5faa38c10b67 Add ScrollView widget. Update Emitter, rename "on_event" methods to "_handle_event". Update VScrollbar, Layout.
Radek Brich <radek.brich@devl.cz>
parents: 34
diff changeset
    50
        Integer number between 0 and 'max'.
5faa38c10b67 Add ScrollView widget. Update Emitter, rename "on_event" methods to "_handle_event". Update VScrollbar, Layout.
Radek Brich <radek.brich@devl.cz>
parents: 34
diff changeset
    51
5faa38c10b67 Add ScrollView widget. Update Emitter, rename "on_event" methods to "_handle_event". Update VScrollbar, Layout.
Radek Brich <radek.brich@devl.cz>
parents: 34
diff changeset
    52
        """
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    53
        return self._scroll_pos
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    54
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    55
    @scroll_pos.setter
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    56
    def scroll_pos(self, value):
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    57
        if self._scroll_pos != value:
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    58
            self._scroll_pos = value
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    59
            self._update_thumb_pos()
118
8c7970520632 Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents: 76
diff changeset
    60
            self.sig_changed()
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    61
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    62
    def move_up(self):
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    63
        """Move scrolling position up/left."""
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    64
        if self._scroll_pos > 0:
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    65
            self.scroll_pos = self._scroll_pos - 1
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    66
        self._move = 'up'
119
dd91747504dd Redraw widgets on request. Add scrollbar demo.
Radek Brich <radek.brich@devl.cz>
parents: 118
diff changeset
    67
        self.redraw()
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    68
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    69
    def move_down(self):
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    70
        """Move scrolling position down/right."""
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    71
        if self._scroll_pos < self._scroll_max:
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    72
            self.scroll_pos = self._scroll_pos + 1
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    73
        self._move = 'down'
119
dd91747504dd Redraw widgets on request. Add scrollbar demo.
Radek Brich <radek.brich@devl.cz>
parents: 118
diff changeset
    74
        self.redraw()
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    75
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    76
    def drag(self, mouse_pos):
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    77
        """Scroll using mouse drag on thumb.
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    78
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    79
        Args:
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    80
            mouse_pos: new position of mouse, in range 0 .. self._get_length()
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    81
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    82
        """
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    83
        new_pos = int(round((mouse_pos - 1) / (self._get_length() - 3) * self._scroll_max))
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    84
        if new_pos < 0:
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    85
            new_pos = 0
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    86
        if new_pos > self._scroll_max:
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    87
            new_pos = self._scroll_max
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    88
        if self._scroll_pos != new_pos:
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    89
            self.scroll_pos = new_pos
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    90
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    91
    def _get_length(self):
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    92
        """Return length of scrollbar.
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    93
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    94
        This will be widget height for vertical scrollbar,
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    95
        width for horizontal scrollbar.
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    96
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    97
        """
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    98
        raise NotImplementedError()
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
    99
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   100
    def _update_thumb_pos(self):
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   101
        """Update value of internal variable _thumb_pos."""
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   102
        self._thumb_pos = 0
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   103
        if self._scroll_max and self._scroll_pos <= self._scroll_max:
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   104
            self._thumb_pos = int(round(self._scroll_pos / self._scroll_max * (self._get_length() - 3)))
118
8c7970520632 Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents: 76
diff changeset
   105
        #self.redraw()
40
5faa38c10b67 Add ScrollView widget. Update Emitter, rename "on_event" methods to "_handle_event". Update VScrollbar, Layout.
Radek Brich <radek.brich@devl.cz>
parents: 34
diff changeset
   106
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   107
    def _continuous_scroll(self):
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   108
        if self._move == 'up':
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   109
            self.move_up()
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   110
        if self._move == 'down':
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   111
            self.move_down()
119
dd91747504dd Redraw widgets on request. Add scrollbar demo.
Radek Brich <radek.brich@devl.cz>
parents: 118
diff changeset
   112
        self.timer.add_timeout(self.scroll_interval, self._continuous_scroll)
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   113
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   114
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   115
class VScrollbar(Scrollbar):
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   116
    def __init__(self):
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   117
        Scrollbar.__init__(self)
118
8c7970520632 Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents: 76
diff changeset
   118
        self.sizereq.update(1, 20)
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   119
118
8c7970520632 Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents: 76
diff changeset
   120
    def draw(self, buffer):
8c7970520632 Add mouse events, event demo.
Radek Brich <radek.brich@devl.cz>
parents: 76
diff changeset
   121
        Widget.draw(self, buffer)
63
2a0e04091898 Rework MenuBar. Add MenuButton. Add mouse event cascading to floaters.
Radek Brich <radek.brich@devl.cz>
parents: 62
diff changeset
   122
        ug = ev.driver.unigraph
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   123
        ev.driver.pushcolor('normal')
63
2a0e04091898 Rework MenuBar. Add MenuButton. Add mouse event cascading to floaters.
Radek Brich <radek.brich@devl.cz>
parents: 62
diff changeset
   124
        ev.driver.putch(ev.x, ev.y, ug.get_char('sb_up'))
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   125
        for i in range(1, self.height - 1):
63
2a0e04091898 Rework MenuBar. Add MenuButton. Add mouse event cascading to floaters.
Radek Brich <radek.brich@devl.cz>
parents: 62
diff changeset
   126
            ev.driver.putch(ev.x, ev.y + i, ug.get_char('sb_vtrack'))
2a0e04091898 Rework MenuBar. Add MenuButton. Add mouse event cascading to floaters.
Radek Brich <radek.brich@devl.cz>
parents: 62
diff changeset
   127
        ev.driver.putch(ev.x, ev.y + 1 + self._thumb_pos, ug.get_char('sb_thumb'))
2a0e04091898 Rework MenuBar. Add MenuButton. Add mouse event cascading to floaters.
Radek Brich <radek.brich@devl.cz>
parents: 62
diff changeset
   128
        ev.driver.putch(ev.x, ev.y + self.height - 1, ug.get_char('sb_down'))
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   129
        ev.driver.popcolor()
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   130
45
43b2279b06e1 Clean up Emitter class, simplify event handling. Fix Container.focusnext() method. Add events test (handler auto-registration, order).
Radek Brich <radek.brich@devl.cz>
parents: 43
diff changeset
   131
    def on_mousedown(self, ev):
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   132
        self._dragging = False
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   133
        self._move = None
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   134
        # arrow buttons
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   135
        if ev.wy == 0 or ev.wy == self.height - 1:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   136
            if ev.wy == 0:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   137
                self.move_up()
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   138
            else:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   139
                self.move_down()
119
dd91747504dd Redraw widgets on request. Add scrollbar demo.
Radek Brich <radek.brich@devl.cz>
parents: 118
diff changeset
   140
            self.timer.add_timeout(self.scroll_delay, self._continuous_scroll)
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   141
            return
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   142
        # thumb bar
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   143
        if ev.wy == 1 + self._thumb_pos:
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   144
            self._dragging = True
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   145
            return
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   146
45
43b2279b06e1 Clean up Emitter class, simplify event handling. Fix Container.focusnext() method. Add events test (handler auto-registration, order).
Radek Brich <radek.brich@devl.cz>
parents: 43
diff changeset
   147
    def on_mousemove(self, ev):
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   148
        if self._dragging:
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   149
            self.drag(ev.wy)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   150
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   151
    def on_mouseup(self, ev):
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   152
        if self._dragging:
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   153
            self.drag(ev.wy)
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   154
            self._dragging = False
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   155
            return
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   156
        if self._move:
119
dd91747504dd Redraw widgets on request. Add scrollbar demo.
Radek Brich <radek.brich@devl.cz>
parents: 118
diff changeset
   157
            self.timer.remove_timeout(self._continuous_scroll)
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   158
            self._move = None
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   159
            return
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   160
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   161
    def _get_length(self):
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   162
        return self.height
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   163
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   164
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   165
class HScrollbar(Scrollbar):
119
dd91747504dd Redraw widgets on request. Add scrollbar demo.
Radek Brich <radek.brich@devl.cz>
parents: 118
diff changeset
   166
    def __init__(self, length=20):
dd91747504dd Redraw widgets on request. Add scrollbar demo.
Radek Brich <radek.brich@devl.cz>
parents: 118
diff changeset
   167
        Scrollbar.__init__(self, length - 3)
dd91747504dd Redraw widgets on request. Add scrollbar demo.
Radek Brich <radek.brich@devl.cz>
parents: 118
diff changeset
   168
        self.sizereq.update(length, 1)
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   169
119
dd91747504dd Redraw widgets on request. Add scrollbar demo.
Radek Brich <radek.brich@devl.cz>
parents: 118
diff changeset
   170
    def draw(self, buffer):
dd91747504dd Redraw widgets on request. Add scrollbar demo.
Radek Brich <radek.brich@devl.cz>
parents: 118
diff changeset
   171
        Widget.draw(self, buffer)
dd91747504dd Redraw widgets on request. Add scrollbar demo.
Radek Brich <radek.brich@devl.cz>
parents: 118
diff changeset
   172
        with buffer.attr(self.theme.clr_normal):
dd91747504dd Redraw widgets on request. Add scrollbar demo.
Radek Brich <radek.brich@devl.cz>
parents: 118
diff changeset
   173
            buffer.putch(self.theme.sb_left)
dd91747504dd Redraw widgets on request. Add scrollbar demo.
Radek Brich <radek.brich@devl.cz>
parents: 118
diff changeset
   174
            for i in range(1, self.width - 1):
dd91747504dd Redraw widgets on request. Add scrollbar demo.
Radek Brich <radek.brich@devl.cz>
parents: 118
diff changeset
   175
                buffer.putch(self.theme.sb_htrack, i)
dd91747504dd Redraw widgets on request. Add scrollbar demo.
Radek Brich <radek.brich@devl.cz>
parents: 118
diff changeset
   176
            buffer.putch(self.theme.sb_thumb, 1 + self._thumb_pos)
dd91747504dd Redraw widgets on request. Add scrollbar demo.
Radek Brich <radek.brich@devl.cz>
parents: 118
diff changeset
   177
            buffer.putch(self.theme.sb_right, self.width - 1)
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   178
119
dd91747504dd Redraw widgets on request. Add scrollbar demo.
Radek Brich <radek.brich@devl.cz>
parents: 118
diff changeset
   179
    def mousedown_event(self, ev):
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   180
        self._dragging = False
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   181
        self._move = None
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   182
        # arrow buttons
119
dd91747504dd Redraw widgets on request. Add scrollbar demo.
Radek Brich <radek.brich@devl.cz>
parents: 118
diff changeset
   183
        if ev.pos.x == 0 or ev.pos.x == self.width - 1:
dd91747504dd Redraw widgets on request. Add scrollbar demo.
Radek Brich <radek.brich@devl.cz>
parents: 118
diff changeset
   184
            if ev.pos.x == 0:
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   185
                self.move_up()
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   186
            else:
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   187
                self.move_down()
119
dd91747504dd Redraw widgets on request. Add scrollbar demo.
Radek Brich <radek.brich@devl.cz>
parents: 118
diff changeset
   188
            self.timer.add_timeout(self.scroll_delay, self._continuous_scroll)
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   189
            return
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   190
        # thumb bar
119
dd91747504dd Redraw widgets on request. Add scrollbar demo.
Radek Brich <radek.brich@devl.cz>
parents: 118
diff changeset
   191
        if ev.pos.x == 1 + self._thumb_pos:
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   192
            self._dragging = True
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   193
            return
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   194
119
dd91747504dd Redraw widgets on request. Add scrollbar demo.
Radek Brich <radek.brich@devl.cz>
parents: 118
diff changeset
   195
    def mousemove_event(self, ev):
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   196
        if self._dragging:
119
dd91747504dd Redraw widgets on request. Add scrollbar demo.
Radek Brich <radek.brich@devl.cz>
parents: 118
diff changeset
   197
            self.drag(ev.pos.x)
59
729fcdfe6b57 Cleanup timeouts.
Radek Brich <radek.brich@devl.cz>
parents: 45
diff changeset
   198
119
dd91747504dd Redraw widgets on request. Add scrollbar demo.
Radek Brich <radek.brich@devl.cz>
parents: 118
diff changeset
   199
    def mouseup_event(self, ev):
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   200
        if self._dragging:
119
dd91747504dd Redraw widgets on request. Add scrollbar demo.
Radek Brich <radek.brich@devl.cz>
parents: 118
diff changeset
   201
            self.drag(ev.pos.x)
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   202
            self._dragging = False
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   203
            return
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   204
        if self._move:
119
dd91747504dd Redraw widgets on request. Add scrollbar demo.
Radek Brich <radek.brich@devl.cz>
parents: 118
diff changeset
   205
            self.timer.remove_timeout(self._continuous_scroll)
62
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   206
            self._move = None
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   207
            return
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   208
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   209
    def _get_length(self):
2f61931520c9 Rework layouts: Layout is now normal Container which places its children upon resize event.
Radek Brich <radek.brich@devl.cz>
parents: 59
diff changeset
   210
        return self.width