@@ -16,6 +16,7 @@ use fyrox::{
16
16
BuildContext , HorizontalAlignment , Thickness , UiNode , UserInterface , VerticalAlignment ,
17
17
} ,
18
18
plugin:: PluginContext ,
19
+ renderer:: QualitySettings ,
19
20
} ;
20
21
use std:: { ffi:: OsStr , fmt:: Debug , net:: ToSocketAddrs , path:: PathBuf } ;
21
22
@@ -34,6 +35,16 @@ pub fn make_text_widget(
34
35
. build ( ctx)
35
36
}
36
37
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
+
37
48
#[ derive( Default ) ]
38
49
struct ServerMenu {
39
50
self_handle : Handle < UiNode > ,
@@ -203,6 +214,86 @@ impl ServerMenu {
203
214
}
204
215
}
205
216
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
+
206
297
pub struct Menu {
207
298
debug_text : Handle < UiNode > ,
208
299
settings : Handle < UiNode > ,
@@ -213,6 +304,7 @@ pub struct Menu {
213
304
main_menu_root : Handle < UiNode > ,
214
305
background : Handle < UiNode > ,
215
306
server_menu : ServerMenu ,
307
+ settings_menu : SettingsMenu ,
216
308
}
217
309
218
310
fn try_connect_to_server < A > ( server_addr : A ) -> Option < Client >
@@ -243,6 +335,7 @@ impl Menu {
243
335
main_menu_root : ui. find_handle_by_name_from_root ( "MainMenuRoot" ) ,
244
336
background : ui. find_handle_by_name_from_root ( "Background" ) ,
245
337
server_menu : ServerMenu :: new ( server_menu, main_menu, ui, ctx. resource_manager ) ,
338
+ settings_menu : SettingsMenu :: new ( ui, ctx. resource_manager ) ,
246
339
}
247
340
}
248
341
@@ -254,23 +347,26 @@ impl Menu {
254
347
client : & mut Option < Client > ,
255
348
) {
256
349
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
+ ) ;
257
356
258
357
if let Some ( ButtonMessage :: Click ) = message. data ( ) {
259
358
if message. destination ( ) == self . exit {
260
359
if let Some ( window_target) = ctx. window_target {
261
360
window_target. exit ( ) ;
262
361
}
263
362
} 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
+ ) ;
274
370
ctx. user_interface . send_message ( TextMessage :: text (
275
371
self . server_menu . server_address_input ,
276
372
MessageDirection :: ToWidget ,
@@ -289,6 +385,11 @@ impl Menu {
289
385
}
290
386
} else if message. destination ( ) == self . start_as_client {
291
387
* 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
+ ) ;
292
393
}
293
394
}
294
395
}
@@ -303,18 +404,15 @@ impl Menu {
303
404
304
405
pub fn switch_visibility ( & self , ui : & UserInterface , is_client_running : bool ) {
305
406
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
+ ) ;
318
416
}
319
417
320
418
pub fn update ( & self , ctx : & mut PluginContext , server : & Option < Server > ) {
0 commit comments