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

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

testing some rotated-screen stuff

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