source: subversion/applications/routing/pyroute/overlay.py @ 5852

Last change on this file since 5852 was 5852, checked in by ojw, 12 years ago

Now that the zoom control is just buttons (zoom in/out), then mark them as such on the overlay

File size: 8.4 KB
Line 
1import cairo
2import os
3from base import pyrouteModule
4from pyrouteMenu import *
5from menuIcons import menuIcons
6from overlayArea import overlayArea
7from colorsys import hsv_to_rgb
8
9class guiOverlay(pyrouteModule):
10    def __init__(self, modules):
11        pyrouteModule.__init__(self, modules)
12        self.modules = modules
13        self.icons = menuIcons()
14        self.menus = loadMenus('Menus')
15        self.dragbar = None
16        self.dragpos = 0
17        for name,stuff in self.menus.items():
18          print "Loaded menu %s" % name
19
20    def fullscreen(self):
21        """Asks if the menu is fullscreen -- if it is, then the
22        map doesn't need to be drawn underneath"""
23        return(self.get('menu'))
24   
25    def handleDrag(self,dx,dy,startX,startY):
26      if(self.dragbar):
27        if(self.dragbar.contains(startX,startY)):
28          scale = -20.0 / float(self.rect.h)
29          self.dragpos = self.dragpos + dy * scale
30          if(self.dragpos < 0):
31            self.dragpos = 0
32          #print "Dragging %1.2f (by %1.2f * %1.2f)" % (self.dragpos, dy,scale)
33          return(True)
34      return(False)
35   
36    def handleClick(self,x,y):
37        """return 1 if click was handled"""
38        for cell in self.clickable:
39            if(cell.contains(x,y)):
40                if(cell.handleClick(x,y)):
41                    return(1)
42        if(self.fullscreen()):
43            return(1)
44        return(0)
45    def draw(self, cr, rect):
46        self.cr = cr
47        self.rect = overlayArea(cr,rect.x,rect.y,rect.width,rect.height,self.modules,self.icons)
48        nx = 3
49        ny = 4
50        self.clickable = []
51        self.cells = {}
52        dx = rect.width / nx
53        dy = rect.height / ny
54        for i in range(0,nx):
55            x1 = rect.x + i * dx
56            self.cells[i] = {}
57            for j in range(0,ny):
58                y1 = rect.y + j * dy
59                self.cells[i][j] = overlayArea(cr,x1,y1,dx,dy,self.modules, self.icons)
60                self.clickable.append(self.cells[i][j])
61        currentMenu = self.get('menu')
62        if(currentMenu):
63            self.drawMenu(currentMenu)
64        else:
65          self.mapOverlay()
66
67    def circle(self,x,y):
68      button = self.cells[x][y]
69      self.cr.set_line_width(2)
70      self.cr.set_dash((2,2,2), 0);
71      self.cr.set_source_rgba(0.4,0,0)
72      self.cr.arc(button.cx,button.cy, 0.5*button.w, 0, 2*3.14)
73      self.cr.stroke()
74     
75    def mapOverlay(self):
76      self.circle(0,0)
77      self.circle(1,0)
78      self.circle(2,0)
79      self.cells[0][0].setEvent("menu:main")
80      self.cells[1][0].setEvent("zoom:out")
81      self.cells[2][0].setEvent("zoom:in")
82
83     
84    def drawMenu(self, menu):
85      try:
86        self.genericMenu(self.menus[menu])
87        return
88      except KeyError:
89        menuName = 'menu_%s' % menu
90        try:
91          function = getattr(self, menuName)
92        except AttributeError:
93          print "Error: %s not defined" % menuName
94          self.set('menu','')
95          return
96        function()
97
98    def sketchOverlay(self):
99      colourMenu = self.cells[2][3]
100      r = float(self.get('sketch_r',0))
101      g = float(self.get('sketch_g',0))
102      b = float(self.get('sketch_b',0))
103      colourMenu.fill(r,g,b)
104      colourMenu.setEvent("menu:sketch_colour")
105      # TODO: all clickable places to global array/module
106         
107    def menu_sketch_colour(self):
108      self.backButton(0,0)
109      self.colourMenu(1,0, 0,1,0, 'sketch')
110      self.colourMenu(2,0, 0,0,1, 'sketch')
111      self.colourMenu(0,1, 1,1,0, 'sketch')
112      self.colourMenu(1,1, 0,1,1, 'sketch')
113      self.colourMenu(2,1, 1,0,1, 'sketch')
114      self.colourMenu(0,2, 1,0,0, 'sketch')
115      self.colourMenu(1,2, 0,0,0, 'sketch')
116      self.colourMenu(2,2, 1,1,1, 'sketch')
117     
118    def colourMenu(self,x,y,r,g,b,use):
119      self.cells[x][y].fill(r,g,b)
120      self.cells[x][y].setEvent("+set_colour:%s:%1.2f:%1.2f:%1.2f" % (use,r,g,b))
121     
122   
123    def backButton(self,i,j):
124        self.cells[i][j].button("","menu:","up")
125    def genericMenu(self, menu):
126      for y in range(4):
127        for x in range(3):
128          item = menu["%d,%d"%(x,y)]
129          if item['name'] == 'Up':
130            self.backButton(x,y)
131          else:
132            self.cells[x][y].button(item['name'],item['action'],item['icon'])
133
134    def menu_feeds(self):
135      self.menu_list("rss")
136    def menu_geonames(self):
137      self.menu_list("geonames")
138    def menu_waypoints(self):
139      self.menu_list("waypoints")
140     
141    def menu_list(self, module):
142      self.backButton(0,0)
143      n = 9
144      offset = int(self.dragpos)
145      selectedFeed = int(self.get('selectedFeed',0))
146      titlebar = self.rect.copyself(1.0/3.0,0,1,0.25)
147      line1, line2 = titlebar.ysplit(0.5)
148      back = line1.copyself(0,0,0.25,1)
149      next = line1.copyself(0.75,0,1,1)
150      back.button("","option:add:selectedFeed:-1","back")
151      next.button("","option:add:selectedFeed:1","next")
152      self.clickable.append(back)
153      self.clickable.append(next)
154
155
156      self.dragbar = self.rect.copyself(0.0,0.25,0.88,1.0)
157
158      try:
159        group = self.modules['poi'][module].groups[selectedFeed]
160      except KeyError:
161        line2.drawText("\"%s\" not loaded"%module)
162        return
163      except IndexError:
164        line2.drawText("No such set #%d"%selectedFeed)
165        return
166     
167      line1.copyself(0.28,0,0.73,1).drawText("Set %d of %d" % (selectedFeed + 1, len(self.modules['poi'][module].groups)))
168     
169      line2.drawText(group.name)
170     
171      listrect = self.rect.ysplitn(0, 0.25, 1.0, 1, n)
172      ownpos = self.get('ownpos')
173      for i in range(0,n):
174        textarea, button = listrect[i].xsplit(0.88)
175        color, textarea = textarea.xsplit(0.025)
176       
177        # Pattern for the left hand side to show how far down the list
178        # we are - model it as a colour, where red is the top, and purple
179        # is bottom
180        h = float(i + offset) / float(len(group.items))
181        v = (((i + offset) % 2) == 0) and 1.0 or 0.95
182        r,g,b = hsv_to_rgb(h, 1, v)
183        color.fill(r,g,b)
184       
185        if(i > 0):
186          self.cr.set_line_width(0.5)
187          self.cr.set_dash((2,2,2), 0);
188          self.cr.set_source_rgb(0,0,0)
189          self.cr.move_to(textarea.x1,textarea.y1)
190          self.cr.line_to(textarea.x2,textarea.y1)
191          self.cr.stroke()
192        try:
193          item = group.items[i + offset]
194          textarea.drawTextSomewhere(item.formatText(), 0.1,0.1,0.9,0.5)
195          textarea.drawTextSomewhere(item.formatPos(ownpos), 0.1,0.6,0.9,0.9)
196          button.button("", "+route:%1.5f:%1.5f" % (item.lat, item.lon), "goto")
197          self.clickable.append(button)
198        except IndexError:
199          pass
200
201    def menu_click(self):
202        self.backButton(0,0)
203       
204        latlonRect = self.rect.copyself(0.33,0,1,0.25)
205        latRect = latlonRect.copyself(0,0,1,0.5)
206        lonRect = latlonRect.copyself(0,0.5,1,1)
207       
208        lat,lon = self.get('clicked')
209       
210        NS = lat > 0 and 'N' or 'S'
211        EW = lon > 0 and 'E' or 'W'
212       
213        latRect.drawTextSomewhere('%1.4f %s' % (abs(lat), NS), 0.05, 0.05, 0.7, 0.95)
214        lonRect.drawTextSomewhere('%1.4f %s' % (abs(lon), EW), 0.3, 0.05, 0.95, 0.95)
215        #def drawTextSomewhere(self,text,px1,py1,px2,py2):
216        #innerBox = self.copyself(px1,py1,px2,py2)
217        #innerBox.drawText(text)
218   
219        #self.cells[1][0].button("(lat)",None,None)
220        #self.cells[2][0].button("(lon)",None,None)
221
222        self.cells[0][1].button("set pos","+ownpos:clicked","set_pos")
223        self.cells[1][1].button("route to","+route:clicked","route_to")
224        self.cells[2][1].button("direct to","+direct:clicked","direct_to")
225
226        self.cells[0][2].button("waypoint", "+add_waypoint:clicked", "bookmarks")
227        self.cells[1][2].button("extend route", "+extend:route:clicked", "extend_route")
228        self.cells[2][2].button("extend direct", "+extend:direct:clicked", "extend_direct")
229
230        self.cells[0][3].button("",None,None)
231        self.cells[1][3].button("",None,None)
232        self.cells[2][3].button("",None,None)
233
234    def menu_options(self):
235        view,scroll = self.rect.xsplit(0.8)
236        view.fill(1,0,0)
237        scroll.fill(0,1,0)
238        self.backButton(0,0)
239
240
241if __name__ == "__main__":
242    a = guiOverlay(None,None)
243    print dir(a)
Note: See TracBrowser for help on using the repository browser.