public T AddSliderSetting <T>(string name, string hintText, float min, float max, bool intValues) where T : IncDecSettingsController { var volumeSettings = Resources.FindObjectsOfTypeAll <WindowModeSettingsController>().FirstOrDefault(); GameObject newSettingsObject = MonoBehaviour.Instantiate(volumeSettings.gameObject, transform); newSettingsObject.name = name; WindowModeSettingsController volume = newSettingsObject.GetComponent <WindowModeSettingsController>(); T newSliderSettingsController = (T)ReflectionUtil.CopyComponent(volume, typeof(IncDecSettingsController), typeof(T), newSettingsObject); MonoBehaviour.DestroyImmediate(volume); GameObject.Destroy(newSettingsObject.transform.Find("Value").Find("DecButton").gameObject); GameObject.Destroy(newSettingsObject.transform.Find("Value").Find("ValueText").gameObject); GameObject.Destroy(newSettingsObject.transform.Find("Value").Find("IncButton").gameObject); HMUI.Scrollbar slider = GameObject.Instantiate(Resources.FindObjectsOfTypeAll <HMUI.Scrollbar>().First(), newSettingsObject.transform.Find("Value"), false); SliderProperties sliderProperties = slider.gameObject.AddComponent <SliderProperties>(); sliderProperties.FromValue = min; sliderProperties.ToValue = max; sliderProperties.IntValues = intValues; slider.GetComponentInChildren <TextMeshProUGUI>().enableWordWrapping = false; (slider.transform as RectTransform).sizeDelta = new Vector2(39.5f, 7.5f); (slider.transform as RectTransform).anchorMin = new Vector2(0, 0.5f); var tmpText = newSettingsObject.GetComponentInChildren <TMP_Text>(); tmpText.text = name; BeatSaberUI.AddHintText(tmpText.rectTransform, hintText); return(newSliderSettingsController); }
public T AddStringSetting <T>(string name, string hintText) where T : ListSettingsController { var volumeSettings = Resources.FindObjectsOfTypeAll <VolumeSettingsController>().FirstOrDefault(); GameObject newSettingsObject = MonoBehaviour.Instantiate(volumeSettings.gameObject, transform); newSettingsObject.name = name; newSettingsObject.transform.Find("Value").gameObject.GetComponent <HorizontalLayoutGroup>().spacing += 2; newSettingsObject.transform.Find("Value").Find("DecButton").gameObject.SetActive(false); //var bgIcon = newSettingsObject.transform.Find("Value").Find("IncButton").Find("BG").gameObject.GetComponent<Image>(); //(bgIcon.transform as RectTransform).localScale *= new Vector2(0.9f, 0.9f); var arrowIcon = newSettingsObject.transform.Find("Value").Find("IncButton").Find("Arrow").gameObject.GetComponent <Image>(); arrowIcon.sprite = UIUtilities.EditIcon; var valueText = newSettingsObject.transform.Find("Value").Find("ValueText").gameObject.GetComponent <TextMeshProUGUI>(); valueText.alignment = TextAlignmentOptions.MidlineRight; valueText.enableWordWrapping = false; BeatSaberUI.AddHintText(valueText.rectTransform, hintText); VolumeSettingsController volume = newSettingsObject.GetComponent <VolumeSettingsController>(); T newListSettingsController = (T)ReflectionUtil.CopyComponent(volume, typeof(ListSettingsController), typeof(T), newSettingsObject); MonoBehaviour.DestroyImmediate(volume); var tmpText = newSettingsObject.GetComponentInChildren <TMP_Text>(); tmpText.text = name; BeatSaberUI.AddHintText(tmpText.rectTransform, hintText); return(newListSettingsController); }
public T AddIconSegmentsSetting <T>(string name, string hintText, IconSegmentedControl.DataItem[] icons) where T : SegmentedControlViewController { var volumeSettings = GetVolumeSettings(); GameObject newSettingsObject = MonoBehaviour.Instantiate(volumeSettings.gameObject, transform); newSettingsObject.name = name; ListSettingsController volume = newSettingsObject.GetComponent <ListSettingsController>(); T newTextSegmentsSettingsController = (T)ReflectionUtil.CopyComponent(volume, typeof(ListSettingsController), typeof(T), newSettingsObject); MonoBehaviour.DestroyImmediate(volume); GameObject.Destroy(newSettingsObject.transform.Find("Value").Find("DecButton").gameObject); GameObject.Destroy(newSettingsObject.transform.Find("Value").Find("ValueText").gameObject); GameObject.Destroy(newSettingsObject.transform.Find("Value").Find("IncButton").gameObject); IconSegmentedControl segmentedControl = BeatSaberUI.CreateIconSegmentedControl(newSettingsObject.transform.Find("Value") as RectTransform, new Vector2(0f, 0f), new Vector2(40f, 7f)); newTextSegmentsSettingsController.segmentedControl = segmentedControl; segmentedControl.SetData(icons); var tmpText = newSettingsObject.GetComponentInChildren <TMP_Text>(); tmpText.text = name; if (hintText != String.Empty) { BeatSaberUI.AddHintText(tmpText.rectTransform, hintText); } viewController?.AddSubmenuOption(newSettingsObject); AddHooks(newTextSegmentsSettingsController); return(newTextSegmentsSettingsController); }
public T AddListSetting <T>(string name, string hintText) where T : ListSettingsController { var volumeSettings = GetVolumeSettings(); GameObject newSettingsObject = MonoBehaviour.Instantiate(volumeSettings.gameObject, transform); newSettingsObject.name = name; var incBg = newSettingsObject.transform.Find("Value").Find("IncButton").Find("BG").gameObject.GetComponent <Image>(); (incBg.transform as RectTransform).localScale *= new Vector2(0.8f, 0.8f); var decBg = newSettingsObject.transform.Find("Value").Find("DecButton").Find("BG").gameObject.GetComponent <Image>(); (decBg.transform as RectTransform).localScale *= new Vector2(0.8f, 0.8f); ListSettingsController volume = newSettingsObject.GetComponent <ListSettingsController>(); T newListSettingsController = (T)ReflectionUtil.CopyComponent(volume, typeof(ListSettingsController), typeof(T), newSettingsObject); MonoBehaviour.DestroyImmediate(volume); var tmpText = newSettingsObject.GetComponentInChildren <TMP_Text>(); tmpText.text = name; if (hintText != String.Empty) { BeatSaberUI.AddHintText(tmpText.rectTransform, hintText); } viewController?.AddSubmenuOption(newSettingsObject); AddHooks(newListSettingsController); return(newListSettingsController); }
public override void Instantiate() { if (initialized) { return; } //We have to find our own target //TODO: Clean up time complexity issue. This is called for each new option SoloFreePlayFlowCoordinator sfpfc = Resources.FindObjectsOfTypeAll <SoloFreePlayFlowCoordinator>().First(); GameplaySetupViewController gsvc = sfpfc.GetField <GameplaySetupViewController>("_gameplaySetupViewController"); RectTransform container = (RectTransform)gsvc.transform.Find("GameplayModifiers").Find("RightColumn"); var volumeSettings = Resources.FindObjectsOfTypeAll <VolumeSettingsController>().FirstOrDefault(); gameObject = UnityEngine.Object.Instantiate(volumeSettings.gameObject, container); gameObject.name = optionName; gameObject.GetComponentInChildren <TMP_Text>().text = optionName; //Slim down the toggle option so it fits in the space we have before the divider (gameObject.transform as RectTransform).sizeDelta = new Vector2(50, (gameObject.transform as RectTransform).sizeDelta.y); //This magical nonsense is courtesy of Taz and his SettingsUI class VolumeSettingsController volume = gameObject.GetComponent <VolumeSettingsController>(); ListViewController newListSettingsController = (ListViewController)ReflectionUtil.CopyComponent(volume, typeof(ListSettingsController), typeof(ListViewController), gameObject); UnityEngine.Object.DestroyImmediate(volume); newListSettingsController.values = _options.Keys.ToList(); newListSettingsController.SetValue = OnChange; newListSettingsController.GetValue = () => { if (GetValue != null) { return(GetValue.Invoke()); } return(_options.Keys.ElementAt(0)); }; newListSettingsController.GetTextForValue = (v) => { if (_options.ContainsKey(v)) { return(_options[v]); } return("UNKNOWN"); }; //Initialize the controller, as if we had just opened the settings menu newListSettingsController.Init(); gameObject.SetActive(false); initialized = true; }
IEnumerator WaitForInit() { while (true) { if (ui.GetPrivateField <bool>("initialized") == true) { ReflectionUtil.CopyComponent(GameObject.Find("SettingsUI").GetComponent <SettingsUI>(), typeof(SettingsUI), typeof(SettingsUI), uiGO); ui = uiGO.GetComponent <SettingsUI>(); ModifySettings(); break; } yield return(new WaitForSeconds(0.1f)); } }
public T AddIntSetting <T>(string name) where T : IntSettingsController { var volumeSettings = Resources.FindObjectsOfTypeAll <WindowModeSettingsController>().FirstOrDefault(); GameObject newSettingsObject = MonoBehaviour.Instantiate(volumeSettings.gameObject, transform); newSettingsObject.name = name; WindowModeSettingsController volume = newSettingsObject.GetComponent <WindowModeSettingsController>(); T newToggleSettingsController = (T)ReflectionUtil.CopyComponent(volume, typeof(IncDecSettingsController), typeof(T), newSettingsObject); MonoBehaviour.DestroyImmediate(volume); newSettingsObject.GetComponentInChildren <TMP_Text>().text = name; return(newToggleSettingsController); }
public T AddToggleSetting <T>(string name, string hintText) where T : SwitchSettingsController { var volumeSettings = Resources.FindObjectsOfTypeAll <WindowModeSettingsController>().FirstOrDefault(); GameObject newSettingsObject = MonoBehaviour.Instantiate(volumeSettings.gameObject, transform); newSettingsObject.name = name; WindowModeSettingsController volume = newSettingsObject.GetComponent <WindowModeSettingsController>(); T newToggleSettingsController = (T)ReflectionUtil.CopyComponent(volume, typeof(SwitchSettingsController), typeof(T), newSettingsObject); MonoBehaviour.DestroyImmediate(volume); var tmpText = newSettingsObject.GetComponentInChildren <TMP_Text>(); tmpText.text = name; BeatSaberUI.AddHintText(tmpText.rectTransform, hintText); return(newToggleSettingsController); }
public T AddSliderSetting <T>(string name, string hintText, float min, float max, float increment, bool intValues) where T : IncDecSettingsController { var volumeSettings = GetWindowSettings(); GameObject newSettingsObject = MonoBehaviour.Instantiate(volumeSettings.gameObject, transform); newSettingsObject.name = name; SwitchSettingsController volume = newSettingsObject.GetComponent <SwitchSettingsController>(); T newSliderSettingsController = (T)ReflectionUtil.CopyComponent(volume, typeof(IncDecSettingsController), typeof(T), newSettingsObject); MonoBehaviour.DestroyImmediate(volume); GameObject.Destroy(newSettingsObject.transform.Find("Value").Find("DecButton").gameObject); GameObject.Destroy(newSettingsObject.transform.Find("Value").Find("ValueText").gameObject); GameObject.Destroy(newSettingsObject.transform.Find("Value").Find("IncButton").gameObject); CustomSlider slider = newSliderSettingsController.gameObject.AddComponent <CustomSlider>(); slider.Scrollbar = GameObject.Instantiate(Resources.FindObjectsOfTypeAll <HMUI.Scrollbar>().First(s => s.name != "CustomUISlider"), newSettingsObject.transform.Find("Value"), false); slider.Scrollbar.name = "CustomUISlider"; slider.Scrollbar.GetComponentInChildren <TextMeshProUGUI>().enableWordWrapping = false; (slider.Scrollbar.transform as RectTransform).sizeDelta = new Vector2(39.5f, 4.5f); (slider.Scrollbar.transform as RectTransform).anchorMin = new Vector2(0, 0.5f); slider.Scrollbar.numberOfSteps = (int)((max - min) / increment) + 1; slider.MinValue = min; slider.MaxValue = max; slider.IsIntValue = intValues; var tmpText = newSettingsObject.GetComponentInChildren <TMP_Text>(); tmpText.text = name; if (hintText != String.Empty) { BeatSaberUI.AddHintText(tmpText.rectTransform, hintText); } viewController?.AddSubmenuOption(newSettingsObject); AddHooks(newSliderSettingsController); return(newSliderSettingsController); }
public T AddColorPickerSetting <T>(string name, string hintText, Color color, out ColorPickerPreviewClickable clickablePreview) where T : MonoBehaviour { var volumeSettings = Resources.FindObjectsOfTypeAll <SwitchSettingsController>().FirstOrDefault(); GameObject newSettingsObject = MonoBehaviour.Instantiate(volumeSettings.gameObject, transform); newSettingsObject.name = name; SwitchSettingsController volume = newSettingsObject.GetComponent <SwitchSettingsController>(); T newColorPickerSettingsController = (T)ReflectionUtil.CopyComponent(volume, typeof(MonoBehaviour), typeof(T), newSettingsObject); MonoBehaviour.DestroyImmediate(volume); GameObject.Destroy(newSettingsObject.GetComponentInChildren <HorizontalLayoutGroup>()); GameObject.Destroy(newSettingsObject.transform.Find("Value").Find("DecButton").gameObject); GameObject.Destroy(newSettingsObject.transform.Find("Value").Find("ValueText").gameObject); GameObject.Destroy(newSettingsObject.transform.Find("Value").Find("IncButton").gameObject); ColorPickerPreviewClickable cppc = new GameObject("ColorPickerPreviewClickable").AddComponent <ColorPickerPreviewClickable>(); cppc.transform.SetParent(newSettingsObject.transform.Find("Value"), false); cppc.ImagePreview.color = color; (cppc.transform as RectTransform).localScale = new Vector2(0.06f, 0.06f); (cppc.transform as RectTransform).localPosition += new Vector3(3f, 0.1f); clickablePreview = cppc; var tmpText = newSettingsObject.GetComponentInChildren <TMP_Text>(); tmpText.text = name; if (hintText != String.Empty) { BeatSaberUI.AddHintText(tmpText.rectTransform, hintText); } viewController?.AddSubmenuOption(newSettingsObject); AddHooks(newColorPickerSettingsController); return(newColorPickerSettingsController); }
public T AddColorPickerSetting <T>(string name, string hintText) where T : SimpleSettingsController { var volumeSettings = Resources.FindObjectsOfTypeAll <WindowModeSettingsController>().FirstOrDefault(); GameObject newSettingsObject = MonoBehaviour.Instantiate(volumeSettings.gameObject, transform); newSettingsObject.name = name; WindowModeSettingsController volume = newSettingsObject.GetComponent <WindowModeSettingsController>(); T newColorPickerSettingsController = (T)ReflectionUtil.CopyComponent(volume, typeof(SimpleSettingsController), typeof(T), newSettingsObject); MonoBehaviour.DestroyImmediate(volume); GameObject.Destroy(newSettingsObject.transform.Find("Value").Find("DecButton").gameObject); GameObject.Destroy(newSettingsObject.transform.Find("Value").Find("ValueText").gameObject); GameObject.Destroy(newSettingsObject.transform.Find("Value").Find("IncButton").gameObject); ColorPickerPreviewClickable cppc = new GameObject("ColorPickerPreviewClickable").AddComponent <ColorPickerPreviewClickable>(); cppc.ImagePreview.sprite = null; //cppc.transform.localScale = new Vector3(sizeDelta.x, sizeDelta.y, colorPicker.transform.localScale.z); cppc.transform.SetParent(newSettingsObject.transform.Find("Value"), false); //cppc.transform.localScale = new Vector3(0.2f, 0.15f); //(cppc.transform as RectTransform).anchorMin = new Vector2(0, 0.5f); //(cppc.transform as RectTransform).anchorMax = new Vector2(0, 0.5f); //(cppc.transform as RectTransform).anchoredPosition = new Vector2(-50, 0); (cppc.transform as RectTransform).sizeDelta = new Vector2(39.5f, 7f); var tmpText = newSettingsObject.GetComponentInChildren <TMP_Text>(); tmpText.text = name; BeatSaberUI.AddHintText(tmpText.rectTransform, hintText); return(newColorPickerSettingsController); }
public override void Instantiate() { var volumeSettings = Resources.FindObjectsOfTypeAll <FormattedFloatListSettingsController>().FirstOrDefault(); gameObject = UnityEngine.Object.Instantiate(volumeSettings.gameObject, Container); gameObject.name = optionName; gameObject.GetComponentInChildren <TMP_Text>().text = optionName; // Add a separator for this menu option AddSeparator(Container); //This magical nonsense is courtesy of Taz and his SettingsUI class ListSettingsController volume = gameObject.GetComponent <ListSettingsController>(); multiSelectController = (ListViewController)ReflectionUtil.CopyComponent(volume, typeof(ListSettingsController), typeof(ListViewController), gameObject); UnityEngine.Object.DestroyImmediate(volume); multiSelectController.applyImmediately = true; multiSelectController.values = _options.Keys.ToList(); multiSelectController.SetValue = OnChange; multiSelectController.GetValue = () => { if (GetValue != null) { return(GetValue.Invoke()); } return(_options.Keys.ElementAt(0)); }; multiSelectController.GetTextForValue = (v) => { if (_options.ContainsKey(v)) { return(_options[v] != null ? _options[v] : v.ToString()); } return("UNKNOWN"); }; //Initialize the controller, as if we had just opened the settings menu multiSelectController.Init(); var value = multiSelectController.gameObject.transform.Find("Value"); var valueText = value.Find("ValueText"); TMP_Text valueTextObject = valueText.GetComponent <TMP_Text>(); valueTextObject.lineSpacing = -50; valueTextObject.alignment = TextAlignmentOptions.CenterGeoAligned; var nameText = multiSelectController.gameObject.transform.Find("NameText"); nameText.localScale = new Vector3(0.85f, 0.85f, 0.85f); value.localScale = new Vector3(0.7f, 0.7f, 0.7f); if (hintText != String.Empty) { BeatSaberUI.AddHintText(nameText as RectTransform, hintText); } var dec = value.Find("DecButton"); dec.transform.localScale = new Vector3(0.7f, 0.7f, 0.7f); var inc = value.Find("IncButton"); inc.transform.localScale = new Vector3(0.7f, 0.7f, 0.7f); value.localPosition -= new Vector3(8, 0.3f); gameObject.SetActive(false); initialized = true; }
private void AddMultiSelectOption(string optionName, Dictionary <float, string> options, Transform parent, GameObject destinationObject, Action <float> onSet = null, Vector2?position = null) { if (position == null) { position = Vector2.zero; } destinationObject.SetActive(false); FormattedFloatListSettingsController formattedFloatListSettingsController = Resources.FindObjectsOfTypeAll <FormattedFloatListSettingsController>().FirstOrDefault <FormattedFloatListSettingsController>(); var multiSelectGameObject = Instantiate(formattedFloatListSettingsController.gameObject, parent); multiSelectGameObject.name = optionName; multiSelectGameObject.GetComponentInChildren <TMP_Text>().text = optionName; var oldListSettingsController = multiSelectGameObject.GetComponent <ListSettingsController>(); var newListViewController = (ListViewController)ReflectionUtil.CopyComponent(oldListSettingsController, typeof(ListSettingsController), typeof(ListViewController), multiSelectGameObject); DestroyImmediate(oldListSettingsController); newListViewController.applyImmediately = true; newListViewController.values = options.Keys.ToList(); newListViewController.SetValue = onSet; newListViewController.GetValue = () => options.Keys.ElementAt(0); newListViewController.GetTextForValue = (float v) => { if (!options.ContainsKey(v)) { return("UNKNOWN"); } if (options[v] == null) { return(v.ToString()); } return(options[v]); }; Polyglot.LocalizedTextMeshProUGUI localizer = newListViewController.GetComponentInChildren <Polyglot.LocalizedTextMeshProUGUI>(); if (localizer != null) { Destroy(localizer); } var valueTextTransform = newListViewController.gameObject.transform.Find("Value"); var valueTextComponent = valueTextTransform.Find("ValueText").GetComponent <TMP_Text>(); valueTextComponent.lineSpacing = -50f; valueTextComponent.alignment = TextAlignmentOptions.CenterGeoAligned; var nameTextTransform = newListViewController.gameObject.transform.Find("NameText"); nameTextTransform.localScale = new Vector3(0.85f, 0.85f, 0.85f); nameTextTransform.localPosition += new Vector3(2f, 5f); (nameTextTransform as RectTransform).sizeDelta = new Vector2(47f, 8f); valueTextTransform.localScale = new Vector3(0.7f, 0.7f, 0.7f); valueTextTransform.Find("DecButton").transform.localScale = new Vector3(0.7f, 0.7f, 0.7f); valueTextTransform.Find("IncButton").transform.localScale = new Vector3(0.7f, 0.7f, 0.7f); newListViewController.transform.localPosition = (Vector2)position; newListViewController.Init(); destinationObject.SetActive(true); }
public override void Instantiate() { try { //We have to find our own target //TODO: Clean up time complexity issue. This is called for each new option SoloFreePlayFlowCoordinator sfpfc = Resources.FindObjectsOfTypeAll <SoloFreePlayFlowCoordinator>().First(); GameplaySetupViewController gsvc = sfpfc.GetField <GameplaySetupViewController>("_gameplaySetupViewController"); RectTransform container = (RectTransform)gsvc.transform.Find(pageName).Find(panelName); var volumeSettings = Resources.FindObjectsOfTypeAll <VolumeSettingsController>().FirstOrDefault(); gameObject = UnityEngine.Object.Instantiate(volumeSettings.gameObject, container); gameObject.name = optionName; gameObject.GetComponentInChildren <TMP_Text>().text = optionName; foreach (Transform t in container) { if (t.name.StartsWith("Separator")) { separator = UnityEngine.Object.Instantiate(t.gameObject, container); separator.name = "ExtraSeparator"; separator.SetActive(false); break; } } //Slim down the toggle option so it fits in the space we have before the divider (gameObject.transform as RectTransform).sizeDelta = new Vector2(50, (gameObject.transform as RectTransform).sizeDelta.y); //This magical nonsense is courtesy of Taz and his SettingsUI class VolumeSettingsController volume = gameObject.GetComponent <VolumeSettingsController>(); ListViewController newListSettingsController = (ListViewController)ReflectionUtil.CopyComponent(volume, typeof(ListSettingsController), typeof(ListViewController), gameObject); UnityEngine.Object.DestroyImmediate(volume); newListSettingsController.values = _options.Keys.ToList(); newListSettingsController.SetValue = OnChange; newListSettingsController.GetValue = () => { if (GetValue != null) { return(GetValue.Invoke()); } return(_options.Keys.ElementAt(0)); }; newListSettingsController.GetTextForValue = (v) => { if (_options.ContainsKey(v)) { return(_options[v] != null ? _options[v] : v.ToString()); } return("UNKNOWN"); }; //Initialize the controller, as if we had just opened the settings menu newListSettingsController.Init(); var value = newListSettingsController.gameObject.transform.Find("Value"); var valueText = value.Find("ValueText"); TMP_Text valueTextObject = valueText.GetComponent <TMP_Text>(); valueTextObject.lineSpacing = -50; valueTextObject.alignment = TextAlignmentOptions.CenterGeoAligned; var nameText = newListSettingsController.gameObject.transform.Find("NameText"); nameText.localScale = new Vector3(0.85f, 0.85f, 0.85f); value.localScale = new Vector3(0.7f, 0.7f, 0.7f); if (hintText != String.Empty) { BeatSaberUI.AddHintText(nameText as RectTransform, hintText); } var dec = value.Find("DecButton"); dec.transform.localScale = new Vector3(0.7f, 0.7f, 0.7f); var inc = value.Find("IncButton"); inc.transform.localScale = new Vector3(0.7f, 0.7f, 0.7f); value.localPosition -= new Vector3(8, 0.3f); gameObject.SetActive(false); initialized = true; } catch (Exception e) { Console.WriteLine($"Exception when trying to instantiate list option {e.ToString()}"); } }