Example #1
0
        /// <summary>
        /// A screen for changing the options
        /// </summary>
        /// <param name="game"></param>
        /// <returns></returns>
        public static UIScreen OptionsScreen(Game game)
        {
            Game1 g1     = (Game1)game;
            var   retVal = new UIScreen(game)
            {
                Purpose = ScreenPurpose.Options
            };

            retVal.Escape += (sender, e) =>
            {
                if (g1.Config.UnappliedChanges)
                {
                    g1.UI.OpenScreen(CloseOptionsConfirmationScreen(game));
                }
                else
                {
                    g1.UI.CloseTopScreen();
                }
            };
            var spLabel = new StackPanel(game)
            {
                HAnchor          = HorizontalAnchor.Middle,
                VAnchor          = VerticalAnchor.Middle,
                SpriteBackground = true,
                Border           = 4
            };

            retVal.Children.Add(spLabel);
            var optionsLabel = new TextPanel(game)
            {
                Text             = "Options",
                Width            = 128,
                SpriteBackground = false
            };

            spLabel.Children.Add(optionsLabel);
            var spMenu = new StackPanel(game)
            {
                HAnchor        = HorizontalAnchor.Middle,
                VAnchor        = VerticalAnchor.Middle,
                MainNavigation = true
            };

            spLabel.Children.Add(spMenu);
            var volume = new StackPanel(game)
            {
                Direction          = LayoutDirection.Horizontal,
                HAnchor            = HorizontalAnchor.Middle,
                ChildrenShareFocus = true,
                SpriteBackground   = true,
                Border             = 4
            };

            spMenu.Children.Add(volume);
            var volLabel = new TextPanel(game)
            {
                Text             = "Volume",
                Width            = 32,
                SpriteBackground = false
            };

            volume.Children.Add(volLabel);
            var volSlide = new Slider(game)
            {
                Value = g1.Config.Config.Volume,
                InputRepeatInterval = 1f / 40f
            };

            volSlide.ValueChanged += (sender, e) =>
            {
                g1.Config.NewConfig.Volume = (int)volSlide.Value;
            };
            volume.Children.Add(volSlide);
            // resolution
            var res = new StackPanel(game)
            {
                Direction          = LayoutDirection.Horizontal,
                HAnchor            = HorizontalAnchor.Middle,
                ChildrenShareFocus = true,
            };

            spMenu.Children.Add(res);
            var resLabel = new TextPanel(game)
            {
                Text             = "Resolution",
                SpriteBackground = false
            };

            res.Children.Add(resLabel);
            var resolutionSelect = new SelectBox(game);
            var dispModes        = GraphicsAdapter.DefaultAdapter.SupportedDisplayModes.ToList();

            for (int i = 0; i < dispModes.Count; i++)
            {
                resolutionSelect.Options.Add(new SelectBoxOption($"{dispModes[i].Width}x{dispModes[i].Height}", dispModes[i]));
                if (((Game1)game).Config.Config.Resolution == dispModes[i])
                {
                    resolutionSelect.Selected = i;
                }
            }
            resolutionSelect.SelectionChanged += (sender, e) =>
            {
                if (resolutionSelect.SelectedOption.Value is DisplayMode newRes)
                {
                    g1.Config.NewConfig.Resolution = newRes;
                }
            };
            res.Children.Add(resolutionSelect);
            // fullscreen mode select
            var fullscreen = new StackPanel(game)
            {
                Direction          = LayoutDirection.Horizontal,
                HAnchor            = HorizontalAnchor.Middle,
                ChildrenShareFocus = true
            };

            spMenu.Children.Add(fullscreen);
            var fullLabel = new TextPanel(game)
            {
                Text             = "Fullscreen",
                SpriteBackground = false
            };

            fullscreen.Children.Add(fullLabel);
            var fullscreenSelect = new SelectBox(game);

            fullscreenSelect.Options.Add(new SelectBoxOption("Full screen", WindowMode.Fullscreen));
            fullscreenSelect.Options.Add(new SelectBoxOption("Window", WindowMode.Windowed));
            fullscreenSelect.Options.Add(new SelectBoxOption("Borderless window", WindowMode.BorderlessWindow));
            fullscreenSelect.SelectionChanged += (sender, e) =>
            {
                if (fullscreenSelect.SelectedOption.Value is WindowMode newWindMode)
                {
                    g1.Config.NewConfig.WindowMode = newWindMode;
                }
            };
            var windMode = g1.Config.Config.WindowMode;

            switch (windMode)
            {
            case WindowMode.Fullscreen:
                fullscreenSelect.Selected = 0;
                break;

            case WindowMode.Windowed:
                fullscreenSelect.Selected = 1;
                break;

            case WindowMode.BorderlessWindow:
                fullscreenSelect.Selected = 2;
                break;

            default:
                break;
            }
            fullscreen.Children.Add(fullscreenSelect);
            //
            var keys = new Button(game)
            {
                Text    = "Mouse & Keyboard",
                HAnchor = HorizontalAnchor.Middle,
                Width   = 128
            };

            keys.OnClick += (sender, e) =>
            {
                g1.UI.OpenScreen(KeybindsScreen(game));
            };
            spMenu.Children.Add(keys);
            var controller = new Button(game)
            {
                Text    = "Controller",
                HAnchor = HorizontalAnchor.Middle,
                Width   = 128
            };

            controller.OnClick += (sender, e) =>
            {
                g1.UI.OpenScreen(ControllerOptionsScreen(game));
            };
            spMenu.Children.Add(controller);
            //
            var okCancelRow = new StackPanel(game)
            {
                HAnchor   = HorizontalAnchor.Middle,
                Direction = LayoutDirection.Horizontal
            };

            spMenu.Children.Add(okCancelRow);
            var apply = new Button(game)
            {
                Text = "Apply"
            };

            apply.OnClick += (snder, e) =>
            {
                //apply
                g1.Config.Save();
                g1.ApplyGraphicsConfig();
                //g1.Input.SaveKeybinds(g1.Config.KeysPath);
            };
            okCancelRow.Children.Add(apply);
            var cancel = new Button(game)
            {
                Text = "Back"
            };

            okCancelRow.Children.Add(cancel);
            cancel.OnClick += (snder, e) =>
            {
                retVal.InvokeEscape();
            };
            retVal.UpdateLayout(retVal.Bounds);
            return(retVal);
        }
        /// <summary>
        /// A screen that asks if you want to save your changed options before closing
        /// </summary>
        /// <param name="game"></param>
        /// <returns></returns>
        public static UIScreen CloseOptionsConfirmationScreen(Game game)
        {
            Game1 g1     = (Game1)game;
            var   retVal = new UIScreen(game)
            {
                EscapeCloses = true
            };
            var sp = new StackPanel(game)
            {
                HAnchor          = HorizontalAnchor.Middle,
                VAnchor          = VerticalAnchor.Middle,
                SpriteBackground = true,
                Border           = 4
            };

            retVal.Children.Add(sp);
            var label1 = new TextPanel(game)
            {
                Text             = "Settings changed",
                SpriteBackground = false
            };

            sp.Children.Add(label1);
            var label2 = new TextPanel(game)
            {
                Text             = "Save changes?",
                SpriteBackground = false
            };

            sp.Children.Add(label2);
            var buttonRow = new StackPanel(game)
            {
                Direction      = LayoutDirection.Horizontal,
                MainNavigation = true
            };

            sp.Children.Add(buttonRow);
            var saveButton = new Button(game)
            {
                Text  = "Save",
                Width = 48
            };

            saveButton.OnClick += (snder, e) =>
            {
                g1.Config.Save();
                g1.ApplyGraphicsConfig();
                g1.UI.CloseTopScreen();
                g1.UI.CloseTopScreen();
            };
            buttonRow.Children.Add(saveButton);
            var discardButton = new Button(game)
            {
                Text  = "Discard",
                Width = 48
            };

            discardButton.OnClick += (snder, e) =>
            {
                g1.UI.CloseTopScreen();
                g1.UI.CloseTopScreen();
            };
            buttonRow.Children.Add(discardButton);
            var cancelButton = new Button(game)
            {
                Text  = "Cancel",
                Width = 48
            };

            cancelButton.OnClick += (snder, e) =>
            {
                g1.UI.CloseTopScreen();
            };
            buttonRow.Children.Add(cancelButton);

            retVal.UpdateLayout(retVal.Bounds);
            return(retVal);
        }