cyberarm_engine 0.8.1 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/cyberarm_engine.rb +11 -10
- data/lib/cyberarm_engine/background.rb +12 -1
- data/lib/cyberarm_engine/engine.rb +1 -1
- data/lib/cyberarm_engine/ui/dsl.rb +17 -8
- data/lib/cyberarm_engine/ui/element.rb +27 -7
- data/lib/cyberarm_engine/ui/elements/button.rb +55 -0
- data/lib/cyberarm_engine/ui/elements/check_box.rb +59 -0
- data/lib/cyberarm_engine/ui/elements/container.rb +159 -0
- data/lib/cyberarm_engine/ui/elements/edit_line.rb +92 -0
- data/lib/cyberarm_engine/ui/elements/flow.rb +17 -0
- data/lib/cyberarm_engine/ui/elements/image.rb +50 -0
- data/lib/cyberarm_engine/ui/elements/label.rb +45 -0
- data/lib/cyberarm_engine/ui/elements/progress.rb +50 -0
- data/lib/cyberarm_engine/ui/elements/stack.rb +13 -0
- data/lib/cyberarm_engine/ui/elements/toggle_button.rb +54 -0
- data/lib/cyberarm_engine/ui/gui_state.rb +20 -2
- data/lib/cyberarm_engine/ui/theme.rb +28 -3
- data/lib/cyberarm_engine/version.rb +1 -1
- metadata +13 -12
- data/lib/cyberarm_engine/ui/button.rb +0 -53
- data/lib/cyberarm_engine/ui/check_box.rb +0 -60
- data/lib/cyberarm_engine/ui/container.rb +0 -146
- data/lib/cyberarm_engine/ui/edit_line.rb +0 -90
- data/lib/cyberarm_engine/ui/flow.rb +0 -15
- data/lib/cyberarm_engine/ui/image.rb +0 -46
- data/lib/cyberarm_engine/ui/label.rb +0 -43
- data/lib/cyberarm_engine/ui/stack.rb +0 -11
- data/lib/cyberarm_engine/ui/toggle_button.rb +0 -49
@@ -0,0 +1,92 @@
|
|
1
|
+
module CyberarmEngine
|
2
|
+
class Element
|
3
|
+
class EditLine < Button
|
4
|
+
def initialize(text, options = {}, block = nil)
|
5
|
+
super(text, options, block)
|
6
|
+
|
7
|
+
@type = default(:type)
|
8
|
+
|
9
|
+
@caret_width = default(:caret_width)
|
10
|
+
@caret_height= @text.height
|
11
|
+
@caret_color = default(:caret_color)
|
12
|
+
@caret_interval = default(:caret_interval)
|
13
|
+
@caret_last_interval = Gosu.milliseconds
|
14
|
+
@show_caret = true
|
15
|
+
|
16
|
+
@text_input = Gosu::TextInput.new
|
17
|
+
@text_input.text = text
|
18
|
+
|
19
|
+
return self
|
20
|
+
end
|
21
|
+
|
22
|
+
def render
|
23
|
+
Gosu.clip_to(@text.x, @text.y, @style.width, @text.height) do
|
24
|
+
draw_text
|
25
|
+
Gosu.draw_rect(caret_position, @text.y, @caret_width, @caret_height, @caret_color, @z + 40) if @focus && @show_caret
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def update
|
30
|
+
if @type == :password
|
31
|
+
@text.text = default(:password_character) * @text_input.text.length
|
32
|
+
else
|
33
|
+
@text.text = @text_input.text
|
34
|
+
end
|
35
|
+
|
36
|
+
if Gosu.milliseconds >= @caret_last_interval + @caret_interval
|
37
|
+
@caret_last_interval = Gosu.milliseconds
|
38
|
+
|
39
|
+
@show_caret = !@show_caret
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def left_mouse_button(sender, x, y)
|
44
|
+
super
|
45
|
+
window.text_input = @text_input
|
46
|
+
end
|
47
|
+
|
48
|
+
def enter(sender)
|
49
|
+
if @focus
|
50
|
+
@style.background_canvas.background = default(:active, :background)
|
51
|
+
@text.color = default(:active, :color)
|
52
|
+
else
|
53
|
+
@style.background_canvas.background = default(:hover, :background)
|
54
|
+
@text.color = default(:hover, :color)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def leave(sender)
|
59
|
+
unless @focus
|
60
|
+
super
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def blur(sender)
|
65
|
+
@focus = false
|
66
|
+
@style.background_canvas.background = default(:background)
|
67
|
+
@text.color = default(:color)
|
68
|
+
window.text_input = nil
|
69
|
+
end
|
70
|
+
|
71
|
+
# TODO: Fix caret rendering in wrong position unless caret_pos is at end of text
|
72
|
+
def caret_position
|
73
|
+
if @type == :password
|
74
|
+
@text.x + @text.textobject.text_width(default(:password_character) * @text_input.text[0..@text_input.caret_pos-1].length)
|
75
|
+
else
|
76
|
+
@text.x + @text.textobject.text_width(@text_input.text[0..@text_input.caret_pos-1])
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def recalculate
|
81
|
+
super
|
82
|
+
|
83
|
+
@width = dimensional_size(@style.width, :width) || default(:width)
|
84
|
+
update_background
|
85
|
+
end
|
86
|
+
|
87
|
+
def value
|
88
|
+
@text_input.text
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module CyberarmEngine
|
2
|
+
class Element
|
3
|
+
class Flow < Container
|
4
|
+
include Common
|
5
|
+
|
6
|
+
def layout
|
7
|
+
@children.each do |child|
|
8
|
+
if fits_on_line?(child)
|
9
|
+
position_on_current_line(child)
|
10
|
+
else
|
11
|
+
position_on_next_line(child)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module CyberarmEngine
|
2
|
+
class Element
|
3
|
+
class Image < Element
|
4
|
+
def initialize(path, options = {}, block = nil)
|
5
|
+
super(options, block)
|
6
|
+
@path = path
|
7
|
+
|
8
|
+
@image = Gosu::Image.new(path, retro: @options[:image_retro])
|
9
|
+
@scale_x, @scale_y = 1, 1
|
10
|
+
end
|
11
|
+
|
12
|
+
def render
|
13
|
+
@image.draw(
|
14
|
+
@style.border_thickness_left + @style.padding_left + @x,
|
15
|
+
@style.border_thickness_top + @style.padding_top + @y,
|
16
|
+
@z + 2,
|
17
|
+
@scale_x, @scale_y) # TODO: Add color support?
|
18
|
+
end
|
19
|
+
|
20
|
+
def clicked_left_mouse_button(sender, x, y)
|
21
|
+
@block.call(self) if @block
|
22
|
+
end
|
23
|
+
|
24
|
+
def recalculate
|
25
|
+
_width = dimensional_size(@style.width, :width)
|
26
|
+
_height= dimensional_size(@style.height,:height)
|
27
|
+
|
28
|
+
if _width && _height
|
29
|
+
@scale_x = _width.to_f / @image.width
|
30
|
+
@scale_y = _height.to_f / @image.height
|
31
|
+
elsif _width
|
32
|
+
@scale_x = _width.to_f / @image.width
|
33
|
+
@scale_y = @scale_x
|
34
|
+
elsif _height
|
35
|
+
@scale_y = _height.to_f / @image.height
|
36
|
+
@scale_x = @scale_y
|
37
|
+
else
|
38
|
+
@scale_x, @scale_y = 1, 1
|
39
|
+
end
|
40
|
+
|
41
|
+
@width = _width ? _width : @image.width.round * @scale_x
|
42
|
+
@height= _height ? _height : @image.height.round * @scale_y
|
43
|
+
end
|
44
|
+
|
45
|
+
def value
|
46
|
+
@path
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module CyberarmEngine
|
2
|
+
class Element
|
3
|
+
class Label < Element
|
4
|
+
def initialize(text, options = {}, block = nil)
|
5
|
+
super(options, block)
|
6
|
+
|
7
|
+
@text = Text.new(text, font: @options[:font], z: @z, color: @options[:color], size: @options[:text_size], shadow: @options[:text_shadow])
|
8
|
+
end
|
9
|
+
|
10
|
+
def render
|
11
|
+
@text.draw
|
12
|
+
end
|
13
|
+
|
14
|
+
def clicked_left_mouse_button(sender, x, y)
|
15
|
+
@block.call(self) if @block
|
16
|
+
end
|
17
|
+
|
18
|
+
def recalculate
|
19
|
+
_width = dimensional_size(@style.width, :width)
|
20
|
+
_height= dimensional_size(@style.height,:height)
|
21
|
+
@width = _width ? _width : @text.width.round
|
22
|
+
@height= _height ? _height : @text.height.round
|
23
|
+
|
24
|
+
@text.x = @style.border_thickness_left + @style.padding_left + @x
|
25
|
+
@text.y = @style.border_thickness_top + @style.padding_top + @y
|
26
|
+
@text.z = @z + 3
|
27
|
+
|
28
|
+
update_background
|
29
|
+
end
|
30
|
+
|
31
|
+
def value
|
32
|
+
@text.text
|
33
|
+
end
|
34
|
+
|
35
|
+
def value=(value)
|
36
|
+
@text.text = value
|
37
|
+
|
38
|
+
old_width, old_height = width, height
|
39
|
+
recalculate
|
40
|
+
|
41
|
+
root.gui_state.request_recalculate if old_width != width || old_height != height
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module CyberarmEngine
|
2
|
+
class Element
|
3
|
+
class Progress < Element
|
4
|
+
def initialize(options = {}, block = nil)
|
5
|
+
super(options, block)
|
6
|
+
|
7
|
+
@fraction_background = Background.new(background: @style.fraction_background)
|
8
|
+
self.value = options[:fraction] ? options[:fraction] : 0.0
|
9
|
+
end
|
10
|
+
|
11
|
+
def render
|
12
|
+
@fraction_background.draw
|
13
|
+
end
|
14
|
+
|
15
|
+
def recalculate
|
16
|
+
_width = dimensional_size(@style.width, :width)
|
17
|
+
_height= dimensional_size(@style.height,:height)
|
18
|
+
@width = _width
|
19
|
+
@height= _height
|
20
|
+
|
21
|
+
update_background
|
22
|
+
end
|
23
|
+
|
24
|
+
def update_background
|
25
|
+
super
|
26
|
+
|
27
|
+
@fraction_background.x = @style.border_thickness_left + @style.padding_left + @x
|
28
|
+
@fraction_background.y = @style.border_thickness_top + @style.padding_top + @y
|
29
|
+
@fraction_background.z = @z
|
30
|
+
@fraction_background.width = @width * @fraction
|
31
|
+
@fraction_background.height = @height
|
32
|
+
|
33
|
+
@fraction_background.background = @style.fraction_background
|
34
|
+
end
|
35
|
+
|
36
|
+
def value
|
37
|
+
@fraction
|
38
|
+
end
|
39
|
+
|
40
|
+
def value=(decimal)
|
41
|
+
raise "value must be number" unless decimal.is_a?(Numeric)
|
42
|
+
|
43
|
+
@fraction = decimal.clamp(0.0, 1.0)
|
44
|
+
update_background
|
45
|
+
|
46
|
+
return @fraction
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module CyberarmEngine
|
2
|
+
class Element
|
3
|
+
class ToggleButton < Button
|
4
|
+
attr_reader :toggled
|
5
|
+
|
6
|
+
def initialize(options, block = nil)
|
7
|
+
super(options[:checkmark], options, block)
|
8
|
+
@toggled = options[:toggled] || false
|
9
|
+
if @toggled
|
10
|
+
@text.text = @options[:checkmark]
|
11
|
+
else
|
12
|
+
@text.text = ""
|
13
|
+
end
|
14
|
+
|
15
|
+
return self
|
16
|
+
end
|
17
|
+
|
18
|
+
def toggled=(boolean)
|
19
|
+
@toggled = !boolean
|
20
|
+
toggle
|
21
|
+
end
|
22
|
+
|
23
|
+
def clicked_left_mouse_button(sender, x, y)
|
24
|
+
toggle
|
25
|
+
|
26
|
+
@block.call(self) if @block
|
27
|
+
end
|
28
|
+
|
29
|
+
def toggle
|
30
|
+
if @toggled
|
31
|
+
@toggled = false
|
32
|
+
@text.text = ""
|
33
|
+
else
|
34
|
+
@toggled = true
|
35
|
+
@text.text = @options[:checkmark]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def recalculate
|
40
|
+
super
|
41
|
+
|
42
|
+
_width = dimensional_size(@style.width, :width)
|
43
|
+
_height= dimensional_size(@style.height,:height)
|
44
|
+
@width = _width ? _width : @text.textobject.text_width(@options[:checkmark])
|
45
|
+
@height = _height ? _height : @text.height
|
46
|
+
update_background
|
47
|
+
end
|
48
|
+
|
49
|
+
def value
|
50
|
+
@toggled
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -10,15 +10,18 @@ module CyberarmEngine
|
|
10
10
|
|
11
11
|
@down_keys = {}
|
12
12
|
|
13
|
-
@root_container = Stack.new
|
13
|
+
@root_container = Element::Stack.new(gui_state: self)
|
14
14
|
@game_objects << @root_container
|
15
15
|
@containers = [@root_container]
|
16
16
|
|
17
|
+
@active_width = window.width
|
18
|
+
@active_height = window.height
|
19
|
+
|
17
20
|
@focus = nil
|
18
21
|
@mouse_over = nil
|
19
22
|
@mouse_down_on = {}
|
20
23
|
@mouse_down_position = {}
|
21
|
-
|
24
|
+
@pending_recalculate_request = false
|
22
25
|
|
23
26
|
setup
|
24
27
|
end
|
@@ -35,6 +38,11 @@ module CyberarmEngine
|
|
35
38
|
end
|
36
39
|
|
37
40
|
def update
|
41
|
+
if @pending_recalculate_request
|
42
|
+
@root_container.recalculate
|
43
|
+
@pending_recalculate_request = false
|
44
|
+
end
|
45
|
+
|
38
46
|
super
|
39
47
|
|
40
48
|
new_mouse_over = @root_container.hit_element?(window.mouse_x, window.mouse_y)
|
@@ -49,6 +57,11 @@ module CyberarmEngine
|
|
49
57
|
redirect_holding_mouse_button(:left) if @mouse_over && Gosu.button_down?(Gosu::MsLeft)
|
50
58
|
redirect_holding_mouse_button(:middle) if @mouse_over && Gosu.button_down?(Gosu::MsMiddle)
|
51
59
|
redirect_holding_mouse_button(:right) if @mouse_over && Gosu.button_down?(Gosu::MsRight)
|
60
|
+
|
61
|
+
request_recalculate if @active_width != window.width || @active_height != window.height
|
62
|
+
|
63
|
+
@active_width = window.width
|
64
|
+
@active_height = window.height
|
52
65
|
end
|
53
66
|
|
54
67
|
def button_down(id)
|
@@ -115,5 +128,10 @@ module CyberarmEngine
|
|
115
128
|
def redirect_mouse_wheel(button)
|
116
129
|
@mouse_over.publish(:"mouse_wheel_#{button}", window.mouse_x, window.mouse_y) if @mouse_over
|
117
130
|
end
|
131
|
+
|
132
|
+
# Schedule a full GUI recalculation on next update
|
133
|
+
def request_recalculate
|
134
|
+
@pending_recalculate_request = true
|
135
|
+
end
|
118
136
|
end
|
119
137
|
end
|
@@ -26,7 +26,23 @@ module CyberarmEngine
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
hash
|
29
|
+
deep_merge(hash, options)
|
30
|
+
end
|
31
|
+
|
32
|
+
# Derived from Rails Hash#deep_merge!
|
33
|
+
# Enables passing partial themes through Element options without issue
|
34
|
+
def deep_merge(original, intergrate, &block)
|
35
|
+
hash = original.merge(intergrate) do |key, this_val, other_val|
|
36
|
+
if this_val.is_a?(Hash) && other_val.is_a?(Hash)
|
37
|
+
deep_merge(this_val, other_val, &block)
|
38
|
+
elsif block_given?
|
39
|
+
block.call(key, this_val, other_val)
|
40
|
+
else
|
41
|
+
other_val
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
return hash
|
30
46
|
end
|
31
47
|
|
32
48
|
THEME = {
|
@@ -74,7 +90,7 @@ module CyberarmEngine
|
|
74
90
|
caret_interval: 500,
|
75
91
|
},
|
76
92
|
|
77
|
-
Image: {
|
93
|
+
Image: { # < Element
|
78
94
|
retro: false
|
79
95
|
},
|
80
96
|
|
@@ -88,7 +104,16 @@ module CyberarmEngine
|
|
88
104
|
|
89
105
|
ToggleButton: { # < Button
|
90
106
|
checkmark: "√"
|
107
|
+
},
|
108
|
+
|
109
|
+
Progress: { # < Element
|
110
|
+
width: 250,
|
111
|
+
height: 36,
|
112
|
+
background: 0xff111111,
|
113
|
+
fraction_background: [0xffc75e61, 0xffe26623],
|
114
|
+
border_thickness: 4,
|
115
|
+
border_color: [0xffd59674, 0xffff8746]
|
91
116
|
}
|
92
117
|
}.freeze
|
93
118
|
end
|
94
|
-
end
|
119
|
+
end
|
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.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cyberarm
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-06-
|
11
|
+
date: 2019-06-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gosu
|
@@ -93,21 +93,22 @@ files:
|
|
93
93
|
- lib/cyberarm_engine/objects/text.rb
|
94
94
|
- lib/cyberarm_engine/objects/timer.rb
|
95
95
|
- lib/cyberarm_engine/ui/border_canvas.rb
|
96
|
-
- lib/cyberarm_engine/ui/button.rb
|
97
|
-
- lib/cyberarm_engine/ui/check_box.rb
|
98
|
-
- lib/cyberarm_engine/ui/container.rb
|
99
96
|
- lib/cyberarm_engine/ui/dsl.rb
|
100
|
-
- lib/cyberarm_engine/ui/edit_line.rb
|
101
97
|
- lib/cyberarm_engine/ui/element.rb
|
98
|
+
- lib/cyberarm_engine/ui/elements/button.rb
|
99
|
+
- lib/cyberarm_engine/ui/elements/check_box.rb
|
100
|
+
- lib/cyberarm_engine/ui/elements/container.rb
|
101
|
+
- lib/cyberarm_engine/ui/elements/edit_line.rb
|
102
|
+
- lib/cyberarm_engine/ui/elements/flow.rb
|
103
|
+
- lib/cyberarm_engine/ui/elements/image.rb
|
104
|
+
- lib/cyberarm_engine/ui/elements/label.rb
|
105
|
+
- lib/cyberarm_engine/ui/elements/progress.rb
|
106
|
+
- lib/cyberarm_engine/ui/elements/stack.rb
|
107
|
+
- lib/cyberarm_engine/ui/elements/toggle_button.rb
|
102
108
|
- lib/cyberarm_engine/ui/event.rb
|
103
|
-
- lib/cyberarm_engine/ui/flow.rb
|
104
109
|
- lib/cyberarm_engine/ui/gui_state.rb
|
105
|
-
- lib/cyberarm_engine/ui/image.rb
|
106
|
-
- lib/cyberarm_engine/ui/label.rb
|
107
|
-
- lib/cyberarm_engine/ui/stack.rb
|
108
110
|
- lib/cyberarm_engine/ui/style.rb
|
109
111
|
- lib/cyberarm_engine/ui/theme.rb
|
110
|
-
- lib/cyberarm_engine/ui/toggle_button.rb
|
111
112
|
- lib/cyberarm_engine/version.rb
|
112
113
|
homepage: https://github.com/cyberarm/cyberarm_engine
|
113
114
|
licenses:
|
@@ -129,7 +130,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
129
130
|
- !ruby/object:Gem::Version
|
130
131
|
version: '0'
|
131
132
|
requirements: []
|
132
|
-
rubygems_version: 3.0.
|
133
|
+
rubygems_version: 3.0.3
|
133
134
|
signing_key:
|
134
135
|
specification_version: 4
|
135
136
|
summary: Make games quickly and easily with gosu
|