/* -*- 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: Hashem Nasarat
*/
import Gio from 'gi://Gio';
import GObject from 'gi://GObject';
import Gtk from 'gi://Gtk';
import Shumate from 'gi://Shumate';
import {GeoJSONSource} from './geoJSONSource.js';
import * as Utils from './utils.js';
export class ShapeLayer extends GObject.Object {
static mimeTypes = [];
static displayName = '';
static SUPPORTED_TYPES = [];
static newFromFile(file, mapView) {
let contentType = Gio.content_type_guess(file.get_uri(), null)[0];
for (let layerClass of ShapeLayer.SUPPORTED_TYPES) {
if (layerClass.mimeTypes.indexOf(contentType) > -1) {
return layerClass.createInstance({ file: file, mapView: mapView });
}
}
return null;
}
constructor(params) {
super();
this._visible = true;
this._mapView = params.mapView;
this.file = params.file;
this.filename = this.file.query_info(
Gio.FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME,
Gio.FileQueryInfoFlags.NONE,
null
).get_attribute_string(Gio.FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME);
this._markerLayer = new Shumate.MarkerLayer({
selection_mode: Gtk.SelectionMode.SINGLE,
viewport: this._mapView.map.viewport
});
this._mapSource = new GeoJSONSource({ mapView: this._mapView,
markerLayer: this._markerLayer });
this._overlayLayer =
new Shumate.MapLayer({ map_source: this._mapSource,
viewport: this._mapView.map.viewport });
this._zoomId = this._mapView.map.viewport.connect('notify::zoom-level', () => {
let oldOverlayLayer = this._overlayLayer;
this._overlayLayer =
new Shumate.MapLayer({ map_source: this._mapSource,
viewport: this._mapView.map.viewport });
this._overlayLayer.visible = this._visible;
this._mapView.map.add_layer(this._overlayLayer);
this._mapView.map.remove_layer(oldOverlayLayer);
});
}
get bbox() {
return this._mapSource.bbox;
}
get visible() {
return this._visible;
}
set visible(v) {
this._overlayLayer.visible = v;
this._markerLayer.visible = v;
this._visible = v;
}
getName() {
/*
* Remove file extension and use that in lieu of a fileformat-specific
* display name.
*/
return this.filename.replace(/\.[^\.]+$/, '');
}
load(callback, bbox) {
this.file.load_contents_async(null, (sourceObject, result) => {
let error = false;
try {
let [status, buffer] = this.file.load_contents_finish(result);
this._fileContents = buffer;
if (!status)
throw new Error(_("failed to load file"));
this._parseContent();
this._mapView.map.add_layer(this._markerLayer);
this._mapView.map.add_layer(this._overlayLayer);
} catch (e) {
Utils.debug(e);
error = true;
}
callback(error, bbox, this);
});
}
_parseContent() {
/* Unimplemented */
}
unload() {
this._mapView.map.remove_layer(this._markerLayer);
this._mapView.map.remove_layer(this._overlayLayer);
this._mapView.map.viewport.disconnect(this._zoomId);
}
}
GObject.registerClass({
Abstract: true
}, ShapeLayer);