Example #1
0
        void SetupManagement()
        {
            var renameButton = panel.Get <ButtonWidget>("MNG_RENSEL_BUTTON");

            renameButton.IsDisabled = () => selectedReplay == null;
            renameButton.OnClick    = () =>
            {
                var r             = selectedReplay;
                var initialName   = Path.GetFileNameWithoutExtension(r.FilePath);
                var directoryName = Path.GetDirectoryName(r.FilePath);
                var invalidChars  = Path.GetInvalidFileNameChars();

                ConfirmationDialogs.TextInputPrompt(
                    "Rename Replay",
                    "Enter a new file name:",
                    initialName,
                    onAccept: newName => RenameReplay(r, newName),
                    onCancel: null,
                    acceptText: "Rename",
                    cancelText: null,
                    inputValidator: newName =>
                {
                    if (newName == initialName)
                    {
                        return(false);
                    }

                    if (string.IsNullOrWhiteSpace(newName))
                    {
                        return(false);
                    }

                    if (newName.IndexOfAny(invalidChars) >= 0)
                    {
                        return(false);
                    }

                    if (File.Exists(Path.Combine(directoryName, newName)))
                    {
                        return(false);
                    }

                    return(true);
                });
            };

            Action <ReplayMetadata, Action> onDeleteReplay = (r, after) =>
            {
                ConfirmationDialogs.ButtonPrompt(
                    title: "Delete selected replay?",
                    text: "Delete replay '{0}'?".F(Path.GetFileNameWithoutExtension(r.FilePath)),
                    onConfirm: () =>
                {
                    DeleteReplay(r);
                    after?.Invoke();
                },
                    confirmText: "Delete",
                    onCancel: () => { });
            };

            var deleteButton = panel.Get <ButtonWidget>("MNG_DELSEL_BUTTON");

            deleteButton.IsDisabled = () => selectedReplay == null;
            deleteButton.OnClick    = () =>
            {
                onDeleteReplay(selectedReplay, () =>
                {
                    if (selectedReplay == null)
                    {
                        SelectFirstVisibleReplay();
                    }
                });
            };

            var deleteAllButton = panel.Get <ButtonWidget>("MNG_DELALL_BUTTON");

            deleteAllButton.IsDisabled = () => replayState.Count(kvp => kvp.Value.Visible) == 0;
            deleteAllButton.OnClick    = () =>
            {
                var list = replayState.Where(kvp => kvp.Value.Visible).Select(kvp => kvp.Key).ToList();
                if (list.Count == 0)
                {
                    return;
                }

                if (list.Count == 1)
                {
                    onDeleteReplay(list[0], () => { if (selectedReplay == null)
                                                    {
                                                        SelectFirstVisibleReplay();
                                                    }
                                   });
                    return;
                }

                ConfirmationDialogs.ButtonPrompt(
                    title: "Delete all selected replays?",
                    text: "Delete {0} replays?".F(list.Count),
                    onConfirm: () =>
                {
                    list.ForEach(DeleteReplay);
                    if (selectedReplay == null)
                    {
                        SelectFirstVisibleReplay();
                    }
                },
                    confirmText: "Delete All",
                    onCancel: () => { });
            };
        }
Example #2
0
        public GameSaveBrowserLogic(Widget widget, ModData modData, Action onExit, Action onStart, bool isSavePanel, World world)
        {
            panel = widget;

            this.modData          = modData;
            this.onStart          = onStart;
            this.onExit           = onExit;
            this.isSavePanel      = isSavePanel;
            Game.BeforeGameStart += OnGameStart;

            panel.Get <ButtonWidget>("CANCEL_BUTTON").OnClick = () =>
            {
                Ui.CloseWindow();
                onExit();
            };

            gameList = panel.Get <ScrollPanelWidget>("GAME_LIST");
            var gameTemplate = panel.Get <ScrollItemWidget>("GAME_TEMPLATE");
            var newTemplate  = panel.Get <ScrollItemWidget>("NEW_TEMPLATE");

            var mod = modData.Manifest;

            baseSavePath = Platform.ResolvePath(Platform.SupportDirPrefix, "Saves", mod.Id, mod.Metadata.Version);

            // Avoid filename conflicts when creating new saves
            if (isSavePanel)
            {
                panel.Get("SAVE_TITLE").IsVisible = () => true;

                defaultSaveFilename = world.Map.Title;
                var filenameAttempt = 0;
                while (true)
                {
                    if (!File.Exists(Path.Combine(baseSavePath, defaultSaveFilename + ".orasav")))
                    {
                        break;
                    }

                    defaultSaveFilename = world.Map.Title + " ({0})".F(++filenameAttempt);
                }

                var saveButton = panel.Get <ButtonWidget>("SAVE_BUTTON");
                saveButton.OnClick   = () => { Save(world); };
                saveButton.IsVisible = () => true;

                var saveWidgets = panel.Get("SAVE_WIDGETS");
                saveTextField           = saveWidgets.Get <TextFieldWidget>("SAVE_TEXTFIELD");
                gameList.Bounds.Height -= saveWidgets.Bounds.Height;
                saveWidgets.IsVisible   = () => true;
            }
            else
            {
                panel.Get("LOAD_TITLE").IsVisible = () => true;
                var loadButton = panel.Get <ButtonWidget>("LOAD_BUTTON");
                loadButton.IsVisible  = () => true;
                loadButton.IsDisabled = () => selectedSave == null;
                loadButton.OnClick    = () => { Load(); };
            }

            if (Directory.Exists(baseSavePath))
            {
                LoadGames(gameTemplate, newTemplate, world);
            }

            var renameButton = panel.Get <ButtonWidget>("RENAME_BUTTON");

            renameButton.IsDisabled = () => selectedSave == null;
            renameButton.OnClick    = () =>
            {
                var initialName  = Path.GetFileNameWithoutExtension(selectedSave);
                var invalidChars = Path.GetInvalidFileNameChars();

                ConfirmationDialogs.TextInputPrompt(
                    "Rename Save",
                    "Enter a new file name:",
                    initialName,
                    onAccept: newName => Rename(initialName, newName),
                    onCancel: null,
                    acceptText: "Rename",
                    cancelText: null,
                    inputValidator: newName =>
                {
                    if (newName == initialName)
                    {
                        return(false);
                    }

                    if (string.IsNullOrWhiteSpace(newName))
                    {
                        return(false);
                    }

                    if (newName.IndexOfAny(invalidChars) >= 0)
                    {
                        return(false);
                    }

                    if (File.Exists(Path.Combine(baseSavePath, newName)))
                    {
                        return(false);
                    }

                    return(true);
                });
            };

            var deleteButton = panel.Get <ButtonWidget>("DELETE_BUTTON");

            deleteButton.IsDisabled = () => selectedSave == null;
            deleteButton.OnClick    = () =>
            {
                ConfirmationDialogs.ButtonPrompt(
                    title: "Delete selected game save?",
                    text: "Delete '{0}'?".F(Path.GetFileNameWithoutExtension(selectedSave)),
                    onConfirm: () =>
                {
                    Delete(selectedSave);

                    if (!games.Any() && !isSavePanel)
                    {
                        Ui.CloseWindow();
                        onExit();
                    }
                    else
                    {
                        SelectFirstVisible();
                    }
                },
                    confirmText: "Delete",
                    onCancel: () => { });
            };

            var deleteAllButton = panel.Get <ButtonWidget>("DELETE_ALL_BUTTON");

            deleteAllButton.IsDisabled = () => !games.Any();
            deleteAllButton.OnClick    = () =>
            {
                ConfirmationDialogs.ButtonPrompt(
                    title: "Delete all game saves?",
                    text: "Delete {0} game saves?".F(games.Count),
                    onConfirm: () =>
                {
                    foreach (var s in games.ToList())
                    {
                        Delete(s);
                    }

                    Ui.CloseWindow();
                    onExit();
                },
                    confirmText: "Delete All",
                    onCancel: () => { });
            };

            SelectFirstVisible();
        }