private void EnsureShapePropertyControlUpdated(object propertyName) { PaintDotNet.UI.FrameworkElement element; Property property = this.TryGetChanges().ShapePropertySchema[propertyName]; if (!(property is DoubleVectorProperty)) { throw new InternalErrorException(); } if (!this.propertyNameToControlMap.TryGetValue(propertyName, out element)) { CircleHandleDrawing drawing = new CircleHandleDrawing(); HandleElement handleElement = new HandleElement(drawing); handleElement.SetBinding(DrawingElement.ScaleProperty, this, PropertyPathUtil.Combine(ToolUICanvas.CanvasViewProperty, CanvasView.CanvasHairWidthProperty), BindingMode.OneWay); handleElement.SetBinding <double, PaintDotNet.UI.Thickness>(DrawingElement.PaddingProperty, this, PropertyPathUtil.Combine(ToolUICanvas.CanvasViewProperty, CanvasView.CanvasHairWidthProperty), BindingMode.OneWay, new Func <double, PaintDotNet.UI.Thickness>(ShapesToolUI.GetHandlePadding)); handleElement.SetBinding <bool, Cursor>(PaintDotNet.UI.FrameworkElement.CursorProperty, this, new PaintDotNet.ObjectModel.PropertyPath(UIElement.IsMouseCaptureWithinProperty), BindingMode.OneWay, delegate(bool imcw) { if (!imcw) { return(this.handCursor); } return(this.handMouseDownCursor); }); DependencyFunc <ShapesToolChanges, SizeDouble, PointDouble> func = new DependencyFunc <ShapesToolChanges, SizeDouble, PointDouble>((stc, actsz) => GetShapePropertyControlCanvasOffset(propertyName, stc, actsz)); func.SetArgInput <ShapesToolChanges>(1, this.toolChanges); func.SetArgInput(2, handleElement, new PaintDotNet.ObjectModel.PropertyPath(PaintDotNet.UI.FrameworkElement.ActualSizeProperty)); handleElement.SetBinding(PaintDotNet.UI.Controls.Canvas.LeftProperty, func, new PaintDotNet.ObjectModel.PropertyPath(func.GetValueProperty().Name + ".X", Array.Empty <object>()), BindingMode.OneWay); handleElement.SetBinding(PaintDotNet.UI.Controls.Canvas.TopProperty, func, new PaintDotNet.ObjectModel.PropertyPath(func.GetValueProperty().Name + ".Y", Array.Empty <object>()), BindingMode.OneWay); DependencyObjectTagger.Set <DependencyFunc <ShapesToolChanges, SizeDouble, PointDouble> >(handleElement, shapePropertyControlCanvasOffsetTagKey, func); AnimationStateHelper helper = new AnimationStateHelper { Element = handleElement }; helper.EnableAnimations += delegate(object <sender>, EventArgs <e>) { AnimatedDouble sourceObject = new AnimatedDouble(1.0); handleElement.SetBinding(UIElement.OpacityProperty, sourceObject, new PaintDotNet.ObjectModel.PropertyPath(AnimatedValue <double> .ValuePropertyName, Array.Empty <object>()), BindingMode.OneWay); sourceObject.AnimateRawValue((s, v) => InitializeHandleOpacityStoryboard(s, v, 0.5), null); DependencyObjectTagger.Set <AnimatedDouble>(handleElement, shapePropertyControlOpacityAnimationTagKey, sourceObject); }; helper.DisableAnimations += delegate(object <sender>, EventArgs <e>) { AnimatedDouble num; handleElement.ClearBinding(UIElement.OpacityProperty); if (DependencyObjectTagger.TryGet <AnimatedDouble>(handleElement, shapePropertyControlOpacityAnimationTagKey, out num)) { num.StopAnimation(); num.Dispose(); DependencyObjectTagger.Remove(handleElement, shapePropertyControlOpacityAnimationTagKey); } }; DependencyObjectTagger.Set <AnimationStateHelper>(handleElement, shapePropertyControlOpacityAnimationStateHelperTagKey, helper); ClickDragBehavior.SetAllowClick(handleElement, false); ClickDragBehavior.SetAllowDoubleClick(handleElement, false); ClickDragBehavior.SetAllowDrag(handleElement, true); ClickDragBehavior.SetIsEnabled(handleElement, true); SetShapePropertyName(handleElement, propertyName); SetHandleType(handleElement, ShapesToolHandleType.ShapeProperty); base.AddVisualChild(handleElement); element = handleElement; this.propertyNameToControlMap.Add(propertyName, element); } }
public BrushToolUIBase(string canvasMouseCursorUpResName) { ClickDragBehavior.SetIsEnabled(this, true); ClickDragBehavior.SetAllowClick(this, false); this.canvasMouseUpCursor = CursorUtil.LoadResource(canvasMouseCursorUpResName); this.mouseCenterPt = new DependencyValue <PointDouble>(); this.toolState = new DependencyValue <TransactedToolState>(); this.toolState.SetBinding(this.toolState.GetValueProperty(), this, new PaintDotNet.ObjectModel.PropertyPath(ToolUICanvas.ToolProperty.Name + ".State", Array.Empty <object>()), BindingMode.OneWay); this.toolState.ValueChanged += new ValueChangedEventHandler <TransactedToolState>(this.OnToolStateChanged); this.brushPreviewDrawing = new CircleHandleDrawing(); this.brushPreviewDrawing.AutoScaleWithDpi = false; this.brushPreviewElement = new HandleElement(this.brushPreviewDrawing); this.brushPreviewElement.IsHitTestVisible = false; this.brushPreviewElement.IsHotOnMouseOver = false; this.brushPreviewElementCanvasOffset = new DependencyFunc <PointDouble, SizeDouble, PointDouble>(new Func <PointDouble, SizeDouble, PointDouble>(BrushToolUIBase <TDerived, TTool, TChanges> .GetHandleCanvasOffset)); this.brushPreviewElementCanvasOffset.SetArgInput <PointDouble>(1, this.mouseCenterPt); this.brushPreviewElementCanvasOffset.SetArgInput(2, this.brushPreviewElement, new PaintDotNet.ObjectModel.PropertyPath(PaintDotNet.UI.FrameworkElement.ActualSizeProperty)); this.brushPreviewElement.SetBinding(PaintDotNet.UI.Controls.Canvas.LeftProperty, this.brushPreviewElementCanvasOffset, new PaintDotNet.ObjectModel.PropertyPath("Value.X", Array.Empty <object>()), BindingMode.OneWay); this.brushPreviewElement.SetBinding(PaintDotNet.UI.Controls.Canvas.TopProperty, this.brushPreviewElementCanvasOffset, new PaintDotNet.ObjectModel.PropertyPath("Value.Y", Array.Empty <object>()), BindingMode.OneWay); this.brushPreviewElement.SetBinding(DrawingElement.ScaleProperty, this, PropertyPathUtil.Combine(ToolUICanvas.CanvasViewProperty, CanvasView.CanvasHairWidthProperty), BindingMode.OneWay); base.Children.Add(this.brushPreviewElement); base.Loaded += new EventHandler(this.OnLoaded); base.Unloaded += new EventHandler(this.OnUnloaded); }