cyberarm_engine 0.16.0 → 0.19.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -4
  3. data/assets/textures/logo.png +0 -0
  4. data/cyberarm_engine.gemspec +2 -2
  5. data/lib/cyberarm_engine/animator.rb +172 -9
  6. data/lib/cyberarm_engine/background_nine_slice.rb +51 -34
  7. data/lib/cyberarm_engine/builtin/intro_state.rb +131 -0
  8. data/lib/cyberarm_engine/common.rb +19 -2
  9. data/lib/cyberarm_engine/console/command.rb +158 -0
  10. data/lib/cyberarm_engine/console/commands/help_command.rb +43 -0
  11. data/lib/cyberarm_engine/console/subcommand.rb +100 -0
  12. data/lib/cyberarm_engine/console.rb +248 -0
  13. data/lib/cyberarm_engine/game_state.rb +5 -0
  14. data/lib/cyberarm_engine/model.rb +6 -1
  15. data/lib/cyberarm_engine/opengl/perspective_camera.rb +2 -2
  16. data/lib/cyberarm_engine/opengl/renderer/opengl_renderer.rb +9 -0
  17. data/lib/cyberarm_engine/opengl/texture.rb +1 -1
  18. data/lib/cyberarm_engine/text.rb +82 -45
  19. data/lib/cyberarm_engine/ui/dsl.rb +3 -2
  20. data/lib/cyberarm_engine/ui/element.rb +236 -47
  21. data/lib/cyberarm_engine/ui/elements/button.rb +0 -63
  22. data/lib/cyberarm_engine/ui/elements/check_box.rb +4 -1
  23. data/lib/cyberarm_engine/ui/elements/container.rb +65 -35
  24. data/lib/cyberarm_engine/ui/elements/edit_line.rb +20 -13
  25. data/lib/cyberarm_engine/ui/elements/text_block.rb +13 -7
  26. data/lib/cyberarm_engine/ui/event.rb +9 -2
  27. data/lib/cyberarm_engine/ui/gui_state.rb +37 -4
  28. data/lib/cyberarm_engine/ui/style.rb +14 -3
  29. data/lib/cyberarm_engine/ui/theme.rb +26 -1
  30. data/lib/cyberarm_engine/version.rb +1 -1
  31. data/lib/cyberarm_engine/window.rb +7 -1
  32. data/lib/cyberarm_engine.rb +11 -4
  33. metadata +12 -7
  34. data/lib/cyberarm_engine/ui/elements/label.rb +0 -156
@@ -4,19 +4,20 @@ module CyberarmEngine
4
4
  include Common
5
5
 
6
6
  attr_accessor :stroke_color, :fill_color
7
- attr_reader :children, :gui_state, :scroll_x, :scroll_y
7
+ attr_reader :children, :gui_state, :scroll_position
8
8
 
9
9
  def initialize(options = {}, block = nil)
10
10
  @gui_state = options.delete(:gui_state)
11
11
  super
12
12
 
13
- @scroll_x = 0
14
- @scroll_y = 0
15
- @scroll_speed = 10
13
+ @scroll_position = Vector.new(0, 0)
14
+ @scroll_speed = 40
16
15
 
17
16
  @text_color = options[:color]
18
17
 
19
18
  @children = []
19
+
20
+ event(:window_size_changed)
20
21
  end
21
22
 
22
23
  def build
@@ -44,34 +45,28 @@ module CyberarmEngine
44
45
  root.gui_state.request_recalculate
45
46
  end
46
47
 
48
+ def apend(&block)
49
+ old_container = $__current_container__
50
+
51
+ $__current_container__ = self
52
+ block.call(self) if block
53
+
54
+ $__current_container__ = old_container
55
+
56
+ root.gui_state.request_recalculate
57
+ end
58
+
47
59
  def render
48
60
  Gosu.clip_to(@x, @y, width, height) do
49
61
  @children.each(&:draw)
50
62
  end
63
+ end
64
+
65
+ def debug_draw
66
+ super
51
67
 
52
- if false # DEBUG
53
- Gosu.flush
54
-
55
- Gosu.draw_line(
56
- x, y, Gosu::Color::RED,
57
- x + outer_width, y, Gosu::Color::RED,
58
- Float::INFINITY
59
- )
60
- Gosu.draw_line(
61
- x + outer_width, y, Gosu::Color::RED,
62
- x + outer_width, y + outer_height, Gosu::Color::RED,
63
- Float::INFINITY
64
- )
65
- Gosu.draw_line(
66
- x + outer_width, y + outer_height, Gosu::Color::RED,
67
- x, y + outer_height, Gosu::Color::RED,
68
- Float::INFINITY
69
- )
70
- Gosu.draw_line(
71
- x, outer_height, Gosu::Color::RED,
72
- x, y, Gosu::Color::RED,
73
- Float::INFINITY
74
- )
68
+ @children.each do |child|
69
+ child.debug_draw
75
70
  end
76
71
  end
77
72
 
@@ -80,6 +75,8 @@ module CyberarmEngine
80
75
  end
81
76
 
82
77
  def hit_element?(x, y)
78
+ return unless hit?(x, y)
79
+
83
80
  @children.reverse_each do |child|
84
81
  next unless child.visible?
85
82
 
@@ -98,6 +95,8 @@ module CyberarmEngine
98
95
 
99
96
  def recalculate
100
97
  @current_position = Vector.new(@style.margin_left + @style.padding_left, @style.margin_top + @style.padding_top)
98
+ @current_position += @scroll_position
99
+
101
100
  return unless visible?
102
101
 
103
102
  Stats.increment(:gui_recalculations_last_frame, 1)
@@ -189,15 +188,46 @@ module CyberarmEngine
189
188
  @current_position.y += element.outer_height
190
189
  end
191
190
 
192
- # def mouse_wheel_up(sender, x, y)
193
- # @children.each {|c| c.y -= @scroll_speed}
194
- # @children.each {|c| c.recalculate}
195
- # end
191
+ def mouse_wheel_up(sender, x, y)
192
+ return unless @style.scroll
196
193
 
197
- # def mouse_wheel_down(sender, x, y)
198
- # @children.each {|c| c.y += @scroll_speed}
199
- # @children.each {|c| c.recalculate}
200
- # end
194
+ if @scroll_position.y < 0
195
+ @scroll_position.y += @scroll_speed
196
+ @scroll_position.y = 0 if @scroll_position.y > 0
197
+ recalculate
198
+
199
+ return :handled
200
+ end
201
+ end
202
+
203
+ def mouse_wheel_down(sender, x, y)
204
+ return unless @style.scroll
205
+
206
+ return unless height < scroll_height
207
+
208
+ if @scroll_position.y.abs < max_scroll_height
209
+ @scroll_position.y -= @scroll_speed
210
+ @scroll_position.y = -max_scroll_height if @scroll_position.y.abs > max_scroll_height
211
+ recalculate
212
+
213
+ return :handled
214
+ end
215
+ end
216
+
217
+ def scroll_top
218
+ @scroll_position.y
219
+ end
220
+
221
+ def scroll_top=(n)
222
+ n = 0 if n <= 0
223
+ @scroll_position.y = -n
224
+
225
+ if max_scroll_height.positive?
226
+ @scroll_position.y = -max_scroll_height if @scroll_position.y.abs > max_scroll_height
227
+ else
228
+ @scroll_position.y = 0
229
+ end
230
+ end
201
231
 
202
232
  def value
203
233
  @children.map { |c| c.class }.join(", ")
@@ -59,6 +59,8 @@ module CyberarmEngine
59
59
  end
60
60
 
61
61
  def update
62
+ @style_event = :active if @focus
63
+
62
64
  @text.text = if @type == :password
63
65
  default(:password_character) * @text_input.text.length
64
66
  else
@@ -67,6 +69,8 @@ module CyberarmEngine
67
69
 
68
70
  if @last_text_value != value
69
71
  @last_text_value = value
72
+ @show_caret = true
73
+ @caret_last_interval = Gosu.milliseconds
70
74
 
71
75
  publish(:changed, value)
72
76
  end
@@ -192,28 +196,27 @@ module CyberarmEngine
192
196
  :handled
193
197
  end
194
198
 
195
- def enter(_sender)
196
- if @focus
197
- @style.background_canvas.background = default(:active, :background)
198
- @text.color = default(:active, :color)
199
- else
200
- @style.background_canvas.background = default(:hover, :background)
201
- @text.color = default(:hover, :color)
202
- end
199
+ def focus(sender)
200
+ super
201
+
202
+ window.text_input = @text_input
203
+ @text_input.caret_pos = @text_input.selection_start = @text_input.text.length
203
204
 
204
205
  :handled
205
206
  end
206
207
 
207
- def leave(sender)
208
- super unless @focus
208
+ def enter(sender)
209
+ _has_focus = @focus
210
+
211
+ super
212
+
213
+ @focus = _has_focus
209
214
 
210
215
  :handled
211
216
  end
212
217
 
213
218
  def blur(_sender)
214
- @focus = false
215
- @style.background_canvas.background = default(:background)
216
- @text.color = default(:color)
219
+ super
217
220
  window.text_input = nil
218
221
 
219
222
  :handled
@@ -251,6 +254,10 @@ module CyberarmEngine
251
254
  def value
252
255
  @text_input.text
253
256
  end
257
+
258
+ def value=(string)
259
+ @text_input.text = string
260
+ end
254
261
  end
255
262
  end
256
263
  end
@@ -8,7 +8,10 @@ module CyberarmEngine
8
8
  text, font: @options[:font], z: @z, color: @options[:color],
9
9
  size: @options[:text_size], shadow: @options[:text_shadow],
10
10
  shadow_size: @options[:text_shadow_size],
11
- shadow_color: @options[:text_shadow_color]
11
+ shadow_color: @options[:text_shadow_color],
12
+ border: @options[:text_border],
13
+ border_size: @options[:text_border_size],
14
+ border_color: @options[:text_border_color]
12
15
  )
13
16
 
14
17
  @raw_text = text
@@ -18,13 +21,13 @@ module CyberarmEngine
18
21
  @text.draw
19
22
  end
20
23
 
21
- def clicked_left_mouse_button(_sender, _x, _y)
22
- @block&.call(self) if @enabled
23
-
24
- # return :handled
25
- end
26
-
27
24
  def recalculate
25
+ unless @enabled
26
+ @text.color = @style.disabled[:color]
27
+ else
28
+ @text.color = @style.color
29
+ end
30
+
28
31
  @width = 0
29
32
  @height = 0
30
33
 
@@ -152,5 +155,8 @@ module CyberarmEngine
152
155
 
153
156
  class ToolTip < TextBlock
154
157
  end
158
+
159
+ class Link < TextBlock
160
+ end
155
161
  end
156
162
  end
@@ -15,12 +15,19 @@ module CyberarmEngine
15
15
 
16
16
  return unless enabled?
17
17
 
18
- return :handled if respond_to?(event) && (send(event, self, *args) == :handled)
18
+ was_handled = false
19
+
20
+ was_handled = true if respond_to?(event) && (send(event, self, *args) == :handled)
19
21
 
20
22
  @event_handler[event].reverse_each do |handler|
21
- return :handled if handler.call(self, *args) == :handled
23
+ if handler.call(self, *args) == :handled
24
+ was_handled = true
25
+ break
26
+ end
22
27
  end
23
28
 
29
+ return :handled if was_handled
30
+
24
31
  parent.publish(event, *args) if parent
25
32
  nil
26
33
  end
@@ -26,12 +26,15 @@ module CyberarmEngine
26
26
  @dragging_element = nil
27
27
  @pending_recalculate_request = false
28
28
 
29
- @tip = Element::ToolTip.new("", parent: @root_container, z: Float::INFINITY)
30
29
  @menu = nil
31
30
  @min_drag_distance = 0
32
31
  @mouse_pos = Vector.new
33
32
  end
34
33
 
34
+ def post_setup
35
+ @tip = Element::ToolTip.new("", parent: @root_container, z: Float::INFINITY, theme: current_theme)
36
+ end
37
+
35
38
  # throws :blur event to focused element and sets GuiState focused element
36
39
  # Does NOT throw :focus event at element or set element as focused
37
40
  def focus=(element)
@@ -55,6 +58,12 @@ module CyberarmEngine
55
58
  Gosu.flush
56
59
  @tip.draw
57
60
  end
61
+
62
+ if defined?(GUI_DEBUG)
63
+ Gosu.flush
64
+
65
+ @root_container.debug_draw
66
+ end
58
67
  end
59
68
 
60
69
  def update
@@ -66,6 +75,13 @@ module CyberarmEngine
66
75
  @pending_recalculate_request = false
67
76
  end
68
77
 
78
+ if @pending_focus_request
79
+ @pending_focus_request = false
80
+
81
+ self.focus = @pending_focus_element
82
+ @pending_focus_element.publish(:focus)
83
+ end
84
+
69
85
  @menu&.update
70
86
  super
71
87
 
@@ -87,10 +103,10 @@ module CyberarmEngine
87
103
  if Vector.new(window.mouse_x, window.mouse_y) == @last_mouse_pos
88
104
  if @mouse_over && (Gosu.milliseconds - @mouse_moved_at) > tool_tip_delay
89
105
  @tip.value = @mouse_over.tip if @mouse_over
90
- @tip.x = window.mouse_x - @tip.width / 2
106
+ @tip.x = window.mouse_x
91
107
  @tip.x = 0 if @tip.x < 0
92
108
  @tip.x = window.width - @tip.width if @tip.x + @tip.width > window.width
93
- @tip.y = window.mouse_y - @tip.height
109
+ @tip.y = window.mouse_y - (@tip.height + 5)
94
110
  @tip.y = 0 if @tip.y < 0
95
111
  @tip.y = window.height - @tip.height if @tip.y + @tip.height > window.height
96
112
  @tip.update
@@ -105,7 +121,10 @@ module CyberarmEngine
105
121
  @last_mouse_pos = Vector.new(window.mouse_x, window.mouse_y)
106
122
  @mouse_pos = @last_mouse_pos.clone
107
123
 
108
- request_recalculate if @active_width != window.width || @active_height != window.height
124
+ if @active_width != window.width || @active_height != window.height
125
+ request_recalculate
126
+ @root_container.publish(:window_size_changed)
127
+ end
109
128
 
110
129
  @active_width = window.width
111
130
  @active_height = window.height
@@ -212,6 +231,11 @@ module CyberarmEngine
212
231
  @pending_recalculate_request = true
213
232
  end
214
233
 
234
+ def request_focus(element)
235
+ @pending_focus_request = true
236
+ @pending_focus_element = element
237
+ end
238
+
215
239
  def show_menu(list_box)
216
240
  @menu = list_box
217
241
  end
@@ -219,5 +243,14 @@ module CyberarmEngine
219
243
  def hide_menu
220
244
  @menu = nil
221
245
  end
246
+
247
+ def to_s
248
+ # "#{self.class} children=#{@children.map { |c| c.to_s }}"
249
+ @root_container.to_s
250
+ end
251
+
252
+ def inspect
253
+ to_s
254
+ end
222
255
  end
223
256
  end
@@ -17,8 +17,20 @@ end
17
17
 
18
18
  module CyberarmEngine
19
19
  class Style
20
+ attr_reader :hash
21
+
20
22
  def initialize(hash = {})
21
- @hash = Marshal.load(Marshal.dump(hash))
23
+ h = Marshal.load(Marshal.dump(hash))
24
+
25
+ h[:default] = {}
26
+
27
+ h.each do |key, value|
28
+ next if value.is_a?(Hash)
29
+
30
+ h[:default][key] = value
31
+ end
32
+
33
+ @hash = h
22
34
  end
23
35
 
24
36
  def method_missing(method, *args)
@@ -27,9 +39,8 @@ module CyberarmEngine
27
39
 
28
40
  @hash[method.to_s.sub("=", "").to_sym] = args.first
29
41
 
30
- elsif args.size == 0
42
+ elsif args.empty?
31
43
  @hash[method]
32
-
33
44
  else
34
45
  raise ArgumentError, "Did not expect arguments"
35
46
  end
@@ -64,6 +64,10 @@ module CyberarmEngine
64
64
  border_radius: 0
65
65
  },
66
66
 
67
+ Container: { # < Element (Base class for Stack and Flow)
68
+ debug_color: Gosu::Color::YELLOW
69
+ },
70
+
67
71
  Button: { # < Label
68
72
  margin: 1,
69
73
  padding: 4,
@@ -111,10 +115,14 @@ module CyberarmEngine
111
115
  text_size: 28,
112
116
  text_wrap: :word_wrap, # :word_wrap, :break_word, :none
113
117
  text_shadow: false,
118
+ text_border: false,
114
119
  text_align: :left,
115
120
  font: "Arial",
116
121
  margin: 0,
117
- padding: 2
122
+ padding: 2,
123
+ disabled: {
124
+ color: Gosu::Color.rgb(175, 175, 175),
125
+ }
118
126
  },
119
127
 
120
128
  Banner: { # < TextBlock
@@ -155,11 +163,28 @@ module CyberarmEngine
155
163
  border_color: 0xffaaaaaa,
156
164
  background: 0xff404040
157
165
  },
166
+ Link: { # < TextBlock
167
+ color: Gosu::Color::BLUE,
168
+ border_thickness: 1,
169
+ border_bottom_color: Gosu::Color::BLUE,
170
+ hover: {
171
+ color: 0xff_ff00ff,
172
+ border_bottom_color: 0xff_ff00ff
173
+ },
174
+ active: {
175
+ color: 0xff_ff0000,
176
+ border_bottom_color: 0xff_ff0000
177
+ }
178
+ },
158
179
 
159
180
  ToggleButton: { # < Button
160
181
  checkmark: "√"
161
182
  },
162
183
 
184
+ CheckBox: { # < Flow
185
+ text_wrap: :none
186
+ },
187
+
163
188
  Progress: { # < Element
164
189
  width: 250,
165
190
  height: 36,
@@ -1,4 +1,4 @@
1
1
  module CyberarmEngine
2
2
  NAME = "InDev".freeze
3
- VERSION = "0.16.0".freeze
3
+ VERSION = "0.19.0".freeze
4
4
  end
@@ -77,10 +77,12 @@ module CyberarmEngine
77
77
  if klass.instance_of?(klass.class) && defined?(klass.options)
78
78
  @states << klass
79
79
  klass.setup if options[:setup]
80
+ klass.post_setup if options[:setup]
80
81
  else
81
82
  @states << klass.new(options) if child_of?(klass, GameState)
82
83
  @states << klass.new if child_of?(klass, Element::Container)
83
84
  current_state.setup if current_state.instance_of?(klass) && options[:setup]
85
+ current_state.post_setup if current_state.instance_of?(klass) && options[:setup]
84
86
  end
85
87
  end
86
88
 
@@ -93,7 +95,7 @@ module CyberarmEngine
93
95
  end
94
96
 
95
97
  def previous_state
96
- if @states.size > 1 && state = @states[@states.size - 2]
98
+ if @states.size > 1 && (state = @states[@states.size - 2])
97
99
  state
98
100
  end
99
101
  end
@@ -102,6 +104,10 @@ module CyberarmEngine
102
104
  @states.pop
103
105
  end
104
106
 
107
+ def shift_state
108
+ @states.shift
109
+ end
110
+
105
111
  # Sourced from https://gist.github.com/ippa/662583
106
112
  def draw_circle(cx, cy, r, z = 9999, color = Gosu::Color::GREEN, step = 10)
107
113
  0.step(360, step) do |a1|
@@ -1,9 +1,8 @@
1
1
  CYBERARM_ENGINE_ROOT_PATH = File.expand_path("..", __dir__)
2
2
 
3
- begin
4
- require File.expand_path("../../ffi-gosu/lib/gosu", File.dirname(__FILE__))
5
- rescue LoadError => e
6
- pp e
3
+ if ARGV.join.include?("--ffi-gosu")
4
+ require File.expand_path("../../ffi-gosu/lib/gosu", __dir__)
5
+ else
7
6
  require "gosu"
8
7
  end
9
8
  require "json"
@@ -24,12 +23,18 @@ require_relative "cyberarm_engine/vector"
24
23
  require_relative "cyberarm_engine/transform"
25
24
  require_relative "cyberarm_engine/ray"
26
25
  require_relative "cyberarm_engine/background"
26
+ require_relative "cyberarm_engine/background_nine_slice"
27
27
  require_relative "cyberarm_engine/animator"
28
28
 
29
29
  require_relative "cyberarm_engine/text"
30
30
  require_relative "cyberarm_engine/timer"
31
31
  require_relative "cyberarm_engine/config_file"
32
32
 
33
+ require_relative "cyberarm_engine/console"
34
+ require_relative "cyberarm_engine/console/command"
35
+ require_relative "cyberarm_engine/console/subcommand"
36
+ require_relative "cyberarm_engine/console/commands/help_command"
37
+
33
38
  require_relative "cyberarm_engine/ui/dsl"
34
39
 
35
40
  require_relative "cyberarm_engine/ui/theme"
@@ -62,3 +67,5 @@ require_relative "cyberarm_engine/model/model_object"
62
67
  require_relative "cyberarm_engine/model/parser"
63
68
  require_relative "cyberarm_engine/model/parsers/wavefront_parser"
64
69
  require_relative "cyberarm_engine/model/parsers/collada_parser" if defined?(Nokogiri)
70
+
71
+ require_relative "cyberarm_engine/builtin/intro_state"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cyberarm_engine
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.16.0
4
+ version: 0.19.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cyberarm
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-01-18 00:00:00.000000000 Z
11
+ date: 2021-09-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: clipboard
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 1.0.0
47
+ version: '1.1'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 1.0.0
54
+ version: '1.1'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: gosu_more_drawables
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -72,14 +72,14 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '1.16'
75
+ version: '2.2'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '1.16'
82
+ version: '2.2'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: minitest
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -123,6 +123,7 @@ files:
123
123
  - README.md
124
124
  - Rakefile
125
125
  - assets/textures/default.png
126
+ - assets/textures/logo.png
126
127
  - bin/console
127
128
  - bin/setup
128
129
  - cyberarm_engine.gemspec
@@ -131,10 +132,15 @@ files:
131
132
  - lib/cyberarm_engine/background.rb
132
133
  - lib/cyberarm_engine/background_nine_slice.rb
133
134
  - lib/cyberarm_engine/bounding_box.rb
135
+ - lib/cyberarm_engine/builtin/intro_state.rb
134
136
  - lib/cyberarm_engine/cache.rb
135
137
  - lib/cyberarm_engine/cache/download_manager.rb
136
138
  - lib/cyberarm_engine/common.rb
137
139
  - lib/cyberarm_engine/config_file.rb
140
+ - lib/cyberarm_engine/console.rb
141
+ - lib/cyberarm_engine/console/command.rb
142
+ - lib/cyberarm_engine/console/commands/help_command.rb
143
+ - lib/cyberarm_engine/console/subcommand.rb
138
144
  - lib/cyberarm_engine/game_object.rb
139
145
  - lib/cyberarm_engine/game_state.rb
140
146
  - lib/cyberarm_engine/model.rb
@@ -169,7 +175,6 @@ files:
169
175
  - lib/cyberarm_engine/ui/elements/edit_line.rb
170
176
  - lib/cyberarm_engine/ui/elements/flow.rb
171
177
  - lib/cyberarm_engine/ui/elements/image.rb
172
- - lib/cyberarm_engine/ui/elements/label.rb
173
178
  - lib/cyberarm_engine/ui/elements/list_box.rb
174
179
  - lib/cyberarm_engine/ui/elements/progress.rb
175
180
  - lib/cyberarm_engine/ui/elements/radio.rb