private void operationViewModelUpdated(OperationViewModel current) { if (current.OperationModel is IStatisticallyComparableOperationModel) { // update last moved time _lastMoved[current] = DateTime.Now; var allComparableOperationViewModels = MainViewController.Instance.OperationViewModels.Where(c => c.OperationModel is IStatisticallyComparableOperationModel); // check if we need to create new inputvisualization views foreach (var other in allComparableOperationViewModels) { var diff = current.Position - other.Position; var areLinked = FilterLinkViewController.Instance.AreOperationViewModelsLinked(current, other); if (!areLinked) { if ((Math.Abs(diff.Y) < 300) && (boundHorizontalDistance(current.Bounds, other.Bounds) < 200) && _lastMoved.ContainsKey(other) && (other != current) && (Math.Abs((_lastMoved[other] - _lastMoved[current]).TotalMilliseconds) < 400)) { if (!StatisticalComparisonViews.Keys.Any(sov => sov.OperationViewModels.Contains(current) && sov.OperationViewModels.Contains(other))) { var comparisonOperationViewModel = new StatisticalComparisonOperationViewModel( new StatisticalComparisonOperationModel(current.OperationModel.SchemaModel)); comparisonOperationViewModel.OperationViewModels.Add(other); comparisonOperationViewModel.OperationViewModels.Add(current); var a1 = (other.OperationModel as HistogramOperationModel) .GetAttributeUsageTransformationModel(AttributeUsage.X).FirstOrDefault(); var a2 = (current.OperationModel as HistogramOperationModel) .GetAttributeUsageTransformationModel(AttributeUsage.X).FirstOrDefault(); comparisonOperationViewModel.StatisticalComparisonOperationModel.TestType = TestType.chi2; if (a1.AttributeModel.RawName != a2.AttributeModel.RawName) { comparisonOperationViewModel.StatisticalComparisonOperationModel.TestType = TestType.corr; } else if ((a1.AttributeModel as AttributeFieldModel).InputDataType == InputDataTypeConstants.FLOAT || (a1.AttributeModel as AttributeFieldModel).InputDataType == InputDataTypeConstants.INT) { comparisonOperationViewModel.StatisticalComparisonOperationModel.TestType = TestType.ttest; } comparisonOperationViewModel.Position = (comparisonOperationViewModel.OperationViewModels.Aggregate(new Vec(), (a, b) => a + b.Bounds.Center.GetVec()) / 2.0 - comparisonOperationViewModel.Size / 2.0) .GetWindowsPoint(); comparisonOperationViewModel.ComparisonViewModelState = ComparisonViewModelState.Opening; comparisonOperationViewModel.DwellStartPosition = current.Position; comparisonOperationViewModel.TicksSinceDwellStart = DateTime.Now.Ticks; var view = new ComparisonView(); view.DataContext = comparisonOperationViewModel; MainViewController.Instance.InkableScene.Children.Add(view); StatisticalComparisonViews.Add(comparisonOperationViewModel, view); } } } } } }
void ComparisonViewModel_DataContextChanged(FrameworkElement sender, DataContextChangedEventArgs args) { if (_model != null) { _model.PropertyChanged -= _model_PropertyChanged; _model.StatisticalComparisonOperationModel.PropertyChanged -= StatisticalComparisonOperationModel_PropertyChanged; foreach (var vis in _model.OperationViewModels) { vis.PropertyChanged -= VisModel_PropertyChanged; } } if (args.NewValue != null) { _model = (StatisticalComparisonOperationViewModel)args.NewValue; _model.PropertyChanged += _model_PropertyChanged; _model.StatisticalComparisonOperationModel.PropertyChanged += StatisticalComparisonOperationModel_PropertyChanged; foreach (var vis in _model.OperationViewModels) { vis.PropertyChanged += VisModel_PropertyChanged; } updateRendering(); if (_menuView == null) { _menuViewModel = new MenuViewModel { AttachmentOrientation = AttachmentOrientation.Right, NrColumns = 1, NrRows = 3 }; var toggles = new List <ToggleMenuItemComponentViewModel>(); var items = new List <MenuItemViewModel>(); TestType[] types = new TestType[] { TestType.chi2, TestType.ttest, TestType.corr }; int count = 0; foreach (var type in types) { var toggleMenuItem = new MenuItemViewModel { MenuViewModel = _menuViewModel, Row = count, RowSpan = 0, Position = new Pt(0, 0), Column = 0, Size = new Vec(50, 22.333), TargetSize = new Vec(50, 22.333), }; //toggleMenuItem.Position = attachmentItemViewModel.Position; var toggle = new ToggleMenuItemComponentViewModel { Label = type.ToString(), IsChecked = _model.StatisticalComparisonOperationModel.TestType == type }; toggles.Add(toggle); toggleMenuItem.MenuItemComponentViewModel = toggle; toggleMenuItem.MenuItemComponentViewModel.PropertyChanged += (sender2, args2) => { var model = sender2 as ToggleMenuItemComponentViewModel; if (args2.PropertyName == model.GetPropertyName(() => model.IsChecked)) { if (model.IsChecked) { _model.StatisticalComparisonOperationModel.TestType = type; _model.StatisticalComparisonOperationModel.FireOperationModelUpdated(new OperationModelUpdatedEventArgs()); foreach (var tg in model.OtherToggles) { tg.IsChecked = false; } } } }; _menuViewModel.MenuItemViewModels.Add(toggleMenuItem); items.Add(toggleMenuItem); count++; } foreach (var mi in items) { (mi.MenuItemComponentViewModel as ToggleMenuItemComponentViewModel).OtherToggles.AddRange(toggles.Where(ti => ti != mi.MenuItemComponentViewModel)); } _menuView = new MenuView() { DataContext = _menuViewModel }; menuCanvas.Children.Add(_menuView); _menuViewModel.IsDisplayed = true; } } }