From aa0466ad5b56ab19cb8a1a8e38a51938f1d35d5d Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Tue, 23 Apr 2019 11:21:46 +0300 Subject: [PATCH] (67dca1bf6) Added a search bar to the store menu. Closes #1232 --- .../Source/Screens/CampaignUI.cs | 57 +++++++++++++++---- 1 file changed, 45 insertions(+), 12 deletions(-) diff --git a/Barotrauma/BarotraumaClient/Source/Screens/CampaignUI.cs b/Barotrauma/BarotraumaClient/Source/Screens/CampaignUI.cs index a058432bc..d4b3210ae 100644 --- a/Barotrauma/BarotraumaClient/Source/Screens/CampaignUI.cs +++ b/Barotrauma/BarotraumaClient/Source/Screens/CampaignUI.cs @@ -16,8 +16,11 @@ namespace Barotrauma private GUIListBox characterList; + private MapEntityCategory selectedItemCategory = MapEntityCategory.Equipment; + private GUIListBox myItemList; private GUIListBox storeItemList; + private GUITextBox searchBox; private GUIComponent missionPanel; private GUIComponent selectedLocationInfo; @@ -170,10 +173,27 @@ namespace Barotrauma RelativeSpacing = 0.02f }; - new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.1f), storeContent.RectTransform), "", font: GUI.LargeFont) + var storeContentTop = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.1f), storeContent.RectTransform), isHorizontal: true, childAnchor: Anchor.CenterLeft) + { + Stretch = true + }; + + new GUITextBlock(new RectTransform(new Vector2(0.5f, 1.0f), storeContentTop.RectTransform), "", font: GUI.LargeFont) { TextGetter = GetMoney }; + var filterContainer = new GUILayoutGroup(new RectTransform(new Vector2(0.5f, 0.5f), storeContentTop.RectTransform), isHorizontal: true) + { + Stretch = true, + RelativeSpacing = 0.02f + }; + new GUITextBlock(new RectTransform(new Vector2(0.5f, 1.0f), filterContainer.RectTransform), TextManager.Get("FilterMapEntities"), textAlignment: Alignment.CenterRight, font: GUI.Font); + searchBox = new GUITextBox(new RectTransform(new Vector2(0.8f, 1.0f), filterContainer.RectTransform), font: GUI.Font); + searchBox.OnTextChanged += (textBox, text) => { FilterStoreItems(null, text); return true; }; + var clearButton = new GUIButton(new RectTransform(new Vector2(0.2f, 1.0f), filterContainer.RectTransform), "x") + { + OnClicked = (btn, userdata) => { searchBox.Text = ""; FilterStoreItems(selectedItemCategory, ""); searchBox.Flash(Color.White); return true; } + }; var storeItemLists = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.8f), storeContent.RectTransform), isHorizontal: true) { @@ -196,7 +216,7 @@ namespace Barotrauma "", style: "ItemCategory" + category.ToString()) { UserData = category, - OnClicked = (btn, userdata) => { SelectItemCategory((MapEntityCategory)userdata); return true; } + OnClicked = (btn, userdata) => { FilterStoreItems((MapEntityCategory)userdata, searchBox.Text); return true; } }; itemCategoryButtons.Add(categoryButton); @@ -212,7 +232,8 @@ namespace Barotrauma CanBeFocused = false }; } - SelectItemCategory(MapEntityCategory.Equipment); + FillStoreItemList(); + FilterStoreItems(MapEntityCategory.Equipment, ""); // repair tab ------------------------------------------------------------------------- @@ -450,7 +471,8 @@ namespace Barotrauma else { //refresh store view - SelectItemCategory(MapEntityCategory.Equipment); + FillStoreItemList(); + FilterStoreItems(MapEntityCategory.Equipment, searchBox.Text); } } @@ -774,32 +796,43 @@ namespace Barotrauma } } - private bool SelectItemCategory(MapEntityCategory category) + private void FillStoreItemList() { storeItemList.ClearChildren(); int width = storeItemList.Rect.Width; foreach (MapEntityPrefab mapEntityPrefab in MapEntityPrefab.List) { - if (!(mapEntityPrefab is ItemPrefab itemPrefab) || !itemPrefab.Category.HasFlag(category)) continue; - + if (!(mapEntityPrefab is ItemPrefab itemPrefab)) { continue; } PriceInfo priceInfo = itemPrefab.GetPrice(Campaign.Map.CurrentLocation); if (priceInfo == null) continue; CreateItemFrame(new PurchasedItem(itemPrefab, 0), priceInfo, storeItemList, width); } - storeItemList.Content.RectTransform.SortChildren( (x, y) => (x.GUIComponent.UserData as PurchasedItem).ItemPrefab.Name.CompareTo((y.GUIComponent.UserData as PurchasedItem).ItemPrefab.Name)); + } + private void FilterStoreItems(MapEntityCategory? category, string filter) + { + if (category.HasValue) + { + selectedItemCategory = category.Value; + } + foreach (GUIComponent child in storeItemList.Content.Children) + { + var item = child.UserData as PurchasedItem; + if (item?.ItemPrefab?.Name == null) { continue; } + child.Visible = + (!category.HasValue || item.ItemPrefab.Category.HasFlag(category.Value)) && + (string.IsNullOrEmpty(filter) || item.ItemPrefab.Name.ToLower().Contains(searchBox.Text.ToLower())); + } foreach (GUIButton btn in itemCategoryButtons) { - btn.Selected = (MapEntityCategory)btn.UserData == category; + btn.Selected = (MapEntityCategory)btn.UserData == selectedItemCategory; } - + storeItemList.UpdateScrollBarSize(); storeItemList.BarScroll = 0.0f; - - return true; } public string GetMoney()