colstrom-fidgit 0.2.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +8 -0
- data/.rspec +2 -0
- data/CHANGELOG.md +31 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +20 -0
- data/README.md +154 -0
- data/Rakefile +38 -0
- data/config/default_schema.yml +216 -0
- data/examples/_all_examples.rb +9 -0
- data/examples/align_example.rb +56 -0
- data/examples/button_and_toggle_button_example.rb +38 -0
- data/examples/color_picker_example.rb +17 -0
- data/examples/color_well_example.rb +25 -0
- data/examples/combo_box_example.rb +24 -0
- data/examples/file_dialog_example.rb +42 -0
- data/examples/grid_packer_example.rb +29 -0
- data/examples/helpers/example_window.rb +17 -0
- data/examples/label_example.rb +23 -0
- data/examples/list_example.rb +23 -0
- data/examples/media/images/head_icon.png +0 -0
- data/examples/menu_pane_example.rb +27 -0
- data/examples/message_dialog_example.rb +65 -0
- data/examples/radio_button_example.rb +37 -0
- data/examples/readme_example.rb +32 -0
- data/examples/scroll_window_example.rb +49 -0
- data/examples/slider_example.rb +34 -0
- data/examples/splash_example.rb +42 -0
- data/examples/text_area_example.rb +33 -0
- data/fidgit.gemspec +35 -0
- data/lib/fidgit.rb +51 -0
- data/lib/fidgit/chingu_ext/window.rb +6 -0
- data/lib/fidgit/cursor.rb +38 -0
- data/lib/fidgit/elements/button.rb +113 -0
- data/lib/fidgit/elements/color_picker.rb +63 -0
- data/lib/fidgit/elements/color_well.rb +39 -0
- data/lib/fidgit/elements/combo_box.rb +115 -0
- data/lib/fidgit/elements/composite.rb +17 -0
- data/lib/fidgit/elements/container.rb +210 -0
- data/lib/fidgit/elements/element.rb +298 -0
- data/lib/fidgit/elements/file_browser.rb +152 -0
- data/lib/fidgit/elements/grid.rb +227 -0
- data/lib/fidgit/elements/group.rb +64 -0
- data/lib/fidgit/elements/horizontal.rb +12 -0
- data/lib/fidgit/elements/image_frame.rb +65 -0
- data/lib/fidgit/elements/label.rb +85 -0
- data/lib/fidgit/elements/list.rb +47 -0
- data/lib/fidgit/elements/main_packer.rb +25 -0
- data/lib/fidgit/elements/menu_pane.rb +163 -0
- data/lib/fidgit/elements/packer.rb +42 -0
- data/lib/fidgit/elements/radio_button.rb +86 -0
- data/lib/fidgit/elements/scroll_area.rb +68 -0
- data/lib/fidgit/elements/scroll_bar.rb +128 -0
- data/lib/fidgit/elements/scroll_window.rb +83 -0
- data/lib/fidgit/elements/slider.rb +125 -0
- data/lib/fidgit/elements/text_area.rb +494 -0
- data/lib/fidgit/elements/text_line.rb +92 -0
- data/lib/fidgit/elements/toggle_button.rb +67 -0
- data/lib/fidgit/elements/tool_tip.rb +35 -0
- data/lib/fidgit/elements/vertical.rb +12 -0
- data/lib/fidgit/event.rb +159 -0
- data/lib/fidgit/gosu_ext/color.rb +136 -0
- data/lib/fidgit/gosu_ext/gosu_module.rb +25 -0
- data/lib/fidgit/history.rb +91 -0
- data/lib/fidgit/redirector.rb +83 -0
- data/lib/fidgit/schema.rb +123 -0
- data/lib/fidgit/selection.rb +106 -0
- data/lib/fidgit/standard_ext/hash.rb +21 -0
- data/lib/fidgit/states/dialog_state.rb +52 -0
- data/lib/fidgit/states/file_dialog.rb +24 -0
- data/lib/fidgit/states/gui_state.rb +331 -0
- data/lib/fidgit/states/message_dialog.rb +61 -0
- data/lib/fidgit/version.rb +5 -0
- data/lib/fidgit/window.rb +19 -0
- data/media/images/arrow.png +0 -0
- data/media/images/combo_arrow.png +0 -0
- data/media/images/file_directory.png +0 -0
- data/media/images/file_file.png +0 -0
- data/media/images/pixel.png +0 -0
- data/spec/fidgit/elements/helpers/helper.rb +3 -0
- data/spec/fidgit/elements/helpers/tex_play_helper.rb +9 -0
- data/spec/fidgit/elements/image_frame_spec.rb +69 -0
- data/spec/fidgit/elements/label_spec.rb +37 -0
- data/spec/fidgit/event_spec.rb +210 -0
- data/spec/fidgit/gosu_ext/color_spec.rb +130 -0
- data/spec/fidgit/gosu_ext/helpers/helper.rb +3 -0
- data/spec/fidgit/helpers/helper.rb +4 -0
- data/spec/fidgit/history_spec.rb +153 -0
- data/spec/fidgit/redirector_spec.rb +78 -0
- data/spec/fidgit/schema_spec.rb +67 -0
- data/spec/fidgit/schema_test.yml +32 -0
- metadata +320 -0
@@ -0,0 +1,39 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Fidgit
|
4
|
+
class ColorWell < RadioButton
|
5
|
+
alias_method :color, :value
|
6
|
+
|
7
|
+
# @param (see RadioButton#initialize)
|
8
|
+
# @option (see RadioButton#initialize)
|
9
|
+
def initialize(options = {}, &block)
|
10
|
+
options = {
|
11
|
+
width: default(:width),
|
12
|
+
height: default(:height),
|
13
|
+
color: default(:color),
|
14
|
+
outline_color: default(:outline_color),
|
15
|
+
checked_border_color: default(:checked, :border_color),
|
16
|
+
}.merge! options
|
17
|
+
|
18
|
+
@outline_color = options[:outline_color].dup
|
19
|
+
|
20
|
+
super('', (options[:color] || options[:value]).dup, options)
|
21
|
+
end
|
22
|
+
|
23
|
+
protected
|
24
|
+
def draw_background
|
25
|
+
super
|
26
|
+
|
27
|
+
draw_frame x + 2, y + 2, width - 4, height - 4, 1, z, @outline_color
|
28
|
+
|
29
|
+
nil
|
30
|
+
end
|
31
|
+
|
32
|
+
protected
|
33
|
+
def draw_foreground
|
34
|
+
draw_rect x + 3, y + 3, width - 6, height - 6, z, value
|
35
|
+
|
36
|
+
nil
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'forwardable'
|
3
|
+
|
4
|
+
module Fidgit
|
5
|
+
class ComboBox < Button
|
6
|
+
extend Forwardable
|
7
|
+
|
8
|
+
ARROW_IMAGE = "combo_arrow.png"
|
9
|
+
|
10
|
+
def_delegators :@menu, :each
|
11
|
+
|
12
|
+
event :changed
|
13
|
+
|
14
|
+
def index; @menu.index(@value) end
|
15
|
+
def value; @value; end
|
16
|
+
|
17
|
+
def value=(value)
|
18
|
+
if @value != value
|
19
|
+
@value = value
|
20
|
+
item = @menu.find(@value)
|
21
|
+
self.text = item.text
|
22
|
+
self.icon = item.icon
|
23
|
+
publish :changed, @value
|
24
|
+
end
|
25
|
+
|
26
|
+
value
|
27
|
+
end
|
28
|
+
|
29
|
+
def index=(index)
|
30
|
+
if index.between?(0, @menu.size - 1)
|
31
|
+
self.value = @menu[index].value
|
32
|
+
end
|
33
|
+
|
34
|
+
index
|
35
|
+
end
|
36
|
+
|
37
|
+
# @param (see Button#initialize)
|
38
|
+
# @option (see Button#initialize)
|
39
|
+
# @option options [] :value
|
40
|
+
def initialize(options = {}, &block)
|
41
|
+
options = {
|
42
|
+
background_color: default(:background_color),
|
43
|
+
border_color: default(:border_color),
|
44
|
+
}.merge! options
|
45
|
+
|
46
|
+
@value = options[:value]
|
47
|
+
|
48
|
+
@hover_index = 0
|
49
|
+
|
50
|
+
@menu = MenuPane.new(show: false) do
|
51
|
+
subscribe :selected do |widget, value|
|
52
|
+
self.value = value
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
@@arrow ||= Gosu::Image[ARROW_IMAGE]
|
57
|
+
|
58
|
+
super('', options)
|
59
|
+
|
60
|
+
rect.height = [height, font.height + padding_top + padding_bottom].max
|
61
|
+
rect.width = [width, font.height * 4 + padding_left + padding_right].max
|
62
|
+
end
|
63
|
+
|
64
|
+
def item(text, value, options = {}, &block)
|
65
|
+
item = @menu.item(text, value, options, &block)
|
66
|
+
|
67
|
+
# Force text to be updated if the item added has the same value.
|
68
|
+
if item.value == @value
|
69
|
+
self.text = item.text
|
70
|
+
self.icon = item.icon
|
71
|
+
end
|
72
|
+
|
73
|
+
recalc
|
74
|
+
|
75
|
+
item
|
76
|
+
end
|
77
|
+
|
78
|
+
def draw
|
79
|
+
super
|
80
|
+
size = height / @@arrow.width.to_f
|
81
|
+
@@arrow.draw x + width - height, y, z, size, size
|
82
|
+
end
|
83
|
+
|
84
|
+
def clicked_left_mouse_button(sender, x, y)
|
85
|
+
@menu.x = self.x
|
86
|
+
@menu.y = self.y + height + border_thickness
|
87
|
+
$window.game_state_manager.current_game_state.show_menu @menu
|
88
|
+
|
89
|
+
nil
|
90
|
+
end
|
91
|
+
|
92
|
+
def clear
|
93
|
+
self.text = ""
|
94
|
+
self.icon = nil
|
95
|
+
@menu.clear
|
96
|
+
end
|
97
|
+
|
98
|
+
protected
|
99
|
+
def layout
|
100
|
+
super
|
101
|
+
|
102
|
+
# Max width of all items + allow size for the arrow.
|
103
|
+
rect.width = [@menu.width + height, min_width].max
|
104
|
+
|
105
|
+
nil
|
106
|
+
end
|
107
|
+
|
108
|
+
|
109
|
+
protected
|
110
|
+
# Any combo-box passed a block will allow you access to its methods.
|
111
|
+
def post_init_block(&block)
|
112
|
+
with(&block)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Fidgit
|
4
|
+
# A composite element, made up of other elements (but manages them internally).
|
5
|
+
class Composite < Packer
|
6
|
+
DEBUG_BORDER_COLOR = Gosu::Color.rgba(0, 255, 0, 100) # Color to draw an outline in when debugging layout.
|
7
|
+
|
8
|
+
# @param (see Element#initialize)
|
9
|
+
#
|
10
|
+
# @option (see Element#initialize)
|
11
|
+
def initialize(options = {})
|
12
|
+
options[:border_color] = DEBUG_BORDER_COLOR if Fidgit.debug_mode?
|
13
|
+
|
14
|
+
super(options)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,210 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'forwardable'
|
3
|
+
|
4
|
+
module Fidgit
|
5
|
+
# A container that contains Elements.
|
6
|
+
# @abstract
|
7
|
+
class Container < Element
|
8
|
+
extend Forwardable
|
9
|
+
|
10
|
+
def_delegators :@children, :size, :each, :find, :index, :[], :empty?, :map, :select, :inject
|
11
|
+
|
12
|
+
def x=(value)
|
13
|
+
@children.each {|c| c.x += value - x }
|
14
|
+
super(value)
|
15
|
+
end
|
16
|
+
|
17
|
+
def y=(value)
|
18
|
+
@children.each {|c| c.y += value - y }
|
19
|
+
super(value)
|
20
|
+
end
|
21
|
+
|
22
|
+
# @param (see Element#initialize)
|
23
|
+
#
|
24
|
+
# @option (see Element#initialize)
|
25
|
+
def initialize(options = {})
|
26
|
+
options[:border_color] = default(:debug, :border_color) if Fidgit.debug_mode?
|
27
|
+
|
28
|
+
@children = []
|
29
|
+
|
30
|
+
super(options)
|
31
|
+
end
|
32
|
+
|
33
|
+
def add(element)
|
34
|
+
element.send :parent=, self
|
35
|
+
@children.push element
|
36
|
+
|
37
|
+
recalc
|
38
|
+
nil
|
39
|
+
end
|
40
|
+
|
41
|
+
def remove(element)
|
42
|
+
@children.delete element
|
43
|
+
element.send :parent=, nil
|
44
|
+
|
45
|
+
recalc
|
46
|
+
nil
|
47
|
+
end
|
48
|
+
|
49
|
+
def insert(position, element)
|
50
|
+
@children.insert position, element
|
51
|
+
element.send :parent=, self
|
52
|
+
|
53
|
+
recalc
|
54
|
+
nil
|
55
|
+
end
|
56
|
+
|
57
|
+
# Create a button within the container.
|
58
|
+
def button(text, options = {}, &block)
|
59
|
+
Button.new(text, {parent: self}.merge!(options), &block)
|
60
|
+
end
|
61
|
+
|
62
|
+
# Create a color picker within the container.
|
63
|
+
def color_picker(options = {}, &block)
|
64
|
+
ColorPicker.new({parent: self}.merge!(options), &block)
|
65
|
+
end
|
66
|
+
|
67
|
+
# Create a color well within the container.
|
68
|
+
def color_well(options = {}, &block)
|
69
|
+
ColorWell.new({parent: self}.merge!(options), &block)
|
70
|
+
end
|
71
|
+
|
72
|
+
def combo_box(options = {}, &block)
|
73
|
+
ComboBox.new({parent: self}.merge!(options), &block)
|
74
|
+
end
|
75
|
+
|
76
|
+
def file_browser(type, options = {}, &block)
|
77
|
+
FileBrowser.new(type, {parent: self}.merge!(options), &block)
|
78
|
+
end
|
79
|
+
|
80
|
+
def group(options = {}, &block)
|
81
|
+
Group.new({parent: self}.merge!(options), &block)
|
82
|
+
end
|
83
|
+
|
84
|
+
# Create an icon.
|
85
|
+
def image_frame(image, options = {}, &block)
|
86
|
+
ImageFrame.new(image, {parent: self}.merge!(options), &block)
|
87
|
+
end
|
88
|
+
|
89
|
+
# Create a label within the container.
|
90
|
+
def label(text, options = {})
|
91
|
+
Label.new(text, {parent: self}.merge!(options))
|
92
|
+
end
|
93
|
+
|
94
|
+
def list(options = {}, &block)
|
95
|
+
List.new({parent: self}.merge!(options), &block)
|
96
|
+
end
|
97
|
+
|
98
|
+
public
|
99
|
+
# Pack elements within the block horizontally.
|
100
|
+
def horizontal(options = {}, &block)
|
101
|
+
Horizontal.new({ parent: self }.merge!(options), &block)
|
102
|
+
end
|
103
|
+
|
104
|
+
public
|
105
|
+
# Pack elements within the blockvertically.
|
106
|
+
def vertical(options = {}, &block)
|
107
|
+
Vertical.new({ parent: self }.merge!(options), &block)
|
108
|
+
end
|
109
|
+
|
110
|
+
public
|
111
|
+
# Pack elements within the block in a grid (matrix) formation.
|
112
|
+
def grid(options = {}, &block)
|
113
|
+
Grid.new({ parent: self }.merge!(options), &block)
|
114
|
+
end
|
115
|
+
|
116
|
+
def radio_button(text, value, options = {}, &block)
|
117
|
+
RadioButton.new(text, value, {parent: self}.merge!(options), &block)
|
118
|
+
end
|
119
|
+
|
120
|
+
def scroll_area(options = {}, &block)
|
121
|
+
ScrollArea.new({parent: self}.merge!(options), &block)
|
122
|
+
end
|
123
|
+
|
124
|
+
def scroll_window(options = {}, &block)
|
125
|
+
ScrollWindow.new({parent: self}.merge!(options), &block)
|
126
|
+
end
|
127
|
+
|
128
|
+
def slider(options = {}, &block)
|
129
|
+
Slider.new({parent: self}.merge!(options), &block)
|
130
|
+
end
|
131
|
+
|
132
|
+
def text_area(options = {}, &block)
|
133
|
+
TextArea.new({parent: self}.merge!(options), &block)
|
134
|
+
end
|
135
|
+
|
136
|
+
def toggle_button(text, options = {}, &block)
|
137
|
+
ToggleButton.new(text, {parent: self}.merge!(options), &block)
|
138
|
+
end
|
139
|
+
|
140
|
+
def clear
|
141
|
+
@children.each {|child| child.send :parent=, nil }
|
142
|
+
@children.clear
|
143
|
+
|
144
|
+
recalc
|
145
|
+
|
146
|
+
nil
|
147
|
+
end
|
148
|
+
|
149
|
+
def update
|
150
|
+
@children.each { |c| c.update }
|
151
|
+
|
152
|
+
nil
|
153
|
+
end
|
154
|
+
|
155
|
+
# Returns the element within this container that was hit,
|
156
|
+
# @return [Element, nil] The element hit, otherwise nil.
|
157
|
+
def hit_element(x, y)
|
158
|
+
@children.reverse_each do |child|
|
159
|
+
case child
|
160
|
+
when Container, Composite
|
161
|
+
if element = child.hit_element(x, y)
|
162
|
+
return element
|
163
|
+
end
|
164
|
+
else
|
165
|
+
return child if child.hit?(x, y)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
self if hit?(x, y)
|
170
|
+
end
|
171
|
+
|
172
|
+
protected
|
173
|
+
def draw_foreground
|
174
|
+
@children.each {|c| c.draw }
|
175
|
+
|
176
|
+
font.draw self.class.name, x, y, z if Fidgit.debug_mode?
|
177
|
+
|
178
|
+
nil
|
179
|
+
end
|
180
|
+
|
181
|
+
protected
|
182
|
+
# Any container passed a block will allow you access to its methods.
|
183
|
+
def post_init_block(&block)
|
184
|
+
with(&block)
|
185
|
+
end
|
186
|
+
|
187
|
+
public
|
188
|
+
def to_s
|
189
|
+
"#{super} [#{@children.size} #{@children.size == 1 ? 'child' : 'children'}]"
|
190
|
+
end
|
191
|
+
|
192
|
+
public
|
193
|
+
def write_tree(indent = "", index = 0)
|
194
|
+
puts self
|
195
|
+
|
196
|
+
indent = indent + " "
|
197
|
+
|
198
|
+
@children.each.with_index do |element, i|
|
199
|
+
print "#{indent}#{i}: "
|
200
|
+
|
201
|
+
case element
|
202
|
+
when Container
|
203
|
+
element.write_tree(indent)
|
204
|
+
else
|
205
|
+
puts element
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
@@ -0,0 +1,298 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
# The Fidgit GUI framework for Gosu.
|
4
|
+
module Fidgit
|
5
|
+
class << self
|
6
|
+
attr_accessor :debug_mode
|
7
|
+
end
|
8
|
+
|
9
|
+
self.debug_mode = false
|
10
|
+
|
11
|
+
def self.debug_mode?; debug_mode; end
|
12
|
+
|
13
|
+
# An element within the GUI environment.
|
14
|
+
# @abstract
|
15
|
+
class Element
|
16
|
+
include Event
|
17
|
+
|
18
|
+
event :left_mouse_button
|
19
|
+
event :holding_left_mouse_button
|
20
|
+
event :released_left_mouse_button
|
21
|
+
event :clicked_left_mouse_button
|
22
|
+
|
23
|
+
event :right_mouse_button
|
24
|
+
event :holding_right_mouse_button
|
25
|
+
event :released_right_mouse_button
|
26
|
+
event :clicked_right_mouse_button
|
27
|
+
|
28
|
+
event :middle_mouse_button
|
29
|
+
event :holding_middle_mouse_button
|
30
|
+
event :released_middle_mouse_button
|
31
|
+
event :clicked_middle_mouse_button
|
32
|
+
|
33
|
+
event :mouse_wheel_up
|
34
|
+
event :mouse_wheel_down
|
35
|
+
|
36
|
+
event :enter
|
37
|
+
event :hover
|
38
|
+
event :leave
|
39
|
+
|
40
|
+
DEFAULT_SCHEMA_FILE = File.expand_path(File.join(__FILE__, '..', '..', '..', '..', 'config', 'default_schema.yml'))
|
41
|
+
|
42
|
+
VALID_ALIGN_H = [:left, :center, :right, :fill]
|
43
|
+
VALID_ALIGN_V = [:top, :center, :bottom, :fill]
|
44
|
+
|
45
|
+
attr_reader :z, :tip, :padding_top, :padding_right, :padding_bottom, :padding_left,
|
46
|
+
:align_h, :align_v, :parent, :border_thickness, :font
|
47
|
+
|
48
|
+
attr_accessor :background_color
|
49
|
+
attr_writer :tip
|
50
|
+
|
51
|
+
def x; rect.x; end
|
52
|
+
def x=(value); rect.x = value; end
|
53
|
+
|
54
|
+
def y; rect.y; end
|
55
|
+
def y=(value); rect.y = value; end
|
56
|
+
|
57
|
+
# Width not including border.
|
58
|
+
def width; rect.width; end
|
59
|
+
def width=(value); rect.width = [[value, @width_range.max].min, @width_range.min].max; end
|
60
|
+
def min_width; @width_range.min; end
|
61
|
+
def max_width; @width_range.max; end
|
62
|
+
# Width including border thickness.
|
63
|
+
def outer_width; rect.width + @border_thickness * 2; end
|
64
|
+
|
65
|
+
# Height not including border.
|
66
|
+
def height; rect.height; end
|
67
|
+
def height=(value); rect.height = [[value, @height_range.max].min, @height_range.min].max; end
|
68
|
+
def min_height; @height_range.min; end
|
69
|
+
def max_height; @height_range.max; end
|
70
|
+
# Height including border thickness.
|
71
|
+
def outer_height; rect.height + @border_thickness * 2; end
|
72
|
+
|
73
|
+
# Can the object be dragged?
|
74
|
+
def drag?(button); false; end
|
75
|
+
|
76
|
+
def enabled?; @enabled; end
|
77
|
+
|
78
|
+
def enabled=(value)
|
79
|
+
if @mouse_over and enabled? and not value
|
80
|
+
$window.current_game_state.unset_mouse_over
|
81
|
+
end
|
82
|
+
|
83
|
+
@enabled = value
|
84
|
+
end
|
85
|
+
|
86
|
+
def rect; @rect; end; protected :rect
|
87
|
+
|
88
|
+
def self.schema; @@schema ||= Schema.new(YAML.load(File.read(DEFAULT_SCHEMA_FILE)));; end
|
89
|
+
|
90
|
+
class << self
|
91
|
+
alias_method :original_new, :new
|
92
|
+
|
93
|
+
def new(*args, &block)
|
94
|
+
obj = original_new(*args) # Block should be ignored.
|
95
|
+
obj.send :post_init
|
96
|
+
obj.send :post_init_block, &block if block_given?
|
97
|
+
obj
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# Get the default value from the schema.
|
102
|
+
#
|
103
|
+
# @param [Symbol, Array<Symbol>] names
|
104
|
+
def default(*names)
|
105
|
+
self.class.schema.default(self.class, names)
|
106
|
+
end
|
107
|
+
|
108
|
+
# @param [Element, nil] parent
|
109
|
+
#
|
110
|
+
# @option options [Number] :x (0)
|
111
|
+
# @option options [Number] :y (0)
|
112
|
+
# @option options [Number] :z (0)
|
113
|
+
#
|
114
|
+
# @option options [Number] :width (auto)
|
115
|
+
# @option options [Number] :min_width (value of :width option)
|
116
|
+
# @option options [Number] :max_width (value of :width option)
|
117
|
+
#
|
118
|
+
# @option options [Number] :height (auto)
|
119
|
+
# @option options [Number] :min_height (value of :height option)
|
120
|
+
# @option options [Number] :max_height (value of :height option)
|
121
|
+
#
|
122
|
+
# @option options [String] :tip ('') Tool-tip text
|
123
|
+
# @option options [String, :default] :font_name (:default, which resolves as the default Gosu font)
|
124
|
+
# @option options [String] :font_height (30)
|
125
|
+
# @option options [Gosu::Font] :font Use this instead of :font_name and :font_height
|
126
|
+
#
|
127
|
+
# @option options [Gosu::Color] :background_color (transparent)
|
128
|
+
# @option options [Gosu::Color] :border_color (transparent)
|
129
|
+
#
|
130
|
+
# @option options [Boolean] :enabled (true)
|
131
|
+
#
|
132
|
+
# @option options [Number] :padding (4)
|
133
|
+
# @option options [Number] :padding_h (:padding option)
|
134
|
+
# @option options [Number] :padding_v (:padding option)
|
135
|
+
# @option options [Number] :padding_top (:padding_v option)
|
136
|
+
# @option options [Number] :padding_right (:padding_h option)
|
137
|
+
# @option options [Number] :padding_bottom (:padding_v option)
|
138
|
+
# @option options [Number] :padding_left (:padding_h option)
|
139
|
+
#
|
140
|
+
# @option options [Symbol] :align Align both horizontally and vertically. One of :center, :fill or [<align_v>, <align_h>] such as [:top, :right].
|
141
|
+
# @option options [Symbol] :align_h (value or :align else :left) One of :left, :center, :right :fill
|
142
|
+
# @option options [Symbol] :align_v (value of :align else :top) One of :top, :center, :bottom, :fill
|
143
|
+
|
144
|
+
# @yield instance_methods_eval with respect to self.
|
145
|
+
def initialize(options = {}, &block)
|
146
|
+
options = {
|
147
|
+
x: 0,
|
148
|
+
y: 0,
|
149
|
+
z: 0,
|
150
|
+
tip: '',
|
151
|
+
font_name: default(:font_name),
|
152
|
+
font_height: default(:font_height),
|
153
|
+
background_color: default(:background_color),
|
154
|
+
border_color: default(:border_color),
|
155
|
+
border_thickness: default(:border_thickness),
|
156
|
+
enabled: true,
|
157
|
+
}.merge! options
|
158
|
+
|
159
|
+
@enabled = options[:enabled]
|
160
|
+
|
161
|
+
@mouse_over = false
|
162
|
+
|
163
|
+
# Alignment and min/max dimensions.
|
164
|
+
@align_h = options[:align_h] || Array(options[:align]).last || default(:align_h)
|
165
|
+
raise ArgumentError, "Invalid align_h: #{@align_h}" unless VALID_ALIGN_H.include? @align_h
|
166
|
+
|
167
|
+
min_width = (options[:min_width] || options[:width] || 0)
|
168
|
+
max_width = (options[:max_width] || options[:width] || Float::INFINITY)
|
169
|
+
@width_range = min_width..max_width
|
170
|
+
|
171
|
+
@align_v = options[:align_v] || Array(options[:align]).first || default(:align_v)
|
172
|
+
raise ArgumentError, "Invalid align_v: #{@align_v}" unless VALID_ALIGN_V.include? @align_v
|
173
|
+
|
174
|
+
min_height = (options[:min_height] || options[:height] || 0)
|
175
|
+
max_height = (options[:max_height] || options[:height] || Float::INFINITY)
|
176
|
+
@height_range = min_height..max_height
|
177
|
+
|
178
|
+
@background_color = options[:background_color].dup
|
179
|
+
@border_color = options[:border_color].dup
|
180
|
+
@border_thickness = options[:border_thickness]
|
181
|
+
|
182
|
+
@padding_top = options[:padding_top] || options[:padding_v] || options[:padding] || default(:padding_top)
|
183
|
+
@padding_right = options[:padding_right] || options[:padding_h] || options[:padding] || default(:padding_right)
|
184
|
+
@padding_bottom = options[:padding_bottom] || options[:padding_v] || options[:padding] || default(:padding_bottom)
|
185
|
+
@padding_left = options[:padding_left] || options[:padding_h] || options[:padding] || default(:padding_left)
|
186
|
+
self.parent = options[:parent]
|
187
|
+
|
188
|
+
@z = options[:z]
|
189
|
+
@tip = options[:tip].dup
|
190
|
+
font_name = if options[:font_name].nil? or options[:font_name] == :default
|
191
|
+
Gosu::default_font_name
|
192
|
+
else
|
193
|
+
options[:font_name].dup
|
194
|
+
end
|
195
|
+
|
196
|
+
@font = options[:font] || Gosu::Font[font_name, options[:font_height]]
|
197
|
+
|
198
|
+
@rect = Chingu::Rect.new(options[:x], options[:y], options[:width] || 0, options[:height] || 0)
|
199
|
+
end
|
200
|
+
|
201
|
+
def font=(font)
|
202
|
+
raise TypeError unless font.is_a? Gosu::Font
|
203
|
+
@font = font
|
204
|
+
recalc
|
205
|
+
font
|
206
|
+
end
|
207
|
+
|
208
|
+
def recalc
|
209
|
+
old_width, old_height = width, height
|
210
|
+
layout
|
211
|
+
parent.recalc if parent and (width != old_width or height != old_height)
|
212
|
+
|
213
|
+
nil
|
214
|
+
end
|
215
|
+
|
216
|
+
# Check if a point (screen coordinates) is over the element.
|
217
|
+
def hit?(x, y)
|
218
|
+
@rect.collide_point?(x, y)
|
219
|
+
end
|
220
|
+
|
221
|
+
# Redraw the element.
|
222
|
+
def draw
|
223
|
+
draw_background
|
224
|
+
draw_border
|
225
|
+
draw_foreground
|
226
|
+
nil
|
227
|
+
end
|
228
|
+
|
229
|
+
# Update the element.
|
230
|
+
def update
|
231
|
+
nil
|
232
|
+
end
|
233
|
+
|
234
|
+
def draw_rect(*args)
|
235
|
+
$window.current_game_state.draw_rect(*args)
|
236
|
+
end
|
237
|
+
|
238
|
+
def draw_frame(*args)
|
239
|
+
$window.current_game_state.draw_frame(*args)
|
240
|
+
end
|
241
|
+
|
242
|
+
protected
|
243
|
+
def parent=(parent); @parent = parent; end
|
244
|
+
|
245
|
+
protected
|
246
|
+
def draw_background
|
247
|
+
draw_rect(x, y, width, height, z, @background_color) unless @background_color.transparent?
|
248
|
+
end
|
249
|
+
|
250
|
+
protected
|
251
|
+
def draw_border
|
252
|
+
draw_frame(x, y, width, height, @border_thickness, z, @border_color) if @border_thickness > 0 and not @border_color.transparent?
|
253
|
+
end
|
254
|
+
|
255
|
+
protected
|
256
|
+
def draw_foreground
|
257
|
+
nil
|
258
|
+
end
|
259
|
+
|
260
|
+
protected
|
261
|
+
# Should be overridden in children to recalculate the width and height of the element and, if a container
|
262
|
+
# manage the positions of its children.
|
263
|
+
def layout
|
264
|
+
nil
|
265
|
+
end
|
266
|
+
|
267
|
+
protected
|
268
|
+
def post_init
|
269
|
+
recalc
|
270
|
+
@parent.send :add, self if @parent
|
271
|
+
end
|
272
|
+
|
273
|
+
public
|
274
|
+
# Evaluate a block, just like it was a constructor block.
|
275
|
+
def with(&block)
|
276
|
+
raise ArgumentError.new("Must pass a block") unless block_given?
|
277
|
+
case block.arity
|
278
|
+
when 1
|
279
|
+
yield self
|
280
|
+
when 0
|
281
|
+
instance_methods_eval(&block)
|
282
|
+
else
|
283
|
+
raise "block arity must be 0 or 1"
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
protected
|
288
|
+
# By default, elements do not accept block arguments.
|
289
|
+
def post_init_block(&block)
|
290
|
+
raise ArgumentError, "does not accept a block"
|
291
|
+
end
|
292
|
+
|
293
|
+
public
|
294
|
+
def to_s
|
295
|
+
"#{self.class} (#{x}, #{y}) #{width}x#{height}"
|
296
|
+
end
|
297
|
+
end
|
298
|
+
end
|