| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 | 
							- using Avalonia;
 
- using Avalonia.Controls;
 
- using Avalonia.Controls.Primitives;
 
- using Avalonia.Controls.Shapes;
 
- using Avalonia.Input;
 
- using Avalonia.Media;
 
- using System;
 
- using System.Collections.Generic;
 
- using System.Linq;
 
- using System.Text;
 
- using System.Threading.Tasks;
 
- using System.Xml;
 
- namespace InABox.Avalonia.Components.ImageEditing;
 
- internal class DimensionObject : IImageEditorObject
 
- {
 
-     public IBrush? PrimaryBrush { get; set; }
 
-     public Point Point1 { get; set; }
 
-     public Point Point2 { get; set; }
 
-     public double LineThickness { get; set; }
 
-     public string Text { get; set; } = "";
 
-     public double Offset { get; set; } = 10;
 
-     public bool Complete { get; set; } = false;
 
-     private Canvas Control = new();
 
-     private Thumb? Thumb;
 
-     private bool _active = true;
 
-     public Control GetControl() => Control;
 
-     private Vector GetMainVec()
 
-     {
 
-         var p1 = new Vector(Point1.X, Point1.Y);
 
-         var p2 = new Vector(Point2.X, Point2.Y);
 
-         var mainVec = p2 - p1;
 
-         var length = mainVec.Length;
 
-         if(length == 0)
 
-         {
 
-             mainVec = new Vector(0, 0);
 
-         }
 
-         else
 
-         {
 
-             mainVec /= length;
 
-         }
 
-         return mainVec;
 
-     }
 
-     private Vector GetPerpVec()
 
-     {
 
-         var mainVec = GetMainVec();
 
-         return new Vector(mainVec.Y, -mainVec.X);
 
-     }
 
-     public void Update()
 
-     {
 
-         Control.Children.RemoveAll(Control.Children.Where(x => !(x is Thumb)));
 
-         Point Point(Vector v) => new(v.X, v.Y);
 
-         var p1 = new Vector(Point1.X, Point1.Y);
 
-         var p2 = new Vector(Point2.X, Point2.Y);
 
-         var mainVec = p2 - p1;
 
-         var length = mainVec.Length;
 
-         if(length == 0)
 
-         {
 
-             mainVec = new Vector(0, 0);
 
-         }
 
-         else
 
-         {
 
-             mainVec /= length;
 
-         }
 
-         var perpVec = new Vector(mainVec.Y, -mainVec.X);
 
-         var arrowLength = LineThickness * 2;
 
-         var offset = perpVec * Offset;
 
-         var mainLines = new List<Line>()
 
-         {
 
-             new()
 
-             {
 
-                 StartPoint = Point(p1 + offset),
 
-                 EndPoint = Point(p2 + offset),
 
-                 StrokeLineCap = PenLineCap.Round
 
-             },
 
-             new()
 
-             {
 
-                 StartPoint = Point(p1 + offset),
 
-                 EndPoint = Point(p1 + mainVec * arrowLength + perpVec * arrowLength + offset),
 
-                 StrokeLineCap = PenLineCap.Square
 
-             },
 
-             new()
 
-             {
 
-                 StartPoint = Point(p1 + offset),
 
-                 EndPoint = Point(p1 + mainVec * arrowLength - perpVec * arrowLength + offset),
 
-                 StrokeLineCap = PenLineCap.Square
 
-             },
 
-             new()
 
-             {
 
-                 StartPoint = Point(p2 + offset),
 
-                 EndPoint = Point(p2 - mainVec * arrowLength + perpVec * arrowLength + offset),
 
-                 StrokeLineCap = PenLineCap.Square
 
-             },
 
-             new()
 
-             {
 
-                 StartPoint = Point(p2 + offset),
 
-                 EndPoint = Point(p2 - mainVec * arrowLength - perpVec * arrowLength + offset),
 
-                 StrokeLineCap = PenLineCap.Square
 
-             }
 
-         };
 
-         var dotLines = new List<Line>()
 
-         {
 
-             new()
 
-             {
 
-                 StartPoint = Point(p1),
 
-                 EndPoint = Point(p1 + offset)
 
-             },
 
-             new()
 
-             {
 
-                 StartPoint = Point(p2),
 
-                 EndPoint = Point(p2 + offset)
 
-             },
 
-         };
 
-         foreach (var line in dotLines)
 
-         {
 
-             line.StrokeThickness = LineThickness;
 
-             line.Stroke = PrimaryBrush;
 
-             line.StrokeDashArray = [2, 2];
 
-             Control.Children.Add(line);
 
-         }
 
-         foreach (var line in mainLines)
 
-         {
 
-             line.StrokeThickness = LineThickness;
 
-             line.Stroke = PrimaryBrush;
 
-             Control.Children.Add(line);
 
-         }
 
-         var textHeight = 20;
 
-         var text = new TextBlock
 
-         {
 
-             Text = Text,
 
-             FontSize = textHeight,
 
-             TextAlignment = TextAlignment.Center,
 
-             Width = length,
 
-             Foreground = PrimaryBrush
 
-         };
 
-         text.RenderTransform = new RotateTransform(Math.Atan2(mainVec.Y, mainVec.X) * 180 / Math.PI);
 
-         var textPos = p1 + offset + mainVec * length / 2 + perpVec * (textHeight / 2 + 5);
 
-         Canvas.SetLeft(text, textPos.X - length / 2);
 
-         Canvas.SetTop(text, textPos.Y - textHeight / 2);
 
-         Control.Children.Add(text);
 
-         if(Thumb is null && _active && length > 0)
 
-         {
 
-             Thumb = new();
 
-             Thumb.Width = 10;
 
-             Thumb.Height = 10;
 
-             Thumb.Cursor = new(StandardCursorType.SizeAll);
 
-             Thumb.DragDelta += Thumb_DragDelta;
 
-             Thumb.ZIndex = 1;
 
-             Control.Children.Add(Thumb);
 
-         }
 
-         if(Thumb is not null)
 
-         {
 
-             Thumb.RenderTransform = new RotateTransform(Math.Atan2(mainVec.Y, mainVec.X) * 180 / Math.PI);
 
-             var thumbPos = p1 + offset + mainVec * length / 2;
 
-             Canvas.SetLeft(Thumb, thumbPos.X - 5);
 
-             Canvas.SetTop(Thumb, thumbPos.Y - 5);
 
-         }
 
-     }
 
-     private Vector Rotate(Vector v, double angle)
 
-     {
 
-         angle = Math.Atan2(v.Y, v.X) + angle;
 
-         var length = v.Length;
 
-         return new Vector(
 
-             length * Math.Cos(angle),
 
-             length * Math.Sin(angle));
 
-     }
 
-     private void Thumb_DragDelta(object? sender, VectorEventArgs e)
 
-     {
 
-         var main = GetMainVec();
 
-         var v = Vector.Dot(Rotate(e.Vector, Math.Atan2(main.Y, main.X)), GetPerpVec());
 
-         Offset += v;
 
-         Update();
 
-     }
 
-     public void SetActive(bool active)
 
-     {
 
-         _active = active;
 
-         if(Thumb is not null)
 
-         {
 
-             Control.Children.Remove(Thumb);
 
-             Thumb = null;
 
-         }
 
-     }
 
- }
 
 
  |