tuikit/widgets/scrollbar.py
changeset 119 dd91747504dd
parent 118 8c7970520632
--- a/tuikit/widgets/scrollbar.py	Sat Feb 21 12:01:57 2015 +0100
+++ b/tuikit/widgets/scrollbar.py	Sun Feb 22 09:53:13 2015 +0100
@@ -1,5 +1,3 @@
-# -*- coding: utf-8 -*-
-
 from tuikit.core.widget import Widget
 from tuikit.core.signal import Signal
 
@@ -8,11 +6,11 @@
 
     """Abstract base class for scrollbars."""
 
-    def __init__(self):
+    def __init__(self, scroll_max):
         Widget.__init__(self)
 
         # Scrolling range is 0 .. _scroll_max
-        self._scroll_max = self._get_length() - 3
+        self._scroll_max = scroll_max
         # Current position of scrollbar in scrolling range.
         self._scroll_pos = 0
         # Current position of thumb on scrollbar - used for draw.
@@ -66,12 +64,14 @@
         if self._scroll_pos > 0:
             self.scroll_pos = self._scroll_pos - 1
         self._move = 'up'
+        self.redraw()
 
     def move_down(self):
         """Move scrolling position down/right."""
         if self._scroll_pos < self._scroll_max:
             self.scroll_pos = self._scroll_pos + 1
         self._move = 'down'
+        self.redraw()
 
     def drag(self, mouse_pos):
         """Scroll using mouse drag on thumb.
@@ -109,7 +109,7 @@
             self.move_up()
         if self._move == 'down':
             self.move_down()
-        self.add_timeout(self.scroll_interval, self._continuous_scroll)
+        self.timer.add_timeout(self.scroll_interval, self._continuous_scroll)
 
 
 class VScrollbar(Scrollbar):
@@ -137,7 +137,7 @@
                 self.move_up()
             else:
                 self.move_down()
-            self.add_timeout(self.scroll_delay, self._continuous_scroll)
+            self.timer.add_timeout(self.scroll_delay, self._continuous_scroll)
             return
         # thumb bar
         if ev.wy == 1 + self._thumb_pos:
@@ -154,7 +154,7 @@
             self._dragging = False
             return
         if self._move:
-            self.remove_timeout(self._continuous_scroll)
+            self.timer.remove_timeout(self._continuous_scroll)
             self._move = None
             return
 
@@ -163,50 +163,48 @@
 
 
 class HScrollbar(Scrollbar):
-    def __init__(self):
-        Scrollbar.__init__(self)
-        self.sizereq.update(20, 1)
+    def __init__(self, length=20):
+        Scrollbar.__init__(self, length - 3)
+        self.sizereq.update(length, 1)
 
-    def on_draw(self, ev):
-        ug = ev.driver.unigraph
-        ev.driver.pushcolor('normal')
-        ev.driver.putch(ev.x, ev.y, ug.get_char('sb_left'))
-        for i in range(1, self.width - 1):
-            ev.driver.putch(ev.x + i, ev.y, ug.get_char('sb_htrack'))
-        ev.driver.putch(ev.x + 1 + self._thumb_pos, ev.y, ug.get_char('sb_thumb'))
-        ev.driver.putch(ev.x + self.width - 1, ev.y, ug.get_char('sb_right'))
-        ev.driver.popcolor()
+    def draw(self, buffer):
+        Widget.draw(self, buffer)
+        with buffer.attr(self.theme.clr_normal):
+            buffer.putch(self.theme.sb_left)
+            for i in range(1, self.width - 1):
+                buffer.putch(self.theme.sb_htrack, i)
+            buffer.putch(self.theme.sb_thumb, 1 + self._thumb_pos)
+            buffer.putch(self.theme.sb_right, self.width - 1)
 
-    def on_mousedown(self, ev):
+    def mousedown_event(self, ev):
         self._dragging = False
         self._move = None
         # arrow buttons
-        if ev.wx == 0 or ev.wx == self.width - 1:
-            if ev.wx == 0:
+        if ev.pos.x == 0 or ev.pos.x == self.width - 1:
+            if ev.pos.x == 0:
                 self.move_up()
             else:
                 self.move_down()
-            self.add_timeout(self.scroll_delay, self._continuous_scroll)
+            self.timer.add_timeout(self.scroll_delay, self._continuous_scroll)
             return
         # thumb bar
-        if ev.wx == 1 + self._thumb_pos:
+        if ev.pos.x == 1 + self._thumb_pos:
             self._dragging = True
             return
 
-    def on_mousemove(self, ev):
+    def mousemove_event(self, ev):
         if self._dragging:
-            self.drag(ev.wx)
+            self.drag(ev.pos.x)
 
-    def on_mouseup(self, ev):
+    def mouseup_event(self, ev):
         if self._dragging:
-            self.drag(ev.wx)
+            self.drag(ev.pos.x)
             self._dragging = False
             return
         if self._move:
-            self.remove_timeout(self._continuous_scroll)
+            self.timer.remove_timeout(self._continuous_scroll)
             self._move = None
             return
 
     def _get_length(self):
         return self.width
-