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

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

idea for showing hints on startup

File size: 8.7 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 mapOverlay(self):
68      if(self.get('showHints')):
69        self.cells[0][0].button("Menu",None,"hint")
70        self.cells[1][0].button("Zoom out",None,"hint")
71        self.cells[2][0].button("Zoom in",None,"hint")
72       
73      # Tickmarks to show where the 3 active buttons are
74      self.cr.set_line_width(2)
75      self.cr.set_dash((10,5), 0);
76      self.cr.set_source_rgba(0.4,0,0)
77      for x in (0,1,2):
78        button = self.cells[x][0]
79        self.cr.move_to(button.x1,button.y2)
80        self.cr.line_to(button.x2,button.y2)
81        if(x < 2):
82          self.cr.line_to(button.x2,button.yc(0.7))
83      self.cr.stroke()
84   
85      # Make the buttons clickable
86      self.cells[0][0].setEvent("menu:main")
87      self.cells[1][0].setEvent("zoom:out")
88      self.cells[2][0].setEvent("zoom:in")
89
90     
91    def drawMenu(self, menu):
92      try:
93        self.genericMenu(self.menus[menu])
94        return
95      except KeyError:
96        menuName = 'menu_%s' % menu
97        try:
98          function = getattr(self, menuName)
99        except AttributeError:
100          print "Error: %s not defined" % menuName
101          self.set('menu','')
102          return
103        function()
104
105    def sketchOverlay(self):
106      colourMenu = self.cells[2][3]
107      r = float(self.get('sketch_r',0))
108      g = float(self.get('sketch_g',0))
109      b = float(self.get('sketch_b',0))
110      colourMenu.fill(r,g,b)
111      colourMenu.setEvent("menu:sketch_colour")
112      # TODO: all clickable places to global array/module
113         
114    def menu_sketch_colour(self):
115      self.backButton(0,0)
116      self.colourMenu(1,0, 0,1,0, 'sketch')
117      self.colourMenu(2,0, 0,0,1, 'sketch')
118      self.colourMenu(0,1, 1,1,0, 'sketch')
119      self.colourMenu(1,1, 0,1,1, 'sketch')
120      self.colourMenu(2,1, 1,0,1, 'sketch')
121      self.colourMenu(0,2, 1,0,0, 'sketch')
122      self.colourMenu(1,2, 0,0,0, 'sketch')
123      self.colourMenu(2,2, 1,1,1, 'sketch')
124     
125    def colourMenu(self,x,y,r,g,b,use):
126      self.cells[x][y].fill(r,g,b)
127      self.cells[x][y].setEvent("+set_colour:%s:%1.2f:%1.2f:%1.2f" % (use,r,g,b))
128     
129   
130    def backButton(self,i,j):
131        self.cells[i][j].button("","menu:","up")
132    def genericMenu(self, menu):
133      for y in range(4):
134        for x in range(3):
135          item = menu["%d,%d"%(x,y)]
136          if item['name'] == 'Up':
137            self.backButton(x,y)
138          else:
139            self.cells[x][y].button(item['name'],item['action'],item['icon'])
140
141    def menu_feeds(self):
142      self.menu_list("rss")
143    def menu_geonames(self):
144      self.menu_list("geonames")
145    def menu_waypoints(self):
146      self.menu_list("waypoints")
147     
148    def menu_list(self, module):
149      self.backButton(0,0)
150      n = 9
151      offset = int(self.dragpos)
152      selectedFeed = int(self.get('selectedFeed',0))
153      titlebar = self.rect.copyself(1.0/3.0,0,1,0.25)
154      line1, line2 = titlebar.ysplit(0.5)
155      back = line1.copyself(0,0,0.25,1)
156      next = line1.copyself(0.75,0,1,1)
157      back.button("","option:add:selectedFeed:-1","back")
158      next.button("","option:add:selectedFeed:1","next")
159      self.clickable.append(back)
160      self.clickable.append(next)
161
162
163      self.dragbar = self.rect.copyself(0.0,0.25,0.88,1.0)
164
165      try:
166        group = self.modules['poi'][module].groups[selectedFeed]
167      except KeyError:
168        line2.drawText("\"%s\" not loaded"%module)
169        return
170      except IndexError:
171        line2.drawText("No such set #%d"%selectedFeed)
172        return
173     
174      line1.copyself(0.28,0,0.73,1).drawText("Set %d of %d" % (selectedFeed + 1, len(self.modules['poi'][module].groups)))
175     
176      line2.drawText(group.name)
177     
178      listrect = self.rect.ysplitn(0, 0.25, 1.0, 1, n)
179      ownpos = self.get('ownpos')
180      for i in range(0,n):
181        textarea, button = listrect[i].xsplit(0.88)
182        color, textarea = textarea.xsplit(0.025)
183       
184        # Pattern for the left hand side to show how far down the list
185        # we are - model it as a colour, where red is the top, and purple
186        # is bottom
187        h = float(i + offset) / float(len(group.items))
188        v = (((i + offset) % 2) == 0) and 1.0 or 0.95
189        r,g,b = hsv_to_rgb(h, 1, v)
190        color.fill(r,g,b)
191       
192        if(i > 0):
193          self.cr.set_line_width(0.5)
194          self.cr.set_dash((2,2,2), 0);
195          self.cr.set_source_rgb(0,0,0)
196          self.cr.move_to(textarea.x1,textarea.y1)
197          self.cr.line_to(textarea.x2,textarea.y1)
198          self.cr.stroke()
199        try:
200          item = group.items[i + offset]
201          textarea.drawTextSomewhere(item.formatText(), 0.1,0.1,0.9,0.5)
202          textarea.drawTextSomewhere(item.formatPos(ownpos), 0.1,0.6,0.9,0.9)
203          button.button("", "+route:%1.5f:%1.5f" % (item.lat, item.lon), "goto")
204          self.clickable.append(button)
205        except IndexError:
206          pass
207
208    def menu_click(self):
209        self.backButton(0,0)
210       
211        latlonRect = self.rect.copyself(0.33,0,1,0.25)
212        latRect = latlonRect.copyself(0,0,1,0.5)
213        lonRect = latlonRect.copyself(0,0.5,1,1)
214       
215        lat,lon = self.get('clicked')
216       
217        NS = lat > 0 and 'N' or 'S'
218        EW = lon > 0 and 'E' or 'W'
219       
220        latRect.drawTextSomewhere('%1.4f %s' % (abs(lat), NS), 0.05, 0.05, 0.7, 0.95)
221        lonRect.drawTextSomewhere('%1.4f %s' % (abs(lon), EW), 0.3, 0.05, 0.95, 0.95)
222        #def drawTextSomewhere(self,text,px1,py1,px2,py2):
223        #innerBox = self.copyself(px1,py1,px2,py2)
224        #innerBox.drawText(text)
225   
226        #self.cells[1][0].button("(lat)",None,None)
227        #self.cells[2][0].button("(lon)",None,None)
228
229        self.cells[0][1].button("set pos","+ownpos:clicked","set_pos")
230        self.cells[1][1].button("route to","+route:clicked","route_to")
231        self.cells[2][1].button("direct to","+direct:clicked","direct_to")
232
233        self.cells[0][2].button("waypoint", "+add_waypoint:clicked", "bookmarks")
234        self.cells[1][2].button("extend route", "+extend:route:clicked", "extend_route")
235        self.cells[2][2].button("extend direct", "+extend:direct:clicked", "extend_direct")
236
237        self.cells[0][3].button("",None,None)
238        self.cells[1][3].button("",None,None)
239        self.cells[2][3].button("",None,None)
240
241    def menu_options(self):
242        view,scroll = self.rect.xsplit(0.8)
243        view.fill(1,0,0)
244        scroll.fill(0,1,0)
245        self.backButton(0,0)
246
247
248if __name__ == "__main__":
249    a = guiOverlay(None,None)
250    print dir(a)
Note: See TracBrowser for help on using the repository browser.