cyberarm_engine 0.12.1 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +8 -8
  3. data/.travis.yml +5 -5
  4. data/Gemfile +6 -6
  5. data/LICENSE.txt +21 -21
  6. data/README.md +43 -43
  7. data/Rakefile +10 -10
  8. data/bin/console +14 -14
  9. data/bin/setup +8 -8
  10. data/cyberarm_engine.gemspec +36 -36
  11. data/lib/cyberarm_engine.rb +47 -46
  12. data/lib/cyberarm_engine/animator.rb +54 -0
  13. data/lib/cyberarm_engine/background.rb +175 -175
  14. data/lib/cyberarm_engine/bounding_box.rb +149 -149
  15. data/lib/cyberarm_engine/common.rb +96 -96
  16. data/lib/cyberarm_engine/engine.rb +101 -101
  17. data/lib/cyberarm_engine/game_object.rb +256 -256
  18. data/lib/cyberarm_engine/game_state.rb +88 -88
  19. data/lib/cyberarm_engine/gosu_ext/circle.rb +8 -8
  20. data/lib/cyberarm_engine/ray.rb +55 -55
  21. data/lib/cyberarm_engine/shader.rb +262 -205
  22. data/lib/cyberarm_engine/text.rb +146 -146
  23. data/lib/cyberarm_engine/timer.rb +22 -22
  24. data/lib/cyberarm_engine/transform.rb +272 -83
  25. data/lib/cyberarm_engine/ui/border_canvas.rb +100 -100
  26. data/lib/cyberarm_engine/ui/dsl.rb +98 -101
  27. data/lib/cyberarm_engine/ui/element.rb +275 -259
  28. data/lib/cyberarm_engine/ui/elements/button.rb +66 -66
  29. data/lib/cyberarm_engine/ui/elements/check_box.rb +58 -58
  30. data/lib/cyberarm_engine/ui/elements/container.rb +176 -162
  31. data/lib/cyberarm_engine/ui/elements/edit_line.rb +171 -102
  32. data/lib/cyberarm_engine/ui/elements/flow.rb +16 -16
  33. data/lib/cyberarm_engine/ui/elements/image.rb +51 -51
  34. data/lib/cyberarm_engine/ui/elements/label.rb +49 -49
  35. data/lib/cyberarm_engine/ui/elements/progress.rb +49 -49
  36. data/lib/cyberarm_engine/ui/elements/stack.rb +12 -12
  37. data/lib/cyberarm_engine/ui/elements/toggle_button.rb +55 -55
  38. data/lib/cyberarm_engine/ui/event.rb +46 -45
  39. data/lib/cyberarm_engine/ui/gui_state.rb +134 -134
  40. data/lib/cyberarm_engine/ui/style.rb +36 -36
  41. data/lib/cyberarm_engine/ui/theme.rb +120 -119
  42. data/lib/cyberarm_engine/vector.rb +202 -198
  43. data/lib/cyberarm_engine/version.rb +4 -4
  44. metadata +6 -5
@@ -1,101 +1,101 @@
1
- module CyberarmEngine
2
- class BorderCanvas
3
- attr_reader :element, :top, :right, :bottom, :left
4
- def initialize(element:)
5
- @element = element
6
-
7
- @top = Background.new
8
- @right = Background.new
9
- @bottom = Background.new
10
- @left = Background.new
11
- end
12
-
13
- def color=(color)
14
- if color.is_a?(Numeric)
15
- @top.background = color
16
- @right.background = color
17
- @bottom.background = color
18
- @left.background = color
19
-
20
- elsif color.is_a?(Gosu::Color)
21
- @top.background = color
22
- @right.background = color
23
- @bottom.background = color
24
- @left.background = color
25
-
26
- elsif color.is_a?(Array)
27
- if color.size == 1
28
- color=color.first
29
-
30
- elsif color.size == 2
31
- @top.background = color.first
32
- @right.background = color.first
33
- @bottom.background = color.last
34
- @left.background = color.last
35
-
36
- elsif color.size == 4
37
- @top.background = color[0]
38
- @right.background = color[1]
39
- @bottom.background = color[2]
40
- @left.background = color[3]
41
- else
42
- raise ArgumentError, "color array was empty or had wrong number of elements (expected 2 or 4 elements)"
43
- end
44
-
45
- elsif color.is_a?(Hash)
46
- @top.background = color[:top]
47
- @right.background = color[:right]
48
- @bottom.background = color[:bottom]
49
- @left.background = color[:left]
50
- else
51
- raise ArgumentError, "color '#{color}' of type '#{color.class}' was not able to be processed"
52
- end
53
- end
54
-
55
- def draw
56
- @top.draw
57
- @right.draw
58
- @bottom.draw
59
- @left.draw
60
- end
61
-
62
- def update
63
- # TOP
64
- @top.x = @element.x# + @element.border_thickness_left
65
- @top.y = @element.y
66
- @top.z = @element.z
67
-
68
- @top.width = @element.width
69
- @top.height = @element.style.border_thickness_top
70
-
71
- # RIGHT
72
- @right.x = @element.x + @element.width
73
- @right.y = @element.y + @element.style.border_thickness_top
74
- @right.z = @element.z
75
-
76
- @right.width = -@element.style.border_thickness_right
77
- @right.height = @element.height - @element.style.border_thickness_top
78
-
79
- # BOTTOM
80
- @bottom.x = @element.x
81
- @bottom.y = @element.y + @element.height
82
- @bottom.z = @element.z
83
-
84
- @bottom.width = @element.width - @element.style.border_thickness_right
85
- @bottom.height = -@element.style.border_thickness_bottom
86
-
87
- # LEFT
88
- @left.x = @element.x
89
- @left.y = @element.y
90
- @left.z = @element.z
91
-
92
- @left.width = @element.style.border_thickness_left
93
- @left.height = @element.height - @element.style.border_thickness_bottom
94
-
95
- @top.update
96
- @right.update
97
- @bottom.update
98
- @left.update
99
- end
100
- end
1
+ module CyberarmEngine
2
+ class BorderCanvas
3
+ attr_reader :element, :top, :right, :bottom, :left
4
+ def initialize(element:)
5
+ @element = element
6
+
7
+ @top = Background.new
8
+ @right = Background.new
9
+ @bottom = Background.new
10
+ @left = Background.new
11
+ end
12
+
13
+ def color=(color)
14
+ if color.is_a?(Numeric)
15
+ @top.background = color
16
+ @right.background = color
17
+ @bottom.background = color
18
+ @left.background = color
19
+
20
+ elsif color.is_a?(Gosu::Color)
21
+ @top.background = color
22
+ @right.background = color
23
+ @bottom.background = color
24
+ @left.background = color
25
+
26
+ elsif color.is_a?(Array)
27
+ if color.size == 1
28
+ color=color.first
29
+
30
+ elsif color.size == 2
31
+ @top.background = color.first
32
+ @right.background = color.first
33
+ @bottom.background = color.last
34
+ @left.background = color.last
35
+
36
+ elsif color.size == 4
37
+ @top.background = color[0]
38
+ @right.background = color[1]
39
+ @bottom.background = color[2]
40
+ @left.background = color[3]
41
+ else
42
+ raise ArgumentError, "color array was empty or had wrong number of elements (expected 2 or 4 elements)"
43
+ end
44
+
45
+ elsif color.is_a?(Hash)
46
+ @top.background = color[:top]
47
+ @right.background = color[:right]
48
+ @bottom.background = color[:bottom]
49
+ @left.background = color[:left]
50
+ else
51
+ raise ArgumentError, "color '#{color}' of type '#{color.class}' was not able to be processed"
52
+ end
53
+ end
54
+
55
+ def draw
56
+ @top.draw
57
+ @right.draw
58
+ @bottom.draw
59
+ @left.draw
60
+ end
61
+
62
+ def update
63
+ # TOP
64
+ @top.x = @element.x# + @element.border_thickness_left
65
+ @top.y = @element.y
66
+ @top.z = @element.z
67
+
68
+ @top.width = @element.width
69
+ @top.height = @element.style.border_thickness_top
70
+
71
+ # RIGHT
72
+ @right.x = @element.x + @element.width
73
+ @right.y = @element.y + @element.style.border_thickness_top
74
+ @right.z = @element.z
75
+
76
+ @right.width = -@element.style.border_thickness_right
77
+ @right.height = @element.height - @element.style.border_thickness_top
78
+
79
+ # BOTTOM
80
+ @bottom.x = @element.x
81
+ @bottom.y = @element.y + @element.height
82
+ @bottom.z = @element.z
83
+
84
+ @bottom.width = @element.width - @element.style.border_thickness_right
85
+ @bottom.height = -@element.style.border_thickness_bottom
86
+
87
+ # LEFT
88
+ @left.x = @element.x
89
+ @left.y = @element.y
90
+ @left.z = @element.z
91
+
92
+ @left.width = @element.style.border_thickness_left
93
+ @left.height = @element.height - @element.style.border_thickness_bottom
94
+
95
+ @top.update
96
+ @right.update
97
+ @bottom.update
98
+ @left.update
99
+ end
100
+ end
101
101
  end
@@ -1,102 +1,99 @@
1
- module CyberarmEngine
2
- module DSL
3
- def flow(options = {}, &block)
4
- options[:parent] = @containers.last
5
- options[:theme] = current_theme
6
- _container = Element::Flow.new(options, block)
7
- @containers << _container
8
- _container.build
9
- _container.parent.add(_container)
10
- @containers.pop
11
-
12
- return _container
13
- end
14
-
15
- def stack(options = {}, &block)
16
- options[:parent] = @containers.last
17
- options[:theme] = current_theme
18
- _container = Element::Stack.new(options, block)
19
- @containers << _container
20
- _container.build
21
- _container.parent.add(_container)
22
- @containers.pop
23
-
24
- return _container
25
- end
26
-
27
- def label(text, options = {}, &block)
28
- options[:parent] = @containers.last
29
- options[:theme] = current_theme
30
- _element = Element::Label.new(text, options, block)
31
- @containers.last.add(_element)
32
-
33
- return _element
34
- end
35
-
36
- def button(text, options = {}, &block)
37
- options[:parent] = @containers.last
38
- options[:theme] = current_theme
39
- _element = Element::Button.new(text, options, block) { if block.is_a?(Proc); block.call; end }
40
- @containers.last.add(_element)
41
-
42
- return _element
43
- end
44
-
45
- def edit_line(text, options = {}, &block)
46
- options[:parent] = @containers.last
47
- options[:theme] = current_theme
48
- _element = Element::EditLine.new(text, options, block)
49
- @containers.last.add(_element)
50
-
51
- return _element
52
- end
53
-
54
- def toggle_button(options = {}, &block)
55
- options[:parent] = @containers.last
56
- options[:theme] = current_theme
57
- _element = Element::ToggleButton.new(options, block)
58
- @containers.last.add(_element)
59
-
60
- return _element
61
- end
62
-
63
- def check_box(text, options = {}, &block)
64
- options[:parent] = @containers.last
65
- options[:theme] = current_theme
66
- _element = Element::CheckBox.new(text, options, block)
67
- @containers.last.add(_element)
68
-
69
- return _element
70
- end
71
-
72
- def image(path, options = {}, &block)
73
- options[:parent] = @containers.last
74
- options[:theme] = current_theme
75
- _element = Element::Image.new(path, options, block)
76
- @containers.last.add(_element)
77
-
78
- return _element
79
- end
80
-
81
- def progress(options = {}, &block)
82
- options[:parent] = @containers.last
83
- options[:theme] = current_theme
84
- _element = Element::Progress.new(options, block)
85
- @containers.last.add(_element)
86
-
87
- return _element
88
- end
89
-
90
- def background(color = Gosu::Color::NONE)
91
- @containers.last.style.background = color
92
- end
93
-
94
- def theme(theme)
95
- @containers.last.options[:theme] = theme
96
- end
97
-
98
- def current_theme
99
- @containers.last.options[:theme]
100
- end
101
- end
1
+ module CyberarmEngine
2
+ module DSL
3
+ def flow(options = {}, &block)
4
+ container(CyberarmEngine::Element::Flow, options, &block)
5
+ end
6
+
7
+ def stack(options = {}, &block)
8
+ container(CyberarmEngine::Element::Stack, options, &block)
9
+ end
10
+
11
+ def label(text, options = {}, &block)
12
+ options[:parent] = element_parent
13
+ options[:theme] = current_theme
14
+
15
+ add_element( Element::Label.new(text, options, block) )
16
+ end
17
+
18
+ def button(text, options = {}, &block)
19
+ options[:parent] = element_parent
20
+ options[:theme] = current_theme
21
+
22
+ add_element( Element::Button.new(text, options, block) { if block.is_a?(Proc); block.call; end } )
23
+ end
24
+
25
+ def edit_line(text, options = {}, &block)
26
+ options[:parent] = element_parent
27
+ options[:theme] = current_theme
28
+
29
+ add_element( Element::EditLine.new(text, options, block) )
30
+ end
31
+
32
+ def toggle_button(options = {}, &block)
33
+ options[:parent] = element_parent
34
+ options[:theme] = current_theme
35
+
36
+ add_element( Element::ToggleButton.new(options, block) )
37
+ end
38
+
39
+ def check_box(text, options = {}, &block)
40
+ options[:parent] = element_parent
41
+ options[:theme] = current_theme
42
+
43
+ add_element( Element::CheckBox.new(text, options, block) )
44
+ end
45
+
46
+ def image(path, options = {}, &block)
47
+ options[:parent] = element_parent
48
+ options[:theme] = current_theme
49
+
50
+ add_element( Element::Image.new(path, options, block) )
51
+ end
52
+
53
+ def progress(options = {}, &block)
54
+ options[:parent] = element_parent
55
+ options[:theme] = current_theme
56
+
57
+ add_element( Element::Progress.new(options, block) )
58
+ end
59
+
60
+ def background(color = Gosu::Color::NONE)
61
+ element_parent.style.background = color
62
+ end
63
+
64
+ def theme(theme)
65
+ element_parent.options[:theme] = theme
66
+ end
67
+
68
+ def current_theme
69
+ element_parent.options[:theme]
70
+ end
71
+
72
+ private def add_element(element)
73
+ element_parent.add(element)
74
+
75
+ return element
76
+ end
77
+
78
+ private def element_parent
79
+ $__current_container__
80
+ end
81
+
82
+ private def container(klass, options = {}, &block)
83
+ options[:parent] = element_parent
84
+ options[:theme] = current_theme
85
+
86
+ _container = klass.new(options, block)
87
+
88
+ old_parent = element_parent
89
+ $__current_container__ = _container
90
+
91
+ _container.build
92
+ _container.parent.add(_container)
93
+
94
+ $__current_container__ = old_parent
95
+
96
+ return _container
97
+ end
98
+ end
102
99
  end
@@ -1,260 +1,276 @@
1
- module CyberarmEngine
2
- class Element
3
- include Theme
4
- include Event
5
- include Common
6
-
7
- attr_accessor :x, :y, :z, :enabled
8
- attr_reader :parent, :options, :style, :event_handler, :background_canvas, :border_canvas
9
-
10
- def initialize(options = {}, block = nil)
11
- @parent = options.delete(:parent) # parent Container (i.e. flow/stack)
12
- options = theme_defaults(options)
13
- @options = options
14
- @block = block
15
-
16
- @focus = false
17
- @enabled = true
18
- @visible = true
19
-
20
- @style = Style.new(options)
21
-
22
- @x = @style.x
23
- @y = @style.y
24
- @z = @style.z
25
-
26
- @width = 0
27
- @height = 0
28
-
29
- @fixed_x = @x if @x != 0
30
- @fixed_y = @y if @y != 0
31
-
32
- @style.width = default(:width) || nil
33
- @style.height = default(:height) || nil
34
-
35
- @style.background_canvas = Background.new
36
- @style.border_canvas = BorderCanvas.new(element: self)
37
-
38
- stylize
39
-
40
- default_events
41
- end
42
-
43
- def stylize
44
- set_border_thickness(@style.border_thickness)
45
-
46
- set_padding(@style.padding)
47
-
48
- set_margin(@style.margin)
49
-
50
- set_background(@style.background)
51
- set_border_color(@style.border_color)
52
- end
53
-
54
- def set_background(background)
55
- @style.background = background
56
- @style.background_canvas.background = background
57
- end
58
-
59
- def set_border_thickness(border_thickness)
60
- @style.border_thickness = border_thickness
61
-
62
- @style.border_thickness_left = default(:border_thickness_left) || @style.border_thickness
63
- @style.border_thickness_right = default(:border_thickness_right) || @style.border_thickness
64
- @style.border_thickness_top = default(:border_thickness_top) || @style.border_thickness
65
- @style.border_thickness_bottom = default(:border_thickness_bottom) || @style.border_thickness
66
- end
67
-
68
- def set_border_color(color)
69
- @style.border_color = color
70
-
71
- @style.border_color_left = default(:border_color_left) || @style.border_color
72
- @style.border_color_right = default(:border_color_right) || @style.border_color
73
- @style.border_color_top = default(:border_color_top) || @style.border_color
74
- @style.border_color_bottom = default(:border_color_bottom) || @style.border_color
75
-
76
- @style.border_canvas.color = color
77
- end
78
-
79
- def set_padding(padding)
80
- @style.padding = padding
81
-
82
- @style.padding_left = default(:padding_left) || @style.padding
83
- @style.padding_right = default(:padding_right) || @style.padding
84
- @style.padding_top = default(:padding_top) || @style.padding
85
- @style.padding_bottom = default(:padding_bottom) || @style.padding
86
- end
87
-
88
- def set_margin(margin)
89
- @style.margin = margin
90
-
91
- @style.margin_left = default(:margin_left) || @style.margin
92
- @style.margin_right = default(:margin_right) || @style.margin
93
- @style.margin_top = default(:margin_top) || @style.margin
94
- @style.margin_bottom = default(:margin_bottom) || @style.margin
95
- end
96
-
97
- def default_events
98
- [:left, :middle, :right].each do |button|
99
- event(:"#{button}_mouse_button")
100
- event(:"released_#{button}_mouse_button")
101
- event(:"clicked_#{button}_mouse_button")
102
- event(:"holding_#{button}_mouse_button")
103
- end
104
-
105
- event(:mouse_wheel_up)
106
- event(:mouse_wheel_down)
107
-
108
- event(:enter)
109
- event(:hover)
110
- event(:leave)
111
-
112
- event(:blur)
113
- end
114
-
115
- def enabled?
116
- @enabled
117
- end
118
-
119
- def visible?
120
- @visible
121
- end
122
-
123
- def toggle
124
- @visible = !@visible
125
- root.gui_state.request_recalculate
126
- end
127
-
128
- def show
129
- @visible = true
130
- root.gui_state.request_recalculate
131
- end
132
-
133
- def hide
134
- @visible = false
135
- root.gui_state.request_recalculate
136
- end
137
-
138
- def draw
139
- return unless @visible
140
-
141
- @style.background_canvas.draw
142
- @style.border_canvas.draw
143
- render
144
- end
145
-
146
- def update
147
- end
148
-
149
- def button_down(id)
150
- end
151
-
152
- def button_up(id)
153
- end
154
-
155
- def render
156
- end
157
-
158
- def hit?(x, y)
159
- x.between?(@x, @x + width) &&
160
- y.between?(@y, @y + height)
161
- end
162
-
163
- def width
164
- if visible?
165
- inner_width + @width
166
- else
167
- 0
168
- end
169
- end
170
-
171
- def outer_width
172
- @style.margin_left + width + @style.margin_right
173
- end
174
-
175
- def inner_width
176
- (@style.border_thickness_left + @style.padding_left) + (@style.padding_right + @style.border_thickness_right)
177
- end
178
-
179
- def height
180
- if visible?
181
- inner_height + @height
182
- else
183
- 0
184
- end
185
- end
186
-
187
- def outer_height
188
- @style.margin_top + height + @style.margin_bottom
189
- end
190
-
191
- def inner_height
192
- (@style.border_thickness_top + @style.padding_top) + (@style.padding_bottom + @style.border_thickness_bottom)
193
- end
194
-
195
- private def dimensional_size(size, dimension)
196
- raise "dimension must be either :width or :height" unless dimension == :width || dimension == :height
197
- if size && size.is_a?(Numeric)
198
- if size.between?(0.0, 1.0)
199
- @parent.send(:"#{dimension}") * size
200
- else
201
- size
202
- end
203
- else
204
- nil
205
- end
206
- end
207
-
208
- def background=(_background)
209
- @style.background_canvas.background=(_background)
210
- update_background
211
- end
212
-
213
- def update_background
214
- @style.background_canvas.x = @x
215
- @style.background_canvas.y = @y
216
- @style.background_canvas.z = @z
217
- @style.background_canvas.width = width
218
- @style.background_canvas.height = height
219
-
220
- @style.background_canvas.update
221
-
222
- @style.border_canvas.update
223
- end
224
-
225
- def root
226
- unless @root && @root.parent.nil?
227
- @root = parent
228
-
229
- loop do
230
- if @root.parent.nil?
231
- break
232
- else
233
- @root = @root.parent
234
- end
235
- end
236
- end
237
-
238
- @root
239
- end
240
-
241
- def is_root?
242
- @gui_state != nil
243
- end
244
-
245
- def recalculate
246
- raise "#{self.class}#recalculate was not overridden!"
247
- end
248
-
249
- def reposition
250
- end
251
-
252
- def value
253
- raise "#{self.class}#value was not overridden!"
254
- end
255
-
256
- def value=(value)
257
- raise "#{self.class}#value= was not overridden!"
258
- end
259
- end
1
+ module CyberarmEngine
2
+ class Element
3
+ include Theme
4
+ include Event
5
+ include Common
6
+
7
+ attr_accessor :x, :y, :z, :enabled
8
+ attr_reader :parent, :options, :style, :event_handler, :background_canvas, :border_canvas
9
+
10
+ def initialize(options = {}, block = nil)
11
+ @parent = options.delete(:parent) # parent Container (i.e. flow/stack)
12
+ options = theme_defaults(options)
13
+ @options = options
14
+ @block = block
15
+
16
+ @focus = false
17
+ @enabled = true
18
+ @visible = true
19
+
20
+ @style = Style.new(options)
21
+
22
+ @x = @style.x
23
+ @y = @style.y
24
+ @z = @style.z
25
+
26
+ @width = 0
27
+ @height = 0
28
+
29
+ @fixed_x = @x if @x != 0
30
+ @fixed_y = @y if @y != 0
31
+
32
+ @style.width = default(:width) || nil
33
+ @style.height = default(:height) || nil
34
+
35
+ @style.background_canvas = Background.new
36
+ @style.border_canvas = BorderCanvas.new(element: self)
37
+
38
+ stylize
39
+
40
+ default_events
41
+ end
42
+
43
+ def stylize
44
+ set_border_thickness(@style.border_thickness)
45
+
46
+ set_padding(@style.padding)
47
+
48
+ set_margin(@style.margin)
49
+
50
+ set_background(@style.background)
51
+ set_border_color(@style.border_color)
52
+ end
53
+
54
+ def set_background(background)
55
+ @style.background = background
56
+ @style.background_canvas.background = background
57
+ end
58
+
59
+ def set_border_thickness(border_thickness)
60
+ @style.border_thickness = border_thickness
61
+
62
+ @style.border_thickness_left = default(:border_thickness_left) || @style.border_thickness
63
+ @style.border_thickness_right = default(:border_thickness_right) || @style.border_thickness
64
+ @style.border_thickness_top = default(:border_thickness_top) || @style.border_thickness
65
+ @style.border_thickness_bottom = default(:border_thickness_bottom) || @style.border_thickness
66
+ end
67
+
68
+ def set_border_color(color)
69
+ @style.border_color = color
70
+
71
+ @style.border_color_left = default(:border_color_left) || @style.border_color
72
+ @style.border_color_right = default(:border_color_right) || @style.border_color
73
+ @style.border_color_top = default(:border_color_top) || @style.border_color
74
+ @style.border_color_bottom = default(:border_color_bottom) || @style.border_color
75
+
76
+ @style.border_canvas.color = color
77
+ end
78
+
79
+ def set_padding(padding)
80
+ @style.padding = padding
81
+
82
+ @style.padding_left = default(:padding_left) || @style.padding
83
+ @style.padding_right = default(:padding_right) || @style.padding
84
+ @style.padding_top = default(:padding_top) || @style.padding
85
+ @style.padding_bottom = default(:padding_bottom) || @style.padding
86
+ end
87
+
88
+ def set_margin(margin)
89
+ @style.margin = margin
90
+
91
+ @style.margin_left = default(:margin_left) || @style.margin
92
+ @style.margin_right = default(:margin_right) || @style.margin
93
+ @style.margin_top = default(:margin_top) || @style.margin
94
+ @style.margin_bottom = default(:margin_bottom) || @style.margin
95
+ end
96
+
97
+ def default_events
98
+ [:left, :middle, :right].each do |button|
99
+ event(:"#{button}_mouse_button")
100
+ event(:"released_#{button}_mouse_button")
101
+ event(:"clicked_#{button}_mouse_button")
102
+ event(:"holding_#{button}_mouse_button")
103
+ end
104
+
105
+ event(:mouse_wheel_up)
106
+ event(:mouse_wheel_down)
107
+
108
+ event(:enter)
109
+ event(:hover)
110
+ event(:leave)
111
+
112
+ event(:blur)
113
+ end
114
+
115
+ def enabled?
116
+ @enabled
117
+ end
118
+
119
+ def visible?
120
+ @visible
121
+ end
122
+
123
+ def toggle
124
+ @visible = !@visible
125
+ root.gui_state.request_recalculate
126
+ end
127
+
128
+ def show
129
+ @visible = true
130
+ root.gui_state.request_recalculate
131
+ end
132
+
133
+ def hide
134
+ @visible = false
135
+ root.gui_state.request_recalculate
136
+ end
137
+
138
+ def draw
139
+ return unless @visible
140
+
141
+ @style.background_canvas.draw
142
+ @style.border_canvas.draw
143
+ render
144
+ end
145
+
146
+ def update
147
+ end
148
+
149
+ def button_down(id)
150
+ end
151
+
152
+ def button_up(id)
153
+ end
154
+
155
+ def render
156
+ end
157
+
158
+ def hit?(x, y)
159
+ x.between?(@x, @x + width) &&
160
+ y.between?(@y, @y + height)
161
+ end
162
+
163
+ def width
164
+ if visible?
165
+ inner_width + @width
166
+ else
167
+ 0
168
+ end
169
+ end
170
+
171
+ def content_width
172
+ @width
173
+ end
174
+
175
+ def noncontent_width
176
+ (inner_width + outer_width) - width
177
+ end
178
+
179
+ def outer_width
180
+ @style.margin_left + width + @style.margin_right
181
+ end
182
+
183
+ def inner_width
184
+ (@style.border_thickness_left + @style.padding_left) + (@style.padding_right + @style.border_thickness_right)
185
+ end
186
+
187
+ def height
188
+ if visible?
189
+ inner_height + @height
190
+ else
191
+ 0
192
+ end
193
+ end
194
+
195
+ def content_height
196
+ @height
197
+ end
198
+
199
+ def noncontent_height
200
+ (inner_height + outer_height) - height
201
+ end
202
+
203
+ def outer_height
204
+ @style.margin_top + height + @style.margin_bottom
205
+ end
206
+
207
+ def inner_height
208
+ (@style.border_thickness_top + @style.padding_top) + (@style.padding_bottom + @style.border_thickness_bottom)
209
+ end
210
+
211
+ private def dimensional_size(size, dimension)
212
+ raise "dimension must be either :width or :height" unless dimension == :width || dimension == :height
213
+ if size && size.is_a?(Numeric)
214
+ if size.between?(0.0, 1.0)
215
+ ((@parent.send(:"content_#{dimension}") - self.send(:"noncontent_#{dimension}") - 1) * size).round
216
+ else
217
+ size
218
+ end
219
+ else
220
+ nil
221
+ end
222
+ end
223
+
224
+ def background=(_background)
225
+ @style.background_canvas.background=(_background)
226
+ update_background
227
+ end
228
+
229
+ def update_background
230
+ @style.background_canvas.x = @x
231
+ @style.background_canvas.y = @y
232
+ @style.background_canvas.z = @z
233
+ @style.background_canvas.width = width
234
+ @style.background_canvas.height = height
235
+
236
+ @style.background_canvas.update
237
+
238
+ @style.border_canvas.update
239
+ end
240
+
241
+ def root
242
+ unless @root && @root.parent.nil?
243
+ @root = parent
244
+
245
+ loop do
246
+ if @root.parent.nil?
247
+ break
248
+ else
249
+ @root = @root.parent
250
+ end
251
+ end
252
+ end
253
+
254
+ @root
255
+ end
256
+
257
+ def is_root?
258
+ @gui_state != nil
259
+ end
260
+
261
+ def recalculate
262
+ raise "#{self.class}#recalculate was not overridden!"
263
+ end
264
+
265
+ def reposition
266
+ end
267
+
268
+ def value
269
+ raise "#{self.class}#value was not overridden!"
270
+ end
271
+
272
+ def value=(value)
273
+ raise "#{self.class}#value= was not overridden!"
274
+ end
275
+ end
260
276
  end