public static Transform AddNewSubCategory(UI_ToggleGroupCtrl mainCategory, MakerCategory subCategory) { KoikatuAPI.Logger.LogDebug($"Adding custom subcategory {subCategory.SubCategoryName} to {mainCategory.transform.name}"); var tr = Object.Instantiate(SubCategoryCopy.gameObject, mainCategory.transform, true).transform; tr.name = subCategory.SubCategoryName; var trTop = tr.Find("CustomSubcategoryTop"); trTop.name = subCategory.SubCategoryName + "Top"; foreach (Transform oldObj in trTop.transform) { Object.Destroy(oldObj.gameObject); } tr.GetComponentInChildren <TextMeshProUGUI>().text = GetSubcategoryDisplayName(subCategory); var tgl = tr.GetComponent <Toggle>(); tgl.group = mainCategory.transform.GetComponent <ToggleGroup>(); var cgroup = trTop.GetComponent <CanvasGroup>(); mainCategory.items = mainCategory.items.AddToArray(new UI_ToggleGroupCtrl.ItemInfo { tglItem = tgl, cgItem = cgroup }); KoikatuAPI.Instance.StartCoroutine(FinishInit(trTop)); tr.gameObject.SetActive(true); return(tr); }
/// <summary> /// Needs to run before UI_ToggleGroupCtrl.Start of the category runs, or it won't get added properly /// </summary> internal static void AddMissingSubCategories(UI_ToggleGroupCtrl mainCategory) { var categoryTransfrom = mainCategory.transform; // Can break stuff, 06_SystemTop might be fine but needs testing if (categoryTransfrom.name == "04_AccessoryTop" || categoryTransfrom.name == "06_SystemTop") { return; } // Sorting breaks hair selector layout, too lazy to fix var noSorting = categoryTransfrom.name == "02_HairTop"; var transformsToSort = new List <KeyValuePair <Transform, int> >(); foreach (var category in _categories) { if (categoryTransfrom.name != category.CategoryName) { continue; } var categorySubTransform = categoryTransfrom.Find(category.SubCategoryName) ?? SubCategoryCreator.AddNewSubCategory(mainCategory, category); transformsToSort.Add(new KeyValuePair <Transform, int>(categorySubTransform, category.Position)); } if (noSorting) { return; } foreach (Transform subTransform in categoryTransfrom) { if (transformsToSort.Any(x => x.Key == subTransform)) { continue; } var builtInCategory = MakerConstants.GetBuiltInCategory(categoryTransfrom.name, subTransform.name); if (builtInCategory != null) { transformsToSort.Add(new KeyValuePair <Transform, int>(subTransform, builtInCategory.Position)); } else { KoikatuAPI.Logger.LogWarning($"Missing MakerCategory for existing transfrom {categoryTransfrom.name} / {subTransform.name}"); } } var index = 0; foreach (var tuple in transformsToSort.OrderBy(x => x.Value)) { tuple.Key.SetSiblingIndex(index++); } KoikatuAPI.Instance.StartCoroutine(FixCategoryContentOffsets(mainCategory)); }
public static void HBeforeToggleGroupStart(UI_ToggleGroupCtrl __instance) { var categoryTransfrom = __instance.transform; if (categoryTransfrom?.parent != null && categoryTransfrom.parent.name == "CvsMenuTree") { if (!_makerStarting) { InsideMaker = true; _makerStarting = true; OnRegisterCustomSubCategories(); KoikatuAPI.Instance.StartCoroutine(OnMakerLoadingCo()); } // Have to add missing subcategories now, before UI_ToggleGroupCtrl.Start runs MakerInterfaceCreator.AddMissingSubCategories(__instance); } }
private static IEnumerator FixCategoryContentOffsets(UI_ToggleGroupCtrl mainCategory) { yield return(null); const int padding = 40; var index = 0; foreach (Transform tab in mainCategory.transform) { if (!tab.gameObject.activeSelf) { continue; } var contents = tab.Cast <Transform>().First(x => !x.name.Equals("imgOff")); var p = contents.localPosition; p.y = padding * index; contents.localPosition = p; index++; } }
public static Transform AddNewSubCategory(UI_ToggleGroupCtrl mainCategory, MakerCategory subCategory) { KoikatuAPI.Logger.LogDebug($"Adding custom subcategory {subCategory.SubCategoryName} to {mainCategory.transform.name}"); var tr = Object.Instantiate(SubCategoryCopy.gameObject, mainCategory.transform, true).transform; tr.name = subCategory.SubCategoryName; var trTop = tr.Find("CustomSubcategoryTop"); trTop.name = subCategory.SubCategoryName + "Top"; foreach (Transform oldObj in trTop.transform) { Object.Destroy(oldObj.gameObject); } tr.GetComponentInChildren <TextMeshProUGUI>().text = GetSubcategoryDisplayName(subCategory); var tgl = tr.GetComponent <Toggle>(); tgl.group = mainCategory.transform.GetComponent <ToggleGroup>(); var cgroup = trTop.GetComponent <CanvasGroup>(); // There's an item with null contents in body tab that makes UI code crash when switching tabs when custom page is selected // it looks useless so remove it mainCategory.items = mainCategory.items.Where(x => x.tglItem != null).AddItem(new UI_ToggleGroupCtrl.ItemInfo { tglItem = tgl, cgItem = cgroup }).ToArray(); KoikatuAPI.Instance.StartCoroutine(FinishInit(trTop)); tr.gameObject.SetActive(true); return(tr); }