示例#1
0
        private void OnCompleted(OverlapArea overlapArea, TreeViewItem overlapItem, TreeViewItem draggingItem)
        {
            TreeBackground = Brushes.Transparent;
            TreeViewModelBase.Foreach(TreeCollection, m => m.IsDragOver = false);

            if (overlapArea == OverlapArea.Out)
            {
                return;
            }

            var draggingModel = draggingItem.DataContext as TreeViewModel;
            var overlapModel  = overlapItem?.DataContext as TreeViewModel;

            /*
             * 1. 拖动项是目标目录时,不做移动
             * 2. 拖动项是目标目录的直接或间接父节点时,不做移动
             */
            if (overlapModel != null && draggingModel.Any <TreeViewModel>(m => m == overlapModel, true))
            {
                TreeViewModelBase.Foreach(TreeCollection, m => m.IsDragOver = false);
                return;
            }

            Move(draggingModel, overlapModel, false, (overlapArea & OverlapArea.Up) == OverlapArea.Up);
        }
示例#2
0
        private async void TabSelectChanged(TreeViewModelBase viewModel, string propertyName, ListSortDirection direction)
        {
            if (viewModel is SearchViewModel searchViewModel)
            {
                IEnumerable <SearchListViewItemInfo> searchItems = null;
                {
                    var tempViewModels = new List <SearchViewModel>();
                    tempViewModels.AddRange(searchViewModel.GetAncestors().OfType <SearchViewModel>());

                    await Task.Run(() =>
                    {
                        searchItems = _cache_SearchItems.ToList();

                        foreach (var tempViewModel in tempViewModels)
                        {
                            searchItems = Filter(searchItems, tempViewModel.Model);
                        }

                        searchItems = this.Sort(searchItems, propertyName, direction, 100000);
                    });
                }

                if (this.TabSelectedItem.Value != viewModel)
                {
                    return;
                }

                searchViewModel.Model.IsUpdated = false;

                _contents.Clear();
                _contents.AddRange(searchItems);

                searchViewModel.Count.Value = _contents.Count;
            }
        }
示例#3
0
        private void OnCompleted(OverlapArea overlapArea, TreeViewItem overlapItem, TreeViewItem draggingItem)
        {
            TreeBackground = Brushes.Transparent;
            TreeViewModelBase.Foreach(TreeCollection, m => m.IsDragOver = false);

            if (overlapArea == OverlapArea.Out)
            {
                return;
            }

            var draggingModel      = draggingItem.DataContext as TreeViewModel;
            var overlapFolderModel = overlapItem?.DataContext as TreeViewModel;

            /*
             * 1. 拖动项是目标目录的直接子节点时,包括目标目录是根目录的情况,不做移动
             *    注:目标目录是根目录时,overlapItem 是 null
             * 2. 拖动项是目标目录时,不做移动
             * 3. 拖动项是目标目录的直接或间接父节点时,不做移动
             */
            if (draggingModel.Parent == overlapFolderModel ||
                draggingModel == overlapFolderModel ||
                overlapFolderModel != null && draggingModel.Any <TreeViewModel>(m => m == overlapFolderModel))
            {
                return;
            }

            //TODO Move
        }
示例#4
0
        /// <summary>
        /// 若当前节点可见:
        /// 1.该节点以上的父节点均得可见
        /// 2.若该节点所有子节点均不可见,则该节点以下的子节点均得可见
        /// </summary>
        public void TryFilter(Predicate <T> filter)
        {
            if (filter == null)
            {
                TreeViewModelBase.Foreach(_source, n => n.Visibility = Visibility.Visible);
                return;
            }

            foreach (var nodeList in _childToParentNodeStack)
            {
                nodeList.ForEach(node =>
                {
                    node.Visibility = filter(node) ? Visibility.Visible : Visibility.Collapsed;

                    //父节点满足条件,则所有子节点都显示
                    //父节点不满足条件,则根据是否存在显示的子节点来决定
                    if (node.Nodes != null && node.Nodes.Any())
                    {
                        if (node.Visibility == Visibility.Visible)
                        {
                            TreeViewModelBase.Foreach((IEnumerable <T>)node.Nodes, n => n.Visibility = Visibility.Visible);
                        }
                        else
                        {
                            node.Visibility = node.Nodes.Any(n => n.Visibility == Visibility.Visible) ? Visibility.Visible : Visibility.Collapsed;
                        }
                    }
                });
            }
        }
示例#5
0
        private void TabSelectChanged(TreeViewModelBase viewModel, string propertyName, ListSortDirection direction)
        {
            _contents.Clear();

            if (viewModel is StoreCategoryViewModel categoryViewModel)
            {
                var items = this.GetListViewItems(categoryViewModel.Model.CategoryInfos, categoryViewModel.Model.SignatureInfos,
                                                  Array.Empty <StoreBoxInfo>(), Array.Empty <Seed>(), propertyName, direction);

                _contents.AddRange(items);
            }
            else if (viewModel is StoreSignatureViewModel signatureViewModel)
            {
                signatureViewModel.Model.IsUpdated = false;

                var items = this.GetListViewItems(Array.Empty <StoreCategoryInfo>(), Array.Empty <StoreSignatureInfo>(),
                                                  signatureViewModel.Model.BoxInfos, Array.Empty <Seed>(), propertyName, direction);

                _contents.AddRange(items);
            }
            else if (viewModel is StoreBoxViewModel boxViewModel)
            {
                var items = this.GetListViewItems(Array.Empty <StoreCategoryInfo>(), Array.Empty <StoreSignatureInfo>(),
                                                  boxViewModel.Model.BoxInfos, boxViewModel.Model.Seeds, propertyName, direction);

                _contents.AddRange(items);
            }
        }
示例#6
0
        private void TabSelectChanged(TreeViewModelBase viewModel)
        {
            if (viewModel == null || _sortInfo == null)
            {
                return;
            }

            this.TabSelectChanged(viewModel, _sortInfo.PropertyName, _sortInfo.Direction);
        }
示例#7
0
        private void TabSelectChanged(TreeViewModelBase viewModel)
        {
            if (viewModel is ChatCategoryViewModel chatCategoryViewModel)
            {
                this.IsTrustFilterEnable.Value = false;
                this.IsNewFilterEnable.Value   = false;
                this.Info.Value = null;
            }
            else if (viewModel is ChatThreadViewModel chatThreadViewModel)
            {
                this.IsTrustFilterEnable.Value = chatThreadViewModel.Model.IsTrustMessageOnly;
                this.IsNewFilterEnable.Value   = chatThreadViewModel.Model.IsNewMessageOnly;

                var trustSignatures = new HashSet <Signature>(_messageManager.TrustSignatures);
                var messages        = new List <ChatMessageInfo>();

                lock (chatThreadViewModel.Model.Messages.LockObject)
                {
                    foreach (var info in chatThreadViewModel.Model.Messages.ToArray())
                    {
                        if (chatThreadViewModel.Model.IsNewMessageOnly && !info.State.HasFlag(ChatMessageState.New))
                        {
                            continue;
                        }
                        if (chatThreadViewModel.Model.IsTrustMessageOnly && !trustSignatures.Contains(info.Message.AuthorSignature))
                        {
                            continue;
                        }

                        if (!trustSignatures.Contains(info.Message.AuthorSignature))
                        {
                            if (info.Message.Cost.CashAlgorithm != CashAlgorithm.Version1)
                            {
                                continue;
                            }
                            if (info.Message.Cost.Value < this.SelectedMiningLimit.Value)
                            {
                                continue;
                            }
                        }

                        messages.Add(new ChatMessageInfo()
                        {
                            Message = info.Message, State = info.State
                        });

                        info.State &= ~ChatMessageState.New;
                    }
                }

                chatThreadViewModel.Model.IsUpdated = false;
                chatThreadViewModel.Count.Value     = 0;

                this.Info.Value = new AvalonEditChatMessagesInfo(messages, trustSignatures);
            }
        }
        public RelationSignatureViewModel(TreeViewModelBase parent, RelationSignatureInfo model)
            : base(parent)
        {
            this.Model = model;

            this.Name       = model.ObserveProperty(n => n.Signature).Select(n => n.ToString()).ToReactiveProperty().AddTo(_disposable);
            this.IsSelected = new ReactiveProperty <bool>().AddTo(_disposable);
            this.IsExpanded = new ReactiveProperty <bool>(true).AddTo(_disposable);
            this.Children   = model.Children.ToReadOnlyReactiveCollection(n => new RelationSignatureViewModel(this, n)).AddTo(_disposable);
        }
        public StoreSignatureViewModel(TreeViewModelBase parent, StoreSignatureInfo model)
            : base(parent)
        {
            this.Model = model;

            this.Name          = model.ObserveProperty(n => n.AuthorSignature).Select(n => n.ToString()).ToReactiveProperty().AddTo(_disposable);
            this.IsSelected    = new ReactiveProperty <bool>().AddTo(_disposable);
            this.IsExpanded    = model.ToReactivePropertyAsSynchronized(n => n.IsExpanded).AddTo(_disposable);
            this.IsUpdated     = model.ToReactivePropertyAsSynchronized(n => n.IsUpdated).AddTo(_disposable);
            this.BoxViewModels = model.BoxInfos.ToReadOnlyReactiveCollection(n => new StoreBoxViewModel(this, n)).AddTo(_disposable);
        }
示例#10
0
        public ChatThreadViewModel(TreeViewModelBase parent, ChatThreadInfo model)
            : base(parent)
        {
            this.Model = model;

            this.IsSelected = new ReactiveProperty <bool>().AddTo(_disposable);
            this.Name       = model.ObserveProperty(n => n.Tag).Select(n => n.Name).ToReactiveProperty().AddTo(_disposable);
            this.IsUpdated  = model.ToReactivePropertyAsSynchronized(n => n.IsUpdated).AddTo(_disposable);
            this.Count      = new ReactiveProperty <int>(0).AddTo(_disposable);
            this.Id         = model.ObserveProperty(n => n.Tag).Select(n => n.Id).ToReactiveProperty().AddTo(_disposable);
        }
示例#11
0
        public ChatCategoryViewModel(TreeViewModelBase parent, ChatCategoryInfo model)
            : base(parent)
        {
            this.Model = model;

            this.Name       = model.ToReactivePropertyAsSynchronized(n => n.Name).AddTo(_disposable);
            this.IsSelected = new ReactiveProperty <bool>().AddTo(_disposable);
            this.IsExpanded = model.ToReactivePropertyAsSynchronized(n => n.IsExpanded).AddTo(_disposable);
            this.Threads    = model.ThreadInfos.ToReadOnlyReactiveCollection(n => new ChatThreadViewModel(this, n)).AddTo(_disposable);
            this.Categories = model.CategoryInfos.ToReadOnlyReactiveCollection(n => new ChatCategoryViewModel(this, n)).AddTo(_disposable);
        }
        public StoreCategoryViewModel(TreeViewModelBase parent, StoreCategoryInfo model)
            : base(parent)
        {
            this.Model = model;

            this.Name                = model.ToReactivePropertyAsSynchronized(n => n.Name).AddTo(_disposable);
            this.IsSelected          = new ReactiveProperty <bool>().AddTo(_disposable);
            this.IsExpanded          = model.ToReactivePropertyAsSynchronized(n => n.IsExpanded).AddTo(_disposable);
            this.SignatureViewModels = model.SignatureInfos.ToReadOnlyReactiveCollection(n => new StoreSignatureViewModel(this, n)).AddTo(_disposable);
            this.CategoryViewModels  = model.CategoryInfos.ToReadOnlyReactiveCollection(n => new StoreCategoryViewModel(this, n)).AddTo(_disposable);
        }
        public UploadDirectoryViewModel(TreeViewModelBase parent, UploadDirectoryInfo model)
            : base(parent)
        {
            this.Model = model;

            this.Name          = model.ToReactivePropertyAsSynchronized(n => n.Name).AddTo(_disposable);
            this.IsSelected    = new ReactiveProperty <bool>().AddTo(_disposable);
            this.IsExpanded    = model.ToReactivePropertyAsSynchronized(n => n.IsExpanded).AddTo(_disposable);
            this.Seeds         = model.Seeds.ToReadOnlyReactiveCollection(n => n).AddTo(_disposable);
            this.BoxViewModels = model.BoxInfos.ToReadOnlyReactiveCollection(n => new UploadBoxViewModel(this, n)).AddTo(_disposable);
        }
示例#14
0
        public SearchViewModel(TreeViewModelBase parent, SearchInfo model)
            : base(parent)
        {
            this.Model = model;

            this.Name       = model.ObserveProperty(n => n.Name).ToReactiveProperty().AddTo(_disposable);
            this.IsSelected = new ReactiveProperty <bool>().AddTo(_disposable);
            this.IsExpanded = model.ToReactivePropertyAsSynchronized(n => n.IsExpanded).AddTo(_disposable);
            this.Children   = model.Children.ToReadOnlyReactiveCollection(n => new SearchViewModel(this, n)).AddTo(_disposable);
            this.IsUpdated  = model.ToReactivePropertyAsSynchronized(n => n.IsUpdated).AddTo(_disposable);
            this.Count      = new ReactiveProperty <int>(0).AddTo(_disposable);
        }
        public UploadStoreViewModel(TreeViewModelBase parent, UploadStoreInfo model)
            : base(parent)
        {
            this.Model = model;

            this.Name                = SettingsManager.Instance.AccountSetting.ObserveProperty(n => n.DigitalSignature).Select(n => n.ToString()).ToReactiveProperty().AddTo(_disposable);
            this.IsSelected          = new ReactiveProperty <bool>().AddTo(_disposable);
            this.IsExpanded          = model.ToReactivePropertyAsSynchronized(n => n.IsExpanded).AddTo(_disposable);
            this.IsUpdated           = model.ToReactivePropertyAsSynchronized(n => n.IsUpdated).AddTo(_disposable);
            this.DirectoryViewModels = model.DirectoryInfos.ToReadOnlyReactiveCollection(n => new UploadDirectoryViewModel(this, n)).AddTo(_disposable);
            this.CategoryViewModels  = model.CategoryInfos.ToReadOnlyReactiveCollection(n => new UploadCategoryViewModel(this, n)).AddTo(_disposable);
        }
示例#16
0
        private void OnOverlapItem(OverlapArea overlapArea, ListBoxItem overlapItem, ListBoxItem draggingItem)
        {
            var draggingModel = draggingItem.DataContext as TreeViewModel;

            draggingModel.IsDragSource = true;

            if (overlapArea == OverlapArea.Out)
            {
                TreeBackground = Brushes.Transparent;
                TreeViewModelBase.Foreach(TreeCollection, m => m.IsDragOver = false);
                return;
            }

            var overlapModel = overlapItem?.DataContext as TreeViewModel;

            /*
             * 1. 拖动项是目标目录时,不做移动
             */
            if (overlapModel != null && overlapModel == draggingModel)
            {
                TreeBackground = Brushes.Transparent;
                TreeViewModelBase.Foreach(TreeCollection, m => m.IsDragOver = false);
                return;
            }

            //根目录
            if (overlapModel == null)
            {
                TreeBackground = ColorUtil.GetBrushFromString("#d6ebff");
                TreeViewModelBase.Foreach(TreeCollection, m => m.IsDragOver = false);
            }
            else
            {
                TreeBackground = Brushes.Transparent;

                TreeViewModelBase.Foreach(TreeCollection, m =>
                {
                    m.IsDragOverUp    = (overlapArea & OverlapArea.Up) == OverlapArea.Up;
                    m.IsDragOverDown  = (overlapArea & OverlapArea.Down) == OverlapArea.Down;
                    m.IsDragOverLeft  = (overlapArea & OverlapArea.Left) == OverlapArea.Left;
                    m.IsDragOverRight = (overlapArea & OverlapArea.Right) == OverlapArea.Right;
                    m.IsDragOver      = m == overlapModel;
                });
            }
        }
示例#17
0
        private void OnOverlapFolder(OverlapArea overlapArea, TreeViewItem overlapItem, TreeViewItem draggingItem)
        {
            if (overlapArea == OverlapArea.Out)
            {
                TreeBackground = Brushes.Transparent;
                TreeViewModelBase.Foreach(TreeCollection, m => m.IsDragOver = false);
                return;
            }

            var overlapModel  = overlapItem?.DataContext as TreeViewModel;
            var draggingModel = draggingItem.DataContext as TreeViewModel;

            /*
             * 1. 拖动项是目标目录时,不做移动
             * 2. 拖动项是目标目录的直接或间接父节点时,不做移动
             */
            if (overlapModel != null && draggingModel.Any <TreeViewModel>(m => m == overlapModel, true))
            {
                TreeBackground = Brushes.Transparent;
                TreeViewModelBase.Foreach(TreeCollection, m => m.IsDragOver = false);
                return;
            }

            //根目录
            if (overlapModel == null)
            {
                TreeBackground = ColorUtil.GetBrushFromString("#d6ebff");
                TreeViewModelBase.Foreach(TreeCollection, m => m.IsDragOver = false);
            }
            else
            {
                TreeBackground          = Brushes.Transparent;
                overlapModel.IsExpanded = true;

                TreeViewModelBase.Foreach(TreeCollection, m =>
                {
                    m.IsDragOverUp   = (overlapArea & OverlapArea.Up) == OverlapArea.Up;
                    m.IsDragOverDown = (overlapArea & OverlapArea.Down) == OverlapArea.Down;
                    m.IsDragOver     = m == overlapModel;
                });
            }
        }
示例#18
0
        private void OnOverlapItem(OverlapArea overlapArea, TreeViewItem overlapItem, TreeViewItem draggingItem)
        {
            if (overlapArea == OverlapArea.Out)
            {
                TreeBackground = Brushes.Transparent;
                TreeViewModelBase.Foreach(TreeCollection, m => m.IsDragOver = false);
                return;
            }

            var overlapFolderModel = overlapItem?.DataContext as TreeViewModel;
            var draggingModel      = draggingItem.DataContext as TreeViewModel;

            /*
             * 1. 拖动项是目标目录的直接子节点时,包括目标目录是根目录的情况,不做移动
             *    注:目标目录是根目录时,overlapItem 是 null
             * 2. 拖动项是目标目录时,不做移动
             * 3. 拖动项是目标目录的直接或间接父节点时,不做移动
             */
            if (draggingModel.Parent == overlapFolderModel ||
                draggingModel == overlapFolderModel ||
                overlapFolderModel != null && draggingModel.Any <TreeViewModel>(m => m == overlapFolderModel))
            {
                TreeBackground = Brushes.Transparent;
                TreeViewModelBase.Foreach(TreeCollection, m => m.IsDragOver = false);
                return;
            }

            if (overlapFolderModel == null)
            {
                TreeBackground = ColorUtil.GetBrushFromString("#d6ebff");
                TreeViewModelBase.Foreach(TreeCollection, m => m.IsDragOver = false);
                return;
            }
            else
            {
                overlapFolderModel.IsExpanded = true;

                TreeBackground = Brushes.Transparent;
                TreeViewModelBase.Foreach(TreeCollection, m => m.IsDragOver = m == overlapFolderModel);
            }
        }
示例#19
0
        private void OnCompleted(OverlapArea overlapArea, ListBoxItem overlapItem, ListBoxItem draggingItem)
        {
            TreeBackground = Brushes.Transparent;
            TreeViewModelBase.Foreach(TreeCollection, m => m.IsDragOver = m.IsDragSource = false);

            if (overlapArea == OverlapArea.Out)
            {
                return;
            }

            var draggingModel = draggingItem.DataContext as TreeViewModel;
            var overlapModel  = overlapItem?.DataContext as TreeViewModel;

            /*
             * 1. 拖动项是目标目录时,不做移动
             */
            if (overlapModel != null && overlapModel == draggingModel)
            {
                TreeViewModelBase.Foreach(TreeCollection, m => m.IsDragOver = false);
                return;
            }

            //Move(draggingModel, overlapModel, false, (overlapArea & OverlapArea.Up) == OverlapArea.Up);
        }
示例#20
0
        /// <summary>
        /// 将源移动到目标节点的位置
        /// </summary>
        /// <param name="sourceModel">源节点</param>
        /// <param name="targetModel">目标节点,当移动到根目录时,该项为 null</param>
        /// <param name="keepSource">是否保留源节点</param>
        /// <param name="isTargetUp">是否添加到目标节点上方</param>
        private void Move(TreeViewModel sourceModel, TreeViewModel targetModel, bool keepSource = true, bool isTargetUp = true)
        {
            if (sourceModel == null || !keepSource && sourceModel == targetModel)
            {
                return;
            }

            var targetNodes = (ObservableCollection <TreeViewModel>)((targetModel?.Parent?.Nodes) ?? TreeCollection);
            var targetIndex = targetModel == null ? -1 : TreeViewModelBase.IndexOf(targetNodes, m => m == targetModel);

            //非根目录,源与目标处于同一父节点
            if (targetIndex >= 0 && targetModel.Parent == sourceModel.Parent)
            {
                var draggingIndex = TreeViewModelBase.IndexOf(targetNodes, m => m == sourceModel);
                var diff          = targetIndex - draggingIndex;

                //源与目标是同一节点
                if (diff == 0)
                {
                    var newModel = sourceModel.Clone();
                    newModel.Parent = targetModel.Parent;

                    targetNodes.Insert(isTargetUp ? targetIndex : (targetIndex + 1), newModel);
                    return;
                }

                //相邻
                if (diff < 0)
                {
                    if (!keepSource)
                    {
                        targetNodes.Remove(sourceModel);
                    }

                    targetNodes.Insert(isTargetUp ? targetIndex : (targetIndex + 1), sourceModel);
                }
                else
                {
                    if (!keepSource)
                    {
                        targetNodes.Remove(sourceModel);
                    }

                    targetNodes.Insert(isTargetUp ? (targetIndex - 1) : targetIndex, sourceModel);
                }

                return;
            }

            if (!keepSource)
            {
                var sourceNodes = (ObservableCollection <TreeViewModel>)((sourceModel.Parent?.Nodes) ?? TreeCollection);
                sourceNodes.Remove(sourceModel);

                //添加到根目录
                if (targetIndex < 0)
                {
                    sourceModel.Parent = null;
                    targetNodes.Add(sourceModel);
                }
                else
                {
                    sourceModel.Parent = targetModel.Parent;
                    targetNodes.Insert(isTargetUp ? targetIndex : (targetIndex + 1), sourceModel);
                }
            }
            else
            {
                var newModel = sourceModel.Clone();

                //添加到根目录
                if (targetIndex < 0)
                {
                    newModel.Parent = null;
                    targetNodes.Add(newModel);
                }
                else
                {
                    newModel.Parent = targetModel.Parent;
                    targetNodes.Insert(isTargetUp ? targetIndex : (targetIndex + 1), newModel);
                }
            }
        }