diff --git a/kivy/data/glsl/default.png b/kivy/data/glsl/default.png index 12ed7e372..a14255e4d 100644 Binary files a/kivy/data/glsl/default.png and b/kivy/data/glsl/default.png differ diff --git a/kivy/data/style.kv b/kivy/data/style.kv index 32bb95ec0..e2d331808 100644 --- a/kivy/data/style.kv +++ b/kivy/data/style.kv @@ -17,6 +17,7 @@ size: self.texture_size pos: root.center[0] - self.texture_size[0] / 2., root.center[1] - self.texture_size[1] / 2. + : canvas: Color: @@ -28,11 +29,5 @@ Color: rgb: (.7, .2, .5) Rectangle: - pos: self.handle_pos + pos: self.value_pos size: (20,self.height) - - - - - - diff --git a/kivy/uix/slider.py b/kivy/uix/slider.py index 19dd26548..32a1d179f 100644 --- a/kivy/uix/slider.py +++ b/kivy/uix/slider.py @@ -4,13 +4,9 @@ Slider: ''' __all__ = ('Slider', ) - from kivy.uix.widget import Widget from kivy.c_ext.properties import NumericProperty, AliasProperty - - - class Slider(Widget): def __init__(self, **kwargs): super(Slider, self).__init__(**kwargs) @@ -24,9 +20,45 @@ class Slider(Widget): #: Maximum value of the slider (used for rendering) max = NumericProperty(100) - def _handle_pos(self): - 'x,y position of the slider handle' - offset = (self.value - self.min) / (self.width/(self.max-self.min)) - return [self.x+offset, self.x, self.y] - handle_pos = AliasProperty(_handle_pos, None) + #: Range of the slider. same as (self.min, self.max) + def get_range(self): + return (self.min, self.max) + def set_range(self, range): + self.min, self.max = range + range = AliasProperty(get_range, set_range, bind=(min, max)) + + #: The value of the slide normalized to the range [min - max] + def get_norm_value(self): + return (self.value - self.min) / float(self.max-self.min) + def set_norm_value(self, n_val): + self.value = n_val*(self.max-self.min) + self.min + value_normalized = AliasProperty(get_norm_value, set_norm_value, bind=(value, min, max)) + + #: The value of the slider mapped to the screen position between self.x and self.right + def get_value_pos(self): + return (self.x + self.value_normalized*self.width, self.y) + def set_value_pos(self, pos): + self.value_normalized = (pos[0] - self.x) / float(self.width) + value_pos = AliasProperty(get_value_pos, set_value_pos, bind=(value, min, max, value_normalized)) + + + #: on touch_down handler. if inside slider: grab touch, set value based on touch pos + def on_touch_down(self, touch): + if self.collide_point(*touch.pos): + touch.grab(self) + self.value_pos = touch.pos + return True + + #: on_touch_move handler. set value based on where the touch occured + def on_touch_move(self, touch): + if touch.grab_current == self: + self.value_pos = touch.pos + return True + + #: on_touch_up handler. set value based on touch pos, and ungrab touch + def on_touch_up(self, touch): + if touch.grab_current == self: + self.value_pos = touch.pos + return True +