Newer
Older
Qwilight / Qwilight / ViewModel / VoteViewModel.cs
@Taehui Taehui on 19 Aug 4 KB v1.16.39!
using Qwilight.NoteFile;
using Qwilight.Utilities;
using System.Collections.ObjectModel;
using System.Windows.Media;

namespace Qwilight.ViewModel
{
    public sealed class VoteViewModel : BaseViewModel
    {
        public override double TargetLength => 0.9;

        VoteComputing _valueComputing;
        string _voteName;
        bool _isVoteGroupsLoading;
        bool _isVoteGroupLoading;
        string _www = string.Empty;

        public sealed class VoteComputing : Computing
        {
            public override BaseNoteFile.NoteVariety NoteVarietyValue => default;

            public Brush PointedPaint => Paints.DefaultPointedPaint;

            public string Www { get; set; }

            public bool IsFavorite { get; set; }

            public override void OnCompiled()
            {
            }

            public override void OnFault(Exception e)
            {
            }
        }

        public ObservableCollection<VoteComputing> ComputingValues { get; } = new();

        public VoteComputing ComputingValue
        {
            get => _valueComputing;

            set
            {
                if (SetProperty(ref _valueComputing, value, nameof(ComputingValue)) && value != null)
                {
                    Www = value.Www;
                }
            }
        }

        public bool IsVoteGroupLoading
        {
            get => _isVoteGroupLoading;

            set => SetProperty(ref _isVoteGroupLoading, value, nameof(IsVoteGroupLoading));
        }

        public override bool OpeningCondition => ViewModels.Instance.MainValue.IsNoteFileMode;

        public ObservableCollection<string> VoteNameCollection { get; } = new();

        public string VoteName
        {
            get => _voteName;

            set
            {
                if (SetProperty(ref _voteName, value, nameof(VoteName)))
                {
                    IsVoteGroupLoading = true;
                    TwilightSystem.Instance.GetWwwParallel<JSON.TwilightWwwVote[]>($"{QwilightComponent.QwilightAPI}/vote?voteName={value}").ContinueWith(async t =>
                    {
                        var twilightWwwVotes = await t;
                        if (twilightWwwVotes != null && VoteName == value)
                        {
                            Utility.SetUICollection(ComputingValues, twilightWwwVotes.Select(data => new VoteComputing
                            {
                                Www = data.www,
                                IsFavorite = data.isFavorite,
                                Title = data.title,
                                Artist = data.artist,
                                Genre = data.genre
                            }).ToArray());
                        }
                        IsVoteGroupLoading = false;
                    }, TaskContinuationOptions.ExecuteSynchronously);
                }
            }
        }

        public string Www
        {
            get => _www;

            set => SetProperty(ref _www, value, nameof(Www));
        }

        public bool IsVoteGroupsLoading
        {
            get => _isVoteGroupsLoading;

            set => SetProperty(ref _isVoteGroupsLoading, value, nameof(IsVoteGroupsLoading));
        }

        public override void OnCollapsed()
        {
            base.OnCollapsed();
            ViewModels.Instance.MainValue.HandleAutoComputer();
        }

        public override void OnOpened()
        {
            base.OnOpened();
            ViewModels.Instance.MainValue.CloseAutoComputer();

            UIHandler.Instance.HandleParallel(async () =>
            {
                IsVoteGroupsLoading = true;
                var voteNames = await TwilightSystem.Instance.GetWwwParallel<string[]>($"{QwilightComponent.QwilightAPI}/vote");
                if (voteNames != null)
                {
                    Utility.SetUICollection(VoteNameCollection, voteNames);
                    VoteName ??= VoteNameCollection.FirstOrDefault();
                }
                IsVoteGroupsLoading = false;
            });
        }
    }
}