root / core / ui / circularmenu / circularmenu.py @ 42

View | Annotate | Download (5.2 KB)

1
from __future__ import with_statement
2
from pymt import *
3
from pyglet.gl import *
4
from math import cos,sin,radians,pi
5
from glob import glob
6
7
class MTCircularItem(MTButton):
8
    def __init__(self, **kwargs):
9
        kwargs.setdefault('scale', 1.0)
10
        kwargs.setdefault('filename', None)
11
        if kwargs.get('filename') is None:
12
            raise Exception('No filename given to Item')
13
        super(MTCircularItem, self).__init__(**kwargs)
14
        self.action_handler = kwargs.get('handler')
15
        self.action_value = kwargs.get('value')
16
        self.filename		= kwargs.get('filename')
17
        self.scale          = kwargs.get('scale')
18
        self.image.scale    = self.scale
19
        self.size           = (self.image.width, self.image.height)
20
        self.x = self.x-self.width/2
21
        self.y = self.y-self.height/2
22
        self.image.x        = self.x
23
        self.image.y        = self.y
24
        
25
    def collide_point(self, x, y):
26
        if( x > self.x-self.width/2  and x < self.x+self.width/2 and
27
           y > self.y-self.height/2 and y < self.y+self.height/2  ):
28
            return True
29
        
30
    def on_press(self, touchID, x, y):
31
        self.action_handler(sprite=self.action_value,size=25)
32
        
33
    def _get_filename(self):
34
        return self._filename
35
        
36
    def _set_filename(self, filename):
37
        self._filename = filename
38
        img            = pyglet.image.load(filename)
39
        self.image     = pyglet.sprite.Sprite(img)
40
    filename = property(_get_filename, _set_filename)
41
42
    def on_draw(self):
43
        self.image.x        = self.x-self.width/2
44
        self.image.y        = self.y-self.height/2
45
        self.image.scale    = self.scale
46
        self.size           = (self.image.width, self.image.height)
47
        self.image.draw()
48
49
class MTCircularMenu_Manager(MTWidget):
50
    def __init__(self, **kwargs):
51
        super(MTCircularMenu_Manager, self).__init__(**kwargs)
52
        self.canvas = kwargs.get('canvas')
53
        self.pos = kwargs.get('pos')
54
        self.radius = kwargs.get('radius')
55
       
56
        kt = MTKinetic(velstop=5.0)
57
        self.circular_menu = MTCircularMenu(pos=self.pos,radius=self.radius)
58
        kt.add_widget(self.circular_menu)
59
        self.add_widget(kt)
60
                
61
        brush_list = []
62
        #by default generate a brushes list in circular menu        
63
        for brush in glob('brushes/*.png'):
64
            brush_list.append([brush,self.canvas.set_brush,brush])
65
            
66
        self.set_list(list=brush_list)
67
        
68
        
69
    def set_list(self,list):
70
        for item in list:
71
            im = MTCircularItem(filename=item[0],handler=item[1],value=item[2])
72
            self.circular_menu.add_widget(im)
73
74
class MTCircularMenu(MTScatterWidget):
75
    def __init__(self, **kwargs):
76
        kwargs.setdefault('do_scale', False)
77
        kwargs.setdefault('do_rotation', True)
78
        kwargs.setdefault('do_translation', False)
79
        super(MTCircularMenu, self).__init__(**kwargs)
80
        self.radius = kwargs.get('radius')
81
        self.size = (self.radius*2,self.radius*2)
82
        self.pos = kwargs.get('pos')
83
        super(MTCircularMenu, self).init_transform(self.pos, 0, 1)
84
        
85
    def collide_point(self, x, y):
86
        return Vector(self.pos).distance((x, y)) <= self.radius
87
        
88
    def add_widget(self, widget, do_layout=True):
89
        super(MTCircularMenu, self).add_widget(widget)
90
        self.need_layout = True
91
        if do_layout:
92
            self.do_layout()
93
            
94
    def do_layout(self):
95
        x = int((self.radius-40)*cos(radians(20*(len(self.children)-1))))
96
        y = int((self.radius-40)*sin(radians(20*(len(self.children)-1))))
97
        self.children[len(self.children)-1].x = x
98
        self.children[len(self.children)-1].y = y
99
                
100
    def rotate_zoom_move(self, touchID, x, y):
101
        # we definitly have one point
102
        p1_start = Vector(*self.touches[touchID])
103
        p1_now   = Vector(x, y)
104
105
        # if we have a second point, do the scale/rotate/move thing
106
        # find intersection between lines...the point around which to rotate
107
        intersect = Vector(self.pos)
108
109
        # compute rotation angle
110
        old_line = p1_start - intersect
111
        new_line = p1_now - intersect
112
        rotation = -1.0 * old_line.angle(new_line)
113
114
        scale = 1.0
115
116
        # just comnpute a translation component if we only have one point
117
        trans = p1_now - p1_start
118
119
        # apply to our transformation matrix
120
        self.apply_angle_scale_trans(rotation, scale, trans, intersect)
121
122
        # save new position of the current touch
123
        self.touches[touchID] = Vector(x,y)
124
        
125
    def draw(self):
126
        #set_color(0,1,0,1)
127
        #drawCircle((0,0), 10)
128
        set_color(*self.style.get('bg-color'))
129
        #drawRectangle((0,0),self.size)
130
        drawCircle((0,0), self.radius)
131
        #drawCircle(self.pos, self.radius-64)
132
        #drawTriangle(self.pos, w=40, h=100)
133
            
134
            
135
if __name__ == '__main__':
136
    w = MTWindow()
137
    cm = MTCircularMenu_Manager(pos=(0,0))
138
    w.add_widget(cm)  
139
    for i in range (12):
140
        teta = float((360/12)*i*(pi/180))
141
        x =  int(90*cos(teta))
142
        y =  int(90*sin(teta))
143
        im = MTImageButton(filename="../../../gfx/icons/flickr.png",pos=(x,y))
144
        cm.add_widget(im) 
145
146
    runTouchApp()
147