This commit is contained in:
2026-02-20 15:43:39 +01:00
parent 0fffd544c0
commit 85c35e99b0
4 changed files with 150 additions and 5 deletions

18
gui.rkt
View File

@@ -6,6 +6,8 @@
"utils.rkt"
"music-library.rkt"
"translate.rkt"
"playlist.rkt"
"player.rkt"
)
(provide
@@ -35,9 +37,12 @@
(define el-seeker #f)
(define el-library #f)
(define el-playlist #f)
(define music-library (send settings get 'music-library (find-system-path 'home-dir)))
(define current-music-path #f)
(define playlist #f)
(define player (new player%))
(define inner-html-handlers (make-hash))
@@ -64,6 +69,11 @@
(send this update-library)
)
(define/public (update-playlist)
(displayln "Updating playlist")
)
(define/public (update-library)
(when (eq? current-music-path #f)
(set! current-music-path music-library))
@@ -151,7 +161,13 @@
)
(define/public (play-path path)
(displayln (format "Playing ~a" path)))
(displayln (format "Playing ~a" path))
(set! playlist (new playlist% [start-map path]))
(send playlist read-tracks)
(displayln (format "number of tracks: ~a" (send playlist length)))
(send this update-playlist)
(send player play playlist)
)
(define/public (open-booklet path)
(displayln (format "Open booklet ~a" path)))

View File

@@ -18,9 +18,15 @@
el.style.display = 'none';
}
if (menu.id !== null) {
console.log("Sending clear trigger for menu clearance : " + menu.id);
let obj = { evt: 'menu-item-choosen', item: menu.id };
window._web_wire_put_evt(obj);
// Delay this trigger, because one could have choosen a menu item and we want this
// to be triggered before the clear command is send.
// But if no menu item has been selected, the clear command should
// eventually be send.
setTimeout(function () {
console.log("Sending clear trigger for menu clearance : " + menu.id);
let obj = { evt: 'menu-item-choosen', item: menu.id };
window._web_wire_put_evt(obj);
}, 250);
}
} else {
// hide all submenus
@@ -31,7 +37,6 @@
console.log("Triggering menu item : " + id);
let obj = { evt: 'menu-item-choosen', item: id };
window._web_wire_put_evt(obj);
//clearPopupMenu();
};
let showSubMenu = function(menu_el, item_el, el, parent_type) {
if (parent_type == 'menu') {

View File

@@ -1 +1,16 @@
#lang racket
(require racket/class)
(provide player%)
(define player%
(class object%
(define/public (play playlist)
(displayln "playing playlist")
)
(super-new)
)
)

View File

@@ -1 +1,110 @@
#lang racket
(require racket/class
"music-library.rkt"
racket-sound
)
(provide track%
playlist%
)
(define the-displayln displayln)
(define track%
(class object%
(init-field
[file #f]
[title ""]
[artist ""]
[album ""]
[length 0]
[number 0]
)
(define/public (displayln)
(the-displayln (format "~a - ~a - ~a - ~a"
number
title
album
length)))
(super-new)
(begin
(unless (eq? file #f)
(let ((tags (id3-tags (format "~a" file))))
(set! title (tags-title tags))
(set! artist (tags-artist tags))
(set! album (tags-album tags))
(set! number (tags-track tags))
(set! length (tags-length tags))
)
)
)
))
(define list-len length)
(define playlist%
(class object%
(init-field
[start-map #f]
[max-tracks 100]
)
(define tracks '())
(define (can-add? file)
(and (<= (list-len tracks) max-tracks)
(is-music-file? file)))
(define (add-track file)
(let ((track (new track% [file file])))
(set! tracks (append tracks (list track)))))
(define (read-tracks-internal dir)
;(displayln (format "dir = ~a" dir))
(if (> (list-len tracks) max-tracks)
'done
(if (file-exists? dir)
(when (can-add? dir)
(add-track dir))
(if (directory-exists? dir)
(let ((content (directory-list dir)))
(for-each (λ (entry)
(let ((p (build-path dir entry)))
(if (directory-exists? p)
(read-tracks-internal p)
(when (and (file-exists? p) (can-add? p))
(add-track p)))))
content))
'no-file-or-dir
)
)
)
)
(define/public (read-tracks)
(set! tracks '())
(read-tracks-internal start-map)
)
(define/public (length)
(list-len tracks))
(define/public (track i)
(list-ref tracks i))
(define/public (display-tracks)
(for-each (λ (track)
(send track displayln))
tracks))
(super-new)
(begin
(when (eq? start-map #f)
(error "Initialize playlist% with a starting map"))
)
)
)