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, 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."); } }