Removed RCS-style IDs.
[multipass-eu.git] / src / button.rb
1 class Button
2         attr_reader :part
3
4         def initialize(collection, name, rel, image, x, y)
5                 @collection = collection
6                 @name = name
7                 @rel = rel
8                 @image = image
9                 @x = x
10                 @y = y
11
12                 @part = setup_part
13                 setup_programs
14         end
15
16         private
17         def setup_part
18                 ret = nil
19
20                 @collection.part(@name, :image) do |p|
21                         ret = p
22
23                         ["normal", "hover", "down"].each do |state|
24                                 s = state == "normal" ? "default" : state
25
26                                 p.description(s) do |d|
27                                         d.rel[0].to = d.rel[1].to = @rel
28                                         d.rel[0].set_offset(@x, @y)
29
30                                         d.auto_rel = true
31                                         d.image = "#{@image}-#{state}.png"
32                                 end
33                         end
34                 end
35
36                 ret
37         end
38
39         def setup_programs
40                 {"in" => "hover", "out" => "default"}.each do |sig, state|
41                         @collection.program("#{@name}.#{sig}",
42                                             :set_state) do |p|
43                                 p.signal = "mouse,#{sig}"
44                                 p.source = @name
45                                 p.state = state
46                                 p.time = 0.2
47                                 p.targets << ProgramTarget.new(@part)
48                         end
49                 end
50
51                 {"up" => "hover", "down" => "down"}.each do |sig, state|
52                         @collection.program("#{@name}.#{sig}",
53                                             :set_state) do |p|
54                                 p.signal = "mouse,#{sig},1"
55                                 p.source = @name
56                                 p.state = state
57                                 p.targets << ProgramTarget.new(@part)
58                         end
59                 end
60         end
61 end
62
63 class SignalButton < Button
64         def initialize(collection, name, rel, image, x, y, signal)
65                 super(collection, name, rel, image, x, y)
66
67                 collection.program("#{name}.clicked",
68                                     :emit_signal) do |p|
69                         p.signal = "mouse,clicked,1"
70                         p.source = name
71                         p.emission_signal = signal
72                         p.emission_source = name
73                 end
74         end
75 end
76
77 class ButtonLed
78         def initialize(c, name, rel, image, x, y)
79                 @c = c
80                 @name = name
81                 @rel = rel
82                 @image = image
83                 @x = x
84                 @y = y
85
86                 @part = setup_part
87                 setup_programs
88         end
89
90         private
91         def setup_part
92                 ret = nil
93
94                 @c.part(@name, :image) do |p|
95                         ret = p
96                         p.mouse_events = false
97
98                         p.description("default") do |d|
99                                 d.visible = false
100                                 d.color = "#ffffff00"
101
102                                 d.rel[0].to = d.rel[1].to = @rel
103                                 d.rel[0].set_offset(@x, @y)
104
105                                 d.auto_rel = true
106                                 d.image = "#{@image}.png"
107                         end
108
109                         p.description("hover") do |d|
110                                 d.color = "#ffffffff"
111
112                                 d.rel[0].to = d.rel[1].to = @rel
113                                 d.rel[0].set_offset(@x, @y)
114
115                                 d.auto_rel = true
116                                 d.image = "#{@image}.png"
117                         end
118                 end
119
120                 ret
121         end
122
123         def setup_programs
124                 {"in" => "hover", "out" => "default"}.each do |sig, state|
125                         @c.program("#{@name}.#{sig}", :set_state) do |p|
126                                 p.signal = "mouse,#{sig}"
127                                 p.source = @name[0..-5] # cut '.led' suffix
128                                 p.state = state
129                                 p.mode = sig == "in" ? :accelerate : :decelerate
130                                 p.time = 0.3
131                                 p.targets << ProgramTarget.new(@part)
132                         end
133                 end
134         end
135 end
136
137 class ToggleButton
138         attr_reader :part
139
140         def initialize(collection, name, rel, image, x, y, variable, signal)
141                 @col = collection
142                 @name = name
143                 @rel = rel
144                 @image = image
145                 @x = x
146                 @y = y
147                 @signal = signal
148                 @variable = variable
149
150                 @part = setup_part
151                 setup_programs
152         end
153
154         private
155         def setup_part
156                 ret = nil
157
158                 @col.part(@name, :image) do |p|
159                         ret = p
160
161                         ["inactive", "active"].each do |state|
162                                 s = state == "inactive" ? "default" : state
163
164                                 p.description(s) do |d|
165                                         d.rel[0].to = d.rel[1].to = @rel
166                                         d.rel[0].set_offset(@x, @y)
167
168                                         d.auto_rel = true
169                                         d.image = "#{@image}-#{state}.png"
170                                 end
171                         end
172                 end
173
174                 ret
175         end
176
177         def setup_programs
178                 programs = []
179                 toggle_prg = nil
180                 emit_toggle_prg = nil
181
182                 @col.program("#{@name}.toggle", :exec_script) do |p|
183                         toggle_prg = p
184
185                         p.script =<<SMALL
186 new i = !get_int (#{@variable});
187 set_int (#{@variable}, i);
188
189 set_state (PART:"#{@name}", i ? "active" : "default", 0.0);
190 SMALL
191                 end
192
193                 @col.program("#{@name}.emit_toggle", :emit_signal) do |p|
194                         emit_toggle_prg = p
195
196                         p.emission_signal = @signal
197                         p.emission_source = @name
198                 end
199
200                 @col.program("#{@name}.on_toggle", :base) do |p|
201                         p.signal = @signal
202                         p.source = "Euphoria"
203                         p.after << ProgramAfter.new(toggle_prg)
204                 end
205
206                 @col.program("#{@name}.clicked", :base) do |p|
207                         p.signal = "mouse,clicked,1"
208                         p.source = @name
209                         p.after << ProgramAfter.new(toggle_prg)
210                         p.after << ProgramAfter.new(emit_toggle_prg)
211                 end
212         end
213 end