private void XStartThumb_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e) { TimeMarkerViewModel vm = DataContext as TimeMarkerViewModel; if (vm == null) { return; } var orgStartTime = vm.Time; if (Keyboard.Modifiers == (ModifierKeys.Control | ModifierKeys.Alt)) { m_HorizontalOffsetAtDragStart = e.HorizontalChange; } else { vm.Time += TV.XToTime(e.HorizontalChange) - TV.XToTime(0); if (Keyboard.Modifiers != ModifierKeys.Shift) { double snapTime = TV.TimeSnapHandler.CheckForSnapping(vm.Time, this); if (!Double.IsNaN(snapTime)) { vm.Time = snapTime; } } } //UpdateMappingShape(); App.Current.UpdateRequiredAfterUserInteraction = true; e.Handled = true; }
private void XTimeClip_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e) { if (Keyboard.Modifiers == ModifierKeys.Control) { TimeMarkerViewModel vm = DataContext as TimeMarkerViewModel; if (vm == null) { return; } double orgTime = vm.Time; double delta = TV.XToTime(e.HorizontalChange) - TV.XToTime(0); double snapTime = TV.TimeSnapHandler.CheckForSnapping(vm.Time + delta, this); if (!Double.IsNaN(snapTime)) { delta = snapTime - orgTime; } vm.Time += delta; App.Current.UpdateRequiredAfterUserInteraction = true; e.Handled = true; } }
private void XTimeClip_Thumb_DragCompleted(object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e) { if (Math.Abs(e.VerticalChange) < SystemParameters.MinimumVerticalDragDistance || Math.Abs(e.HorizontalChange) < SystemParameters.MinimumHorizontalDragDistance) { TimeMarkerViewModel vm = DataContext as TimeMarkerViewModel; if (vm != null) { var list = new List <ISelectable>(); list.Add(vm.OperatorWidget); App.Current.MainWindow.CompositionView.CompositionGraphView.SelectedElements = list; } } }
/** * Note: This is a very unfortunate solution to get the Operator title into the TimeMarkerControl. * To make this possible, we have to introduce ClipNamePropertry as a mediator and bind this to * the OperatorWidget. To make it worse, the OperatorWidget is only available in the DataContext * after TimeMarkerControl ist loaded. * * This function creates the second binding in the chain: * * TimeMarkerControl.TextBlock.Text ---> TimeMarkerControl.ClipName ---> DataContext(ViewModel).OperatorWidget.XOperatorLabel.Text */ private void CreateNameBinding() { TimeMarkerViewModel vm = DataContext as TimeMarkerViewModel; if (vm != null) { var nameBinding = new Binding() { UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged, Source = vm.OperatorWidget.XOperatorLabel, Path = new PropertyPath("Text"), }; this.SetBinding(TimeMarkerControl.ClipNameProperty, nameBinding); } }
public SnapResult CheckForSnap(double time) { TimeMarkerViewModel vm = DataContext as TimeMarkerViewModel; if (vm != null) { double distanceToStartTime = Math.Abs(time - vm.Time) * TV.TimeScale; if (distanceToStartTime < SNAP_THRESHOLD) { return(new SnapResult() { SnapToValue = vm.Time, Force = distanceToStartTime }); } } return(null); }