internal static bool RemoveTagFromFM(FanMission fm, string catText, string tagText) { if (tagText.IsEmpty()) { return(false); } // Parent node (category) if (catText.IsEmpty()) { // TODO: These messageboxes are annoying, but they prevent accidental deletion. // Figure out something better. bool cont = Core.View.AskToContinue(LText.TagsTab.AskRemoveCategory, LText.TagsTab.TabText, true); if (!cont) { return(false); } CatAndTags?cat = fm.Tags.FirstOrDefault(x => x.Category == tagText); if (cat != null) { fm.Tags.Remove(cat); UpdateFMTagsString(fm); // TODO: Profile the FirstOrDefaults and see if I should make them for loops GlobalCatAndTags?globalCat = GlobalTags.FirstOrDefault(x => x.Category.Name == cat.Category); if (globalCat != null && !globalCat.Category.IsPreset) { if (globalCat.Category.UsedCount > 0) { globalCat.Category.UsedCount--; } if (globalCat.Category.UsedCount == 0) { GlobalTags.Remove(globalCat); } } } } // Child node (tag) else { bool cont = Core.View.AskToContinue(LText.TagsTab.AskRemoveTag, LText.TagsTab.TabText, true); if (!cont) { return(false); } CatAndTags?cat = fm.Tags.FirstOrDefault(x => x.Category == catText); string? tag = cat?.Tags.FirstOrDefault(x => x == tagText); if (tag != null) { cat !.Tags.Remove(tag); if (cat.Tags.Count == 0) { fm.Tags.Remove(cat); } UpdateFMTagsString(fm); GlobalCatAndTags?globalCat = GlobalTags.FirstOrDefault(x => x.Category.Name == cat.Category); GlobalCatOrTag? globalTag = globalCat?.Tags.FirstOrDefault(x => x.Name == tagText); if (globalTag != null && !globalTag.IsPreset) { if (globalTag.UsedCount > 0) { globalTag.UsedCount--; } if (globalTag.UsedCount == 0) { globalCat !.Tags.Remove(globalTag); } if (globalCat !.Tags.Count == 0) { GlobalTags.Remove(globalCat); } } } } Ini.WriteFullFMDataIni(); return(true); }