public static PopupWindow CreateOkCancelPopup(Transform parent, string title, string message, PopupWindowCallback onOk, PopupWindowCallback onCancel) { var okDesc = new ButtonDescriptor(ButtonType.Ok, onOk); var cancelDesc = new ButtonDescriptor(ButtonType.Cancel, onCancel); return(CreatePopupWindow(parent, title, message, okDesc, cancelDesc)); }
public override void PreOpen() { base.PreOpen(); /* * note: this code is in PreOpen() rather than in the ctor because otherwise RimWorld would crash (more precisely, Unity crashes). * I can't remember exactly where, but it deals with Unity calculating the text size of a floating menu. * So better to let this code here rather than in the ctor. */ if (Enumerable.Any(_bottomButtonsDescriptorList, buttonDescriptor => buttonDescriptor.Label == "PLMWBB_LoadSave".Translate())) { return; } var buttonSaveLoadPreset = new ButtonDescriptor("PLMWBB_LoadSave".Translate(), "PLMWBB_LoadOrSaveFilterPresets".Translate()); buttonSaveLoadPreset.AddFloatMenuOption("PLMWLODSAV_Save".Translate(), delegate /* action click */ { if (!(TabController.TabById("LoadSave") is TabLoadSave tab)) { return; } tab.LoadSaveMode = LoadSaveMode.Save; TabController.SetSelectedTabById("LoadSave"); }, delegate /* action mouse over */
private async ValueTask OnButtonClickAsync(ButtonDescriptor button) { if (button.ClickHandler != null) { await button.ClickHandler.Value.InvokeAsync(new ButtonClickEventArgs(button)); } }
public void AddButton(ButtonDescriptor descriptor) { if (ButtonConflicts(descriptor)) { throw new System.ArgumentException("There is a conflict adding this button."); } var button = Instantiate(OpenTibiaUnity.GameManager.DefaultButtonWithLabel, _buttonsPanel.transform); button.onClick.AddListener(() => { OnButtonClick(descriptor); }); var label = button.GetComponentInChildren <TMPro.TextMeshProUGUI>(); label.SetText(descriptor.text); var labelSize = label.GetPreferredValues(); var layoutElement = button.gameObject.AddComponent <LayoutElement>(); layoutElement.minWidth = labelSize.x + 20; _buttons.Add(descriptor); _buttonsPanel.gameObject.SetActive(true); _separatorPanel.gameObject.SetActive(true); }
public TabFilteredTiles(float columnSizePercent) : base(columnSizePercent) { #region MINIMIZED_WINDOW_BUTTONS var buttonListStart = new ButtonDescriptor("<<", delegate { // reset starting display index _tileDisplayIndexStart = 0; }, "PLMWFTIL_GoToStartOfTileList".Translate()); var buttonPreviousPage = new ButtonDescriptor("<", delegate { if (_tileDisplayIndexStart >= MaxDisplayedTileWhenMinimized) { _tileDisplayIndexStart -= MaxDisplayedTileWhenMinimized; } else { Messages.Message("PLMWFTIL_ReachedListStart".Translate(), MessageTypeDefOf.RejectInput); } }, "PLMWFTIL_GoToPreviousListPage".Translate()); var buttonNextPage = new ButtonDescriptor(">", delegate { var matchingTilesCount = PrepareLanding.Instance.TileFilter.AllMatchingTiles.Count; _tileDisplayIndexStart += MaxDisplayedTileWhenMinimized; if (_tileDisplayIndexStart > matchingTilesCount) { Messages.Message($"{"PLMWFTIL_NoMoreTilesAvailable".Translate()} {matchingTilesCount}).", MessageTypeDefOf.RejectInput); _tileDisplayIndexStart -= MaxDisplayedTileWhenMinimized; } }, "PLMWFTIL_GoToNextListPage".Translate()); var buttonListEnd = new ButtonDescriptor(">>", delegate { var matchingTilesCount = PrepareLanding.Instance.TileFilter.AllMatchingTiles.Count; var tileDisplayIndexStart = matchingTilesCount - matchingTilesCount % MaxDisplayedTileWhenMinimized; if (tileDisplayIndexStart == _tileDisplayIndexStart) { Messages.Message($"{"PLMWFTIL_NoMoreTilesAvailable".Translate()} {matchingTilesCount}).", MessageTypeDefOf.RejectInput); } _tileDisplayIndexStart = tileDisplayIndexStart; }, "PLMWFTIL_GoToEndOfList".Translate()); _minimizedWindowButtonsDescriptorList = new List <ButtonDescriptor> { buttonListStart, buttonPreviousPage, buttonNextPage, buttonListEnd }; #endregion MINIMIZED_WINDOW_BUTTONS }
public TabFilteredTiles(float columnSizePercent) : base(columnSizePercent) { #region MINIMIZED_WINDOW_BUTTONS var buttonListStart = new ButtonDescriptor("<<", delegate { // reset starting display index _tileDisplayIndexStart = 0; }, "Go to start of tile list."); var buttonPreviousPage = new ButtonDescriptor("<", delegate { if (_tileDisplayIndexStart >= MaxDisplayedTileWhenMinimized) { _tileDisplayIndexStart -= MaxDisplayedTileWhenMinimized; } else { Messages.Message("Reached start of tile list.", MessageSound.RejectInput); } }, "Go to previous list page."); var buttonNextPage = new ButtonDescriptor(">", delegate { var matchingTilesCount = PrepareLanding.Instance.TileFilter.AllMatchingTiles.Count; _tileDisplayIndexStart += MaxDisplayedTileWhenMinimized; if (_tileDisplayIndexStart > matchingTilesCount) { Messages.Message($"No more tiles available to display (max: {matchingTilesCount}).", MessageSound.RejectInput); _tileDisplayIndexStart -= MaxDisplayedTileWhenMinimized; } }, "Go to next list page."); var buttonListEnd = new ButtonDescriptor(">>", delegate { var matchingTilesCount = PrepareLanding.Instance.TileFilter.AllMatchingTiles.Count; var tileDisplayIndexStart = matchingTilesCount - matchingTilesCount % MaxDisplayedTileWhenMinimized; if (tileDisplayIndexStart == _tileDisplayIndexStart) { Messages.Message($"No more tiles available to display (max: {matchingTilesCount}).", MessageSound.RejectInput); } _tileDisplayIndexStart = tileDisplayIndexStart; }, "Go to end of list."); _minimizedWindowButtonsDescriptorList = new List <ButtonDescriptor> { buttonListStart, buttonPreviousPage, buttonNextPage, buttonListEnd }; #endregion MINIMIZED_WINDOW_BUTTONS }
private bool FindDescriptor(ref ButtonDescriptor descriptor, KeyCode keyCode) { int index = _buttons.FindIndex((x) => x.keyCodes.Contains(keyCode)); if (index == -1) { return(false); } descriptor = _buttons[index]; return(true); }
public bool ButtonConflicts(ButtonDescriptor other) { foreach (var buttonDescriptor in _buttons) { foreach (var keyCode in other.keyCodes) { if (buttonDescriptor.keyCodes.Contains(keyCode)) { return(true); } } } return(false); }
private void OnKeyDown(Event e, bool _) { if (!InputHandler.IsHighlighted(this)) { return; } ButtonDescriptor descriptor = default; if (FindDescriptor(ref descriptor, e.keyCode)) { e.Use(); OnButtonClick(descriptor); } }
public ButtonClickEventArgs(ButtonDescriptor button) { Button = button; }
public TabLoadSave(UserData userData, float columnSizePercent = 0.25f) : base(columnSizePercent) { _userData = userData; LoadSaveMode = LoadSaveMode.Unknown; _stylePresetInfo = new GUIStyle(Text.textFieldStyles[1]) { alignment = TextAnchor.UpperLeft, wordWrap = true, richText = true }; // setup default name if (SteamManager.Initialized) { _presetAuthorSave = SteamUtility.SteamPersonaName; } // TODO check if possible to get logged in user if non steam rimworld #region LIST_BUTTONS var buttonListStart = new ButtonDescriptor("<<", delegate { // reset starting display index _listDisplayStartIndex = 0; }, "Go to start of item list."); var buttonPreviousPage = new ButtonDescriptor("<", delegate { if (_listDisplayStartIndex >= MaxItemsToDisplay) { _listDisplayStartIndex -= MaxItemsToDisplay; } else { Messages.Message("Reached start of item list.", MessageSound.RejectInput); } }, "Go to previous list page."); var buttonNextPage = new ButtonDescriptor(">", delegate { var presetFilesCount = _userData.PresetManager.AllPresetFiles.Count; _listDisplayStartIndex += MaxItemsToDisplay; if (_listDisplayStartIndex > presetFilesCount) { Messages.Message($"No more available items to display (max: {presetFilesCount}).", MessageSound.RejectInput); _listDisplayStartIndex -= MaxItemsToDisplay; } }, "Go to next list page."); var buttonListEnd = new ButtonDescriptor(">>", delegate { var presetFilesCount = _userData.PresetManager.AllPresetFiles.Count; var displayIndexStart = presetFilesCount - presetFilesCount % MaxItemsToDisplay; if (displayIndexStart == _listDisplayStartIndex) { Messages.Message($"No more available items to display (max: {presetFilesCount}).", MessageSound.RejectInput); } _listDisplayStartIndex = displayIndexStart; }, "Go to end of list."); _buttonList = new List <ButtonDescriptor> { buttonListStart, buttonPreviousPage, buttonNextPage, buttonListEnd }; #endregion }
public MainWindow(UserData userData) { _userData = userData; doCloseButton = false; // explicitly disable close button, we'll draw it ourselves doCloseX = true; optionalTitle = "Prepare Landing"; MinimizedWindow.WindowLabel = optionalTitle; MinimizedWindow.AddMinimizedWindowContent += AddMinimizedWindowContent; /* * GUI utilities (tabs) */ _tabGuiUtilities.Clear(); _tabGuiUtilities.Add(new TabTerrain(userData, 0.30f)); _tabGuiUtilities.Add(new TabTemperature(userData, 0.30f)); _tabGuiUtilities.Add(new TabFilteredTiles(0.48f)); _tabGuiUtilities.Add(new TabInfo(userData, 0.48f)); _tabGuiUtilities.Add(new TabOptions(userData, 0.30f)); _tabGuiUtilities.Add(new TabLoadSave(userData, 0.48f)); TabController.Clear(); TabController.AddTabRange(_tabGuiUtilities); /* * Bottom buttons */ #region BOTTOM_BUTTONS var buttonFilterTiles = new ButtonDescriptor("Filter Tiles", delegate { SoundDefOf.TickLow.PlayOneShotOnCamera(); // reset starting display index _tileDisplayIndexStart = 0; // reset selected index _selectedTileIndex = -1; // do the tile filtering PrepareLanding.Instance.TileFilter.Filter(); }); var buttonResetFilters = new ButtonDescriptor("Reset Filters", delegate { SoundDefOf.TickLow.PlayOneShotOnCamera(); userData.ResetAllFields(); }); var buttonMinimize = new ButtonDescriptor("Minimize", delegate { SoundDefOf.TickHigh.PlayOneShotOnCamera(); Minimize(); }); _buttonCloseDescriptor = new ButtonDescriptor("CloseButton".Translate(), delegate { SoundDefOf.TickHigh.PlayOneShotOnCamera(); // reset starting display index _tileDisplayIndexStart = 0; // reset selected index _selectedTileIndex = -1; ForceClose(); }, displayState: DisplayState.Entry | DisplayState.MapInitializing); _bottomButtonsDescriptorList = new List <ButtonDescriptor> { buttonFilterTiles, buttonResetFilters, buttonMinimize, _buttonCloseDescriptor }; #endregion BOTTOM_BUTTONS /* * Minimized window buttons */ #region MINIMIZED_WINDOW_BUTTONS var buttonListStart = new ButtonDescriptor("<<", delegate { // reset starting display index _tileDisplayIndexStart = 0; }, "Go to start of tile list."); var buttonPreviousPage = new ButtonDescriptor("<", delegate { if (_tileDisplayIndexStart >= MaxDisplayedTileWhenMinimized) { _tileDisplayIndexStart -= MaxDisplayedTileWhenMinimized; } else { Messages.Message("Reached start of tile list.", MessageSound.RejectInput); } }, "Go to previous list page."); var buttonNextPage = new ButtonDescriptor(">", delegate { var matchingTilesCount = PrepareLanding.Instance.TileFilter.AllMatchingTiles.Count; _tileDisplayIndexStart += MaxDisplayedTileWhenMinimized; if (_tileDisplayIndexStart > matchingTilesCount) { Messages.Message($"No more tiles available to display (max: {matchingTilesCount}).", MessageSound.RejectInput); _tileDisplayIndexStart -= MaxDisplayedTileWhenMinimized; } }, "Go to next list page."); var buttonListEnd = new ButtonDescriptor(">>", delegate { var matchingTilesCount = PrepareLanding.Instance.TileFilter.AllMatchingTiles.Count; var tileDisplayIndexStart = matchingTilesCount - matchingTilesCount % MaxDisplayedTileWhenMinimized; if (tileDisplayIndexStart == _tileDisplayIndexStart) { Messages.Message($"No more tiles available to display (max: {matchingTilesCount}).", MessageSound.RejectInput); } _tileDisplayIndexStart = tileDisplayIndexStart; }, "Go to end of list."); _minimizedWindowButtonsDescriptorList = new List <ButtonDescriptor> { buttonListStart, buttonPreviousPage, buttonNextPage, buttonListEnd }; #endregion MINIMIZED_WINDOW_BUTTONS }
private void OnButtonClick(ButtonDescriptor descriptor) { Destroy(); descriptor.pressedCallback.Invoke(); }
public MainWindow(GameData.GameData gameData) { doCloseButton = false; // explicitly disable close button, we'll draw it ourselves doCloseX = true; optionalTitle = "Prepare Landing"; // Do not translate MinimizedWindow.WindowLabel = optionalTitle; MinimizedWindow.AddMinimizedWindowContent += AddMinimizedWindowContent; /* * GUI utilities (tabs) */ _tabGuiUtilities.Clear(); _tabGuiUtilities.Add(new TabTerrain(gameData, 0.30f)); _tabGuiUtilities.Add(new TabTemperature(gameData, 0.30f)); _tabGuiUtilities.Add(new TabFilteredTiles(0.48f)); _tabGuiUtilities.Add(new TabInfo(gameData, 0.48f)); _tabGuiUtilities.Add(new TabOptions(gameData, 0.35f)); _tabGuiUtilities.Add(new TabLoadSave(gameData, 0.48f)); #if TAB_OVERLAYS _tabGuiUtilities.Add(new TabOverlays(gameData, 0.50f)); #endif _tabGuiUtilities.Add(new TabGodMode(gameData, 0.30f)); TabController.Clear(); TabController.AddTabRange(_tabGuiUtilities); /* * Bottom buttons */ #region BOTTOM_BUTTONS var buttonFilterTiles = new ButtonDescriptor("PLMWBB_FilterTiles".Translate(), delegate { SoundDefOf.TickLow.PlayOneShotOnCamera(); // reset starting display index _tileDisplayIndexStart = 0; // reset selected index _selectedTileIndex = -1; // do the tile filtering PrepareLanding.Instance.TileFilter.Filter(); }); var buttonResetFilters = new ButtonDescriptor("PLMWBB_ResetFilters".Translate(), delegate { SoundDefOf.TickLow.PlayOneShotOnCamera(); gameData.UserData.ResetAllFields(); }); var buttonMinimize = new ButtonDescriptor("PLMWBB_Minimize".Translate(), delegate { SoundDefOf.TickHigh.PlayOneShotOnCamera(); Minimize(); }); var buttonSelectRandomSite = new ButtonDescriptor("PLMWBB_SelectRandom".Translate(), delegate { SoundDefOf.Click.PlayOneShotOnCamera(); var tileId = PrepareLanding.Instance.TileFilter.RandomFilteredTile(); if (tileId == Tile.Invalid) { return; } Find.WorldInterface.SelectedTile = tileId; Find.WorldCameraDriver.JumpTo(Find.WorldGrid.GetTileCenter(Find.WorldInterface.SelectedTile)); }); _buttonCloseDescriptor = new ButtonDescriptor("CloseButton".Translate(), delegate { SoundDefOf.TickHigh.PlayOneShotOnCamera(); // reset starting display index _tileDisplayIndexStart = 0; // reset selected index _selectedTileIndex = -1; ForceClose(); }, displayState: DisplayState.Entry | DisplayState.MapInitializing); _bottomButtonsDescriptorList = new List <ButtonDescriptor> { buttonFilterTiles, buttonResetFilters, buttonSelectRandomSite, buttonMinimize, _buttonCloseDescriptor }; #endregion BOTTOM_BUTTONS /* * Minimized window buttons */ #region MINIMIZED_WINDOW_BUTTONS //TODO: this is exactly the same code than in TabFilterTiles.cs: find a way to refactor the code. var buttonListStart = new ButtonDescriptor("<<", delegate { // reset starting display index _tileDisplayIndexStart = 0; }, "PLMWFTIL_GoToStartOfTileList".Translate()); var buttonPreviousPage = new ButtonDescriptor("<", delegate { if (_tileDisplayIndexStart >= MaxDisplayedTileWhenMinimized) { _tileDisplayIndexStart -= MaxDisplayedTileWhenMinimized; } else { Messages.Message("PLMWFTIL_ReachedListStart".Translate(), MessageTypeDefOf.RejectInput); } }, "PLMWFTIL_GoToPreviousListPage".Translate()); var buttonNextPage = new ButtonDescriptor(">", delegate { var matchingTilesCount = PrepareLanding.Instance.TileFilter.AllMatchingTiles.Count; _tileDisplayIndexStart += MaxDisplayedTileWhenMinimized; if (_tileDisplayIndexStart > matchingTilesCount) { Messages.Message($"{"PLMWFTIL_NoMoreTilesAvailable".Translate()} {matchingTilesCount}).", MessageTypeDefOf.RejectInput); _tileDisplayIndexStart -= MaxDisplayedTileWhenMinimized; } }, "PLMWFTIL_GoToNextListPage".Translate()); var buttonListEnd = new ButtonDescriptor(">>", delegate { var matchingTilesCount = PrepareLanding.Instance.TileFilter.AllMatchingTiles.Count; var tileDisplayIndexStart = matchingTilesCount - matchingTilesCount % MaxDisplayedTileWhenMinimized; if (tileDisplayIndexStart == _tileDisplayIndexStart) { Messages.Message($"{"PLMWFTIL_NoMoreTilesAvailable".Translate()} {matchingTilesCount}).", MessageTypeDefOf.RejectInput); } _tileDisplayIndexStart = tileDisplayIndexStart; }, "PLMWFTIL_GoToEndOfList".Translate()); _minimizedWindowButtonsDescriptorList = new List <ButtonDescriptor> { buttonListStart, buttonPreviousPage, buttonNextPage, buttonListEnd }; #endregion MINIMIZED_WINDOW_BUTTONS }
public override void PreOpen() { base.PreOpen(); /* * note: this code is in PreOpen() rather than in the ctor because otherwise RimWorld would crash (more precisely, Unity crashes). * I can't remember exactly where, but it deals with Unity calculating the text size of a floating menu. * So better to let this code here rather than in the ctor. */ if (Enumerable.Any(_bottomButtonsDescriptorList, buttonDesctipor => buttonDesctipor.Label == "Load / Save")) { return; } var buttonSaveLoadPreset = new ButtonDescriptor("Load / Save", "Load or Save Filter Presets"); buttonSaveLoadPreset.AddFloatMenuOption("Save", delegate { //_userData.PresetManager.TestSave(); var tab = TabController.TabById("LoadSave") as TabLoadSave; if (tab == null) { return; } tab.LoadSaveMode = LoadSaveMode.Save; TabController.SetSelectedTabById("LoadSave"); }, delegate { var mousePos = Event.current.mousePosition; var rect = new Rect(mousePos.x, mousePos.y, 30f, 30f); TooltipHandler.TipRegion(rect, "Save current filter states to a preset."); } ); buttonSaveLoadPreset.AddFloatMenuOption("Load", delegate { //_userData.PresetManager.TestLoad(); var tab = TabController.TabById("LoadSave") as TabLoadSave; if (tab == null) { return; } tab.LoadSaveMode = LoadSaveMode.Load; TabController.SetSelectedTabById("LoadSave"); }, delegate { var mousePos = Event.current.mousePosition; var rect = new Rect(mousePos.x, mousePos.y, 30f, 30f); TooltipHandler.TipRegion(rect, "Load a preset."); } ); buttonSaveLoadPreset.AddFloatMenu("Select Action"); _bottomButtonsDescriptorList.Add(buttonSaveLoadPreset); // do not display the "close" button while playing (the "World" button on bottom menu bar was clicked) // otherwise there's no way to get the window back... if (Current.ProgramState == ProgramState.Playing) { if (_bottomButtonsDescriptorList.Contains(_buttonCloseDescriptor)) { _bottomButtonsDescriptorList.Remove(_buttonCloseDescriptor); } } else { if (!_bottomButtonsDescriptorList.Contains(_buttonCloseDescriptor)) { _bottomButtonsDescriptorList.Add(_buttonCloseDescriptor); } } }
/// <summary> /// This method creates the ButtonDescriptors for each ResposneType that could end up as a button click. /// This separates the presentation layer from the implementation of the response request in case it chances. /// </summary> internal static List <ButtonDescriptor> CreateButtonDescriptors(List <ResponseTypeEnum> allowResponseTypes) { // initial value List <ButtonDescriptor> buttonDescriptors = null; // If the allowResponseTypes collection exists and has one or more items if (ListHelper.HasOneOrMoreItems(allowResponseTypes)) { // Create the return collection buttonDescriptors = new List <ButtonDescriptor>(); // Iterate the collection of ResponseTypeEnum objects foreach (ResponseTypeEnum allowedResponseType in allowResponseTypes) { switch (allowedResponseType) { case ResponseTypeEnum.PlaceBet: // Create the buttonDescriptor ButtonDescriptor placeBetButtonDescriptor = new ButtonDescriptor("Place Bet", DefaultButtonWidth); // Add this item buttonDescriptors.Add(placeBetButtonDescriptor); // required break; case ResponseTypeEnum.SitOut: // Create the buttonDescriptor ButtonDescriptor sitOutButtonDescriptor = new ButtonDescriptor("Sit Out", DefaultButtonWidth); // Add this item buttonDescriptors.Add(sitOutButtonDescriptor); // required break; case ResponseTypeEnum.Hit: // Create the buttonDescriptor ButtonDescriptor hitButtonDescriptor = new ButtonDescriptor("Hit", DefaultButtonWidth); // Add this item buttonDescriptors.Add(hitButtonDescriptor); // required break; case ResponseTypeEnum.Stand: // Create the buttonDescriptor ButtonDescriptor standButtonDescriptor = new ButtonDescriptor("Stand", DefaultButtonWidth); // Add this item buttonDescriptors.Add(standButtonDescriptor); // required break; case ResponseTypeEnum.Insurance: // Create the buttonDescriptor ButtonDescriptor insuranceButtonDescriptor = new ButtonDescriptor("Insurance?", ExtraWideButtonWidth); // Add this item buttonDescriptors.Add(insuranceButtonDescriptor); // required break; case ResponseTypeEnum.No: // Create the buttonDescriptor ButtonDescriptor noButtonDescriptor = new ButtonDescriptor("No", SlimButtonWidth); // Add this item buttonDescriptors.Add(noButtonDescriptor); // required break; } } } // return value return(buttonDescriptors); }
public TabLoadSave(GameData.GameData gameData, float columnSizePercent = 0.25f) : base(columnSizePercent) { _gameData = gameData; LoadSaveMode = LoadSaveMode.Unknown; _stylePresetInfo = new GUIStyle(Text.textFieldStyles[1]) { alignment = TextAnchor.UpperLeft, wordWrap = true, richText = true }; // setup default name // TODO check if possible to get logged in user if non steam rimworld _presetAuthorSave = SteamManager.Initialized ? SteamUtility.SteamPersonaName : "Your_Name"; #region LIST_BUTTONS var buttonListStart = new ButtonDescriptor("<<", delegate { // reset starting display index _listDisplayStartIndex = 0; }, "PLMWLODSAV_GoToStartOfItemList".Translate()); var buttonPreviousPage = new ButtonDescriptor("<", delegate { if (_listDisplayStartIndex >= MaxItemsToDisplay) { _listDisplayStartIndex -= MaxItemsToDisplay; } else { Messages.Message("PLMWLODSAV_ReachedListStart".Translate(), MessageTypeDefOf.RejectInput); } }, "PLMWLODSAV_GoToPreviousListPage".Translate()); var buttonNextPage = new ButtonDescriptor(">", delegate { var presetFilesCount = _gameData.PresetManager.AllPresetFiles.Count; _listDisplayStartIndex += MaxItemsToDisplay; if (_listDisplayStartIndex > presetFilesCount) { Messages.Message($"{"PLMWLODSAV_NoMoreItemsAvailable".Translate()} {presetFilesCount}).", MessageTypeDefOf.RejectInput); _listDisplayStartIndex -= MaxItemsToDisplay; } }, "PLMWLODSAV_GoToNextListPage".Translate()); var buttonListEnd = new ButtonDescriptor(">>", delegate { var presetFilesCount = _gameData.PresetManager.AllPresetFiles.Count; var displayIndexStart = presetFilesCount - presetFilesCount % MaxItemsToDisplay; if (displayIndexStart == _listDisplayStartIndex) { Messages.Message($"{"PLMWLODSAV_NoMoreItemsAvailable".Translate()} {presetFilesCount}).", MessageTypeDefOf.RejectInput); } _listDisplayStartIndex = displayIndexStart; }, "PLMWLODSAV_GoToEndOfList".Translate()); _buttonList = new List <ButtonDescriptor> { buttonListStart, buttonPreviousPage, buttonNextPage, buttonListEnd }; #endregion }