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

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

convert to an "integer zoom level" (so zooming isn't continuous, but must double or halve the detail in each step) -- this is to make the map images the same size as their original, so that cairo doesn't have to do any scaling

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