From 733461ecde268a338aebaf5264262cbdddc99a30 Mon Sep 17 00:00:00 2001 From: JoshuaNavarro Date: Tue, 3 Sep 2019 15:48:38 -0700 Subject: [PATCH] Added in a search box which hides elements that don't match the search pattern for recipes. --- .../Framework/Menus/CraftingMenuV1.cs | 194 ++++++++++++++++-- 1 file changed, 174 insertions(+), 20 deletions(-) diff --git a/GeneralMods/Revitalize/Framework/Menus/CraftingMenuV1.cs b/GeneralMods/Revitalize/Framework/Menus/CraftingMenuV1.cs index 5b466029..996e3b1c 100644 --- a/GeneralMods/Revitalize/Framework/Menus/CraftingMenuV1.cs +++ b/GeneralMods/Revitalize/Framework/Menus/CraftingMenuV1.cs @@ -5,35 +5,61 @@ using System.Text; using System.Threading.Tasks; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework.Input; using Revitalize.Framework.Menus.MenuComponents; using StardewValley; +using StardewValley.Menus; using StardustCore.UIUtilities; using StardustCore.UIUtilities.MenuComponents.ComponentsV2.Buttons; namespace Revitalize.Framework.Menus { + /// + /// A simple menu for displaying craftable objects. + /// public class CraftingMenuV1 : IClickableMenuExtended { /// /// All the different pages for crafting. - /// - /// Sort recipes by recipe name. - /// Add in search box /// public Dictionary CraftingTabs; + /// + /// All of the actual buttons to display for crafting. + /// public Dictionary> craftingItemsToDisplay; + /// + /// The inventory to tke items from. + /// public IList fromInventory; + /// + /// The inventory to put items into. + /// public IList toInventory; + /// + /// The current page index for the current tab. + /// public int currentPageIndex; + /// + /// The name of the current tab. + /// public string currentTab; + /// + /// The background color for the menu. + /// public Color backgroundColor; + /// + /// The x offset for the menu so that tabs can be interacted with properly. + /// public int xOffset = 72; + /// + /// Teh hover text to display. + /// public string hoverText; /// @@ -41,20 +67,47 @@ namespace Revitalize.Framework.Menus /// public int amountOfRecipesToShow = 9; + /// + /// Is this menu the player's? + /// public bool playerInventory; + /// + /// The crafting info menu that displays when a recipe is clicked. + /// public CraftingInformationPage craftingInfo; + /// + /// The previous page button. + /// public AnimatedButton leftButton; + /// + /// The next page button. + /// public AnimatedButton rightButton; + /// + /// The search box used for looking for specific items. + /// + public StardewValley.Menus.TextBox searchBox; - + /// + /// The maximum amount of pages to display. + /// private int maxPages { get { if (string.IsNullOrEmpty(this.currentTab)) return 0; - return (int)(Math.Ceiling((double)(this.craftingItemsToDisplay[this.currentTab].Count / this.amountOfRecipesToShow))); + List searchSelection; + if (string.IsNullOrEmpty(this.searchBox.Text) == false) + { + searchSelection = this.craftingItemsToDisplay[this.currentTab].FindAll(i => i.displayItem.item.DisplayName.ToLowerInvariant().Contains(this.searchBox.Text.ToLowerInvariant())); + } + else + { + searchSelection = this.craftingItemsToDisplay[this.currentTab]; + } + return (int)(Math.Ceiling((double)(searchSelection.Count / this.amountOfRecipesToShow))); } } @@ -125,6 +178,11 @@ namespace Revitalize.Framework.Menus this.initializeButtons(); } + /// + /// Fix the display of menu elements when the menu is resized. + /// + /// + /// public override void gameWindowSizeChanged(Rectangle oldBounds, Rectangle newBounds) { base.gameWindowSizeChanged(oldBounds, newBounds); @@ -135,29 +193,61 @@ namespace Revitalize.Framework.Menus } } + /// + /// Initialize the buttons for the menu. + /// private void initializeButtons() { this.leftButton = new AnimatedButton(new StardustCore.Animations.AnimatedSprite("Left Button", new Vector2(this.xPositionOnScreen, this.yPositionOnScreen), new StardustCore.Animations.AnimationManager(TextureManager.GetExtendedTexture(ModCore.Manifest, "InventoryMenu", "PreviousPageButton"), new StardustCore.Animations.Animation(0, 0, 32, 32)), Color.White), new Rectangle(0, 0, 32, 32), 2f); this.rightButton = new AnimatedButton(new StardustCore.Animations.AnimatedSprite("Right Button", new Vector2(this.xPositionOnScreen + this.width, this.yPositionOnScreen), new StardustCore.Animations.AnimationManager(TextureManager.GetExtendedTexture(ModCore.Manifest, "InventoryMenu", "NextPageButton"), new StardustCore.Animations.Animation(0, 0, 32, 32)), Color.White), new Rectangle(0, 0, 32, 32), 2f); - } + this.searchBox = new TextBox((Texture2D)null, (Texture2D)null, Game1.dialogueFont, Game1.textColor); + this.searchBox.X = this.xPositionOnScreen + this.width + 96; + this.searchBox.Y = this.yPositionOnScreen; + this.searchBox.Width = 256; + this.searchBox.Height = 192; + Game1.keyboardDispatcher.Subscriber = (IKeyboardSubscriber)this.searchBox; + this.searchBox.Selected = false; + } + /// + /// What happens when the menu receives a key press. + /// + /// + public override void receiveKeyPress(Keys key) + { + if (this.searchBox.Selected && key != Keys.Escape) + { + return; + } + else + { + base.receiveKeyPress(key); + } + } + /// + /// Sorts all of the recipes for the menu. + /// public void sortRecipes() { - foreach(KeyValuePair> pair in this.craftingItemsToDisplay) + foreach (KeyValuePair> pair in this.craftingItemsToDisplay) { List copy = pair.Value.ToList(); pair.Value.Clear(); - copy=copy.OrderBy(x => x.displayItem.item.DisplayName).ToList(); - foreach(CraftingRecipeButton b in copy) + copy = copy.OrderBy(x => x.displayItem.item.DisplayName).ToList(); + foreach (CraftingRecipeButton b in copy) { this.addInCraftingRecipe(b, pair.Key); } } - - - } + + } + /// + /// Adds in a new tab for the crafting recipe menu. + /// + /// + /// public void addInCraftingPageTab(string name, AnimatedButton Button) { int count = this.CraftingTabs.Count; @@ -176,6 +266,11 @@ namespace Revitalize.Framework.Menus } + /// + /// Adds in a crafting recipe to the crafting menu. + /// + /// + /// public void addInCraftingRecipe(CraftingRecipeButton Button, string WhichTab) { if (this.craftingItemsToDisplay.ContainsKey(WhichTab)) @@ -191,6 +286,11 @@ namespace Revitalize.Framework.Menus } } + /// + /// What happens when you hover over a menu element. + /// + /// + /// public override void performHoverAction(int x, int y) { bool hovered = false; @@ -223,6 +323,12 @@ namespace Revitalize.Framework.Menus } } + /// + /// What happens when the meu receives a left click. + /// + /// + /// + /// public override void receiveLeftClick(int x, int y, bool playSound = true) { if (this.leftButton.containsPoint(x, y)) @@ -243,6 +349,17 @@ namespace Revitalize.Framework.Menus } } + Rectangle r = new Rectangle(this.searchBox.X, this.searchBox.Y, this.searchBox.Width, this.searchBox.Height / 2); + if (r.Contains(x, y)) + { + this.searchBox.Update(); + this.searchBox.SelectMe(); + } + else + { + this.searchBox.Selected = false; + } + foreach (KeyValuePair pair in this.CraftingTabs) { if (pair.Value.containsPoint(x, y)) @@ -290,16 +407,24 @@ namespace Revitalize.Framework.Menus } + /// + /// Draws the menu to the screen. + /// + /// public override void draw(SpriteBatch b) { this.drawDialogueBoxBackground(this.xPositionOnScreen + this.xOffset, this.yPositionOnScreen, this.width, this.height, this.backgroundColor); + if (this.currentPageIndex > this.maxPages) this.currentPageIndex = 0; + this.leftButton.draw(b); //Draw page numbers here. //b.DrawString(Game1.smallFont,"Page: "+this.currentPageIndex.ToString()/) - b.DrawString(Game1.dialogueFont, ("Page: " + (this.currentPageIndex + 1) + " / " + (this.maxPages+1)).ToString(), new Vector2(this.xPositionOnScreen + 128, this.yPositionOnScreen), Color.White); + b.DrawString(Game1.dialogueFont, ("Page: " + (this.currentPageIndex + 1) + " / " + (this.maxPages + 1)).ToString(), new Vector2(this.xPositionOnScreen + 128, this.yPositionOnScreen), Color.White); this.rightButton.draw(b); + this.searchBox.Draw(b, true); + //this.drawDialogueBoxBackground(); foreach (KeyValuePair pair in this.CraftingTabs) { @@ -345,18 +470,47 @@ namespace Revitalize.Framework.Menus this.drawMouse(b); } - public override void update(GameTime time) + /// + /// Gets all of the crafting buttons to display. + /// + /// + private List getRecipeButtonsToDisplay() { - base.update(time); + List searchSelection; + if (string.IsNullOrEmpty(this.searchBox.Text) == false) + { + searchSelection = this.craftingItemsToDisplay[this.currentTab].FindAll(i => i.displayItem.item.DisplayName.ToLowerInvariant().Contains(this.searchBox.Text.ToLowerInvariant())); + } + else + { + searchSelection = this.craftingItemsToDisplay[this.currentTab]; + } + searchSelection = this.searchSort(searchSelection); + + int amount = searchSelection.Count / this.amountOfRecipesToShow; + int min = this.currentPageIndex == amount ? searchSelection.Count % this.amountOfRecipesToShow : this.amountOfRecipesToShow; + List buttonsToDraw = searchSelection.GetRange(this.currentPageIndex * this.amountOfRecipesToShow, min); + return buttonsToDraw; } - public List getRecipeButtonsToDisplay() + /// + /// Repositions crafting buttons based on the current sort context. + /// + /// + /// + private List searchSort(List Unsorted) { + List copy = Unsorted.ToList(); + //copy = copy.OrderBy(x => x.displayItem.item.DisplayName).ToList(); //Sort the recipes again. Probably unnecessary. - int amount = this.craftingItemsToDisplay[this.currentTab].Count / this.amountOfRecipesToShow; - int min = this.currentPageIndex == amount ? this.craftingItemsToDisplay[this.currentTab].Count % this.amountOfRecipesToShow : this.amountOfRecipesToShow; - List buttonsToDraw = this.craftingItemsToDisplay[this.currentTab].GetRange(this.currentPageIndex * this.amountOfRecipesToShow, min); - return buttonsToDraw; + //Do sorting; + + for (int i = 0; i < Unsorted.Count; i++) + { + int count = i % this.amountOfRecipesToShow; + copy[i].displayItem.Position = new Vector2(this.xPositionOnScreen + (128), (this.yPositionOnScreen + 64) + (64 * (count + 1))); + } + return copy; } }