/* -*- Mode: JS2; indent-tabs-mode: nil; js2-basic-offset: 4 -*- */ /* vim: set et ts=4 sw=4: */ /* * Copyright (c) 2014 Damián Nohales * * 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: Damián Nohales */ const Gio = imports.gi.Gio; const GLib = imports.gi.GLib; const GObject = imports.gi.GObject; const Gtk = imports.gi.Gtk; const Mainloop = imports.mainloop; const Application = imports.application; const Place = imports.place; const PlaceStore = imports.placeStore; const SendToDialog = imports.sendToDialog; const Utils = imports.utils; var Button = { NONE: 0, ROUTE: 2, SEND_TO: 4, FAVORITE: 8, CHECK_IN: 16 }; var MapBubble = GObject.registerClass({ Abstract: true }, class MapBubble extends Gtk.Popover { _init(params) { this._place = params.place; delete params.place; this._mapView = params.mapView; params.relative_to = params.mapView; params.transitions_enabled = false; delete params.mapView; let buttonFlags = params.buttons || Button.NONE; delete params.buttons; let routeFrom = params.routeFrom; delete params.routeFrom; let checkInMatchPlace = params.checkInMatchPlace; if (checkInMatchPlace !== false) checkInMatchPlace = true; delete params.checkInMatchPlace; params.modal = false; super._init(params); let ui = Utils.getUIObject('map-bubble', [ 'bubble-main-grid', 'bubble-image', 'bubble-thumbnail', 'bubble-icon-stack', 'bubble-content-area', 'bubble-button-area', 'bubble-route-button', 'bubble-send-to-button', 'bubble-favorite-button', 'bubble-check-in-button', 'bubble-favorite-button-image']); this._image = ui.bubbleImage; this._thumbnail = ui.bubbleThumbnail; this._iconStack = ui.bubbleIconStack; this._content = ui.bubbleContentArea; if (!buttonFlags) ui.bubbleButtonArea.visible = false; else { if (buttonFlags & Button.ROUTE) this._initRouteButton(ui.bubbleRouteButton, routeFrom); if (buttonFlags & Button.SEND_TO) this._initSendToButton(ui.bubbleSendToButton); if (buttonFlags & Button.FAVORITE) this._initFavoriteButton(ui.bubbleFavoriteButton, ui.bubbleFavoriteButtonImage); if (buttonFlags & Button.CHECK_IN) this._initCheckInButton(ui.bubbleCheckInButton, checkInMatchPlace); } this.add(ui.bubbleMainGrid); } get image() { return this._image; } get thumbnail() { return this._thumbnail; } get iconStack() { return this._iconStack; } get place() { return this._place; } get content() { return this._content; } _initFavoriteButton(button, image) { let placeStore = Application.placeStore; button.visible = true; if (placeStore.exists(this._place, PlaceStore.PlaceType.FAVORITE)) { image.icon_name = 'starred-symbolic'; } else { image.icon_name = 'non-starred-symbolic'; } button.connect('clicked', () => { if (placeStore.exists(this._place, PlaceStore.PlaceType.FAVORITE)) { image.icon_name = 'non-starred-symbolic'; placeStore.removePlace(this._place, PlaceStore.PlaceType.FAVORITE); } else { image.icon_name = 'starred-symbolic'; placeStore.addPlace(this._place, PlaceStore.PlaceType.FAVORITE); } }); } _initSendToButton(button) { button.visible = true; button.connect('clicked', () => { let dialog = new SendToDialog.SendToDialog({ transient_for: this.get_toplevel(), modal: true, mapView: this._mapView, place: this._place }); dialog.connect('response', () => dialog.destroy()); dialog.show(); }); } _initRouteButton(button, routeFrom) { let query = Application.routeQuery; let from = query.points[0]; let to = query.points[query.points.length - 1]; button.visible = true; button.connect('clicked', () => { query.freeze_notify(); query.reset(); Application.routingDelegator.reset(); if (routeFrom) { from.place = this._place; } else { if (Application.geoclue.place) from.place = Application.geoclue.place; to.place = this._place; } this.destroy(); query.thaw_notify(); }); } _initCheckInButton(button, matchPlace) { Application.checkInManager.bind_property('hasCheckIn', button, 'visible', GObject.BindingFlags.DEFAULT | GObject.BindingFlags.SYNC_CREATE); button.connect('clicked', () => { Application.checkInManager.showCheckInDialog(this.get_toplevel(), this.place, matchPlace); }); } });