Skip to content

Commit e17cde0

Browse files
committed
settings menu
1 parent ed2399c commit e17cde0

10 files changed

+393
-294
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
/build
12
/target
23
fyrox.log
34
Cargo.lock

data/maps/drake.rgs

0 Bytes
Binary file not shown.

data/menu.ui

81.7 KB
Binary file not shown.

data/selector.ui

39.2 KB
Binary file not shown.

data/slider.ui

31 KB
Binary file not shown.

executor-wasm/pkg/executor_wasm.d.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ export interface InitOutput {
1212
readonly __wbindgen_malloc: (a: number, b: number) => number;
1313
readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
1414
readonly __wbindgen_export_2: WebAssembly.Table;
15-
readonly wasm_bindgen__convert__closures__invoke1_mut__h17f943987c83f9fe: (a: number, b: number, c: number) => void;
16-
readonly wasm_bindgen__convert__closures__invoke0_mut__h83f2d65801a9f24e: (a: number, b: number) => void;
17-
readonly wasm_bindgen__convert__closures__invoke2_mut__h6fe2620b8975ccf2: (a: number, b: number, c: number, d: number) => void;
18-
readonly wasm_bindgen__convert__closures__invoke0_mut__h4373147e948d7695: (a: number, b: number) => void;
19-
readonly wasm_bindgen__convert__closures__invoke1_mut__h3a471825c851afd6: (a: number, b: number, c: number) => void;
20-
readonly wasm_bindgen__convert__closures__invoke0_mut__h1d74f18cb86c7bfb: (a: number, b: number) => void;
21-
readonly _dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h59203d51c4af0d55: (a: number, b: number, c: number) => void;
15+
readonly wasm_bindgen__convert__closures__invoke1_mut__h101dba3788d44583: (a: number, b: number, c: number) => void;
16+
readonly wasm_bindgen__convert__closures__invoke0_mut__h1c51a97846d81157: (a: number, b: number) => void;
17+
readonly wasm_bindgen__convert__closures__invoke2_mut__ha1996bae5900be0d: (a: number, b: number, c: number, d: number) => void;
18+
readonly wasm_bindgen__convert__closures__invoke0_mut__h004db82e21000bc1: (a: number, b: number) => void;
19+
readonly wasm_bindgen__convert__closures__invoke1_mut__h1b4c66a40f743170: (a: number, b: number, c: number) => void;
20+
readonly wasm_bindgen__convert__closures__invoke0_mut__hd470efaaecda53de: (a: number, b: number) => void;
21+
readonly _dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__he553b55b3d103bf8: (a: number, b: number, c: number) => void;
2222
readonly __wbindgen_free: (a: number, b: number, c: number) => void;
2323
readonly __wbindgen_exn_store: (a: number) => void;
2424
}

executor-wasm/pkg/executor_wasm.js

+258-258
Large diffs are not rendered by default.
729 KB
Binary file not shown.

executor-wasm/pkg/executor_wasm_bg.wasm.d.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ export function main(): void;
55
export function __wbindgen_malloc(a: number, b: number): number;
66
export function __wbindgen_realloc(a: number, b: number, c: number, d: number): number;
77
export const __wbindgen_export_2: WebAssembly.Table;
8-
export function wasm_bindgen__convert__closures__invoke1_mut__h17f943987c83f9fe(a: number, b: number, c: number): void;
9-
export function wasm_bindgen__convert__closures__invoke0_mut__h83f2d65801a9f24e(a: number, b: number): void;
10-
export function wasm_bindgen__convert__closures__invoke2_mut__h6fe2620b8975ccf2(a: number, b: number, c: number, d: number): void;
11-
export function wasm_bindgen__convert__closures__invoke0_mut__h4373147e948d7695(a: number, b: number): void;
12-
export function wasm_bindgen__convert__closures__invoke1_mut__h3a471825c851afd6(a: number, b: number, c: number): void;
13-
export function wasm_bindgen__convert__closures__invoke0_mut__h1d74f18cb86c7bfb(a: number, b: number): void;
14-
export function _dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h59203d51c4af0d55(a: number, b: number, c: number): void;
8+
export function wasm_bindgen__convert__closures__invoke1_mut__h101dba3788d44583(a: number, b: number, c: number): void;
9+
export function wasm_bindgen__convert__closures__invoke0_mut__h1c51a97846d81157(a: number, b: number): void;
10+
export function wasm_bindgen__convert__closures__invoke2_mut__ha1996bae5900be0d(a: number, b: number, c: number, d: number): void;
11+
export function wasm_bindgen__convert__closures__invoke0_mut__h004db82e21000bc1(a: number, b: number): void;
12+
export function wasm_bindgen__convert__closures__invoke1_mut__h1b4c66a40f743170(a: number, b: number, c: number): void;
13+
export function wasm_bindgen__convert__closures__invoke0_mut__hd470efaaecda53de(a: number, b: number): void;
14+
export function _dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__he553b55b3d103bf8(a: number, b: number, c: number): void;
1515
export function __wbindgen_free(a: number, b: number, c: number): void;
1616
export function __wbindgen_exn_store(a: number): void;

game/src/menu.rs

+120-22
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use fyrox::{
1616
BuildContext, HorizontalAlignment, Thickness, UiNode, UserInterface, VerticalAlignment,
1717
},
1818
plugin::PluginContext,
19+
renderer::QualitySettings,
1920
};
2021
use std::{ffi::OsStr, fmt::Debug, net::ToSocketAddrs, path::PathBuf};
2122

@@ -34,6 +35,16 @@ pub fn make_text_widget(
3435
.build(ctx)
3536
}
3637

38+
fn set_visibility(ui: &UserInterface, pairs: &[(Handle<UiNode>, bool)]) {
39+
for (widget, visibility) in pairs {
40+
ui.send_message(WidgetMessage::visibility(
41+
*widget,
42+
MessageDirection::ToWidget,
43+
*visibility,
44+
));
45+
}
46+
}
47+
3748
#[derive(Default)]
3849
struct ServerMenu {
3950
self_handle: Handle<UiNode>,
@@ -203,6 +214,86 @@ impl ServerMenu {
203214
}
204215
}
205216

217+
pub struct SettingsMenu {
218+
menu: Handle<UiNode>,
219+
graphics_quality: Handle<UiNode>,
220+
sound_volume: Handle<UiNode>,
221+
music_volume: Handle<UiNode>,
222+
back: Handle<UiNode>,
223+
reset: Handle<UiNode>,
224+
graphics_presets: Vec<(String, QualitySettings)>,
225+
}
226+
227+
impl SettingsMenu {
228+
pub fn new(ui: &mut UserInterface, resource_manager: &ResourceManager) -> Self {
229+
let graphics_presets = vec![
230+
("Low".to_string(), QualitySettings::low()),
231+
("Medium".to_string(), QualitySettings::medium()),
232+
("High".to_string(), QualitySettings::high()),
233+
("Ultra".to_string(), QualitySettings::ultra()),
234+
];
235+
236+
let items = graphics_presets
237+
.iter()
238+
.map(|(name, _)| {
239+
make_text_widget(
240+
&mut ui.build_ctx(),
241+
name,
242+
resource_manager,
243+
HorizontalAlignment::Center,
244+
)
245+
})
246+
.collect::<Vec<_>>();
247+
248+
let graphics_quality = ui.find_handle_by_name_from_root("SettingsGraphicsQuality");
249+
250+
ui.send_message(SelectorMessage::set_items(
251+
graphics_quality,
252+
MessageDirection::ToWidget,
253+
items,
254+
true,
255+
));
256+
ui.send_message(SelectorMessage::current(
257+
graphics_quality,
258+
MessageDirection::ToWidget,
259+
Some(0),
260+
));
261+
262+
Self {
263+
menu: ui.find_handle_by_name_from_root("SettingsMenu"),
264+
graphics_quality,
265+
sound_volume: ui.find_handle_by_name_from_root("SettingsSoundVolume"),
266+
music_volume: ui.find_handle_by_name_from_root("SettingsMusicVolume"),
267+
back: ui.find_handle_by_name_from_root("SettingsBack"),
268+
reset: ui.find_handle_by_name_from_root("SettingsReset"),
269+
graphics_presets,
270+
}
271+
}
272+
273+
pub fn handle_ui_message(
274+
&self,
275+
message: &UiMessage,
276+
main_menu: Handle<UiNode>,
277+
ui: &UserInterface,
278+
graphics_context: &mut GraphicsContext,
279+
) {
280+
if let Some(SelectorMessage::Current(Some(index))) = message.data() {
281+
if message.destination() == self.graphics_quality {
282+
if let GraphicsContext::Initialized(graphics_context) = graphics_context {
283+
if let Some((_, settings)) = self.graphics_presets.get(*index) {
284+
Log::verify(graphics_context.renderer.set_quality_settings(settings));
285+
}
286+
}
287+
}
288+
} else if let Some(ButtonMessage::Click) = message.data() {
289+
if message.destination() == self.back {
290+
set_visibility(ui, &[(self.menu, false), (main_menu, true)]);
291+
} else if message.destination() == self.reset {
292+
}
293+
}
294+
}
295+
}
296+
206297
pub struct Menu {
207298
debug_text: Handle<UiNode>,
208299
settings: Handle<UiNode>,
@@ -213,6 +304,7 @@ pub struct Menu {
213304
main_menu_root: Handle<UiNode>,
214305
background: Handle<UiNode>,
215306
server_menu: ServerMenu,
307+
settings_menu: SettingsMenu,
216308
}
217309

218310
fn try_connect_to_server<A>(server_addr: A) -> Option<Client>
@@ -243,6 +335,7 @@ impl Menu {
243335
main_menu_root: ui.find_handle_by_name_from_root("MainMenuRoot"),
244336
background: ui.find_handle_by_name_from_root("Background"),
245337
server_menu: ServerMenu::new(server_menu, main_menu, ui, ctx.resource_manager),
338+
settings_menu: SettingsMenu::new(ui, ctx.resource_manager),
246339
}
247340
}
248341

@@ -254,23 +347,26 @@ impl Menu {
254347
client: &mut Option<Client>,
255348
) {
256349
self.server_menu.handle_ui_message(ctx, message, server);
350+
self.settings_menu.handle_ui_message(
351+
message,
352+
self.main_menu,
353+
ctx.user_interface,
354+
ctx.graphics_context,
355+
);
257356

258357
if let Some(ButtonMessage::Click) = message.data() {
259358
if message.destination() == self.exit {
260359
if let Some(window_target) = ctx.window_target {
261360
window_target.exit();
262361
}
263362
} else if message.destination() == self.start_as_server {
264-
for (widget, visibility) in [
265-
(self.server_menu.self_handle, true),
266-
(self.main_menu, false),
267-
] {
268-
ctx.user_interface.send_message(WidgetMessage::visibility(
269-
widget,
270-
MessageDirection::ToWidget,
271-
visibility,
272-
));
273-
}
363+
set_visibility(
364+
ctx.user_interface,
365+
&[
366+
(self.server_menu.self_handle, true),
367+
(self.main_menu, false),
368+
],
369+
);
274370
ctx.user_interface.send_message(TextMessage::text(
275371
self.server_menu.server_address_input,
276372
MessageDirection::ToWidget,
@@ -289,6 +385,11 @@ impl Menu {
289385
}
290386
} else if message.destination() == self.start_as_client {
291387
*client = try_connect_to_server(&self.server_menu.server_address);
388+
} else if message.destination() == self.settings {
389+
set_visibility(
390+
ctx.user_interface,
391+
&[(self.settings_menu.menu, true), (self.main_menu, false)],
392+
);
292393
}
293394
}
294395
}
@@ -303,18 +404,15 @@ impl Menu {
303404

304405
pub fn switch_visibility(&self, ui: &UserInterface, is_client_running: bool) {
305406
let is_visible = ui.node(self.main_menu_root).is_globally_visible();
306-
for (widget, visibility) in [
307-
(self.main_menu_root, !is_visible),
308-
(self.main_menu, !is_visible),
309-
(self.server_menu.self_handle, false),
310-
(self.background, !is_client_running),
311-
] {
312-
ui.send_message(WidgetMessage::visibility(
313-
widget,
314-
MessageDirection::ToWidget,
315-
visibility,
316-
));
317-
}
407+
set_visibility(
408+
ui,
409+
&[
410+
(self.main_menu_root, !is_visible),
411+
(self.main_menu, !is_visible),
412+
(self.server_menu.self_handle, false),
413+
(self.background, !is_client_running),
414+
],
415+
);
318416
}
319417

320418
pub fn update(&self, ctx: &mut PluginContext, server: &Option<Server>) {

0 commit comments

Comments
 (0)