RankViewModel.cs 3.2 KB
Newer Older
R
Richasy 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
// Copyright (c) Richasy. All rights reserved.

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading.Tasks;
using Richasy.Bili.Locator.Uwp;
using Richasy.Bili.Models.App.Other;

namespace Richasy.Bili.ViewModels.Uwp
{
    /// <summary>
    /// 排行榜视图模型.
    /// </summary>
    public partial class RankViewModel : ViewModelBase
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="RankViewModel"/> class.
        /// </summary>
        public RankViewModel()
        {
            _controller = Controller.Uwp.BiliController.Instance;
            _cachedRankData = new Dictionary<RankPartition, List<VideoViewModel>>();
            DisplayVideoCollection = new ObservableCollection<VideoViewModel>();
            PartitionCollection = new ObservableCollection<RankPartition>();
            ServiceLocator.Instance.LoadService(out _resourceToolkit);
        }

        /// <summary>
        /// 初始化.
        /// </summary>
        /// <returns><see cref="Task"/>.</returns>
        public async Task InitializeAsync()
        {
            if (CurrentPartition == null)
            {
                IsInitializeLoading = true;
                var originalPartitions = await _controller.RequestPartitionIndexAsync();
                var rankPartitions = originalPartitions.Select(p => new RankPartition(p)).ToList();
                rankPartitions.Insert(
                    0,
                    new RankPartition(
                        _resourceToolkit.GetLocaleString(Models.Enums.LanguageNames.WholePartitions),
                        "ms-appx:///Assets/Bili_rgba_80.png"));

                rankPartitions.ForEach(p => PartitionCollection.Add(p));

                IsInitializeLoading = false;
                await SetSelectedRankPartitionAsync(PartitionCollection.First());
            }
        }

        /// <summary>
        /// 设置选中的排行榜分区.
        /// </summary>
        /// <param name="partition">排行榜分区.</param>
        /// <returns><see cref="Task"/>.</returns>
        public async Task SetSelectedRankPartitionAsync(RankPartition partition)
        {
            if (partition != null && partition != CurrentPartition)
            {
                IsRankLoading = true;
                CurrentPartition = partition;
                DisplayVideoCollection.Clear();
                List<VideoViewModel> videoList = null;
                if (_cachedRankData.ContainsKey(partition))
                {
                    videoList = _cachedRankData[partition];
                }
                else
                {
R
Richasy 已提交
72 73
                    var rankList = await _controller.GetRankAsync(partition.PartitionId);
                    if (rankList?.Any() ?? false)
R
Richasy 已提交
74
                    {
R
Richasy 已提交
75
                        videoList = rankList.Select(p => new VideoViewModel(p)).ToList();
R
Richasy 已提交
76 77 78 79 80 81 82 83 84 85 86 87 88 89
                        _cachedRankData.Add(partition, videoList);
                    }
                }

                if (videoList != null)
                {
                    videoList.ForEach(p => DisplayVideoCollection.Add(p));
                }

                IsRankLoading = false;
            }
        }
    }
}