aboutsummaryrefslogtreecommitdiffstatsci
path: root/src
diff options
context:
space:
mode:
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>2018-03-14 12:33:40 +0100
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>2018-03-14 12:33:40 +0100
commit2c8ebf731af0a626c5d684efc5c2853edd8c3c2d (patch)
tree8beeb9d4f53183db21614f0dddc16859d246c339 /src
parentfda39ed7506551ab48dce271cb2d5e9c63f2b00c (diff)
dragndrop of GObjs
Diffstat (limited to 'src')
-rw-r--r--src/Colors.cs2
-rw-r--r--src/ExtensionsMethods.cs70
-rw-r--r--src/GraphicObjects/GenericStack.cs18
-rw-r--r--src/GraphicObjects/GraphicObject.cs30
-rw-r--r--src/GraphicObjects/Group.cs2
-rw-r--r--src/GraphicObjects/PrivateContainer.cs1
6 files changed, 100 insertions, 23 deletions
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);