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

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

add + signs for all the events that need to close the 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.