Author: alanmc
Date: 2007-06-28 18:16:52 -0400 (Thu, 28 Jun 2007)
New Revision: 81008
Modified:
trunk/lunareclipse/ChangeLog
trunk/lunareclipse/Controller/MoonlightController.cs
trunk/lunareclipse/Model/Draw/CircleDraw.cs
trunk/lunareclipse/Model/Draw/DrawBase.cs
trunk/lunareclipse/Model/Draw/EllipseDraw.cs
trunk/lunareclipse/Model/Draw/LineDraw.cs
trunk/lunareclipse/Model/Draw/PenDraw.cs
trunk/lunareclipse/Model/Draw/RectangleDraw.cs
trunk/lunareclipse/Model/Draw/SelectionDraw.cs
trunk/lunareclipse/Model/Draw/SquareDraw.cs
Log:
* Controller/MoonlightController.cs: Added drawing and selection
Modified: trunk/lunareclipse/ChangeLog
===================================================================
--- trunk/lunareclipse/ChangeLog 2007-06-28 22:00:36 UTC (rev 81007)
+++ trunk/lunareclipse/ChangeLog 2007-06-28 22:16:52 UTC (rev 81008)
@@ -1,3 +1,7 @@
+2007-06-28 Alan McGovern <[EMAIL PROTECTED]>
+
+ * Controller/MoonlightController.cs: Added drawing and selection
+
2007-06-27 Alan McGovern <[EMAIL PROTECTED]>
* Model/Draw/EllipseDraw.cs, Model/Draw/SquareDraw.cs,
Modified: trunk/lunareclipse/Controller/MoonlightController.cs
===================================================================
--- trunk/lunareclipse/Controller/MoonlightController.cs 2007-06-28
22:00:36 UTC (rev 81007)
+++ trunk/lunareclipse/Controller/MoonlightController.cs 2007-06-28
22:16:52 UTC (rev 81008)
@@ -27,7 +27,12 @@
public DrawBase Current
{
get { return this.current; }
- set { this.current = value; }
+ set
+ {
+ if(current != null)
+ current.Cleanup();
+ this.current = value;
+ }
}
public UndoEngine UndoEngine
@@ -48,45 +53,38 @@
{
moonlight.Canvas.Children.Clear();
undo.Clear();
- // Horrible hack to make the screen redraw
- moonlight.Canvas.Opacity = moonlight.Canvas.Opacity;
+ Rectangle r = new Rectangle();
+ moonlight.Canvas.Children.Add(r);
+ moonlight.Canvas.Children.Remove(r);
}
bool active = false;
private void MouseLeftDown(object sender, MouseEventArgs e)
{
- if(current == null)
+ if(current == null || active)
return;
active = true;
- current = current.Clone();
- Point position = e.GetPosition(moonlight.Canvas);
- Console.WriteLine("Mouse at: " + position.ToString());
+ current.DrawStart(this.moonlight.Canvas, e);
- undo.PushUndo(new UndoAddObject(moonlight.Canvas.Children,
current.Element));
-
- current.DrawStart(this.moonlight.Canvas, position);
+ if(current.CanUndo)
+ undo.PushUndo(new UndoAddObject(moonlight.Canvas.Children,
current.Element));
}
private void MouseMove(object sender, MouseEventArgs e)
{
- Console.WriteLine("Mouse at: " +
e.GetPosition(moonlight.Canvas).ToString());
if(!active)
return;
-
- Console.WriteLine("MouseMove");
- current.Resize(e.GetPosition(moonlight.Canvas));
+ current.Resize(e);
}
private void MouseLeftUp(object sender, MouseEventArgs e)
{
- Console.WriteLine("Mouse at: " +
e.GetPosition(moonlight.Canvas).ToString());
if(!active)
return;
-
- Console.WriteLine("MouseUp");
- current.DrawEnd(e.GetPosition(moonlight.Canvas));
+
+ current.DrawEnd(e);
active = false;
}
Modified: trunk/lunareclipse/Model/Draw/CircleDraw.cs
===================================================================
--- trunk/lunareclipse/Model/Draw/CircleDraw.cs 2007-06-28 22:00:36 UTC (rev
81007)
+++ trunk/lunareclipse/Model/Draw/CircleDraw.cs 2007-06-28 22:16:52 UTC (rev
81008)
@@ -7,7 +7,9 @@
using System;
using System.Windows;
using System.Windows.Controls;
+using System.Windows.Input;
+
namespace LunarEclipse.Model
{
public class CircleDraw : DrawBase
@@ -17,18 +19,15 @@
{
}
- internal override void Resize (Point end)
+ internal override void Resize (MouseEventArgs e)
{
- double width = (double)Element.GetValue(Canvas.LeftProperty) -
end.X;
- double height = (double)Element.GetValue(Canvas.TopProperty) -
end.Y;
+ Point end = e.GetPosition(Panel);
+ double width = end.X -
(double)Element.GetValue(Canvas.LeftProperty);
+ double height = end.Y -
(double)Element.GetValue(Canvas.TopProperty);
- double mouseDelta;
- if(Math.Abs(width) > Math.Abs(height))
- mouseDelta = end.X - position.X;
- else
- mouseDelta = end.Y - position.Y;
-
- base.Resize(new Point(position.X + mouseDelta, position.Y +
mouseDelta));
+ width = Math.Max(width, height);
+ Element.Width = width;
+ Element.Height = width;
}
}
}
Modified: trunk/lunareclipse/Model/Draw/DrawBase.cs
===================================================================
--- trunk/lunareclipse/Model/Draw/DrawBase.cs 2007-06-28 22:00:36 UTC (rev
81007)
+++ trunk/lunareclipse/Model/Draw/DrawBase.cs 2007-06-28 22:16:52 UTC (rev
81008)
@@ -9,37 +9,78 @@
using System.Windows.Controls;
using System.Windows.Shapes;
using System.Windows.Media;
+using System.Windows.Input;
+
namespace LunarEclipse.Model
{
public abstract class DrawBase
{
+#region Fields
+
private Shape element;
- protected Panel panel;
- protected Point position;
+ private Panel panel;
+ private Point position;
+#endregion Fields
+
+#region Properties
+
+ public virtual bool CanUndo
+ {
+ get { return true; }
+ }
+
public Shape Element
{
get { return element; }
}
+ protected Panel Panel
+ {
+ get { return panel; }
+ set { panel = value; }
+ }
+
+ protected Point Position
+ {
+ get { return position; }
+ set { position = value; }
+ }
+
+#endregion Properties
+
internal DrawBase(Shape element)
{
this.element = element;
element.Stroke = new SolidColorBrush(Colors.Red);
}
- internal virtual void DrawStart(Panel panel, Point point)
+ internal virtual void Cleanup()
{
+
+ }
+
+ internal virtual void DrawStart(Panel panel, MouseEventArgs point)
+ {
this.panel = panel;
+
+ Prepare();
+ position = point.GetPosition(panel);
+ Element.SetValue<double>(Canvas.LeftProperty, position.X);
+ Element.SetValue<double>(Canvas.TopProperty, position.Y);
+ }
+
+ internal virtual void Prepare()
+ {
+ element = (Shape)Activator.CreateInstance(Element.GetType());
+ element.Stroke = new SolidColorBrush(Colors.Red);
panel.Children.Add(Element);
- position = point;
- Element.SetValue<double>(Canvas.LeftProperty, point.X);
- Element.SetValue<double>(Canvas.TopProperty, point.Y);
}
- internal virtual void Resize(Point end)
+ internal virtual void Resize(MouseEventArgs e)
{
+ Point end = e.GetPosition(panel);
double x = end.X - position.X;
double y = end.Y - position.Y;
@@ -48,14 +89,33 @@
Element.Height += y;
}
- internal virtual void DrawEnd(Point point)
+ internal virtual void DrawEnd(MouseEventArgs point)
{
-
+ double top, left, width, height;
+ GetNormalisedBounds(Element, out top, out left, out width, out
height);
+ Element.Width = width;
+ Element.Height = height;
+ Element.SetValue<double>(Canvas.LeftProperty, left);
+ Element.SetValue<double>(Canvas.TopProperty, top);
}
- internal virtual DrawBase Clone()
+ protected static void GetNormalisedBounds(Shape shape, out double top,
out double left, out double width, out double height)
{
- return (DrawBase)Activator.CreateInstance(this.GetType(), null);
+ width = shape.Width;
+ left = (double)shape.GetValue(Canvas.LeftProperty);
+ if(width < 0)
+ {
+ left = left + width;
+ width = -width;
+ }
+
+ height = shape.Height;
+ top = (double)shape.GetValue(Canvas.TopProperty);
+ if(height < 0)
+ {
+ top = top + height;
+ height = -height;
+ }
}
}
}
Modified: trunk/lunareclipse/Model/Draw/EllipseDraw.cs
===================================================================
--- trunk/lunareclipse/Model/Draw/EllipseDraw.cs 2007-06-28 22:00:36 UTC
(rev 81007)
+++ trunk/lunareclipse/Model/Draw/EllipseDraw.cs 2007-06-28 22:16:52 UTC
(rev 81008)
@@ -8,6 +8,7 @@
using System.Windows;
using System.Windows.Controls;
using System.Windows.Shapes;
+using System.Windows.Input;
namespace LunarEclipse.Model
Modified: trunk/lunareclipse/Model/Draw/LineDraw.cs
===================================================================
--- trunk/lunareclipse/Model/Draw/LineDraw.cs 2007-06-28 22:00:36 UTC (rev
81007)
+++ trunk/lunareclipse/Model/Draw/LineDraw.cs 2007-06-28 22:16:52 UTC (rev
81008)
@@ -9,7 +9,9 @@
using System.Windows.Shapes;
using System.Windows.Media;
using System.Windows.Controls;
+using System.Windows.Input;
+
namespace LunarEclipse.Model
{
public class LineDraw : DrawBase
@@ -20,21 +22,23 @@
Element.Fill = new SolidColorBrush(Colors.Red);
}
- internal override void DrawStart (Panel panel, Point point)
+ internal override void DrawStart (Panel panel, MouseEventArgs e)
{
- base.DrawStart(panel, point);
+ base.DrawStart(panel, e);
+
Line l = Element as Line;
- l.X1 = (l.X2 = point.X);
- l.Y1 = (l.Y2 = point.Y);
+ l.X1 = (l.X2 = Position.X);
+ l.Y1 = (l.Y2 = Position.Y);
l.SetValue<double>(Canvas.TopProperty, 0);
l.SetValue<double>(Canvas.LeftProperty, 0);
}
- internal override void Resize (Point end)
+ internal override void Resize (MouseEventArgs end)
{
Line l = Element as Line;
- l.X2 = end.X;
- l.Y2 = end.Y;
+ Point p = end.GetPosition(Panel);
+ l.X2 = p.X;
+ l.Y2 = p.Y;
}
Modified: trunk/lunareclipse/Model/Draw/PenDraw.cs
===================================================================
--- trunk/lunareclipse/Model/Draw/PenDraw.cs 2007-06-28 22:00:36 UTC (rev
81007)
+++ trunk/lunareclipse/Model/Draw/PenDraw.cs 2007-06-28 22:16:52 UTC (rev
81008)
@@ -9,23 +9,33 @@
using System.Windows.Shapes;
using LunarEclipse.Model;
using System.Windows.Media;
+using System.Windows.Controls;
+using System.Collections.Generic;
+using System.Windows.Input;
+
+
namespace LunarEclipse
{
public class PenDraw : DrawBase
{
- PathGeometry geometry;
PathFigure figure;
public PenDraw()
:base(new System.Windows.Shapes.Path())
{
+
+ }
+
+ internal override void DrawStart (Panel panel, MouseEventArgs point)
+ {
+ base.DrawStart(panel, point);
+
Path path = (Path)Element;
path.Stroke = new SolidColorBrush(Colors.Black);
path.StrokeThickness = 1;
- path.Fill = new SolidColorBrush(Colors.Black);
-
- geometry = new PathGeometry();
+
+ PathGeometry geometry = new PathGeometry();
figure = new PathFigure();
path.Data = geometry;
@@ -33,14 +43,76 @@
geometry.Figures.Add(figure);
figure.Segments = new PathSegmentCollection();
+ Console.WriteLine("Path set");
+ Console.WriteLine("Path started");
}
- internal override void Resize (Point end)
+
+ internal override void Resize (MouseEventArgs e)
{
- Console.WriteLine("Adding pen segment");
+ Console.WriteLine("Path resizing");
+ Point end = e.GetPosition(Panel);
+ double top = (double)Element.GetValue(Canvas.TopProperty);
+ double left = (double)Element.GetValue(Canvas.LeftProperty);
+ end.Offset(-left, -top);
LineSegment seg = new LineSegment();
seg.Point = end;
figure.Segments.Add(seg);
+ Console.WriteLine("Path resized");
}
+
+ internal override void DrawEnd (MouseEventArgs point)
+ {
+ Console.WriteLine("Path ending");
+ BezierSegment bezier;
+ PathSegmentCollection beziers = new PathSegmentCollection();
+
+ List<LineSegment> current = new List<LineSegment>();
+ foreach(LineSegment line in figure.Segments)
+ {
+ if(current.Count == 3)
+ {
+ bezier = new BezierSegment();
+ bezier.Point1 = current[0].Point;
+ bezier.Point2 = current[1].Point;
+ bezier.Point3 = current[2].Point;
+ beziers.Add(bezier);
+ current.Clear();
+ }
+
+ current.Add(line);
+ }
+
+ this.figure.Segments = beziers;
+ if(current.Count == 0)
+ return;
+
+ bezier = new BezierSegment();
+ bezier.Point1 = current[0].Point;
+ current.RemoveAt(0);
+
+ if(current.Count > 0)
+ {
+ bezier.Point2 = current[0].Point;
+ current.RemoveAt(0);
+ }
+ else
+ {
+ bezier.Point2 = bezier.Point1;
+ }
+ if(current.Count > 0)
+ {
+ bezier.Point3 = current[0].Point;
+ current.RemoveAt(0);
+ }
+ else
+ {
+ bezier.Point3 = bezier.Point2;
+ }
+
+ beziers.Add(bezier);
+ Console.WriteLine("Path ended");
+ }
+
}
}
Modified: trunk/lunareclipse/Model/Draw/RectangleDraw.cs
===================================================================
--- trunk/lunareclipse/Model/Draw/RectangleDraw.cs 2007-06-28 22:00:36 UTC
(rev 81007)
+++ trunk/lunareclipse/Model/Draw/RectangleDraw.cs 2007-06-28 22:16:52 UTC
(rev 81008)
@@ -6,7 +6,9 @@
using System;
using System.Windows;
+using System.Windows.Input;
+
namespace LunarEclipse.Model
{
public class RectangleDraw : DrawBase
Modified: trunk/lunareclipse/Model/Draw/SelectionDraw.cs
===================================================================
--- trunk/lunareclipse/Model/Draw/SelectionDraw.cs 2007-06-28 22:00:36 UTC
(rev 81007)
+++ trunk/lunareclipse/Model/Draw/SelectionDraw.cs 2007-06-28 22:16:52 UTC
(rev 81008)
@@ -9,21 +9,109 @@
using System.Windows.Controls;
using System.Windows.Shapes;
using System.Windows.Media;
+using System.Windows.Input;
+using System.Collections.Generic;
namespace LunarEclipse.Model
{
public class SelectionDraw : DrawBase
{
+ private bool clickedOnShape;
+ private bool prepared;
+ private List<Shape> selectedObjects;
+
+ public override bool CanUndo
+ {
+ get { return false; }
+ }
+
public SelectionDraw()
:base(new SelectionRectangle())
{
+ selectedObjects = new List<Shape>();
+ }
+
+ internal override void Cleanup ()
+ {
+ foreach(Shape s in selectedObjects)
+ {
+ s.Fill = new SolidColorBrush(Colors.White);
+ s.Stroke = new SolidColorBrush(Colors.Red);
+ }
+ selectedObjects.Clear();
+ }
+
+ internal override void DrawStart (Panel panel, MouseEventArgs e)
+ {
+ base.DrawStart(panel, e);
+ clickedOnShape = GetSelectedObjects(e).Count != 0;
+ }
+
+ private List<Shape> GetSelectedObjects(MouseEventArgs e)
+ {
+ List<Shape> shapes = new List<Shape>();
+
+ foreach(Shape v in Panel.Children)
+ {
+ if(v == Element)
+ continue;
+ Rectangle rect = (Rectangle)Element;
+
+ double top = (double)v.GetValue(Canvas.TopProperty);
+ double left = (double)v.GetValue(Canvas.LeftProperty);
+ double width = (double)v.GetValue(Shape.WidthProperty);
+ double height = (double)v.GetValue(Shape.HeightProperty);
+
+ double rectTop, rectLeft, rectWidth, rectHeight;
+ DrawBase.GetNormalisedBounds(Element, out rectTop, out
rectLeft, out rectWidth, out rectHeight);
+
+ if(((rectLeft < (left + width)) && (rectLeft + rectWidth) >
left)
+ && (rectTop < (top + height)) && ((rectTop + rectHeight) >
top))
+ {
+ // Console.WriteLine("Hit");
+ if(!selectedObjects.Contains(v))
+ {
+ v.Stroke = new SolidColorBrush(Colors.Green);
+ v.Fill = new SolidColorBrush(Colors.Black);
+ shapes.Add(v);
+ }
+ }
+ }
+
+ return shapes;
}
- internal override void DrawEnd (Point point)
+
+ internal override void Prepare ()
{
- panel.Children.Remove(Element);
+ if(!prepared)
+ base.Prepare();
}
+
+
+ internal override void Resize (MouseEventArgs e)
+ {
+ foreach(Shape s in this.selectedObjects)
+ {
+ s.Fill = new SolidColorBrush(Colors.White);
+ s.Stroke = new SolidColorBrush(Colors.Red);
+ }
+ this.selectedObjects.Clear();
+ List<Shape> shapes = GetSelectedObjects(e);
+
+
+ base.Resize(e);
+
+ foreach(Shape s in shapes)
+ if(!selectedObjects.Contains(s))
+ selectedObjects.Add(s);
+ }
+
+ internal override void DrawEnd (MouseEventArgs e)
+ {
+ Panel.Children.Remove(Element);
+ }
}
}
Modified: trunk/lunareclipse/Model/Draw/SquareDraw.cs
===================================================================
--- trunk/lunareclipse/Model/Draw/SquareDraw.cs 2007-06-28 22:00:36 UTC (rev
81007)
+++ trunk/lunareclipse/Model/Draw/SquareDraw.cs 2007-06-28 22:16:52 UTC (rev
81008)
@@ -7,8 +7,10 @@
using System;
using System.Windows;
using System.Windows.Controls;
+using System.Windows.Input;
+
namespace LunarEclipse.Model
{
public class SquareDraw : DrawBase
@@ -18,18 +20,15 @@
{
}
- internal override void Resize (Point end)
+ internal override void Resize (MouseEventArgs e)
{
- double width = (double)Element.GetValue(Canvas.LeftProperty) -
end.X;
- double height = (double)Element.GetValue(Canvas.TopProperty) -
end.Y;
+ Point end = e.GetPosition(Panel);
+ double width = end.X -
(double)Element.GetValue(Canvas.LeftProperty);
+ double height = end.Y -
(double)Element.GetValue(Canvas.TopProperty);
- double mouseDelta;
- if(Math.Abs(width) > Math.Abs(height))
- mouseDelta = end.X - position.X;
- else
- mouseDelta = end.Y - position.Y;
-
- base.Resize(new Point(position.X + mouseDelta, position.Y +
mouseDelta));
+ width = Math.Max(width, height);
+ Element.Width = width;
+ Element.Height = width;
}
}
}
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches