Class: CyberarmEngine::GuiState
Instance Attribute Summary
Attributes inherited from GameState
#game_objects, #global_pause, #options
Instance Method Summary
collapse
Methods included from DSL
#background, #button, #check_box, #current_theme, #edit_box, #edit_line, #flow, #image, #list_box, #menu_item, #progress, #slider, #stack, #theme, #toggle_button
Methods included from Common
#alt_down?, #control_down?, #current_state, #darken, #draw_rect, #fill, #find_element_by_tag, #get_asset, #get_image, #get_sample, #get_song, #lighten, #opacity, #pop_state, #previous_state, #push_state, #shift_down?, #shift_state, #show_cursor, #show_cursor=, #window
Methods inherited from GameState
#add_game_object, #close, #destroy, #draw_bounding_box, #drop, #gain_focus, #gamepad_connected, #gamepad_disconnected, #lose_focus, #needs_redraw?, #setup
Constructor Details
#initialize(options = {}) ⇒ GuiState
Returns a new instance of GuiState.
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
# File 'lib/cyberarm_engine/ui/gui_state.rb', line 6
def initialize(options = {})
@options = options
@game_objects = []
@global_pause = false
@down_keys = {}
@root_container = Element::Stack.new(gui_state: self)
@game_objects << @root_container
CyberarmEngine::Element::Container.current_container = @root_container
@active_width = window.width
@active_height = window.height
= nil
@focus = nil
@mouse_over = nil
@mouse_down_on = {}
@mouse_down_position = {}
@last_mouse_pos = nil
@dragging_element = nil
@pending_recalculate_request = false
@pending_element_recalculate_requests = []
@needs_repaint = false
= nil
@min_drag_distance = 0
@mouse_pos = Vector.new
end
|
Instance Method Details
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
|
# File 'lib/cyberarm_engine/ui/gui_state.rb', line 161
def button_down(id)
super
case id
when Gosu::MS_LEFT
redirect_mouse_button(:left)
when Gosu::MS_MIDDLE
redirect_mouse_button(:middle)
when Gosu::MS_RIGHT
redirect_mouse_button(:right)
when Gosu::KB_F5
request_recalculate
end
@focus.button_down(id) if @focus.respond_to?(:button_down)
end
|
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
|
# File 'lib/cyberarm_engine/ui/gui_state.rb', line 178
def button_up(id)
super
case id
when Gosu::MS_LEFT
redirect_released_mouse_button(:left)
when Gosu::MS_MIDDLE
redirect_released_mouse_button(:middle)
when Gosu::MS_RIGHT
redirect_released_mouse_button(:right)
when Gosu::MS_WHEEL_UP
redirect_mouse_wheel(:up)
when Gosu::MS_WHEEL_DOWN
redirect_mouse_wheel(:down)
when Gosu::KB_HOME
redirect_scroll_jump_to(:top)
when Gosu::KB_END
redirect_scroll_jump_to(:end)
when Gosu::KB_PAGE_UP
redirect_scroll_page(:up)
when Gosu::KB_PAGE_DOWN
redirect_scroll_page(:down)
end
@focus.button_up(id) if @focus.respond_to?(:button_up)
= nil
end
|
#draw ⇒ Object
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
# File 'lib/cyberarm_engine/ui/gui_state.rb', line 56
def draw
Stats.frame.start_timing(:gui_element_recalculate_requests)
@pending_element_recalculate_requests.each(&:recalculate)
@pending_element_recalculate_requests.clear
Stats.frame.end_timing(:gui_element_recalculate_requests)
if @pending_recalculate_request
Stats.frame.start_timing(:gui_recalculate)
@root_container.recalculate
@pending_recalculate_request = false
Stats.frame.end_timing(:gui_recalculate)
end
super
if
Gosu.flush
.draw
end
if @tip && @tip.value.length.positive?
Gosu.flush
@tip.draw
end
if CyberarmEngine.const_defined?("GUI_DEBUG")
Gosu.flush
@root_container.debug_draw
end
@needs_repaint = false
end
|
#focus=(element) ⇒ Object
throws :blur event to focused element and sets GuiState focused element Does NOT throw :focus event at element or set element as focused
47
48
49
50
|
# File 'lib/cyberarm_engine/ui/gui_state.rb', line 47
def focus=(element)
@focus.publish(:blur) if @focus && element && @focus != element
@focus = element
end
|
#focused ⇒ Object
52
53
54
|
# File 'lib/cyberarm_engine/ui/gui_state.rb', line 52
def focused
@focus
end
|
303
304
305
306
307
308
309
310
|
# File 'lib/cyberarm_engine/ui/gui_state.rb', line 303
def
return unless
request_repaint
= .parent
= nil
end
|
#inspect ⇒ Object
317
318
319
|
# File 'lib/cyberarm_engine/ui/gui_state.rb', line 317
def inspect
to_s
end
|
41
42
43
|
# File 'lib/cyberarm_engine/ui/gui_state.rb', line 41
def
end
|
#needs_repaint? ⇒ Boolean
97
98
99
|
# File 'lib/cyberarm_engine/ui/gui_state.rb', line 97
def needs_repaint?
@needs_repaint
end
|
#post_setup ⇒ Object
37
38
39
|
# File 'lib/cyberarm_engine/ui/gui_state.rb', line 37
def post_setup
@tip = Element::ToolTip.new("", parent: @root_container, z: Float::INFINITY, theme: current_theme)
end
|
251
252
253
254
255
256
257
258
259
260
261
262
|
# File 'lib/cyberarm_engine/ui/gui_state.rb', line 251
def redirect_holding_mouse_button(button)
if !@dragging_element && @mouse_down_on[button] && @mouse_down_on[button].draggable?(button) && @mouse_pos.distance(@mouse_down_position[button]) > @min_drag_distance
@dragging_element = @mouse_down_on[button]
@dragging_element.publish(:begin_drag, window.mouse_x, window.mouse_y, button)
end
if @dragging_element
@dragging_element.publish(:drag_update, window.mouse_x, window.mouse_y, button) if @dragging_element
elsif @mouse_over
@mouse_over.publish(:"holding_#{button}_mouse_button", window.mouse_x, window.mouse_y)
end
end
|
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
|
# File 'lib/cyberarm_engine/ui/gui_state.rb', line 212
def redirect_mouse_button(button)
unless && ( == @mouse_over) || (@mouse_over&.parent == )
if @focus && @mouse_over != @focus
@focus.publish(:blur)
@focus = nil
end
if @mouse_over && != @mouse_over
@mouse_down_position[button] = Vector.new(window.mouse_x, window.mouse_y)
@mouse_down_on[button] = @mouse_over
@mouse_over.publish(:"#{button}_mouse_button", window.mouse_x, window.mouse_y)
else
@mouse_down_position[button] = nil
@mouse_down_on[button] = nil
end
end
|
#redirect_mouse_wheel(button) ⇒ Object
264
265
266
|
# File 'lib/cyberarm_engine/ui/gui_state.rb', line 264
def redirect_mouse_wheel(button)
@mouse_over.publish(:"mouse_wheel_#{button}", window.mouse_x, window.mouse_y) if (@mouse_over && !) || (@mouse_over && @mouse_over == )
end
|
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
|
# File 'lib/cyberarm_engine/ui/gui_state.rb', line 231
def redirect_released_mouse_button(button)
if && ( == @mouse_over) || (@mouse_over&.parent == )
if @mouse_over && != @mouse_over
@mouse_over.publish(:"released_#{button}_mouse_button", window.mouse_x, window.mouse_y)
if @mouse_over == @mouse_down_on[button]
@mouse_over.publish(:"clicked_#{button}_mouse_button", window.mouse_x,
window.mouse_y)
end
end
if @dragging_element
@dragging_element.publish(:end_drag, window.mouse_x, window.mouse_y, button)
@dragging_element = nil
end
@mouse_down_position[button] = nil
@mouse_down_on[button] = nil
end
|
268
269
270
|
# File 'lib/cyberarm_engine/ui/gui_state.rb', line 268
def redirect_scroll_jump_to(edge)
@mouse_over.publish(:"scroll_jump_to_#{edge}", window.mouse_x, window.mouse_y) if (@mouse_over && !) || (@mouse_over && @mouse_over == )
end
|
#redirect_scroll_page(edge) ⇒ Object
272
273
274
|
# File 'lib/cyberarm_engine/ui/gui_state.rb', line 272
def redirect_scroll_page(edge)
@mouse_over.publish(:"scroll_page_#{edge}", window.mouse_x, window.mouse_y) if (@mouse_over && !) || (@mouse_over && @mouse_over == )
end
|
#request_focus(element) ⇒ Object
288
289
290
291
|
# File 'lib/cyberarm_engine/ui/gui_state.rb', line 288
def request_focus(element)
@pending_focus_request = true
@pending_focus_element = element
end
|
#request_recalculate ⇒ Object
Schedule a full GUI recalculation on next update
277
278
279
|
# File 'lib/cyberarm_engine/ui/gui_state.rb', line 277
def request_recalculate
@pending_recalculate_request = true
end
|
#request_recalculate_for(element) ⇒ Object
281
282
283
284
285
286
|
# File 'lib/cyberarm_engine/ui/gui_state.rb', line 281
def request_recalculate_for(element)
return if @pending_element_recalculate_requests.detect { |e| e == element }
@pending_element_recalculate_requests << element
end
|
#request_repaint ⇒ Object
293
294
295
296
297
|
# File 'lib/cyberarm_engine/ui/gui_state.rb', line 293
def request_repaint
@needs_repaint = true
end
|
299
300
301
|
# File 'lib/cyberarm_engine/ui/gui_state.rb', line 299
def (list_box)
= list_box
end
|
#to_s ⇒ Object
312
313
314
315
|
# File 'lib/cyberarm_engine/ui/gui_state.rb', line 312
def to_s
@root_container.to_s
end
|
208
209
210
|
# File 'lib/cyberarm_engine/ui/gui_state.rb', line 208
def tool_tip_delay
@tip.style.delay || 250
end
|
#update ⇒ Object
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
# File 'lib/cyberarm_engine/ui/gui_state.rb', line 101
def update
if @pending_focus_request
@pending_focus_request = false
self.focus = @pending_focus_element
@pending_focus_element.publish(:focus)
end
&.update
super
if @active_width != window.width || @active_height != window.height
request_recalculate
@root_container.publish(:window_size_changed)
end
@active_width = window.width
@active_height = window.height
return unless window.has_focus?
return unless window.current_state == self
new_mouse_over = .hit_element?(window.mouse_x, window.mouse_y) if
new_mouse_over ||= @root_container.hit_element?(window.mouse_x, window.mouse_y)
if new_mouse_over
new_mouse_over.publish(:enter) if new_mouse_over != @mouse_over
new_mouse_over.publish(:hover)
end
@mouse_over.publish(:leave) if @mouse_over && new_mouse_over != @mouse_over
@mouse_over = new_mouse_over
redirect_holding_mouse_button(:left) if @mouse_over && Gosu.button_down?(Gosu::MS_LEFT)
redirect_holding_mouse_button(:middle) if @mouse_over && Gosu.button_down?(Gosu::MS_MIDDLE)
redirect_holding_mouse_button(:right) if @mouse_over && Gosu.button_down?(Gosu::MS_RIGHT)
if Vector.new(window.mouse_x, window.mouse_y) == @last_mouse_pos
if @mouse_over && (Gosu.milliseconds - @mouse_moved_at) > tool_tip_delay
@tip.value = @mouse_over.tip if @mouse_over
@tip.x = window.mouse_x
@tip.x = 0 if @tip.x < 0
@tip.x = window.width - @tip.width if @tip.x + @tip.width > window.width
@tip.y = window.mouse_y - (@tip.height + 5)
@tip.y = 0 if @tip.y < 0
@tip.y = window.height - @tip.height if @tip.y + @tip.height > window.height
@tip.update
@tip.recalculate
else
@tip.value = ""
end
else
@mouse_moved_at = Gosu.milliseconds
end
@last_mouse_pos = Vector.new(window.mouse_x, window.mouse_y)
@mouse_pos = @last_mouse_pos.clone
end
|