diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignSurface.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignSurface.cs index b5e88ce221..4efa725ddb 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignSurface.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/DesignSurface.cs @@ -76,9 +76,8 @@ namespace ICSharpCode.WpfDesign.Designer this.AddCommandHandler(Commands.AlignCenterCommand, () => ModelTools.ArrangeItems(this.DesignContext.Services.Selection.SelectedItems, ArrangeDirection.HorizontalMiddle), () => this.DesignContext.Services.Selection.SelectedItems.Count() > 1); this.AddCommandHandler(Commands.AlignRightCommand, () => ModelTools.ArrangeItems(this.DesignContext.Services.Selection.SelectedItems, ArrangeDirection.Right), () => this.DesignContext.Services.Selection.SelectedItems.Count() > 1); - //Todo - //this.AddCommandHandler(Commands.RotateLeftCommand, () => , () => this.DesignContext.Services.Selection.SelectedItems.Count() > 1); - //this.AddCommandHandler(Commands.RotateRightCommand, () => , () => this.DesignContext.Services.Selection.SelectedItems.Count() > 1); + this.AddCommandHandler(Commands.RotateLeftCommand, () => ModelTools.ApplyTransform(this.DesignContext.Services.Selection.PrimarySelection, new RotateTransform(-90)), () => this.DesignContext.Services.Selection.PrimarySelection != null); + this.AddCommandHandler(Commands.RotateRightCommand, () => ModelTools.ApplyTransform(this.DesignContext.Services.Selection.PrimarySelection, new RotateTransform(90)), () => this.DesignContext.Services.Selection.PrimarySelection != null); _sceneContainer = new Border() { AllowDrop = false, UseLayoutRounding = true }; _sceneContainer.SetValue(TextOptions.TextFormattingModeProperty, TextFormattingMode.Ideal); diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/RotateThumbExtension.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/RotateThumbExtension.cs index 89b39c9aaa..f7e06b31be 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/RotateThumbExtension.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/Extensions/RotateThumbExtension.cs @@ -18,6 +18,7 @@ using System; using System.Diagnostics; +using System.Linq; using System.Windows; using System.Windows.Controls.Primitives; using System.Windows.Input; @@ -116,29 +117,7 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions if (!Keyboard.IsKeyDown(Key.LeftCtrl)) destAngle = ((int)destAngle / 15) * 15; - if (destAngle == 0) - { - this.ExtendedItem.Properties.GetProperty(FrameworkElement.RenderTransformProperty).Reset(); - rtTransform = null; - rotateTransform = null; - } - else - { - if ((rtTransform == null) || !(rtTransform.Component is RotateTransform)) - { - if (!this.ExtendedItem.Properties.GetProperty(FrameworkElement.RenderTransformOriginProperty).IsSet) { - this.ExtendedItem.Properties.GetProperty(FrameworkElement.RenderTransformOriginProperty).SetValue(new Point(0.5,0.5)); - } - - if (this.rotateTransform == null) - this.rotateTransform = new RotateTransform(0); - this.ExtendedItem.Properties.GetProperty(FrameworkElement.RenderTransformProperty).SetValue(rotateTransform); - rtTransform = this.ExtendedItem.Properties[FrameworkElement.RenderTransformProperty].Value; - } - rtTransform.Properties["Angle"].SetValue(destAngle); - - ((DesignPanel) this.ExtendedItem.Services.DesignPanel).AdornerLayer.UpdateAdornersForElement(this.ExtendedItem.View, true); - } + ModelTools.ApplyTransform(this.ExtendedItem, new RotateTransform() { Angle = destAngle }); } void drag_Rotate_Completed(ICSharpCode.WpfDesign.Designer.Controls.DragListener drag) @@ -161,6 +140,13 @@ namespace ICSharpCode.WpfDesign.Designer.Extensions var designerItem = this.ExtendedItem.Component as FrameworkElement; this.rotateTransform = designerItem.RenderTransform as RotateTransform; + if (this.rotateTransform == null) { + var tg = designerItem.RenderTransform as TransformGroup; + if (tg != null) { + this.rotateTransform = tg.Children.FirstOrDefault(x => x is RotateTransform) as RotateTransform; + } + } + } void OnPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/ModelTools.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/ModelTools.cs index 88bfe0a00b..7e1f6b3aa4 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/ModelTools.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Project/ModelTools.cs @@ -344,6 +344,87 @@ namespace ICSharpCode.WpfDesign.Designer return new Tuple(newPanel, new Rect(xmin, ymin, xmax - xmin, ymax - ymin).Round()); } + + public static void ApplyTransform(DesignItem designItem, Transform transform, bool relative = true) + { + var changeGroup = designItem.OpenGroup("Apply Transform"); + + Transform oldTransform = null; + if (designItem.Properties.GetProperty(FrameworkElement.RenderTransformProperty).IsSet) { + oldTransform = designItem.Properties.GetProperty(FrameworkElement.RenderTransformProperty).ValueOnInstance as Transform; + } + + if (oldTransform is MatrixTransform) { + var mt = oldTransform as MatrixTransform; + var tg = new TransformGroup(); + if (mt.Matrix.OffsetX != 0 && mt.Matrix.OffsetY != 0) + tg.Children.Add(new TranslateTransform(){ X = mt.Matrix.OffsetX, Y = mt.Matrix.OffsetY }); + if (mt.Matrix.M11 != 0 && mt.Matrix.M22 != 0) + tg.Children.Add(new ScaleTransform(){ ScaleX = mt.Matrix.M11, ScaleY = mt.Matrix.M22 }); + + var angle = Math.Atan2(mt.Matrix.M21, mt.Matrix.M11) * 180 / Math.PI; + if (angle != 0) + tg.Children.Add(new RotateTransform(){ Angle = angle }); + //if (mt.Matrix.M11 != 0 && mt.Matrix.M22 != 0) + // tg.Children.Add(new SkewTransform(){ ScaleX = mt.Matrix.M11, ScaleY = mt.Matrix.M22 }); + } else if (oldTransform != null && oldTransform.GetType() != transform.GetType()) { + var tg = new TransformGroup(); + var tgDes = designItem.Services.Component.RegisterComponentForDesigner(tg); + tgDes.ContentProperty.CollectionElements.Add(designItem.Services.Component.GetDesignItem(oldTransform)); + designItem.Properties.GetProperty(FrameworkElement.RenderTransformProperty).SetValue(tg); + oldTransform = tg; + } + + + + if (transform is RotateTransform) { + var rotateTransform = transform as RotateTransform; + + if (oldTransform is RotateTransform || oldTransform == null) { + if (rotateTransform.Angle != 0) { + designItem.Properties.GetProperty(FrameworkElement.RenderTransformProperty).SetValue(transform); + var angle = rotateTransform.Angle; + if (relative && oldTransform != null) { + angle = rotateTransform.Angle + ((RotateTransform)oldTransform).Angle; + } + designItem.Properties.GetProperty(FrameworkElement.RenderTransformProperty).Value.Properties.GetProperty(RotateTransform.AngleProperty).SetValue(angle); + designItem.Properties.GetProperty(FrameworkElement.RenderTransformProperty).Value.Properties.GetProperty(RotateTransform.CenterXProperty).SetValue(rotateTransform.CenterX); + designItem.Properties.GetProperty(FrameworkElement.RenderTransformProperty).Value.Properties.GetProperty(RotateTransform.CenterYProperty).SetValue(rotateTransform.CenterY); + + if (oldTransform == null) + designItem.Properties.GetProperty(FrameworkElement.RenderTransformOriginProperty).SetValue(new Point(0.5, 0.5)); + } + else { + designItem.Properties.GetProperty(FrameworkElement.RenderTransformProperty).Reset(); + designItem.Properties.GetProperty(FrameworkElement.RenderTransformOriginProperty).Reset(); + } + } else if (oldTransform is TransformGroup) { + var tg = oldTransform as TransformGroup; + var rot = tg.Children.FirstOrDefault(x=> x is RotateTransform); + if (rot != null) { + designItem.Services.Component.GetDesignItem(tg).ContentProperty.CollectionElements.Remove(designItem.Services.Component.GetDesignItem(rot)); + } + if (rotateTransform.Angle != 0) { + var des = designItem.Services.Component.GetDesignItem(transform); + if (des == null) + des = designItem.Services.Component.RegisterComponentForDesigner(transform); + designItem.Services.Component.GetDesignItem(tg).ContentProperty.CollectionElements.Add(des); + if (oldTransform == null) + designItem.Properties.GetProperty(FrameworkElement.RenderTransformOriginProperty).SetValue(new Point(0.5, 0.5)); + } + } else { + if (rotateTransform.Angle != 0) { + designItem.Properties.GetProperty(FrameworkElement.RenderTransformProperty).SetValue(transform); + if (oldTransform == null) + designItem.Properties.GetProperty(FrameworkElement.RenderTransformOriginProperty).SetValue(new Point(0.5, 0.5)); + } + } + } + + ((DesignPanel) designItem.Services.DesignPanel).AdornerLayer.UpdateAdornersForElement(designItem.View, true); + + changeGroup.Commit(); + } public static void ArrangeItems(IEnumerable items, ArrangeDirection arrangeDirection) {