]> gitweb.factorcode.org Git - factor.git/blob - extra/audio/gadget/gadget.factor
7ef80c93406cab66c8266042c0efd2cdb025724a
[factor.git] / extra / audio / gadget / gadget.factor
1 USING: accessors audio audio.engine combinators destructors
2 images.loader images.viewer init kernel namespaces
3 ui.gadgets ui.gadgets.buttons ui.gadgets.panes ;
4 FROM: ui.gadgets.buttons.private => border-button-theme ;
5 FROM: audio.engine.private => make-engine-current ;
6 IN: audio.gadget
7
8 TUPLE: audio-gadget < button
9     play-label pause-label
10     audio audio-clip state ;
11
12 <PRIVATE
13
14 CONSTANT: play-label-image-path "vocab:audio/gadget/play.png"
15 CONSTANT: pause-label-image-path "vocab:audio/gadget/pause.png"
16
17 SYMBOLS: play-label-image pause-label-image gadget-audio-engine ;
18
19 [
20     f play-label-image set-global
21     f pause-label-image set-global
22     f gadget-audio-engine set-global
23 ] "audio.gadget" add-startup-hook
24
25 : initialize-audio-gadgets ( -- )
26     gadget-audio-engine get-global [
27         play-label-image-path load-image
28         play-label-image set-global
29
30         pause-label-image-path load-image
31         pause-label-image set-global
32
33         <standard-audio-engine> dup start-audio*
34         gadget-audio-engine set-global
35     ] unless ;
36
37 SYMBOLS: playing paused ;
38
39 : relabel-audio-gadget ( audio-gadget label -- )
40     [ drop clear-gadget ] [ add-gadget drop ] 2bi ;
41
42 : pause-audio-gadget ( audio-gadget -- )
43     [ dup play-label>> relabel-audio-gadget ]
44     [ paused swap state<< ]
45     [ audio-clip>> pause-clip ] tri ;
46
47 : play-audio-gadget ( audio-gadget -- )
48     [ dup pause-label>> relabel-audio-gadget ]
49     [ playing swap state<< ]
50     [ audio-clip>> play-clip ] tri ;
51
52 : click-audio-gadget ( audio-gadget -- )
53     gadget-audio-engine get make-engine-current
54     dup state>> {
55         { playing [ pause-audio-gadget ] }
56         { paused [ play-audio-gadget ] }
57     } case ;
58
59 PRIVATE>
60
61 :: <audio-gadget> ( audio -- gadget )
62     initialize-audio-gadgets
63     play-label-image get-global <image-gadget> :> play-label
64     pause-label-image get-global <image-gadget> :> pause-label
65     play-label [ click-audio-gadget ] audio-gadget new-button
66         border-button-theme
67         audio >>audio
68         paused >>state
69         play-label >>play-label
70         pause-label >>pause-label ;
71
72 M: audio-gadget graft*
73     [ call-next-method ] [
74         dup audio>>
75         [ gadget-audio-engine get-global f ] dip f <static-audio-clip>
76            >>audio-clip
77         drop
78     ] bi ;
79
80 M: audio-gadget ungraft*
81     [ pause-audio-gadget ]
82     [ audio-clip>> dispose ]
83     [ call-next-method ] tri ;
84
85 : audio. ( audio -- )
86     <audio-gadget> gadget. ;
87
88 M: audio content-gadget
89     <audio-gadget> ;