[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/osm 7a1d920492 59/77: Display bookmarks in map
From: |
ELPA Syncer |
Subject: |
[elpa] externals/osm 7a1d920492 59/77: Display bookmarks in map |
Date: |
Mon, 7 Mar 2022 08:58:08 -0500 (EST) |
branch: externals/osm
commit 7a1d920492440123fe6187e53669426d9292a78c
Author: Daniel Mendler <mail@daniel-mendler.de>
Commit: Daniel Mendler <mail@daniel-mendler.de>
Display bookmarks in map
---
README.org | 6 +++---
osm.el | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++------------
2 files changed, 58 insertions(+), 16 deletions(-)
diff --git a/README.org b/README.org
index 4190c84fe2..40a74866d5 100644
--- a/README.org
+++ b/README.org
@@ -42,7 +42,7 @@
To store a bookmark press the key ~b~, to store Org links press the key ~l~.
You can
also use a custom binding, e.g., ~C-c l~. Then the link can be inserted into
an Org
buffer with ~C-c C-l~. Bookmarks and Org links can be created at point with the
-mouse, see ~osm-bookmark-click~ and ~osm-org-link-click~.
+mouse, see ~osm-bookmark-set-click~ and ~osm-org-link-click~.
Examples:
@@ -67,13 +67,13 @@ Key bindings in =osm-mode= buffer:
- ~-~, ~S-SPC~: =osm-zoom-out= - Zoom out
- ~<mouse-1>~: =osm-zoom-click= - Zoom to point
- ~<mouse-2>~: =osm-org-link-click= - Store point as Org link
-- ~<mouse-3>~: =osm-bookmark-click= - Store point as bookmark
+- ~<mouse-3>~: =osm-bookmark-set-click= - Store point as bookmark
- ~g~: =osm-goto= - Go to location
- ~h~: =osm-home= - Go to home location
- ~s~: =osm-search= - Search for location
- ~S~: =osm-server= - Select server
- ~l~: =org-store-link= - Store org link
-- ~b~: =osm-bookmark= - Set bookmark
+- ~b~: =osm-bookmark-set= - Set bookmark
- ~B~: =osm-bookmark-jump= - Jump to bookmark
- ~q~: =quit-window= - Close buffer and window
- ~c~: =clone-buffer= - Clone buffer
diff --git a/osm.el b/osm.el
index 8bdd572e2e..9753c7e700 100644
--- a/osm.el
+++ b/osm.el
@@ -137,7 +137,7 @@ Should be at least 7 days according to the server usage
policies."
(define-key map "\d" #'osm-zoom-out)
(define-key map [mouse-1] #'osm-zoom-click)
(define-key map [mouse-2] #'osm-org-link-click)
- (define-key map [mouse-3] #'osm-bookmark-click)
+ (define-key map [mouse-3] #'osm-bookmark-set-click)
(define-key map [drag-mouse-1] #'osm-drag)
(define-key map [up] #'osm-up)
(define-key map [down] #'osm-down)
@@ -157,7 +157,7 @@ Should be at least 7 days according to the server usage
policies."
(define-key map "s" #'osm-search)
(define-key map "S" #'osm-server)
(define-key map "l" 'org-store-link)
- (define-key map "b" #'osm-bookmark)
+ (define-key map "b" #'osm-bookmark-set)
(define-key map "B" #'osm-bookmark-jump)
(define-key map [remap scroll-down-command] #'osm-down)
(define-key map [remap scroll-up-command] #'osm-up)
@@ -213,6 +213,9 @@ Should be at least 7 days according to the server usage
policies."
(defvar-local osm--y nil
"X coordinate on the map in pixel.")
+(defvar-local osm--bookmark-positions
+ "Bookmark positions.")
+
(defun osm--boundingbox-to-zoom (lat1 lat2 lon1 lon2)
"Compute zoom level from boundingbox LAT1 to LAT2 and LON1 to LON2."
(let ((w (/ (frame-pixel-width) 256))
@@ -358,13 +361,13 @@ Should be at least 7 days according to the server usage
policies."
(cl-incf osm--y (- y osm--wy))
(osm-zoom-in))))
-(defun osm-bookmark-click (event)
+(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--x (+ osm--x (- x osm--wx)))
(osm--y (+ osm--y (- y osm--wy))))
- (osm-bookmark)))
+ (osm-bookmark-set)))
(defun osm-org-link-click (event)
"Store link at position of click EVENT."
@@ -489,6 +492,27 @@ Should be at least 7 days according to the server usage
policies."
bookmark-make-record-function #'osm--make-bookmark)
(add-hook 'window-size-change-functions #'osm--resize nil 'local))
+(defun osm--bookmark-positions ()
+ "Compute bookmark positions."
+ (setq osm--bookmark-positions
+ (cl-loop
+ for bm in bookmark-alist
+ if (eq (bookmark-prop-get bm 'handler) #'osm-bookmark-jump)
+ collect
+ (let* ((coord (bookmark-prop-get bm 'coordinates))
+ (px (osm--lon-to-x (cadr coord) osm--zoom))
+ (py (osm--lat-to-y (car coord) osm--zoom)))
+ (cons px py)))))
+
+(defun osm--bookmarks-at (x y)
+ "Get bookmarks at X/Y."
+ ;; TODO Optimized k2 tree?
+ (setq x (* x 256) y (* y 256))
+ (cl-loop for (p . q) in (osm--bookmark-positions)
+ if (and (>= p (- x 100)) (< p (+ x 256 100))
+ (>= q (- y 100)) (< q (+ y 256 100)))
+ collect (cons (- p x) (- q y))))
+
(defun osm--get-tile (x y)
"Get tile at X/Y."
(let* ((key `(,osm-server ,osm--zoom ,x . ,y))
@@ -500,9 +524,25 @@ Should be at least 7 days according to the server usage
policies."
(when (and osm-max-tiles (not osm--tiles))
(setq osm--tiles (make-hash-table :test #'equal :size
osm-max-tiles)))
(setq tile
- `(,osm--cookie
- image :type ,(if (member (file-name-extension file) '("jpg"
"jpeg")) 'jpeg 'png)
- :width 256 :height 256 :file ,file))
+ (if-let (positions (osm--bookmarks-at x y))
+ (list :type 'svg :base-uri file
+ :data (concat "<svg width='256' height='256'
version='1.1'
+xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'>
+<image xlink:href='" (file-name-nondirectory file) "' height='256'
width='256'/>"
+(mapconcat
+ (lambda (pos)
+ (format "<g transform='translate(%s %s)' fill='#FF8800' stroke='#000000'>
+<polygon points='0 0 7 -35 -7 -35'/>
+<circle cx='0' cy='-35' r='12'/>
+</g>"
+ (car pos) (cdr pos)))
+ positions "")
+"</svg>"))
+ (list :type
+ (if (member (file-name-extension file) '("jpg" "jpeg"))
+ 'jpeg 'png)
+ :file file)))
+ (setq tile `(,osm--cookie image :width 256 :height 256 ,@tile))
(when osm--tiles
(puthash key tile osm--tiles))
(cdr tile))))))
@@ -583,6 +623,7 @@ Should be at least 7 days according to the server usage
policies."
(error "Not an osm-mode buffer"))
(rename-buffer (osm--buffer-name) 'unique)
(osm--header)
+ (osm--bookmark-positions)
(let* ((windows (or (get-buffer-window-list) (list (frame-root-window))))
(win-width (cl-loop for w in windows maximize (window-pixel-width w)))
(win-height (cl-loop for w in windows maximize (window-pixel-height
w))))
@@ -621,7 +662,7 @@ Should be at least 7 days according to the server usage
policies."
"Make osm bookmark record."
(setq bookmark-current-bookmark nil) ;; Reset bookmark to use new name
`(,(osm--bookmark-name)
- (coordinate ,(osm--lat) ,(osm--lon) ,osm--zoom)
+ (coordinates ,(osm--lat) ,(osm--lon) ,osm--zoom)
(server . ,osm-server)
(handler . ,#'osm-bookmark-jump)))
@@ -712,17 +753,18 @@ Should be at least 7 days according to the server usage
policies."
nil t nil 'bookmark-history)
bookmark-alist)
(error "No bookmark selected")))))
- (set-buffer (osm--goto (bookmark-prop-get bm 'coordinate)
+ (set-buffer (osm--goto (bookmark-prop-get bm 'coordinates)
(bookmark-prop-get bm 'server))))
;;;###autoload
-(defun osm-bookmark ()
+(defun osm-bookmark-set ()
"Create osm bookmark."
(interactive)
(let* ((def (osm--bookmark-name (osm--location-name "Bookmark")))
(name (read-from-minibuffer "Bookmark name: " def nil nil nil def)))
(bookmark-set name)
- (message "Stored bookmark: %s" name)))
+ (message "Stored bookmark: %s" name)
+ (run-at-time 0 nil #'osm--revert)))
(defun osm--location-name (msg)
"Fetch location name of current position.
@@ -801,9 +843,9 @@ MSG is a message prefix string."
(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
#'osm-bookmark-jump))
+ #'osm-zoom-out #'osm-zoom-in #'osm-bookmark-set
#'osm-bookmark-jump))
(put sym 'command-modes '(osm-mode)))
-(dolist (sym (list #'osm-drag #'osm-zoom-click #'osm-bookmark-click
#'osm-org-link-click))
+(dolist (sym (list #'osm-drag #'osm-zoom-click #'osm-bookmark-set-click
#'osm-org-link-click))
(put sym 'completion-predicate #'ignore))
(provide 'osm)
- [elpa] externals/osm 5d8959d9ad 64/77: Improve keybindings, (continued)
- [elpa] externals/osm 5d8959d9ad 64/77: Improve keybindings, ELPA Syncer, 2022/03/07
- [elpa] externals/osm 640c885460 48/77: README: Add example configuration, ELPA Syncer, 2022/03/07
- [elpa] externals/osm 548dc8c47c 25/77: Minor cleanup, ELPA Syncer, 2022/03/07
- [elpa] externals/osm 0edc1c77db 13/77: Overwrite more settings, ELPA Syncer, 2022/03/07
- [elpa] externals/osm 21e59942a9 15/77: Handle mouse drag event, ELPA Syncer, 2022/03/07
- [elpa] externals/osm e8ed76566a 11/77: Rename settings, ELPA Syncer, 2022/03/07
- [elpa] externals/osm 5815de2a73 29/77: Store server as part in bookmark and Org link, ELPA Syncer, 2022/03/07
- [elpa] externals/osm e7f38427ca 05/77: Document all variables, ELPA Syncer, 2022/03/07
- [elpa] externals/osm 42b9222e93 06/77: Make download slightly more robust, ELPA Syncer, 2022/03/07
- [elpa] externals/osm ad12c93f57 01/77: Initial commit, ELPA Syncer, 2022/03/07
- [elpa] externals/osm 7a1d920492 59/77: Display bookmarks in map,
ELPA Syncer <=
- [elpa] externals/osm 25d891088f 70/77: Emacs 27 base64 encoding fallback, ELPA Syncer, 2022/03/07
- [elpa] externals/osm ec97b1d1c0 23/77: Add separate hook function, ELPA Syncer, 2022/03/07
- [elpa] externals/osm ee64b96509 56/77: Add map variant, ELPA Syncer, 2022/03/07
- [elpa] externals/osm 1bd4751bcf 34/77: Better link names, ELPA Syncer, 2022/03/07
- [elpa] externals/osm 7a50000e1e 58/77: Add separate resize function, revert tile cache, ELPA Syncer, 2022/03/07
- [elpa] externals/osm 4c9337bf79 69/77: Update README, ELPA Syncer, 2022/03/07
- [elpa] externals/osm 76b41f5fb5 51/77: Add keybindings, ELPA Syncer, 2022/03/07
- [elpa] externals/osm a6335090e9 33/77: Handle multiple windows, ELPA Syncer, 2022/03/07
- [elpa] externals/osm 2fbf12f0ef 46/77: seq is not needed, ELPA Syncer, 2022/03/07
- [elpa] externals/osm c2c7dff887 22/77: Compact server configuration, ELPA Syncer, 2022/03/07