/* -*- 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 */ import GLib from 'gi://GLib'; import Gtk from 'gi://Gtk'; import {Application} from './application.js'; import {LongPrintLayout} from './longPrintLayout.js'; import {ShortPrintLayout} from './shortPrintLayout.js'; import {TransitPrintLayout} from './transitPrintLayout.js'; import * as Utils from './utils.js'; const _MIN_TIME_TO_ABORT = 3000; /* Following constant has unit as meters */ const _SHORT_LAYOUT_MAX_DISTANCE = 3000; export class PrintOperation { constructor({mainWindow}) { this._mainWindow = mainWindow; this._operation = new Gtk.PrintOperation({ embed_page_setup: true }); this._operation.connect('begin-print', this._beginPrint.bind(this)); this._operation.connect('paginate', this._paginate.bind(this)); this._operation.connect('draw-page', this._drawPage.bind(this)); this._abortDialog = new Gtk.MessageDialog({ transient_for: this._mainWindow, destroy_with_parent: true, message_type: Gtk.MessageType.OTHER, modal: true, text: _("Loading map tiles for printing"), secondary_text: _("You can abort printing if this takes too long") }); this._abortDialog.add_button(_("Abort printing"), Gtk.ResponseType.CANCEL); this._responseId = this._abortDialog.connect('response', this.onAbortDialogResponse.bind(this)); this._runPrintOperation(); } _beginPrint(operation, context, data) { let route = Application.routingDelegator.graphHopper.route; let selectedTransitItinerary = Application.routingDelegator.transitRouter.plan.selectedItinerary; let width = context.get_width(); let height = context.get_height(); if (selectedTransitItinerary) { this._layout = new TransitPrintLayout({ itinerary: selectedTransitItinerary, pageWidth: width, pageHeight: height, mainWindow: this._mainWindow }); } else { // TODO: for now just use short layout, as we don't have minimaps this._layout = new ShortPrintLayout({ route: route, pageWidth: width, pageHeight: height, mainWindow: this._mainWindow }); /* if (route.distance > _SHORT_LAYOUT_MAX_DISTANCE) { this._layout = new LongPrintLayout({ route: route, pageWidth: width, pageHeight: height, mainWindow: this._mainWindow }); } else { this._layout = new ShortPrintLayout({ route: route, pageWidth: width, pageHeight: height, mainWindow: this._mainWindow }); } */ } GLib.timeout_add(null, _MIN_TIME_TO_ABORT, () => { if (!this._layout.renderFinished) { this._abortDialog.show(); } return false; }); this._layout.render(); } onAbortDialogResponse(dialog, response) { if (response === Gtk.ResponseType.DELETE_EVENT || response === Gtk.ResponseType.CANCEL) { this._abortDialog.disconnect(this._responseId); this._operation.cancel(); this._abortDialog.close(); } } _paginate(operation, context) { if (this._layout) { if (this._layout.renderFinished) { operation.set_n_pages(this._layout.numPages); this._abortDialog.close(); } return this._layout.renderFinished; } else { return false; } } _drawPage(operation, context, page_num, data) { let cr = context.get_cairo_context(); this._layout.surfaceObjects[page_num].forEach((so) => { cr.setSourceSurface(so.surface, so.x, so.y); cr.paint(); }); } _runPrintOperation() { try { let result = this._operation.run(Gtk.PrintOperationAction.PRINT_DIALOG, this._mainWindow); if (result === Gtk.PrintOperationResult.ERROR) { let error = this._operation.get_error(); Utils.debug('Failed to print: %s'.format(error)); } } catch(e) { Utils.debug('Failed to print: %s'.format(e.message)); } } }