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