]> gitweb.factorcode.org Git - factor.git/commitdiff
audio.gadget: printable audio play button
authorJoe Groff <arcata@gmail.com>
Tue, 21 Feb 2012 07:49:01 +0000 (23:49 -0800)
committerJoe Groff <arcata@gmail.com>
Tue, 21 Feb 2012 07:49:01 +0000 (23:49 -0800)
extra/audio/gadget/gadget.factor [new file with mode: 0644]
extra/audio/gadget/pause.png [new file with mode: 0644]
extra/audio/gadget/play.png [new file with mode: 0644]

diff --git a/extra/audio/gadget/gadget.factor b/extra/audio/gadget/gadget.factor
new file mode 100644 (file)
index 0000000..28d4d75
--- /dev/null
@@ -0,0 +1,74 @@
+USING: accessors audio audio.engine combinators images.loader
+images.viewer init kernel locals namespaces ui.gadgets
+ui.gadgets.buttons ui.gadgets.panes ;
+FROM: ui.gadgets.buttons.private => border-button-theme ;
+FROM: audio.engine.private => make-engine-current ;
+IN: audio.gadget
+
+TUPLE: audio-gadget < button
+    play-label pause-label
+    audio-clip state ;
+
+<PRIVATE
+
+CONSTANT: play-label-image-path "vocab:audio/gadget/play.png"
+CONSTANT: pause-label-image-path "vocab:audio/gadget/pause.png"
+
+SYMBOLS: play-label-image pause-label-image gadget-audio-engine ;
+
+[
+    f play-label-image set-global
+    f pause-label-image set-global
+    f gadget-audio-engine set-global
+] "audio.gadget" add-startup-hook
+
+: initialize-audio-gadgets ( -- )
+    gadget-audio-engine get-global [
+        play-label-image-path load-image
+        play-label-image set-global
+
+        pause-label-image-path load-image
+        pause-label-image set-global
+
+        <standard-audio-engine> dup start-audio*
+        gadget-audio-engine set-global
+    ] unless ;
+
+SYMBOLS: playing paused ;
+
+: relabel-audio-gadget ( audio-gadget label -- )
+    [ drop clear-gadget ] [ add-gadget drop ] 2bi ;
+
+: pause-audio-gadget ( audio-gadget -- )
+    [ dup play-label>> relabel-audio-gadget ]
+    [ paused swap state<< ]
+    [ audio-clip>> pause-clip ] tri ;
+
+: play-audio-gadget ( audio-gadget -- )
+    [ dup pause-label>> relabel-audio-gadget ]
+    [ playing swap state<< ]
+    [ audio-clip>> play-clip ] tri ;
+
+: click-audio-gadget ( audio-gadget -- )
+    gadget-audio-engine get make-engine-current
+    dup state>> {
+        { playing [ pause-audio-gadget ] }
+        { paused [ play-audio-gadget ] }
+    } case ;
+
+PRIVATE>
+
+:: <audio-gadget> ( audio -- gadget )
+    initialize-audio-gadgets
+    play-label-image get-global <image-gadget> :> play-label
+    pause-label-image get-global <image-gadget> :> pause-label
+    play-label [ click-audio-gadget ] audio-gadget new-button
+        border-button-theme
+        gadget-audio-engine get-global f audio t <static-audio-clip>
+           >>audio-clip
+        paused >>state
+        play-label >>play-label
+        pause-label >>pause-label ;
+
+: audio. ( audio -- )
+    <audio-gadget> gadget. ;
diff --git a/extra/audio/gadget/pause.png b/extra/audio/gadget/pause.png
new file mode 100644 (file)
index 0000000..aa51155
Binary files /dev/null and b/extra/audio/gadget/pause.png differ
diff --git a/extra/audio/gadget/play.png b/extra/audio/gadget/play.png
new file mode 100644 (file)
index 0000000..7375018
Binary files /dev/null and b/extra/audio/gadget/play.png differ