-
This commit is contained in:
18
gui.rkt
18
gui.rkt
@@ -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)))
|
||||
|
||||
@@ -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') {
|
||||
|
||||
15
player.rkt
15
player.rkt
@@ -1 +1,16 @@
|
||||
#lang racket
|
||||
|
||||
(require racket/class)
|
||||
|
||||
(provide player%)
|
||||
|
||||
(define player%
|
||||
(class object%
|
||||
|
||||
(define/public (play playlist)
|
||||
(displayln "playing playlist")
|
||||
)
|
||||
|
||||
(super-new)
|
||||
)
|
||||
)
|
||||
|
||||
109
playlist.rkt
109
playlist.rkt
@@ -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"))
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user