public static UWPVirtualizingCache <TSource, TTarget, TKey> ToNative <TSource, TTarget, TKey>(this VirtualizingCache <TSource, TTarget, TKey> cache)
     where TSource : class, IVirtualizableSource <TKey>
     where TTarget : class, IVirtualizableTarget <TSource, TKey>
     where TKey : IEquatable <TKey>
 {
     return(new UWPVirtualizingCache <TSource, TTarget, TKey>(cache));
 }
Esempio n. 2
0
        public MessageListViewModel(string folderId,
                                    FolderType folderType,
                                    MailBoxViewModel mailBox,
                                    IProfileDataQueryFactory queryFactory,
                                    IMailService mailService,
                                    ViewModelActivator activator)
        {
            var canExecute = this.WhenAnyObservable(x => x.Cache.SelectionChanged)
                             .Select(x => x.IndexCount() > 0)
                             .Publish();

            Activator = activator;

            Archive = ReactiveCommand.Create <IReadOnlyList <string> >(async messageIds =>
            {
                PrepareMessageIds(ref messageIds);
                await mailService.MoveMessage(messageIds, FolderType.Archive);
            }, canExecute);

            Delete = ReactiveCommand.Create <IReadOnlyList <string> >(async messageIds =>
            {
                PrepareMessageIds(ref messageIds);
                if (folderType != FolderType.DeletedItems)
                {
                    await mailService.MoveMessage(messageIds, FolderType.DeletedItems);
                }
            }, canExecute);

            MarkAsRead = ReactiveCommand.Create <IReadOnlyList <string> >(async messageIds =>
            {
                PrepareMessageIds(ref messageIds);
                await mailService.UpdateMessage(messageIds)
                .Set(m => m.IsRead, true)
                .ExecuteAsync();
            }, canExecute);

            MarkAsUnread = ReactiveCommand.Create <IReadOnlyList <string> >(async messageIds =>
            {
                PrepareMessageIds(ref messageIds);
                await mailService.UpdateMessage(messageIds)
                .Set(m => m.IsRead, false)
                .ExecuteAsync();
            }, canExecute);

            SetFlag = ReactiveCommand.Create <IReadOnlyList <string> >(async messageIds =>
            {
                PrepareMessageIds(ref messageIds);
                await mailService.UpdateMessage(messageIds)
                .Set(m => m.IsFlagged, true)
                .ExecuteAsync();
            }, canExecute);

            ClearFlag = ReactiveCommand.Create <IReadOnlyList <string> >(async messageIds =>
            {
                PrepareMessageIds(ref messageIds);
                await mailService.UpdateMessage(messageIds)
                .Set(m => m.IsFlagged, false)
                .ExecuteAsync();
            }, canExecute);

            Move = ReactiveCommand.CreateFromTask <IReadOnlyList <string> >(async messageIds =>
            {
                PrepareMessageIds(ref messageIds);

                var selectionResult = await mailBox.PromptUserToSelectFolder(
                    messageIds.Count == 1 ? "Move a message" : $"Move {messageIds.Count} messages",
                    "Select another folder to move to:",
                    includeRoot: false,
                    destinationFolder => CanMoveTo(folderId, destinationFolder));

                if (!selectionResult.IsCancelled)
                {
                    await mailService.MoveMessage(messageIds, selectionResult.SelectedFolder.Id);
                }
            }, canExecute);

            MoveToJunk = ReactiveCommand.CreateFromTask <IReadOnlyList <string> >(async messageIds =>
            {
                PrepareMessageIds(ref messageIds);
                await mailService.MoveMessage(messageIds, FolderType.Junk);
            }, canExecute);

            this.WhenActivated(disposables =>
            {
                canExecute.Connect()
                .DisposeWith(disposables);

                Archive.ThrownExceptions
                .Do(this.Log().Error)
                .Subscribe()
                .DisposeWith(disposables);

                Delete.ThrownExceptions
                .Do(this.Log().Error)
                .Subscribe()
                .DisposeWith(disposables);

                SetFlag.ThrownExceptions
                .Do(this.Log().Error)
                .Subscribe()
                .DisposeWith(disposables);

                ClearFlag.ThrownExceptions
                .Do(this.Log().Error)
                .Subscribe()
                .DisposeWith(disposables);

                MarkAsRead.ThrownExceptions
                .Do(this.Log().Error)
                .Subscribe()
                .DisposeWith(disposables);

                MarkAsUnread.ThrownExceptions
                .Do(this.Log().Error)
                .Subscribe()
                .DisposeWith(disposables);

                Move.ThrownExceptions
                .Do(this.Log().Error)
                .Subscribe()
                .DisposeWith(disposables);

                MoveToJunk.ThrownExceptions
                .Do(this.Log().Error)
                .Subscribe()
                .DisposeWith(disposables);

                Observable.CombineLatest(
                    this.WhenAnyValue(x => x.Order),
                    this.WhenAnyValue(x => x.Filter),
                    (order, filter) => (Order: order, Filter: filter))
                .DistinctUntilChanged()
                .Where(x => x.Order != MessageOrder.Sender)
                .Subscribe(x =>
                {
                    Cache?.Dispose();
                    Cache = new VirtualizingCache <MessageSummary, MessageSummaryViewModel, string>(
                        new PersistentVirtualizingSource <MessageSummary, string>(queryFactory,
                                                                                  GetItemSpecification(folderId, x.Order, x.Filter),
                                                                                  GetIndexSpecification(folderId, x.Order, x.Filter)),
                        mailService.MessageChanges
                        .Select(changes => FilterChanges(changes.ForFolder(folderId), x.Filter)),
                        state => new MessageSummaryViewModel(state, this, queryFactory));
                })
                .DisposeWith(disposables);

                this.WhenAnyObservable(x => x.Cache.SelectionChanged)
                .Select(ranges => ranges.Sum(r => r.Length))
                .Do(x => SelectionCount = x)
                .Subscribe()
                .DisposeWith(disposables);

                Disposable.Create(() =>
                {
                    Filter = MessageFilter.None;
                    Cache?.Dispose();
                    Cache          = null;
                    IsSelecting    = false;
                    SelectionCount = 0;
                })
                .DisposeWith(disposables);
            });
        }
 public UWPVirtualizingCache(VirtualizingCache <TSource, TTarget, TKey> cache)
 {
     _cache = cache;
 }