def photo_drag_end(self, widget, drag_context, x, y, data, info, time, on_map): """Respond to drops and position photos accordingly. This method allows photos to be dropped in from the photo pane or any other drag source, such as the file browser. """ if not data.get_text(): return lat, lon = MapView.y_to_latitude(y), MapView.x_to_longitude(x) files = [ unquote(urlparse(s).path.strip()) for s in data.get_text().split('\n') if s ] if self.external_drag: self.open_files(files) self.external_drag = True if on_map: for filename in files: photo = Photograph.cache.get(filename) if photo is not None: photo.manual = True photo.set_location(lat, lon) self.selection.emit('changed')
def photo_drag_end(self, widget, drag_context, x, y, data, info, time, on_map): """Respond to drops and position photos accordingly. This method allows photos to be dropped in from the photo pane or any other drag source, such as the file browser. """ if not data.get_text(): return lat, lon = MapView.y_to_latitude(y), MapView.x_to_longitude(x) files = [unquote(urlparse(s).path.strip()) for s in data.get_text().split('\n') if s] if self.external_drag: self.open_files(files) self.external_drag = True if on_map: for filename in files: photo = Photograph.cache.get(filename) if photo is not None: photo.manual = True photo.set_location(lat, lon) self.selection.emit('changed')
def test_search(): """Make sure the search box functions""" entry = Widgets.search_box assert len(gui.search.results) == 0 entry.set_text('jo') assert len(gui.search.results) == 0 entry.set_text('edm') assert len(gui.search.results) == 24 get_title = Widgets.main.get_title for result in gui.search.results: gui.search.search_completed(entry, gui.search.results, result.iter) loc, lat, lon = result assert lat == MapView.get_property('latitude') assert lon == MapView.get_property('longitude') entry.set_text('calg') assert len(gui.search.results) == 656 entry.set_text('st.') assert len(gui.search.results) == 675
def __init__(self): Clutter.Box.__init__(self) self.set_layout_manager(Clutter.BinLayout()) self.set_color(Clutter.Color.new(0, 0, 0, 96)) Gst.bind('show-map-coords', self, 'visible') MapView.bin_layout_add(self, START, START) self.get_layout_manager().add(CoordLabel, CENTER, CENTER) MapView.connect('notify::width', lambda *ignore: self.set_size(MapView.get_width(), 30))
def go_back(*ignore): """Return the map view to where the user last set it.""" history = list(Gst.get('history')) lat, lon, zoom = history.pop() if valid_coords(lat, lon): MapView.set_zoom_level(zoom) MapView.center_on(lat, lon) if len(history) > 1: Gst.set_history(history) else: Gst.reset('history')
def search_completed(self, entry, model, itr): """Go to the selected location.""" self.last_search = itr.copy() MapView.emit('realize') MapView.set_zoom_level(MapView.get_max_zoom_level()) Widgets.redraw_interface() MapView.center_on(*model.get(itr, LATITUDE, LONGITUDE)) MapView.set_zoom_level(11)
def destroy(self, button=None): """Die a horrible death.""" for polygon in self.polygons: MapView.remove_layer(polygon) self.polygons.clear() self.widgets.trackfile_settings.destroy() del self.cache[self.filename] TrackFile.instances.discard(self) points.clear() for trackfile in TrackFile.instances: points.update(trackfile.tracks) TrackFile.update_range()
def test_map_sources(): """The map should have multiple sources""" MapView.set_map_source(MAP_SOURCES['osm-cyclemap']) assert Gst.get_string('map-source-id') == 'osm-cyclemap' Gst.set_string('map-source-id', 'mff-relief') assert MapView.get_map_source().get_id() == 'mff-relief' menu = Widgets.map_source_menu.get_active().get_group() assert menu for menu_item in menu: menu_item.set_active(True) assert MapView.get_map_source().get_name() == menu_item.get_label()
def load_from_file(uri): """Determine the correct subclass to instantiate. Also time everything and report how long it took. Raises OSError if the file extension is unknown, or no track points were found. """ start_time = clock() try: gpx = globals()[uri[-3:].upper() + 'File'](uri) except KeyError: raise OSError Widgets.status_message(_('%d points loaded in %.2fs.') % (len(gpx.tracks), clock() - start_time), True) if len(gpx.tracks) < 2: return TrackFile.instances.add(gpx) MapView.emit('realize') MapView.set_zoom_level(MapView.get_max_zoom_level()) MapView.ensure_visible(TrackFile.get_bounding_box(), False) TrackFile.update_range() Camera.set_all_found_timezone(gpx.start.geotimezone)
def load_from_file(uri): """Determine the correct subclass to instantiate. Also time everything and report how long it took. Raises OSError if the file extension is unknown, or no track points were found. """ start_time = clock() try: gpx = globals()[uri[-3:].upper() + 'File'](uri) except KeyError: raise OSError Widgets.status_message( _('%d points loaded in %.2fs.') % (len(gpx.tracks), clock() - start_time), True) if len(gpx.tracks) < 2: return TrackFile.instances.add(gpx) MapView.emit('realize') MapView.set_zoom_level(MapView.get_max_zoom_level()) MapView.ensure_visible(TrackFile.get_bounding_box(), False) TrackFile.update_range() Camera.set_all_found_timezone(gpx.start.geotimezone)
def move_by_arrow_keys(accel_group, acceleratable, keyval, modifier): """Move the map view by 5% of its length in the given direction.""" key = Gdk.keyval_name(keyval) factor = 0.45 if key in ('Up', 'Left') else 0.55 if key in ('Up', 'Down'): lat = MapView.y_to_latitude(MapView.get_height() * factor) lon = MapView.get_center_longitude() else: lat = MapView.get_center_latitude() lon = MapView.x_to_longitude(MapView.get_width() * factor) if valid_coords(lat, lon): MapView.center_on(lat, lon)
def test_gsettings(): """GSettings should be storing data correctly""" Gst.reset("history") assert Gst.get("history")[0] == (34.5, 15.8, 2) MapView.set_zoom_level(2) MapView.center_on(12.3, 45.6) assert Gst.get_double("latitude") == 12.3 assert Gst.get_double("longitude") == 45.6 MapView.zoom_in() MapView.emit("realize") assert list(Gst.get("history")) == [(34.5, 15.8, 2), (12.3, 45.6, 3)]
def test_gsettings(): """GSettings should be storing data correctly""" Gst.reset('history') assert Gst.get('history')[0] == (34.5, 15.8, 2) MapView.set_zoom_level(2) MapView.center_on(12.3, 45.6) assert Gst.get_double('latitude') == 12.3 assert Gst.get_double('longitude') == 45.6 MapView.zoom_in() MapView.emit('realize') assert list(Gst.get('history')) == [(34.5, 15.8, 2), (12.3, 45.6, 3)]
def test_search(): """Make sure the search box functions""" entry = Widgets.search_box assert len(gui.search.results) == 0 entry.set_text('jo') assert len(gui.search.results) == 0 entry.set_text('edm') assert len(gui.search.results) == 24 for result in gui.search.results: gui.search.search_completed(entry, gui.search.results, result.iter) loc, lat, lon = result assert lat == MapView.get_property('latitude') assert lon == MapView.get_property('longitude') entry.set_text('calg') assert len(gui.search.results) == 668 entry.set_text('st.') assert len(gui.search.results) == 687
def test_zoom_buttons(): """Zoom buttons function correctly""" lat = random_coord(80) lon = random_coord(170) MapView.center_on(lat, lon) zoom_in = Widgets.zoom_in_button zoom_out = Widgets.zoom_out_button MapView.set_zoom_level(0) assert not zoom_out.get_sensitive() assert zoom_in.get_sensitive() zoom_in.emit('clicked') assert zoom_out.get_sensitive() assert zoom_in.get_sensitive() MapView.set_zoom_level(MapView.get_max_zoom_level() - 1) assert zoom_out.get_sensitive() assert zoom_in.get_sensitive() zoom_in.emit('clicked') assert zoom_out.get_sensitive() assert not zoom_in.get_sensitive() assert MapView.get_max_zoom_level() == MapView.get_zoom_level()
def test_history(): """The history should keep track of where we go""" coords = [[MapView.get_center_latitude(), MapView.get_center_longitude()]] MapView.emit('realize') assert len(Widgets.main.get_title()) > 5 assert Widgets.main.get_title().index(',') > 0 lat = random_coord(90) lon = random_coord(180) MapView.center_on(lat, lon) coords.append([lat, lon]) assert coords[0][0] - Gst.get('history')[-1][0] < 1e-6 assert coords[0][1] - Gst.get('history')[-1][1] < 1e-6
def test_history(): """The history should keep track of where we go""" coords = [[ MapView.get_center_latitude(), MapView.get_center_longitude() ]] MapView.emit('realize') assert len(Widgets.main.get_title()) > 5 assert Widgets.main.get_title().index(',') > 0 lat = random_coord(90) lon = random_coord(180) MapView.center_on(lat, lon) coords.append([lat, lon]) assert coords[0][0] - Gst.get('history')[-1][0] < 1e-6 assert coords[0][1] - Gst.get('history')[-1][1] < 1e-6
def test_arrow_keys(): """The user can navigate by arrow keys""" Widgets.back_button.emit('clicked') MapView.set_zoom_level(10) lat = MapView.get_center_latitude() lon = MapView.get_center_longitude() move_by_arrow_keys(None, None, Gdk.keyval_from_name('Left'), None) assert lat - MapView.get_center_latitude() < 1e-6 assert lon > MapView.get_center_longitude() move_by_arrow_keys(None, None, Gdk.keyval_from_name('Right'), None) assert lat - MapView.get_center_latitude() < 1e-6 assert lon - MapView.get_center_longitude() < 1e-2 move_by_arrow_keys(None, None, Gdk.keyval_from_name('Right'), None) assert lon < MapView.get_center_longitude() assert lat - MapView.get_center_latitude() < 1e-6 move_by_arrow_keys(None, None, Gdk.keyval_from_name('Left'), None) assert lon - MapView.get_center_longitude() < 1e-2 assert lat - MapView.get_center_latitude() < 1e-6 lon = MapView.get_center_longitude() move_by_arrow_keys(None, None, Gdk.keyval_from_name('Up'), None) assert lon - MapView.get_center_longitude() < 1e-6 assert lat < MapView.get_center_latitude() move_by_arrow_keys(None, None, Gdk.keyval_from_name('Down'), None) assert lon - MapView.get_center_longitude() < 1e-6 assert lat - MapView.get_center_latitude() < 1e-6 move_by_arrow_keys(None, None, Gdk.keyval_from_name('Down'), None) assert lon - MapView.get_center_longitude() < 1e-6 assert lat > MapView.get_center_latitude() move_by_arrow_keys(None, None, Gdk.keyval_from_name('Up'), None) assert lon - MapView.get_center_longitude() < 1e-6 assert lat - MapView.get_center_latitude() < 1e-6
def menu_item_clicked(self, item, map_id): """Switch to the clicked map source.""" if self.get_active(): MapView.set_map_source(MAP_SOURCES[map_id])
def __init__(self): Champlain.Point.__init__(self) self.set_size(4) self.set_color(Clutter.Color.new(0, 0, 0, 64)) Gst.bind('show-map-center', self, 'visible') MapView.bin_layout_add(self, CENTER, CENTER)
def __init__(self): Champlain.Scale.__init__(self) self.connect_view(MapView) Gst.bind('show-map-scale', self, 'visible') MapView.bin_layout_add(self, START, END)
Gst.set_history(history[-30:]) def go_back(*ignore): """Return the map view to where the user last set it.""" history = list(Gst.get('history')) lat, lon, zoom = history.pop() if valid_coords(lat, lon): MapView.set_zoom_level(zoom) MapView.center_on(lat, lon) if len(history) > 1: Gst.set_history(history) else: Gst.reset('history') def zoom_button_sensitivity(view, signal, inn_sensitive, out_sensitive): """Ensure zoom buttons are only sensitive when they need to be.""" zoom = view.get_zoom_level() out_sensitive(view.get_min_zoom_level() != zoom) inn_sensitive(view.get_max_zoom_level() != zoom) for prop in ('latitude', 'longitude', 'zoom-level'): Gst.bind(prop, MapView, prop) MapView.connect('notify::zoom-level', zoom_button_sensitivity, Widgets.zoom_in_button.set_sensitive, Widgets.zoom_out_button.set_sensitive) MapView.connect('realize', remember_location)
def __init__(self): Champlain.PathLayer.__init__(self) self.set_stroke_width(4) MapView.add_layer(self)
def go_back(*ignore): """Return the map view to where the user last set it.""" history = list(Gst.get('history')) lat, lon, zoom = history.pop() if valid_coords(lat, lon): MapView.set_zoom_level(zoom) MapView.center_on(lat, lon) if len(history) > 1: Gst.set_history(history) else: Gst.reset('history') def zoom_button_sensitivity(view, signal, inn_sensitive, out_sensitive): """Ensure zoom buttons are only sensitive when they need to be.""" zoom = view.get_zoom_level() out_sensitive(view.get_min_zoom_level() != zoom) inn_sensitive(view.get_max_zoom_level() != zoom) for prop in ('latitude', 'longitude', 'zoom-level'): Gst.bind(prop, MapView, prop) MapView.connect( 'notify::zoom-level', zoom_button_sensitivity, Widgets.zoom_in_button.set_sensitive, Widgets.zoom_out_button.set_sensitive) MapView.connect('realize', remember_location)