cyberarm_engine 0.24.2 → 0.24.4
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 +4 -4
- data/cyberarm_engine.gemspec +0 -2
- data/lib/cyberarm_engine/cache/download_manager.rb +2 -0
- data/lib/cyberarm_engine/stats.rb +21 -13
- data/lib/cyberarm_engine/ui/dsl.rb +33 -30
- data/lib/cyberarm_engine/ui/element.rb +21 -8
- data/lib/cyberarm_engine/ui/elements/button.rb +1 -1
- data/lib/cyberarm_engine/ui/elements/container.rb +62 -37
- data/lib/cyberarm_engine/ui/elements/edit_line.rb +1 -1
- data/lib/cyberarm_engine/ui/elements/image.rb +1 -1
- data/lib/cyberarm_engine/ui/elements/list_box.rb +21 -43
- data/lib/cyberarm_engine/ui/elements/menu.rb +27 -0
- data/lib/cyberarm_engine/ui/elements/menu_item.rb +6 -0
- data/lib/cyberarm_engine/ui/elements/progress.rb +1 -1
- data/lib/cyberarm_engine/ui/elements/slider.rb +1 -1
- data/lib/cyberarm_engine/ui/elements/text_block.rb +1 -7
- data/lib/cyberarm_engine/ui/elements/toggle_button.rb +8 -6
- data/lib/cyberarm_engine/ui/gui_state.rb +40 -21
- data/lib/cyberarm_engine/ui/theme.rb +11 -0
- data/lib/cyberarm_engine/version.rb +1 -1
- data/lib/cyberarm_engine.rb +2 -1
- metadata +4 -30
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7d1ca43bcfb5385b9c2666d4917ac44683fcb22c44fa18b918643fab9ec16ef9
|
|
4
|
+
data.tar.gz: 62d712e673772e19f74c14d1b6a54318776848d51ac0fbf82e3b4dc581ea58bf
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: '09c5d9c2d88444021f625e35bef5d4eeb06bc5791f76e80d5560b2b347212f01c6be6bee26a782ca4aea1bfdeca535b4b8020cbce08e028980faec9a55b3ce89'
|
|
7
|
+
data.tar.gz: 8e2185d8f47e3af2f0fc42106718bd64d722066a38fdfc3cf0777c3dbd4be7239443ac3f0552e26399c9791cf8297ca0ebd0066f6c1181c01553e6b01f3d74be
|
data/cyberarm_engine.gemspec
CHANGED
|
@@ -27,9 +27,7 @@ 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 "excon", "~> 0.88"
|
|
31
30
|
spec.add_dependency "gosu", "~> 1.1"
|
|
32
|
-
spec.add_dependency "gosu_more_drawables", "~> 0.3"
|
|
33
31
|
# spec.add_dependency "ffi", :platforms => [:mswin, :mingw] # Required by Clipboard on Windows
|
|
34
32
|
|
|
35
33
|
spec.add_development_dependency "bundler", "~> 2.2"
|
|
@@ -115,11 +115,11 @@ module CyberarmEngine
|
|
|
115
115
|
@padding = 2
|
|
116
116
|
@text_size = 16
|
|
117
117
|
|
|
118
|
-
@max_timing_label = CyberarmEngine::Text.new("", x: x + @padding + 1, y: y + @padding, z: z, size: @text_size, border: true)
|
|
119
|
-
@avg_timing_label = CyberarmEngine::Text.new("", x: x + @padding + 1, y: y + @padding + @height / 2 - @text_size / 2, z: z, size: @text_size, border: true)
|
|
120
|
-
@min_timing_label = CyberarmEngine::Text.new("", x: x + @padding + 1, y: y + @height - (@text_size + @padding / 2), z: z, size: @text_size, border: true)
|
|
118
|
+
@max_timing_label = CyberarmEngine::Text.new("", x: x + @padding + 1, y: y + @padding, z: z, size: @text_size, border: true, static: true)
|
|
119
|
+
@avg_timing_label = CyberarmEngine::Text.new("", x: x + @padding + 1, y: y + @padding + @height / 2 - @text_size / 2, z: z, size: @text_size, border: true, static: true)
|
|
120
|
+
@min_timing_label = CyberarmEngine::Text.new("", x: x + @padding + 1, y: y + @height - (@text_size + @padding / 2), z: z, size: @text_size, border: true, static: true)
|
|
121
121
|
|
|
122
|
-
@
|
|
122
|
+
@data_label = CyberarmEngine::Text.new("", x: x + @padding + @width + @padding, y: y + @padding, z: z, size: @text_size, border: true, static: true)
|
|
123
123
|
|
|
124
124
|
@frame_stats = []
|
|
125
125
|
@graphs = {
|
|
@@ -146,10 +146,15 @@ module CyberarmEngine
|
|
|
146
146
|
slice += 1
|
|
147
147
|
end
|
|
148
148
|
|
|
149
|
+
max_node = CyberarmEngine::Stats.frames.select(&:complete?).map { |f| f.frame_timing.duration }.max
|
|
150
|
+
scale = 1
|
|
151
|
+
scale = (@height - @padding).to_f / max_node
|
|
152
|
+
scale = 1 if scale > 1
|
|
153
|
+
|
|
149
154
|
nodes.each_with_index do |cluster, i|
|
|
150
155
|
break if cluster.empty?
|
|
151
156
|
|
|
152
|
-
@graphs[:frame_timings] << CyberarmEngine::Vector.new(@position.x + @padding + 1 * i, (@position.y + @height - @padding) - cluster.max)
|
|
157
|
+
@graphs[:frame_timings] << CyberarmEngine::Vector.new(@position.x + @padding + 1 * i, (@position.y + @height - @padding) - cluster.max * scale)
|
|
153
158
|
end
|
|
154
159
|
end
|
|
155
160
|
|
|
@@ -159,9 +164,9 @@ module CyberarmEngine
|
|
|
159
164
|
|
|
160
165
|
calculate_graphs
|
|
161
166
|
|
|
162
|
-
@max_timing_label.text = "Max
|
|
163
|
-
@avg_timing_label.text = "Avg
|
|
164
|
-
@min_timing_label.text = "Min
|
|
167
|
+
@max_timing_label.text = "<c=d44>Max:</c> #{@frame_stats.map { |f| f.frame_timing.duration }.max.to_s.rjust(3, " ")}ms"
|
|
168
|
+
@avg_timing_label.text = "<c=f80>Avg:</c> #{(@frame_stats.map { |f| f.frame_timing.duration }.sum / @frame_stats.size).to_s.rjust(3, " ")}ms"
|
|
169
|
+
@min_timing_label.text = "<c=0d0>Min:</c> #{@frame_stats.map { |f| f.frame_timing.duration }.min.to_s.rjust(3, " ")}ms"
|
|
165
170
|
|
|
166
171
|
Gosu.draw_rect(@position.x, @position.y, @width, @height, 0xaa_222222, @position.z)
|
|
167
172
|
Gosu.draw_rect(@position.x + @padding, @position.y + @padding, @width - @padding * 2, @height - @padding * 2, 0xaa_222222, @position.z)
|
|
@@ -173,19 +178,22 @@ module CyberarmEngine
|
|
|
173
178
|
@min_timing_label.draw
|
|
174
179
|
|
|
175
180
|
# TODO: Make this optional
|
|
176
|
-
|
|
181
|
+
draw_timings_and_counters
|
|
177
182
|
end
|
|
178
183
|
|
|
179
184
|
def draw_graphs
|
|
180
185
|
Gosu.draw_path(@graphs[:frame_timings], Gosu::Color::WHITE, Float::INFINITY)
|
|
181
186
|
end
|
|
182
187
|
|
|
183
|
-
def
|
|
188
|
+
def draw_timings_and_counters
|
|
184
189
|
frame = @frame_stats.last
|
|
185
190
|
|
|
186
|
-
@
|
|
187
|
-
|
|
188
|
-
@
|
|
191
|
+
@data_label.text = "<c=f8f>COUNTERS:</c>\n#{frame.counters.map { |t, v| "#{t}: #{v}" }.join("\n")}\n\n"\
|
|
192
|
+
"<c=f80>TIMINGS:</c>\n#{frame.attempted_multitiming? ? "<c=d00>Attempted Multitiming!\nTimings may be inaccurate for:\n#{frame.multitimings.map { |m, _| m}.join("\n") }</c>\n\n" : ''}#{frame.timings.map { |t, v| "#{t}: #{v.duration}ms" }.join("\n")}"
|
|
193
|
+
Gosu.draw_rect(@data_label.x - @padding, @data_label.y - @padding, @data_label.width + @padding * 2, @data_label.height + @padding * 2, 0xdd_222222, @position.z)
|
|
194
|
+
@data_label.draw
|
|
195
|
+
|
|
196
|
+
# puts "Recalcs this frame: #{frame.counters[:gui_recalculations]} [dt: #{(CyberarmEngine::Window.dt * 1000).round} ms]" if frame.counters[:gui_recalculations] && frame.counters[:gui_recalculations].positive?
|
|
189
197
|
end
|
|
190
198
|
end
|
|
191
199
|
end
|
|
@@ -8,12 +8,8 @@ module CyberarmEngine
|
|
|
8
8
|
container(CyberarmEngine::Element::Stack, options, &block)
|
|
9
9
|
end
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
options[:parent] = element_parent
|
|
14
|
-
options[:theme] = current_theme
|
|
15
|
-
|
|
16
|
-
add_element(Element::TextBlock.new(text, options, block))
|
|
11
|
+
def menu(options = {}, &block)
|
|
12
|
+
container(CyberarmEngine::Element::Menu, options, &block)
|
|
17
13
|
end
|
|
18
14
|
|
|
19
15
|
[
|
|
@@ -27,72 +23,79 @@ module CyberarmEngine
|
|
|
27
23
|
"Link"
|
|
28
24
|
].each do |const|
|
|
29
25
|
define_method(:"#{const.downcase}") do |text, options = {}, &block|
|
|
30
|
-
options[:parent]
|
|
31
|
-
options[:theme]
|
|
26
|
+
options[:parent] ||= element_parent
|
|
27
|
+
options[:theme] ||= current_theme
|
|
32
28
|
|
|
33
29
|
add_element(Element.const_get(const).new(text, options, block))
|
|
34
30
|
end
|
|
35
31
|
end
|
|
36
32
|
|
|
37
33
|
def button(text, options = {}, &block)
|
|
38
|
-
options[:parent]
|
|
39
|
-
options[:theme]
|
|
34
|
+
options[:parent] ||= element_parent
|
|
35
|
+
options[:theme] ||= current_theme
|
|
40
36
|
|
|
41
37
|
add_element(Element::Button.new(text, options, block) { block.call if block.is_a?(Proc) })
|
|
42
38
|
end
|
|
43
39
|
|
|
44
40
|
def list_box(options = {}, &block)
|
|
45
|
-
options[:parent]
|
|
46
|
-
options[:theme]
|
|
41
|
+
options[:parent] ||= element_parent
|
|
42
|
+
options[:theme] ||= current_theme
|
|
47
43
|
|
|
48
44
|
add_element(Element::ListBox.new(options, block) { block.call if block.is_a?(Proc) })
|
|
49
45
|
end
|
|
50
46
|
|
|
47
|
+
def menu_item(text, options = {}, &block)
|
|
48
|
+
options[:parent] ||= element_parent
|
|
49
|
+
options[:theme] ||= current_theme
|
|
50
|
+
|
|
51
|
+
add_element(Element::MenuItem.new(text, options, block) { block.call if block.is_a?(Proc) })
|
|
52
|
+
end
|
|
53
|
+
|
|
51
54
|
def edit_line(text, options = {}, &block)
|
|
52
|
-
options[:parent]
|
|
53
|
-
options[:theme]
|
|
55
|
+
options[:parent] ||= element_parent
|
|
56
|
+
options[:theme] ||= current_theme
|
|
54
57
|
|
|
55
58
|
add_element(Element::EditLine.new(text, options, block))
|
|
56
59
|
end
|
|
57
60
|
|
|
58
61
|
def edit_box(text, options = {}, &block)
|
|
59
|
-
options[:parent]
|
|
60
|
-
options[:theme]
|
|
62
|
+
options[:parent] ||= element_parent
|
|
63
|
+
options[:theme] ||= current_theme
|
|
61
64
|
|
|
62
65
|
add_element(Element::EditBox.new(text, options, block))
|
|
63
66
|
end
|
|
64
67
|
|
|
65
68
|
def toggle_button(options = {}, &block)
|
|
66
|
-
options[:parent]
|
|
67
|
-
options[:theme]
|
|
69
|
+
options[:parent] ||= element_parent
|
|
70
|
+
options[:theme] ||= current_theme
|
|
68
71
|
|
|
69
72
|
add_element(Element::ToggleButton.new(options, block))
|
|
70
73
|
end
|
|
71
74
|
|
|
72
75
|
def check_box(text, options = {}, &block)
|
|
73
|
-
options[:parent]
|
|
74
|
-
options[:theme]
|
|
76
|
+
options[:parent] ||= element_parent
|
|
77
|
+
options[:theme] ||= current_theme
|
|
75
78
|
|
|
76
79
|
add_element(Element::CheckBox.new(text, options, block))
|
|
77
80
|
end
|
|
78
81
|
|
|
79
82
|
def image(path, options = {}, &block)
|
|
80
|
-
options[:parent]
|
|
81
|
-
options[:theme]
|
|
83
|
+
options[:parent] ||= element_parent
|
|
84
|
+
options[:theme] ||= current_theme
|
|
82
85
|
|
|
83
86
|
add_element(Element::Image.new(path, options, block))
|
|
84
87
|
end
|
|
85
88
|
|
|
86
89
|
def progress(options = {}, &block)
|
|
87
|
-
options[:parent]
|
|
88
|
-
options[:theme]
|
|
90
|
+
options[:parent] ||= element_parent
|
|
91
|
+
options[:theme] ||= current_theme
|
|
89
92
|
|
|
90
93
|
add_element(Element::Progress.new(options, block))
|
|
91
94
|
end
|
|
92
95
|
|
|
93
96
|
def slider(options = {}, &block)
|
|
94
|
-
options[:parent]
|
|
95
|
-
options[:theme]
|
|
97
|
+
options[:parent] ||= element_parent
|
|
98
|
+
options[:theme] ||= current_theme
|
|
96
99
|
|
|
97
100
|
add_element(Element::Slider.new(options, block))
|
|
98
101
|
end
|
|
@@ -102,7 +105,7 @@ module CyberarmEngine
|
|
|
102
105
|
end
|
|
103
106
|
|
|
104
107
|
def theme(theme)
|
|
105
|
-
element_parent.options[:theme]
|
|
108
|
+
element_parent.options[:theme] ||= theme
|
|
106
109
|
end
|
|
107
110
|
|
|
108
111
|
def current_theme
|
|
@@ -120,8 +123,8 @@ module CyberarmEngine
|
|
|
120
123
|
end
|
|
121
124
|
|
|
122
125
|
private def container(klass, options = {}, &block)
|
|
123
|
-
options[:parent]
|
|
124
|
-
options[:theme]
|
|
126
|
+
options[:parent] ||= element_parent
|
|
127
|
+
options[:theme] ||= current_theme
|
|
125
128
|
|
|
126
129
|
_container = klass.new(options, block)
|
|
127
130
|
|
|
@@ -129,7 +132,7 @@ module CyberarmEngine
|
|
|
129
132
|
CyberarmEngine::Element::Container.current_container = _container
|
|
130
133
|
|
|
131
134
|
_container.build
|
|
132
|
-
_container.parent.add(_container)
|
|
135
|
+
_container.parent.add(_container) unless _container.is_a?(CyberarmEngine::Element::Menu)
|
|
133
136
|
|
|
134
137
|
CyberarmEngine::Element::Container.current_container = old_parent
|
|
135
138
|
|
|
@@ -180,9 +180,7 @@ module CyberarmEngine
|
|
|
180
180
|
|
|
181
181
|
return if self.is_a?(ToolTip)
|
|
182
182
|
|
|
183
|
-
if old_width != width || old_height != height
|
|
184
|
-
root.gui_state.request_recalculate
|
|
185
|
-
end
|
|
183
|
+
root.gui_state.request_recalculate if old_width != width || old_height != height
|
|
186
184
|
|
|
187
185
|
stylize
|
|
188
186
|
end
|
|
@@ -197,6 +195,10 @@ module CyberarmEngine
|
|
|
197
195
|
|
|
198
196
|
event(:mouse_wheel_up)
|
|
199
197
|
event(:mouse_wheel_down)
|
|
198
|
+
event(:scroll_jump_to_top)
|
|
199
|
+
event(:scroll_jump_to_end)
|
|
200
|
+
event(:scroll_page_up)
|
|
201
|
+
event(:scroll_page_down)
|
|
200
202
|
|
|
201
203
|
event(:enter)
|
|
202
204
|
event(:hover)
|
|
@@ -329,8 +331,7 @@ module CyberarmEngine
|
|
|
329
331
|
end
|
|
330
332
|
|
|
331
333
|
def debug_draw
|
|
332
|
-
|
|
333
|
-
return# if const_defined?(GUI_DEBUG_ONLY_ELEMENT) && self.class == GUI_DEBUG_ONLY_ELEMENT
|
|
334
|
+
return if CyberarmEngine.const_defined?("GUI_DEBUG_ONLY_ELEMENT") && self.class == GUI_DEBUG_ONLY_ELEMENT
|
|
334
335
|
|
|
335
336
|
Gosu.draw_line(
|
|
336
337
|
x, y, @debug_color,
|
|
@@ -348,7 +349,7 @@ module CyberarmEngine
|
|
|
348
349
|
Float::INFINITY
|
|
349
350
|
)
|
|
350
351
|
Gosu.draw_line(
|
|
351
|
-
x, outer_height, @debug_color,
|
|
352
|
+
x, y + outer_height, @debug_color,
|
|
352
353
|
x, y, @debug_color,
|
|
353
354
|
Float::INFINITY
|
|
354
355
|
)
|
|
@@ -573,7 +574,7 @@ module CyberarmEngine
|
|
|
573
574
|
end
|
|
574
575
|
|
|
575
576
|
def recalculate_if_size_changed
|
|
576
|
-
if !is_a?(ToolTip) && (@old_width != width || @old_height != height)
|
|
577
|
+
if @parent && !is_a?(ToolTip) && (@old_width != width || @old_height != height)
|
|
577
578
|
root.gui_state.request_recalculate
|
|
578
579
|
|
|
579
580
|
@old_width = width
|
|
@@ -624,7 +625,19 @@ module CyberarmEngine
|
|
|
624
625
|
end
|
|
625
626
|
|
|
626
627
|
def recalculate
|
|
627
|
-
|
|
628
|
+
old_width = width
|
|
629
|
+
old_height = height
|
|
630
|
+
|
|
631
|
+
stylize
|
|
632
|
+
layout
|
|
633
|
+
|
|
634
|
+
root.gui_state.request_recalculate if @parent && !is_a?(ToolTip) && (width != old_width || height != old_height)
|
|
635
|
+
root.gui_state.request_repaint if width != old_width || height != old_height
|
|
636
|
+
|
|
637
|
+
root.gui_state.menu.recalculate if root.gui_state.menu && root.gui_state.menu.parent == self
|
|
638
|
+
end
|
|
639
|
+
|
|
640
|
+
def layout
|
|
628
641
|
end
|
|
629
642
|
|
|
630
643
|
def reposition
|
|
@@ -4,7 +4,7 @@ module CyberarmEngine
|
|
|
4
4
|
include Common
|
|
5
5
|
|
|
6
6
|
attr_accessor :stroke_color, :fill_color
|
|
7
|
-
attr_reader :children, :gui_state, :scroll_position
|
|
7
|
+
attr_reader :children, :gui_state, :scroll_position, :scroll_target_position
|
|
8
8
|
|
|
9
9
|
def self.current_container
|
|
10
10
|
@@current_container
|
|
@@ -49,9 +49,7 @@ module CyberarmEngine
|
|
|
49
49
|
root.gui_state.request_recalculate_for(self) if @children.delete(element)
|
|
50
50
|
end
|
|
51
51
|
|
|
52
|
-
def
|
|
53
|
-
@children.clear
|
|
54
|
-
|
|
52
|
+
def append(&block)
|
|
55
53
|
old_container = CyberarmEngine::Element::Container.current_container
|
|
56
54
|
|
|
57
55
|
CyberarmEngine::Element::Container.current_container = self
|
|
@@ -62,7 +60,9 @@ module CyberarmEngine
|
|
|
62
60
|
root.gui_state.request_recalculate_for(self)
|
|
63
61
|
end
|
|
64
62
|
|
|
65
|
-
def
|
|
63
|
+
def clear(&block)
|
|
64
|
+
@children.clear
|
|
65
|
+
|
|
66
66
|
old_container = CyberarmEngine::Element::Container.current_container
|
|
67
67
|
|
|
68
68
|
CyberarmEngine::Element::Container.current_container = self
|
|
@@ -95,7 +95,7 @@ module CyberarmEngine
|
|
|
95
95
|
end
|
|
96
96
|
|
|
97
97
|
def update
|
|
98
|
-
update_scroll
|
|
98
|
+
update_scroll if @style.scroll
|
|
99
99
|
@children.each(&:update)
|
|
100
100
|
end
|
|
101
101
|
|
|
@@ -128,23 +128,16 @@ module CyberarmEngine
|
|
|
128
128
|
end
|
|
129
129
|
|
|
130
130
|
def update_scroll
|
|
131
|
-
dt = window.dt
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
scroll_y_diff = (@scroll_target_position.y - @scroll_position.y)
|
|
135
|
-
|
|
136
|
-
@scroll_position.x += (scroll_x_diff * @scroll_speed * 0.25 * dt).round
|
|
137
|
-
@scroll_position.y += (scroll_y_diff * @scroll_speed * 0.25 * dt).round
|
|
138
|
-
|
|
139
|
-
@scroll_position.x = @scroll_target_position.x if scroll_x_diff.abs < 1.0
|
|
140
|
-
@scroll_position.y = @scroll_target_position.y if scroll_y_diff.abs < 1.0
|
|
131
|
+
dt = window.dt.clamp(0.000001, 0.025)
|
|
132
|
+
@scroll_position.x += (((@scroll_target_position.x - @scroll_position.x) * (@scroll_speed / 4.0) * 0.98) * dt).round
|
|
133
|
+
@scroll_position.y += (((@scroll_target_position.y - @scroll_position.y) * (@scroll_speed / 4.0) * 0.98) * dt).round
|
|
141
134
|
|
|
142
135
|
# Scrolled PAST top
|
|
143
136
|
if @scroll_position.y > 0
|
|
144
137
|
@scroll_target_position.y = 0
|
|
145
138
|
|
|
146
139
|
# Scrolled PAST bottom
|
|
147
|
-
elsif @scroll_position.y
|
|
140
|
+
elsif @scroll_position.y < -max_scroll_height
|
|
148
141
|
@scroll_target_position.y = -max_scroll_height
|
|
149
142
|
end
|
|
150
143
|
|
|
@@ -162,16 +155,16 @@ module CyberarmEngine
|
|
|
162
155
|
|
|
163
156
|
return unless visible?
|
|
164
157
|
|
|
165
|
-
Stats.frame
|
|
166
|
-
|
|
167
|
-
stylize
|
|
158
|
+
Stats.frame&.increment(:gui_recalculations)
|
|
168
159
|
|
|
169
160
|
# s = Gosu.milliseconds
|
|
170
161
|
|
|
162
|
+
stylize
|
|
171
163
|
layout
|
|
172
164
|
|
|
173
|
-
|
|
174
|
-
|
|
165
|
+
# Old sizes MUST be determined AFTER call to layout
|
|
166
|
+
old_width = width
|
|
167
|
+
old_height = height
|
|
175
168
|
|
|
176
169
|
@cached_scroll_width = nil
|
|
177
170
|
@cached_scroll_height = nil
|
|
@@ -214,6 +207,7 @@ module CyberarmEngine
|
|
|
214
207
|
end
|
|
215
208
|
end
|
|
216
209
|
|
|
210
|
+
# t = Gosu.milliseconds
|
|
217
211
|
# Move children to parent after positioning
|
|
218
212
|
@children.each do |child|
|
|
219
213
|
child.x += (@x + @style.border_thickness_left) - style.margin_left
|
|
@@ -223,35 +217,28 @@ module CyberarmEngine
|
|
|
223
217
|
child.recalculate
|
|
224
218
|
child.reposition # TODO: Implement top,bottom,left,center, and right positioning
|
|
225
219
|
|
|
226
|
-
Stats.frame
|
|
220
|
+
Stats.frame&.increment(:gui_recalculations)
|
|
227
221
|
|
|
228
222
|
update_child_element_visibity(child)
|
|
229
223
|
end
|
|
230
|
-
|
|
231
|
-
# puts "TOOK: #{Gosu.milliseconds - s}ms to recalculate #{self.class}:0x#{self.object_id.to_s(16)}"
|
|
224
|
+
# puts "TOOK: #{Gosu.milliseconds - t}ms to recalculate #{self.class}:0x#{self.object_id.to_s(16)}'s #{@children.count} children"
|
|
232
225
|
|
|
233
226
|
update_background
|
|
234
227
|
|
|
235
228
|
# Fixes resized container scrolled past bottom
|
|
236
|
-
|
|
237
|
-
|
|
229
|
+
if old_height != @height
|
|
230
|
+
self.scroll_top = -@scroll_position.y
|
|
231
|
+
@scroll_target_position.y = @scroll_position.y
|
|
232
|
+
end
|
|
238
233
|
|
|
239
234
|
# Fixes resized container that is scrolled down from being stuck overscrolled when resized
|
|
240
235
|
if scroll_height < height
|
|
241
236
|
@scroll_target_position.y = 0
|
|
242
237
|
end
|
|
243
238
|
|
|
244
|
-
# NOTE: Experiment for removing need to explicitly call gui_state#recalculate at least 3 times for layout to layout...
|
|
245
|
-
if old_width != @width || old_height != @height
|
|
246
|
-
if @parent
|
|
247
|
-
root.gui_state.request_recalculate_for(@parent)
|
|
248
|
-
else
|
|
249
|
-
root.gui_state.request_recalculate
|
|
250
|
-
end
|
|
251
|
-
end
|
|
252
|
-
|
|
253
|
-
root.gui_state.request_repaint if @width != old_width || @height != old_height
|
|
254
239
|
recalculate_if_size_changed
|
|
240
|
+
|
|
241
|
+
# puts "TOOK: #{Gosu.milliseconds - s}ms to recalculate #{self.class}:0x#{self.object_id.to_s(16)}"
|
|
255
242
|
end
|
|
256
243
|
|
|
257
244
|
def layout
|
|
@@ -337,6 +324,44 @@ module CyberarmEngine
|
|
|
337
324
|
return :handled
|
|
338
325
|
end
|
|
339
326
|
|
|
327
|
+
def scroll_jump_to_top(sender, x, y)
|
|
328
|
+
return unless @style.scroll
|
|
329
|
+
|
|
330
|
+
@scroll_position.y = 0
|
|
331
|
+
@scroll_target_position.y = 0
|
|
332
|
+
|
|
333
|
+
return :handled
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
def scroll_jump_to_end(sender, x, y)
|
|
337
|
+
return unless @style.scroll
|
|
338
|
+
|
|
339
|
+
@scroll_position.y = -max_scroll_height
|
|
340
|
+
@scroll_target_position.y = -max_scroll_height
|
|
341
|
+
|
|
342
|
+
return :handled
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
def scroll_page_up(sender, x, y)
|
|
346
|
+
return unless @style.scroll
|
|
347
|
+
|
|
348
|
+
@scroll_position.y += height
|
|
349
|
+
@scroll_position.y = 0 if @scroll_position.y > 0
|
|
350
|
+
@scroll_target_position.y = @scroll_position.y
|
|
351
|
+
|
|
352
|
+
return :handled
|
|
353
|
+
end
|
|
354
|
+
|
|
355
|
+
def scroll_page_down(sender, x, y)
|
|
356
|
+
return unless @style.scroll
|
|
357
|
+
|
|
358
|
+
@scroll_position.y -= height
|
|
359
|
+
@scroll_position.y = -max_scroll_height if @scroll_position.y < -max_scroll_height
|
|
360
|
+
@scroll_target_position.y = @scroll_position.y
|
|
361
|
+
|
|
362
|
+
return :handled
|
|
363
|
+
end
|
|
364
|
+
|
|
340
365
|
def scroll_top
|
|
341
366
|
@scroll_position.y
|
|
342
367
|
end
|
|
@@ -12,21 +12,7 @@ module CyberarmEngine
|
|
|
12
12
|
|
|
13
13
|
@style.background_canvas.background = default(:background)
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
@menu = Stack.new(parent: self, theme: @options[:theme])
|
|
17
|
-
@menu.define_singleton_method(:recalculate_menu) do
|
|
18
|
-
@x = @__list_box.x
|
|
19
|
-
@y = @__list_box.y + @__list_box.height
|
|
20
|
-
|
|
21
|
-
@y = @__list_box.y - height if @y + height > window.height
|
|
22
|
-
end
|
|
23
|
-
@menu.instance_variable_set(:"@__list_box", self)
|
|
24
|
-
|
|
25
|
-
def @menu.recalculate
|
|
26
|
-
super
|
|
27
|
-
|
|
28
|
-
recalculate_menu
|
|
29
|
-
end
|
|
15
|
+
@menu = Menu.new(parent: self, theme: @options[:theme])
|
|
30
16
|
|
|
31
17
|
self.choose = @choose
|
|
32
18
|
end
|
|
@@ -40,7 +26,13 @@ module CyberarmEngine
|
|
|
40
26
|
|
|
41
27
|
def choose=(item)
|
|
42
28
|
valid = @items.detect { |i| i == item }
|
|
43
|
-
|
|
29
|
+
|
|
30
|
+
unless valid
|
|
31
|
+
warn "Invalid value '#{item}' for choose, valid options were: #{@items.map { |i| "#{i.inspect}" }.join(", ")}"
|
|
32
|
+
item = @items.first
|
|
33
|
+
|
|
34
|
+
raise "No items list" unless item
|
|
35
|
+
end
|
|
44
36
|
|
|
45
37
|
@choose = item
|
|
46
38
|
|
|
@@ -62,39 +54,25 @@ module CyberarmEngine
|
|
|
62
54
|
end
|
|
63
55
|
|
|
64
56
|
def show_menu
|
|
65
|
-
@menu.clear
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
parent: @menu,
|
|
76
|
-
width: 1.0,
|
|
77
|
-
theme: @options[:theme],
|
|
78
|
-
margin: 0,
|
|
79
|
-
border_color: 0x00ffffff
|
|
80
|
-
},
|
|
81
|
-
proc do
|
|
57
|
+
@menu.clear do
|
|
58
|
+
|
|
59
|
+
@menu.style.width = width
|
|
60
|
+
|
|
61
|
+
@items.each do |item|
|
|
62
|
+
# prevent already selected item from appearing in list
|
|
63
|
+
# NOTE: Remove this? Might be kinda confusing...
|
|
64
|
+
next if item == self.value
|
|
65
|
+
|
|
66
|
+
root.gui_state.menu_item(item, width: 1.0, margin: 0, border_color: 0x00ffffff) do
|
|
82
67
|
self.choose = item
|
|
83
68
|
@block&.call(self.value)
|
|
84
69
|
end
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
@menu.add(btn)
|
|
70
|
+
end
|
|
88
71
|
end
|
|
89
|
-
recalculate
|
|
90
72
|
|
|
91
|
-
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
def recalculate
|
|
95
|
-
super
|
|
73
|
+
recalculate
|
|
96
74
|
|
|
97
|
-
@menu.
|
|
75
|
+
@menu.show
|
|
98
76
|
end
|
|
99
77
|
end
|
|
100
78
|
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module CyberarmEngine
|
|
2
|
+
class Element
|
|
3
|
+
class Menu < Stack
|
|
4
|
+
def recalculate
|
|
5
|
+
super
|
|
6
|
+
|
|
7
|
+
recalculate_menu
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def recalculate_menu
|
|
11
|
+
# FIXME: properly find scrollable parent, if any.
|
|
12
|
+
parent_scroll_top = parent&.parent ? parent.parent.scroll_top : 0
|
|
13
|
+
|
|
14
|
+
@x = @parent.x
|
|
15
|
+
@y = parent_scroll_top + @parent.y + @parent.height
|
|
16
|
+
|
|
17
|
+
@y = (parent_scroll_top + @parent.y) - height if @y + height > window.height
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def show
|
|
21
|
+
recalculate
|
|
22
|
+
|
|
23
|
+
root.gui_state.show_menu(self)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -38,16 +38,13 @@ module CyberarmEngine
|
|
|
38
38
|
end
|
|
39
39
|
end
|
|
40
40
|
|
|
41
|
-
def
|
|
41
|
+
def layout
|
|
42
42
|
unless @enabled
|
|
43
43
|
@text.color = @style.disabled[:color]
|
|
44
44
|
else
|
|
45
45
|
@text.color = @style.color
|
|
46
46
|
end
|
|
47
47
|
|
|
48
|
-
old_width = @width
|
|
49
|
-
old_height = @height
|
|
50
|
-
|
|
51
48
|
@width = 0
|
|
52
49
|
@height = 0
|
|
53
50
|
|
|
@@ -91,9 +88,6 @@ module CyberarmEngine
|
|
|
91
88
|
end
|
|
92
89
|
|
|
93
90
|
update_background
|
|
94
|
-
|
|
95
|
-
root.gui_state.request_repaint if @width != old_width || @height != old_height
|
|
96
|
-
recalculate_if_size_changed
|
|
97
91
|
end
|
|
98
92
|
|
|
99
93
|
def handle_text_wrapping(max_width)
|
|
@@ -7,8 +7,6 @@ module CyberarmEngine
|
|
|
7
7
|
if options.dig(:theme, :ToggleButton, :checkmark_image)
|
|
8
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
|
-
|
|
11
|
-
@_image = @image
|
|
12
10
|
else
|
|
13
11
|
super(options[:checkmark], options, block)
|
|
14
12
|
end
|
|
@@ -16,10 +14,8 @@ module CyberarmEngine
|
|
|
16
14
|
@value = options[:checked] || false
|
|
17
15
|
|
|
18
16
|
if @value
|
|
19
|
-
@image = @_image if @_image
|
|
20
17
|
@raw_text = @options[:checkmark]
|
|
21
18
|
else
|
|
22
|
-
@image = nil
|
|
23
19
|
@raw_text = ""
|
|
24
20
|
end
|
|
25
21
|
end
|
|
@@ -32,6 +28,14 @@ module CyberarmEngine
|
|
|
32
28
|
:handled
|
|
33
29
|
end
|
|
34
30
|
|
|
31
|
+
def render
|
|
32
|
+
if @image
|
|
33
|
+
draw_image if @value
|
|
34
|
+
else
|
|
35
|
+
draw_text
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
35
39
|
def recalculate
|
|
36
40
|
super
|
|
37
41
|
return if @image
|
|
@@ -49,10 +53,8 @@ module CyberarmEngine
|
|
|
49
53
|
@value = boolean
|
|
50
54
|
|
|
51
55
|
if boolean
|
|
52
|
-
@image = @_image if @_image
|
|
53
56
|
@raw_text = @options[:checkmark]
|
|
54
57
|
else
|
|
55
|
-
@image = nil
|
|
56
58
|
@raw_text = ""
|
|
57
59
|
end
|
|
58
60
|
|
|
@@ -38,6 +38,10 @@ module CyberarmEngine
|
|
|
38
38
|
@tip = Element::ToolTip.new("", parent: @root_container, z: Float::INFINITY, theme: current_theme)
|
|
39
39
|
end
|
|
40
40
|
|
|
41
|
+
def menu
|
|
42
|
+
@menu
|
|
43
|
+
end
|
|
44
|
+
|
|
41
45
|
# throws :blur event to focused element and sets GuiState focused element
|
|
42
46
|
# Does NOT throw :focus event at element or set element as focused
|
|
43
47
|
def focus=(element)
|
|
@@ -50,6 +54,24 @@ module CyberarmEngine
|
|
|
50
54
|
end
|
|
51
55
|
|
|
52
56
|
def draw
|
|
57
|
+
Stats.frame.start_timing(:gui_element_recalculate_requests)
|
|
58
|
+
|
|
59
|
+
# puts "PENDING REQUESTS: #{@pending_element_recalculate_requests.size}" if @pending_element_recalculate_requests.size.positive?
|
|
60
|
+
@pending_element_recalculate_requests.each(&:recalculate)
|
|
61
|
+
@pending_element_recalculate_requests.clear
|
|
62
|
+
|
|
63
|
+
Stats.frame.end_timing(:gui_element_recalculate_requests)
|
|
64
|
+
|
|
65
|
+
if @pending_recalculate_request
|
|
66
|
+
Stats.frame.start_timing(:gui_recalculate)
|
|
67
|
+
|
|
68
|
+
@root_container.recalculate
|
|
69
|
+
|
|
70
|
+
@pending_recalculate_request = false
|
|
71
|
+
|
|
72
|
+
Stats.frame.end_timing(:gui_recalculate)
|
|
73
|
+
end
|
|
74
|
+
|
|
53
75
|
super
|
|
54
76
|
|
|
55
77
|
if @menu
|
|
@@ -63,8 +85,7 @@ module CyberarmEngine
|
|
|
63
85
|
@tip.draw
|
|
64
86
|
end
|
|
65
87
|
|
|
66
|
-
|
|
67
|
-
if false# defined?(GUI_DEBUG)
|
|
88
|
+
if CyberarmEngine.const_defined?("GUI_DEBUG")
|
|
68
89
|
Gosu.flush
|
|
69
90
|
|
|
70
91
|
@root_container.debug_draw
|
|
@@ -78,24 +99,6 @@ module CyberarmEngine
|
|
|
78
99
|
end
|
|
79
100
|
|
|
80
101
|
def update
|
|
81
|
-
Stats.frame.start_timing(:gui_element_recalculate_requests)
|
|
82
|
-
|
|
83
|
-
# puts "PENDING REQUESTS: #{@pending_element_recalculate_requests.size}" if @pending_element_recalculate_requests.size.positive?
|
|
84
|
-
@pending_element_recalculate_requests.each(&:recalculate)
|
|
85
|
-
@pending_element_recalculate_requests.clear
|
|
86
|
-
|
|
87
|
-
Stats.frame.end_timing(:gui_element_recalculate_requests)
|
|
88
|
-
|
|
89
|
-
if @pending_recalculate_request
|
|
90
|
-
Stats.frame.start_timing(:gui_recalculate)
|
|
91
|
-
|
|
92
|
-
@root_container.recalculate
|
|
93
|
-
|
|
94
|
-
@pending_recalculate_request = false
|
|
95
|
-
|
|
96
|
-
Stats.frame.end_timing(:gui_recalculate)
|
|
97
|
-
end
|
|
98
|
-
|
|
99
102
|
if @pending_focus_request
|
|
100
103
|
@pending_focus_request = false
|
|
101
104
|
|
|
@@ -186,6 +189,14 @@ module CyberarmEngine
|
|
|
186
189
|
redirect_mouse_wheel(:up)
|
|
187
190
|
when Gosu::MS_WHEEL_DOWN
|
|
188
191
|
redirect_mouse_wheel(:down)
|
|
192
|
+
when Gosu::KB_HOME
|
|
193
|
+
redirect_scroll_jump_to(:top)
|
|
194
|
+
when Gosu::KB_END
|
|
195
|
+
redirect_scroll_jump_to(:end)
|
|
196
|
+
when Gosu::KB_PAGE_UP
|
|
197
|
+
redirect_scroll_page(:up)
|
|
198
|
+
when Gosu::KB_PAGE_DOWN
|
|
199
|
+
redirect_scroll_page(:down)
|
|
189
200
|
end
|
|
190
201
|
|
|
191
202
|
@focus.button_up(id) if @focus.respond_to?(:button_up)
|
|
@@ -251,7 +262,15 @@ module CyberarmEngine
|
|
|
251
262
|
end
|
|
252
263
|
|
|
253
264
|
def redirect_mouse_wheel(button)
|
|
254
|
-
@mouse_over.publish(:"mouse_wheel_#{button}", window.mouse_x, window.mouse_y) if @mouse_over
|
|
265
|
+
@mouse_over.publish(:"mouse_wheel_#{button}", window.mouse_x, window.mouse_y) if (@mouse_over && !@menu) || (@mouse_over && @mouse_over == @menu)
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
def redirect_scroll_jump_to(edge)
|
|
269
|
+
@mouse_over.publish(:"scroll_jump_to_#{edge}", window.mouse_x, window.mouse_y) if (@mouse_over && !@menu) || (@mouse_over && @mouse_over == @menu)
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
def redirect_scroll_page(edge)
|
|
273
|
+
@mouse_over.publish(:"scroll_page_#{edge}", window.mouse_x, window.mouse_y) if (@mouse_over && !@menu) || (@mouse_over && @mouse_over == @menu)
|
|
255
274
|
end
|
|
256
275
|
|
|
257
276
|
# Schedule a full GUI recalculation on next update
|
|
@@ -208,6 +208,17 @@ module CyberarmEngine
|
|
|
208
208
|
fraction_background: [0xffc75e61, 0xffe26623],
|
|
209
209
|
border_thickness: 1,
|
|
210
210
|
border_color: [0xffd59674, 0xffff8746]
|
|
211
|
+
},
|
|
212
|
+
Menu: { # < Stack
|
|
213
|
+
width: 200,
|
|
214
|
+
border_color: 0xaa_efefef,
|
|
215
|
+
border_thickness: 1
|
|
216
|
+
},
|
|
217
|
+
|
|
218
|
+
MenuItem: { # < Button
|
|
219
|
+
width: 1.0,
|
|
220
|
+
text_left: :left,
|
|
221
|
+
margin: 0
|
|
211
222
|
}
|
|
212
223
|
}.freeze
|
|
213
224
|
end
|
data/lib/cyberarm_engine.rb
CHANGED
|
@@ -6,7 +6,6 @@ else
|
|
|
6
6
|
require "gosu"
|
|
7
7
|
end
|
|
8
8
|
require "json"
|
|
9
|
-
require "excon"
|
|
10
9
|
|
|
11
10
|
require_relative "cyberarm_engine/version"
|
|
12
11
|
require_relative "cyberarm_engine/stats"
|
|
@@ -62,6 +61,8 @@ require_relative "cyberarm_engine/ui/elements/check_box"
|
|
|
62
61
|
require_relative "cyberarm_engine/ui/elements/radio"
|
|
63
62
|
require_relative "cyberarm_engine/ui/elements/progress"
|
|
64
63
|
require_relative "cyberarm_engine/ui/elements/slider"
|
|
64
|
+
require_relative "cyberarm_engine/ui/elements/menu"
|
|
65
|
+
require_relative "cyberarm_engine/ui/elements/menu_item"
|
|
65
66
|
|
|
66
67
|
require_relative "cyberarm_engine/game_state"
|
|
67
68
|
require_relative "cyberarm_engine/ui/gui_state"
|
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.24.
|
|
4
|
+
version: 0.24.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Cyberarm
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2024-
|
|
11
|
+
date: 2024-03-05 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
|
-
- !ruby/object:Gem::Dependency
|
|
14
|
-
name: excon
|
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
|
16
|
-
requirements:
|
|
17
|
-
- - "~>"
|
|
18
|
-
- !ruby/object:Gem::Version
|
|
19
|
-
version: '0.88'
|
|
20
|
-
type: :runtime
|
|
21
|
-
prerelease: false
|
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
-
requirements:
|
|
24
|
-
- - "~>"
|
|
25
|
-
- !ruby/object:Gem::Version
|
|
26
|
-
version: '0.88'
|
|
27
13
|
- !ruby/object:Gem::Dependency
|
|
28
14
|
name: gosu
|
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -38,20 +24,6 @@ dependencies:
|
|
|
38
24
|
- - "~>"
|
|
39
25
|
- !ruby/object:Gem::Version
|
|
40
26
|
version: '1.1'
|
|
41
|
-
- !ruby/object:Gem::Dependency
|
|
42
|
-
name: gosu_more_drawables
|
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
|
44
|
-
requirements:
|
|
45
|
-
- - "~>"
|
|
46
|
-
- !ruby/object:Gem::Version
|
|
47
|
-
version: '0.3'
|
|
48
|
-
type: :runtime
|
|
49
|
-
prerelease: false
|
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
-
requirements:
|
|
52
|
-
- - "~>"
|
|
53
|
-
- !ruby/object:Gem::Version
|
|
54
|
-
version: '0.3'
|
|
55
27
|
- !ruby/object:Gem::Dependency
|
|
56
28
|
name: bundler
|
|
57
29
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -174,6 +146,8 @@ files:
|
|
|
174
146
|
- lib/cyberarm_engine/ui/elements/flow.rb
|
|
175
147
|
- lib/cyberarm_engine/ui/elements/image.rb
|
|
176
148
|
- lib/cyberarm_engine/ui/elements/list_box.rb
|
|
149
|
+
- lib/cyberarm_engine/ui/elements/menu.rb
|
|
150
|
+
- lib/cyberarm_engine/ui/elements/menu_item.rb
|
|
177
151
|
- lib/cyberarm_engine/ui/elements/progress.rb
|
|
178
152
|
- lib/cyberarm_engine/ui/elements/radio.rb
|
|
179
153
|
- lib/cyberarm_engine/ui/elements/slider.rb
|