emacs-elpa-diffs
[Top][All Lists]
Advanced

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

[elpa] externals/osm 3208952f8d 2/2: Refactor, store map coordinates as


From: ELPA Syncer
Subject: [elpa] externals/osm 3208952f8d 2/2: Refactor, store map coordinates as latitude/longitude
Date: Sun, 20 Mar 2022 13:57:38 -0400 (EDT)

branch: externals/osm
commit 3208952f8d089cb39d68e72130b39647663067de
Author: Daniel Mendler <mail@daniel-mendler.de>
Commit: Daniel Mendler <mail@daniel-mendler.de>

    Refactor, store map coordinates as latitude/longitude
---
 README.org |   7 +-
 osm.el     | 348 ++++++++++++++++++++++++++++++-------------------------------
 2 files changed, 174 insertions(+), 181 deletions(-)

diff --git a/README.org b/README.org
index 5ee62d7966..700b0a9234 100644
--- a/README.org
+++ b/README.org
@@ -106,14 +106,14 @@ Key bindings in =osm-mode= buffer:
 - ~C-<arrow>~, ~M-<arrow>~: Large step scrolling
 - ~+~, ~SPC~: =osm-zoom-in= - Zoom in
 - ~-~, ~S-SPC~: =osm-zoom-out= - Zoom out
-- ~<mouse-1>~: =osm-center-click= - Center to point
+- ~<mouse-1>~: =osm-transient-click= - Place transient pin at point
 - ~<mouse-2>~: =osm-org-link-click= - Store point as Org link
 - ~<mouse-3>~: =osm-bookmark-set-click= - Store point as bookmark
 - ~<osm-bookmark mouse-*>~: =osm-bookmark-delete-click= - Click on bookmark at 
point to delete
 - ~<down-mouse-*>~: =osm-mouse-drag= - Drag the map with the mouse
 - ~d~, ~DEL~: =osm-bookmark-delete= - Delete selected bookmark
-- ~n~: =osm-bookmark-rename= - Rename selected bookmark
 - ~t~: =osm-goto= - Go to location
+- ~c~: =osm-center= - Center to currently marked pin
 - ~h~: =osm-home= - Go to home location
 - ~s~: =osm-search= - Search for location
 - ~v~: =osm-server= - Select tile server
@@ -122,9 +122,10 @@ Key bindings in =osm-mode= buffer:
 - ~l~: =org-store-link= - Store org link
 - ~e~: =osm-elisp-link= - Store Elisp link in the kill ring
 - ~b~: =osm-bookmark-set= - Set bookmark
+- ~n~: =osm-bookmark-rename= - Rename selected bookmark
 - ~j~: =osm-bookmark-jump= - Jump to bookmark
 - ~q~: =quit-window= - Close buffer and window
-- ~c~: =clone-buffer= - Clone buffer
+- ~o~: =clone-buffer= - Clone buffer
 
 * Related projects
 
diff --git a/osm.el b/osm.el
index 423366b38c..23e1b03139 100644
--- a/osm.el
+++ b/osm.el
@@ -144,11 +144,12 @@
 
 (defcustom osm-pin-colors
   '((osm-selected-bookmark "#e20" "#600")
+    (osm-selected-poi "#e20" "#600")
     (osm-bookmark "#f80" "#820")
-    (osm-center "#08f" "#028")
+    (osm-transient "#08f" "#028")
     (osm-home "#80f" "#208")
     (osm-poi "#88f" "#228")
-    (osm-org-link "#7a9" "#254"))
+    (osm-link "#7a9" "#254"))
   "Colors of pins."
   :type '(alist :key-type symbol :value-type (list string string)))
 
@@ -239,9 +240,10 @@ Should be at least 7 days according to the server usage 
policies."
   (let ((map (make-sparse-keymap)))
     (define-key map [menu-bar osm--menu] (osm--menu-item osm--menu))
     (define-key map [osm-home] #'ignore)
-    (define-key map [osm-org-link] #'ignore)
-    (define-key map [osm-center] #'ignore)
+    (define-key map [osm-link] #'ignore)
+    (define-key map [osm-transient] #'ignore)
     (define-key map [osm-selected-bookmark] #'ignore)
+    (define-key map [osm-selected-poi] #'ignore)
     (define-key map [osm-bookmark mouse-1] #'osm-bookmark-select-click)
     (define-key map [osm-bookmark mouse-2] #'osm-bookmark-select-click)
     (define-key map [osm-bookmark mouse-3] #'osm-bookmark-select-click)
@@ -253,7 +255,7 @@ Should be at least 7 days according to the server usage 
policies."
     (define-key map "-" #'osm-zoom-out)
     (define-key map " " #'osm-zoom-in)
     (define-key map (kbd "S-SPC") #'osm-zoom-out)
-    (define-key map [mouse-1] #'osm-center-click)
+    (define-key map [mouse-1] #'osm-transient-click)
     (define-key map [mouse-2] #'osm-org-link-click)
     (define-key map [mouse-3] #'osm-bookmark-set-click)
     (define-key map [down-mouse-1] #'osm-mouse-drag)
@@ -274,7 +276,8 @@ Should be at least 7 days according to the server usage 
policies."
     (define-key map "n" #'osm-bookmark-rename)
     (define-key map "d" #'osm-bookmark-delete)
     (define-key map "\d" #'osm-bookmark-delete)
-    (define-key map "c" #'clone-buffer)
+    (define-key map "c" #'osm-center)
+    (define-key map "o" #'clone-buffer)
     (define-key map "h" #'osm-home)
     (define-key map "t" #'osm-goto)
     (define-key map "s" #'osm-search)
@@ -343,11 +346,11 @@ Should be at least 7 days according to the server usage 
policies."
 (defvar-local osm--zoom nil
   "Zoom level of the map.")
 
-(defvar-local osm--x nil
-  "Y coordinate on the map in pixel.")
+(defvar-local osm--lat nil
+  "Latitude coordinate.")
 
-(defvar-local osm--y nil
-  "X coordinate on the map in pixel.")
+(defvar-local osm--lon nil
+  "Longitude coordinate.")
 
 (defvar-local osm--overlay-table nil
   "Overlay hash table.")
@@ -400,14 +403,6 @@ Should be at least 7 days according to the server usage 
policies."
   (setq y (* float-pi (- 1 (* 2 (/ y 256.0 (expt 2.0 zoom))))))
   (/ (* 180 (atan (/ (- (exp y) (exp (- y))) 2))) float-pi))
 
-(defun osm--lon ()
-  "Return longitude in degrees."
-  (osm--x-to-lon osm--x osm--zoom))
-
-(defun osm--lat ()
-  "Return latitude in degrees."
-  (osm--y-to-lat osm--y osm--zoom))
-
 (defun osm--lon-to-x (lon zoom)
   "Convert LON/ZOOM to x coordinate in pixel."
   (floor (* 256 (expt 2.0 zoom) (osm--lon-to-normalized-x lon))))
@@ -416,6 +411,22 @@ Should be at least 7 days according to the server usage 
policies."
   "Convert LAT/ZOOM to y coordinate in pixel."
   (floor (* 256 (expt 2.0 zoom) (osm--lat-to-normalized-y lat))))
 
+(defsubst osm--x ()
+  "Return longitude in pixel of map center."
+  (osm--lon-to-x osm--lon osm--zoom))
+
+(defsubst osm--y ()
+  "Return latitude in pixel of map center."
+  (osm--lat-to-y osm--lat osm--zoom))
+
+(defsubst osm--x0 ()
+  "Return longitude in pixel of top left corner."
+  (- (osm--x) osm--wx))
+
+(defsubst osm--y0 ()
+  "Return latitude in pixel of top left corner."
+  (- (osm--y) osm--wy))
+
 (defun osm--server-property (prop &optional server)
   "Return server property PROP for SERVER."
   (or (plist-get (alist-get (or server osm-server) osm-server-list) prop)
@@ -490,8 +501,8 @@ Should be at least 7 days according to the server usage 
policies."
   (pcase-let ((`(,sx . ,sy) (posn-x-y (event-start event)))
               (win (selected-window))
               (map (make-sparse-keymap)))
-    (cl-incf sx osm--x)
-    (cl-incf sy osm--y)
+    (cl-incf sx (osm--x))
+    (cl-incf sy (osm--y))
     (define-key map [mouse-movement]
       (lambda (event)
         (interactive "e")
@@ -504,8 +515,7 @@ Should be at least 7 days according to the server usage 
policies."
           (define-key map [drag-mouse-2] #'ignore)
           (define-key map [drag-mouse-3] #'ignore)
           (pcase-let ((`(,ex . ,ey) (posn-x-y event)))
-            (setq osm--x (- sx ex)
-                  osm--y (- sy ey))
+            (osm--move-to (- sx ex) (- sy ey))
             (osm--update)))))
     (setq track-mouse 'dragging)
     (set-transient-map map
@@ -516,71 +526,63 @@ Should be at least 7 days according to the server usage 
policies."
   "Zoom in with the mouse wheel."
   (pcase-let ((`(,x . ,y) (posn-x-y (event-start last-input-event))))
     (when (< osm--zoom (osm--server-property :max-zoom))
-      (cl-incf osm--x (/ (- x osm--wx) 2))
-      (cl-incf osm--y (/ (- y osm--wy) 2))
+      (osm--move-by (/ (- x osm--wx) 2) (/ (- y osm--wy) 2))
       (osm-zoom-in))))
 
 (defun osm--zoom-out-wheel (_n)
   "Zoom out with the mouse wheel."
   (pcase-let ((`(,x . ,y) (posn-x-y (event-start last-input-event))))
     (when (> osm--zoom (osm--server-property :min-zoom))
-      (cl-decf osm--x (- x osm--wx))
-      (cl-decf osm--y (- y osm--wy))
+      (osm--move-by (- osm--wx x) (- osm--wy y))
       (osm-zoom-out))))
 
-(defun osm-center-click (event)
-  "Center to the location of the click EVENT."
-  (interactive "e")
-  (pcase-let ((`(,x . ,y) (posn-x-y (event-start event))))
-    (when (< osm--zoom (osm--server-property :max-zoom))
-      (cl-incf osm--x (- x osm--wx))
-      (cl-incf osm--y (- y osm--wy))
-      (osm--put-transient-pin 'osm-center osm--x osm--y "Center")
-      (osm--update))))
+(defun osm-center ()
+  "Center to location of transient pin."
+  (interactive)
+  (when osm--transient-pin
+    (setq osm--lat (car osm--transient-pin)
+          osm--lon (cadr osm--transient-pin))
+    (osm--update)))
+
+(defun osm-transient-click (event)
+  "Put a transient pin at location of the click EVENT."
+  (interactive "@e")
+  (osm--put-transient-pin-event event 'osm-transient "Transient")
+  (osm--update))
 
 (defun osm-bookmark-set-click (event)
   "Create bookmark at position of click EVENT."
   (interactive "@e")
-  (pcase-let ((`(,x . ,y) (posn-x-y (event-start event))))
-    (osm--put-transient-pin 'osm-selected-bookmark
-                            (+ osm--x (- x osm--wx))
-                            (+ osm--y (- y osm--wy))
-                            "New bookmark")
-    (osm-bookmark-set)))
+  (osm--put-transient-pin-event event 'osm-selected-bookmark "New bookmark")
+  (osm-bookmark-set))
 
 (defun osm-org-link-click (event)
   "Store link at position of click EVENT."
   (interactive "@e")
-  (pcase-let ((`(,x . ,y) (posn-x-y (event-start event))))
-    (osm--put-transient-pin 'osm-org-link
-                            (+ osm--x (- x osm--wx))
-                            (+ osm--y (- y osm--wy))
-                            "New Org Link")
-    (call-interactively 'org-store-link)))
+  (osm--put-transient-pin-event event 'osm-link "New Org Link")
+  (call-interactively 'org-store-link))
 
 (defun osm--pin-at (type x y)
   "Get pin of TYPE at X/Y."
-  (let ((x (+ osm--x (- x osm--wx)))
-        (y (+ osm--y (- y osm--wy)))
+  (let ((x (+ (osm--x0) x))
+        (y (+ (osm--y0) y))
         (min most-positive-fixnum)
         found)
     (dolist (pin (car (osm--get-overlays (/ x 256) (/ y 256))))
-      (pcase-let ((`(,p ,q ,id . ,_) pin))
+      (pcase-let ((`(,p ,q ,_lat ,_lon ,id . ,_) pin))
         (when (eq type id)
           (let ((d (+ (* (- p x) (- p x)) (* (- q y) (- q y)))))
             (when (and (>= q y) (< q (+ y 50)) (>= p (- x 20)) (< p (+ x 20)) 
(< d min))
               (setq min d found pin))))))
-    found))
+    (cddr found)))
 
 (defun osm-bookmark-select-click (event)
   "Select bookmark at position of click EVENT."
   (interactive "@e")
   (pcase-let* ((`(,x . ,y) (posn-x-y (event-start event))))
     (when-let (pin (osm--pin-at 'osm-bookmark x y))
+      (osm--put-transient-pin 'osm-selected-bookmark (car pin) (cadr pin) 
(cdddr pin))
       (message "%s" (cdddr pin))
-      (osm--put-transient-pin 'osm-selected-bookmark
-                              (car pin) (cadr pin)
-                              (cdddr pin))
       (osm--update))))
 
 (defun osm-poi-click (event)
@@ -588,38 +590,17 @@ Should be at least 7 days according to the server usage 
policies."
   (interactive "@e")
   (pcase-let* ((`(,x . ,y) (posn-x-y (event-start event))))
     (when-let (pin (osm--pin-at 'osm-poi x y))
+      (osm--put-transient-pin 'osm-selected-poi (car pin) (cadr pin) (cdddr 
pin))
       (message "%s" (cdddr pin))
-      (osm--goto
-       (list
-        (osm--y-to-lat (cadr pin) osm--zoom)
-        (osm--x-to-lon (car pin) osm--zoom)
-        osm--zoom)
-       nil))))
+      (osm--update))))
 
 (defun osm-zoom-in (&optional n)
   "Zoom N times into the map."
   (interactive "p")
   (osm--barf-unless-osm)
-  (setq n (- (max (osm--server-property :min-zoom)
-                  (min (osm--server-property :max-zoom)
-                       (+ osm--zoom (or n 1))))
-             osm--zoom)
-        osm--zoom (+ osm--zoom n))
-  (cond
-   ((< n 0)
-    (setq n (lsh 1 (- n)))
-    (when osm--transient-pin
-      (setf (car osm--transient-pin) (/ (car osm--transient-pin) n)
-            (cadr osm--transient-pin) (/ (cadr osm--transient-pin) n)))
-    (setq osm--x (/ osm--x n)
-          osm--y (/ osm--y n)))
-   ((> n 0)
-    (setq n (lsh 1 n))
-    (when osm--transient-pin
-      (setf (car osm--transient-pin) (* (car osm--transient-pin) n)
-            (cadr osm--transient-pin) (* (cadr osm--transient-pin) n)))
-    (setq osm--x (* osm--x n)
-          osm--y (* osm--y n))))
+  (setq osm--zoom (max (osm--server-property :min-zoom)
+                       (min (osm--server-property :max-zoom)
+                            (+ osm--zoom (or n 1)))))
   (osm--update))
 
 (defun osm-zoom-out (&optional n)
@@ -627,24 +608,27 @@ Should be at least 7 days according to the server usage 
policies."
   (interactive "p")
   (osm-zoom-in (- (or n 1))))
 
-(defun osm--move (dx dy step)
-  "Move by DX/DY with STEP size."
+(defun osm--move-by (dx dy)
+  "Move by DX/DY."
+  (osm--move-to (+ (osm--x) dx) (+ (osm--y) dy)))
+
+(defun osm--move-to (x y)
+  "Move to X/Y."
   (osm--barf-unless-osm)
-  (setq osm--x (min (* 256 (1- (expt 2 osm--zoom)))
-                    (max 0 (+ osm--x (* dx step))))
-        osm--y (min (* 256 (1- (expt 2 osm--zoom)))
-                    (max 0 (+ osm--y (* dy step)))))
-  (osm--update))
+  (setq osm--lon (osm--x-to-lon x osm--zoom)
+        osm--lat (osm--y-to-lat y osm--zoom)))
 
 (defun osm-right (&optional n)
   "Move N small stepz to the right."
   (interactive "p")
-  (osm--move (or n 1) 0 osm-small-step))
+  (osm--move-by (* (or n 1) osm-small-step) 0)
+  (osm--update))
 
 (defun osm-down (&optional n)
   "Move N small stepz down."
   (interactive "p")
-  (osm--move 0 (or n 1) osm-small-step))
+  (osm--move-by 0 (* (or n 1) osm-small-step))
+  (osm--update))
 
 (defun osm-up (&optional n)
   "Move N small stepz up."
@@ -659,12 +643,14 @@ Should be at least 7 days according to the server usage 
policies."
 (defun osm-right-right (&optional n)
   "Move N large stepz to the right."
   (interactive "p")
-  (osm--move (or n 1) 0 osm-large-step))
+  (osm--move-by (* (or n 1) osm-large-step) 0)
+  (osm--update))
 
 (defun osm-down-down (&optional n)
   "Move N large stepz down."
   (interactive "p")
-  (osm--move 0 (or n 1) osm-large-step))
+  (osm--move-by 0 (* (or n 1) osm-large-step))
+  (osm--update))
 
 (defun osm-up-up (&optional n)
   "Move N large stepz up."
@@ -748,16 +734,21 @@ Should be at least 7 days according to the server usage 
policies."
   (unless (eq major-mode #'osm-mode)
     (error "Not an osm-mode buffer")))
 
-(defun osm--pin-inside-p (x y p q)
-  "Return non-nil if pin P/Q is inside tile X/Y."
-  (setq x (* x 256) y (* y 256))
-  (and (>= p (- x 32)) (< p (+ x 256 32))
-       (>= q y) (< q (+ y 256 64))))
+(defun osm--pin-inside-p (x y lat lon)
+  "Return non-nil if pin at LAT/LON is inside tile X/Y."
+  (let ((p (osm--lon-to-x lon osm--zoom))
+        (q (osm--lat-to-y lat osm--zoom)))
+    (setq x (* x 256) y (* y 256))
+    (and (>= p (- x 32)) (< p (+ x 256 32))
+         (>= q y) (< q (+ y 256 64)))))
 
-(defun osm--put-pin (pins id x y help)
+(defun osm--put-pin (pins id lat lon help)
   "Put pin at X/Y with HELP and ID in PINS hash table."
-  (let ((x0 (/ x 256)) (y0 (/ y 256))
-        (pin `(,x, y ,id . ,help)))
+  (let* ((x (osm--lon-to-x lon osm--zoom))
+         (y (osm--lat-to-y lat osm--zoom))
+         (x0 (/ x 256))
+         (y0 (/ y 256))
+         (pin `(,x ,y ,lat ,lon ,id . ,help)))
     (push pin (gethash (cons x0 y0) pins))
     (cl-loop
      for i from -1 to 1 do
@@ -771,24 +762,15 @@ Should be at least 7 days according to the server usage 
policies."
 (defun osm--compute-pins ()
   "Compute pin hash table."
   (let ((pins (make-hash-table :test #'equal)))
-    (osm--put-pin pins 'osm-home
-                  (osm--lon-to-x (cadr osm-home) osm--zoom)
-                  (osm--lat-to-y (car osm-home) osm--zoom)
-                  "Home")
+    (osm--put-pin pins 'osm-home (car osm-home) (cadr osm-home) "Home")
     (bookmark-maybe-load-default-file)
     (dolist (bm bookmark-alist)
       (when (eq (bookmark-prop-get bm 'handler) #'osm-bookmark-jump)
         (let ((coord (bookmark-prop-get bm 'coordinates)))
-          (osm--put-pin pins 'osm-bookmark
-                        (osm--lon-to-x (cadr coord) osm--zoom)
-                        (osm--lat-to-y (car coord) osm--zoom)
-                        (car bm)))))
+          (osm--put-pin pins 'osm-bookmark (car coord) (cadr coord) (car 
bm)))))
     (dolist (file osm--gpx-files)
       (dolist (pt (cddr file))
-        (osm--put-pin pins 'osm-poi
-                      (osm--lon-to-x (cddr pt) osm--zoom)
-                      (osm--lat-to-y (cadr pt) osm--zoom)
-                      (car pt))))
+        (osm--put-pin pins 'osm-poi (cadr pt) (cddr pt) (car pt))))
     pins))
 
 ;; TODO The Bresenham algorithm used here to add the line segments
@@ -863,7 +845,7 @@ TPIN is an optional transient pin."
                  (y0 (* 256 y))
                  (svg-pin
                   (lambda (pin)
-                    (pcase-let* ((`(,p ,q ,id . ,help) pin)
+                    (pcase-let* ((`(,p ,q ,_lat ,_lon ,id . ,help) pin)
                                  (`(,_ ,bg ,fg) (assq id osm-pin-colors)))
                       (setq p (- p x0) q (- q y0))
                       (push `((poly . [,p ,q ,(- p 20) ,(- q 40) ,p ,(- q 50) 
,(+ p 20) ,(- q 40) ])
@@ -921,28 +903,32 @@ xmlns='http://www.w3.org/2000/svg' 
xmlns:xlink='http://www.w3.org/1999/xlink'>
 
 (defun osm--get-tile (x y)
   "Get tile at X/Y."
-  (if (pcase osm--transient-pin
-        (`(,p ,q . ,_) (osm--pin-inside-p x y p q)))
-      (osm--draw-tile x y osm--transient-pin)
-    (let* ((key `(,osm-server ,osm--zoom ,x . ,y))
-           (tile (and osm--tile-cache (gethash key osm--tile-cache))))
-      (if tile
-          (progn (setcar tile osm--tile-cookie) (cdr tile))
-        (setq tile (osm--draw-tile x y nil))
-        (when tile
-          (when osm-max-tiles
-            (unless osm--tile-cache
-              (setq osm--tile-cache (make-hash-table :test #'equal :size 
osm-max-tiles)))
-            (puthash key (cons osm--tile-cookie tile) osm--tile-cache))
-          tile)))))
+  (pcase osm--transient-pin
+    ((and `(,lat ,lon . ,_)
+          (guard (osm--pin-inside-p x y lat lon)))
+     (osm--draw-tile x y `(,(osm--lon-to-x lon osm--zoom)
+                           ,(osm--lat-to-y lat osm--zoom)
+                           ,@osm--transient-pin)))
+    (_
+     (let* ((key `(,osm-server ,osm--zoom ,x . ,y))
+            (tile (and osm--tile-cache (gethash key osm--tile-cache))))
+       (if tile
+           (progn (setcar tile osm--tile-cookie) (cdr tile))
+         (setq tile (osm--draw-tile x y nil))
+         (when tile
+           (when osm-max-tiles
+             (unless osm--tile-cache
+               (setq osm--tile-cache (make-hash-table :test #'equal :size 
osm-max-tiles)))
+             (puthash key (cons osm--tile-cookie tile) osm--tile-cache))
+           tile))))))
 
 (defun osm--display-tile (x y tile)
   "Display TILE at X/Y."
-  (let ((i (- x (/ (- osm--x osm--wx) 256)))
-        (j (- y (/ (- osm--y osm--wy) 256))))
+  (let ((i (- x (/ (osm--x0) 256)))
+        (j (- y (/ (osm--y0) 256))))
     (when (and (>= i 0) (< i osm--nx) (>= j 0) (< j osm--ny))
-      (let* ((mx (if (= 0 i) (mod (- osm--x osm--wx) 256) 0))
-             (my (if (= 0 j) (mod (- osm--y osm--wy) 256) 0))
+      (let* ((mx (if (= 0 i) (mod (osm--x0) 256) 0))
+             (my (if (= 0 j) (mod (osm--y0) 256) 0))
              (pos (+ (point-min) (* j (1+ osm--nx)) i)))
         (unless tile
           (setq tile (cons 'image osm--placeholder)))
@@ -994,7 +980,7 @@ xmlns='http://www.w3.org/2000/svg' 
xmlns:xlink='http://www.w3.org/1999/xlink'>
 
 (defun osm--update-header ()
   "Update header line."
-  (let* ((meter-per-pixel (/ (* 156543.03 (cos (/ (osm--lat) (/ 180.0 
float-pi)))) (expt 2 osm--zoom)))
+  (let* ((meter-per-pixel (/ (* 156543.03 (cos (/ osm--lat (/ 180.0 
float-pi)))) (expt 2 osm--zoom)))
          (server (osm--server-property :name))
          (meter 1) (idx 0)
          (factor '(2 2.5 2)))
@@ -1004,8 +990,8 @@ xmlns='http://www.w3.org/2000/svg' 
xmlns:xlink='http://www.w3.org/1999/xlink'>
     (setq-local
      header-line-format
      (concat
-      (format #(" %7.2f°" 0 6 (face bold)) (osm--lat))
-      (format #(" %7.2f°" 0 6 (face bold)) (osm--lon))
+      (format #(" %7.2f°" 0 6 (face bold)) osm--lat)
+      (format #(" %7.2f°" 0 6 (face bold)) osm--lon)
       (propertize " " 'display '(space :align-to (- center 10)))
       (format "%3s " (if (>= meter 1000) (/ meter 1000) meter))
       (if (>= meter 1000) "km " "m ")
@@ -1096,30 +1082,33 @@ xmlns='http://www.w3.org/2000/svg' 
xmlns:xlink='http://www.w3.org/1999/xlink'>
     (dotimes (_j osm--ny)
       (insert (make-string osm--nx ?\s) "\n"))
     (goto-char (point-min))
-    (dotimes (j osm--ny)
-      (dotimes (i osm--nx)
-        (let* ((x (+ i (/ (- osm--x osm--wx) 256)))
-               (y (+ j (/ (- osm--y osm--wy) 256)))
-               (tile (osm--get-tile x y)))
-          (osm--display-tile x y tile)
-          (unless tile (osm--enqueue-download x y)))))))
+    (let ((tx (/ (osm--x0) 256))
+          (ty (/ (osm--y0) 256)))
+      (dotimes (j osm--ny)
+        (dotimes (i osm--nx)
+          (let* ((x (+ i tx))
+                 (y (+ j ty))
+                 (tile (osm--get-tile x y)))
+            (osm--display-tile x y tile)
+            (unless tile (osm--enqueue-download x y))))))))
 
 (defun osm--process-download-queue ()
   "Process the download queue."
   (setq osm--download-queue
         (sort
-         (cl-loop for job in osm--download-queue
+         (cl-loop with tx = (/ (osm--x0) 256)
+                  with ty = (/ (osm--y0) 256)
+                  for job in osm--download-queue
                   for (x y . zoom) = job
-                  for i = (- x (/ (- osm--x osm--wx) 256))
-                  for j = (- y (/ (- osm--y osm--wy) 256))
                   if (and (= zoom osm--zoom)
-                          (>= i 0) (< i osm--nx)
-                          (>= j 0) (< j osm--ny))
+                          (>= x tx) (< x (+ tx osm--nx))
+                          (>= y ty) (< y (+ ty osm--ny)))
                   collect job)
-         (pcase-lambda (`(,x1 ,y1 . ,_z1) `(,x2 ,y2 . ,_z2))
-           (setq x1 (- x1 (/ osm--x 256)) y1 (- y1 (/ osm--y 256))
-                 x2 (- x2 (/ osm--x 256)) y2 (- y2 (/ osm--y 256)))
-           (< (+ (* x1 x1) (* y1 y1)) (+ (* x2 x2) (* y2 y2))))))
+         (let ((tx (/ (osm--x) 256))
+               (ty (/ (osm--y) 256)))
+           (pcase-lambda (`(,x1 ,y1 . ,_z1) `(,x2 ,y2 . ,_z2))
+             (setq x1 (- x1 tx) y1 (- y1 ty) x2 (- x2 tx) y2 (- y2 ty))
+             (< (+ (* x1 x1) (* y1 y1)) (+ (* x2 x2) (* y2 y2)))))))
   (osm--download))
 
 (defun osm--purge-tile-cache ()
@@ -1136,13 +1125,13 @@ xmlns='http://www.w3.org/2000/svg' 
xmlns:xlink='http://www.w3.org/1999/xlink'>
   "Make osm bookmark record with NAME at LAT/LON."
   (setq bookmark-current-bookmark nil) ;; Reset bookmark to use new name
   `(,(or name (osm--bookmark-name))
-    (coordinates ,(or lat (osm--lat)) ,(or lon (osm--lon)) ,osm--zoom)
+    (coordinates ,(or lat osm--lat) ,(or lon osm--lon) ,osm--zoom)
     (server . ,osm-server)
     (handler . ,#'osm-bookmark-jump)))
 
 (defun osm--org-link-data ()
   "Return Org link data."
-  (pcase-let ((`(,lat ,lon ,name) (osm--location-data 'osm-org-link "Org 
link")))
+  (pcase-let ((`(,lat ,lon ,name) (osm--location-data 'osm-link "Org link")))
     (setq name (string-remove-prefix "osm: " (osm--bookmark-name name)))
     (list lat lon osm--zoom
           (and (not (eq osm-server (default-value 'osm-server))) osm-server)
@@ -1153,14 +1142,14 @@ xmlns='http://www.w3.org/2000/svg' 
xmlns:xlink='http://www.w3.org/1999/xlink'>
 (defun osm--buffer-name ()
   "Return buffer name."
   (format "*osm: %.2f° %.2f° Z%s %s*"
-          (osm--lat) (osm--lon) osm--zoom
+          osm--lat osm--lon osm--zoom
           (osm--server-property :name)))
 
 (defun osm--bookmark-name (&optional loc)
   "Return bookmark name with optional LOC name."
   (format "osm: %s%.2f° %.2f° Z%s %s"
           (if loc (concat loc ", ") "")
-          (osm--lat) (osm--lon) osm--zoom
+          osm--lat osm--lon osm--zoom
           (osm--server-property :name)))
 
 (defun osm--goto (at server)
@@ -1171,8 +1160,6 @@ xmlns='http://www.w3.org/2000/svg' 
xmlns:xlink='http://www.w3.org/1999/xlink'>
       (or
        (and (eq major-mode #'osm-mode) (current-buffer))
        (pcase-let* ((`(,def-lat ,def-lon ,def-zoom) (or at osm-home))
-                    (def-x (osm--lon-to-x def-lon def-zoom))
-                    (def-y (osm--lat-to-y def-lat def-zoom))
                     (def-server (or server osm-server)))
          ;; Search for existing buffer
          (cl-loop
@@ -1180,8 +1167,8 @@ xmlns='http://www.w3.org/2000/svg' 
xmlns:xlink='http://www.w3.org/1999/xlink'>
           (and (eq (buffer-local-value 'major-mode buf) #'osm-mode)
                (eq (buffer-local-value 'osm-server buf) def-server)
                (eq (buffer-local-value 'osm--zoom buf) def-zoom)
-               (eq (buffer-local-value 'osm--x buf) def-x)
-               (eq (buffer-local-value 'osm--y buf) def-y)
+               (eq (buffer-local-value 'osm--lat buf) def-lat)
+               (eq (buffer-local-value 'osm--lon buf) def-lon)
                buf)))
        (generate-new-buffer "*osm*"))
     (unless (eq major-mode #'osm-mode)
@@ -1190,18 +1177,27 @@ xmlns='http://www.w3.org/2000/svg' 
xmlns:xlink='http://www.w3.org/1999/xlink'>
       (setq osm-server server
             osm--download-active nil
             osm--download-queue nil))
-    (when (or (not (and osm--x osm--y)) at)
+    (when (or (not (and osm--lon osm--lat)) at)
       (setq at (or at osm-home)
-            osm--zoom (nth 2 at)
-            osm--x (osm--lon-to-x (nth 1 at) osm--zoom)
-            osm--y (osm--lat-to-y (nth 0 at) osm--zoom))
-      (osm--put-transient-pin 'osm-center osm--x osm--y "Center"))
+            osm--lat (nth 0 at)
+            osm--lon (nth 1 at)
+            osm--zoom (nth 2 at))
+      (osm--put-transient-pin 'osm-transient osm--lat osm--lon "Center"))
     (prog1 (pop-to-buffer (current-buffer))
       (osm--update))))
 
-(defun osm--put-transient-pin (id x y help)
-  "Set transient pin at X/Y with ID and HELP."
-  (setq osm--transient-pin `(,x ,y ,id . ,help)))
+(defun osm--put-transient-pin (id lat lon help)
+  "Set transient pin at LAT/LON with ID and HELP."
+  (setq osm--transient-pin `(,lat ,lon ,id . ,help)))
+
+(defun osm--put-transient-pin-event (event id help)
+  "Set transient pin with ID and HELP at location of EVENT."
+  (pcase-let ((`(,x . ,y) (posn-x-y (event-start event))))
+    (osm--put-transient-pin
+     id
+     (osm--y-to-lat (+ (osm--y0) y) osm--zoom)
+     (osm--x-to-lon (+ (osm--x0) x) osm--zoom)
+     help)))
 
 ;;;###autoload
 (defun osm-goto (lat lon zoom)
@@ -1232,8 +1228,7 @@ Optionally specify a SERVER and a COMMENT."
   "Jump to osm bookmark BM."
   (interactive (list (osm--bookmark-read)))
   (set-buffer (osm--goto (bookmark-prop-get bm 'coordinates)
-                         (bookmark-prop-get bm 'server)))
-  (setq osm--transient-pin nil))
+                         (bookmark-prop-get bm 'server))))
 
 ;;;###autoload
 (defun osm-bookmark-delete (bm)
@@ -1249,8 +1244,7 @@ Optionally specify a SERVER and a COMMENT."
   (interactive (list (car (osm--bookmark-read))))
   (let ((new-name (read-from-minibuffer "New name: " old-name nil nil
                                         'bookmark-history old-name)))
-    (when osm--transient-pin
-      (setf (cdddr osm--transient-pin) new-name))
+    (when osm--transient-pin (setf (cdddr osm--transient-pin) new-name))
     (bookmark-rename old-name new-name)
     (osm--revert)))
 
@@ -1258,9 +1252,7 @@ Optionally specify a SERVER and a COMMENT."
   "Read bookmark name."
   (bookmark-maybe-load-default-file)
   (or (assoc
-       (if (and osm--transient-pin
-                (eq (caddr osm--transient-pin)
-                    'osm-selected-bookmark))
+       (if (eq (caddr osm--transient-pin) 'osm-selected-bookmark)
            (cdddr osm--transient-pin)
          (completing-read
           "Bookmark: "
@@ -1289,9 +1281,9 @@ Optionally specify a SERVER and a COMMENT."
 (defun osm--location-data (id help)
   "Fetch location info for ID with HELP."
   (unless osm--transient-pin
-    (osm--put-transient-pin id osm--x osm--y help))
-  (let ((lat (osm--y-to-lat (cadr osm--transient-pin) osm--zoom))
-        (lon (osm--x-to-lon (car osm--transient-pin) osm--zoom)))
+    (osm--put-transient-pin id osm--lat osm--lon help))
+  (let ((lat (car osm--transient-pin))
+        (lon (cadr osm--transient-pin)))
     (message "%s: Fetching name of %.2f %.2f..." help lat lon)
     ;; Redisplay before slow fetching
     (osm--update)
@@ -1468,7 +1460,7 @@ If the prefix argument LUCKY is non-nil take the first 
result and jump there."
 (defun osm-elisp-link ()
   "Store coordinates as an Elisp link in the kill ring."
   (interactive)
-  (pcase-let* ((`(,lat ,lon ,name) (osm--location-data 'osm-org-link "Elisp 
link"))
+  (pcase-let* ((`(,lat ,lon ,name) (osm--location-data 'osm-link "Elisp link"))
                (link (format "(osm %.6f %.6f %s%s%s)"
                              lat lon osm--zoom
                              (if (eq osm-server (default-value 'osm-server))
@@ -1476,14 +1468,14 @@ If the prefix argument LUCKY is non-nil take the first 
result and jump there."
                                (format " %s" osm-server))
                              (if name (format " %S" name) ""))))
     (kill-new link)
-    (message "Stored link in the kill ring")))
+    (message "Stored in the kill ring: %s" link)))
 
 (dolist (sym (list #'osm-up #'osm-down #'osm-left #'osm-right
                    #'osm-up-up #'osm-down-down #'osm-left-left 
#'osm-right-right
                    #'osm-zoom-out #'osm-zoom-in #'osm-bookmark-set 
#'osm-gpx-hide
                    #'osm-elisp-link))
   (put sym 'command-modes '(osm-mode)))
-(dolist (sym (list #'osm-mouse-drag #'osm-center-click #'osm-org-link-click
+(dolist (sym (list #'osm-mouse-drag #'osm-transient-click #'osm-org-link-click
                    #'osm-poi-click #'osm-bookmark-set-click 
#'osm-bookmark-select-click))
   (put sym 'completion-predicate #'ignore))
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]