anchor.diff:    ;; TODO: fetch from playlist
     (component-enabled 'sl-seek t)
     (playback-start))
  +
  +(defun play-selected ()
  +  (setq current-id (playlist-get current-playlist current-index 'id))
  +  (playback-set-file (playlist-get current-playlist current-index 'path))
  +  (slider-range 'sl-seek 0.0 (playback-length)) ;; TODO: DRY
  +  (component-enabled 'sl-seek t) ;; TODO: playlist-select
  +  (playlist-select current-playlist current-index)
  +  (playback-start))
  +
  +(defun on-next ()
  +  (if (< (+ 1 current-index) (playlist-items-count current-playlist))
  +      (progn (setq current-index (+ 1 current-index))
  +	     (play-selected))))
  +
  +(defun on-prev ()
  +  (if (>= (- current-index 1) 0)
  +      (progn (setq current-index (- current-index 1))
  +	     (play-selected))))
  +
  +(defun on-rand ()
  +  (progn (setq current-index (rand (playlist-items-count current-playlist)))
  +	 (play-selected)))
   
   (defun on-playlist-click (item-str item-id item-index playlist-name)
     (playback-set-file item-str)
  
positive.code:   (layout-add-component 'l-buttons 'b-play 30.0 30.0 30.0)
    (layout-add-component 'l-buttons 'b-pause 30.0 30.0 30.0)
    (layout-add-component 'l-buttons 'b-stop 30.0 30.0 30.0)
    (layout-add-component 'l-buttons 'b-options 80.0 80.0 80.0)
    (layout-add-component 'l-buttons 'b-interpreter 80.0 80.0 80.0)
    (layout-add-component 'l-buttons 'b-new-playlist 80.0 80.0 80.0)
  
negative.code:   (create-text-button 'b-play ">" "Play")
    (create-text-button 'b-pause "||" "Pause")
    (create-text-button 'b-stop "[ ]" "Stop playback")
    (create-text-button 'b-prev "<<" "Previous")
    (create-text-button 'b-next ">>" "Next")
    (create-text-button 'b-rand "%" "Random")
    (create-text-button 'b-options "Options" "Audio options")
    (create-text-button 'b-interpreter "Interpreter" "GLISP Interpreter")
    (create-text-button 'b-new-playlist "New Playlist" "Create new playlist")
  