diff options
author | Jonas Danielsson <jonas@threetimestwo.org> | 2015-02-12 20:39:55 +0100 |
---|---|---|
committer | Jonas Danielsson <jonas@threetimestwo.org> | 2015-08-16 21:18:35 +0200 |
commit | 07d637cc17a6c72e20bb23ded52bdede4d3c2f39 (patch) | |
tree | 9b2f79cf659922f9de5859c1736853d7aee1895f | |
parent | 6f3b1155e70a9252218727752292b685e709b66e (diff) | |
download | gnome-maps-07d637cc17a6c72e20bb23ded52bdede4d3c2f39.tar.gz |
Add storedRoute module
-rw-r--r-- | src/org.gnome.Maps.src.gresource.xml | 1 | ||||
-rw-r--r-- | src/storedRoute.js | 161 |
2 files changed, 162 insertions, 0 deletions
diff --git a/src/org.gnome.Maps.src.gresource.xml b/src/org.gnome.Maps.src.gresource.xml index 247c8128..a15ac7ec 100644 --- a/src/org.gnome.Maps.src.gresource.xml +++ b/src/org.gnome.Maps.src.gresource.xml @@ -47,6 +47,7 @@ <file>socialPlace.js</file> <file>socialPlaceListBox.js</file> <file>socialPlaceMatcher.js</file> + <file>storedRoute.js</file> <file>translations.js</file> <file>turnPointMarker.js</file> <file>userLocationBubble.js</file> diff --git a/src/storedRoute.js b/src/storedRoute.js new file mode 100644 index 00000000..c4f73e43 --- /dev/null +++ b/src/storedRoute.js @@ -0,0 +1,161 @@ +/* -*- Mode: JS2; indent-tabs-mode: nil; js2-basic-offset: 4 -*- */ +/* vim: set et ts=4 sw=4: */ +/* + * Copyright (c) 2015 Jonas Danielsson + * + * GNOME Maps is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * GNOME Maps is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + * + * You should have received a copy of the GNU General Public License along + * with GNOME Maps; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Author: Jonas Danielsson <jonas@threetimestwo.org> + */ + +const Champlain = imports.gi.Champlain; +const Gio = imports.gi.Gio; +const Lang = imports.lang; + +const Application = imports.application; +const Place = imports.place; +const Route = imports.route; + +const StoredRoute = new Lang.Class({ + Name: 'StoredRoute', + Extends: Place.Place, + + _init: function(params) { + let route = params.route; + delete params.route; + + this.route = new Route.Route(); + this.route.update({ path: route.path, + turnPoints: route.turnPoints, + distance: route.distance, + time: route.time, + bbox: route.bbox }); + + let places = params.places; + delete params.places; + params.name = places[0].name + ' → ' + places[places.length -1].name; + + this.places = []; + this._containsCurrentLocation = false; + places.forEach((function(place) { + if (place === Application.geoclue.place) + this._containsCurrentLocation = true; + + this.places.push(new Place.Place({ place: place })); + }).bind(this)); + + this._icon = Gio.Icon.new_for_string('route-button-symbolic'); + + this.parent(params); + }, + + get viaString() { + return this.places.map(function(place) { + return place.name; + }).join(' → '); + }, + + get icon() { + return this._icon; + }, + + get uniqueID() { + return this.places.map(function(place) { + return [place.osm_type, place.osm_id].join('-'); + }).join('-'); + }, + + get containsCurrentLocation() { + return this._containsCurrentLocation; + }, + + toJSON: function() { + let turnPoints = this.route.turnPoints.map(function(turnPoint) { + let coordinate = { latitude: turnPoint.coordinate.latitude, + longitude: turnPoint.coordinate.longitude }; + return { coordinate: coordinate, + type: turnPoint.type, + distance: turnPoint.distance, + instruction: turnPoint.instruction }; + }); + let bounding_box = { top: this.route.bbox.top, + bottom: this.route.bbox.bottom, + left: this.route.bbox.left, + right: this.route.bbox.right }; + + let path = this.route.path.map(function(coordinate) { + return { latitude: coordinate.latitude, + longitude: coordinate.longitude }; + }); + + let route = { path: path, + turnPoints: turnPoints, + distance: this.route.distance, + time: this.route.time }; + + let places = this.places.map(function(place) { + return place.toJSON(); + }); + + return { id: -1, + route: route, + places: places }; + } +}); + +StoredRoute.fromJSON = function(obj) { + let props; + let places = []; + let route; + + for (let key in obj) { + let prop = obj[key]; + + switch(key) { + case 'route': + route = new Route.Route(); + prop.path = prop.path.map(function(coordinate) { + let lat = coordinate.latitude; + let lon = coordinate.longitude; + return new Champlain.Coordinate({ latitude: lat, + longitude: lon }); + }); + prop.turnPoints = prop.turnPoints.map(function(turnPoint) { + let lat = turnPoint.coordinate.latitude; + let lon = turnPoint.coordinate.longitude; + + let coordinate = new Champlain.Coordinate({ latitude: lat, + longitude: lon }); + + return new Route.TurnPoint({ + coordinate: coordinate, + type: turnPoint.type, + distance: turnPoint.distance, + instruction: turnPoint.instruction + }); + }); + route.update(prop); + break; + + case 'places': + prop.forEach(function(p) { + places.push(Place.Place.fromJSON(p)); + }); + break; + } + } + return new StoredRoute({ route: route, + places: places }); +}; |