cyberarm_engine 0.21.0 → 0.22.0

Sign up to get free protection for your applications and to get access to all the features.
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