From e9a4b580af53d8f107035e7e7b5698335e8a1023 Mon Sep 17 00:00:00 2001 From: JavidPack Date: Sat, 15 Nov 2025 23:48:37 -0700 Subject: [PATCH 1/2] Adds panel with text showing how each filter is affecting recipes shown --- Localization/de-DE.hjson | 5 +++ Localization/en-US.hjson | 5 +++ Localization/es-ES.hjson | 5 +++ Localization/fr-FR.hjson | 5 +++ Localization/it-IT.hjson | 5 +++ Localization/pl-PL.hjson | 5 +++ Localization/pt-BR.hjson | 5 +++ Localization/ru-RU.hjson | 5 +++ Localization/zh-Hans.hjson | 5 +++ RecipeCatalogueUI.cs | 72 ++++++++++++++++++++++++++++++++++---- 10 files changed, 110 insertions(+), 7 deletions(-) diff --git a/Localization/de-DE.hjson b/Localization/de-DE.hjson index dbb99ef..0a5dca3 100644 --- a/Localization/de-DE.hjson +++ b/Localization/de-DE.hjson @@ -52,6 +52,11 @@ Mods: { // HistoryEmpty: There is no query history yet // HistoryReachedStart: Query history start reached // HistoryReachedEnd: Query history end reached + // RecipesFilteredByMod: "{0} {^0:recipe;recipes} filtered by mod filter." + // RecipesFilteredBySearch: "{0} {^0:recipe;recipes} filtered by search filter." + // RecipesFilteredByTooltip: "{0} {^0:recipe;recipes} filtered by tooltip filter." + // RecipesFilteredByCategory: "{0} {^0:recipe;recipes} filtered by category filter." + // RecipesFilteredByOtherFilters: "{0} {^0:recipe;recipes} filtered by other filters." } RecipeCatalogueFilters: { diff --git a/Localization/en-US.hjson b/Localization/en-US.hjson index 7191cd6..bdac26c 100644 --- a/Localization/en-US.hjson +++ b/Localization/en-US.hjson @@ -52,6 +52,11 @@ Mods: { HistoryEmpty: There is no query history yet HistoryReachedStart: Query history start reached HistoryReachedEnd: Query history end reached + RecipesFilteredByMod: "{0} {^0:recipe;recipes} filtered by mod filter." + RecipesFilteredBySearch: "{0} {^0:recipe;recipes} filtered by search filter." + RecipesFilteredByTooltip: "{0} {^0:recipe;recipes} filtered by tooltip filter." + RecipesFilteredByCategory: "{0} {^0:recipe;recipes} filtered by category filter." + RecipesFilteredByOtherFilters: "{0} {^0:recipe;recipes} filtered by other filters." } RecipeCatalogueFilters: { diff --git a/Localization/es-ES.hjson b/Localization/es-ES.hjson index 3ab9811..5832fa6 100644 --- a/Localization/es-ES.hjson +++ b/Localization/es-ES.hjson @@ -52,6 +52,11 @@ Mods: { // HistoryEmpty: There is no query history yet // HistoryReachedStart: Query history start reached // HistoryReachedEnd: Query history end reached + // RecipesFilteredByMod: "{0} {^0:recipe;recipes} filtered by mod filter." + // RecipesFilteredBySearch: "{0} {^0:recipe;recipes} filtered by search filter." + // RecipesFilteredByTooltip: "{0} {^0:recipe;recipes} filtered by tooltip filter." + // RecipesFilteredByCategory: "{0} {^0:recipe;recipes} filtered by category filter." + // RecipesFilteredByOtherFilters: "{0} {^0:recipe;recipes} filtered by other filters." } RecipeCatalogueFilters: { diff --git a/Localization/fr-FR.hjson b/Localization/fr-FR.hjson index a5b07d4..b6ae41d 100644 --- a/Localization/fr-FR.hjson +++ b/Localization/fr-FR.hjson @@ -52,6 +52,11 @@ Mods: { // HistoryEmpty: There is no query history yet // HistoryReachedStart: Query history start reached // HistoryReachedEnd: Query history end reached + // RecipesFilteredByMod: "{0} {^0:recipe;recipes} filtered by mod filter." + // RecipesFilteredBySearch: "{0} {^0:recipe;recipes} filtered by search filter." + // RecipesFilteredByTooltip: "{0} {^0:recipe;recipes} filtered by tooltip filter." + // RecipesFilteredByCategory: "{0} {^0:recipe;recipes} filtered by category filter." + // RecipesFilteredByOtherFilters: "{0} {^0:recipe;recipes} filtered by other filters." } RecipeCatalogueFilters: { diff --git a/Localization/it-IT.hjson b/Localization/it-IT.hjson index fcf4332..486233b 100644 --- a/Localization/it-IT.hjson +++ b/Localization/it-IT.hjson @@ -52,6 +52,11 @@ Mods: { // HistoryEmpty: There is no query history yet // HistoryReachedStart: Query history start reached // HistoryReachedEnd: Query history end reached + // RecipesFilteredByMod: "{0} {^0:recipe;recipes} filtered by mod filter." + // RecipesFilteredBySearch: "{0} {^0:recipe;recipes} filtered by search filter." + // RecipesFilteredByTooltip: "{0} {^0:recipe;recipes} filtered by tooltip filter." + // RecipesFilteredByCategory: "{0} {^0:recipe;recipes} filtered by category filter." + // RecipesFilteredByOtherFilters: "{0} {^0:recipe;recipes} filtered by other filters." } RecipeCatalogueFilters: { diff --git a/Localization/pl-PL.hjson b/Localization/pl-PL.hjson index 0409c84..837894d 100644 --- a/Localization/pl-PL.hjson +++ b/Localization/pl-PL.hjson @@ -52,6 +52,11 @@ Mods: { // HistoryEmpty: There is no query history yet // HistoryReachedStart: Query history start reached // HistoryReachedEnd: Query history end reached + // RecipesFilteredByMod: "{0} {^0:recipe;recipes} filtered by mod filter." + // RecipesFilteredBySearch: "{0} {^0:recipe;recipes} filtered by search filter." + // RecipesFilteredByTooltip: "{0} {^0:recipe;recipes} filtered by tooltip filter." + // RecipesFilteredByCategory: "{0} {^0:recipe;recipes} filtered by category filter." + // RecipesFilteredByOtherFilters: "{0} {^0:recipe;recipes} filtered by other filters." } RecipeCatalogueFilters: { diff --git a/Localization/pt-BR.hjson b/Localization/pt-BR.hjson index 3182071..8034be4 100644 --- a/Localization/pt-BR.hjson +++ b/Localization/pt-BR.hjson @@ -52,6 +52,11 @@ Mods: { // HistoryEmpty: There is no query history yet // HistoryReachedStart: Query history start reached // HistoryReachedEnd: Query history end reached + // RecipesFilteredByMod: "{0} {^0:recipe;recipes} filtered by mod filter." + // RecipesFilteredBySearch: "{0} {^0:recipe;recipes} filtered by search filter." + // RecipesFilteredByTooltip: "{0} {^0:recipe;recipes} filtered by tooltip filter." + // RecipesFilteredByCategory: "{0} {^0:recipe;recipes} filtered by category filter." + // RecipesFilteredByOtherFilters: "{0} {^0:recipe;recipes} filtered by other filters." } RecipeCatalogueFilters: { diff --git a/Localization/ru-RU.hjson b/Localization/ru-RU.hjson index 710043d..bd505f0 100644 --- a/Localization/ru-RU.hjson +++ b/Localization/ru-RU.hjson @@ -52,6 +52,11 @@ Mods: { // HistoryEmpty: There is no query history yet // HistoryReachedStart: Query history start reached // HistoryReachedEnd: Query history end reached + // RecipesFilteredByMod: "{0} {^0:recipe;recipes} filtered by mod filter." + // RecipesFilteredBySearch: "{0} {^0:recipe;recipes} filtered by search filter." + // RecipesFilteredByTooltip: "{0} {^0:recipe;recipes} filtered by tooltip filter." + // RecipesFilteredByCategory: "{0} {^0:recipe;recipes} filtered by category filter." + // RecipesFilteredByOtherFilters: "{0} {^0:recipe;recipes} filtered by other filters." } RecipeCatalogueFilters: { diff --git a/Localization/zh-Hans.hjson b/Localization/zh-Hans.hjson index 52d4e01..122d251 100644 --- a/Localization/zh-Hans.hjson +++ b/Localization/zh-Hans.hjson @@ -52,6 +52,11 @@ Mods: { HistoryEmpty: 尚无查询历史 HistoryReachedStart: 抵达查询历史起点 HistoryReachedEnd: 抵达查询历史终点 + // RecipesFilteredByMod: "{0} {^0:recipe;recipes} filtered by mod filter." + // RecipesFilteredBySearch: "{0} {^0:recipe;recipes} filtered by search filter." + // RecipesFilteredByTooltip: "{0} {^0:recipe;recipes} filtered by tooltip filter." + // RecipesFilteredByCategory: "{0} {^0:recipe;recipes} filtered by category filter." + // RecipesFilteredByOtherFilters: "{0} {^0:recipe;recipes} filtered by other filters." } RecipeCatalogueFilters: { diff --git a/RecipeCatalogueUI.cs b/RecipeCatalogueUI.cs index 3acac60..ad90de9 100644 --- a/RecipeCatalogueUI.cs +++ b/RecipeCatalogueUI.cs @@ -498,10 +498,11 @@ private void UpdateGrid() { recipeGrid.Clear(); //int craftPathsCalculatedCount = 0; + var filterResults = new RecipeFilterResults(); for (int i = 0; i < Recipe.numRecipes; i++) { //if (recipeSlots[i].craftPathsCalculated) // craftPathsCalculatedCount++; - if (PassRecipeFilters(recipeSlots[i], Main.recipe[i], groups)) + if (PassRecipeFilters(recipeSlots[i], Main.recipe[i], groups, filterResults)) // all the filters //if (Main.projName[i].ToLower().IndexOf(searchFilter.Text, StringComparison.OrdinalIgnoreCase) != -1) { @@ -519,6 +520,38 @@ private void UpdateGrid() { recipeGrid._innerList.Append(box); } } + if (true && filterResults.AnyFiltered) { + var panel = new UIPanel(); + panel.Width.Set(0, 1f); + recipeGrid.Add(panel); + var filterMessages = new List(); + if (filterResults.filteredByMod > 0) { + filterMessages.Add(Language.GetTextValue("Mods.RecipeBrowser.RecipeCatalogueUI.RecipesFilteredByMod", filterResults.filteredByMod)); + + if (RecipeBrowserUI.modIndex != 0) + filterMessages.Add($"Showing only recipes resulting in items from \"{Terraria.ModLoader.ModLoader.GetMod(RecipeBrowserUI.instance.mods[RecipeBrowserUI.modIndex]).DisplayName}\""); + } + if (filterResults.filteredByCategory > 0) + filterMessages.Add(Language.GetTextValue("Mods.RecipeBrowser.RecipeCatalogueUI.RecipesFilteredByCategory", filterResults.filteredByCategory)); + if (filterResults.filteredByOtherFilters > 0) + filterMessages.Add(Language.GetTextValue("Mods.RecipeBrowser.RecipeCatalogueUI.RecipesFilteredByOtherFilters", filterResults.filteredByOtherFilters)); + if (filterResults.filteredBySearch > 0) + filterMessages.Add(Language.GetTextValue("Mods.RecipeBrowser.RecipeCatalogueUI.RecipesFilteredBySearch", filterResults.filteredBySearch)); + if (filterResults.filteredByTooltip > 0) + filterMessages.Add(Language.GetTextValue("Mods.RecipeBrowser.RecipeCatalogueUI.RecipesFilteredByTooltip", filterResults.filteredByTooltip)); + + // TODO: Same for Item listing as well + + string filterMessage = string.Join("\n", filterMessages); + var text = new UIText(filterMessage); + text.Width.Set(0, 1f); + text.IsWrapped = true; + text.WrappedTextBottomPadding = 0; + text.TextOriginX = 0f; + text.Recalculate(); + panel.Append(text); + panel.Height.Set(text.MinHeight.Pixels + panel.PaddingTop, 0f); + } //Main.NewText($"craftPathsCalculated: {craftPathsCalculatedCount}/{Recipe.numRecipes}"); recipeGrid.UpdateOrder(); @@ -526,10 +559,15 @@ private void UpdateGrid() { } private int ItemGridSort(UIElement x, UIElement y) { - if (x is UIPanel) - return -1; + // Place filter counts notification panel at end. + // TODO: Make similar panel for ItemCatalogueUI and make sure ArmorSetFeatureHelper panel is at top. + if (x is UIPanel) + if (y is UIPanel) + return x.UniqueId.CompareTo(y.UniqueId); + else + return 1; if (y is UIPanel) - return 1; + return -1; UIRecipeSlot a = x as UIRecipeSlot; UIRecipeSlot b = y as UIRecipeSlot; if (a.CompareToIgnoreIndex(b) == 0 && SharedUI.instance.SelectedSort != null) { @@ -540,13 +578,15 @@ private int ItemGridSort(UIElement x, UIElement y) { return a.CompareTo(b); } - private bool PassRecipeFilters(UIRecipeSlot recipeSlot, Recipe recipe, List groups) { + private bool PassRecipeFilters(UIRecipeSlot recipeSlot, Recipe recipe, List groups, RecipeFilterResults filterResults) { // TODO: Option to filter by source of Recipe rather than by createItem maybe? if (RecipeBrowserUI.modIndex != 0) { if (recipe.createItem.ModItem == null) { + filterResults.filteredByMod++; return false; } if (recipe.createItem.ModItem.Mod.Name != RecipeBrowserUI.instance.mods[RecipeBrowserUI.modIndex]) { + filterResults.filteredByMod++; return false; } } @@ -629,10 +669,13 @@ private bool PassRecipeFilters(UIRecipeSlot recipeSlot, Recipe recipe, List var SelectedCategory = SharedUI.instance.SelectedCategory; if (SelectedCategory != null) { - if (!SelectedCategory.belongs(recipe.createItem) && !SelectedCategory.subCategories.Any(x => x.belongs(recipe.createItem))) + if (!SelectedCategory.belongs(recipe.createItem) && !SelectedCategory.subCategories.Any(x => x.belongs(recipe.createItem))) { + filterResults.filteredByCategory++; return false; + } } var availableFilters = SharedUI.instance.availableFilters; + filterResults.filteredByOtherFilters++; // Rather than add code to each return... if (availableFilters != null) foreach (var filter in SharedUI.instance.availableFilters) { if (!filter.button.selected && filter == SharedUI.instance.DisabledFilter) { @@ -662,15 +705,19 @@ private bool PassRecipeFilters(UIRecipeSlot recipeSlot, Recipe recipe, List } } } + filterResults.filteredByOtherFilters--; - if (recipe.createItem.Name.ToLower().IndexOf(itemNameFilter.currentString, StringComparison.OrdinalIgnoreCase) == -1) + if (recipe.createItem.Name.ToLower().IndexOf(itemNameFilter.currentString, StringComparison.OrdinalIgnoreCase) == -1) { + filterResults.filteredBySearch++; return false; + } if (itemDescriptionFilter.currentString.Length > 0) { if ((recipe.createItem.ToolTip != null && GetTooltipsAsString(recipe.createItem.ToolTip).IndexOf(itemDescriptionFilter.currentString, StringComparison.OrdinalIgnoreCase) != -1) /*|| (recipe.createItem.toolTip2 != null && recipe.createItem.toolTip2.ToLower().IndexOf(itemDescriptionFilter.Text, StringComparison.OrdinalIgnoreCase) != -1)*/) { return true; } else { + filterResults.filteredByTooltip++; return false; } } @@ -927,4 +974,15 @@ internal void InvalidateExtendedCraft() { SharedUI.instance.ObtainableFilter.button.LeftClick(new UIMouseEvent(null, Vector2.Zero)); } } + + public class RecipeFilterResults + { + public int filteredBySearch; + public int filteredByTooltip; + public int filteredByCategory; + public int filteredByOtherFilters; + public int filteredByMod; + + public bool AnyFiltered => filteredBySearch > 0 || filteredByTooltip > 0 || filteredByCategory > 0 || filteredByOtherFilters > 0 || filteredByMod > 0; + } } From 5aa27db935ea7ba210c7ac447ed0c6a4df01f6ca Mon Sep 17 00:00:00 2001 From: JavidPack Date: Sun, 16 Nov 2025 01:14:56 -0700 Subject: [PATCH 2/2] More merge fixes --- Localization/TranslationsNeeded.txt | 18 +++++++++--------- Localization/ru-RU.hjson | 5 +++++ RecipeCatalogueUI.cs | 4 ++-- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/Localization/TranslationsNeeded.txt b/Localization/TranslationsNeeded.txt index 226eb80..d58e96c 100644 --- a/Localization/TranslationsNeeded.txt +++ b/Localization/TranslationsNeeded.txt @@ -1,9 +1,9 @@ -en-US, 255/255, 100%, missing 0 -de-DE, 28/255, 11%, missing 227 -it-IT, 28/255, 11%, missing 227 -fr-FR, 95/255, 37%, missing 160 -es-ES, 49/255, 19%, missing 206 -ru-RU, 252/255, 99%, missing 3 -zh-Hans, 254/255, 100%, missing 1 -pt-BR, 95/255, 37%, missing 160 -pl-PL, 87/255, 34%, missing 168 +en-US, 260/260, 100%, missing 0 +de-DE, 28/260, 11%, missing 232 +it-IT, 28/260, 11%, missing 232 +fr-FR, 95/260, 37%, missing 165 +es-ES, 49/260, 19%, missing 211 +ru-RU, 252/260, 97%, missing 8 +zh-Hans, 254/260, 98%, missing 6 +pt-BR, 95/260, 37%, missing 165 +pl-PL, 87/260, 33%, missing 173 diff --git a/Localization/ru-RU.hjson b/Localization/ru-RU.hjson index efef31b..728049e 100644 --- a/Localization/ru-RU.hjson +++ b/Localization/ru-RU.hjson @@ -52,6 +52,11 @@ Mods: { HistoryEmpty: У вас пока нет истории поиска HistoryReachedStart: Достигнуто начало истории поиска HistoryReachedEnd: Достигнут конец истории поиска + // RecipesFilteredByMod: "{0} {^0:recipe;recipes} filtered by mod filter." + // RecipesFilteredBySearch: "{0} {^0:recipe;recipes} filtered by search filter." + // RecipesFilteredByTooltip: "{0} {^0:recipe;recipes} filtered by tooltip filter." + // RecipesFilteredByCategory: "{0} {^0:recipe;recipes} filtered by category filter." + // RecipesFilteredByOtherFilters: "{0} {^0:recipe;recipes} filtered by other filters." } RecipeCatalogueFilters: { diff --git a/RecipeCatalogueUI.cs b/RecipeCatalogueUI.cs index 41b0b39..ec4abad 100644 --- a/RecipeCatalogueUI.cs +++ b/RecipeCatalogueUI.cs @@ -528,8 +528,8 @@ private void UpdateGrid() { if (filterResults.filteredByMod > 0) { filterMessages.Add(Language.GetTextValue("Mods.RecipeBrowser.RecipeCatalogueUI.RecipesFilteredByMod", filterResults.filteredByMod)); - if (RecipeBrowserUI.modIndex != 0) - filterMessages.Add($"Showing only recipes resulting in items from \"{Terraria.ModLoader.ModLoader.GetMod(RecipeBrowserUI.instance.mods[RecipeBrowserUI.modIndex]).DisplayName}\""); + if (RecipeBrowserUI.ModIndex != 0) + filterMessages.Add($"Showing only recipes resulting in items from \"{Terraria.ModLoader.ModLoader.GetMod(RecipeBrowserUI.instance.mods[RecipeBrowserUI.ModIndex]).DisplayName}\""); } if (filterResults.filteredByCategory > 0) filterMessages.Add(Language.GetTextValue("Mods.RecipeBrowser.RecipeCatalogueUI.RecipesFilteredByCategory", filterResults.filteredByCategory));