tuikit/scrollbar.py
author Radek Brich <radek.brich@devl.cz>
Sat, 29 Dec 2012 12:16:06 +0100
changeset 41 37b7dfc3eae6
parent 40 5faa38c10b67
child 43 369c8ef5070a
permissions -rw-r--r--
Update Emitter: All event handlers now have exactly one argument: object inherited from Event class, which carries any data.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     1
# -*- coding: utf-8 -*-
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     2
18
e6c3a5ee91aa Eliminate relative imports.
Radek Brich <radek.brich@devl.cz>
parents: 9
diff changeset
     3
from tuikit.widget import Widget
41
37b7dfc3eae6 Update Emitter: All event handlers now have exactly one argument: object inherited from Event class, which carries any data.
Radek Brich <radek.brich@devl.cz>
parents: 40
diff changeset
     4
from tuikit.emitter import Event
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     5
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     6
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     7
class VScrollbar(Widget):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     8
    def __init__(self, height=10):
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
     9
        Widget.__init__(self, 1, height)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    10
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
    11
        self._max = height - 3
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
    12
        self._pos = 0
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
    13
        self._thumbpos = 0
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    14
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    15
        self.interval = 0.1
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    16
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    17
        self.dragging = False
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    18
        self.move = None
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    19
41
37b7dfc3eae6 Update Emitter: All event handlers now have exactly one argument: object inherited from Event class, which carries any data.
Radek Brich <radek.brich@devl.cz>
parents: 40
diff changeset
    20
        self.add_events('change', Event)
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    21
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
    22
    @property
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
    23
    def max(self):
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
    24
        """Maximum for 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
    25
        return self._max
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    26
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
    27
    @max.setter
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
    28
    def max(self, value):
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
    29
        self._max = value
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
    30
        self._update_thumbpos()
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
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
    32
    @property
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
    def pos(self):
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
    34
        """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
    35
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
    36
        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
    37
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
    38
        """
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
    39
        return self._pos
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    40
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
    41
    @pos.setter
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
    42
    def pos(self, value):
41
37b7dfc3eae6 Update Emitter: All event handlers now have exactly one argument: object inherited from Event class, which carries any data.
Radek Brich <radek.brich@devl.cz>
parents: 40
diff changeset
    43
        if self._pos != value:
37b7dfc3eae6 Update Emitter: All event handlers now have exactly one argument: object inherited from Event class, which carries any data.
Radek Brich <radek.brich@devl.cz>
parents: 40
diff changeset
    44
            self._pos = value
37b7dfc3eae6 Update Emitter: All event handlers now have exactly one argument: object inherited from Event class, which carries any data.
Radek Brich <radek.brich@devl.cz>
parents: 40
diff changeset
    45
            self._update_thumbpos()
37b7dfc3eae6 Update Emitter: All event handlers now have exactly one argument: object inherited from Event class, which carries any data.
Radek Brich <radek.brich@devl.cz>
parents: 40
diff changeset
    46
            self.emit('change')
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    47
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
    def _update_thumbpos(self):
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
        self._thumbpos = 0
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
        if self._max and self._pos <= self._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
            self._thumbpos = int(round(self._pos / self._max * (self.height - 3)))
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
        self.redraw()
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
    53
41
37b7dfc3eae6 Update Emitter: All event handlers now have exactly one argument: object inherited from Event class, which carries any data.
Radek Brich <radek.brich@devl.cz>
parents: 40
diff changeset
    54
    def _handle_draw(self, ev):
37b7dfc3eae6 Update Emitter: All event handlers now have exactly one argument: object inherited from Event class, which carries any data.
Radek Brich <radek.brich@devl.cz>
parents: 40
diff changeset
    55
        super()._handle_draw(ev)
37b7dfc3eae6 Update Emitter: All event handlers now have exactly one argument: object inherited from Event class, which carries any data.
Radek Brich <radek.brich@devl.cz>
parents: 40
diff changeset
    56
        ev.driver.putch(ev.x, ev.y, ev.driver.unigraph.UP_ARROW)
37b7dfc3eae6 Update Emitter: All event handlers now have exactly one argument: object inherited from Event class, which carries any data.
Radek Brich <radek.brich@devl.cz>
parents: 40
diff changeset
    57
        for i in range(ev.y + 1, ev.y + self.height - 1):
37b7dfc3eae6 Update Emitter: All event handlers now have exactly one argument: object inherited from Event class, which carries any data.
Radek Brich <radek.brich@devl.cz>
parents: 40
diff changeset
    58
            ev.driver.putch(ev.x, i, ev.driver.unigraph.LIGHT_SHADE)
37b7dfc3eae6 Update Emitter: All event handlers now have exactly one argument: object inherited from Event class, which carries any data.
Radek Brich <radek.brich@devl.cz>
parents: 40
diff changeset
    59
        ev.driver.putch(ev.x, ev.y + 1 + self._thumbpos, ev.driver.unigraph.BLOCK)
37b7dfc3eae6 Update Emitter: All event handlers now have exactly one argument: object inherited from Event class, which carries any data.
Radek Brich <radek.brich@devl.cz>
parents: 40
diff changeset
    60
        ev.driver.putch(ev.x, ev.y + self.height - 1, ev.driver.unigraph.DOWN_ARROW)
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    61
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
    62
    def _handle_mousedown(self, ev):
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
    63
        super()._handle_mousedown(ev)
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    64
        self.dragging = False
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    65
        self.move = None
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    66
        # arrow buttons
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    67
        if ev.wy == 0 or ev.wy == self.height - 1:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    68
            if ev.wy == 0:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    69
                self.move_up()
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    70
            else:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    71
                self.move_down()
34
e3beacd5e536 Update event propagation, keypress event, focusing.
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
    72
            self.top.add_timeout(self.interval * 2, self._timeout)
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    73
            return
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    74
        # thumb bar
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
    75
        if ev.wy == 1 + self._thumbpos:
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    76
            self.dragging = True
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    77
            return
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    78
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
    79
    def _handle_mouseup(self, ev):
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
    80
        super()._handle_mouseup(ev)
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    81
        if self.dragging:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    82
            self.drag(ev.wy)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    83
            self.dragging = False
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    84
            return
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    85
        if self.move:
34
e3beacd5e536 Update event propagation, keypress event, focusing.
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
    86
            self.top.remove_timeout(self._timeout)
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    87
            self.move = None
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    88
            return
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    89
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
    90
    def _handle_mousemove(self, ev):
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
    91
        super()._handle_mousemove(ev)
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    92
        if self.dragging:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    93
            self.drag(ev.wy)
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    94
34
e3beacd5e536 Update event propagation, keypress event, focusing.
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
    95
    def _timeout(self):
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    96
        if self.move == 'up':
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    97
            self.move_up()
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    98
        if self.move == 'down':
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
    99
            self.move_down()
34
e3beacd5e536 Update event propagation, keypress event, focusing.
Radek Brich <radek.brich@devl.cz>
parents: 32
diff changeset
   100
        self.top.add_timeout(self.interval, self._timeout)
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   101
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   102
    def move_up(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
   103
        if self._pos > 0:
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
   104
            self.pos = self._pos - 1
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   105
        self.move = 'up'
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   106
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   107
    def move_down(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
   108
        if self._pos < self._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
   109
            self.pos = self._pos + 1
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   110
        self.move = 'down'
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   111
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   112
    def drag(self, wy):
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
   113
        newpos = int(round((wy - 1) / (self.height - 3) * self._max))
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   114
        if newpos < 0:
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   115
            newpos = 0
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
   116
        if newpos > self._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
   117
            newpos = self._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
   118
        if self._pos != newpos:
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
   119
            self.pos = newpos
0
Radek Brich <radek.brich@devl.cz>
parents:
diff changeset
   120