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: () => { }); }; }
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(); }