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); }
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; } }
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 }
/// <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; } } }); } }
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); } }
private void TabSelectChanged(TreeViewModelBase viewModel) { if (viewModel == null || _sortInfo == null) { return; } this.TabSelectChanged(viewModel, _sortInfo.PropertyName, _sortInfo.Direction); }
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); }
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); }
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); }
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); }
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; }); } }
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; }); } }
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); } }
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); }
/// <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); } } }