protected override void Awake()
        {
            if (_lockSprite == null)
            {
                _lockSprite = BSUIUtilities.LoadSpriteFromResources(LockImageResourcePath);
            }
            if (_unlockSprite == null)
            {
                _unlockSprite = BSUIUtilities.LoadSpriteFromResources(UnlockImageResourcePath);
            }

            _floatingScreen            = FloatingScreen.CreateFloatingScreen(new Vector2(120f, 64f), false, PluginConfig.FloatingSearchKeyboardPosition, PluginConfig.FloatingSearchKeyboardRotation);
            _floatingScreen.HandleSide = FloatingScreen.Side.Top;

            UIUtilities.ParseBSML("EnhancedSearchAndFilters.UI.Views.FloatingKeyboardView.bsml", _floatingScreen.gameObject, this);

            _predictionBar = new GameObject("EnhancedSearchPredictionBar").AddComponent <PredictionBar>();
            _predictionBar.Initialize(_floatingScreen.transform, 3.5f, 15f, -55f, 55f);

            var keyboardGO = new GameObject("EnhancedSearchKeyboard", typeof(FloatingSearchKeyboard), typeof(RectTransform));

            var rt = keyboardGO.GetComponent <RectTransform>();

            rt.SetParent(_floatingScreen.transform, false);
            rt.anchorMin        = Vector2.zero;
            rt.anchorMax        = new Vector2(1f, 0f);
            rt.pivot            = new Vector2(0.5f, 0f);
            rt.anchoredPosition = new Vector2(0f, 2f);
            rt.sizeDelta        = new Vector2(-10f, 40f);

            _keyboard = keyboardGO.GetComponent <FloatingSearchKeyboard>();

            _textDisplayComponent                    = BeatSaberUI.CreateText(_floatingScreen.transform as RectTransform, "", new Vector2(0f, 23.5f), Vector2.zero);
            _textDisplayComponent.fontSize           = 7f;
            _textDisplayComponent.alignment          = TextAlignmentOptions.Center;
            _textDisplayComponent.enableWordWrapping = false;

            base.Awake();
        }
Example #2
0
        protected override void CreateBottomButtons()
        {
            // Backspace
            TextMeshProButton button = CreateKeyboardButton(new Vector2(64f, YOffset + DefaultKeySize.y + 1f), new Vector2(15f, DefaultKeySize.y), 4f, this.transform, "Backspace");

            button.text.text = "<-";
            button.button.onClick.AddListener(InvokeDeleteButtonPressed);

            // Symbols
            _symbolButton           = CreateKeyboardButton(new Vector2(0f, YOffset), new Vector2(15f, DefaultKeySize.y), 3.4f, this.transform, "Symbols");
            _symbolButton.text.text = "Symbols";
            _symbolButton.button.onClick.AddListener(() => SetSymbolMode(!_symbolModeActive));

            // Space bar
            button           = CreateKeyboardButton(new Vector2(16f, YOffset), new Vector2(32f, DefaultKeySize.y), this.transform, "Spacebar");
            button.text.text = "Space";
            button.button.onClick.AddListener(() => InvokeTextButtonPressed(' '));

            // To Filter key
            _filterButton           = CreateKeyboardButton(new Vector2(49f, YOffset), new Vector2(16f, DefaultKeySize.y), 3.2f, this.transform, "To Filter");
            _filterButton.text.text = "To\nFilter";

            Image filterIcon = new GameObject("FilterIcon").AddComponent <Image>();

            filterIcon.sprite         = BSUIUtilities.LoadSpriteFromResources("EnhancedSearchAndFilters.Assets.filter.png");
            filterIcon.preserveAspect = true;

            var layout = filterIcon.gameObject.AddComponent <LayoutElement>();

            layout.preferredHeight = 3.5f;
            layout.preferredWidth  = 3.5f;

            filterIcon.transform.SetParent(_filterButton.text.transform.parent, false);

            (_filterButton.text.transform.parent as RectTransform).sizeDelta += new Vector2(0f, 1.5f);

            _filterButton.button.onClick.AddListener(delegate()
            {
                filterIcon.color = Color.white;
                InvokeFilterButtonPressed();
            });

            if (PluginConfig.DisableFilters)
            {
                _filterButton.button.interactable = false;
                filterIcon.color = Color.gray;
            }
            else
            {
                var handler = _filterButton.button.gameObject.AddComponent <EnterExitEventHandler>();
                handler.PointerEntered += () => filterIcon.color = _filterButton.button.interactable ? Color.black : Color.gray;
                handler.PointerExited  += () => filterIcon.color = _filterButton.button.interactable ? Color.white : Color.gray;

                BeatmapDetailsLoader.instance.CachingStarted += OnCachingStarted;

                if (BeatmapDetailsLoader.instance.SongsAreCached)
                {
                    _filterButton.button.interactable = true;
                }
                else
                {
                    _filterButton.button.interactable = false;
                    filterIcon.color = Color.gray;
                    BeatmapDetailsLoader.instance.CachingFinished += OnCachingFinished;
                }
            }

            // Clear
            button           = CreateKeyboardButton(new Vector2(66f, YOffset), new Vector2(13f, DefaultKeySize.y), this.transform, "Clear");
            button.text.text = "Clear";
            button.button.onClick.AddListener(InvokeClearButtonPressed);
        }
        public BottomScreen()
        {
            _floatingScreen = FloatingScreen.CreateFloatingScreen(new Vector2(DefaultXSize, DefaultYSize), false, new Vector3(1.5f, 0.05f, 1.5f), Quaternion.Euler(50f, 0f, 0f));
            (_floatingScreen.transform as RectTransform).pivot = new Vector2(1f, 0f);

            // this is needed to fix HoverHint position issues that occur because of the change in pivot done to the floating screen
            var wrapperCanvasGO = new GameObject("Wrapper", typeof(RectTransform), typeof(Canvas), typeof(VRGraphicRaycaster), typeof(SetMainCameraToCanvas));
            var rt = wrapperCanvasGO.transform as RectTransform;

            rt.SetParent(_floatingScreen.transform, false);
            rt.anchorMin = Vector2.zero;
            rt.anchorMax = Vector2.one;
            rt.sizeDelta = Vector2.zero;

            var cameraSetter = wrapperCanvasGO.GetComponent <SetMainCameraToCanvas>();

            cameraSetter.SetField("_canvas", wrapperCanvasGO.GetComponent <Canvas>());
            cameraSetter.SetField("_mainCamera", Resources.FindObjectsOfTypeAll <MainCamera>().FirstOrDefault(camera => camera.camera?.stereoTargetEye != StereoTargetEyeMask.None) ?? Resources.FindObjectsOfTypeAll <MainCamera>().FirstOrDefault());

            _outlineImage                = new GameObject("Outline").AddComponent <Image>();
            _outlineImage.color          = OutlineColour;
            _outlineImage.material       = UIUtilities.NoGlowMaterial;
            _outlineImage.type           = Image.Type.Sliced;
            _outlineImage.sprite         = Resources.FindObjectsOfTypeAll <Sprite>().LastOrDefault(x => x.name == "RoundRectSmallStroke");
            _outlineImage.preserveAspect = true;

            _outlineImage.rectTransform.SetParent(wrapperCanvasGO.transform, false);
            _outlineImage.rectTransform.anchorMin = Vector2.zero;
            _outlineImage.rectTransform.anchorMax = Vector2.one;
            _outlineImage.rectTransform.sizeDelta = Vector2.zero;

            var hlg = new GameObject("HorizontalLayoutGroup").AddComponent <HorizontalLayoutGroup>();

            hlg.spacing                = 3.5f;
            hlg.padding                = new RectOffset(2, 2, 1, 1);
            hlg.childAlignment         = TextAnchor.MiddleCenter;
            hlg.childForceExpandWidth  = false;
            hlg.childForceExpandHeight = false;

            rt = hlg.transform as RectTransform;
            rt.SetParent(wrapperCanvasGO.transform, false);
            rt.anchorMin = new Vector2(1f, 0f);
            rt.anchorMax = new Vector2(1f, 0f);
            rt.pivot     = new Vector2(1f, 0f);
            rt.sizeDelta = new Vector2(DefaultXSize, DefaultYSize);

            // icon
            _iconImage                = new GameObject("Icon").AddComponent <Image>();
            _iconImage.material       = UIUtilities.NoGlowMaterial;
            _iconImage.sprite         = BSUIUtilities.LoadSpriteFromResources("EnhancedSearchAndFilters.Assets.bars.png");
            _iconImage.preserveAspect = true;

            var le = _iconImage.gameObject.AddComponent <LayoutElement>();

            le.preferredWidth  = 4.5f;
            le.preferredHeight = 4.5f;

            _iconImage.rectTransform.SetParent(rt, false);

            // text
            _text           = BeatSaberUI.CreateText(rt, "OPTIONS", Vector2.zero, Vector2.zero);
            _text.fontSize  = 4.4f;
            _text.alignment = TextAlignmentOptions.Center;

            // this needs to be the last child, otherwise the outline image will capture all the controller raycasts first
            UIUtilities.ParseBSML("EnhancedSearchAndFilters.UI.Views.BottomScreen.BottomScreenView.bsml", wrapperCanvasGO, this);

            _hoverEventHandler = _floatingScreen.gameObject.AddComponent <EnterExitEventHandler>();
            _hoverEventHandler.PointerEntered += delegate()
            {
                if (_revealAnimation != null)
                {
                    return;
                }
                else if (_contractAnimation != null)
                {
                    UnityCoroutineHelper.Stop(_contractAnimation);
                    _contractAnimation = null;
                }

                _expandAnimation = UnityCoroutineHelper.Start(ExpandAnimationCoroutine());
            };
            _hoverEventHandler.PointerExited += delegate()
            {
                if (_revealAnimation != null)
                {
                    return;
                }

                bool immediate = false;
                if (_expandAnimation != null)
                {
                    UnityCoroutineHelper.Stop(_expandAnimation);
                    _expandAnimation = null;
                    immediate        = true;
                }
                else if (_contractAnimation != null)
                {
                    UnityCoroutineHelper.Stop(_contractAnimation);
                    _contractAnimation = null;
                }

                _contractAnimation = UnityCoroutineHelper.Start(ContractAnimationCoroutine(immediate));
            };

            var sortModeTab = new SortModeTab(_container);

            sortModeTab.SortButtonPressed += () => SortButtonPressed?.Invoke();
            sortModeTab.Visible            = true;

            _currentTab = sortModeTab;
            _tabs[0]    = sortModeTab;
            Logger.log.Notice($"finished constructor, currentTab?={_currentTab == null}");

            HideScreen(true);
        }