/* -*- Mode: JS2; indent-tabs-mode: nil; js2-basic-offset: 4 -*- */ /* vim: set et ts=4 sw=4: */ /* * 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 . * * Author: Amisha Singla */ const GObject = imports.gi.GObject; const PrintLayout = imports.printLayout; const Route = imports.route; const _NUM_MINIMAPS = 5; /* All following constants are ratios of surface size to page size */ const _Instruction = { SCALE_X: 0.57, SCALE_Y: 0.07, SCALE_MARGIN: 0.01 }; const _MiniMapView = { SCALE_X: 0.4, SCALE_Y: 0.20, SCALE_MARGIN: 0.03, ZOOM_LEVEL: 18 }; var LongPrintLayout = GObject.registerClass( class LongPrintLayout extends PrintLayout.PrintLayout { _init(params) { this._route = params.route; delete params.route; /* (Header + 3 maps) + instructions */ let totalSurfaces = 4 + this._route.turnPoints.length; /* Plus via points */ this._route.turnPoints.forEach((turnPoint) => { if (turnPoint.type === Route.TurnPointType.VIA) totalSurfaces++; }); params.totalSurfaces = totalSurfaces; super._init(params); } render() { super.render(); let instructionWidth = _Instruction.SCALE_X * this._pageWidth; let instructionHeight = _Instruction.SCALE_Y * this._pageHeight; let instructionMargin = _Instruction.SCALE_MARGIN * this._pageHeight; let miniMapViewWidth = _MiniMapView.SCALE_X * this._pageWidth; let miniMapViewHeight = _MiniMapView.SCALE_Y * this._pageHeight; let miniMapViewMargin = _MiniMapView.SCALE_MARGIN * this._pageHeight; let miniMapViewZoomLevel = _MiniMapView.ZOOM_LEVEL; let dy = 0; let pointsLength = this._route.turnPoints.length; /* Fixed number of locations are plotted on minimaps which requires a * check on instructions bound. Later on this can be made dynamic * depending upon factors like total number of instructions, complexity * of neighbourhood areas, etc. * * We currently have maps besides the instructions for: * - the start location * - via points in the route * - the end location * * We include _NUM_MINIMAPS instructions per map, and have the map * ensure the bounding box of those instructions. * * For the start location we include _NUM_MINIMAPS number of * instruction, if available, from start. * * For via points we include _NUM_MINIMAPS / 2 number of instructions * before and _NUM_MINIMAPS / 2 number of instructions after the * via point. * * For the end location we include _NUM_MINIMAPS number of instructions * leading up to the end location. * */ let first = 0; let last = Math.min(_NUM_MINIMAPS, pointsLength); let points = this._createTurnPointArray(first, last); this._drawMapView(miniMapViewWidth, miniMapViewHeight, miniMapViewZoomLevel, points); /* x-cursor is increased temporarily for rendering instructions */ let tmpX = this._cursorX; for (let i = 0; i < this._route.turnPoints.length; i++) { let turnPoint = this._route.turnPoints[i]; dy = instructionHeight + instructionMargin; this._adjustPage(dy); this._cursorX = tmpX + miniMapViewWidth + miniMapViewMargin; this._drawInstruction(instructionWidth, instructionHeight, turnPoint); this._cursorY += dy; if (turnPoint.type === Route.TurnPointType.VIA) { let tmpY = this._cursorY; first = Math.max(0, (i + 1) - (_NUM_MINIMAPS / 2)); last = Math.min((i + 1) + (_NUM_MINIMAPS / 2), pointsLength); points = this._createTurnPointArray(Math.floor(first), Math.floor(last)); this._cursorX = tmpX; this._cursorY = Math.max(0, this._cursorY - miniMapViewHeight); this._drawMapView(miniMapViewWidth, miniMapViewHeight, miniMapViewZoomLevel, points); this._cursorY = tmpY; } } this._cursorX = tmpX; first = Math.max(0, pointsLength - _NUM_MINIMAPS); last = pointsLength; points = this._createTurnPointArray(first, last); this._cursorY = Math.max(0, this._cursorY - miniMapViewHeight); this._drawMapView(miniMapViewWidth, miniMapViewHeight, miniMapViewZoomLevel, points); } });