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
|