~glitter-team/glitter/trunk

1 by Jan Jokela
Hi, Glitter here
1
# !/usr/bin/python
2
# -*- coding: utf-8 -*-
3
4
# Glitter Toolkit
5
6
__authors__ = ["Jan Jokela <janjokela@gmail.com>"]
7
__licenses__ = ["LICENSE.LGPL"]
8
__description__ = "Slider widget"
9
10
import gobject
11
12
from widget import *
13
from container import Container
14
from image import Image
15
16
class Slider(Container):
17
    """ 
18
    A slider widget offers a moveable handler for moving bewteen a range of 
19
    values.
20
    
21
    """
22
    
23
    __gsignals__ = {
24
        'value-changed': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, 
25
                         (gobject.TYPE_FLOAT,))
26
    }    
27
    
28
    def __init__(self, value=0.5):
29
        """ Initialize slider widget """
30
        
31
        super(Slider, self).__init__()
32
        
33
        self._value = value
34
        
35
        self.stage = None
36
        
37
        self._init_elements()
38
        
39
        self._update_style(self.style)
40
        
41
    def _init_elements(self):
42
        """ Initializes graphical elements """
43
        
44
        self._background_image = Image()
45
        self.add(self._background_image)
46
        
47
        self._range_image = Image()
48
        self.add(self._range_image)
49
        
50
        self._handle_image = Image()
51
        self.add(self._handle_image)
52
        self._handle_image.size_ratio = 1.0
53
        
54
    def _update_style(self, props=None):
55
        """ Updates style """
56
        
57
        super(Slider, self)._update_style(props)
58
        
59
        for key, value in props:
60
            if key == 'background-image':
61
                self.background_image = value
62
                self._background_image.set_source(self.background_image)
63
                self._background_image._update_layout()
64
            elif key == 'range-image':
65
                self.range_image = value
66
                self._range_image.set_source(self.range_image)
67
                self._range_image._update_layout()
68
            elif key == 'handle-image':
69
                self.handle_image = value
70
                self._handle_image.set_source(self.handle_image)
71
                self._handle_image._update_layout()
72
            elif key == 'background-height':
73
                self._background_image.natural_height = value
74
            elif key == 'background-y':
75
                self._background_image.natural_y = value
76
            elif key == 'range-height':
77
                self._range_image.natural_height = value
78
            elif key == 'range-y':
79
                self._range_image.natural_y = value
80
            elif key == 'handle-height':
81
                self._handle_image.natural_height = value
82
            elif key == 'handle-y':
83
                self._handle_image.natural_y = value
84
                        
85
    def _update_layout(self):
86
        """ Updates layout """
87
        
88
        super(Slider, self)._update_layout()
89
        
90
        if not self.stage:
91
            self.stage = self.get_stage()
92
            self.set_reactive(True)
93
            self.stage.connect('motion-event', self.on_motion_event) 
94
            self.connect('leave-event', self.on_leave_event) 
95
            self.connect('button-press-event', self.on_press_event) 
96
            self.stage.connect('button-release-event', self.on_release_event)
97
        
18.1.3 by Jan Jokela
(glitter/box.py) Algorithm improvements
98
        if self.get_width() > 0:
99
            tmp_value = self.value - (float(self._handle_image.get_width() / 2.0) / float(self.get_width()))
100
        else:
101
            tmp_value = 0
1 by Jan Jokela
Hi, Glitter here
102
        
103
        self._range_image.set_natural_width(self.value)
104
        self._handle_image.set_natural_x(tmp_value)
105
        
106
        self._background_image._update_layout()
107
        self._range_image._update_layout()
108
        self._handle_image._update_layout()  
109
    
110
    def get_value(self):
111
        """ Retrieve range value """
112
        
113
        return self._value
114
        
115
    def set_value(self, value):
116
        """ Sets value
117
        
118
        value -- (float) Slider range value 0.0~1.0
119
        """
120
        
121
        self._value = value
122
        self.emit("value-changed", value)
123
        self._update_layout()
124
        
125
    value = property(get_value, set_value)
126
        
127
    def on_motion_event(self, widget, event):
128
        """ Cursor motion over widget """
129
        
130
        if self.state is STATE_SELECTED:
131
            x_px_from_anchor = event.x - self.get_transformed_position()[0]
132
            pos_as_factor = float(x_px_from_anchor) / float(self.get_width())
133
            if pos_as_factor > 0 and pos_as_factor < 100:
134
                self.value = pos_as_factor
135
            elif pos_as_factor <= 0:
136
                self.value = 0.0
137
            else:
138
                self.value = 1.0   
139
        
140
    def on_leave_event(self, widget, event):
141
        """ Cursor left from widget """
142
        
143
        pass
144
        
145
    def on_press_event(self, widget, event):
146
        """ Cursor press on widget area """
147
        
148
        self.state = STATE_SELECTED
149
        
150
    def on_release_event(self, widget, event):
151
        """ Cursos release on widget area """
152
        
153
        self.state = STATE_HIGHLIGHT