'],
[], '')
#gtk.gdk.pixbuf_new_from_file(LOGO)
about.show()
def on_properties1_activate(self, *args):
props = self.wtree.get_widget('dbaseproperties')
props.hide_on_delete()
props.show()
def on_check_database_activate(self, *args):
bits = {}
for city in self.db.cities:
routes = city.roads
bits.setdefault(len(routes), []).append(unicode(city))
output = []
for i in range(0, 3):
word = 'routes'
if i == 1: word = 'route'
output += [(u"Cities with %d %s:\n " % (i, word))+
(u"\n ".join(bits.get(i, [])) or
u"None")]
text = u'\n\n'.join(output)
buff = gtk.TextBuffer()
self.wtree.get_widget('checkview').set_buffer(buff)
buff.set_text(text)
dialog = self.wtree.get_widget('checkdialog')
dialog.hide_on_delete()
dialog.connect('response', lambda w, *args: w.hide())
dialog.show()
def on_citylist_select_row(self, sel, *args):
if not sel.get_selected()[1]:
self.citybuttons(False)
self.routebuttons(False)
self.roadstore.clear()
return
roadmod, row = self.roadsel.get_selected()
if row:
thisroute = roadmod.get_value(row, 0)
else:
thisroute = None
self.roadstore.clear()
citymod, seliter = self.citysel.get_selected()
city = citymod.get_value(seliter, 0)
cityname = unicode(city)
self.wtree.get_widget('routeframe').set_label(u'Routes from '+cityname)
selected = False
for (i, route) in enumerate(city.roads):
picked = route[2]
self.roadstore.append( [route, picked, unicode(picked),
route[0].name, unicode(route[0].distance),
rpdbase.declassify[route[0].speedcode]] )
if route[0] is thisroute:
self.roadsel.select_path(i)
selected = True
self.citybuttons(True)
self.routebuttons(selected)
def on_roadlist_select_row(self, *args):
self.routebuttons(True)
def on_find1_activate(self, *args):
findstr = self.wtree.get_widget('citytofind')
findwin = self.wtree.get_widget('findwin')
text = findstr.get_text()
findwin.set_response_sensitive(gtk.RESPONSE_ACCEPT, bool(text))
findwin.show()
#findstr.grab_focus()
def on_citytofind_changed(self, *args):
text = self.wtree.get_widget('citytofind').get_text()
self.wtree.get_widget('findwin').set_response_sensitive(
gtk.RESPONSE_ACCEPT, bool(text))
def on_findwin_response(self, findwin, response, *args):
if response == gtk.RESPONSE_ACCEPT:
text = self.wtree.get_widget('citytofind').get_text()
self.findtext = text
self.citysel.unselect_all()
self.on_find_again1_activate()
findwin.hide()
def on_find_again1_activate(self, *args):
self.findtext = self.findtext.lower()
model, it = self.citysel.get_selected()
if not it:
it = self.citystore.get_iter_first()
if not it:
dialog = WarningDialog(self.appwin, 'Nothing to find.')
dialog.run()
dialog.hide()
return
word = ''
else:
it = self.citystore.iter_next(it)
word = 'more '
while it:
cityname = self.citystore.get_value(it, 1)
if self.findtext in cityname.lower():
self.citysel.select_iter(it)
pos = self.citystore.get_path(it)
self.citylist.scroll_to_cell(pos, None, False, 0.5, 0)
return
it = self.citystore.iter_next(it)
dialog = WarningDialog(self.appwin, 'No %scities matching %s.',
word, self.findtext)
dialog.run()
dialog.destroy()
def on_citylist_button_press_event(self, button, event, *args):
if event.type == gtk.gdk._2BUTTON_PRESS and event.button == 1 \
and self.citysel.get_selected()[1]:
self.on_cityprops_clicked()
def on_countrybutton_clicked(self, *args):
self.wtree.get_widget('countrysel').show()
def on_cityprop_response(self, citywin, result, *args):
if result != gtk.RESPONSE_OK:
citywin.hide()
self.editing = None
return
if self.editing is not None:
city = self.editing
else:
city = rpcity.City()
cname, sname = (self.wtree.get_widget('cityname').get_text(),
self.wtree.get_widget('statename').get_text())
sname = rpdbase.expand_state(sname)
country = self.wtree.get_widget('countryname').get_text()
code = rpcountry.code_for[country]
cities = self.db.CitiesMatching(cname+', '+sname)
cities = filter(lambda x, city=city: x is not city, cities)
for c in cities:
if c.city == cname and c.state == sname and \
c.country == code:
citywin.hide()
error = ErrorDialog(citywin,
u'There is already a city named %s.', c)
error.run()
error.destroy()
return
city.update_info(cname, sname, code,
self.wtree.get_widget('longitude').get_value(),
self.wtree.get_widget('latitude').get_value(),
self.wtree.get_widget('interchange').get_active())
self.modified = True
self.set_titlebar()
if self.editing is not None:
self.db.cities.remove(self.editing)
# Insert city in list
thiscity = city
self.db.cities.append(city)
self.db.Sort()
self.citystore.clear()
for (i, city) in enumerate(self.db.cities):
self.citystore.append( [city, unicode(city)] )
if city is thiscity:
self.citysel.select_path(i)
self.citylist.scroll_to_cell((i,), None, False, 0.5, 0)
citywin.hide()
def on_addcity_clicked(self, *args):
citywin = self.wtree.get_widget('cityprop')
self.wtree.get_widget('cityname').set_text('')
#self.wtree.get_widget('statename').set_text('')
#self.wtree.get_widget('countryname').set_text('United States')
self.wtree.get_widget('longitude').set_value(0.0)
self.wtree.get_widget('latitude').set_value(0.0)
self.wtree.get_widget('interchange').set_active(False)
self.wtree.get_widget('cityname').grab_focus()
self.editing = None
citywin.show()
def on_statename_activate(self, *args):
sname = self.wtree.get_widget('statename').get_text()
if sname and len(sname) == 2:
sname = rpdbase.expand_state(sname)
if sname:
self.wtree.get_widget('statename').set_text(sname)
cname = rpdbase.autodetect_country(sname)
if cname:
cname = rpcountry.expand_country(cname)
self.wtree.get_widget('countryname').set_text(cname)
def on_cityprops_clicked(self, *args):
citymod, selit = self.citysel.get_selected()
if not selit:
return
city = self.editing = citymod.get_value(selit, 0)
citywin = self.wtree.get_widget('cityprop')
self.wtree.get_widget('cityname').set_text(city.city)
self.wtree.get_widget('statename').set_text(city.state)
cname = rpcountry.expand_country(city.country)
self.wtree.get_widget('countryname').set_text(cname)
self.wtree.get_widget('longitude').set_value(city.longitude)
self.wtree.get_widget('latitude').set_value(city.latitude)
self.wtree.get_widget('interchange').set_active(city.intersection)
self.wtree.get_widget('cityname').grab_focus()
citywin.show()
def on_removecity_clicked(self, *args):
model, it = self.citysel.get_selected()
if not it:
return
dialog = QuestionDialog(self.appwin, 'Remove this city and all '
'connected routes?')
response = dialog.run()
dialog.destroy()
if response == gtk.RESPONSE_YES:
thiscity = model.get_value(it, 0)
item = model.get_path(it)
roads = [x[0] for x in thiscity.roads]
for road in roads:
for city in road.city:
city.roads = [route for route in city.roads
if route[0] is not road]
try:
self.db.routes.remove(road)
except ValueError:
pass
del roads
self.db.cities.remove(thiscity)
self.db.Rehash()
self.citystore.clear()
for city in self.db.cities:
self.citystore.append( [city, unicode(city)] )
self.citysel.select_path(item)
self.citylist.scroll_to_cell(item, None, False, 0.5, 0)
self.modified = True
self.set_titlebar()
def on_roadlist_button_press_event(self, button, event, *args):
if event.type == gtk.gdk._2BUTTON_PRESS and event.button == 1 \
and self.roadsel.get_selected()[1]:
self.on_routeproperties_clicked()
def on_jump_clicked(self, *args):
model, it = self.roadsel.get_selected()
if not it: return
route = self.roadstore.get_value(it, 0)
othercity = self.roadstore.get_value(it, 1)
for (i, city) in enumerate(self.citystore):
if city[0] is othercity:
self.citysel.select_path(i)
self.citylist.scroll_to_cell(i, None, False, 0.5, 0)
while gtk.events_pending():
gtk.main_iteration(False)
for (j, road) in enumerate(self.roadstore):
if road[0][0] is route[0]:
self.roadsel.select_path(j)
self.roadlist.scroll_to_cell(j, None, False, 0.5, 0)
break
return
def on_removeroute_clicked(self, *args):
model, it = self.roadsel.get_selected()
if not it: return
road = model.get_value(it, 0)
for city in road[0].city:
city.roads = [route for route in city.roads
if route[0] is not road[0]]
self.db.routes.remove(road[0])
model.remove(it)
self.modified = True
self.set_titlebar()
def show_via_entries(self, show=True):
WIDGETS = ['vialabel', 'city3', 'choosecity3', 'exitlabel3',
'exit3', 'rightbox']
if show:
[self.wtree.get_widget(w).show() for w in WIDGETS]
else:
[self.wtree.get_widget(w).hide() for w in WIDGETS]
self.update_box_labels()
def update_box_labels(self):
fullbox = self.wtree.get_widget('rightbox').flags() & gtk.VISIBLE
if fullbox:
via = self.wtree.get_widget('city3').get_text()
else:
via = self.wtree.get_widget('city2').get_text()
self.wtree.get_widget('leftbox').set_label(
'From '+self.wtree.get_widget('city1').get_text()+' to '+via)
if fullbox:
self.wtree.get_widget('rightbox').set_label(
'From '+via+' to '+self.wtree.get_widget('city2').get_text())
#self.wtree.get_widget('leftbox').draw_default()
#self.wtree.get_widget('rightbox').draw_default()
def on_addroute_clicked(self, *args):
mod, it = self.citysel.get_selected()
if not it:
return
thiscity = mod.get_value(it, 0)
self.wtree.get_widget('city1').set_text(unicode(thiscity))
for widget in ['routename', 'city2', 'exit1', 'exit2']:
self.wtree.get_widget(widget).set_text('')
for widget in ['toll', 'scenic', 'ferry']:
self.wtree.get_widget(widget).set_active(False)
if self.db.units == UNITS_METRIC:
self.wtree.get_widget('km').set_active(True)
else:
self.wtree.get_widget('miles').set_active(True)
self.wtree.get_widget('distance').set_value(0)
self.wtree.get_widget('speedtime').set_value(0)
self.editing = None
#selector = self.wtree.get_widget('routesel')
#selector.set_history(0)
self.show_via_entries(False)
self.update_box_labels()
self.wtree.get_widget('routeok').set_sensitive(False)
self.wtree.get_widget('routeprop').show()
self.wtree.get_widget('routename').grab_focus()
self.mode = 'add'
def on_routeproperties_clicked(self, *args):
mod, it = self.citysel.get_selected()
if not it:
return
thiscity = mod.get_value(it, 0)
mod, it = self.roadsel.get_selected()
if not it:
return
road = mod.get_value(it, 0)
rinfo, thatcity = road[1], road[2]
thisexit, thatexit = road[0].exits[rinfo], road[0].exits[1-rinfo]
self.editing = road
self.wtree.get_widget('routename').set_text(road[0].name)
self.wtree.get_widget('city1').set_text(unicode(thiscity))
self.wtree.get_widget('city2').set_text(unicode(thatcity))
self.wtree.get_widget('exit1').set_text(thisexit)
self.wtree.get_widget('exit2').set_text(thatexit)
for widget in ['toll', 'scenic', 'ferry']:
self.wtree.get_widget(widget).set_active(
road[0].flagmap.get(widget, False))
if road[0].distance.units == UNITS_METRIC:
self.wtree.get_widget('km').set_active(True)
else:
self.wtree.get_widget('miles').set_active(True)
self.wtree.get_widget('distance').set_value(road[0].distance.value)
pos = rpdbase.classify.index(rpdbase.declassify[road[0].speedcode])
selector = self.wtree.get_widget('routesel')
selector.set_history(pos)
self.wtree.get_widget('speedtime').set_value(road[0].speed)
self.show_via_entries(False)
self.wtree.get_widget('routeok').set_sensitive(True)
self.wtree.get_widget('routename').grab_focus()
self.wtree.get_widget('routeprop').show()
self.mode = 'edit'
def on_routeprop_response(self, routewin, response, *args):
routewin.hide()
if response != gtk.RESPONSE_OK:
self.editing = None
return
breakmode = self.mode in ('break', 'extend')
name = self.wtree.get_widget('routename').get_text()
city1 = self.wtree.get_widget('city1').get_text().decode('UTF-8')
city2 = self.wtree.get_widget('city2').get_text().decode('UTF-8')
city3 = self.wtree.get_widget('city3').get_text().decode('UTF-8')
exit1 = self.wtree.get_widget('exit1').get_text()
exit2 = self.wtree.get_widget('exit2').get_text()
exit3 = self.wtree.get_widget('exit3').get_text()
if (not name or not city1 or not city2 or (breakmode and not city3)):
routewin.show()
win = self.wtree.get_widget('routeprop')
d = ErrorDialog(win, 'You must include the route name and cities.')
d.run()
d.destroy()
return
if city1 == city2 or (breakmode and city2 == city3) or \
(breakmode and city1 == city3):
routewin.show()
win = self.wtree.get_widget('routeprop')
d = ErrorDialog(win, 'All cities selected must be different.')
d.run()
d.destroy()
return
if self.wtree.get_widget('km').get_active():
units = UNITS_METRIC
else:
units = UNITS_US
if self.wtree.get_widget('km2').get_active():
units2 = UNITS_METRIC
else:
units2 = UNITS_US
distance = Distance(self.wtree.get_widget('distance').get_value_as_int(), units)
distance2 = Distance(self.wtree.get_widget('distance2').get_value_as_int(), units2)
if not distance or (self.mode in ('break', 'extend') and
not distance2):
routewin.show()
win = self.wtree.get_widget('routeprop')
d = ErrorDialog(win, 'Distances must be greater than zero.')
d.run()
d.destroy()
return
# If we're editing an existing route...
if self.editing is not None:
road = self.editing[0]
for city in road.city:
city.roads = [route for route in city.roads
if route[0] is not road]
try:
self.db.routes.remove(road)
except:
pass
flagmap = {}
for widget in ['toll', 'scenic', 'ferry']:
flagmap[widget] = self.wtree.get_widget(widget).get_active()
speed = self.wtree.get_widget('speedtime').get_value_as_int()
code = self.wtree.get_widget('routesel').get_history()
speedcode = rpdbase.classifications[rpdbase.classify[code]]
if self.mode in ('add', 'edit'):
route = rproute.Route([ city1, city2, str(distance), speed,
speedcode, exit1, exit2, name, flagmap ],
self.db.cityhash)
self.db.routes.append(route)
else:
route = rproute.Route([ city1, city3, str(distance), speed,
speedcode, exit1, exit3, name, flagmap ],
self.db.cityhash)
self.db.routes.append(route)
flagmap = {}
for widget in ['toll', 'scenic', 'ferry']:
flagmap[widget] = self.wtree.get_widget(widget+'2').\
get_active()
speed = self.wtree.get_widget('speedtime2').get_value_as_int()
code = self.wtree.get_widget('routesel2').get_history()
speedcode = rpdbase.classifications[rpdbase.classify[code]]
route2 = rproute.Route([ city2, city3, str(distance2), speed,
speedcode, exit2, exit3, name, flagmap ],
self.db.cityhash)
self.db.routes.append(route2)
if self.mode == 'extend':
# Highlight the new segment
route, route2 = route2, route
thisroute = route
self.modified = True
self.set_titlebar()
mod, it = self.citysel.get_selected()
city = mod.get_value(it, 0)
self.roadstore.clear()
selected = False
for (i, route) in enumerate(city.roads):
picked = route[2]
self.roadstore.append( [route, picked, unicode(picked),
route[0].name, unicode(route[0].distance),
rpdbase.declassify[route[0].speedcode]] )
if route[0] is thisroute:
self.roadsel.select_path(i)
selected = True
self.citybuttons(True)
self.routebuttons(selected)
def on_extendroute_clicked(self, *args):
mod, it = self.citysel.get_selected()
if not it:
return
thiscity = mod.get_value(it, 0)
mod, it = self.roadsel.get_selected()
if not it:
return
road = mod.get_value(it, 0)
rinfo, thatcity = road[1], road[2]
thisexit, thatexit = road[0].exits[rinfo], road[0].exits[1-rinfo]
self.editing = road
self.show_via_entries(True)
self.wtree.get_widget('routename').set_text(road[0].name)
self.wtree.get_widget('city3').set_text(unicode(thiscity))
self.wtree.get_widget('city2').set_text('')
self.wtree.get_widget('city1').set_text(unicode(thatcity))
self.wtree.get_widget('exit3').set_text(thisexit)
self.wtree.get_widget('exit2').set_text('')
self.wtree.get_widget('exit1').set_text(thatexit)
for widget in ['toll', 'scenic', 'ferry']:
status = road[0].flagmap.get(widget, False)
self.wtree.get_widget(widget).set_active(status)
self.wtree.get_widget(widget+'2').set_active(status)
if road[0].distance.units == UNITS_METRIC:
self.wtree.get_widget('km').set_active(True)
self.wtree.get_widget('km2').set_active(True)
else:
self.wtree.get_widget('miles').set_active(True)
self.wtree.get_widget('miles2').set_active(True)
self.wtree.get_widget('distance').set_value(float(road[0].distance))
self.wtree.get_widget('distance2').set_value(0)
pos = rpdbase.classify.index(rpdbase.declassify[road[0].speedcode])
selector = self.wtree.get_widget('routesel')
selector.set_history(pos)
selector = self.wtree.get_widget('routesel2')
selector.set_history(pos)
self.wtree.get_widget('speedtime').set_value(road[0].speed)
self.wtree.get_widget('speedtime2').set_value(road[0].speed)
#self.wtree.get_widget('lock').hide()
self.wtree.get_widget('lock').set_sensitive(False)
self.wtree.get_widget('lock').set_active(False)
self.wtree.get_widget('routeok').set_sensitive(False)
self.update_box_labels()
self.wtree.get_widget('routename').grab_focus()
self.wtree.get_widget('routeprop').show()
self.mode = 'extend'
def on_splitroute_clicked(self, *args):
mod, it = self.citysel.get_selected()
if not it:
return
thiscity = mod.get_value(it, 0)
mod, it = self.roadsel.get_selected()
if not it:
return
road = mod.get_value(it, 0)
rinfo, thatcity = road[1], road[2]
thisexit, thatexit = road[0].exits[rinfo], road[0].exits[1-rinfo]
self.editing = road
self.show_via_entries(True)
self.wtree.get_widget('routename').set_text(road[0].name)
self.wtree.get_widget('city1').set_text(unicode(thiscity))
self.wtree.get_widget('city2').set_text(unicode(thatcity))
self.wtree.get_widget('city3').set_text('')
self.wtree.get_widget('exit1').set_text(thisexit)
self.wtree.get_widget('exit2').set_text(thatexit)
self.wtree.get_widget('exit3').set_text('')
for widget in ['toll', 'scenic', 'ferry']:
status = road[0].flagmap.get(widget, False)
self.wtree.get_widget(widget).set_active(status)
self.wtree.get_widget(widget+'2').set_active(status)
if road[0].distance.units == UNITS_METRIC:
self.wtree.get_widget('km').set_active(True)
self.wtree.get_widget('km2').set_active(True)
else:
self.wtree.get_widget('miles').set_active(True)
self.wtree.get_widget('miles2').set_active(True)
self.totaldist = road[0].distance
self.wtree.get_widget('distance').set_value(float(self.totaldist))
self.wtree.get_widget('distance2').set_value(0)
pos = rpdbase.classify.index(rpdbase.declassify[road[0].speedcode])
selector = self.wtree.get_widget('routesel')
selector.set_history(pos)
selector = self.wtree.get_widget('routesel2')
selector.set_history(pos)
self.wtree.get_widget('speedtime').set_value(road[0].speed)
self.wtree.get_widget('speedtime2').set_value(road[0].speed)
self.wtree.get_widget('lock').set_sensitive(True)
self.wtree.get_widget('lock').set_active(True)
#self.wtree.get_widget('lock').show()
self.wtree.get_widget('routeok').set_sensitive(False)
self.update_box_labels()
self.wtree.get_widget('routename').grab_focus()
self.wtree.get_widget('routeprop').show()
self.mode = 'break'
def on_miles_toggled(self, *args):
if not self.wtree.get_widget('routeprop').flags() & gtk.VISIBLE:
return
from_u, to_u = UNITS_US, UNITS_METRIC
if self.wtree.get_widget('miles').get_active():
from_u, to_u = UNITS_METRIC, UNITS_US
# When locked, change the locked units measure at the same time
if not (self.wtree.get_widget('miles2').flags() & gtk.SENSITIVE):
if to_u == UNITS_US:
self.wtree.get_widget('miles2').set_active(True)
else:
self.wtree.get_widget('km2').set_active(True)
dwidget = self.wtree.get_widget('distance')
distance = Distance(dwidget.get_value(), from_u)
dwidget.set_value(float(distance.AsUnit(to_u)))
# Don't convert time
code = self.wtree.get_widget('routesel').get_history()
speedcode = rpdbase.classifications[rpdbase.classify[code]]
if speedcode == 1: return
dwidget = self.wtree.get_widget('speedtime')
distance = Distance(dwidget.get_value(), from_u)
dwidget.set_value(float(distance.AsUnit(to_u)))
def on_choosecity1_clicked(self, *args):
if not self.citywin: self.citywin = CityList(self.wtree)
self.citywin.startup('', self.db, self.set_city_widget,
self.wtree.get_widget('city1'))
def on_choosecity2_clicked(self, *args):
if not self.citywin: self.citywin = CityList(self.wtree)
self.citywin.startup('', self.db, self.set_city_widget,
self.wtree.get_widget('city2'))
def on_choosecity3_clicked(self, *args):
if not self.citywin: self.citywin = CityList(self.wtree)
self.citywin.startup('', self.db, self.set_city_widget,
self.wtree.get_widget('city3'))
def set_city_widget(self, cityid, citynum, widget):
widget.set_text(unicode(cityid))
self.update_box_labels()
self.update_sensitivity()
def update_sensitivity(self, *args):
city1 = self.wtree.get_widget('city1').get_text()
city2 = self.wtree.get_widget('city2').get_text()
city3 = self.wtree.get_widget('city3').get_text()
name = self.wtree.get_widget('routename').get_text()
val = False
if city1 and city2 and name and \
(self.mode not in ('break', 'extend') or city3):
val = True
self.wtree.get_widget('routeok').set_sensitive(val)
def on_lock_toggled(self, *args):
locked = self.wtree.get_widget('lock').get_active()
self.wtree.get_widget('miles2').set_sensitive(not locked)
self.wtree.get_widget('km2').set_sensitive(not locked)
if locked:
self.wtree.get_widget('miles2').set_active(
self.wtree.get_widget('miles').get_active())
self.wtree.get_widget('km2').set_active(
self.wtree.get_widget('km').get_active())
def on_distance_changed(self, *args):
if not self.wtree.get_widget('rightbox').flags() & gtk.VISIBLE:
return
if not self.wtree.get_widget('lock').get_active():
return
units = UNITS_US
if self.wtree.get_widget('km').get_active():
units = UNITS_METRIC
widget = args[0]
widget.update()
total = float(self.totaldist.AsUnit(units))
if widget == self.wtree.get_widget('distance'):
dist1 = widget.get_value()
dist2 = total - dist1
else:
dist2 = widget.get_value()
dist1 = total - dist2
dist1 = clip(0, dist1, total)
dist2 = clip(0, dist2, total)
self.wtree.get_widget('distance').set_value(dist1)
self.wtree.get_widget('distance2').set_value(dist2)
def main(filename=''):
app = Application(filename)
gtk.main()
routeplanner-0.19+nmu1/faq.html 0000644 0000000 0000000 00000003520 10311715601 013353 0 ustar
RoutePlanner: FAQ
Frequently Asked Questions About RoutePlanner
What is RoutePlanner?
RoutePlanner is a highway trip planner, designed to help you
determine the best way to drive from one place to another.
What is RoutePlanner's license?
RoutePlanner's license is more-or-less the same as the MIT/X
Consortium license and the "old" Python license. You are free to
modify, use, and redistribute the software so long as you retain the
copyright notice. RoutePlanner is an example of "free" software under
the Debian Free Software Guidelines.
Where can I get RoutePlanner?
RoutePlanner is distributed as part of the Debian GNU/Linux
operating system in the routeplanner and
routeplanner-gnome packages. It is also available as an RPM
and in tar.gz format from SourceForge.
How can I contribute to RoutePlanner?
Here are some ways to help:
- Report bugs in RoutePlanner (using Debian's bug tracking
system, the SourceForge problem tracker, or via email to the author).
- Submit corrections to the author by email.
- Send patches to the author by email. The database format is
designed to be easily patchable, even with changes made by the
database editor.
- Contribute new databases.
- Send money to the author via PayPal (or buy Debian CDs produced by the author).
Chris Lawrence <chris@lordsutch.com>
(29 Jun 2001 at 16:57 CDT)
routeplanner-0.19+nmu1/rpgnome.py 0000644 0000000 0000000 00000057560 10311715601 013754 0 ustar # Code for the GUI interface to RoutePlanner
#
# Copyright (C) 1996-2004 Chris Lawrence
# This file may be freely distributed under the terms of the RoutePlanner
# license. A copy should appear as 'LICENSE' in the archive that this
# file was included in.
#
# $Id: rpgnome.py,v 1.15 2004/10/02 12:41:34 lordsutch Exp $
import pygtk
pygtk.require('2.0')
import rpdbase
import sys, os, glob, commands, time
from rpcitylist import CityList
from rpprogress import ProgressWin
import gtk
import gtk.gdk
import gnome
import gnome.ui
APP = 'RoutePlanner'
VERSION = rpdbase.VERID
COPYRIGHT = "Copyright (C) 1996-2004 Chris Lawrence"
gnome.init(APP, VERSION)
import gtk.glade
import gobject
from rpunits import *
import gconf
#import gnome.config
# i18n
DIR = 'i18n'
import locale, gettext
locale.setlocale (locale.LC_ALL, '')
gettext.bindtextdomain (APP, DIR)
gettext.textdomain (APP)
gettext.install (APP, DIR, unicode=1)
# Whether or not we use the new file selector
newfilesel = 'FileChooserDialog' in dir(gtk)
PANES = ['shortroute', 'quickroute', 'prefroute', 'leastfuel']
GUIFILE = '/usr/share/routeplanner/routeplanner.glade2'
CONFIG_UNITS = '/apps/routeplanner/Defaults/units'
CONFIG_DEFMPG = '/apps/routeplanner/Defaults/default_efficiency'
CONFIG_DEFPREF = '/apps/routeplanner/Defaults/default_preference'
CONFIG_TOLL = '/apps/routeplanner/Defaults/toll_penalty'
CONFIG_FERRY = '/apps/routeplanner/Defaults/ferry_penalty'
CONFIG_SCENIC = '/apps/routeplanner/Defaults/scenic_bonus'
class Application:
def __init__(self, filename=''):
if os.path.exists('routeplanner.glade2'):
self.wtree = gtk.glade.XML('routeplanner.glade2')
else:
self.wtree = gtk.glade.XML(GUIFILE)
self.appwin = self.wtree.get_widget('app1')
self.appwin.connect("destroy", gtk.main_quit)
dict = {}
for key in dir(self.__class__):
dict[key] = getattr(self, key)
self.wtree.signal_autoconnect(dict)
self.db = None
self.cityview = self.wtree.get_widget('citylist')
self.citystore = gtk.ListStore(gobject.TYPE_PYOBJECT,
gobject.TYPE_STRING)
renderer = gtk.CellRendererText()
col = gtk.TreeViewColumn('City', renderer, text=1)
self.cityview.append_column(col)
self.cityview.set_reorderable(True)
self.cityview.set_model(self.citystore)
sel = self.cityview.get_selection()
sel.set_mode(gtk.SELECTION_SINGLE)
sel.connect("changed", self.on_citylist_select_row)
self.citywin = None
self.make_widgets_sensitive()
self.gconf_client = gconf.client_get_default()
self.gconf_client.add_dir('/apps/routeplanner',
gconf.CLIENT_PRELOAD_RECURSIVE)
self.units = self.gconf_client.get_string(CONFIG_UNITS)
if not self.units or self.units not in VALID_UNITS:
self.units = UNITS_US
self.currentunits = self.units
info = {'metric' : UNITS_METRIC, 'us' : UNITS_US,
'imperial' : UNITS_IMPERIAL}
for widget, units in info.items():
if units == self.units:
self.wtree.get_widget(widget).set_active(True)
if self.units == UNITS_METRIC:
self.wtree.get_widget('effunits').set_text('l/100km')
self.defmpg = self.gconf_client.get_int(CONFIG_DEFMPG)
if not self.defmpg or self.defmpg <= 0 or self.defmpg > 100:
self.defmpg = 20
effwidget = self.wtree.get_widget('defefficiency')
effwidget.set_value(self.defmpg)
self.defpref = self.gconf_client.get_int(CONFIG_DEFPREF)
if not self.defpref or self.defpref < 0 or self.defpref > 100:
self.defpref = 50
prefwidget = self.wtree.get_widget('defpref')
prefwidget.set_value(self.defpref)
self.tollpen = self.gconf_client.get_int(CONFIG_TOLL)
if not self.tollpen or self.tollpen < -100 or self.tollpen > 100:
self.tollpen = 0
self.wtree.get_widget('avoidtolls').set_active(self.tollpen)
self.wtree.get_widget('tollpen').set_sensitive(self.tollpen)
self.wtree.get_widget('tollpen').set_value(self.tollpen)
self.ferrypen = self.gconf_client.get_int(CONFIG_FERRY)
if not self.ferrypen or self.ferrypen < -100 or self.ferrypen > 100:
self.ferrypen = 0
self.wtree.get_widget('avoidferries').set_active(self.ferrypen)
self.wtree.get_widget('ferrypen').set_sensitive(self.ferrypen)
self.wtree.get_widget('ferrypen').set_value(self.ferrypen)
self.scenicbonus = self.gconf_client.get_int(CONFIG_SCENIC)
if not self.scenicbonus or self.scenicbonus < -100 or \
self.scenicbonus > 100:
self.scenicbonus = 0
self.wtree.get_widget('usescenic').set_active(self.scenicbonus)
self.wtree.get_widget('scenicbonus').set_sensitive(self.scenicbonus)
self.wtree.get_widget('scenicbonus').set_value(self.scenicbonus)
if filename:
self.open_database(filename)
prefswin = self.wtree.get_widget('prefswin')
prefswin.hide_on_delete()
classes = rpdbase.classifications.keys()
classes.sort()
classtable = self.wtree.get_widget('classtable')
classtable.resize(len(classes)-2, 4)
maxclass = max(rpdbase.classifications.values())+1
self.speeds = [0]*maxclass
self.mpgs = [0]*maxclass
self.prefer = [0]*maxclass
i = 1
self.prefwidgets = {}
for cl in classes:
classid = rpdbase.classifications[cl]
if len(rpdbase.defspeed) > classid:
speed, mpg, pref = (rpdbase.defspeed[classid],
rpdbase.defeff[classid],
rpdbase.defpref[classid])
else:
speed, mpg, pref = 50, self.defmpg, self.defpref
if cl[0:2] == 'XX': continue
x = gtk.Label(cl)
x.show()
classtable.attach(x, 0, 1, i, i+1)
row = []
for j in range(1, 4):
ptype = ['','speed','efficiency', 'preference'][j]
x = gtk.SpinButton()
cl2 = cl.replace('/', '_')
cl2 = cl2.replace(' ', '_')
val = self.gconf_client.get_int('/apps/routeplanner/%s/%s' %
(ptype, cl2))
maxval = 100
if not val:
if j == 1:
val = Distance(speed, UNITS_US).AsUnit(self.units)
maxval = 150
elif j == 2:
val = ConvertEfficiency(mpg, UNITS_US, self.units)
else:
val = pref
x.set_digits(0)
x.get_adjustment().set_all(val, 1, maxval, 1, 10, 1)
x.set_value(val)
x.connect('changed', self.prefswin_changed)
x.show()
classtable.attach(x, j, j+1, i, i+1)
row.append(x)
if j == 1:
self.speeds[classid] = val
elif j == 2:
self.mpgs[classid] = val
else:
self.prefer[classid] = val
self.prefwidgets[cl] = row
i += 1
classtable.show()
def on_exit1_activate(self,*args):
gtk.main_quit()
def on_about1_activate(self,*args):
about = gnome.ui.About(
APP, VERSION, COPYRIGHT,
_("Highway trip planner based on Jim Butterfield's RoadRoute."),
['Chris Lawrence ',
'Jim Butterfield'],
[], '')
#gtk.gdk.pixbuf_new_from_file(LOGO)
about.show()
def on_properties1_activate(self, *args):
if self.db:
message = 'Current database: %s\n%s\n'\
'%d Cites - %d Routes\nAuthor: %s <%s>' % \
(self.db.filename, self.db.comment,
len(self.db.cities), len(self.db.routes),
self.db.author, self.db.author_email)
else:
message = 'No database loaded.'
dialog = gtk.MessageDialog(self.appwin, buttons=gtk.BUTTONS_OK,
message_format=message)
dialog.run()
dialog.destroy()
def on_addcity_clicked(self, *args):
if not self.citywin:
self.citywin = CityList(self.wtree)
self.citywin.startup('', self.db, self.appendcity)
def on_citylist_button_press_event(self, button, event, *args):
if event.type == gtk.gdk._2BUTTON_PRESS and event.button == 1 \
and self.cityview.get_selection().get_selected():
self.on_changecity_clicked()
def on_changecity_clicked(self, *args):
if not self.citywin:
self.citywin = CityList(self.wtree)
sel = self.cityview.get_selection()
city, it = sel.get_selected()
pos = city.get_path(it)[0]
cityname = city[pos][0]
self.citywin.startup(cityname, self.db, self.changecity, pos)
def appendcity(self, city, ind, *data):
it = self.citystore.append()
self.citystore.set(it, 0, city, 1, unicode(city))
sel = self.cityview.get_selection()
sel.select_path(len(self.citystore)-1)
self.make_widgets_sensitive()
def changecity(self, city, ind, pos):
sel = self.cityview.get_selection()
selcity, it = sel.get_selected()
pos = selcity.get_path(it)[0]
self.citystore[pos] = (city, unicode(city))
self.make_widgets_sensitive()
def on_removecity_clicked(self, *args):
sel = self.cityview.get_selection()
selcity, it = sel.get_selected()
if not it:
return
pos = selcity.get_path(it)[0]
del self.citystore[pos]
self.make_widgets_sensitive()
def on_citylist_select_row(self, sel, *args):
wlist = ['changecity', 'removecity']
if sel.get_selected()[1]:
state = True
else:
state = False
for widget in wlist:
self.wtree.get_widget(widget).set_sensitive(state)
def on_filesel_ok_clicked(self, *args):
filename = self.fw.get_filename()
self.fw.destroy()
self.open_database(filename)
def on_filesel_cancel_clicked(self, *args):
self.fw.destroy()
def on_open1_activate(self, *args):
if newfilesel:
fs = gtk.FileChooserDialog('Select database', self.appwin,
gtk.FILE_CHOOSER_ACTION_OPEN,
(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
gtk.STOCK_OPEN, gtk.RESPONSE_ACCEPT))
fs.set_current_folder('/usr/share/routeplanner')
response = fs.run()
fs.hide()
if response == gtk.RESPONSE_ACCEPT:
filename = fs.get_filename()
self.open_database(filename)
fs.destroy()
else:
self.fw = gtk.FileSelection('Select database')
self.fw.set_transient_for(self.appwin)
self.fw.selection_entry.connect("activate",
self.on_filesel_ok_clicked)
self.fw.ok_button.connect("pressed", self.on_filesel_ok_clicked)
self.fw.cancel_button.connect("pressed",
self.on_filesel_cancel_clicked)
self.fw.set_modal(True)
self.fw.hide_on_delete()
self.fw.set_filename('/usr/share/routeplanner/')
self.fw.show()
def on_plan_clicked(self, *args):
db = self.db
path = []
for (info, cname) in self.citystore:
if path and info == path[-1]:
dialog = gtk.MessageDialog(self.appwin,
message_format='Same city appears '
'twice in a row:\n'+cname+'\n'
'Please fix this and plan again.',
type=gtk.MESSAGE_ERROR,
buttons=gtk.BUTTONS_CLOSE)
dialog.run()
dialog.destroy()
return
path.append(info)
methods = len(rpdbase.methods)
displist = [None]*methods
self.routes = [None]*methods
progwin = ProgressWin("Calculating route", self.appwin)
progwin.set_label('Planning')
progwin.set_current(0)
progwin.set_max(methods)
progwin.show()
for method in range(methods):
progwin.set_label('Planning '+rpdbase.methods[method])
progwin.set_current(method)
trail = []
for i in range(len(path)-1):
trail.append( db.NewNavigate(
path[i], path[i+1], method = method,
codetable = self.speeds, prefertable = self.prefer,
defaultprefer = self.defpref, mpgtable = self.mpgs,
defmpg = self.defmpg, units=self.units,
flagbonus = { 'toll' : -self.tollpen,
'scenic' : self.scenicbonus,
'ferry': -self.ferrypen } ))
progwin.set_current(method+0.5)
displist[method] = rpdbase.ProduceTrail(trail, db, self.units,
self.mpgs, self.defmpg,
self.speeds)
del trail # Free some memory
progwin.set_current(method+1)
progwin.destroy()
planwin = self.wtree.get_widget('planwin')
startloc = self.wtree.get_widget('startloc')
endloc = self.wtree.get_widget('endloc')
vialocs = self.wtree.get_widget('vialocs')
start, end, via = path[0], path[-1], path[1:-1]
startloc.set_text(str(start))
endloc.set_text(str(end))
if via:
vialocs.set_text('; '.join(map(str, via)))
else:
vialocs.set_text('[none]')
#font = load_font("fixed")
#black = GdkColor(0,0,0)
widgets = PANES
for j in range(methods):
route = self.wtree.get_widget(widgets[j])
text = rpdbase.FormatRoute(displist[j], path, self.units)
buff = gtk.TextBuffer()
route.set_buffer(buff)
tag = gtk.TextTag('routedesc')
tag.set_property('font', 'Monospace 10')
buff.get_tag_table().add(tag)
sob, eob = buff.get_bounds()
buff.insert_with_tags_by_name(eob, text, "routedesc")
self.routes[j] = text
planwin.connect("delete_event", self.close_route_win)
planwin.show()
def on_close1_activate(self, *args):
self.close_route_win()
def close_route_win(self, *args):
self.wtree.get_widget('planwin').hide()
return True
def on_print1_activate(self, *args):
printwin = self.wtree.get_widget('printwin')
printwin.connect("delete_event", self.close_print_win)
printwin.set_transient_for(self.wtree.get_widget('planwin'))
printwin.hide_on_delete()
printwin.show()
def close_print_win(self, *args):
self.wtree.get_widget('printwin').hide()
return True
def on_print_ok_clicked(self, *args):
self.wtree.get_widget('printwin').hide()
command = self.wtree.get_widget('printcomm').get_text()
items = []
items.append( self.wtree.get_widget('shortest').get_active() )
items.append( self.wtree.get_widget('quickest').get_active() )
items.append( self.wtree.get_widget('preferred').get_active() )
items.append( self.wtree.get_widget('lowestfuel').get_active() )
separator = '\n\n'
if self.wtree.get_widget('use_ff').get_active():
separator = '\f'
fh = os.popen(command, 'w')
already_printed = 0
for j in range(len(rpdbase.methods)):
if items[j]:
if already_printed: fh.write(separator)
fh.write(rpdbase.methods[j]+" Route:\n\n")
fh.write(self.routes[j]+'\n')
already_printed = 1
fh.close()
self.wtree.get_widget('printwin').hide()
return True
def on_save_as1_activate(self, *args):
if newfilesel:
fs = gtk.FileChooserDialog('Save routes as...',
self.wtree.get_widget('planwin'),
gtk.FILE_CHOOSER_ACTION_SAVE,
(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
gtk.STOCK_SAVE, gtk.RESPONSE_ACCEPT))
response = fs.run()
fs.hide()
if response == gtk.RESPONSE_ACCEPT:
filename = fs.get_filename()
do_save(filename)
fs.destroy()
else:
self.fw = gtk.FileSelection('Save routes as...')
self.fw.set_transient_for(self.wtree.get_widget('planwin'))
self.fw.selection_entry.connect("activate", self.save_as_done)
self.fw.ok_button.connect("pressed", self.save_as_done)
self.fw.cancel_button.connect("pressed", lambda x: self.fw.destroy())
self.fw.set_modal(True)
self.fw.hide_on_delete()
self.fw.show()
def save_as_done(self, *args):
fn = self.fw.get_filename()
self.do_save(fn)
def do_save(self, fn):
if os.path.exists(fn):
dialog = GnomeMessageBox("Overwrite existing file\n"+fn+"?",
MESSAGE_BOX_QUESTION, STOCK_BUTTON_YES,
STOCK_BUTTON_NO)
dialog.set_parent(self.wtree.get_widget('planwin'))
if dialog.run_and_close():
return
self.fw.destroy()
del self.fw
try:
fh = open(fn, 'w')
except IOError, x:
dialog = GnomeErrorDialog(str(x), self.wtree.get_widget('planwin'))
dialog.run_and_close()
return
for j in range(len(rpdbase.methods)):
if j: fh.write('\n\n')
fh.write(rpdbase.methods[j]+" Route:\n\n")
fh.write(self.routes[j]+'\n')
fh.close()
def make_widgets_sensitive(self):
if not self.db:
wlist = {'addcity' : False,
'citylist' : False,
'plan' : False}
elif len(self.citystore) > 1:
wlist = {'addcity' : True,
'citylist' : True,
'plan' : True}
else:
wlist = {'addcity' : True,
'citylist' : True,
'plan' : False}
for widget, state in wlist.items():
self.wtree.get_widget(widget).set_sensitive(state)
def open_database(self, filename):
progwin = ProgressWin(os.path.basename(filename)+'...', self.appwin)
progwin.show()
try:
self.db = rpdbase.RPDatabase(filename, quiet=1,
progressbar=progwin)
except (rpdbase.invalidformat, IOError), x:
progwin.destroy()
error = GnomeErrorDialog('Unable to open '+filename+':\n\n'+
str(x), self.appwin)
error.run_and_close()
return
self.make_widgets_sensitive()
self.citystore.clear()
self.appwin.set_title('RoutePlanner: '+filename)
progwin.destroy()
def on_preferences1_activate(self, *args):
prefswin = self.wtree.get_widget('prefswin')
prefswin.close_hides(True)
prefswin.show()
def units_changed(self, *args):
self.prefswin_changed()
oldunits = newunits = self.currentunits
info = {'metric' : UNITS_METRIC, 'us' : UNITS_US,
'imperial' : UNITS_IMPERIAL}
for widget, units in info.items():
if self.wtree.get_widget(widget).get_active():
newunits = units
if oldunits == newunits:
return
if newunits == UNITS_METRIC:
self.wtree.get_widget('effunits').set_text('l/100km')
else:
self.wtree.get_widget('effunits').set_text('mpg')
effwidget = self.wtree.get_widget('defefficiency')
current = effwidget.get_value()
current = ConvertEfficiency(current, oldunits, newunits)
effwidget.set_value(current)
for cl, row in self.prefwidgets.items():
for j in range(1, 3):
val = row[j-1].get_value()
if j == 1:
row[j-1].set_value(Distance(val, oldunits).
AsUnit(newunits))
else:
row[j-1].set_value(ConvertEfficiency(val, oldunits,
newunits))
self.currentunits = newunits
def prefswin_changed(self, *args):
self.wtree.get_widget('prefswin').set_modified(True)
def on_prefswin_apply(self, *args):
# Update prefs here
info = {'metric' : UNITS_METRIC, 'us' : UNITS_US,
'imperial' : UNITS_IMPERIAL}
for widget, units in info.items():
if self.wtree.get_widget(widget).get_active():
self.units = units
self.defmpg = self.wtree.get_widget('defefficiency').get_value_as_int()
self.defpref = self.wtree.get_widget('defpref').get_value_as_int()
self.gconf_client.set_string(CONFIG_UNITS, self.units)
self.gconf_client.set_int(CONFIG_DEFMPG, self.defmpg)
self.gconf_client.set_int(CONFIG_DEFPREF, self.defpref)
self.tollpen = (self.wtree.get_widget('avoidtolls').get_active() and
self.wtree.get_widget('tollpen').get_value_as_int())
self.ferrypen = (self.wtree.get_widget('avoidferries').get_active()
and self.wtree.get_widget('ferrypen').
get_value_as_int())
self.scenicbonus = (self.wtree.get_widget('usescenic').get_active()
and self.wtree.get_widget('scenicbonus').
get_value_as_int())
self.gconf_client.set_int(CONFIG_TOLL, self.tollpen)
self.gconf_client.set_int(CONFIG_FERRY, self.ferrypen)
self.gconf_client.set_int(CONFIG_SCENIC, self.scenicbonus)
items = self.prefwidgets.items()
items.sort()
for cl, row in items:
classid = rpdbase.classifications[cl]
for j in range(1, 4):
type = ['','speed','efficiency', 'preference'][j]
val = row[j-1].get_value_as_int()
cl = cl.replace('/', '_')
cl = cl.replace(' ', '_')
self.gconf_client.set_int('/apps/routeplanner/'+type+'/'+cl,
val)
if j == 1:
self.speeds[classid] = val
elif j == 2:
self.mpgs[classid] = val
else:
self.prefer[classid] = val
def on_avoidtolls_toggled(self, widget, *args):
self.wtree.get_widget('tollpen').set_sensitive(widget.get_active())
self.prefswin_changed()
def on_avoidferries_toggled(self, widget, *args):
self.wtree.get_widget('ferrypen').set_sensitive(widget.get_active())
self.prefswin_changed()
def on_usescenic_toggled(self, widget, *args):
self.wtree.get_widget('scenicbonus').set_sensitive(widget.get_active())
self.prefswin_changed()
def on_prefswin_close(self, *args):
self.wtree.get_widget('prefswin').hide()
return True
def main(filename=''):
global app
app = Application(filename)
gtk.main()
app.appwin.hide()
routeplanner-0.19+nmu1/routingwin.png 0000644 0000000 0000000 00000052554 10311715601 014644 0 ustar PNG
IHDR
Lj gAMA a bKGD pHYs tIME
1ܰ) IDATxq}/řb)T`P/4rᙱ/zxI(/nSf`:[<3u:-zs}7^jj][_gFpۈRvyOD#w?Wk4oU+wCאDT)Wnm_v(Un]kyw'9{Sûs7A)ݞ
?=;τubo5Wd#W?X?W]4u#VN{brFp
ؽ='=in'~v?4cOUd4"Z~{csS9?`kO8aߗ6zSO-ar]\XۉXѰ'a;D4sߌ4?,ƙ3MZg[рG>q'oˈnnu2GLsCE-89BdΞ]7VpގUS${kk]֏93hˏY?ȕȶ죷s^\h"_}ѻuieoY7N)ښsr3LmMK2wKrꄓֈ,aKȸhN7 8n'6BFQ[[>$/ Go[P\gtl`n}=jLqimF~:t펺XɁn4Ǟ<9uUjכ֦jz4a?X<
='R.ej黥ŗ_6WhJ_Z8q/y#ɖ߾a)vg)~5CQ_)}ٯXV7"%Y蕾gٞ(]eS~ue~_>O-cjӊvD\<4@-obi"~GfCA
Ҋfd/UZk>o扏k:-
PG
E;Aڷ([:ZҼl#o?iC=
XHt`V98zgtV`KgtV`KgtV`KgtV`KgtV`KgtV`KgtV`KgtV`KgtV`KgtV`KgEMӨztriazϙGxvap"ͿxzGk֞gsg~vm13?Q:!8=fΏ9oolQmXaW:yq
"rzs}Uy9#!9T٫4Q}-w8/NR-w|\o4YT^eAli;dY:NK{N[W[-8]T$˳~vA{\TmzfO˻VlG-3~'%;)s]_^[_{ϥ.};^/q7Z9@LUJ_|[mBm6l1
8#öI
NλFl{"rK
?z32Da;GҮvO;qW{#Ƴ$ٜ:
Ǝ89~[s6'
vxIX[_s< p#roW%i~7S]pѦ/uY#S>4Tw-uTωpRⴺS~RhjeIi^k
#Y08wg{C6gیӺ!v|Dz;(]
x$SV ɖ8sE} H~FZDE#ko;l]``V`KgtVDk9 u&8[}d MbVxo[:V7e"Ϋ18m8#
l
l
l
l
l
l
l
l
l
l
l
l
l
l
l
l
l
l
l
l
l
oV.כDdmZierlNJ(w|0
A֛rs_m[zl|3́\c>۹s""2qSˌ