cyberarm_engine 0.21.0 → 0.22.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7c2a84a8ea330594a18b0768f5453347a50e3c4f5e2c5a896e8f6d24f559b44f
4
- data.tar.gz: 1c7fc5eb93f3549a8dccc1a38b810ae3d45a264096fccaae0efae8b34778ef3a
3
+ metadata.gz: '084b65265f65a631e6a27bf59c7dfd738af16aeb86b3298c30503d4560a87f58'
4
+ data.tar.gz: c73cf6b9f66780c230f331409ef5256d7364cf1b6d05e515bf638b8fa3722417
5
5
  SHA512:
6
- metadata.gz: db9cc74b11276ae1f7499a33d79edef4180737906a6bdc5d8d755eb63cee9fdc3cd44349ee11852e519eb9bb16788a4a9f2e46aeb1798404f6570575e76fcc73
7
- data.tar.gz: 9e2d553ec0871db57ba78397d182aadc78cbc57d401f3dcac5386d008d9cff9254b006753fbbecec8a7931b7f08ce60010308c0c424e2f8caf27f9a3a0da53e3
6
+ metadata.gz: 40fd281091cbf5fa84c6f166ab9bdb24e893fd29f987309e2f1fa812737281dbee1612ef12a6b18bd7677bf50b69916f7379976871f78014dd8e49376c789023
7
+ data.tar.gz: 7884dc297c81d0add9fdd77cf38fad94765010502944f59cb31ed47cd54bf9e3f85746f488ffdc66d2e555656a7ab3d2b9c0780277593d05b0dea4f5aa5c17b8
@@ -27,7 +27,6 @@ Gem::Specification.new do |spec|
27
27
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
28
  spec.require_paths = %w[lib assets]
29
29
 
30
- spec.add_dependency "clipboard", "~> 1.3"
31
30
  spec.add_dependency "excon", "~> 0.88"
32
31
  spec.add_dependency "gosu", "~> 1.1"
33
32
  spec.add_dependency "gosu_more_drawables", "~> 0.3"
@@ -8,8 +8,11 @@ module CyberarmEngine
8
8
  window.current_state
9
9
  end
10
10
 
11
- def previous_state
12
- window.previous_state
11
+ def previous_state(state = nil)
12
+ raise "Only available for CyberarmEngine::GameState and subclasses" unless is_a?(CyberarmEngine::GameState) || state.is_a?(CyberarmEngine::GameState)
13
+
14
+ i = window.states.index(state || self)
15
+ window.states[i - 1] unless (i - 1).negative?
13
16
  end
14
17
 
15
18
  def pop_state
@@ -22,19 +22,21 @@ module CyberarmEngine
22
22
  else
23
23
  @color = Gosu::Color::WHITE
24
24
  end
25
- @mode = options[:mode] || :default
25
+ @mode = options[:mode] || :default
26
26
  @alignment = options[:alignment] || nil
27
27
 
28
28
  @border = options[:border]
29
29
  @border = true if options[:border].nil?
30
30
  @border_size = options[:border_size] || 1
31
31
  @border_alpha = options[:border_alpha] || 30
32
- @border_color = options[:border_color]
32
+ @border_color = options[:border_color] || Gosu::Color::BLACK
33
33
 
34
34
  @shadow = options[:shadow]
35
35
  @shadow_size = options[:shadow_size] || 2
36
36
  @shadow_alpha = options[:shadow_alpha] || 30
37
- @shadow_color = options[:shadow_color]
37
+ @shadow_color = options[:shadow_color] || Gosu::Color::BLACK
38
+
39
+ @static = options[:static] || (options[:static].nil? || options[:static] == false ? false : true)
38
40
 
39
41
  @textobject = check_cache(@size, @font)
40
42
 
@@ -84,46 +86,49 @@ module CyberarmEngine
84
86
  end
85
87
 
86
88
  def text=(string)
87
- @rendered_border = nil
89
+ invalidate_cache! if @text != string
88
90
  @text = string
89
91
  end
90
92
 
91
93
  def factor_x=(n)
92
- @rendered_border = nil
94
+ invalidate_cache! if @factor_x != n
93
95
  @factor_x = n
94
96
  end
95
97
 
96
98
  def factor_y=(n)
97
- @rendered_border = nil
99
+ invalidate_cache! if @factor_y != n
98
100
  @factor_y = n
99
101
  end
100
102
 
101
103
  def color=(color)
102
- @rendered_border = nil
104
+ old_color = @color
105
+
103
106
  if color
104
107
  @color = color.is_a?(Gosu::Color) ? color : Gosu::Color.new(color)
105
108
  else
106
109
  raise "color cannot be nil"
107
110
  end
111
+
112
+ invalidate_cache! if old_color != color
108
113
  end
109
114
 
110
115
  def border=(boolean)
111
- @rendered_border = nil
116
+ invalidate_cache! if @border != boolean
112
117
  @border = boolean
113
118
  end
114
119
 
115
120
  def border_size=(n)
116
- @rendered_border = nil
121
+ invalidate_cache! if @border_size != n
117
122
  @border_size = n
118
123
  end
119
124
 
120
125
  def border_alpha=(n)
121
- @rendered_border = nil
126
+ invalidate_cache! if @border_alpha != n
122
127
  @border_alpha = n
123
128
  end
124
129
 
125
130
  def border_color=(n)
126
- @rendered_border = nil
131
+ invalidate_cache! if @border_color != n
127
132
  @border_color = n
128
133
  end
129
134
 
@@ -132,11 +137,27 @@ module CyberarmEngine
132
137
  end
133
138
 
134
139
  def text_width(text = @text)
135
- textobject.text_width(text) + @border_size + @shadow_size
140
+ spacing = 0
141
+ spacing += @border_size if @border
142
+ spacing += @shadow_size if @shadow
143
+
144
+ if text == @text && @static && @gosu_cached_text_image
145
+ @gosu_cached_text_image&.width + spacing
146
+ else
147
+ textobject.text_width(text) + spacing
148
+ end
136
149
  end
137
150
 
138
151
  def markup_width(text = @text)
139
- textobject.markup_width(text) + @border_size + @shadow_size
152
+ spacing = 0
153
+ spacing += @border_size if @border
154
+ spacing += @shadow_size if @shadow
155
+
156
+ if text == @text && @static && @gosu_cached_text_image
157
+ @gosu_cached_text_image&.width + spacing
158
+ else
159
+ textobject.markup_width(text) + spacing
160
+ end
140
161
  end
141
162
 
142
163
  def height(text = @text)
@@ -148,39 +169,72 @@ module CyberarmEngine
148
169
  end
149
170
 
150
171
  def draw(method = :draw_markup)
151
- if @border && !ARGV.join.include?("--no-border")
152
- border_alpha = @color.alpha <= 30 ? @color.alpha : @border_alpha
153
- border_color = @border_color || Gosu::Color.rgba(@color.red, @color.green, @color.blue,
154
- border_alpha)
155
- white = Gosu::Color::WHITE
172
+ if @static
173
+ if @border && !@cached_text_border_image
174
+ _x = @border_size
175
+ _y = @border_size
176
+ _width = method == :draw_markup ? text_width : markup_width
177
+ img = Gosu::Image.send(:"from_#{method.to_s.split("_").last}", @text, @size, font: @font)
178
+
179
+ @cached_text_border_image = Gosu.render((_width + (@border_size * 2)).ceil, (height + (@border_size * 2)).ceil) do
180
+ img.draw(-_x, 0, @z, @factor_x, @factor_y, @border_color, @mode)
181
+ img.draw(-_x, -_y, @z, @factor_x, @factor_y, @border_color, @mode)
182
+
183
+ img.draw(0, -_y, @z, @factor_x, @factor_y, @border_color, @mode)
184
+ img.draw(_x, -_y, @z, @factor_x, @factor_y, @border_color, @mode)
185
+
186
+ img.draw(_x, 0, @z, @factor_x, @factor_y, @border_color, @mode)
187
+ img.draw(_x, _y, @z, @factor_x, @factor_y, @border_color, @mode)
188
+
189
+ img.draw(0, _y, @z, @factor_x, @factor_y, @border_color, @mode)
190
+ img.draw(-_x, _y, @z, @factor_x, @factor_y, @border_color, @mode)
191
+ end
192
+ end
193
+
194
+ @cached_text_shadow_image ||= Gosu::Image.send(:"from_#{method.to_s.split("_").last}", @text, @size, font: @font) if @shadow
156
195
 
157
- _x = @border_size
158
- _y = @border_size
159
- _width = method == :draw_markup ? text_width : markup_width
196
+ @gosu_cached_text_image ||= Gosu::Image.send(:"from_#{method.to_s.split("_").last}", @text, @size, font: @font)
160
197
 
161
- @rendered_border ||= Gosu.render((_width + (border_size * 2)).ceil, (height + (@border_size * 2)).ceil) do
162
- @textobject.send(method, @text, _x - @border_size, _y, @z, @factor_x, @factor_y, white, @mode)
163
- @textobject.send(method, @text, _x - @border_size, _y - @border_size, @z, @factor_x, @factor_y, white, @mode)
198
+ @cached_text_border_image.draw(@x, @y, @z, @factor_x, @factor_y, @border_color, @mode) if @border
164
199
 
165
- @textobject.send(method, @text, _x, _y - @border_size, @z, @factor_x, @factor_y, white, @mode)
166
- @textobject.send(method, @text, _x + @border_size, _y - @border_size, @z, @factor_x, @factor_y, white, @mode)
200
+ @cached_text_shadow_image.draw(@x + @shadow_size, @y + @shadow_size, @z, @factor_x, @factor_y, @shadow_color, @mode) if @shadow
167
201
 
168
- @textobject.send(method, @text, _x, _y + @border_size, @z, @factor_x, @factor_y, white, @mode)
169
- @textobject.send(method, @text, _x - @border_size, _y + @border_size, @z, @factor_x, @factor_y, white, @mode)
202
+ @gosu_cached_text_image.draw(@x, @y, @z, @factor_x, @factor_y, @color, @mode)
203
+ else
204
+ if @border && !ARGV.join.include?("--no-border")
205
+ border_alpha = @color.alpha <= 30 ? @color.alpha : @border_alpha
206
+ border_color = @border_color || Gosu::Color.rgba(@color.red, @color.green, @color.blue,
207
+ border_alpha)
208
+ white = Gosu::Color::WHITE
209
+
210
+ _x = @border_size
211
+ _y = @border_size
212
+ _width = method == :draw_markup ? text_width : markup_width
213
+
214
+ @cached_text_border_image ||= Gosu.render((_width + (border_size * 2)).ceil, (height + (@border_size * 2)).ceil) do
215
+ @textobject.send(method, @text, _x - @border_size, _y, @z, @factor_x, @factor_y, white, @mode)
216
+ @textobject.send(method, @text, _x - @border_size, _y - @border_size, @z, @factor_x, @factor_y, white, @mode)
217
+
218
+ @textobject.send(method, @text, _x, _y - @border_size, @z, @factor_x, @factor_y, white, @mode)
219
+ @textobject.send(method, @text, _x + @border_size, _y - @border_size, @z, @factor_x, @factor_y, white, @mode)
220
+
221
+ @textobject.send(method, @text, _x, _y + @border_size, @z, @factor_x, @factor_y, white, @mode)
222
+ @textobject.send(method, @text, _x - @border_size, _y + @border_size, @z, @factor_x, @factor_y, white, @mode)
223
+
224
+ @textobject.send(method, @text, _x + @border_size, _y, @z, @factor_x, @factor_y, white, @mode)
225
+ @textobject.send(method, @text, _x + @border_size, _y + @border_size, @z, @factor_x, @factor_y, white, @mode)
226
+ end
170
227
 
171
- @textobject.send(method, @text, _x + @border_size, _y, @z, @factor_x, @factor_y, white, @mode)
172
- @textobject.send(method, @text, _x + @border_size, _y + @border_size, @z, @factor_x, @factor_y, white, @mode)
228
+ @cached_text_border_image.draw(@x - @border_size, @y - @border_size, @z, @factor_x, @factor_y, border_color)
173
229
  end
174
230
 
175
- @rendered_border.draw(@x - @border_size, @y - @border_size, @z, @factor_x, @factor_y, border_color)
176
- end
231
+ if @shadow
232
+ shadow_color = @shadow_color || Gosu::Color.rgba(@color.red, @color.green, @color.blue, @shadow_alpha)
233
+ @textobject.send(method, @text, @x + @shadow_size, @y + @shadow_size, @z, @factor_x, @factor_y, shadow_color, @mode)
234
+ end
177
235
 
178
- if @shadow
179
- shadow_color = @shadow_color || Gosu::Color.rgba(@color.red, @color.green, @color.blue, @shadow_alpha)
180
- @textobject.send(method, @text, @x + @shadow_size, @y + @shadow_size, @z, @factor_x, @factor_y, shadow_color, @mode)
236
+ @textobject.send(method, @text, @x, @y, @z, @factor_x, @factor_y, @color, @mode)
181
237
  end
182
-
183
- @textobject.send(method, @text, @x, @y, @z, @factor_x, @factor_y, @color, @mode)
184
238
  end
185
239
 
186
240
  def alpha=(n)
@@ -193,5 +247,11 @@ module CyberarmEngine
193
247
 
194
248
  def update
195
249
  end
250
+
251
+ def invalidate_cache!
252
+ @cached_text_border_image = nil
253
+ @cached_text_shadow_image = nil
254
+ @gosu_cached_text_image = nil
255
+ end
196
256
  end
197
257
  end
@@ -447,29 +447,37 @@ module CyberarmEngine
447
447
  end
448
448
 
449
449
  if @parent && @style.fill # Handle fill behavior
450
- fill_siblings = @parent.children.select { |c| c.style.fill }.count.to_f # include self since we're dividing
451
-
452
450
  if dimension == :width && @parent.is_a?(Flow)
453
- space_available_width = ((@parent.content_width - (@parent.children.reject { |c| c.style.fill }).map(&:outer_width).sum) / fill_siblings)
454
- space_available_width = space_available_width.nan? ? 0 : space_available_width.floor # The parent element might not have its dimensions, yet.
455
-
456
451
  return space_available_width - noncontent_width
457
452
 
458
453
  elsif dimension == :height && @parent.is_a?(Stack)
459
- space_available_height = ((@parent.content_height - (@parent.children.reject { |c| c.style.fill }).map(&:outer_height).sum) / fill_siblings)
460
- space_available_height = space_available_height.nan? ? 0 : space_available_height.floor # The parent element might not have its dimensions, yet.
461
-
462
454
  return space_available_height - noncontent_height
463
455
  end
464
456
 
465
457
  else # Handle min_width/height and max_width/height
466
- return @style.send(:"min_#{dimension}") if @style.send(:"min_#{dimension}") && new_size < @style.send(:"min_#{dimension}")
467
- return @style.send(:"max_#{dimension}") if @style.send(:"max_#{dimension}") && new_size > @style.send(:"max_#{dimension}")
458
+ return @style.send(:"min_#{dimension}") if @style.send(:"min_#{dimension}") && new_size.to_f < @style.send(:"min_#{dimension}")
459
+ return @style.send(:"max_#{dimension}") if @style.send(:"max_#{dimension}") && new_size.to_f > @style.send(:"max_#{dimension}")
468
460
  end
469
461
 
470
462
  new_size
471
463
  end
472
464
 
465
+ def space_available_width
466
+ # TODO: This may get expensive if there are a lot of children, probably should cache it somehow
467
+ fill_siblings = @parent.children.select { |c| c.style.fill }.count.to_f # include self since we're dividing
468
+
469
+ available_space = ((@parent.content_width - (@parent.children.reject { |c| c.style.fill }).map(&:outer_width).sum) / fill_siblings)
470
+ (available_space.nan? || available_space.infinite?) ? 0 : available_space.floor # The parent element might not have its dimensions, yet.
471
+ end
472
+
473
+ def space_available_height
474
+ # TODO: This may get expensive if there are a lot of children, probably should cache it somehow
475
+ fill_siblings = @parent.children.select { |c| c.style.fill }.count.to_f # include self since we're dividing
476
+
477
+ available_space = ((@parent.content_height - (@parent.children.reject { |c| c.style.fill }).map(&:outer_height).sum) / fill_siblings)
478
+ (available_space.nan? || available_space.infinite?) ? 0 : available_space.floor # The parent element might not have its dimensions, yet.
479
+ end
480
+
473
481
  def background=(_background)
474
482
  @style.background_canvas.background = _background
475
483
  update_background
@@ -136,7 +136,31 @@ module CyberarmEngine
136
136
  @height = _height || (@children.map { |c| c.y + c.outer_height }.max || 0).floor
137
137
  end
138
138
 
139
- # Move child to parent after positioning
139
+ # FIXME: Correctly handle alignment when element has siblings
140
+ # FIXME: Enable alignment for any element, not just containers
141
+ if @style.v_align
142
+ space = space_available_height
143
+
144
+ case @style.v_align
145
+ when :center
146
+ @y = parent.height / 2 - height / 2
147
+ when :bottom
148
+ @y = parent.height - height
149
+ end
150
+ end
151
+
152
+ if @style.h_align
153
+ space = space_available_width
154
+
155
+ case @style.h_align
156
+ when :center
157
+ @x = parent.width / 2 - width / 2
158
+ when :right
159
+ @x = parent.width - width
160
+ end
161
+ end
162
+
163
+ # Move children to parent after positioning
140
164
  @children.each do |child|
141
165
  child.x += (@x + @style.border_thickness_left) - style.margin_left
142
166
  child.y += (@y + @style.border_thickness_top) - style.margin_top
@@ -172,7 +196,6 @@ module CyberarmEngine
172
196
  end
173
197
 
174
198
  def fits_on_line?(element) # Flow
175
- p [@options[:id], @width] if @options[:id]
176
199
  @current_position.x + element.outer_width <= max_width &&
177
200
  @current_position.x + element.outer_width <= window.width
178
201
  end
@@ -182,7 +205,6 @@ module CyberarmEngine
182
205
  element.y = element.style.margin_top + @current_position.y
183
206
 
184
207
  @current_position.x += element.outer_width
185
- @current_position.x = @style.margin_left if @current_position.x >= max_width
186
208
  end
187
209
 
188
210
  def tallest_neighbor(querier, _y_position) # Flow
@@ -195,14 +217,14 @@ module CyberarmEngine
195
217
  response
196
218
  end
197
219
 
198
- def position_on_next_line(child) # Flow
199
- @current_position.x = @style.margin_left
200
- @current_position.y += tallest_neighbor(child, @current_position.y).outer_height
220
+ def position_on_next_line(element) # Flow
221
+ @current_position.x = @style.margin_left + @style.padding_left
222
+ @current_position.y += tallest_neighbor(element, @current_position.y).outer_height
201
223
 
202
- child.x = child.style.margin_left + @current_position.x
203
- child.y = child.style.margin_top + @current_position.y
224
+ element.x = element.style.margin_left + @current_position.x
225
+ element.y = element.style.margin_top + @current_position.y
204
226
 
205
- @current_position.x += child.outer_width
227
+ @current_position.x += element.outer_width
206
228
  end
207
229
 
208
230
  def move_to_next_line(element) # Stack
@@ -1,6 +1,20 @@
1
1
  module CyberarmEngine
2
2
  class Element
3
3
  class EditLine < Button
4
+ class TextInput < Gosu::TextInput
5
+ def filter=(filter)
6
+ @filter = filter
7
+ end
8
+
9
+ def filter(text_in)
10
+ if @filter
11
+ @filter.call(text_in)
12
+ else
13
+ text_in
14
+ end
15
+ end
16
+ end
17
+
4
18
  def initialize(text, options = {}, block = nil)
5
19
  @filter = options.delete(:filter)
6
20
  super(text, options, block)
@@ -14,17 +28,11 @@ module CyberarmEngine
14
28
  @caret_last_interval = Gosu.milliseconds
15
29
  @show_caret = true
16
30
 
17
- @text_input = Gosu::TextInput.new
31
+ @text_input = TextInput.new
32
+ @text_input.filter = @filter
18
33
  @text_input.text = text
19
34
  @last_text_value = text
20
-
21
- if @filter && @filter.respond_to?(:call)
22
- @text_input.instance_variable_set(:@filter, @filter)
23
-
24
- def @text_input.filter(text_in)
25
- @filter.call(text_in)
26
- end
27
- end
35
+ @last_caret_position = @text_input.caret_pos
28
36
 
29
37
  @offset_x = 0
30
38
  @offset_y = 0
@@ -75,6 +83,12 @@ module CyberarmEngine
75
83
  publish(:changed, value)
76
84
  end
77
85
 
86
+ if @last_caret_position != @text_input.caret_pos
87
+ @last_caret_position = @text_input.caret_pos
88
+ @show_caret = true
89
+ @caret_last_interval = Gosu.milliseconds
90
+ end
91
+
78
92
  if Gosu.milliseconds >= @caret_last_interval + @caret_interval
79
93
  @caret_last_interval = Gosu.milliseconds
80
94
 
@@ -98,20 +112,20 @@ module CyberarmEngine
98
112
  @text_input.caret_pos = @text_input.text.length
99
113
 
100
114
  when Gosu::KB_C
101
- if @text_input.selection_start < @text_input.caret_pos
102
- Clipboard.copy(@text_input.text[@text_input.selection_start...@text_input.caret_pos])
103
- else
104
- Clipboard.copy(@text_input.text[@text_input.caret_pos...@text_input.selection_start])
105
- end
115
+ Gosu.clipboard = if @text_input.selection_start < @text_input.caret_pos
116
+ @text_input.text[@text_input.selection_start...@text_input.caret_pos]
117
+ else
118
+ @text_input.text[@text_input.caret_pos...@text_input.selection_start]
119
+ end
106
120
 
107
121
  when Gosu::KB_X
108
122
  chars = @text_input.text.chars
109
123
 
110
124
  if @text_input.selection_start < @text_input.caret_pos
111
- Clipboard.copy(@text_input.text[@text_input.selection_start...@text_input.caret_pos])
125
+ Gosu.clipboard = @text_input.text[@text_input.selection_start...@text_input.caret_pos]
112
126
  chars.slice!(@text_input.selection_start, @text_input.caret_pos)
113
127
  else
114
- Clipboard.copy(@text_input.text[@text_input.caret_pos...@text_input.selection_start])
128
+ Gosu.clipboard = @text_input.text[@text_input.caret_pos...@text_input.selection_start]
115
129
  chars.slice!(@text_input.caret_pos, @text_input.selection_start)
116
130
  end
117
131
 
@@ -119,10 +133,9 @@ module CyberarmEngine
119
133
 
120
134
  when Gosu::KB_V
121
135
  if instance_of?(EditLine) # EditLine assumes a single line of text
122
- @text_input.text = @text_input.text.insert(@text_input.caret_pos,
123
- Clipboard.paste.encode("UTF-8").gsub("\n", ""))
136
+ @text_input.insert_text(Gosu.clipboard.gsub("\n", ""))
124
137
  else
125
- @text_input.text = @text_input.text.insert(@text_input.caret_pos, Clipboard.paste.encode("UTF-8"))
138
+ @text_input.insert_text(Gosu.clipboard)
126
139
  end
127
140
  end
128
141
  end
@@ -180,7 +193,7 @@ module CyberarmEngine
180
193
  if @type == :password
181
194
  @text.x + @text.width(default(:password_character) * @text_input.text[0...@text_input.send(method)].length)
182
195
  else
183
- @text.x + @text.width(@text_input.text[0...@text_input.send(method)])
196
+ @text.x + @text.width(@text_input.text[0...@text_input.send(method)]) - @style.border_thickness_left
184
197
  end
185
198
  end
186
199
 
@@ -197,20 +210,35 @@ module CyberarmEngine
197
210
  end
198
211
 
199
212
  def focus(sender)
200
- super
201
-
213
+ @focus = true
202
214
  window.text_input = @text_input
203
215
  @text_input.caret_pos = @text_input.selection_start = @text_input.text.length
204
216
 
217
+ update_styles(:active)
218
+
205
219
  :handled
206
220
  end
207
221
 
208
222
  def enter(sender)
209
- _has_focus = @focus
223
+ if @enabled && @focus
224
+ update_styles(:active)
225
+ elsif @enabled && !@focus
226
+ update_styles(:hover)
227
+ else
228
+ update_styles(:disabled)
229
+ end
210
230
 
211
- super
231
+ :handled
232
+ end
212
233
 
213
- @focus = _has_focus
234
+ def leave(sender)
235
+ if @enabled && @focus
236
+ update_styles(:active)
237
+ elsif @enabled && !@focus
238
+ update_styles
239
+ else
240
+ update_styles(:disabled)
241
+ end
214
242
 
215
243
  :handled
216
244
  end
@@ -13,7 +13,7 @@ module CyberarmEngine
13
13
  @style.background_canvas.background = default(:background)
14
14
 
15
15
  # TODO: "Clean Up" into own class?
16
- @menu = Stack.new(parent: parent, width: @options[:width], theme: @options[:theme])
16
+ @menu = Stack.new(parent: self, theme: @options[:theme])
17
17
  @menu.define_singleton_method(:recalculate_menu) do
18
18
  @x = @__list_box.x
19
19
  @y = @__list_box.y + @__list_box.height
@@ -64,6 +64,8 @@ module CyberarmEngine
64
64
  def show_menu
65
65
  @menu.clear
66
66
 
67
+ @menu.style.width = width
68
+
67
69
  @items.each do |item|
68
70
  next if item == self.value
69
71
 
@@ -42,7 +42,7 @@ module CyberarmEngine
42
42
  @step_size = @options[:step] || 0.1
43
43
  @value = @options[:value] || (@range.first + @range.last) / 2
44
44
 
45
- @handle = Handle.new("", parent: self, width: 8, height: 1.0) { close }
45
+ @handle = Handle.new("", parent: self, theme: options[:theme], width: 8, height: 1.0) { close }
46
46
  add(@handle)
47
47
  end
48
48
 
@@ -61,10 +61,10 @@ module CyberarmEngine
61
61
  end
62
62
 
63
63
  def position_handle
64
- @handle.x = @x + @style.padding_left + @style.border_thickness_left +
64
+ @handle.x = @x + @handle.style.margin_left + @style.padding_left + @style.border_thickness_left +
65
65
  ((content_width - @handle.outer_width) * (@value - @range.min) / (@range.max - @range.min).to_f)
66
66
 
67
- @handle.y = @y + @style.border_thickness_top + @style.padding_top
67
+ @handle.y = @y + @handle.style.margin_top + @style.border_thickness_top + @style.padding_top
68
68
  end
69
69
 
70
70
  def draw
@@ -7,6 +7,7 @@ module CyberarmEngine
7
7
  @text = Text.new(
8
8
  text, font: @options[:font], z: @z, color: @options[:color],
9
9
  size: @options[:text_size], shadow: @options[:text_shadow],
10
+ static: @options[:text_static],
10
11
  shadow_size: @options[:text_shadow_size],
11
12
  shadow_color: @options[:text_shadow_color],
12
13
  border: @options[:text_border],
@@ -49,7 +50,7 @@ module CyberarmEngine
49
50
  @text.y = @style.border_thickness_top + @style.padding_top + @y
50
51
  @text.z = @z + 3
51
52
 
52
- if (text_alignment = @options[:text_align])
53
+ if (text_alignment = @options[:text_align] || @options[:text_h_align])
53
54
  case text_alignment
54
55
  when :left
55
56
  @text.x = @style.border_thickness_left + @style.padding_left + @x
@@ -64,6 +65,19 @@ module CyberarmEngine
64
65
  end
65
66
  end
66
67
 
68
+ if (vertical_alignment = @options[:text_v_align])
69
+ case vertical_alignment
70
+ when :center
71
+ @text.y = if @text.height <= height
72
+ @y + height / 2 - @text.height / 2
73
+ else
74
+ @style.border_thickness_top + @style.padding_top + @y
75
+ end
76
+ when :bottom
77
+ @text.y = @y + outer_height - (@text.height + @style.border_thickness_bottom + @style.padding_bottom)
78
+ end
79
+ end
80
+
67
81
  update_background
68
82
  end
69
83
 
@@ -5,7 +5,7 @@ module CyberarmEngine
5
5
 
6
6
  def initialize(options, block = nil)
7
7
  if options.dig(:theme, :ToggleButton, :checkmark_image)
8
- options[:theme][:ToggleButton][:image_width] ||= options[:theme][:Label][:text_size]
8
+ options[:theme][:ToggleButton][:image_width] ||= options[:theme][:TextBlock][:text_size]
9
9
  super(get_image(options.dig(:theme, :ToggleButton, :checkmark_image)), options, block)
10
10
 
11
11
  @_image = @image
@@ -171,6 +171,9 @@ module CyberarmEngine
171
171
  end
172
172
 
173
173
  @focus.button_up(id) if @focus.respond_to?(:button_up)
174
+
175
+ # Prevents menu from popping back up if the listbox is clicked to hide it.
176
+ @hid_menu_for = nil
174
177
  end
175
178
 
176
179
  def tool_tip_delay
@@ -185,7 +188,7 @@ module CyberarmEngine
185
188
  @focus = nil
186
189
  end
187
190
 
188
- if @mouse_over
191
+ if @mouse_over && @hid_menu_for != @mouse_over
189
192
  @mouse_down_position[button] = Vector.new(window.mouse_x, window.mouse_y)
190
193
  @mouse_down_on[button] = @mouse_over
191
194
 
@@ -199,7 +202,7 @@ module CyberarmEngine
199
202
  def redirect_released_mouse_button(button)
200
203
  hide_menu if @menu && (@menu == @mouse_over) || (@mouse_over&.parent == @menu)
201
204
 
202
- if @mouse_over
205
+ if @mouse_over && @hid_menu_for != @mouse_over
203
206
  @mouse_over.publish(:"released_#{button}_mouse_button", window.mouse_x, window.mouse_y)
204
207
  if @mouse_over == @mouse_down_on[button]
205
208
  @mouse_over.publish(:"clicked_#{button}_mouse_button", window.mouse_x,
@@ -255,6 +258,9 @@ module CyberarmEngine
255
258
  end
256
259
 
257
260
  def hide_menu
261
+ return unless @menu
262
+
263
+ @hid_menu_for = @menu.parent
258
264
  @menu = nil
259
265
  end
260
266
 
@@ -76,6 +76,7 @@ module CyberarmEngine
76
76
  border_radius: 0,
77
77
  background: ["ffc75e61".to_i(16), "ffe26623".to_i(16)],
78
78
  text_align: :center,
79
+ text_v_align: :center,
79
80
  text_wrap: :none,
80
81
 
81
82
  hover: {
@@ -102,7 +103,12 @@ module CyberarmEngine
102
103
  caret_color: Gosu::Color::WHITE,
103
104
  caret_interval: 500,
104
105
  selection_color: Gosu::Color.rgba(255, 128, 50, 200),
105
- text_align: :left
106
+ text_align: :left,
107
+ text_static: false # static text causes issues correctly displaying caret position
108
+ },
109
+
110
+ EditBox: { # < EditLine
111
+ text_v_align: :top
106
112
  },
107
113
 
108
114
  Image: { # < Element
@@ -1,4 +1,4 @@
1
1
  module CyberarmEngine
2
2
  NAME = "InDev".freeze
3
- VERSION = "0.21.0".freeze
3
+ VERSION = "0.22.0".freeze
4
4
  end
@@ -139,12 +139,6 @@ module CyberarmEngine
139
139
  @states.last
140
140
  end
141
141
 
142
- def previous_state
143
- if @states.size > 1 && (state = @states[@states.size - 2])
144
- state
145
- end
146
- end
147
-
148
142
  def pop_state
149
143
  @states.pop
150
144
  end
@@ -8,7 +8,6 @@ end
8
8
  require "json"
9
9
  require "excon"
10
10
  require "gosu_more_drawables"
11
- require "clipboard"
12
11
 
13
12
  require_relative "cyberarm_engine/version"
14
13
  require_relative "cyberarm_engine/stats"
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cyberarm_engine
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.21.0
4
+ version: 0.22.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cyberarm
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-06-05 00:00:00.000000000 Z
11
+ date: 2022-10-23 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: clipboard
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '1.3'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '1.3'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: excon
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -211,7 +197,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
211
197
  - !ruby/object:Gem::Version
212
198
  version: '0'
213
199
  requirements: []
214
- rubygems_version: 3.3.7
200
+ rubygems_version: 3.3.15
215
201
  signing_key:
216
202
  specification_version: 4
217
203
  summary: Make games quickly and easily with gosu