[gnome-maps/wip/mlundblad/maps-uri: 1/3] WIP: application: Handle maps: URIs




commit 9db3371daab9b18c9dc78014c8642d38b9fcc049
Author: Marcus Lundblad <ml update uu se>
Date:   Fri Oct 29 23:07:09 2021 +0200

    WIP: application: Handle maps: URIs

 src/application.js | 50 ++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 48 insertions(+), 2 deletions(-)
---
diff --git a/src/application.js b/src/application.js
index 5985c87c..8fc776cc 100644
--- a/src/application.js
+++ b/src/application.js
@@ -33,6 +33,7 @@ const CheckIn = imports.checkIn;
 const ContactPlace = imports.contactPlace;
 const Format = imports.format;
 const Geoclue = imports.geoclue;
+const GeocodeFactory = imports.geocode;
 const MainWindow = imports.mainWindow;
 const Maps = imports.gi.GnomeMaps;
 const OSMEdit = imports.osmEdit;
@@ -42,6 +43,7 @@ const RoutingDelegator = imports.routingDelegator;
 const RouteQuery = imports.routeQuery;
 const Settings = imports.settings;
 const Utils = imports.utils;
+const URIS = imports.uris;
 
 // used globally
 var application = null;
@@ -311,16 +313,60 @@ var Application = GObject.registerClass({
         let scheme = GLib.uri_parse_scheme(uri);
 
         if (scheme === 'geo') {
-            /* we get an uri that looks like geo:///lat,lon, remove slashes */
+            // we get a URI that looks like geo:///lat,lon, remove slashes
             let geoURI = uri.replace(/\//g, '');
             this._mainWindow.mapView.goToGeoURI(geoURI);
         } else if (scheme === 'http' || scheme === 'https') {
             this._mainWindow.mapView.goToHttpURL(uri);
+        } else if (scheme === 'maps') {
+            // we get a URI that looks like maps:///q=Search, remove slashes
+            let mapsURI = uri.replace(/\//g, '');
+            this._openMapsUri(mapsURI);
         } else {
             this._mainWindow.mapView.openShapeLayers(files);
         }
     }
 
+    _openMapsUri(uri) {
+        let query = URIS.parseMapsURI(uri);
+
+        if (query)
+            this._openMapsUriQuery(query);
+        else
+            this._invalidMapsUri(uri);
+    }
+
+    _openMapsUriQuery(query) {
+        let cancellable = new Gio.Cancellable();
+
+        this.connect('shutdown', () => cancellable.cancel());
+        GeocodeFactory.getGeocoder().search(query, null, null, cancellable,
+                                            (places, error) => {
+            if (error) {
+                Utils.showDialog(_("An error has occurred"),
+                                 Gtk.MessageType.ERROR, this._mainWindow);
+            } else {
+                // clear search entry
+                this._mainWindow.placeEntry.text = '';
+
+                /* if there's only one place in results, show it directly
+                 * with it's bubble, otherwise present the results in the
+                 * search popover
+                 */
+                if (places?.length === 1)
+                    this._mainWindow.mapView.showPlace(places[0], true);
+                else
+                    this._mainWindow.placeEntry.updateResults(places, query,
+                                                              false);
+            }
+        });
+    }
+
+    _invalidMapsUri(uri) {
+        Utils.showDialog(_("Invalid maps: URI: %s").format(uri),
+                         Gtk.MessageType.ERROR, this._mainWindow);
+    }
+
     vfunc_open(files) {
         normalStartup = false;
         this.activate();
@@ -363,7 +409,7 @@ var Application = GObject.registerClass({
                 let path = r.get_string()[0];
 
                 if (path.startsWith('geo:') || path.startsWith('http://') ||
-                    path.startsWith('https://')) {
+                    path.startsWith('https://') || path.startsWith('maps:')) {
                     files.push(Gio.File.new_for_uri(path));
                 } else {
                     files.push(Gio.File.new_for_path(path));


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]