~glitter-team/glitter/trunk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# !/usr/bin/python
# -*- coding: utf-8 -*-

# Glitter Toolkit

__authors__ = ["Jan Jokela <janjokela@gmail.com>"]
__licenses__ = ["LICENSE.LGPL"]
__description__ = "Slider widget"

import gobject

from widget import *
from container import Container
from image import Image

class Slider(Container):
    """ 
    A slider widget offers a moveable handler for moving bewteen a range of 
    values.
    
    """
    
    __gsignals__ = {
        'value-changed': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_BOOLEAN, 
                         (gobject.TYPE_FLOAT,))
    }    
    
    def __init__(self, value=0.5):
        """ Initialize slider widget """
        
        super(Slider, self).__init__()
        
        self._value = value
        
        self.stage = None
        
        self._init_elements()
        
        self._update_style(self.style)
        
    def _init_elements(self):
        """ Initializes graphical elements """
        
        self._background_image = Image()
        self.add(self._background_image)
        
        self._range_image = Image()
        self.add(self._range_image)
        
        self._handle_image = Image()
        self.add(self._handle_image)
        self._handle_image.size_ratio = 1.0
        
    def _update_style(self, props=None):
        """ Updates style """
        
        super(Slider, self)._update_style(props)
        
        for key, value in props:
            if key == 'background-image':
                self.background_image = value
                self._background_image.set_source(self.background_image)
                self._background_image._update_layout()
            elif key == 'range-image':
                self.range_image = value
                self._range_image.set_source(self.range_image)
                self._range_image._update_layout()
            elif key == 'handle-image':
                self.handle_image = value
                self._handle_image.set_source(self.handle_image)
                self._handle_image._update_layout()
            elif key == 'background-height':
                self._background_image.natural_height = value
            elif key == 'background-y':
                self._background_image.natural_y = value
            elif key == 'range-height':
                self._range_image.natural_height = value
            elif key == 'range-y':
                self._range_image.natural_y = value
            elif key == 'handle-height':
                self._handle_image.natural_height = value
            elif key == 'handle-y':
                self._handle_image.natural_y = value
                        
    def _update_layout(self):
        """ Updates layout """
        
        super(Slider, self)._update_layout()
        
        if not self.stage:
            self.stage = self.get_stage()
            self.set_reactive(True)
            self.stage.connect('motion-event', self.on_motion_event) 
            self.connect('leave-event', self.on_leave_event) 
            self.connect('button-press-event', self.on_press_event) 
            self.stage.connect('button-release-event', self.on_release_event)
        
        if self.get_width() > 0:
            tmp_value = self.value - (float(self._handle_image.get_width() / 2.0) / float(self.get_width()))
        else:
            tmp_value = 0
        
        self._range_image.set_natural_width(self.value)
        self._handle_image.set_natural_x(tmp_value)
        
        self._background_image._update_layout()
        self._range_image._update_layout()
        self._handle_image._update_layout()  
    
    def get_value(self):
        """ Retrieve range value """
        
        return self._value
        
    def set_value(self, value):
        """ Sets value
        
        value -- (float) Slider range value 0.0~1.0
        """
        
        self._value = value
        self.emit("value-changed", value)
        self._update_layout()
        
    value = property(get_value, set_value)
        
    def on_motion_event(self, widget, event):
        """ Cursor motion over widget """
        
        if self.state is STATE_SELECTED:
            x_px_from_anchor = event.x - self.get_transformed_position()[0]
            pos_as_factor = float(x_px_from_anchor) / float(self.get_width())
            if pos_as_factor > 0 and pos_as_factor < 100:
                self.value = pos_as_factor
            elif pos_as_factor <= 0:
                self.value = 0.0
            else:
                self.value = 1.0   
        
    def on_leave_event(self, widget, event):
        """ Cursor left from widget """
        
        pass
        
    def on_press_event(self, widget, event):
        """ Cursor press on widget area """
        
        self.state = STATE_SELECTED
        
    def on_release_event(self, widget, event):
        """ Cursos release on widget area """
        
        self.state = STATE_HIGHLIGHT