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