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

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

ability to scroll through lists of POIs (e.g. waypoints, RSS items, wiki
articles)

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