private void AddHoverHint(RectTransform rectTransform, string text) { HoverHint hover = rectTransform.gameObject.AddComponent <HoverHint>(); hover.text = text; hover.SetField("_hoverHintController", Resources.FindObjectsOfTypeAll <HoverHintController>().First()); }
private void CreateRefreshButton() { GameObject gameObject = _container.InstantiatePrefab(_playerOptionsViewController.transform.Find("PlayerOptions/ViewPort/Content/CommonSection/PlayerHeight/MeassureButton").gameObject, transform); GameObject iconObject = gameObject.transform.Find("Icon").gameObject; gameObject.name = "RefreshButton"; RectTransform rectTransform = (RectTransform)gameObject.transform; rectTransform.anchorMin = new Vector2(1, 0); rectTransform.anchorMax = new Vector2(1, 0); rectTransform.offsetMin = new Vector2(-12, 2); rectTransform.offsetMax = new Vector2(-2, 10); Button button = gameObject.GetComponent <Button>(); button.onClick.AddListener(OnRefreshButtonPressed); button.transform.SetParent(transform); ImageView image = iconObject.GetComponent <ImageView>(); image.sprite = LoadSpriteFromResource("CustomAvatar.Resources.arrows-rotate.png"); HoverHint hoverHint = _container.InstantiateComponent <HoverHint>(gameObject); hoverHint.text = "Force reload all avatars, including the one currently spawned. This will most likely lag your game for a few seconds if you have many avatars loaded."; Destroy(gameObject.GetComponent <LocalizedHoverHint>()); }
private static IEnumerator AddModListButton() { yield return(_bottomPanelExists); Logger.log.Debug("Adding button to main menu"); lock (Instance) { if (menuFlow == null) { menuFlow = new GameObject("BSIPA Mod List Flow Controller").AddComponent <ModListFlowCoordinator>(); } if (panel == null) { panel = GameObject.Find(ControllerPanel).transform as RectTransform; } if (button == null) { button = BeatSaberUI.CreateUIButton(panel, CopyButton, () => { menuFlow.Present(); }, "Mod List"); panel.Find(CopyButton).SetAsLastSibling(); hintText = BeatSaberUI.AddHintText(button.transform as RectTransform, "View and control updates for installed mods"); } yield break; } }
private void AddHoverHint(RectTransform rectTransform, string text) { HoverHint hover = rectTransform.gameObject.AddComponent <HoverHint>(); hover.text = text; hover.SetField("_hoverHintController", BeatSaberUI.HoverHintController); }
/// <summary> /// Replace existing HoverHint on stat panel icons. /// </summary> /// <param name="button"></param> /// <param name="name"></param> /// <param name="text"></param> public static void SetHoverHint(RectTransform button, string name, string text) { HoverHint hover = button.gameObject.AddComponent <HoverHint>(); hover.text = text; hover.name = name; hover.SetField("_hoverHintController", Resources.FindObjectsOfTypeAll <HoverHintController>().First()); }
private static void DestroyHoverHint(RectTransform button) { HoverHint currentHoverHint = button.GetComponentsInChildren <HMUI.HoverHint>().First(); if (currentHoverHint != null) { GameObject.DestroyImmediate(currentHoverHint); } }
public MockPartyViewController() { _partyFlowCoordinator = Resources.FindObjectsOfTypeAll <PartyFreePlayFlowCoordinator>().FirstOrDefault(); LevelListViewController level = ReflectionUtil.GetPrivateField <LevelListViewController>(_partyFlowCoordinator, "_levelListViewController"); detail = ReflectionUtil.GetPrivateField <StandardLevelDetailViewController>(_partyFlowCoordinator, "_levelDetailViewController"); BeatmapDifficultyViewController beatmap = ReflectionUtil.GetPrivateField <BeatmapDifficultyViewController>(_partyFlowCoordinator, "_beatmapDifficultyViewController"); _gameplaySetupViewController = ReflectionUtil.GetPrivateField <GameplaySetupViewController>(_partyFlowCoordinator, "_gameplaySetupViewController"); level.didActivateEvent += (first, type) => { if (Data.Steam.SteamAPI.GetConnectionState() != SteamAPI.ConnectionState.CONNECTED || !_partyFlowCoordinator || !_partyFlowCoordinator.isActivated) { return; } _partyFlowCoordinator.InvokePrivateMethod("SetRightScreenViewController", new object[] { MultiplayerLobby.Instance.rightViewController, true }); }; level.didSelectLevelEvent += didSelectLevel; beatmap.didSelectDifficultyEvent += didSelectBeatmap; mPlay = BeatSaberUI.CreateUIButton(detail.rectTransform, "CreditsButton", new Vector2(0f, -24f), new Vector2(40, 9f)); mPlay.SetButtonText("Play with Lobby"); mPlay.SetButtonTextSize(5f); mPlay.gameObject.SetActive(false); mPlay.ToggleWordWrapping(false); mPlay.onClick.AddListener(didSelectPlay); _mainMenuController = Resources.FindObjectsOfTypeAll <MainMenuViewController>().FirstOrDefault(); Button partyButton = ReflectionUtil.GetPrivateField <Button>(_mainMenuController, "_partyButton"); HoverHint hint = Resources.FindObjectsOfTypeAll <HoverHint>().Where(x => x.text == "Play with your friends locally!").First(); _mainMenuController.didActivateEvent += (first, type) => { if (Data.Steam.SteamAPI.GetConnectionState() != SteamAPI.ConnectionState.CONNECTED) { partyButton.SetButtonText("Party"); if (hint) { hint.text = "Play with your friends locally!"; } } else { partyButton.SetButtonText("Online Lobby"); if (hint) { hint.text = "Play with your friends in your steam lobby!"; } } }; }
internal static HoverHint AddHoverHintToObject(GameObject gameObject) { HoverHint hoverHint = gameObject.AddComponent <HoverHint>(); if (hoverHintController == null) { hoverHintController = Resources.FindObjectsOfTypeAll <HoverHintController>().First(); } hoverHint.SetField("_hoverHintController", hoverHintController); return(hoverHint); }
public MockPartyViewController() { Instance = this; _partyFlowCoordinator = Resources.FindObjectsOfTypeAll <PartyFreePlayFlowCoordinator>().FirstOrDefault(); LevelPackLevelsViewController levels = ReflectionUtil.GetPrivateField <LevelPackLevelsViewController>(_partyFlowCoordinator, "_levelPackLevelsViewController"); LevelPacksViewController levelPacks = ReflectionUtil.GetPrivateField <LevelPacksViewController>(_partyFlowCoordinator, "_levelPacksViewController"); LevelPackDetailViewController levelPackDetail = ReflectionUtil.GetPrivateField <LevelPackDetailViewController>(_partyFlowCoordinator, "_levelPackDetailViewController"); StandardLevelDetailViewController detail = ReflectionUtil.GetPrivateField <StandardLevelDetailViewController>(_partyFlowCoordinator, "_levelDetailViewController"); detailView = ReflectionUtil.GetPrivateField <StandardLevelDetailView>(detail, "_standardLevelDetailView"); _gameplaySetupViewController = ReflectionUtil.GetPrivateField <GameplaySetupViewController>(_partyFlowCoordinator, "_gameplaySetupViewController"); LocalLeaderboardViewController leaderboard = ReflectionUtil.GetPrivateField <LocalLeaderboardViewController>(_partyFlowCoordinator, "_localLeaderboardViewController"); detail.didPresentContentEvent += (controller, type) => { if (type == StandardLevelDetailViewController.ContentType.OwnedAndReady) { didSelectLevel(detail.selectedDifficultyBeatmap); } }; detail.didChangeDifficultyBeatmapEvent += didSelectDifficultyBeatmap; detail.didPressPlayButtonEvent += didPressPlay; levelPackDetail.didActivateEvent += (firstActivation, type) => showLeaderboard(); leaderboard.didActivateEvent += (firstActivation, type) => showLeaderboard(); _mainMenuController = Resources.FindObjectsOfTypeAll <MainMenuViewController>().FirstOrDefault(); Button partyButton = ReflectionUtil.GetPrivateField <Button>(_mainMenuController, "_partyButton"); HoverHint hint = Resources.FindObjectsOfTypeAll <HoverHint>().Where(x => x.text == "Play with your friends locally!").First(); _mainMenuController.didActivateEvent += (first, type) => { if (Data.Steam.SteamAPI.GetConnectionState() != SteamAPI.ConnectionState.CONNECTED) { partyButton.SetButtonText("Party"); if (hint) { hint.text = "Play with your friends locally!"; } } else { partyButton.SetButtonText("Online Lobby"); if (hint) { hint.text = "Play with your friends in your steam lobby!"; } } }; }
public override void Instantiate() { gameObject = UnityEngine.Object.Instantiate(Resources.FindObjectsOfTypeAll <GameplayModifierToggle>().Where(g => g.transform.Find("BG"))?.Last().gameObject, Container); gameObject.name = optionName; gameObject.layer = Container.gameObject.layer; gameObject.transform.SetParent(Container); gameObject.transform.localPosition = Vector3.zero; gameObject.transform.localScale = Vector3.one; gameObject.transform.rotation = Quaternion.identity; gameObject.SetActive(false); // Add a separator for this menu option AddSeparator(Container); // Remove the multiplier text if the toggle has no multiplier if (multiplier == 0) { gameObject.AddComponent <ToggleNameOverride>(); } var currentToggle = gameObject.GetComponent <GameplayModifierToggle>(); if (currentToggle != null) { currentToggle.toggle.isOn = GetValue; currentToggle.toggle.onValueChanged.RemoveAllListeners(); currentToggle.toggle.onValueChanged.AddListener((bool e) => OnToggle?.Invoke(e)); currentToggle.name = optionName; GameplayModifierParamsSO _gameplayModifier = ScriptableObject.CreateInstance <GameplayModifierParamsSO>(); _gameplayModifier.SetPrivateField("_modifierName", optionName); _gameplayModifier.SetPrivateField("_hintText", hintText); _gameplayModifier.SetPrivateField("_multiplier", multiplier); _gameplayModifier.SetPrivateField("_icon", optionIcon == null ? UIUtilities.BlankSprite : optionIcon); currentToggle.SetPrivateField("_gameplayModifier", _gameplayModifier); if (hintText != String.Empty) { HoverHint hoverHint = currentToggle.GetPrivateField <HoverHint>("_hoverHint"); hoverHint.text = hintText; hoverHint.name = optionName; HoverHintController hoverHintController = Resources.FindObjectsOfTypeAll <HoverHintController>().First(); hoverHint.SetPrivateField("_hoverHintController", hoverHintController); } } initialized = true; }
//////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// /// <summary> /// Add a button to the grid /// </summary> /// <param name="p_Name">Button caption</param> /// <param name="p_Action">Button callback</param> private Button AddButton(string p_Name, Action p_Action) { var l_Button = m_ButtonCreator.CreateObject(m_ButtonGrid.transform); l_Button.GetComponentInChildren <TextMeshProUGUI>().text = p_Name; l_Button.GetComponent <Button>().onClick.RemoveAllListeners(); l_Button.GetComponent <Button>().onClick.AddListener(() => p_Action()); l_Button.GetComponent <LayoutElement>().preferredWidth = 35f; l_Button.GetComponent <LayoutElement>().preferredHeight = 10f; HoverHint l_HoverHint = l_Button.gameObject.AddComponent <HoverHint>(); l_HoverHint.text = p_Name; l_HoverHint.SetField("_hoverHintController", Resources.FindObjectsOfTypeAll <HoverHintController>().First()); return(l_Button.GetComponent <Button>()); }
private void SetupTweaks() { YouTubeDownloader.Instance.downloadProgress += VideoDownloaderDownloadProgress; _videoFlowCoordinator = gameObject.AddComponent <VideoFlowCoordinator>(); _videoFlowCoordinator.finished += VideoFlowCoordinatorFinished; _videoFlowCoordinator.Init(); BSEvents.levelSelected += HandleDidSelectLevel; var _levelDetailViewController = Resources.FindObjectsOfTypeAll <StandardLevelDetailViewController>().First(); var _buttons = _levelDetailViewController.transform.Find("LevelDetail/PlayContainer/PlayButtons"); var _playbutton = _buttons.GetComponentsInChildren <Button>().First(x => x.name == "PlayButton"); var _practiceButton = _buttons.GetComponentsInChildren <Button>().First(x => x.name == "PracticeButton"); var _coverImage = _levelDetailViewController.transform.Find("LevelDetail/Level/CoverImage"); _videoButton = Instantiate(_practiceButton, _coverImage); _videoButton.name = "VideoButton"; _videoButton.SetButtonIcon(Base64Sprites.PlayIcon); (_videoButton.transform as RectTransform).anchoredPosition = new Vector2(0, 0); (_videoButton.transform as RectTransform).anchorMax = new Vector2(0.5f, 0.5f); (_videoButton.transform as RectTransform).anchorMin = new Vector2(0.5f, 0.5f); (_videoButton.transform as RectTransform).sizeDelta = new Vector2(8, 8); _videoButton.onClick.AddListener(delegate() { _videoFlowCoordinator.Present(); }); _videoButtonHint = BeatSaberUI.AddHintText(_videoButton.transform as RectTransform, "Download a video"); var glow = _playbutton.GetComponentsInChildren <RectTransform>().First(x => x.name == "GlowContainer"); var videoWrapper = _videoButton.GetComponentsInChildren <RectTransform>().First(x => x.name == "Wrapper"); _videoButtonGlow = Instantiate(glow.gameObject, videoWrapper).gameObject.GetComponentInChildren <Image>(); var hlg = _videoButton.GetComponentsInChildren <HorizontalLayoutGroup>().First(x => x.name == "Content"); hlg.padding = new RectOffset(3, 2, 2, 2); _progressCircle = videoWrapper.GetComponentsInChildren <Image>().First(x => x.name == "Stroke"); _progressCircle.type = Image.Type.Filled; _progressCircle.fillMethod = Image.FillMethod.Radial360; _progressCircle.fillAmount = 1f; }
private void SetupTweaks() { YouTubeDownloader.Instance.downloadProgress += VideoDownloaderDownloadProgress; _videoFlowCoordinator = gameObject.AddComponent <VideoFlowCoordinator>(); _videoFlowCoordinator.finished += VideoFlowCoordinatorFinished; _videoFlowCoordinator.Init(); _difficultyViewController = Resources.FindObjectsOfTypeAll <BeatmapDifficultyViewController>().FirstOrDefault(); _difficultyViewController.didSelectDifficultyEvent += DifficultyViewControllerDidSelectDifficultyEvent; var _detailViewController = Resources.FindObjectsOfTypeAll <StandardLevelDetailViewController>().First(x => x.name == "StandardLevelDetailViewController"); RectTransform buttonsRect = _detailViewController.GetComponentsInChildren <RectTransform>().First(x => x.name == "Buttons"); var _playbutton = buttonsRect.GetComponentsInChildren <Button>().First(x => x.name == "PlayButton"); var _practiceButton = buttonsRect.GetComponentsInChildren <Button>().First(x => x.name == "PracticeButton"); _videoButton = Instantiate(_practiceButton, buttonsRect.parent); _videoButton.name = "VideoButton"; _videoButton.SetButtonIcon(Base64Sprites.PlayIcon); (_videoButton.transform as RectTransform).anchoredPosition = new Vector2(46, -6); (_videoButton.transform as RectTransform).sizeDelta = new Vector2(8, 8); _videoButton.onClick.AddListener(delegate() { _videoFlowCoordinator.Present(); }); _videoButtonHint = BeatSaberUI.AddHintText(_videoButton.transform as RectTransform, "Download a video"); var glow = _playbutton.GetComponentsInChildren <RectTransform>().First(x => x.name == "GlowContainer"); var videoWrapper = _videoButton.GetComponentsInChildren <RectTransform>().First(x => x.name == "Wrapper"); _videoButtonGlow = Instantiate(glow.gameObject, videoWrapper).gameObject.GetComponentInChildren <Image>(); var hlg = _videoButton.GetComponentsInChildren <HorizontalLayoutGroup>().First(x => x.name == "Content"); hlg.padding = new RectOffset(3, 2, 2, 2); _progressCircle = videoWrapper.GetComponentsInChildren <Image>().First(x => x.name == "Stroke"); _progressCircle.type = Image.Type.Filled; _progressCircle.fillMethod = Image.FillMethod.Radial360; _progressCircle.fillAmount = 1f; }
public SPHUI() { var playButton = Resources.FindObjectsOfTypeAll <Button>().First(x => x.name == "PlayButton"); var hiddenButton = UnityEngine.Object.Instantiate(playButton, BeatSaberUI.PlayerStatsContainer.transform); (hiddenButton.transform as RectTransform).SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, 0.0f, 70.0f); hiddenButton.name = "HoverArea"; string[] gone = { "BG", "GlowContainer", "Stroke", "Text" }; foreach (var t in hiddenButton.GetComponentsInChildren <RectTransform>().Where(x => gone.Contains(x.name))) { UnityEngine.Object.Destroy(t.gameObject); } var hoverHintController = Resources.FindObjectsOfTypeAll <HoverHintController>().First(); var hoverHintHolder = hiddenButton.GetComponentsInChildren <StackLayoutGroup>().First(); _hoverHint = hoverHintHolder.gameObject.AddComponent <HoverHint>(); _hoverHint.SetPrivateField("_hoverHintController", hoverHintController); _hoverHint.text = ""; _maxCombo = BeatSaberUI.PlayerStatsContainer.GetComponentsInChildren <RectTransform>().First(x => x.name == "MaxCombo"); _highscore = BeatSaberUI.PlayerStatsContainer.GetComponentsInChildren <RectTransform>().First(x => x.name == "Highscore"); _maxRank = BeatSaberUI.PlayerStatsContainer.GetComponentsInChildren <RectTransform>().First(x => x.name == "MaxRank"); }
public static GameObject CreateMaterialSwapPanel(Transform parent, PartEditor.MatList matList, string panelLabel) { RectTransform newPanel = CreateRectPanel(parent, panelLabel); TextMeshProUGUI matNameText = BeatSaberUI.CreateText(newPanel, "mat name", new Vector2(20, 0), new Vector2(30, 10)); matNameText.alignment = TextAlignmentOptions.Center; matNameText.fontSize = 4; HoverHint matHoverHint = BeatSaberUI.AddHintText(matNameText.gameObject.GetComponent <RectTransform>(), "hint"); LabelTextGroup textGroup = new LabelTextGroup(matNameText, matHoverHint, matList); matTextGroups.Add(textGroup); //cry BeatSaberUI.CreateUIButton(newPanel, "DecButton", new Vector2(0, 0), new Vector2(8, 8), delegate { PartEditor.MoveThroughMatList(-1, matList); }); BeatSaberUI.CreateUIButton(newPanel, "IncButton", new Vector2(50, 0), new Vector2(8, 8), delegate { PartEditor.MoveThroughMatList(1, matList); }); //to set name and hint strings UpdateMatLabelText(textGroup); return(newPanel.gameObject); }
public static GameObject CreateModelSwapPanel(Transform parent, PartEditor.PartList partList, string panelLabel) { RectTransform newPanel = CreateRectPanel(parent, panelLabel); TextMeshProUGUI partNameText = BeatSaberUI.CreateText(newPanel, "part name", new Vector2(20, 0), new Vector2(30, 10)); partNameText.alignment = TextAlignmentOptions.Center; partNameText.fontSize = 4; HoverHint modelHoverHint = BeatSaberUI.AddHintText(partNameText.gameObject.GetComponent <RectTransform>(), "hint"); LabelTextGroup textGroup = new LabelTextGroup(partNameText, modelHoverHint, partList); partTextGroups.Add(textGroup); //cry delegate won't let me pass int as a ref, hence faff with index arrays BeatSaberUI.CreateUIButton(newPanel, "DecButton", new Vector2(0, 0), new Vector2(8, 8), delegate { PartEditor.MoveThroughPartList(-1, partList); }); BeatSaberUI.CreateUIButton(newPanel, "IncButton", new Vector2(50, 0), new Vector2(8, 8), delegate { PartEditor.MoveThroughPartList(1, partList); }); //to set name and hint strings UpdatePartLabelText(textGroup); return(newPanel.gameObject); }
public void Init() { // Buttons _backButton = BeatSaberUI.CreateBackButton(rectTransform as RectTransform, delegate() { backButtonPressed?.Invoke(); }); _listButton = BeatSaberUI.CreateUIButton(rectTransform, "CreditsButton", new Vector2(60, 30), new Vector2(30, 8), () => { listButtonPressed?.Invoke(); }, "Search"); _downloadDeleteButton = BeatSaberUI.CreateUIButton(rectTransform, "CreditsButton", new Vector2(60, 20), new Vector2(30, 8), () => { downloadDeleteButtonPressed?.Invoke(); }, "Delete"); _previewButton = BeatSaberUI.CreateUIButton(rectTransform, "CreditsButton", new Vector2(60, -30), new Vector2(30, 8), () => { previewButtonPressed?.Invoke(); }, "Preview"); _loopButton = BeatSaberUI.CreateUIButton(rectTransform, "CreditsButton", new Vector2(60, -20), new Vector2(30, 8), () => { loopButtonPressed?.Invoke(); }, "Loop"); _addOffset = BeatSaberUI.CreateUIButton(rectTransform, "CreditsButton", new Vector2(71, -10), new Vector2(8, 8), null, "+"); (_addOffset.transform.Find("Wrapper") as RectTransform).sizeDelta = new Vector2(8, 8); _subOffset = Instantiate(_addOffset, rectTransform); (_subOffset.transform as RectTransform).anchoredPosition = new Vector2(49, -10); _subOffset.SetButtonText("-"); _subOffset.onClick.AddListener(() => { subOffsetPressed?.Invoke(); }); _addOffset.onClick.AddListener(() => { addOffsetPressed?.Invoke(); }); BeatSaberUI.AddHintText(_addOffset.transform as RectTransform, "Video is behind music\nStart the video earlier"); BeatSaberUI.AddHintText(_subOffset.transform as RectTransform, "Video is ahead of music\nStart the video later"); _addOffset.interactable = true; _subOffset.interactable = true; _offsetText = BeatSaberUI.CreateText(rectTransform, "?", new Vector2(60, -10)); _offsetText.rectTransform.sizeDelta = new Vector2(14, 8); _offsetText.alignment = TextAlignmentOptions.Center; _offsetText.color = Color.white; var _offsetTitle = BeatSaberUI.CreateText(rectTransform, "Video Offset", new Vector2(60, -3)); _offsetTitle.rectTransform.sizeDelta = new Vector2(30, 8); _offsetTitle.alignment = TextAlignmentOptions.Center; ChangeOffsetMagnitude = BeatSaberUI.CreateUIButton(rectTransform, "CreditsButton", new Vector2(60, 5), new Vector2(32, 8), null, "offset (ms)"); ChangeOffsetMagnitude.onClick.AddListener(() => { changeOffsetMagnitudePressed?.Invoke(); }); // Video data _thumbnail = Instantiate(Resources.FindObjectsOfTypeAll <Image>().First(x => x.name == "CoverImage"), rectTransform); _thumbnail.rectTransform.anchorMin = new Vector2(0.5f, 1f); _thumbnail.rectTransform.anchorMax = new Vector2(0.5f, 1f); _thumbnail.rectTransform.pivot = new Vector2(0.5f, 1); _thumbnail.rectTransform.anchoredPosition = new Vector2(0, -5); var height = 30f; var width = 16f / 9f * height; _thumbnail.rectTransform.sizeDelta = new Vector2(width, height); _thumbnail.preserveAspect = false; _thumbnail.sprite = null; _thumbnail.transform.SetAsLastSibling(); _title = BeatSaberUI.CreateText(rectTransform, "TITLE", new Vector2(0, 0)); _title.alignment = TextAlignmentOptions.Top; _title.maxVisibleLines = 1; _title.fontSize = 6; _title.rectTransform.sizeDelta = new Vector2(100, 10); _uploader = BeatSaberUI.CreateText(rectTransform, "UPLOADER", new Vector2(0, -7)); _uploader.alignment = TextAlignmentOptions.Left; _uploader.color = Color.white * 0.9f; _uploader.rectTransform.sizeDelta = new Vector2(80, 5); _duration = BeatSaberUI.CreateText(rectTransform, "[00:00]", new Vector2(0, -7)); _duration.alignment = TextAlignmentOptions.Right; _duration.color = Color.white * 0.9f; _duration.rectTransform.sizeDelta = new Vector2(80, 5); _description = BeatSaberUI.CreateText(rectTransform, "DESCRIPTION", new Vector2(0, -14)); _description.alignment = TextAlignmentOptions.TopLeft; _description.rectTransform.sizeDelta = new Vector2(80, 10); _description.enableWordWrapping = true; _description.maxVisibleLines = 5; Button _playbutton = GameObject.Find("PlayButton").GetComponent <Button>(); var _progressButton = Instantiate(_playbutton, _thumbnail.transform); _progressButton.name = "DownloadProgress"; (_progressButton.transform as RectTransform).anchorMax = new Vector2(0.5f, 0.5f); (_progressButton.transform as RectTransform).anchorMin = new Vector2(0.5f, 0.5f); (_progressButton.transform as RectTransform).anchoredPosition = new Vector2(0, 0); (_progressButton.transform as RectTransform).pivot = new Vector2(0.5f, 0.5f); (_progressButton.transform as RectTransform).sizeDelta = new Vector2(18, 18); _progressText = _progressButton.GetComponentInChildren <TextMeshProUGUI>(); _progressText.text = "100%"; _progressRingGlow = _progressButton.GetComponentsInChildren <Image>().First(x => x.name == "Glow"); Destroy(_progressButton); _progressRingGlow.gameObject.SetActive(false); var hlg = _progressButton.GetComponentsInChildren <HorizontalLayoutGroup>().First(x => x.name == "Content"); hlg.padding = new RectOffset(2, 2, 2, 2); _progressCircle = _progressButton.GetComponentsInChildren <Image>().First(x => x.name == "Stroke"); _progressCircle.type = Image.Type.Filled; _progressCircle.fillMethod = Image.FillMethod.Radial360; _progressCircle.fillAmount = 1f; _hoverHint = BeatSaberUI.AddHintText(_thumbnail.transform as RectTransform, "Banana banana banana"); }
public KEY(KEYBOARD kb, Vector2 position, string text, float width, float height, Color color) { value = text; this.kb = kb; name = text; mybutton = Button.Instantiate(kb.BaseButton, kb.container, false); (mybutton.transform as RectTransform).anchorMin = new Vector2(0.5f, 0.5f); (mybutton.transform as RectTransform).anchorMax = new Vector2(0.5f, 0.5f); TMP_Text txt = mybutton.GetComponentInChildren <TMP_Text>(); mybutton.ToggleWordWrapping(false); mybutton.transform.localScale = new Vector3(kb.scale, kb.scale, 1.0f); mybutton.SetButtonTextSize(5f); mybutton.SetButtonText(text); mybutton.name = $"SRM_{text}"; mybutton.GetComponentInChildren <Image>().color = color; if (width == 0) { Vector2 v = txt.GetPreferredValues(text); v.x += 10f; v.y += 2f; width = v.x; } // Adjust starting position so button aligns to upper left of current drawing position position.x += kb.scale * width / 2; position.y -= kb.scale * height / 2; (mybutton.transform as RectTransform).anchoredPosition = position; (mybutton.transform as RectTransform).sizeDelta = new Vector2(width, height); kb.currentposition.x += width * kb.scale + kb.padding; mybutton.onClick.RemoveAllListeners(); mybutton.onClick.AddListener(delegate() { if (keyaction != null) { keyaction(this); kb.DrawCursor(); return; } if (value.EndsWith("%CR%")) { kb.KeyboardText.text += value.Substring(0, value.Length - 4); kb.Enter(this); kb.DrawCursor(); return; } { string x = kb.Shift ? shifted : value; if (x == "") { x = value; } if (kb.Caps) { x = value.ToUpper(); } kb.KeyboardText.text += x; kb.DrawCursor(); } }); HoverHint _MyHintText = UIHelper.AddHintText(mybutton.transform as RectTransform, value); }
protected override void DidActivate(bool firstActivation, ActivationType type) { if (firstActivation) { if (!SongCore.Loader.AreSongsLoaded) { SongCore.Loader.SongsLoadedEvent += SongLoader_SongsLoadedEvent; } // get table cell instance _requestListTableCellInstance = Resources.FindObjectsOfTypeAll <LevelListTableCell>().First((LevelListTableCell x) => x.name == "LevelListTableCell"); // initialize Yes/No modal YesNoModal.instance.Setup(); _songPreviewPlayer = Resources.FindObjectsOfTypeAll <SongPreviewPlayer>().FirstOrDefault(); RectTransform container = new GameObject("RequestBotContainer", typeof(RectTransform)).transform as RectTransform; container.SetParent(rectTransform, false); container.sizeDelta = new Vector2(60f, 0f); #region TableView Setup and Initialization var go = new GameObject("SongRequestTableView", typeof(RectTransform)); go.SetActive(false); _songListTableView = go.AddComponent <TableView>(); _songListTableView.gameObject.AddComponent <RectMask2D>(); _songListTableView.transform.SetParent(container, false); _songListTableView.SetField("_preallocatedCells", new TableView.CellsGroup[0]); _songListTableView.SetField("_isInitialized", false); var viewport = new GameObject("Viewport").AddComponent <RectTransform>(); viewport.SetParent(go.GetComponent <RectTransform>(), false); (viewport.transform as RectTransform).sizeDelta = new Vector2(0, 0); (viewport.transform as RectTransform).anchorMin = new Vector2(0, 0); (viewport.transform as RectTransform).anchorMax = new Vector2(1, 1); go.GetComponent <ScrollRect>().viewport = viewport; _songListTableView.InvokeMethod <object, TableView>("Init"); _songListTableView.dataSource = this; go.SetActive(true); (_songListTableView.transform as RectTransform).anchorMin = new Vector2(0f, 0f); (_songListTableView.transform as RectTransform).anchorMax = new Vector2(1f, 1f); (_songListTableView.transform as RectTransform).sizeDelta = new Vector2(0f, 60f); (_songListTableView.transform as RectTransform).anchoredPosition = new Vector2(0f, -3f); _songListTableView.didSelectCellWithIdxEvent += DidSelectRow; rectTransform.anchorMin = new Vector2(0.5f, 0f); rectTransform.anchorMax = new Vector2(0.5f, 1f); rectTransform.sizeDelta = new Vector2(74f, 0f); rectTransform.pivot = new Vector2(0.4f, 0.5f); var _songListTableViewScroller = _songListTableView.GetField <TableViewScroller, TableView>("_scroller"); _pageUpButton = Instantiate(Resources.FindObjectsOfTypeAll <Button>().Last(x => (x.name == "PageUpButton")), container, false); (_pageUpButton.transform as RectTransform).anchoredPosition = new Vector2(0f, 35f); _pageUpButton.interactable = true; _pageUpButton.onClick.AddListener(delegate() { _songListTableViewScroller.PageScrollUp(); }); _pageDownButton = Instantiate(Resources.FindObjectsOfTypeAll <Button>().First(x => (x.name == "PageDownButton")), container, false); (_pageDownButton.transform as RectTransform).anchoredPosition = new Vector2(0f, -41f); _pageDownButton.interactable = true; _pageDownButton.onClick.AddListener(delegate() { _songListTableViewScroller.PageScrollDown(); }); #endregion CenterKeys = new KEYBOARD(container, "", false, -15, 15); #if UNRELEASED // BUG: Need additional modes disabling one shot buttons // BUG: Need to make sure the buttons are usable on older headsets _CurrentSongName = BeatSaberUI.CreateText(container, "", new Vector2(-35, 37f)); _CurrentSongName.fontSize = 3f; _CurrentSongName.color = Color.cyan; _CurrentSongName.alignment = TextAlignmentOptions.Left; _CurrentSongName.enableWordWrapping = false; _CurrentSongName.text = ""; _CurrentSongName2 = BeatSaberUI.CreateText(container, "", new Vector2(-35, 34f)); _CurrentSongName2.fontSize = 3f; _CurrentSongName2.color = Color.cyan; _CurrentSongName2.alignment = TextAlignmentOptions.Left; _CurrentSongName2.enableWordWrapping = false; _CurrentSongName2.text = ""; //CenterKeys.AddKeys(SONGLISTKEY); if (!RequestBot.AddKeyboard(CenterKeys, "mainpanel.kbd")) { CenterKeys.AddKeys(SONGLISTKEY); } ColorDeckButtons(CenterKeys, Color.white, Color.magenta); #endif RequestBot.AddKeyboard(CenterKeys, "CenterPanel.kbd"); CenterKeys.DefaultActions(); #region History button // History button _historyButton = Instantiate(Resources.FindObjectsOfTypeAll <Button>().First(o => (o.name == "OkButton")), container, false); _historyButton.ToggleWordWrapping(false); (_historyButton.transform as RectTransform).anchoredPosition = new Vector2(90f, 30f); _historyButton.SetButtonText("History"); _historyButton.onClick.RemoveAllListeners(); _historyButton.onClick.AddListener(delegate() { isShowingHistory = !isShowingHistory; RequestBot.SetTitle(isShowingHistory ? "Song Request History" : "Song Request Queue"); UpdateRequestUI(true); SetUIInteractivity(); _lastSelection = -1; }); _historyHintText = UIHelper.AddHintText(_historyButton.transform as RectTransform, ""); #endregion #region Blacklist button // Blacklist button _blacklistButton = Instantiate(Resources.FindObjectsOfTypeAll <Button>().First(o => (o.name == "OkButton")), container, false); _blacklistButton.ToggleWordWrapping(false); (_blacklistButton.transform as RectTransform).anchoredPosition = new Vector2(90f, 10f); _blacklistButton.SetButtonText("Blacklist"); //_blacklistButton.GetComponentInChildren<Image>().color = Color.red; _blacklistButton.onClick.RemoveAllListeners(); _blacklistButton.onClick.AddListener(delegate() { if (NumberOfCells() > 0) { void _onConfirm() { RequestBot.Blacklist(_selectedRow, isShowingHistory, true); if (_selectedRow > 0) { _selectedRow--; } confirmDialogActive = false; } // get song var song = SongInfoForRow(_selectedRow).song; // indicate dialog is active confirmDialogActive = true; // show dialog YesNoModal.instance.ShowDialog("Blacklist Song Warning", $"Blacklisting {song["songName"].Value} by {song["authorName"].Value}\r\nDo you want to continue?", _onConfirm, () => { confirmDialogActive = false; }); } }); UIHelper.AddHintText(_blacklistButton.transform as RectTransform, "Block the selected request from being queued in the future."); #endregion #region Skip button // Skip button _skipButton = Instantiate(Resources.FindObjectsOfTypeAll <Button>().First(o => (o.name == "OkButton")), container, false); _skipButton.ToggleWordWrapping(false); (_skipButton.transform as RectTransform).anchoredPosition = new Vector2(90f, 0f); _skipButton.SetButtonText("Skip"); //_skipButton.GetComponentInChildren<Image>().color = Color.yellow; _skipButton.onClick.RemoveAllListeners(); _skipButton.onClick.AddListener(delegate() { if (NumberOfCells() > 0) { void _onConfirm() { // get selected song currentsong = SongInfoForRow(_selectedRow); // skip it RequestBot.Skip(_selectedRow); // select previous song if not first song if (_selectedRow > 0) { _selectedRow--; } // indicate dialog is no longer active confirmDialogActive = false; } // get song var song = SongInfoForRow(_selectedRow).song; // indicate dialog is active confirmDialogActive = true; // show dialog YesNoModal.instance.ShowDialog("Skip Song Warning", $"Skipping {song["songName"].Value} by {song["authorName"].Value}\r\nDo you want to continue?", _onConfirm, () => { confirmDialogActive = false; }); } }); UIHelper.AddHintText(_skipButton.transform as RectTransform, "Remove the selected request from the queue."); #endregion #region Play button // Play button _playButton = Instantiate(Resources.FindObjectsOfTypeAll <Button>().First(o => (o.name == "OkButton")), container, false); _playButton.ToggleWordWrapping(false); (_playButton.transform as RectTransform).anchoredPosition = new Vector2(90f, -10f); _playButton.SetButtonText("Play"); _playButton.GetComponentInChildren <Image>().color = Color.green; _playButton.onClick.RemoveAllListeners(); _playButton.onClick.AddListener(delegate() { if (NumberOfCells() > 0) { currentsong = SongInfoForRow(_selectedRow); RequestBot.played.Add(currentsong.song); RequestBot.WriteJSON(RequestBot.playedfilename, ref RequestBot.played); SetUIInteractivity(false); RequestBot.Process(_selectedRow, isShowingHistory); _selectedRow = -1; } }); UIHelper.AddHintText(_playButton.transform as RectTransform, "Download and scroll to the currently selected request."); #endregion #region Queue button // Queue button _queueButton = Instantiate(Resources.FindObjectsOfTypeAll <Button>().First(o => (o.name == "OkButton")), container, false); _queueButton.ToggleWordWrapping(false); _queueButton.SetButtonTextSize(3.5f); (_queueButton.transform as RectTransform).anchoredPosition = new Vector2(90f, -30f); _queueButton.SetButtonText(RequestBotConfig.Instance.RequestQueueOpen ? "Queue Open" : "Queue Closed"); _queueButton.GetComponentInChildren <Image>().color = RequestBotConfig.Instance.RequestQueueOpen ? Color.green : Color.red;; _queueButton.interactable = true; _queueButton.onClick.RemoveAllListeners(); _queueButton.onClick.AddListener(delegate() { RequestBotConfig.Instance.RequestQueueOpen = !RequestBotConfig.Instance.RequestQueueOpen; RequestBotConfig.Instance.Save(); RequestBot.WriteQueueStatusToFile(RequestBotConfig.Instance.RequestQueueOpen ? "Queue is open." : "Queue is closed."); RequestBot.Instance.QueueChatMessage(RequestBotConfig.Instance.RequestQueueOpen ? "Queue is open." : "Queue is closed."); UpdateRequestUI(); }); UIHelper.AddHintText(_queueButton.transform as RectTransform, "Open/Close the queue."); #endregion // Set default RequestFlowCoordinator title RequestBot.SetTitle(isShowingHistory ? "Song Request History" : "Song Request Queue"); } base.DidActivate(firstActivation, type); UpdateRequestUI(); SetUIInteractivity(true); }
public override void Instantiate() { //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); gameObject = UnityEngine.Object.Instantiate(Resources.FindObjectsOfTypeAll <GameplayModifierToggle>().Where(g => g.transform.Find("BG"))?.Last().gameObject, container); gameObject.name = optionName; gameObject.layer = container.gameObject.layer; gameObject.transform.SetParent(container); gameObject.transform.localPosition = Vector3.zero; gameObject.transform.localScale = Vector3.one; gameObject.transform.rotation = Quaternion.identity; gameObject.SetActive(false); foreach (Transform t in container) { if (t.name.StartsWith("Separator")) { separator = UnityEngine.Object.Instantiate(t.gameObject, container); separator.name = "ExtraSeparator"; separator.SetActive(false); break; } } string ConflictText = "\r\n\r\n<size=60%><color=#ff0000ff><b>Conflicts </b></color>"; var currentToggle = gameObject.GetComponent <GameplayModifierToggle>(); if (currentToggle != null) { currentToggle.toggle.isOn = GetValue; currentToggle.toggle.onValueChanged.RemoveAllListeners(); currentToggle.toggle.onValueChanged.AddListener((bool e) => OnToggle?.Invoke(e)); currentToggle.name = optionName.Replace(" ", ""); GameplayModifierToggle[] gameplayModifierToggles = Resources.FindObjectsOfTypeAll <GameplayModifierToggle>(); if (conflicts.Count > 0) { hintText += ConflictText; foreach (string conflict in conflicts) { var conflictingModifier = gameplayModifierToggles.Where(t => t?.gameplayModifier?.modifierName == conflict).FirstOrDefault(); if (conflictingModifier) { if (!hintText.Contains(ConflictText)) { hintText += ConflictText; } hintText += Char.ConvertFromUtf32((char)0xE069) + conflict + Char.ConvertFromUtf32((char)0xE069); } } } GameplayModifierParamsSO _gameplayModifier = new GameplayModifierParamsSO(); _gameplayModifier.SetPrivateField("_modifierName", optionName); _gameplayModifier.SetPrivateField("_hintText", hintText); _gameplayModifier.SetPrivateField("_multiplier", multiplier); _gameplayModifier.SetPrivateField("_icon", optionIcon == null ? UIUtilities.BlankSprite : optionIcon); currentToggle.SetPrivateField("_gameplayModifier", _gameplayModifier); string currentDisplayName = Char.ConvertFromUtf32((char)0xE069) + optionName + Char.ConvertFromUtf32((char)0xE069); foreach (string conflictingModifierName in conflicts) { GameplayModifierToggle conflictToggle = gameplayModifierToggles.Where(t => t?.gameplayModifier?.modifierName == conflictingModifierName).FirstOrDefault(); if (conflictToggle) { if (!conflictToggle.gameplayModifier.hintText.Contains(ConflictText)) { conflictToggle.gameplayModifier.SetPrivateField("_hintText", conflictToggle.gameplayModifier.hintText + ConflictText); } if (!conflictToggle.gameplayModifier.hintText.Contains(currentDisplayName)) { conflictToggle.gameplayModifier.SetPrivateField("_hintText", conflictToggle.gameplayModifier.hintText + currentDisplayName); } conflictToggle.toggle.onValueChanged.AddListener((e) => { if (e) { currentToggle.toggle.isOn = false; } }); currentToggle.toggle.onValueChanged.AddListener((e) => { if (e) { conflictToggle.toggle.isOn = false; } }); } } if (hintText != String.Empty) { HoverHint hoverHint = currentToggle.GetPrivateField <HoverHint>("_hoverHint"); hoverHint.text = hintText; hoverHint.name = optionName; HoverHintController hoverHintController = Resources.FindObjectsOfTypeAll <HoverHintController>().First(); hoverHint.SetPrivateField("_hoverHintController", hoverHintController); } } initialized = true; }
public KEY(KEYBOARD kb, Vector2 position, string text, float width, float height, Color color) { value = text; this.kb = kb; name = text; mybutton = Button.Instantiate(kb.BaseButton, kb.container, false); GameObject.Destroy(mybutton.GetComponent <UIKeyboardKey>()); Polyglot.LocalizedTextMeshProUGUI localizer = mybutton.GetComponentInChildren <Polyglot.LocalizedTextMeshProUGUI>(true); if (localizer != null) { GameObject.Destroy(localizer); } ExternalComponents externalComponents = mybutton.gameObject.AddComponent <ExternalComponents>(); TextMeshProUGUI textMesh = mybutton.GetComponentInChildren <TextMeshProUGUI>(); textMesh.richText = true; externalComponents.components.Add(textMesh); (mybutton.transform as RectTransform).anchorMin = new Vector2(0.5f, 0.5f); (mybutton.transform as RectTransform).anchorMax = new Vector2(0.5f, 0.5f); TMP_Text txt = mybutton.GetComponentInChildren <TMP_Text>(); mybutton.ToggleWordWrapping(false); mybutton.transform.localScale = new Vector3(kb.scale, kb.scale, 1.0f); mybutton.SetButtonTextSize(5f); mybutton.SetButtonText(text); mybutton.GetComponentInChildren <Image>().color = color; if (width == 0) { Vector2 v = txt.GetPreferredValues(text); v.x += 10f; v.y += 2f; width = v.x; } // Adjust starting position so button aligns to upper left of current drawing position position.x += kb.scale * width / 2; position.y -= kb.scale * height / 2; (mybutton.transform as RectTransform).anchoredPosition = position; (mybutton.transform as RectTransform).sizeDelta = new Vector2(width, height); kb.currentposition.x += width * kb.scale + kb.padding; mybutton.onClick.RemoveAllListeners(); mybutton.onClick.AddListener(delegate() { if (keyaction != null) { keyaction(this); kb.DrawCursor(); return; } if (value.EndsWith("%CR%")) { kb.KeyboardText.text += value.Substring(0, value.Length - 4); kb.Enter(this); kb.DrawCursor(); return; } string x = kb.Shift ? shifted : value; if (x == "") { x = value; } if (kb.Caps) { x = value.ToUpper(); } kb.KeyboardText.text += x; kb.DrawCursor(); }); HoverHint _MyHintText = mybutton.gameObject.AddComponent <HoverHint>(); _MyHintText.text = value; _MyHintText.SetField("_hoverHintController", Resources.FindObjectsOfTypeAll <HoverHintController>().First()); }
protected override void DidActivate(bool firstActivation, bool addedToHierarchy, bool screenSystemEnabling) { if (firstActivation) { if (!SongCore.Loader.AreSongsLoaded) { SongCore.Loader.SongsLoadedEvent += SongLoader_SongsLoadedEvent; } Plugin.Log("DidActivate 001"); // get table cell instance _requestListTableCellInstance = Resources.FindObjectsOfTypeAll <LevelListTableCell>().First((LevelListTableCell x) => x.name == "LevelListTableCell"); // initialize Yes/No modal YesNoModal.instance.Setup(); Plugin.Log("DidActivate 002"); _songPreviewPlayer = Resources.FindObjectsOfTypeAll <SongPreviewPlayer>().FirstOrDefault(); RectTransform container = new GameObject("RequestBotContainer", typeof(RectTransform)).transform as RectTransform; container.SetParent(rectTransform, false); #region TableView Setup and Initialization var go = new GameObject("SongRequestTableView", typeof(RectTransform)); go.SetActive(false); go.AddComponent <ScrollRect>(); go.AddComponent <Touchable>(); go.AddComponent <EventSystemListener>(); ScrollView scrollView = go.AddComponent <ScrollView>(); _songListTableView = go.AddComponent <TableView>(); go.AddComponent <RectMask2D>(); _songListTableView.transform.SetParent(container, false); _songListTableView.SetField("_preallocatedCells", new TableView.CellsGroup[0]); _songListTableView.SetField("_isInitialized", false); _songListTableView.SetField("_scrollView", scrollView); var viewport = new GameObject("Viewport").AddComponent <RectTransform>(); viewport.SetParent(go.GetComponent <RectTransform>(), false); go.GetComponent <ScrollRect>().viewport = viewport; (viewport.transform as RectTransform).sizeDelta = new Vector2(70f, 70f); RectTransform content = new GameObject("Content").AddComponent <RectTransform>(); content.SetParent(viewport, false); scrollView.SetField("_contentRectTransform", content); scrollView.SetField("_viewport", viewport); _songListTableView.SetDataSource(this, false); _songListTableView.LazyInit(); go.SetActive(true); (_songListTableView.transform as RectTransform).sizeDelta = new Vector2(70f, 70f); (_songListTableView.transform as RectTransform).anchoredPosition = new Vector2(3f, 0f); _songListTableView.didSelectCellWithIdxEvent += DidSelectRow; _pageUpButton = UIHelper.CreateUIButton("SRMPageUpButton", container, "PracticeButton", new Vector2(0f, 38.5f), new Vector2(15f, 7f), () => { scrollView.PageUpButtonPressed(); }, "˄"); Destroy(_pageUpButton.GetComponentsInChildren <ImageView>().FirstOrDefault(x => x.name == "Underline")); _pageDownButton = UIHelper.CreateUIButton("SRMPageDownButton", container, "PracticeButton", new Vector2(0f, -38.5f), new Vector2(15f, 7f), () => { scrollView.PageDownButtonPressed(); }, "˅"); Destroy(_pageDownButton.GetComponentsInChildren <ImageView>().FirstOrDefault(x => x.name == "Underline")); #endregion CenterKeys = new KEYBOARD(container, "", false, -15, 15); #if UNRELEASED // BUG: Need additional modes disabling one shot buttons // BUG: Need to make sure the buttons are usable on older headsets Plugin.Log("DidActivate 005"); _CurrentSongName = BeatSaberUI.CreateText(container, "", new Vector2(-35, 37f)); _CurrentSongName.fontSize = 3f; _CurrentSongName.color = Color.cyan; _CurrentSongName.alignment = TextAlignmentOptions.Left; _CurrentSongName.enableWordWrapping = false; _CurrentSongName.text = ""; _CurrentSongName2 = BeatSaberUI.CreateText(container, "", new Vector2(-35, 34f)); _CurrentSongName2.fontSize = 3f; _CurrentSongName2.color = Color.cyan; _CurrentSongName2.alignment = TextAlignmentOptions.Left; _CurrentSongName2.enableWordWrapping = false; _CurrentSongName2.text = ""; //CenterKeys.AddKeys(SONGLISTKEY); if (!RequestBot.AddKeyboard(CenterKeys, "mainpanel.kbd")) { CenterKeys.AddKeys(SONGLISTKEY); } ColorDeckButtons(CenterKeys, Color.white, Color.magenta); #endif RequestBot.AddKeyboard(CenterKeys, "CenterPanel.kbd"); CenterKeys.DefaultActions(); #region History button // History button _historyButton = UIHelper.CreateUIButton("SRMHistory", container, "PracticeButton", new Vector2(53f, 30f), new Vector2(25f, 15f), () => { isShowingHistory = !isShowingHistory; RequestBot.SetTitle(isShowingHistory ? "Song Request History" : "Song Request Queue"); if (NumberOfCells() > 0) { _songListTableView.ScrollToCellWithIdx(0, TableView.ScrollPositionType.Beginning, false); _songListTableView.SelectCellWithIdx(0); _selectedRow = 0; } else { _selectedRow = -1; } UpdateRequestUI(true); SetUIInteractivity(); _lastSelection = -1; }, "History"); _historyButton.ToggleWordWrapping(false); _historyHintText = UIHelper.AddHintText(_historyButton.transform as RectTransform, ""); #endregion #region Blacklist button // Blacklist button _blacklistButton = UIHelper.CreateUIButton("SRMBlacklist", container, "PracticeButton", new Vector2(53f, 10f), new Vector2(25f, 15f), () => { if (NumberOfCells() > 0) { void _onConfirm() { RequestBot.Blacklist(_selectedRow, isShowingHistory, true); if (_selectedRow > 0) { _selectedRow--; } confirmDialogActive = false; } // get song var song = SongInfoForRow(_selectedRow).song; // indicate dialog is active confirmDialogActive = true; // show dialog YesNoModal.instance.ShowDialog("Blacklist Song Warning", $"Blacklisting {song["songName"].Value} by {song["authorName"].Value}\r\nDo you want to continue?", _onConfirm, () => { confirmDialogActive = false; }); } }, "Blacklist"); _blacklistButton.ToggleWordWrapping(false); UIHelper.AddHintText(_blacklistButton.transform as RectTransform, "Block the selected request from being queued in the future."); #endregion #region Skip button // Skip button _skipButton = UIHelper.CreateUIButton("SRMSkip", container, "PracticeButton", new Vector2(53f, 0f), new Vector2(25f, 15f), () => { if (NumberOfCells() > 0) { // get song var song = SongInfoForRow(_selectedRow).song; void _onConfirm() { // get selected song currentsong = SongInfoForRow(_selectedRow); // skip it RequestBot.Skip(_selectedRow); // select previous song if not first song if (_selectedRow > 0) { _selectedRow--; } // indicate dialog is no longer active confirmDialogActive = false; } // indicate dialog is active confirmDialogActive = true; // show dialog YesNoModal.instance.ShowDialog("Skip Song Warning", $"Skipping {song["songName"].Value} by {song["authorName"].Value}\r\nDo you want to continue?", _onConfirm, () => { confirmDialogActive = false; }); } }, "Skip"); _skipButton.ToggleWordWrapping(false); UIHelper.AddHintText(_skipButton.transform as RectTransform, "Remove the selected request from the queue."); #endregion #region Play button // Play button _playButton = UIHelper.CreateUIButton("SRMPlay", container, "ActionButton", new Vector2(53f, -10f), new Vector2(25f, 15f), () => { if (NumberOfCells() > 0) { currentsong = SongInfoForRow(_selectedRow); RequestBot.played.Add(currentsong.song); RequestBot.WriteJSON(RequestBot.playedfilename, ref RequestBot.played); SetUIInteractivity(false); RequestBot.Process(_selectedRow, isShowingHistory); _selectedRow = -1; } }, "Play"); _playButton.ToggleWordWrapping(false); _playButton.interactable = ((isShowingHistory && RequestHistory.Songs.Count > 0) || (!isShowingHistory && RequestQueue.Songs.Count > 0)); UIHelper.AddHintText(_playButton.transform as RectTransform, "Download and scroll to the currently selected request."); #endregion #region Queue button // Queue button _queueButton = UIHelper.CreateUIButton("SRMQueue", container, "PracticeButton", new Vector2(53f, -30f), new Vector2(25f, 15f), () => { RequestBotConfig.Instance.RequestQueueOpen = !RequestBotConfig.Instance.RequestQueueOpen; RequestBotConfig.Instance.Save(); RequestBot.WriteQueueStatusToFile(RequestBotConfig.Instance.RequestQueueOpen ? "Queue is open." : "Queue is closed."); RequestBot.Instance.QueueChatMessage(RequestBotConfig.Instance.RequestQueueOpen ? "Queue is open." : "Queue is closed."); UpdateRequestUI(); }, RequestBotConfig.Instance.RequestQueueOpen ? "Queue Open" : "Queue Closed"); _queueButton.ToggleWordWrapping(true); _queueButton.SetButtonUnderlineColor(RequestBotConfig.Instance.RequestQueueOpen ? Color.green : Color.red); _queueButton.SetButtonTextSize(3.5f); UIHelper.AddHintText(_queueButton.transform as RectTransform, "Open/Close the queue."); #endregion // Set default RequestFlowCoordinator title RequestBot.SetTitle(isShowingHistory ? "Song Request History" : "Song Request Queue"); } base.DidActivate(firstActivation, addedToHierarchy, screenSystemEnabling); if (addedToHierarchy) { _selectedRow = -1; _songListTableView.ClearSelection(); } UpdateRequestUI(); SetUIInteractivity(true); }
//static bool test(string x) //{ // File.AppendAllText("c:\\sehria\\objects.txt", x + "\r\n"); // return false; //} protected override void DidActivate(bool firstActivation, ActivationType type) { if (firstActivation) { if (!SongCore.Loader.AreSongsLoaded) { SongCore.Loader.SongsLoadedEvent += SongLoader_SongsLoadedEvent; } // get table cell instance _requestListTableCellInstance = Resources.FindObjectsOfTypeAll <LevelListTableCell>().First((LevelListTableCell x) => x.name == "LevelListTableCell"); InitConfirmationDialog(); //Resources.FindObjectsOfTypeAll<UnityEngine.Object>().Any(x => (test(x.name))); ; _songListTableCellInstance = Resources.FindObjectsOfTypeAll <LevelListTableCell>().First(o => (o.name == "LevelListTableCell")); _songPreviewPlayer = Resources.FindObjectsOfTypeAll <SongPreviewPlayer>().FirstOrDefault(); DidSelectRowEvent += DidSelectRow; RectTransform container = new GameObject("RequestBotContainer", typeof(RectTransform)).transform as RectTransform; container.SetParent(rectTransform, false); container.sizeDelta = new Vector2(60f, 0f); try { InitKeyboardDialog(); } catch (Exception ex) { Plugin.Log(ex.ToString()); } CenterKeys = new KEYBOARD(container, "", false, -15, 15); #if UNRELEASED // BUG: Need additional modes disabling one shot buttons // BUG: Need to make sure the buttons are usable on older headsets _CurrentSongName = BeatSaberUI.CreateText(container, "", new Vector2(-35, 37f)); _CurrentSongName.fontSize = 3f; _CurrentSongName.color = Color.cyan; _CurrentSongName.alignment = TextAlignmentOptions.Left; _CurrentSongName.enableWordWrapping = false; _CurrentSongName.text = ""; _CurrentSongName2 = BeatSaberUI.CreateText(container, "", new Vector2(-35, 34f)); _CurrentSongName2.fontSize = 3f; _CurrentSongName2.color = Color.cyan; _CurrentSongName2.alignment = TextAlignmentOptions.Left; _CurrentSongName2.enableWordWrapping = false; _CurrentSongName2.text = ""; //CenterKeys.AddKeys(SONGLISTKEY); RequestBot.AddKeyboard(CenterKeys, "mainpanel.kbd"); ColorDeckButtons(CenterKeys, Color.white, Color.magenta); #endif RequestBot.AddKeyboard(CenterKeys, "CenterPanel.kbd"); CenterKeys.DefaultActions(); // History button _historyButton = Instantiate(Resources.FindObjectsOfTypeAll <Button>().First(o => (o.name == "OkButton")), container, false); _historyButton.ToggleWordWrapping(false); (_historyButton.transform as RectTransform).anchoredPosition = new Vector2(90f, 30f); _historyButton.SetButtonText("History"); _historyButton.onClick.RemoveAllListeners(); _historyButton.onClick.AddListener(delegate() { isShowingHistory = !isShowingHistory; Resources.FindObjectsOfTypeAll <VRUIScreenSystem>().First().title = isShowingHistory ? "Song Request History" : "Song Request Queue"; UpdateRequestUI(true); SetUIInteractivity(); _lastSelection = -1; }); _historyHintText = BeatSaberUI.AddHintText(_historyButton.transform as RectTransform, ""); // Blacklist button _blacklistButton = Instantiate(Resources.FindObjectsOfTypeAll <Button>().First(o => (o.name == "OkButton")), container, false); _blacklistButton.ToggleWordWrapping(false); (_blacklistButton.transform as RectTransform).anchoredPosition = new Vector2(90f, 10f); _blacklistButton.SetButtonText("Blacklist"); //_blacklistButton.GetComponentInChildren<Image>().color = Color.red; _blacklistButton.onClick.RemoveAllListeners(); _blacklistButton.onClick.AddListener(delegate() { if (NumberOfCells() > 0) { _onConfirm = () => { RequestBot.Blacklist(_selectedRow, isShowingHistory, true); if (_selectedRow > 0) { _selectedRow--; } }; var song = SongInfoForRow(_selectedRow).song; _warningTitle.text = "Blacklist Song Warning"; _warningMessage.text = $"Blacklisting {song["songName"].Value} by {song["authorName"].Value}\r\nDo you want to continue?"; confirmDialogActive = true; _confirmationDialog.Present(); } }); BeatSaberUI.AddHintText(_blacklistButton.transform as RectTransform, "Block the selected request from being queued in the future."); // Skip button _skipButton = Instantiate(Resources.FindObjectsOfTypeAll <Button>().First(o => (o.name == "OkButton")), container, false); _skipButton.ToggleWordWrapping(false); (_skipButton.transform as RectTransform).anchoredPosition = new Vector2(90f, 0f); _skipButton.SetButtonText("Skip"); //_skipButton.GetComponentInChildren<Image>().color = Color.yellow; _skipButton.onClick.RemoveAllListeners(); _skipButton.onClick.AddListener(delegate() { if (NumberOfCells() > 0) { _onConfirm = () => { currentsong = SongInfoForRow(_selectedRow); RequestBot.Skip(_selectedRow); if (_selectedRow > 0) { _selectedRow--; } }; var song = SongInfoForRow(_selectedRow).song; _warningTitle.text = "Skip Song Warning"; _warningMessage.text = $"Skipping {song["songName"].Value} by {song["authorName"].Value}\r\nDo you want to continue?"; confirmDialogActive = true; _confirmationDialog.Present(); } }); BeatSaberUI.AddHintText(_skipButton.transform as RectTransform, "Remove the selected request from the queue."); // Play button _playButton = Instantiate(Resources.FindObjectsOfTypeAll <Button>().First(o => (o.name == "OkButton")), container, false); _playButton.ToggleWordWrapping(false); (_playButton.transform as RectTransform).anchoredPosition = new Vector2(90f, -10f); _playButton.SetButtonText("Play"); _playButton.GetComponentInChildren <Image>().color = Color.green; _playButton.onClick.RemoveAllListeners(); _playButton.onClick.AddListener(delegate() { if (NumberOfCells() > 0) { currentsong = SongInfoForRow(_selectedRow); RequestBot.played.Add(currentsong.song); RequestBot.WriteJSON(RequestBot.playedfilename, ref RequestBot.played); SetUIInteractivity(false); RequestBot.Process(_selectedRow, isShowingHistory); _selectedRow = -1; } }); BeatSaberUI.AddHintText(_playButton.transform as RectTransform, "Download and scroll to the currently selected request."); // Queue button _queueButton = Instantiate(Resources.FindObjectsOfTypeAll <Button>().First(o => (o.name == "OkButton")), container, false); _queueButton.ToggleWordWrapping(false); _queueButton.SetButtonTextSize(3.5f); (_queueButton.transform as RectTransform).anchoredPosition = new Vector2(90f, -30f); _queueButton.SetButtonText(RequestBotConfig.Instance.RequestQueueOpen ? "Queue Open" : "Queue Closed"); _queueButton.GetComponentInChildren <Image>().color = RequestBotConfig.Instance.RequestQueueOpen ? Color.green : Color.red;; _queueButton.interactable = true; _queueButton.onClick.RemoveAllListeners(); _queueButton.onClick.AddListener(delegate() { RequestBotConfig.Instance.RequestQueueOpen = !RequestBotConfig.Instance.RequestQueueOpen; RequestBotConfig.Instance.Save(); RequestBot.WriteQueueStatusToFile(RequestBotConfig.Instance.RequestQueueOpen ? "Queue is open." : "Queue is closed."); RequestBot.Instance.QueueChatMessage(RequestBotConfig.Instance.RequestQueueOpen ? "Queue is open." : "Queue is closed."); UpdateRequestUI(); }); BeatSaberUI.AddHintText(_queueButton.transform as RectTransform, "Open/Close the queue."); } base.DidActivate(firstActivation, type); UpdateRequestUI(); SetUIInteractivity(true); }
public void Init() { // Buttons _backButton = BeatSaberUI.CreateBackButton(rectTransform as RectTransform, delegate() { backButtonPressed?.Invoke(); }); _listButton = BeatSaberUI.CreateUIButton(rectTransform, "CreditsButton", new Vector2(60, 30), new Vector2(30, 8), () => { listButtonPressed?.Invoke(); }, "Search"); _downloadDeleteButton = BeatSaberUI.CreateUIButton(rectTransform, "CreditsButton", new Vector2(60, 20), new Vector2(30, 8), () => { downloadDeleteButtonPressed?.Invoke(); }, "Delete"); _downloadDeleteButton.GetComponentInChildren <HorizontalLayoutGroup>().padding = new RectOffset(0, 0, 0, 0); _previewButton = BeatSaberUI.CreateUIButton(rectTransform, "CreditsButton", new Vector2(60, -30), new Vector2(30, 8), () => { previewButtonPressed?.Invoke(); }, "Preview"); _loopButton = BeatSaberUI.CreateUIButton(rectTransform, "CreditsButton", new Vector2(60, -20), new Vector2(30, 8), () => { loopButtonPressed?.Invoke(); }, "Loop"); _addOffset = BeatSaberUI.CreateUIButton(rectTransform, "QuitButton", new Vector2(71, -10), new Vector2(8, 8), null, "+"); foreach (StackLayoutGroup stack in _addOffset.GetComponentsInChildren <StackLayoutGroup>()) { stack.childForceExpandHeight = false; stack.childForceExpandWidth = false; stack.padding = new RectOffset(0, 0, 0, 0); } _addOffset.GetComponentInChildren <HorizontalLayoutGroup>().padding = new RectOffset(0, 0, 0, 0); _addOffset.GetComponentInChildren <TextMeshProUGUI>().margin = new Vector4(0, 0, 0, 0); (_addOffset.transform.Find("Wrapper") as RectTransform).sizeDelta = new Vector2(8, 8); _subOffset = Instantiate(_addOffset, rectTransform); (_subOffset.transform as RectTransform).anchoredPosition = new Vector2(49, -10); _subOffset.SetButtonText("-"); _subOffset.onClick.AddListener(() => { subOffsetPressed?.Invoke(); }); _addOffset.onClick.AddListener(() => { addOffsetPressed?.Invoke(); }); BeatSaberUI.AddHintText(_addOffset.transform as RectTransform, "Video lags behind music\nStart the video earlier"); BeatSaberUI.AddHintText(_subOffset.transform as RectTransform, "Video is ahead of music\nStart the video later"); _offsetText = BeatSaberUI.CreateText(rectTransform, "?", new Vector2(60, -10)); _offsetText.rectTransform.sizeDelta = new Vector2(14, 8); _offsetText.alignment = TextAlignmentOptions.Center; _offsetText.color = Color.white; var _offsetTitle = BeatSaberUI.CreateText(rectTransform, "Video Offset (ms)", new Vector2(60, -3)); _offsetTitle.rectTransform.sizeDelta = new Vector2(30, 8); _offsetTitle.alignment = TextAlignmentOptions.Center; // Video data _thumbnail = Instantiate(Resources.FindObjectsOfTypeAll <Image>().First(x => x.name == "CoverImage"), rectTransform); _thumbnail.rectTransform.anchorMin = new Vector2(0.5f, 1f); _thumbnail.rectTransform.anchorMax = new Vector2(0.5f, 1f); _thumbnail.rectTransform.pivot = new Vector2(0.5f, 1); _thumbnail.rectTransform.anchoredPosition = new Vector2(0, -5); var height = 30f; var width = 16f / 9f * height; _thumbnail.rectTransform.sizeDelta = new Vector2(width, height); _thumbnail.preserveAspect = false; _thumbnail.sprite = null; _thumbnail.transform.SetAsLastSibling(); _title = BeatSaberUI.CreateText(rectTransform, "TITLE", new Vector2(0, 0)); _title.alignment = TextAlignmentOptions.Top; _title.maxVisibleLines = 1; _title.fontSize = 6; _title.rectTransform.sizeDelta = new Vector2(100, 10); _uploader = BeatSaberUI.CreateText(rectTransform, "UPLOADER", new Vector2(0, -7)); _uploader.alignment = TextAlignmentOptions.Left; _uploader.color = Color.white * 0.9f; _uploader.rectTransform.sizeDelta = new Vector2(80, 5); _duration = BeatSaberUI.CreateText(rectTransform, "[00:00]", new Vector2(0, -7)); _duration.alignment = TextAlignmentOptions.Right; _duration.color = Color.white * 0.9f; _duration.rectTransform.sizeDelta = new Vector2(80, 5); _description = BeatSaberUI.CreateText(rectTransform, "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", new Vector2(0, -14)); _description.alignment = TextAlignmentOptions.TopLeft; _description.rectTransform.sizeDelta = new Vector2(80, 10); _description.enableWordWrapping = true; _description.maxVisibleLines = 5; // Download Progress ring var buttonsRect = Resources.FindObjectsOfTypeAll <RectTransform>().First(x => x.name == "PlayButtons"); var _playbutton = buttonsRect.GetComponentsInChildren <Button>().First(x => x.name == "PlayButton"); var _progressButton = Instantiate(_playbutton, _thumbnail.transform); _progressButton.name = "DownloadProgress"; (_progressButton.transform as RectTransform).anchorMax = new Vector2(0.5f, 0.5f); (_progressButton.transform as RectTransform).anchorMin = new Vector2(0.5f, 0.5f); (_progressButton.transform as RectTransform).anchoredPosition = new Vector2(0, 0); (_progressButton.transform as RectTransform).pivot = new Vector2(0.5f, 0.5f); (_progressButton.transform as RectTransform).sizeDelta = new Vector2(18, 18); _progressText = _progressButton.GetComponentInChildren <TextMeshProUGUI>(); _progressText.text = "100%"; _progressRingGlow = _progressButton.GetComponentsInChildren <Image>().First(x => x.name == "Glow"); Destroy(_progressButton); _progressRingGlow.gameObject.SetActive(false); var hlg = _progressButton.GetComponentsInChildren <HorizontalLayoutGroup>().First(x => x.name == "Content"); hlg.padding = new RectOffset(2, 2, 2, 2); _progressCircle = _progressButton.GetComponentsInChildren <Image>().First(x => x.name == "Stroke"); _progressCircle.type = Image.Type.Filled; _progressCircle.fillMethod = Image.FillMethod.Radial360; _progressCircle.fillAmount = 1f; _hoverHint = BeatSaberUI.AddHintText(_thumbnail.transform as RectTransform, "Banana banana banana"); }
public LabelTextGroup(TextMeshProUGUI label, HoverHint hint, PartEditor.MatList list) { labelTMP = label; hoverHint = hint; matList = list; }
private void SetupList(BeatSaberPlaylistsLib.PlaylistManager currentParentManager, bool setBeatmapLevelCollections = true) { customListTableData.tableView.ClearSelection(); customListTableData.data.Clear(); this.currentParentManager = currentParentManager; if (currentParentManager == null) { CustomListTableData.CustomCellInfo customCellInfo = new CustomListTableData.CustomCellInfo("Level Packs", icon: levelPacksIcon); customListTableData.data.Add(customCellInfo); customCellInfo = new CustomListTableData.CustomCellInfo("Custom Songs", icon: customPacksIcon); customListTableData.data.Add(customCellInfo); customCellInfo = new CustomListTableData.CustomCellInfo("Playlists", icon: playlistsIcon); customListTableData.data.Add(customCellInfo); customCellInfo = new CustomListTableData.CustomCellInfo("Folders", icon: foldersIcon); customListTableData.data.Add(customCellInfo); backTransform.gameObject.SetActive(false); } else { currentManagers = currentParentManager.GetChildManagers().ToList(); foreach (var childManager in currentManagers) { var folderName = Path.GetFileName(childManager.PlaylistPath); CustomListTableData.CustomCellInfo customCellInfo = new CustomListTableData.CustomCellInfo(folderName, icon: PlaylistLibUtils.DrawFolderIcon(folderName)); customListTableData.data.Add(customCellInfo); } backTransform.gameObject.SetActive(true); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(FolderText))); // If root, can't rename or delete if (currentParentManager.Parent == null) { renameButton.interactable = false; deleteButton.interactable = false; } else { renameButton.interactable = true; deleteButton.interactable = true; } if (setBeatmapLevelCollections) { IAnnotatedBeatmapLevelCollection[] annotatedBeatmapLevelCollections = currentParentManager.GetAllPlaylists(false); LevelCollectionTableViewUpdatedEvent?.Invoke(annotatedBeatmapLevelCollections, 0); } } customListTableData.tableView.ReloadData(); customListTableData.tableView.ScrollToCellWithIdx(0, TableView.ScrollPositionType.Beginning, false); if (currentParentManager == null) { customListTableData.tableView.SelectCellWithIdx(0); // Add hover hint TableCell[] visibleCells = customListTableData.tableView.visibleCells.ToArray(); for (int i = 0; i < visibleCells.Length; i++) { HoverHint hoverHint = visibleCells[i].GetComponent <HoverHint>(); if (hoverHint == null) { hoverHint = visibleCells[i].gameObject.AddComponent <HoverHint>(); hoverHint.SetField("_hoverHintController", hoverHintController); } else { hoverHint.enabled = true; } hoverHint.text = customListTableData.data[i].text; } if (setBeatmapLevelCollections) { Select(customListTableData.tableView, 0); } } else { // Disable hover hint TableCell[] visibleCells = customListTableData.tableView.visibleCells.ToArray(); for (int i = 0; i < visibleCells.Length; i++) { HoverHint hoverHint = visibleCells[i].GetComponent <HoverHint>(); if (hoverHint != null) { hoverHint.enabled = false; } } } PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(LeftButtonEnabled))); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(RightButtonEnabled))); }