protected override void DidActivate(bool firstActivation, ActivationType type) { try { if (firstActivation) { //Largely unchanged from CustomListController. Keep all of this. Instance = this; levelPackTableCellInstance = Resources.FindObjectsOfTypeAll <LevelPackTableCell>().First(x => x.name == "LevelPackTableCell"); levelPackTableCellInstance.reuseIdentifier = ReuseIdentifier; RectTransform container = new GameObject("HorizontalListContainer", typeof(RectTransform)).transform as RectTransform; container.SetParent(rectTransform, false); container.sizeDelta = new Vector2(0, 0); container.anchorMin = new Vector2(0.1f, 0); //Squish the list container a little bit container.anchorMax = new Vector2(0.9f, 1); //To make room for the forward/backward buttons var go = new GameObject("CustomListTableView"); go.SetActive(false); CustomListTableView = go.AddComponent <TableView>(); CustomListTableView.gameObject.AddComponent <RectMask2D>(); CustomListTableView.transform.SetParent(container, false); CustomListTableView.SetPrivateField("_tableType", TableView.TableType.Horizontal); (CustomListTableView.transform as RectTransform).anchorMin = new Vector2(0, 0); (CustomListTableView.transform as RectTransform).anchorMax = new Vector2(1, 1); (CustomListTableView.transform as RectTransform).sizeDelta = new Vector2(0, 0); (CustomListTableView.transform as RectTransform).anchoredPosition = new Vector2(0, 0); CustomListTableView.SetPrivateField("_preallocatedCells", new TableView.CellsGroup[0]); CustomListTableView.SetPrivateField("_isInitialized", false); CustomListTableView.dataSource = this; go.SetActive(true); //Code copied from monkeymanboy's Beat Saber Custom Campaigns mod. Keep these too. PageLeftButton = Instantiate(Resources.FindObjectsOfTypeAll <Button>().Last(x => (x.name == "PageLeftButton")), transform); RectTransform buttonTransform = PageLeftButton.transform.Find("BG") as RectTransform; RectTransform glow = Instantiate(Resources.FindObjectsOfTypeAll <GameObject>().Last(x => (x.name == "GlowContainer")), PageLeftButton.transform).transform as RectTransform; glow.localPosition = buttonTransform.localPosition; glow.anchoredPosition = buttonTransform.anchoredPosition; glow.anchorMin = buttonTransform.anchorMin; glow.anchorMax = buttonTransform.anchorMax; glow.sizeDelta = buttonTransform.sizeDelta; PageLeftButton.transform.localPosition = new Vector3(-80, 2.5f, -5); PageLeftButton.interactable = true; PageLeftButton.onClick.AddListener(() => CustomListTableView.PageScrollUp()); PageRightButton = Instantiate(Resources.FindObjectsOfTypeAll <Button>().Last(x => (x.name == "PageRightButton")), transform); buttonTransform = PageRightButton.transform.Find("BG") as RectTransform; glow = Instantiate(Resources.FindObjectsOfTypeAll <GameObject>().Last(x => (x.name == "GlowContainer")), PageRightButton.transform).transform as RectTransform; glow.localPosition = buttonTransform.localPosition; glow.anchoredPosition = buttonTransform.anchoredPosition; glow.anchorMin = buttonTransform.anchorMin; glow.anchorMax = buttonTransform.anchorMax; glow.sizeDelta = buttonTransform.sizeDelta; PageRightButton.transform.localPosition = new Vector3(80, 2.5f, -5); PageRightButton.interactable = true; PageRightButton.onClick.AddListener(() => CustomListTableView.PageScrollDown()); //Now load my Counter settings and data. The rest from here on out is mainly copied from //the old CountersPlusSettingsViewController, and can be safely removed. foreach (var kvp in AdvancedCounterSettings.counterUIItems) { counterInfos.Add(CreateFromModel(kvp.Key)); } foreach (CustomConfigModel potential in ConfigLoader.LoadCustomCounters()) { counterInfos.Add(new SettingsInfo() { Name = potential.DisplayName, Description = $"A custom counter added by {potential.ModCreator}!", Model = potential, IsCustom = true, }); } //Reload the data, and select the first cell in the list. CustomListTableView.didSelectCellWithIdxEvent += OnCellSelect; CustomListTableView.ReloadData(); CustomListTableView.SelectCellWithIdx(0, false); } } catch (Exception e) { //Edit this with your logging system of choice, or delete it altogether (As this shouldn't really cause Exceptions) Plugin.Log(e.ToString(), Plugin.LogInfo.Error, "Report this as an issue on the Counters+ GitHub."); } }
protected override void DidActivate(bool firstActivation, VRUIViewController.ActivationType activationType) { if (firstActivation && activationType == VRUIViewController.ActivationType.AddedToHierarchy) { _additionalContentModel = Resources.FindObjectsOfTypeAll <AdditionalContentModelSO>().FirstOrDefault(); RectTransform container = new GameObject("HorizontalListContainer", typeof(RectTransform)).transform as RectTransform; container.SetParent(rectTransform, false); container.sizeDelta = Vector2.zero; container.anchorMin = new Vector2(0.1f, 0); //Squish the list container a little bit container.anchorMax = new Vector2(0.9f, 1); //To make room for the forward/backward buttons var tableGameObject = new GameObject("CustomTableView"); tableGameObject.SetActive(false); tableView = tableGameObject.AddComponent <TableView>(); tableView.gameObject.AddComponent <RectMask2D>(); tableView.transform.SetParent(container, false); tableView.SetPrivateField("_isInitialized", false); tableView.SetPrivateField("_preallocatedCells", new TableView.CellsGroup[0]); tableView.SetPrivateField("_tableType", TableView.TableType.Horizontal); (tableView.transform as RectTransform).anchorMin = Vector2.zero; (tableView.transform as RectTransform).anchorMax = Vector2.one; (tableView.transform as RectTransform).sizeDelta = Vector2.zero; (tableView.transform as RectTransform).anchoredPosition = Vector2.zero; // Thanks alot Caeden117 for helping out. Used his Counters+ Horizontal Settings view controller to get all rects set correctly. PageLeftButton = Instantiate(Resources.FindObjectsOfTypeAll <Button>().Last(x => (x.name == "PageLeftButton")), transform); RectTransform buttonTransform = PageLeftButton.transform.Find("BG") as RectTransform; RectTransform glow = Instantiate(Resources.FindObjectsOfTypeAll <GameObject>().Last(x => (x.name == "GlowContainer")), PageLeftButton.transform).transform as RectTransform; glow.localPosition = buttonTransform.localPosition; glow.anchoredPosition = buttonTransform.anchoredPosition; glow.anchorMin = buttonTransform.anchorMin; glow.anchorMax = buttonTransform.anchorMax; glow.sizeDelta = buttonTransform.sizeDelta; PageLeftButton.transform.localPosition = new Vector3(-80, 2.5f, -5); PageLeftButton.interactable = true; PageRightButton = Instantiate(Resources.FindObjectsOfTypeAll <Button>().Last(x => (x.name == "PageRightButton")), transform); buttonTransform = PageRightButton.transform.Find("BG") as RectTransform; glow = Instantiate(Resources.FindObjectsOfTypeAll <GameObject>().Last(x => (x.name == "GlowContainer")), PageRightButton.transform).transform as RectTransform; glow.localPosition = buttonTransform.localPosition; glow.anchoredPosition = buttonTransform.anchoredPosition; glow.anchorMin = buttonTransform.anchorMin; glow.anchorMax = buttonTransform.anchorMax; glow.sizeDelta = buttonTransform.sizeDelta; PageRightButton.transform.localPosition = new Vector3(80, 2.5f, -5); PageRightButton.interactable = true; RectTransform viewport = new GameObject("Viewport").AddComponent <RectTransform>(); //Make a Viewport RectTransform viewport.SetParent(tableView.transform as RectTransform, false); //It expects one from a ScrollRect, so we have to make one ourselves. viewport.sizeDelta = Vector2.zero; //Important to set this to zero so the TableView can scroll through all available cells. tableView.SetPrivateField("_pageUpButton", PageLeftButton); //Set Up button to Left tableView.SetPrivateField("_pageDownButton", PageRightButton); //Set down button to Right tableView.Init(); tableView.SetPrivateField("_scrollRectTransform", viewport); //Set it with our hot-out-of-the-oven Viewport. tableGameObject.SetActive(true); _levelPacksTableView = new LevelPacksTableView(); _levelPacksTableView.SetPrivateField("_tableView", tableView); string[] packs = new string[1]; packs[0] = ""; _levelPacksTableView.SetPrivateField("_promoPackIDStrings", packs); LevelPackTableCell prefab = Resources.FindObjectsOfTypeAll <LevelPackTableCell>().First(x => (x.name == "LevelPackTableCell")); _levelPacksTableView.SetPrivateField("_cellPrefab", prefab); _levelPacksTableView.SetPrivateField("_cellWidth", 30f); _levelPacksTableView.SetPrivateField("_additionalContentModel", _additionalContentModel); _levelPacksTableView.didSelectPackEvent += didSelectPackEvent; _levelPacksTableView.Init(); for (int i = 0; i < tableView.transform.childCount; i++) { (tableView.transform.GetChild(i).transform as RectTransform).anchoredPosition = Vector3.zero; (tableView.transform.GetChild(i).transform as RectTransform).anchorMin = Vector3.zero; (tableView.transform.GetChild(i).transform as RectTransform).anchorMax = Vector3.one; } tableView.ReloadData(); tableView.SelectCellWithIdx(0, false); _levelPacksTableView.SelectCellWithIdx(_selectedPackNum); _levelPacksTableView.RefreshPacksAvailability(); } _additionalContentModel.didInvalidateDataEvent += HandleAdditionalContentModelDidInvalidateData; }
} //Tune this to the amount of cells you'll have, whether dynamic or static. public TableCell CellForIdx(int row) //Here is where you customize your TableCell. { LevelPackTableCell cell = CustomListTableView.DequeueReusableCellForIdentifier(ReuseIdentifier) as LevelPackTableCell; if (cell == null) //Dequeue the cell, and make an instance if it doesn't exist. { cell = Instantiate(levelPackTableCellInstance); cell.reuseIdentifier = ReuseIdentifier; } cell.showNewRibbon = false; //Dequeued cells will keep NEW ribbon value. Always change it to false. TextMeshProUGUI packNameText = cell.GetPrivateField <TextMeshProUGUI>("_packNameText"); //Grab some TMP references. TextMeshProUGUI packInfoText = cell.GetPrivateField <TextMeshProUGUI>("_infoText"); packInfoText.richText = true; //Enable rich text for info text. Optional, but I use it for Counters+. UnityEngine.UI.Image packCoverImage = cell.GetPrivateField <UnityEngine.UI.Image>("_coverImage"); packCoverImage.mainTexture.wrapMode = TextureWrapMode.Clamp; //Fixes bordering on images (especially transparent ones) if (row == 0) //From here on out is mainly Counters+ things, so you can safely remove them. { packNameText.text = "Main Settings"; packInfoText.text = "Configure basic Counters+ settings."; packCoverImage.sprite = Images.Images.LoadSprite("MainSettings"); } else if (row == NumberOfCells() - 1) { packNameText.text = "Donators"; packInfoText.text = "See who supported me on Ko-fi!"; packCoverImage.sprite = Images.Images.LoadSprite("Donators"); cell.showNewRibbon = true; } else if (row == NumberOfCells() - 2) { packNameText.text = "Contributors"; packInfoText.text = "See who helped with Counters+!"; packCoverImage.sprite = Images.Images.LoadSprite("Contributors"); } else { SettingsInfo info = counterInfos[row - 1]; packNameText.text = info.Name; packInfoText.text = info.Description; try { if (info.IsCustom) { packCoverImage.sprite = Images.Images.LoadSprite("Custom"); cell.showNewRibbon = (info.Model as CustomConfigModel).IsNew; } else { packCoverImage.sprite = Images.Images.LoadSprite(info.Name); if (info.Model.VersionAdded != null) { cell.showNewRibbon = Plugin.PluginVersion == info.Model.VersionAdded; packInfoText.text += $"\n\n<i>Version added: {info.Model.VersionAdded.ToString()}</i>"; } } } catch { packCoverImage.sprite = Images.Images.LoadSprite("Bug"); } } return(cell); }
protected override void DidActivate(bool firstActivation, ActivationType type) { try { if (firstActivation) { //Firstly, load my Counter settings and data, as its necessary for the NumberOfCells function. //These two foreach loops can be safely removed. foreach (var kvp in AdvancedCounterSettings.counterUIItems) { counterInfos.Add(CreateFromModel(kvp.Key)); } foreach (CustomConfigModel potential in ConfigLoader.LoadCustomCounters()) { counterInfos.Add(new SettingsInfo() { Name = potential.DisplayName, Description = $"A custom counter added by {potential.ModCreator}!", Model = potential, IsCustom = true, }); } //Largely unchanged from CustomListController. Keep all of this. Instance = this; levelPackTableCellInstance = Resources.FindObjectsOfTypeAll <LevelPackTableCell>().First(x => x.name == "LevelPackTableCell"); levelPackTableCellInstance.reuseIdentifier = ReuseIdentifier; RectTransform container = new GameObject("HorizontalListContainer", typeof(RectTransform)).transform as RectTransform; container.SetParent(rectTransform, false); container.sizeDelta = Vector2.zero; container.anchorMin = new Vector2(0.1f, 0); //Squish the list container a little bit container.anchorMax = new Vector2(0.9f, 1); //To make room for the forward/backward buttons var go = new GameObject("CustomListTableView"); go.SetActive(false); //Disable GameObject to not have scripts run. CustomListTableView = go.AddComponent <TableView>(); //Add TableView CustomListTableView.gameObject.AddComponent <RectMask2D>(); //Add Mask CustomListTableView.transform.SetParent(container, false); CustomListTableView.SetPrivateField("_tableType", TableView.TableType.Horizontal); (CustomListTableView.transform as RectTransform).anchorMin = Vector2.zero; (CustomListTableView.transform as RectTransform).anchorMax = Vector2.one; (CustomListTableView.transform as RectTransform).sizeDelta = Vector2.zero; (CustomListTableView.transform as RectTransform).anchoredPosition = Vector2.zero; CustomListTableView.SetPrivateField("_preallocatedCells", new TableView.CellsGroup[0]); CustomListTableView.SetPrivateField("_isInitialized", false); //Code copied from monkeymanboy's Beat Saber Custom Campaigns mod. Keep these too. PageLeftButton = Instantiate(Resources.FindObjectsOfTypeAll <Button>().Last(x => (x.name == "PageLeftButton")), transform); RectTransform buttonTransform = PageLeftButton.transform.Find("BG") as RectTransform; RectTransform glow = Instantiate(Resources.FindObjectsOfTypeAll <GameObject>().Last(x => (x.name == "GlowContainer")), PageLeftButton.transform).transform as RectTransform; glow.localPosition = buttonTransform.localPosition; glow.anchoredPosition = buttonTransform.anchoredPosition; glow.anchorMin = buttonTransform.anchorMin; glow.anchorMax = buttonTransform.anchorMax; glow.sizeDelta = buttonTransform.sizeDelta; PageLeftButton.transform.localPosition = new Vector3(-80, 2.5f, -5); PageLeftButton.interactable = true; PageRightButton = Instantiate(Resources.FindObjectsOfTypeAll <Button>().Last(x => (x.name == "PageRightButton")), transform); buttonTransform = PageRightButton.transform.Find("BG") as RectTransform; glow = Instantiate(Resources.FindObjectsOfTypeAll <GameObject>().Last(x => (x.name == "GlowContainer")), PageRightButton.transform).transform as RectTransform; glow.localPosition = buttonTransform.localPosition; glow.anchoredPosition = buttonTransform.anchoredPosition; glow.anchorMin = buttonTransform.anchorMin; glow.anchorMax = buttonTransform.anchorMax; glow.sizeDelta = buttonTransform.sizeDelta; PageRightButton.transform.localPosition = new Vector3(80, 2.5f, -5); PageRightButton.interactable = true; RectTransform viewport = new GameObject("Viewport").AddComponent <RectTransform>(); //Make a Viewport RectTransform viewport.SetParent(CustomListTableView.transform as RectTransform, false); //It expects one from a ScrollRect, so we have to make one ourselves. viewport.sizeDelta = Vector2.zero; //Important to set this to zero so the TableView can scroll through all available cells. CustomListTableView.SetPrivateField("_pageUpButton", PageLeftButton); //Set Up button to Left CustomListTableView.SetPrivateField("_pageDownButton", PageRightButton); //Set down button to Right CustomListTableView.Init(); //Init, have "_scrollRectTransform" be null. CustomListTableView.SetPrivateField("_scrollRectTransform", viewport); //Set it with our hot-out-of-the-oven Viewport. CustomListTableView.dataSource = this; //Add data source go.SetActive(true); //Finally, reset some anchors of each child so that all of the available cells are shown. for (int i = 0; i < CustomListTableView.transform.childCount; i++) { (CustomListTableView.transform.GetChild(i).transform as RectTransform).anchoredPosition = Vector3.zero; (CustomListTableView.transform.GetChild(i).transform as RectTransform).anchorMin = Vector3.zero; (CustomListTableView.transform.GetChild(i).transform as RectTransform).anchorMax = Vector3.one; } //Reload the data, and select the first cell in the list. CustomListTableView.didSelectCellWithIdxEvent += OnCellSelect; CustomListTableView.ReloadData(); CustomListTableView.SelectCellWithIdx(0, false); } } catch (Exception e) { //Edit this with your logging system of choice, or delete it altogether (As this shouldn't really cause Exceptions) Plugin.Log(e.ToString(), LogInfo.Error, "Report this as an issue on the Counters+ GitHub."); } }