From: Jean-Philippe Bruyère Date: Wed, 14 Mar 2018 11:33:40 +0000 (+0100) Subject: dragndrop of GObjs X-Git-Tag: v0.9.5-beta~153^2~8 X-Git-Url: https://git.osiis.dedyn.io/?a=commitdiff_plain;h=2c8ebf731af0a626c5d684efc5c2853edd8c3c2d;p=jp%2Fcrow.git dragndrop of GObjs --- diff --git a/Images/screenshot2.png b/Images/screenshot2.png new file mode 100644 index 00000000..46a7bec2 Binary files /dev/null and b/Images/screenshot2.png differ diff --git a/Tests/BasicTests.cs b/Tests/BasicTests.cs index e17f1540..09db6231 100644 --- a/Tests/BasicTests.cs +++ b/Tests/BasicTests.cs @@ -159,13 +159,13 @@ namespace Tests protected override void OnLoad (EventArgs e) { base.OnLoad (e); - - foreach (Color c in Color.ColorDic.Values) { - if (string.IsNullOrEmpty(c.htmlCode)) - Console.WriteLine ("no htmlcode for {0}", c.Name); - else if (c.htmlCode.Substring(1) != c.HtmlCode) - Console.WriteLine ("{2} orig: {0} comp: {1}",c.htmlCode, c.HtmlCode, c.Name); - } +// +// foreach (Color c in Color.ColorDic.Values) { +// if (string.IsNullOrEmpty(c.htmlCode)) +// Console.WriteLine ("no htmlcode for {0}", c.Name); +// else if (c.htmlCode.Substring(1) != c.HtmlCode) +// Console.WriteLine ("{2} orig: {0} comp: {1}",c.htmlCode, c.HtmlCode, c.Name); +// } Commands = new List (new Crow.Command[] { @@ -177,8 +177,8 @@ namespace Tests this.KeyDown += KeyboardKeyDown1; - //testFiles = new string [] { @"Interfaces/Divers/welcome.crow" }; - testFiles = new string [] { @"Interfaces/Divers/colorPicker.crow" }; + testFiles = new string [] { @"Interfaces/Divers/welcome.crow" }; + //testFiles = new string [] { @"Interfaces/Divers/colorPicker.crow" }; testFiles = testFiles.Concat (Directory.GetFiles (@"Interfaces/GraphicObject", "*.crow")).ToArray (); testFiles = testFiles.Concat (Directory.GetFiles (@"Interfaces/Container", "*.crow")).ToArray (); testFiles = testFiles.Concat (Directory.GetFiles (@"Interfaces/Group", "*.crow")).ToArray (); diff --git a/src/Colors.cs b/src/Colors.cs index 6bc380cc..0b1b3ad7 100644 --- a/src/Colors.cs +++ b/src/Colors.cs @@ -110,6 +110,8 @@ namespace Crow cc.B = int.Parse (s.Substring (5, 2), System.Globalization.NumberStyles.HexNumber) / 255.0; if (s.Length > 7) cc.A = int.Parse (s.Substring (7, 2), System.Globalization.NumberStyles.HexNumber) / 255.0; + else + cc.A = 1.0; return cc; } diff --git a/src/ExtensionsMethods.cs b/src/ExtensionsMethods.cs index cb662c51..23196404 100644 --- a/src/ExtensionsMethods.cs +++ b/src/ExtensionsMethods.cs @@ -64,11 +64,9 @@ namespace Crow public static Cairo.PointD Multiply(this Cairo.PointD p1, double v){ return new Cairo.PointD(p1.X * v, p1.Y * v); } - public static void DrawCote(this Cairo.Context ctx, Cairo.PointD p1, Cairo.PointD p2, double stroke = 1.0) - { - const double arrowWidth = 4.0; - const double arrowLength = 10.0; - + public static void DrawCote(this Cairo.Context ctx, Cairo.PointD p1, Cairo.PointD p2, + double stroke = 1.0, bool fill = false, double arrowWidth = 3.0, double arrowLength = 7.0) + { Cairo.PointD vDir = p2.Substract(p1); vDir = vDir.GetNormalized (); Cairo.PointD vPerp = vDir.GetPerp (); @@ -80,21 +78,77 @@ namespace Crow ctx.MoveTo (p1); ctx.LineTo (pA0.Add (vA)); - ctx.LineTo (pA0.Substract (vA)); + if (fill) + ctx.LineTo (pA0.Substract (vA)); + else + ctx.MoveTo (pA0.Substract (vA)); + ctx.LineTo (p1); ctx.MoveTo (p2); ctx.LineTo (pA1.Add (vA)); - ctx.LineTo (pA1.Substract (vA)); + if (fill) + ctx.LineTo (pA1.Substract (vA)); + else + ctx.MoveTo (pA1.Substract (vA)); ctx.LineTo (p2); - ctx.Fill (); + if (fill) + ctx.Fill (); ctx.MoveTo (p1); ctx.LineTo (p2); ctx.LineWidth = stroke; ctx.Stroke (); + } + public static void DrawCoteInverse(this Cairo.Context ctx, Cairo.PointD p1, Cairo.PointD p2, + double stroke = 1.0, bool fill = false, double arrowWidth = 3.0, double arrowLength = 7.0) + { + Cairo.PointD vDir = p2.Substract(p1); + vDir = vDir.GetNormalized (); + Cairo.PointD vPerp = vDir.GetPerp (); + + Cairo.PointD pA0 = p1.Add(vDir.Multiply(arrowLength)); + Cairo.PointD pA1 = p2.Substract(vDir.Multiply(arrowLength)); + + Cairo.PointD vA = vPerp.Multiply (arrowWidth); + + ctx.MoveTo (p1.Add (vA)); + ctx.LineTo (pA0); + ctx.LineTo (p1.Substract (vA)); + if (fill) + ctx.LineTo (p1.Add (vA)); + + ctx.MoveTo (p2.Add (vA)); + ctx.LineTo (pA1); + ctx.LineTo (p2.Substract (vA)); + + if (fill) { + ctx.LineTo (p2.Add (vA)); + ctx.Fill (); + } + + ctx.MoveTo (pA0); + ctx.LineTo (pA1); + ctx.LineWidth = stroke; + ctx.Stroke (); + } + public static void DrawCoteFixed(this Cairo.Context ctx, Cairo.PointD p1, Cairo.PointD p2, + double stroke = 1.0, double coteWidth = 3.0) + { + Cairo.PointD vDir = p2.Substract(p1); + vDir = vDir.GetNormalized (); + Cairo.PointD vPerp = vDir.GetPerp (); + Cairo.PointD vA = vPerp.Multiply (coteWidth); + ctx.MoveTo (p1.Add (vA)); + ctx.LineTo (p1.Substract (vA)); + ctx.MoveTo (p2.Add (vA)); + ctx.LineTo (p2.Substract (vA)); + ctx.MoveTo (p1); + ctx.LineTo (p2); + ctx.LineWidth = stroke; + ctx.Stroke (); } public static void SetSourceColor(this Cairo.Context ctx, Color c) { diff --git a/src/GraphicObjects/GenericStack.cs b/src/GraphicObjects/GenericStack.cs index 181c41c2..64841d4b 100644 --- a/src/GraphicObjects/GenericStack.cs +++ b/src/GraphicObjects/GenericStack.cs @@ -227,20 +227,20 @@ namespace Crow public override void RemoveChild (GraphicObject child) { + if (child != stretchedGO) { + if (Orientation == Orientation.Horizontal) + contentSize.Width -= child.LastSlots.Width; + else + contentSize.Height -= child.LastSlots.Height; + } base.RemoveChild (child); if (child == stretchedGO) { - //stretchedGO.LastSlots = default(Rectangle); stretchedGO = null; RegisterForLayouting (LayoutingType.Sizing); - return; - } - if (Orientation == Orientation.Horizontal) { - contentSize.Width -= child.LastSlots.Width; + }else if (Orientation == Orientation.Horizontal) adjustStretchedGo (LayoutingType.Width); - } else { - contentSize.Height -= child.LastSlots.Height; - adjustStretchedGo (LayoutingType.Height); - } + else + adjustStretchedGo (LayoutingType.Height); } } } diff --git a/src/GraphicObjects/GraphicObject.cs b/src/GraphicObjects/GraphicObject.cs index 9e5e4401..2ca07975 100644 --- a/src/GraphicObjects/GraphicObject.cs +++ b/src/GraphicObjects/GraphicObject.cs @@ -126,7 +126,24 @@ namespace Crow parentElem.AppendChild (xe); } - + public Surface CreateIcon (int dragIconSize = 32) { + ImageSurface di = new ImageSurface (Format.Argb32, dragIconSize, dragIconSize); + using (Context ctx = new Context (di)) { + double div = Math.Max (LastPaintedSlot.Width, LastPaintedSlot.Height); + double s = (double)dragIconSize / div; + ctx.Scale (s, s); + if (bmp == null) + this.onDraw (ctx); + else { + if (LastPaintedSlot.Width>LastPaintedSlot.Height) + ctx.SetSourceSurface (bmp, 0, (LastPaintedSlot.Width-LastPaintedSlot.Height)/2); + else + ctx.SetSourceSurface (bmp, (LastPaintedSlot.Height-LastPaintedSlot.Width)/2, 0); + ctx.Paint (); + } + } + return di; + } #endif #region IDisposable implementation @@ -337,7 +354,7 @@ namespace Crow parentRWLock.EnterWriteLock(); parent = value; - Slot = default(Rectangle); + Slot = LastSlots = default(Rectangle); parentRWLock.ExitWriteLock(); onParentChanged (this, e); @@ -374,8 +391,13 @@ namespace Crow Parent.ContextCoordinates (r); } public virtual Rectangle ScreenCoordinates (Rectangle r){ - return - Parent.ScreenCoordinates(r) + Parent.getSlot().Position + Parent.ClientRectangle.Position; + try { + return + Parent.ScreenCoordinates(r) + Parent.getSlot().Position + Parent.ClientRectangle.Position; + } catch (Exception ex) { + Debug.WriteLine (ex); + return default(Rectangle); + } } public virtual Rectangle getSlot () { return Slot;} #endregion diff --git a/src/GraphicObjects/Group.cs b/src/GraphicObjects/Group.cs index 9cedec81..a90947a5 100644 --- a/src/GraphicObjects/Group.cs +++ b/src/GraphicObjects/Group.cs @@ -64,7 +64,7 @@ namespace Crow } #endif - protected ReaderWriterLockSlim childrenRWLock = new ReaderWriterLockSlim(); + protected ReaderWriterLockSlim childrenRWLock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion); #region CTOR public Group () : base() {} diff --git a/src/GraphicObjects/PrivateContainer.cs b/src/GraphicObjects/PrivateContainer.cs index 668ba452..d6637247 100644 --- a/src/GraphicObjects/PrivateContainer.cs +++ b/src/GraphicObjects/PrivateContainer.cs @@ -75,7 +75,6 @@ namespace Crow if (child != null) { child.Parent = this; child.LayoutChanged += OnChildLayoutChanges; - child.Slot = child.LastSlots = default(Rectangle); contentSize = child.Slot.Size; child.RegisteredLayoutings = LayoutingType.None; child.RegisterForLayouting (LayoutingType.Sizing);