My favorites | Sign in
Project Logo
                
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
from __future__ import with_statement
from pymt import *
from pyglet.gl import *
from math import degrees,sqrt,acos,pi,cos,sin,radians

def drawSemiCircle(pos=(0,0), inner_radius=100,outer_radius=100,slices=32,loops=1,start_angle=0,sweep_angle=0):
gluPartialDisk(gluNewQuadric(), inner_radius, outer_radius, slices, loops, start_angle,sweep_angle )

class MTCircularSlider(MTWidget):
def __init__(self, **kwargs):
kwargs.setdefault('min', 0)
kwargs.setdefault('max', 100)
kwargs.setdefault('radius', 200)
kwargs.setdefault('thickness', 40)
kwargs.setdefault('padding', 3)
kwargs.setdefault('sweep_angle', 90)
super(MTCircularSlider, self).__init__(**kwargs)
self.radius = kwargs.get('radius')
self.last_touch = (0, 0)
self.angle = 0.0
self.rotation = kwargs.get('rotation')
self.radius_line = (int(self.radius*sin(radians(self.rotation))),int(self.radius*cos(radians(self.rotation))))
self.thickness = kwargs.get('thickness')
self.padding = kwargs.get('padding')
self.sweep_angle = kwargs.get('sweep_angle')
self.slider_fill_angle = 0.0
self.slider_color = kwargs.get('slider_color')
self.register_event_type('on_value_change')
self.min = kwargs.get('min')
self.max = kwargs.get('max')
self._value = self.min
if kwargs.get('value'):
self._value = kwargs.get('value')
self.touchstarts = []


def collide_point(self, x, y):
#A algorithm to find the whether a touch is within a semi ring
point_dist = Vector(self.pos).distance((x, y))
point_angle = Vector(self.radius_line).angle((x - self.pos[0], y - self.pos[1]))
if point_angle < 0:
point_angle=360+point_angle
if point_angle <= self.sweep_angle and point_angle >=0:
return point_dist<= self.radius and point_dist > self.radius-self.thickness

def on_value_change(self, value):
pass

def on_touch_down(self, touch):
if self.collide_point(touch.x, touch.y):
self.touchstarts.append(touch.id)
self.last_touch = (touch.x - self.pos[0], touch.y - self.pos[1])
self._value = (self.slider_fill_angle) * (self.max - self.min) / self.sweep_angle + self.min
self.calculate_angle()
return True

def on_touch_up(self, touch):
if touch.id in self.touchstarts:
self.touchstarts.remove(touch.id)

def on_touch_move(self, touch):
if self.collide_point(touch.x, touch.y) and touch.id in self.touchstarts:
self.last_touch = (touch.x - self.pos[0], touch.y - self.pos[1])
self._value = (self.slider_fill_angle) * (self.max - self.min) / self.sweep_angle + self.min
self.calculate_angle()
return True

def calculate_angle(self):
self.angle = Vector(self.radius_line).angle(self.last_touch)
if self.angle<0:
self.slider_fill_angle = self.angle+360
else:
self.slider_fill_angle = self.angle
self.dispatch_event('on_value_change', self._value)

def on_draw(self):
with gx_matrix_identity:
set_color(*self.style.get('bg-color'))
glTranslated(self.pos[0], self.pos[1], 0)
glRotatef(-self.rotation, 0, 0, 1)
drawSemiCircle((0,0),self.radius-self.thickness,self.radius,32,1,0,self.sweep_angle)
set_color(*self.slider_color)
drawSemiCircle((0,0),self.radius-self.thickness+self.padding,self.radius-self.padding,32,1,0,self.slider_fill_angle)

def set_initial_value(self,value):
self.slider_fill_angle = float(value)/float(100)*self.sweep_angle
self._value = float(value)/float(100)*self.max




if __name__ == '__main__':
w = MTWindow()
cm = MTCircularScroller(pos=(w.width/2-200,w.height/2),radius=300,thickness=100,padding=5,sweep_angle=130,slider_color=(1,0,0,0.5),rotation=-60,min=0,max=1)
w.add_widget(cm)

"""cm2 = MTCircularScroller(pos=(w.width/2-100,w.height/2-100),radius=150,thickness=70,padding=5,sweep_angle=135,slider_color=(1,1,0,0.5),rotation=55)
w.add_widget(cm2)

cm3 = MTCircularScroller(pos=(300,200),radius=150,thickness=70,padding=5,sweep_angle=135,slider_color=(0,1,0,0.5),rotation=-55)
w.add_widget(cm3)

cm4 = MTCircularScroller(pos=(300,600),radius=200,thickness=70,padding=5,sweep_angle=360,slider_color=(0,0,1,0.5),rotation=0)
w.add_widget(cm4)"""

runTouchApp()


Show details Hide details

Change log

r48 by sharath.patali on Jul 20, 2009   Diff
Core: Modified all code comply with new
PyMT's Unified Event Model
Go to: 
Project members, sign in to write a code review

Older revisions

r35 by sharath.patali on Jun 21, 2009   Diff
Color Selector: Saturation and Value
changer slider added now the selected
color can be varied from
black=>color=>white
r34 by sharath.patali on Jun 20, 2009   Diff
Color Selector: Added a slider, which
will eventually vary saturation and
balance of the selected color
r33 by sharath.patali on Jun 20, 2009   Diff
Circular Slider: Semi Ring Shaped
touch collision detection algorithm
All revisions of this file

File info

Size: 4694 bytes, 108 lines
Hosted by Google Code