public ExpressionNodeDataViewModel(ExpressionNodeData model, List <ExpressionNodeDataViewModel> allNodes, ICommand?openInNewWindow = null, RelayCommand?copyWatchExpression = null) : base(model) { if (model.EnableValueInNewWindow) { OpenInNewWindow = openInNewWindow; } CopyWatchExpression = copyWatchExpression; Children = model.Children.Select(x => { var vm = new ExpressionNodeDataViewModel(x, allNodes, openInNewWindow, CopyWatchExpression); allNodes.Add(vm); return(vm); }).ToList(); }
public VisualizerDataViewModel(VisualizerData model, ICommand?openInNewWindow = null, RelayCommand?copyWatchExpression = null) : base(model) { AllNodes = new List <ExpressionNodeDataViewModel>(); Root = new ExpressionNodeDataViewModel(model.Root, AllNodes, openInNewWindow, copyWatchExpression); var grouped = AllNodes .Where(x => x.Model.EndNodeType != null) .GroupBy( x => x.Model.EndNodeType !.Value, (endNodeType, grp) => ( endNodeType, grp.GroupBy( x => x.Model.EndNodeData, (endNodeData, grp1) => new EndNodeGroupViewModel(endNodeData, grp1) ) ) ) .SelectMany(x => x.Item2.Select(y => (x.endNodeType, y))) .ToLookup(x => x.endNodeType, x => x.Item2); Constants = grouped[Constant].ToList(); Parameters = grouped[Parameter].ToList(); ClosedVars = grouped[ClosedVar].ToList(); Defaults = grouped[Default].ToList(); allGroups = grouped.SelectMany().ToList(); UpdateSelection = new RelayCommand(sender => { if (inUpdateSelection) { return; } inUpdateSelection = true; switch (sender) { case string s: var selected = FindNodeBySpan(SourceSelectionStart, SourceSelectionLength); Root.ClearSelection(selected); break; case ExpressionNodeDataViewModel node: Root.ClearSelection(node); (SourceSelectionStart, SourceSelectionLength) = node.Model.Span; break; case EndNodeGroupViewModel group: allGroups.Where(x => x != group).ForEach(x => x.IsSelected = false); Root.ClearSelection(group.Nodes.ToArray()); (SourceSelectionStart, SourceSelectionLength) = group.Nodes.First().Model.Span; break; case null: // previously selected group was unselected (presumably the only way for null to be passed in) Root.ClearSelection(); break; default: throw new InvalidOperationException("Selection update from unknown part of viewmodel"); } inUpdateSelection = false; }); }