From 167ef6d8ac8057ad2101200b7450e9fc68d7d0e4 Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Mon, 4 May 2026 15:41:24 +0200 Subject: [PATCH] drag/drop --- gui.rkt | 52 +++++++++++++++++++++++++++++++++++++++++++++++ music-library.rkt | 2 +- player.rkt | 2 +- playlist.rkt | 39 ++++++++++++++++++++++++++++++++++- rktplayer.rkt | 3 ++- tray.rkt | 2 ++ 6 files changed, 96 insertions(+), 4 deletions(-) diff --git a/gui.rkt b/gui.rkt index 1deaf61..8a6eeb5 100644 --- a/gui.rkt +++ b/gui.rkt @@ -43,6 +43,7 @@ [html-path "rktplayer.html"] [title "Racket Music Player"] [icon (build-path rkt-gui-dir "rktplayer.png")] + [quit-on-close #f] ) (define initialized (make-semaphore 0)) @@ -386,12 +387,14 @@ (send this update-playlist) ) + (define el-dragged #f) (define/public (update-playlist) (let* ((html (send playlist to-html)) (result (send el-playlist set-innerHTML! html)) ) (dbg-rktplayer "result: ~a" result) + (send this set-attr! "table.tracks tr" '(draggable "true")) (send this bind! "table.tracks tr" 'click (λ (el evt data) (let* ((track-id (send el attr/symbol 'id)) @@ -401,6 +404,46 @@ ) ) ) + (send this bind! "table.tracks tr" 'contextmenu + (λ (el evt data) + (let ((mnu (wv-menu 'track-menu + (wv-menu-item 'm-drop-track "Drop track" + #:callback (λ () + (send playlist drop-id (send el id)) + (update-playlist)) + ) + ) + ) + (clientX (hash-ref data 'clientX 60)) + (clientY (hash-ref data 'clientY 60)) + ) + (send this popup-menu! mnu clientX clientY)))) + (let ((from-idx #f) + (to-idx #f)) + (send this bind! "table.tracks tr" 'dragstart + (λ (el evt data) + (set! el-dragged el) + (dbg-rktplayer "Dragging element ~a" (send el id)) + (set! from-idx (send playlist index (send el id))) + ) + #t) + (send this bind! "table.tracks tr" 'dragover + (λ (el evt data) + #t) + ) + (send this bind! "table.tracks tr" 'drop + (λ (el evt data) + (dbg-rktplayer "Element dropped on ~a" (send el id)) + (set! to-idx (send playlist index (send el id))) + (when (and (integer? from-idx) (integer? to-idx) + (not (= from-idx to-idx))) + (send playlist move-track from-idx to-idx) + (update-playlist) + ) + ) + ) + ) + (update-track-nr current-track-nr) ) (send this update-volume) @@ -594,6 +637,7 @@ (send player quit) (set! closed #t) (send this close) + (dbg-rktplayer "Calling super -> quit") (super quit) ) @@ -623,6 +667,14 @@ ) ) + (define window-state-change-callback (λ () #t)) + + (define/public (set-window-state-change-callback! f) + (set! window-state-change-callback f)) + + (define/override (window-state-changed st) + (window-state-change-callback)) + (define/override (can-close?) (show-hide) #f) diff --git a/music-library.rkt b/music-library.rkt index c78d3e5..e6b6553 100644 --- a/music-library.rkt +++ b/music-library.rkt @@ -1,6 +1,6 @@ #lang racket -(require racket-sound) +(require racket-audio) (provide music-lib-relevant? is-music-dir? diff --git a/player.rkt b/player.rkt index 06e2c25..90db748 100644 --- a/player.rkt +++ b/player.rkt @@ -1,7 +1,7 @@ #lang racket (require racket/class - racket-sound + racket-audio "utils.rkt" ) diff --git a/playlist.rkt b/playlist.rkt index d27c545..68b0457 100644 --- a/playlist.rkt +++ b/playlist.rkt @@ -2,10 +2,11 @@ (require racket/class "music-library.rkt" - racket-sound + racket-audio "utils.rkt" racket-sprintf keystore/class + racket/list ) (provide track% @@ -331,6 +332,42 @@ (send this save-tab!)) ) + (define/public (move-track from-idx to-idx) + (let ((tr (list-ref tracks from-idx)) + (idx 0)) + (if (= from-idx to-idx) + #t + (begin + (when (< from-idx to-idx) + (set! to-idx (- to-idx 1))) + (let* ((l1 (if (= from-idx 0) + '() + (take tracks from-idx))) + (l2 (drop tracks (+ from-idx 1))) + (l (append l1 l2)) + ) + (set! tracks (append + (if (= to-idx 0) '() (take l to-idx)) + (list tr) + (drop l to-idx))) + ) + (send this save-tab!) + ) + ) + ) + ) + + (define/public (drop-id track-id) + (let ((idx (send this index track-id))) + (let* ((l1 (if (= idx 0) '() (take tracks idx))) + (l2 (drop tracks (+ idx 1))) + (l (append l1 l2))) + (set! tracks l) + (send this save-tab!) + ) + ) + ) + (define/public (track i) (list-ref tracks i)) diff --git a/rktplayer.rkt b/rktplayer.rkt index c8eb114..417eb5c 100644 --- a/rktplayer.rkt +++ b/rktplayer.rkt @@ -4,7 +4,7 @@ "gui.rkt" "tray.rkt" simple-ini/class - racket-sound + racket-audio racket-webview racket/runtime-path "utils.rkt" @@ -55,6 +55,7 @@ (when (or (null? no-exit) (not (eq? (car no-exit) #t))) (webview-wait-for-quit) + (send rktplayer-tray close) (webview-exit) (exit)) ) diff --git a/tray.rkt b/tray.rkt index df4837b..79037af 100644 --- a/tray.rkt +++ b/tray.rkt @@ -50,6 +50,8 @@ [tooltip (tr "Racket Music Player")]) (begin + (send rktplayer-gui set-window-state-change-callback! + (λ () (adjust-menu))) (adjust-menu) )