diff --git a/gui.rkt b/gui.rkt index 3530e12..49df656 100644 --- a/gui.rkt +++ b/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))) diff --git a/gui/rktplayer.html b/gui/rktplayer.html index 5270f53..dcb4544 100644 --- a/gui/rktplayer.html +++ b/gui/rktplayer.html @@ -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') { diff --git a/player.rkt b/player.rkt index 6f1f7b4..0fd776a 100644 --- a/player.rkt +++ b/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) + ) + ) diff --git a/playlist.rkt b/playlist.rkt index 6f1f7b4..c9369ac 100644 --- a/playlist.rkt +++ b/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")) + ) + ) + ) + \ No newline at end of file