[gnome-maps/wip/mlundblad/transit-routing: 20/21] WIP: Add print layout for transit
- From: Marcus Lundblad <mlundblad src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-maps/wip/mlundblad/transit-routing: 20/21] WIP: Add print layout for transit
- Date: Sat, 22 Oct 2016 11:58:11 +0000 (UTC)
commit 90b5f4d8187c0f9c3374447068becfd092d0916a
Author: Marcus Lundblad <ml update uu se>
Date: Tue Sep 20 23:27:09 2016 +0200
WIP: Add print layout for transit
src/org.gnome.Maps.src.gresource.xml | 1 +
src/transitPrintLayout.js | 172 ++++++++++++++++++++++++++++++++++
2 files changed, 173 insertions(+), 0 deletions(-)
---
diff --git a/src/org.gnome.Maps.src.gresource.xml b/src/org.gnome.Maps.src.gresource.xml
index fa1b45d..89ff771 100644
--- a/src/org.gnome.Maps.src.gresource.xml
+++ b/src/org.gnome.Maps.src.gresource.xml
@@ -82,6 +82,7 @@
<file>transitMoreRow.js</file>
<file>transitOptions.js</file>
<file>transitPlan.js</file>
+ <file>transitPrintLayout.js</file>
<file>transitRouteLabel.js</file>
<file>transitStopRow.js</file>
<file>transitWalkMarker.js</file>
diff --git a/src/transitPrintLayout.js b/src/transitPrintLayout.js
new file mode 100644
index 0000000..60d1ed8
--- /dev/null
+++ b/src/transitPrintLayout.js
@@ -0,0 +1,172 @@
+/* -*- Mode: JS2; indent-tabs-mode: nil; js2-basic-offset: 4 -*- */
+/* vim: set et ts=4 sw=4: */
+/*
+ * Copyright (c) 2016 Marcus Lundblad.
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ *
+ * Author: Marcus Lundblad <ml update uu se>
+ */
+
+const Lang = imports.lang;
+
+const Champlain = imports.gi.Champlain;
+const Clutter = imports.gi.Clutter;
+
+const MapSource = imports.mapSource;
+const PrintLayout = imports.printLayout;
+const TransitArrivalMarker = imports.transitArrivalMarker;
+const TransitBoardMarker = imports.transitBoardMarker;
+const TransitWalkMarker = imports.transitWalkMarker;
+
+/* stroke color for walking paths */
+const _STROKE_COLOR = new Clutter.Color({ red: 0,
+ blue: 0,
+ green: 0,
+ alpha: 255 });
+const _STROKE_WIDTH = 5.0;
+
+/* All following constants are ratios of surface size to page size */
+const _Header = {
+ SCALE_X: 0.9,
+ SCALE_Y: 0.03,
+ SCALE_MARGIN: 0.01
+};
+const _MapView = {
+ SCALE_X: 1.0,
+ SCALE_Y: 0.4,
+ SCALE_MARGIN: 0.04,
+ ZOOM_LEVEL: 18
+};
+
+const TransitPrintLayout = new Lang.Class({
+ Name: 'TransitPrintLayout',
+ Extends: PrintLayout.PrintLayout,
+
+ _init: function(params) {
+ this._itinerary = params.itinerary;
+ delete params.itinerary;
+
+ params.totalSurfaces = this._getNumberOfSurfaces();
+
+ this.parent(params);
+ },
+
+ _getNumberOfSurfaces: function() {
+ /* always one fixed surface for the title label */
+ let numSurfaces = 1;
+
+ this._itinerary.legs.forEach((function (leg) {
+ if (!leg.transit)
+ numSurfaces++;
+ }));
+
+ return numSurfaces;
+ },
+
+ _drawMapView: function(width, height, zoomLevel, leg, nextLeg) {
+ let pageNum = this.numPages - 1;
+ let x = this._cursorX;
+ let y = this._cursorY;
+ let mapSource = MapSource.createPrintSource();
+ let markerLayer = new Champlain.MarkerLayer();
+ let view = new Champlain.View({ width: width,
+ height: height,
+ zoom_level: zoomLevel });
+ view.set_map_source(mapSource);
+ /* we want to add the path layer before the marker layer, so that
+ * boarding marker are drawn about the walk dash lines */
+ this._addRouteLayer(view, leg);
+ view.add_layer(markerLayer);
+
+ markerLayer.add_marker(this._createStartMarker(leg));
+ if (nextLeg)
+ markerLayer.add_marker(this._createBoardMarker(nextLeg));
+ else
+ markerLayer.add_marker(this._createArrivalMarker(leg));
+
+ /* in some cases, we seem to get get zero distance walking instructions
+ * within station complexes, don't try to show a bounding box in this
+ * case, instead center on the spot */
+ if (leg.distance === 0)
+ view.center_on(leg.fromCoordinate[0], leg.fromCoordinate[1]);
+ else
+ view.ensure_visible(leg.bbox, false);
+ if (view.state !== Champlain.State.DONE) {
+ let notifyId = view.connect('notify::state', (function() {
+ if (view.state === Champlain.State.DONE) {
+ view.disconnect(notifyId);
+ let surface = view.to_surface(true);
+ if (surface)
+ this._addSurface(surface, x, y, pageNum);
+ }
+ }).bind(this));
+ } else {
+ let surface = view.to_surface(true);
+ if (surface)
+ this._addSurface(surface, x, y, pageNum);
+ }
+ },
+
+ _createStartMarker: function(leg) {
+ return new TransitWalkMarker.TransitWalkMarker({ leg: leg });
+ },
+
+ _createBoardMarker: function(leg) {
+ return new TransitBoardMarker.TransitBoardMarker({ leg: leg });
+ },
+
+ _createArrivalMarker: function(leg) {
+ return new TransitArrivalMarker.TransitArrivalMarker({ leg: leg });
+ },
+
+ _addRouteLayer: function(view, leg) {
+ let routeLayer = new Champlain.PathLayer({ stroke_width: _STROKE_WIDTH,
+ stroke_color: _STROKE_COLOR });
+ routeLayer.set_dash([5, 5]);
+ view.add_layer(routeLayer);
+ leg.polyline.forEach(routeLayer.add_node.bind(routeLayer));
+ },
+
+ render: function() {
+ let headerWidth = _Header.SCALE_X * this._pageWidth;
+ let headerHeight = _Header.SCALE_Y * this._pageHeight;
+ let headerMargin = _Header.SCALE_MARGIN * this._pageHeight;
+
+ let mapViewWidth = _MapView.SCALE_X * this._pageWidth;
+ let mapViewHeight = _MapView.SCALE_Y * this._pageHeight;
+ let mapViewMargin = _MapView.SCALE_MARGIN * this._pageHeight;
+ let mapViewZoomLevel = _MapView.ZOOM_LEVEL;
+
+ let dy = headerHeight + headerMargin;
+
+ this._createNewPage();
+ this._adjustPage(dy);
+ this._drawHeader(headerWidth, headerHeight);
+ this._cursorY += dy;
+
+ for (let i = 0; i < this._itinerary.legs.length; i++) {
+ let leg = this._itinerary.legs[i];
+ if (!leg.transit) {
+ let nextLeg = i < this._itinerary.legs.length - 1 ?
+ this._itinerary.legs[i + 1] : null;
+ dy = mapViewHeight + mapViewMargin;
+ this._adjustPage(dy);
+ this._drawMapView(mapViewWidth, mapViewHeight, mapViewZoomLevel,
+ leg, nextLeg);
+ this._cursorY += dy;
+ }
+ }
+ }
+});
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]