cyberarm_engine 0.13.1 → 0.14.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 +4 -4
- data/README.md +1 -1
- data/cyberarm_engine.gemspec +2 -1
- data/lib/cyberarm_engine.rb +7 -3
- data/lib/cyberarm_engine/common.rb +3 -3
- data/lib/cyberarm_engine/stats.rb +21 -0
- data/lib/cyberarm_engine/text.rb +5 -5
- data/lib/cyberarm_engine/ui/dsl.rb +7 -0
- data/lib/cyberarm_engine/ui/element.rb +15 -2
- data/lib/cyberarm_engine/ui/elements/check_box.rb +23 -31
- data/lib/cyberarm_engine/ui/elements/container.rb +33 -7
- data/lib/cyberarm_engine/ui/elements/edit_box.rb +6 -0
- data/lib/cyberarm_engine/ui/elements/edit_line.rb +16 -16
- data/lib/cyberarm_engine/ui/elements/flow.rb +0 -2
- data/lib/cyberarm_engine/ui/elements/label.rb +3 -1
- data/lib/cyberarm_engine/ui/elements/list_box.rb +6 -0
- data/lib/cyberarm_engine/ui/elements/progress.rb +1 -0
- data/lib/cyberarm_engine/ui/elements/radio.rb +6 -0
- data/lib/cyberarm_engine/ui/elements/slider.rb +107 -0
- data/lib/cyberarm_engine/ui/elements/stack.rb +0 -2
- data/lib/cyberarm_engine/ui/elements/toggle_button.rb +20 -19
- data/lib/cyberarm_engine/ui/gui_state.rb +50 -1
- data/lib/cyberarm_engine/ui/theme.rb +10 -1
- data/lib/cyberarm_engine/version.rb +1 -1
- data/lib/cyberarm_engine/{engine.rb → window.rb} +3 -1
- metadata +24 -6
- data/lib/cyberarm_engine/gosu_ext/circle.rb +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 358b4f43be50c3d5013260d6033c63b8d28b1b0475faf0d9e34a136cb9064244
|
4
|
+
data.tar.gz: d2a72568cca7508558c4ff0f8f3eb9adaba1b02a9faa08a48a0bc9bf576edcdf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d57818c6ba87cdd22e1bbddc9d50800fdc9f4890cc8c3f8ce21b4aea1aa20db5e410c14718d196c0d0f778ae3856c9e2befcd9fb9401d998934a1428d8f92beb
|
7
|
+
data.tar.gz: 3b50a6658c4bdc82231ca17d2c66386dcb470ff638d5e6d6fb372f2e0184b455fcddb60aad147cc246190b3839bcc9bf7bfeeb7699879a5aabdeef761751e09d
|
data/README.md
CHANGED
data/cyberarm_engine.gemspec
CHANGED
@@ -29,8 +29,9 @@ Gem::Specification.new do |spec|
|
|
29
29
|
spec.require_paths = ["lib"]
|
30
30
|
|
31
31
|
spec.add_dependency "gosu", "~> 0.15.0"
|
32
|
+
spec.add_dependency "gosu_more_drawables", "~> 0.3"
|
32
33
|
|
33
34
|
spec.add_development_dependency "bundler", "~> 1.16"
|
34
|
-
spec.add_development_dependency "rake", "~>
|
35
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
35
36
|
spec.add_development_dependency "minitest", "~> 5.0"
|
36
37
|
end
|
data/lib/cyberarm_engine.rb
CHANGED
@@ -5,15 +5,15 @@ rescue LoadError => e
|
|
5
5
|
require "gosu"
|
6
6
|
end
|
7
7
|
require "json"
|
8
|
+
require "gosu_more_drawables"
|
8
9
|
|
9
10
|
require_relative "cyberarm_engine/version"
|
11
|
+
require_relative "cyberarm_engine/stats"
|
10
12
|
|
11
13
|
require_relative "cyberarm_engine/common"
|
12
14
|
|
13
|
-
require_relative "cyberarm_engine/gosu_ext/circle"
|
14
|
-
|
15
15
|
require_relative "cyberarm_engine/game_object"
|
16
|
-
require_relative "cyberarm_engine/
|
16
|
+
require_relative "cyberarm_engine/window"
|
17
17
|
|
18
18
|
require_relative "cyberarm_engine/bounding_box"
|
19
19
|
require_relative "cyberarm_engine/vector"
|
@@ -35,15 +35,19 @@ require_relative "cyberarm_engine/ui/style"
|
|
35
35
|
require_relative "cyberarm_engine/ui/border_canvas"
|
36
36
|
require_relative "cyberarm_engine/ui/element"
|
37
37
|
require_relative "cyberarm_engine/ui/elements/label"
|
38
|
+
require_relative "cyberarm_engine/ui/elements/list_box"
|
38
39
|
require_relative "cyberarm_engine/ui/elements/button"
|
39
40
|
require_relative "cyberarm_engine/ui/elements/toggle_button"
|
40
41
|
require_relative "cyberarm_engine/ui/elements/edit_line"
|
42
|
+
require_relative "cyberarm_engine/ui/elements/edit_box"
|
41
43
|
require_relative "cyberarm_engine/ui/elements/image"
|
42
44
|
require_relative "cyberarm_engine/ui/elements/container"
|
43
45
|
require_relative "cyberarm_engine/ui/elements/flow"
|
44
46
|
require_relative "cyberarm_engine/ui/elements/stack"
|
45
47
|
require_relative "cyberarm_engine/ui/elements/check_box"
|
48
|
+
require_relative "cyberarm_engine/ui/elements/radio"
|
46
49
|
require_relative "cyberarm_engine/ui/elements/progress"
|
50
|
+
require_relative "cyberarm_engine/ui/elements/slider"
|
47
51
|
|
48
52
|
require_relative "cyberarm_engine/game_state"
|
49
53
|
require_relative "cyberarm_engine/ui/gui_state"
|
@@ -78,15 +78,15 @@ module CyberarmEngine
|
|
78
78
|
end
|
79
79
|
|
80
80
|
def get_image(path, retro: false, tileable: false)
|
81
|
-
get_asset(path,
|
81
|
+
get_asset(path, Window::IMAGES, Gosu::Image, retro, tileable)
|
82
82
|
end
|
83
83
|
|
84
84
|
def get_sample(path)
|
85
|
-
get_asset(path,
|
85
|
+
get_asset(path, Window::SAMPLES, Gosu::Sample)
|
86
86
|
end
|
87
87
|
|
88
88
|
def get_song(path)
|
89
|
-
get_asset(path,
|
89
|
+
get_asset(path, Window::SONGS, Gosu::Song)
|
90
90
|
end
|
91
91
|
|
92
92
|
def window
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module CyberarmEngine
|
2
|
+
class Stats
|
3
|
+
@@hash = {
|
4
|
+
gui_recalculations_last_frame: 0
|
5
|
+
}
|
6
|
+
|
7
|
+
def self.get(key)
|
8
|
+
@@hash.dig(key)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.increment(key, n)
|
12
|
+
@@hash[key] += n
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.clear
|
16
|
+
@@hash.each do |key, value|
|
17
|
+
@@hash[key] = 0
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/cyberarm_engine/text.rb
CHANGED
@@ -9,7 +9,7 @@ module CyberarmEngine
|
|
9
9
|
@text = text.to_s || ""
|
10
10
|
@options = options
|
11
11
|
@size = options[:size] || 18
|
12
|
-
@font = options[:font] ||
|
12
|
+
@font = options[:font] || Gosu.default_font_name
|
13
13
|
@x = options[:x] || 0
|
14
14
|
@y = options[:y] || 0
|
15
15
|
@z = options[:z] || 1025
|
@@ -98,12 +98,12 @@ module CyberarmEngine
|
|
98
98
|
@shadow_color = n
|
99
99
|
end
|
100
100
|
|
101
|
-
def width
|
102
|
-
textobject.text_width(
|
101
|
+
def width(text = @text)
|
102
|
+
textobject.text_width(text)
|
103
103
|
end
|
104
104
|
|
105
|
-
def height
|
106
|
-
|
105
|
+
def height(text = @text)
|
106
|
+
text.lines.count > 0 ? (text.lines.count) * textobject.height : @textobject.height
|
107
107
|
end
|
108
108
|
|
109
109
|
def draw
|
@@ -57,6 +57,13 @@ module CyberarmEngine
|
|
57
57
|
add_element( Element::Progress.new(options, block) )
|
58
58
|
end
|
59
59
|
|
60
|
+
def slider(options = {}, &block)
|
61
|
+
options[:parent] = element_parent
|
62
|
+
options[:theme] = current_theme
|
63
|
+
|
64
|
+
add_element( Element::Slider.new(options, block) )
|
65
|
+
end
|
66
|
+
|
60
67
|
def background(color = Gosu::Color::NONE)
|
61
68
|
element_parent.style.background = color
|
62
69
|
end
|
@@ -4,7 +4,7 @@ module CyberarmEngine
|
|
4
4
|
include Event
|
5
5
|
include Common
|
6
6
|
|
7
|
-
attr_accessor :x, :y, :z, :enabled
|
7
|
+
attr_accessor :x, :y, :z, :enabled, :tip
|
8
8
|
attr_reader :parent, :options, :style, :event_handler, :background_canvas, :border_canvas
|
9
9
|
|
10
10
|
def initialize(options = {}, block = nil)
|
@@ -16,6 +16,7 @@ module CyberarmEngine
|
|
16
16
|
@focus = false
|
17
17
|
@enabled = true
|
18
18
|
@visible = true
|
19
|
+
@tip = @options[:tip] ? @options[:tip] : ""
|
19
20
|
|
20
21
|
@style = Style.new(options)
|
21
22
|
|
@@ -110,6 +111,8 @@ module CyberarmEngine
|
|
110
111
|
event(:leave)
|
111
112
|
|
112
113
|
event(:blur)
|
114
|
+
|
115
|
+
event(:changed)
|
113
116
|
end
|
114
117
|
|
115
118
|
def enabled?
|
@@ -152,6 +155,10 @@ module CyberarmEngine
|
|
152
155
|
def button_up(id)
|
153
156
|
end
|
154
157
|
|
158
|
+
def draggable?(button)
|
159
|
+
false
|
160
|
+
end
|
161
|
+
|
155
162
|
def render
|
156
163
|
end
|
157
164
|
|
@@ -212,7 +219,7 @@ module CyberarmEngine
|
|
212
219
|
raise "dimension must be either :width or :height" unless dimension == :width || dimension == :height
|
213
220
|
if size && size.is_a?(Numeric)
|
214
221
|
if size.between?(0.0, 1.0)
|
215
|
-
((@parent.send(:"content_#{dimension}") - self.send(:"noncontent_#{dimension}")
|
222
|
+
((@parent.send(:"content_#{dimension}") - self.send(:"noncontent_#{dimension}")) * size).round
|
216
223
|
else
|
217
224
|
size
|
218
225
|
end
|
@@ -239,6 +246,8 @@ module CyberarmEngine
|
|
239
246
|
end
|
240
247
|
|
241
248
|
def root
|
249
|
+
return self if is_root?
|
250
|
+
|
242
251
|
unless @root && @root.parent.nil?
|
243
252
|
@root = parent
|
244
253
|
|
@@ -272,5 +281,9 @@ module CyberarmEngine
|
|
272
281
|
def value=(value)
|
273
282
|
raise "#{self.class}#value= was not overridden!"
|
274
283
|
end
|
284
|
+
|
285
|
+
def to_s
|
286
|
+
"#{self.class} x=#{x} y=#{y} width=#{width} height=#{height} value=#{ value.is_a?(String) ? "\"#{value}\"" : value }"
|
287
|
+
end
|
275
288
|
end
|
276
289
|
end
|
@@ -2,13 +2,32 @@ module CyberarmEngine
|
|
2
2
|
class Element
|
3
3
|
class CheckBox < Flow
|
4
4
|
def initialize(text, options, block = nil)
|
5
|
-
super(
|
5
|
+
super(options, block)
|
6
6
|
options[:toggled] = options[:checked]
|
7
7
|
|
8
8
|
@toggle_button = ToggleButton.new(options)
|
9
9
|
@label = Label.new(text, options)
|
10
10
|
|
11
|
-
|
11
|
+
@label.subscribe(:holding_left_mouse_button) do |sender, x, y|
|
12
|
+
@toggle_button.left_mouse_button(sender, x, y)
|
13
|
+
end
|
14
|
+
|
15
|
+
@label.subscribe(:released_left_mouse_button) do |sender, x, y|
|
16
|
+
@toggle_button.released_left_mouse_button(sender, x, y)
|
17
|
+
end
|
18
|
+
|
19
|
+
@label.subscribe(:clicked_left_mouse_button) do |sender, x, y|
|
20
|
+
@toggle_button.clicked_left_mouse_button(sender, x, y)
|
21
|
+
publish(:changed, @toggle_button.value)
|
22
|
+
end
|
23
|
+
|
24
|
+
@label.subscribe(:enter) do |sender|
|
25
|
+
@toggle_button.enter(sender)
|
26
|
+
end
|
27
|
+
|
28
|
+
@label.subscribe(:leave) do |sender|
|
29
|
+
@toggle_button.leave(sender)
|
30
|
+
end
|
12
31
|
|
13
32
|
add(@toggle_button)
|
14
33
|
add(@label)
|
@@ -24,35 +43,8 @@ module CyberarmEngine
|
|
24
43
|
end
|
25
44
|
|
26
45
|
def value=(bool)
|
27
|
-
@toggle_button.
|
28
|
-
|
29
|
-
|
30
|
-
def define_label_singletons
|
31
|
-
@label.define_singleton_method(:_toggle_button) do |button|
|
32
|
-
@_toggle_button = button
|
33
|
-
end
|
34
|
-
|
35
|
-
@label._toggle_button(@toggle_button)
|
36
|
-
|
37
|
-
@label.define_singleton_method(:holding_left_mouse_button) do |sender, x, y|
|
38
|
-
@_toggle_button.left_mouse_button(sender, x, y)
|
39
|
-
end
|
40
|
-
|
41
|
-
@label.define_singleton_method(:released_left_mouse_button) do |sender, x, y|
|
42
|
-
@_toggle_button.released_left_mouse_button(sender, x, y)
|
43
|
-
end
|
44
|
-
|
45
|
-
@label.define_singleton_method(:clicked_left_mouse_button) do |sender, x, y|
|
46
|
-
@_toggle_button.clicked_left_mouse_button(sender, x, y)
|
47
|
-
end
|
48
|
-
|
49
|
-
@label.define_singleton_method(:enter) do |sender|
|
50
|
-
@_toggle_button.enter(sender)
|
51
|
-
end
|
52
|
-
|
53
|
-
@label.define_singleton_method(:leave) do |sender|
|
54
|
-
@_toggle_button.leave(sender)
|
55
|
-
end
|
46
|
+
@toggle_button.value = bool
|
47
|
+
publish(:changed, @toggle_button.value)
|
56
48
|
end
|
57
49
|
end
|
58
50
|
end
|
@@ -22,13 +22,13 @@ module CyberarmEngine
|
|
22
22
|
def build
|
23
23
|
@block.call(self) if @block
|
24
24
|
|
25
|
-
|
25
|
+
root.gui_state.request_recalculate
|
26
26
|
end
|
27
27
|
|
28
28
|
def add(element)
|
29
29
|
@children << element
|
30
30
|
|
31
|
-
|
31
|
+
root.gui_state.request_recalculate
|
32
32
|
end
|
33
33
|
|
34
34
|
def clear(&block)
|
@@ -41,7 +41,6 @@ module CyberarmEngine
|
|
41
41
|
|
42
42
|
$__current_container__ = old_container
|
43
43
|
|
44
|
-
recalculate
|
45
44
|
root.gui_state.request_recalculate
|
46
45
|
end
|
47
46
|
|
@@ -57,6 +56,8 @@ module CyberarmEngine
|
|
57
56
|
|
58
57
|
def hit_element?(x, y)
|
59
58
|
@children.reverse_each do |child|
|
59
|
+
next unless child.visible?
|
60
|
+
|
60
61
|
case child
|
61
62
|
when Container
|
62
63
|
if element = child.hit_element?(x, y)
|
@@ -73,6 +74,9 @@ module CyberarmEngine
|
|
73
74
|
def recalculate
|
74
75
|
@current_position = Vector.new(@style.margin_left + @style.padding_left, @style.margin_top + @style.padding_top)
|
75
76
|
return unless visible?
|
77
|
+
|
78
|
+
Stats.increment(:gui_recalculations_last_frame, 1)
|
79
|
+
|
76
80
|
stylize
|
77
81
|
|
78
82
|
layout
|
@@ -90,15 +94,16 @@ module CyberarmEngine
|
|
90
94
|
@height = _height ? _height : (@children.map {|c| c.y + c.outer_height}.max || 0).round
|
91
95
|
end
|
92
96
|
|
93
|
-
|
94
97
|
# Move child to parent after positioning
|
95
98
|
@children.each do |child|
|
96
|
-
child.x += @x
|
97
|
-
child.y += @y
|
99
|
+
child.x += (@x + @style.border_thickness_left) - style.margin_left
|
100
|
+
child.y += (@y + @style.border_thickness_top) - style.margin_top
|
98
101
|
|
99
102
|
child.stylize
|
100
103
|
child.recalculate
|
101
104
|
child.reposition # TODO: Implement top,bottom,left,center, and right positioning
|
105
|
+
|
106
|
+
Stats.increment(:gui_recalculations_last_frame, 1)
|
102
107
|
end
|
103
108
|
|
104
109
|
update_background
|
@@ -109,10 +114,12 @@ module CyberarmEngine
|
|
109
114
|
end
|
110
115
|
|
111
116
|
def max_width
|
112
|
-
|
117
|
+
_width = dimensional_size(@style.width, :width)
|
118
|
+
_width ? outer_width : window.width - (@parent ? @parent.style.margin_right + @style.margin_right : @style.margin_right)
|
113
119
|
end
|
114
120
|
|
115
121
|
def fits_on_line?(element) # Flow
|
122
|
+
p [@options[:id], @width] if @options[:id]
|
116
123
|
@current_position.x + element.outer_width <= max_width &&
|
117
124
|
@current_position.x + element.outer_width <= window.width
|
118
125
|
end
|
@@ -171,6 +178,25 @@ module CyberarmEngine
|
|
171
178
|
def value
|
172
179
|
@children.map {|c| c.class}.join(", ")
|
173
180
|
end
|
181
|
+
|
182
|
+
def to_s
|
183
|
+
"#{self.class} x=#{x} y=#{y} width=#{width} height=#{height} children=#{@children.size}"
|
184
|
+
end
|
185
|
+
|
186
|
+
def write_tree(indent = "", index = 0)
|
187
|
+
puts self
|
188
|
+
|
189
|
+
indent = indent + " "
|
190
|
+
@children.each_with_index do |child, i|
|
191
|
+
print "#{indent}#{i}: "
|
192
|
+
|
193
|
+
if child.is_a?(Container)
|
194
|
+
child.write_tree(indent)
|
195
|
+
else
|
196
|
+
puts child
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
174
200
|
end
|
175
201
|
end
|
176
202
|
end
|
@@ -100,6 +100,22 @@ module CyberarmEngine
|
|
100
100
|
end
|
101
101
|
end
|
102
102
|
|
103
|
+
def caret_position
|
104
|
+
text_input_position_for(:caret_pos)
|
105
|
+
end
|
106
|
+
|
107
|
+
def selection_start_position
|
108
|
+
text_input_position_for(:selection_start)
|
109
|
+
end
|
110
|
+
|
111
|
+
def text_input_position_for(method)
|
112
|
+
if @type == :password
|
113
|
+
@text.x + @text.width(default(:password_character) * @text_input.text[0..@text_input.send(method)].length)
|
114
|
+
else
|
115
|
+
@text.x + @text.width(@text_input.text[0..@text_input.send(method)])
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
103
119
|
def left_mouse_button(sender, x, y)
|
104
120
|
super
|
105
121
|
window.text_input = @text_input
|
@@ -141,22 +157,6 @@ module CyberarmEngine
|
|
141
157
|
return :handled
|
142
158
|
end
|
143
159
|
|
144
|
-
def caret_position
|
145
|
-
text_input_position_for(:caret_pos)
|
146
|
-
end
|
147
|
-
|
148
|
-
def selection_start_position
|
149
|
-
text_input_position_for(:selection_start)
|
150
|
-
end
|
151
|
-
|
152
|
-
def text_input_position_for(method)
|
153
|
-
if @type == :password
|
154
|
-
@text.x + @text.textobject.text_width(default(:password_character) * @text_input.text[0..@text_input.send(method)].length)
|
155
|
-
else
|
156
|
-
@text.x + @text.textobject.text_width(@text_input.text[0..@text_input.send(method)])
|
157
|
-
end
|
158
|
-
end
|
159
|
-
|
160
160
|
def recalculate
|
161
161
|
super
|
162
162
|
|
@@ -14,7 +14,7 @@ module CyberarmEngine
|
|
14
14
|
def clicked_left_mouse_button(sender, x, y)
|
15
15
|
@block.call(self) if @block
|
16
16
|
|
17
|
-
return :handled
|
17
|
+
# return :handled
|
18
18
|
end
|
19
19
|
|
20
20
|
def recalculate
|
@@ -44,6 +44,8 @@ module CyberarmEngine
|
|
44
44
|
recalculate
|
45
45
|
|
46
46
|
root.gui_state.request_recalculate if old_width != width || old_height != height
|
47
|
+
|
48
|
+
publish(:changed, self.value)
|
47
49
|
end
|
48
50
|
end
|
49
51
|
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
module CyberarmEngine
|
2
|
+
class Element
|
3
|
+
class Slider < Container
|
4
|
+
class Handle < Button
|
5
|
+
def initialize(*args)
|
6
|
+
super(*args)
|
7
|
+
|
8
|
+
event(:begin_drag)
|
9
|
+
event(:drag_update)
|
10
|
+
event(:end_drag)
|
11
|
+
|
12
|
+
subscribe :begin_drag do |sender, x, y, button|
|
13
|
+
@drag_start_pos = Vector.new(x, y)
|
14
|
+
|
15
|
+
:handled
|
16
|
+
end
|
17
|
+
|
18
|
+
subscribe :drag_update do |sender, x, y, button|
|
19
|
+
@parent.handle_dragged_to(x, y)
|
20
|
+
|
21
|
+
:handled
|
22
|
+
end
|
23
|
+
|
24
|
+
subscribe :end_drag do
|
25
|
+
@drag_start_pos = nil
|
26
|
+
|
27
|
+
:handled
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def draggable?(button)
|
32
|
+
button == :left
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
attr_reader :range, :step_size
|
37
|
+
def initialize(options = {}, block = nil)
|
38
|
+
super(options, block)
|
39
|
+
|
40
|
+
@range = @options[:range] ? @options[:range] : 0.0..1.0
|
41
|
+
@step_size = @options[:step] ? @options[:step] : 0.1
|
42
|
+
@value = @options[:value] ? @options[:value] : (@range.first + @range.last) / 2
|
43
|
+
|
44
|
+
@handle = Handle.new("", parent: self, width: 8, height: 1.0) { close }
|
45
|
+
self.add(@handle)
|
46
|
+
end
|
47
|
+
|
48
|
+
def recalculate
|
49
|
+
_width = dimensional_size(@style.width, :width)
|
50
|
+
_height= dimensional_size(@style.height,:height)
|
51
|
+
|
52
|
+
@width = _width
|
53
|
+
@height = _height
|
54
|
+
|
55
|
+
position_handle
|
56
|
+
@handle.recalculate
|
57
|
+
@handle.update_background
|
58
|
+
|
59
|
+
update_background
|
60
|
+
end
|
61
|
+
|
62
|
+
def position_handle
|
63
|
+
@handle.x = @x + @style.padding_left + @style.border_thickness_left +
|
64
|
+
((content_width - @handle.outer_width) * (@value - @range.min) / (@range.max - @range.min).to_f)
|
65
|
+
|
66
|
+
@handle.y = @y + @style.border_thickness_top + @style.padding_top
|
67
|
+
end
|
68
|
+
|
69
|
+
def draw
|
70
|
+
super
|
71
|
+
|
72
|
+
@handle.draw
|
73
|
+
end
|
74
|
+
|
75
|
+
def update
|
76
|
+
super
|
77
|
+
|
78
|
+
@tip = value.to_s
|
79
|
+
@handle.tip = @tip
|
80
|
+
end
|
81
|
+
|
82
|
+
def holding_left_mouse_button(sender, x, y)
|
83
|
+
handle_dragged_to(x, y)
|
84
|
+
|
85
|
+
:handled
|
86
|
+
end
|
87
|
+
|
88
|
+
def handle_dragged_to(x, y)
|
89
|
+
@ratio = ((x - @handle.width / 2) - @x) / (content_width - @handle.outer_width)
|
90
|
+
|
91
|
+
self.value = @ratio.clamp(0.0, 1.0) * (@range.max - @range.min) + @range.min
|
92
|
+
end
|
93
|
+
|
94
|
+
def value
|
95
|
+
@value
|
96
|
+
end
|
97
|
+
|
98
|
+
def value=(n)
|
99
|
+
@value = n
|
100
|
+
position_handle
|
101
|
+
@handle.recalculate
|
102
|
+
|
103
|
+
publish(:changed, @value)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -5,8 +5,8 @@ module CyberarmEngine
|
|
5
5
|
|
6
6
|
def initialize(options, block = nil)
|
7
7
|
super(options[:checkmark], options, block)
|
8
|
-
@
|
9
|
-
if @
|
8
|
+
@value = options[:checked] || false
|
9
|
+
if @value
|
10
10
|
@text.text = @options[:checkmark]
|
11
11
|
else
|
12
12
|
@text.text = ""
|
@@ -15,41 +15,42 @@ module CyberarmEngine
|
|
15
15
|
return self
|
16
16
|
end
|
17
17
|
|
18
|
-
def toggled=(boolean)
|
19
|
-
@toggled = !boolean
|
20
|
-
toggle
|
21
|
-
end
|
22
|
-
|
23
18
|
def clicked_left_mouse_button(sender, x, y)
|
24
|
-
|
19
|
+
self.value = !@value
|
25
20
|
|
26
21
|
@block.call(self) if @block
|
27
22
|
|
28
23
|
return :handled
|
29
24
|
end
|
30
25
|
|
31
|
-
def toggle
|
32
|
-
if @toggled
|
33
|
-
@toggled = false
|
34
|
-
@text.text = ""
|
35
|
-
else
|
36
|
-
@toggled = true
|
37
|
-
@text.text = @options[:checkmark]
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
26
|
def recalculate
|
42
27
|
super
|
43
28
|
|
44
29
|
_width = dimensional_size(@style.width, :width)
|
45
30
|
_height= dimensional_size(@style.height,:height)
|
31
|
+
|
46
32
|
@width = _width ? _width : @text.textobject.text_width(@options[:checkmark])
|
47
33
|
@height = _height ? _height : @text.height
|
34
|
+
|
48
35
|
update_background
|
49
36
|
end
|
50
37
|
|
51
38
|
def value
|
52
|
-
@
|
39
|
+
@value
|
40
|
+
end
|
41
|
+
|
42
|
+
def value=(boolean)
|
43
|
+
@value = boolean
|
44
|
+
|
45
|
+
if boolean
|
46
|
+
@text.text = @options[:checkmark]
|
47
|
+
else
|
48
|
+
@text.text = ""
|
49
|
+
end
|
50
|
+
|
51
|
+
recalculate
|
52
|
+
|
53
|
+
publish(:changed, @value)
|
53
54
|
end
|
54
55
|
end
|
55
56
|
end
|
@@ -22,6 +22,11 @@ module CyberarmEngine
|
|
22
22
|
@mouse_down_on = {}
|
23
23
|
@mouse_down_position = {}
|
24
24
|
@pending_recalculate_request = false
|
25
|
+
|
26
|
+
@tip = CyberarmEngine::Text.new("", size: 22, z: Float::INFINITY)
|
27
|
+
@menu = nil
|
28
|
+
@min_drag_distance = 0
|
29
|
+
@mouse_pos = Vector.new
|
25
30
|
end
|
26
31
|
|
27
32
|
# throws :blur event to focused element and sets GuiState focused element
|
@@ -35,8 +40,18 @@ module CyberarmEngine
|
|
35
40
|
@focus
|
36
41
|
end
|
37
42
|
|
43
|
+
def draw
|
44
|
+
super
|
45
|
+
|
46
|
+
if @tip.text.length > 0
|
47
|
+
Gosu.draw_rect(@tip.x - 2, @tip.y - 2, @tip.width + 4, @tip.height + 4, 0xff020202, Float::INFINITY)
|
48
|
+
@tip.draw
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
38
52
|
def update
|
39
53
|
if @pending_recalculate_request
|
54
|
+
@root_container.recalculate
|
40
55
|
@root_container.recalculate
|
41
56
|
@pending_recalculate_request = false
|
42
57
|
end
|
@@ -56,12 +71,30 @@ module CyberarmEngine
|
|
56
71
|
redirect_holding_mouse_button(:middle) if @mouse_over && Gosu.button_down?(Gosu::MsMiddle)
|
57
72
|
redirect_holding_mouse_button(:right) if @mouse_over && Gosu.button_down?(Gosu::MsRight)
|
58
73
|
|
74
|
+
if Vector.new(window.mouse_x, window.mouse_y) == @last_mouse_pos
|
75
|
+
if @mouse_over && (Gosu.milliseconds - @mouse_moved_at) > tool_tip_delay
|
76
|
+
@tip.text = @mouse_over.tip if @mouse_over
|
77
|
+
@tip.x, @tip.y = window.mouse_x - @tip.width / 2, window.mouse_y - @tip.height - 4
|
78
|
+
else
|
79
|
+
@tip.text = ""
|
80
|
+
end
|
81
|
+
else
|
82
|
+
@mouse_moved_at = Gosu.milliseconds
|
83
|
+
end
|
84
|
+
|
85
|
+
@last_mouse_pos = Vector.new(window.mouse_x, window.mouse_y)
|
86
|
+
@mouse_pos = @last_mouse_pos.clone
|
87
|
+
|
59
88
|
request_recalculate if @active_width != window.width || @active_height != window.height
|
60
89
|
|
61
90
|
@active_width = window.width
|
62
91
|
@active_height = window.height
|
63
92
|
end
|
64
93
|
|
94
|
+
def tool_tip_delay
|
95
|
+
500 # ms
|
96
|
+
end
|
97
|
+
|
65
98
|
def button_down(id)
|
66
99
|
super
|
67
100
|
|
@@ -72,6 +105,8 @@ module CyberarmEngine
|
|
72
105
|
redirect_mouse_button(:middle)
|
73
106
|
when Gosu::MsRight
|
74
107
|
redirect_mouse_button(:right)
|
108
|
+
when Gosu::KbF5
|
109
|
+
request_recalculate
|
75
110
|
end
|
76
111
|
end
|
77
112
|
|
@@ -115,12 +150,26 @@ module CyberarmEngine
|
|
115
150
|
@mouse_over.publish(:"clicked_#{button}_mouse_button", window.mouse_x, window.mouse_y) if @mouse_over == @mouse_down_on[button]
|
116
151
|
end
|
117
152
|
|
153
|
+
if @dragging_element
|
154
|
+
@dragging_element.publish(:end_drag, window.mouse_x, window.mouse_y, button)
|
155
|
+
@dragging_element = nil
|
156
|
+
end
|
157
|
+
|
118
158
|
@mouse_down_position[button] = nil
|
119
159
|
@mouse_down_on[button] = nil
|
120
160
|
end
|
121
161
|
|
122
162
|
def redirect_holding_mouse_button(button)
|
123
|
-
@
|
163
|
+
if !@dragging_element && @mouse_down_on[button] && @mouse_down_on[button].draggable?(button) && @mouse_pos.distance(@mouse_down_position[button]) > @min_drag_distance
|
164
|
+
@dragging_element = @mouse_down_on[button]
|
165
|
+
@dragging_element.publish(:"begin_drag", window.mouse_x, window.mouse_y, button)
|
166
|
+
end
|
167
|
+
|
168
|
+
if @dragging_element
|
169
|
+
@dragging_element.publish(:"drag_update", window.mouse_x, window.mouse_y, button) if @dragging_element
|
170
|
+
else
|
171
|
+
@mouse_over.publish(:"holding_#{button}_mouse_button", window.mouse_x, window.mouse_y) if @mouse_over
|
172
|
+
end
|
124
173
|
end
|
125
174
|
|
126
175
|
def redirect_mouse_wheel(button)
|
@@ -88,7 +88,7 @@ module CyberarmEngine
|
|
88
88
|
caret_width: 2,
|
89
89
|
caret_color: Gosu::Color::WHITE,
|
90
90
|
caret_interval: 500,
|
91
|
-
selection_color: Gosu::Color
|
91
|
+
selection_color: Gosu::Color.rgba(255, 128, 50, 200),
|
92
92
|
},
|
93
93
|
|
94
94
|
Image: { # < Element
|
@@ -114,6 +114,15 @@ module CyberarmEngine
|
|
114
114
|
fraction_background: [0xffc75e61, 0xffe26623],
|
115
115
|
border_thickness: 1,
|
116
116
|
border_color: [0xffd59674, 0xffff8746]
|
117
|
+
},
|
118
|
+
|
119
|
+
Slider: { # < Element
|
120
|
+
width: 250,
|
121
|
+
height: 36,
|
122
|
+
background: 0xff111111,
|
123
|
+
fraction_background: [0xffc75e61, 0xffe26623],
|
124
|
+
border_thickness: 1,
|
125
|
+
border_color: [0xffd59674, 0xffff8746]
|
117
126
|
}
|
118
127
|
}.freeze
|
119
128
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module CyberarmEngine
|
2
|
-
class
|
2
|
+
class Window < Gosu::Window
|
3
3
|
IMAGES = {}
|
4
4
|
SAMPLES= {}
|
5
5
|
SONGS = {}
|
@@ -34,6 +34,8 @@ module CyberarmEngine
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def update
|
37
|
+
Stats.clear
|
38
|
+
|
37
39
|
current_state.update if current_state
|
38
40
|
@last_frame_time = Gosu.milliseconds-@current_frame_time
|
39
41
|
@current_frame_time = Gosu.milliseconds
|
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.
|
4
|
+
version: 0.14.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cyberarm
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-05-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gosu
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.15.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: gosu_more_drawables
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.3'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.3'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: bundler
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,14 +58,14 @@ dependencies:
|
|
44
58
|
requirements:
|
45
59
|
- - "~>"
|
46
60
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
61
|
+
version: '13.0'
|
48
62
|
type: :development
|
49
63
|
prerelease: false
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
66
|
- - "~>"
|
53
67
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
68
|
+
version: '13.0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: minitest
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -88,12 +102,11 @@ files:
|
|
88
102
|
- lib/cyberarm_engine/bounding_box.rb
|
89
103
|
- lib/cyberarm_engine/common.rb
|
90
104
|
- lib/cyberarm_engine/config_file.rb
|
91
|
-
- lib/cyberarm_engine/engine.rb
|
92
105
|
- lib/cyberarm_engine/game_object.rb
|
93
106
|
- lib/cyberarm_engine/game_state.rb
|
94
|
-
- lib/cyberarm_engine/gosu_ext/circle.rb
|
95
107
|
- lib/cyberarm_engine/ray.rb
|
96
108
|
- lib/cyberarm_engine/shader.rb
|
109
|
+
- lib/cyberarm_engine/stats.rb
|
97
110
|
- lib/cyberarm_engine/text.rb
|
98
111
|
- lib/cyberarm_engine/timer.rb
|
99
112
|
- lib/cyberarm_engine/transform.rb
|
@@ -103,11 +116,15 @@ files:
|
|
103
116
|
- lib/cyberarm_engine/ui/elements/button.rb
|
104
117
|
- lib/cyberarm_engine/ui/elements/check_box.rb
|
105
118
|
- lib/cyberarm_engine/ui/elements/container.rb
|
119
|
+
- lib/cyberarm_engine/ui/elements/edit_box.rb
|
106
120
|
- lib/cyberarm_engine/ui/elements/edit_line.rb
|
107
121
|
- lib/cyberarm_engine/ui/elements/flow.rb
|
108
122
|
- lib/cyberarm_engine/ui/elements/image.rb
|
109
123
|
- lib/cyberarm_engine/ui/elements/label.rb
|
124
|
+
- lib/cyberarm_engine/ui/elements/list_box.rb
|
110
125
|
- lib/cyberarm_engine/ui/elements/progress.rb
|
126
|
+
- lib/cyberarm_engine/ui/elements/radio.rb
|
127
|
+
- lib/cyberarm_engine/ui/elements/slider.rb
|
111
128
|
- lib/cyberarm_engine/ui/elements/stack.rb
|
112
129
|
- lib/cyberarm_engine/ui/elements/toggle_button.rb
|
113
130
|
- lib/cyberarm_engine/ui/event.rb
|
@@ -116,6 +133,7 @@ files:
|
|
116
133
|
- lib/cyberarm_engine/ui/theme.rb
|
117
134
|
- lib/cyberarm_engine/vector.rb
|
118
135
|
- lib/cyberarm_engine/version.rb
|
136
|
+
- lib/cyberarm_engine/window.rb
|
119
137
|
homepage: https://github.com/cyberarm/cyberarm_engine
|
120
138
|
licenses:
|
121
139
|
- MIT
|
@@ -1,9 +0,0 @@
|
|
1
|
-
module Gosu
|
2
|
-
# Sourced from https://gist.github.com/ippa/662583
|
3
|
-
def self.draw_circle(cx,cy,r, z = 9999,color = Gosu::Color::GREEN, step = 10)
|
4
|
-
0.step(360, step) do |a1|
|
5
|
-
a2 = a1 + step
|
6
|
-
draw_line(cx + Gosu.offset_x(a1, r), cy + Gosu.offset_y(a1, r), color, cx + Gosu.offset_x(a2, r), cy + Gosu.offset_y(a2, r), color, z)
|
7
|
-
end
|
8
|
-
end
|
9
|
-
end
|