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

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

Make waypoints a plugin, same as RSS etc.
Rename plugins to 'poi' (since they're all point data)
Make poi layers map modules (so they get access to global data)
Add waypoint viewer to menu

File size: 6.3 KB
Line 
1import cairo
2import os
3from base import pyrouteModule
4from pyrouteMenu import *
5from menuIcons import menuIcons
6from overlayArea import overlayArea
7
8class guiOverlay(pyrouteModule):
9    def __init__(self, modules):
10        pyrouteModule.__init__(self, modules)
11        self.modules = modules
12        self.icons = menuIcons()
13        self.menus = loadMenus('Menus')
14        for name,stuff in self.menus.items():
15          print "Loaded menu %s" % name
16
17    def fullscreen(self):
18        """Asks if the menu is fullscreen -- if it is, then the
19        map doesn't need to be drawn underneath"""
20        return(self.get('menu'))
21   
22    def handleClick(self,x,y):
23        """return 1 if click was handled"""
24        for cell in self.clickable:
25            if(cell.contains(x,y)):
26                if(cell.handleClick(x,y)):
27                    return(1)
28        if(self.fullscreen()):
29            return(1)
30        return(0)
31    def draw(self, cr, rect):
32        self.cr = cr
33        self.rect = overlayArea(cr,rect.x,rect.y,rect.width,rect.height,self.modules,self.icons)
34        nx = 3
35        ny = 4
36        self.clickable = []
37        self.cells = {}
38        dx = rect.width / nx
39        dy = rect.height / ny
40        for i in range(0,nx):
41            x1 = rect.x + i * dx
42            self.cells[i] = {}
43            for j in range(0,ny):
44                y1 = rect.y + j * dy
45                self.cells[i][j] = overlayArea(cr,x1,y1,dx,dy,self.modules, self.icons)
46                self.clickable.append(self.cells[i][j])
47        currentMenu = self.get('menu')
48        if(currentMenu):
49            self.drawMenu(currentMenu)
50        else:
51            self.cells[0][0].mainMenuButton()
52            self.cr.set_line_width(2)
53            self.cr.set_dash((2,2,2), 0);
54            self.cr.set_source_rgba(0.4,0,0)
55            y = 100
56            self.cr.move_to(0,y)
57            self.cr.line_to(rect.width,y)
58            self.cr.stroke()
59                   
60    def drawMenu(self, menu):
61        try:
62          self.genericMenu(self.menus[menu])
63          return
64        except KeyError:
65                menuName = 'menu_%s' % menu
66                try:
67                    function = getattr(self, menuName)
68                except AttributeError:
69                    print "Error: %s not defined" % menuName
70                    self.set('menu',None)
71                    return
72                function()
73         
74    def backButton(self,i,j):
75        self.cells[i][j].button("","menu:","up")
76    def genericMenu(self, menu):
77      for y in range(4):
78        for x in range(3):
79          item = menu["%d,%d"%(x,y)]
80          if item['name'] == 'Up':
81            self.backButton(x,y)
82          else:
83            self.cells[x][y].button(item['name'],item['action'],item['icon'])
84
85    def menu_feeds(self):
86      self.menu_list("rss")
87    def menu_geonames(self):
88      self.menu_list("geonames")
89    def menu_waypoints(self):
90      self.menu_list("waypoints")
91     
92    def menu_list(self, module):
93      self.backButton(0,0)
94      n = 9
95      offset = 0
96      selectedFeed = int(self.get('selectedFeed',0))
97      titlebar = self.rect.copyself(1.0/3.0,0,1,0.25)
98      line1, line2 = titlebar.ysplit(0.5)
99      back = line1.copyself(0,0,0.25,1)
100      next = line1.copyself(0.75,0,1,1)
101      back.button("","option:add:selectedFeed:-1","back")
102      next.button("","option:add:selectedFeed:1","next")
103      self.clickable.append(back)
104      self.clickable.append(next)
105
106      try:
107        group = self.modules['poi'][module].groups[selectedFeed]
108      except KeyError:
109        line2.drawText("\"%s\" not loaded"%module)
110        return
111      except IndexError:
112        line2.drawText("No such feed #%d"%selectedfeed)
113        return
114     
115      line1.copyself(0.25,0,0.75,1).drawText("Feed %d of %d" % (selectedFeed + 1, len(self.modules['poi'][module].groups)))
116     
117      line2.drawText(group.name)
118     
119      listrect = self.rect.ysplitn(0, 0.25, 0.8, 1, n)
120      ownpos = self.get('ownpos')
121      for i in range(0,n):
122        textarea, button = listrect[i].xsplit(0.8)
123        if(i > 0):
124          self.cr.set_line_width(0.5)
125          self.cr.set_dash((2,2,2), 0);
126          self.cr.set_source_rgb(0,0,0)
127          self.cr.move_to(textarea.x1,textarea.y1)
128          self.cr.line_to(textarea.x2,textarea.y1)
129          self.cr.stroke()
130        try:
131          item = group.items[i + offset]
132          textarea.drawTextSomewhere(item.formatText(), 0.1,0.1,0.9,0.5)
133          textarea.drawTextSomewhere(item.formatPos(ownpos), 0.1,0.6,0.9,0.9)
134          button.button("", "route:%1.5f:%1.5f" % (item.lat, item.lon), "goto")
135          self.clickable.append(button)
136        except IndexError:
137          pass
138
139    def menu_click(self):
140        self.backButton(0,0)
141       
142        latlonRect = self.rect.copyself(0.33,0,1,0.25)
143        latRect = latlonRect.copyself(0,0,1,0.5)
144        lonRect = latlonRect.copyself(0,0.5,1,1)
145       
146        lat,lon = self.get('clicked')
147       
148        NS = lat > 0 and 'N' or 'S'
149        EW = lon > 0 and 'E' or 'W'
150       
151        latRect.drawTextSomewhere('%1.4f %s' % (abs(lat), NS), 0.05, 0.05, 0.7, 0.95)
152        lonRect.drawTextSomewhere('%1.4f %s' % (abs(lon), EW), 0.3, 0.05, 0.95, 0.95)
153        #def drawTextSomewhere(self,text,px1,py1,px2,py2):
154        #innerBox = self.copyself(px1,py1,px2,py2)
155        #innerBox.drawText(text)
156   
157        #self.cells[1][0].button("(lat)",None,None)
158        #self.cells[2][0].button("(lon)",None,None)
159
160        self.cells[0][1].button("set pos","ownpos:clicked","set_pos")
161        self.cells[1][1].button("route to","route:clicked","route_to")
162        self.cells[2][1].button("direct to","direct:clicked","direct_to")
163
164        self.cells[0][2].button("waypoint", "waypoint:clicked", "bookmark")
165        self.cells[1][2].button("extend route", "extend:route:clicked", "extend_route")
166        self.cells[2][2].button("extend direct", "extend:direct:clicked", "extend_direct")
167
168        self.cells[0][3].button("",None,None)
169        self.cells[1][3].button("",None,None)
170        self.cells[2][3].button("",None,None)
171
172    def menu_options(self):
173        view,scroll = self.rect.xsplit(0.8)
174        view.fill(1,0,0)
175        scroll.fill(0,1,0)
176        self.backButton(0,0)
177
178
179if __name__ == "__main__":
180    a = guiOverlay(None,None)
181    print dir(a)
Note: See TracBrowser for help on using the repository browser.