Newer
Older
Qwilight / Qwilight / ViewModel / InputStandardViewModel.cs
@Taehui Taehui on 9 Aug 9 KB v1.16.36
using CommunityToolkit.Mvvm.Input;
using Qwilight.Utilities;
using System.Windows;
using System.Windows.Media;
using Windows.System;

namespace Qwilight.ViewModel
{
    public sealed partial class InputStandardViewModel : BaseViewModel
    {
        public const int LowerMultiplier = 0;
        public const int HigherMultiplier = 1;
        public const int HalfMultiplier = 2;
        public const int _2XMultiplier = 3;
        public const int LowerAudioMultiplier = 4;
        public const int HigherAudioMultiplier = 5;
        public const int MediaMode = 6;
        public const int VeilDrawing = 7;
        public const int HandleUndo = 8;
        public const int ModifyAutoMode = 9;
        public const int PostItem0 = 10;
        public const int PostItem1 = 11;

        int _inputPosition;
        bool _allowEssentialInputs;

        public override double TargetHeight => double.NaN;

        public override VerticalAlignment HeightSystem => VerticalAlignment.Bottom;

        public Brush[] InputPaints { get; } = new Brush[13];

        public string[] Inputs { get; } = new string[13];

        public int CallingInputPosition { get; set; }

        public bool AllowEssentialInputs
        {
            get => _allowEssentialInputs;

            set => SetProperty(ref _allowEssentialInputs, value, nameof(AllowEssentialInputs));
        }

        [RelayCommand]
        void OnInputPosition(int? inputPosition)
        {
            if (inputPosition.HasValue)
            {
                var inputPositionValue = inputPosition.Value;
                SetInputPaint(_inputPosition, false);
                SetInputPaint(inputPositionValue, true);
                _inputPosition = inputPositionValue;
            }
        }

        public void OnDefaultInputLower(VirtualKey e)
        {
            switch (e)
            {
                case VirtualKey.Left:
                    if (AllowEssentialInputs)
                    {
                        SetInputImpl();
                    }
                    else
                    {
                        SetInputPaint(_inputPosition, false);
                        if (_inputPosition == 0)
                        {
                            Close();
                        }
                        else
                        {
                            SetInputPaint(--_inputPosition, true);
                        }
                    }
                    break;
                case VirtualKey.Right:
                    if (AllowEssentialInputs)
                    {
                        SetInputImpl();
                    }
                    else
                    {
                        SetInputPaint(_inputPosition, false);
                        if (_inputPosition == 11)
                        {
                            Close();
                        }
                        else
                        {
                            SetInputPaint(++_inputPosition, true);
                        }
                    }
                    break;
                case VirtualKey.Back:
                case VirtualKey.Delete:
                    if (AllowEssentialInputs)
                    {
                        SetInputImpl();
                    }
                    else
                    {
                        Configure.Instance.DefaultInputBundlesV6.StandardInputs[_inputPosition].Data = VirtualKey.None;
                        SetInput(_inputPosition, Configure.Instance.DefaultInputBundlesV6.StandardInputs[_inputPosition]);
                    }
                    break;
                case VirtualKey.F1:
                case VirtualKey.F2:
                case VirtualKey.F3:
                case VirtualKey.F4:
                case VirtualKey.A:
                case VirtualKey.B:
                case VirtualKey.C:
                case VirtualKey.D:
                case VirtualKey.E:
                case VirtualKey.F:
                case VirtualKey.G:
                case VirtualKey.H:
                case VirtualKey.I:
                case VirtualKey.J:
                case VirtualKey.K:
                case VirtualKey.L:
                case VirtualKey.M:
                case VirtualKey.N:
                case VirtualKey.O:
                case VirtualKey.P:
                case VirtualKey.Q:
                case VirtualKey.R:
                case VirtualKey.S:
                case VirtualKey.T:
                case VirtualKey.U:
                case VirtualKey.V:
                case VirtualKey.W:
                case VirtualKey.X:
                case VirtualKey.Y:
                case VirtualKey.Z:
                case VirtualKey.Number0:
                case VirtualKey.Number1:
                case VirtualKey.Number2:
                case VirtualKey.Number3:
                case VirtualKey.Number4:
                case VirtualKey.Number5:
                case VirtualKey.Number6:
                case VirtualKey.Number7:
                case VirtualKey.Number8:
                case VirtualKey.Number9:
                case VirtualKey.Space:
                case (VirtualKey)188:
                case (VirtualKey)190:
                case (VirtualKey)191:
                case (VirtualKey)186:
                case (VirtualKey)192:
                case (VirtualKey)219:
                case (VirtualKey)221:
                case (VirtualKey)220:
                case VirtualKey.LeftControl:
                case VirtualKey.Control:
                case VirtualKey.LeftMenu:
                case VirtualKey.Menu:
                case VirtualKey.LeftShift:
                case VirtualKey.RightShift:
                case VirtualKey.RightControl:
                case VirtualKey.Kanji:
                case VirtualKey.RightMenu:
                case VirtualKey.Hangul:
                case (VirtualKey)222:
                case (VirtualKey)187:
                case (VirtualKey)189:
                case VirtualKey.CapitalLock:
                case VirtualKey.Insert:
                case VirtualKey.Home:
                case VirtualKey.End:
                case VirtualKey.PageUp:
                case VirtualKey.PageDown:
                case VirtualKey.NumberKeyLock:
                case VirtualKey.Add:
                case VirtualKey.Subtract:
                case VirtualKey.Multiply:
                case VirtualKey.Divide:
                case VirtualKey.Decimal:
                case VirtualKey.NumberPad0:
                case VirtualKey.NumberPad1:
                case VirtualKey.NumberPad2:
                case VirtualKey.NumberPad3:
                case VirtualKey.NumberPad4:
                case VirtualKey.NumberPad5:
                case VirtualKey.NumberPad6:
                case VirtualKey.NumberPad7:
                case VirtualKey.NumberPad8:
                case VirtualKey.NumberPad9:
                case VirtualKey.Tab:
                case VirtualKey.Up:
                case VirtualKey.Down:
                    SetInputImpl();
                    break;
            }
            void SetInputImpl()
            {
                var defaultInput = new DefaultInput
                {
                    Data = e
                };
                if (Utility.AllowInput(Configure.Instance.DefaultInputBundlesV6, defaultInput))
                {
                    Configure.Instance.DefaultInputBundlesV6.StandardInputs[_inputPosition] = defaultInput;
                    SetInput(_inputPosition, defaultInput);
                }
            }
        }

        public void SetInput(int inputPosition, DefaultInput defaultInput)
        {
            var defaultInputText = defaultInput.ToString();
            if (string.IsNullOrEmpty(defaultInputText))
            {
                defaultInputText = "❌";
            }
            Inputs[inputPosition + 1] = string.Format(inputPosition switch
            {
                LowerMultiplier => LanguageSystem.Instance.LowerMultiplierContents,
                HigherMultiplier => LanguageSystem.Instance.HigherMultiplierContents,
                ModifyAutoMode => LanguageSystem.Instance.ModifyAutoModeContents,
                HandleUndo => LanguageSystem.Instance.HandleUndoContents,
                MediaMode => "BGA ({0})",
                LowerAudioMultiplier => LanguageSystem.Instance.LowerAudioMultiplierContents,
                HigherAudioMultiplier => LanguageSystem.Instance.HigherAudioMultiplierContents,
                PostItem0 => LanguageSystem.Instance.PostItem0Contents,
                PostItem1 => LanguageSystem.Instance.PostItem1Contents,
                VeilDrawing => LanguageSystem.Instance.VeilDrawingContents,
                HalfMultiplier => LanguageSystem.Instance.HalfMultiplierContents,
                _2XMultiplier => LanguageSystem.Instance._2XMultiplierContents,
                _ => throw new ArgumentException(inputPosition.ToString())
            }, defaultInputText);
            OnPropertyChanged(nameof(Inputs));
            if (inputPosition == PostItem0 || inputPosition == PostItem1)
            {
                Configure.Instance.NotifySetPostItemInputText();
            }
        }

        public void SetInputPaint(int inputPosition, bool isInput)
        {
            InputPaints[inputPosition + 1] = isInput ? Paints.PointPaints[1] : Brushes.Transparent;
            OnPropertyChanged(nameof(InputPaints));
        }

        public override void OnOpened()
        {
            base.OnOpened();
            AllowEssentialInputs = false;
            for (var i = Configure.Instance.DefaultInputBundlesV6.StandardInputs.Length - 1; i >= 0; --i)
            {
                SetInputPaint(i, false);
                SetInput(i, Configure.Instance.DefaultInputBundlesV6.StandardInputs[i]);
            }
            _inputPosition = CallingInputPosition;
            SetInputPaint(_inputPosition, true);
        }
    }
}