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

Reply via email to