static RulerControl()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(RulerControl), new FrameworkPropertyMetadata(typeof(RulerControl)));

            short_line  = new RulerLine(390f, Brushes.Gray, 0.5f);
            middle_line = new RulerLine(0.5f, Brushes.Black, 0.1f);
            long_line   = new RulerLine(390f, Brushes.Black, 1.4f);
        }
Exemple #2
0
 public IEnumerator <object> Task()
 {
     while (true)
     {
         if (ProjectUserPreferences.Instance.RulerVisible &&
             !Document.Current.ExpositionMode &&
             !Document.Current.PreviewAnimation &&
             sceneView.Frame.ParentWidget.IsMouseOverThisOrDescendant()
             )
         {
             RulerLine line;
             bool      lineCaptured;
             var       hulls = Document.Current.Container.Nodes.OfType <Widget>().Editable()
                               .Select(w => w.CalcHullInSpaceOf(container)).ToList();
             if (lineCaptured = SceneView.Instance.Components.Contains <CreateLineRequestComponent>())
             {
                 var comp = SceneView.Instance.Components.Get <CreateLineRequestComponent>();
                 line = new RulerLine(Vector2.Zero, comp.Orientation);
                 SnapLineToNearestPoint(line, hulls);
                 if (IsRulerContainLine(line.Value, line.RulerOrientation))
                 {
                     line = GetLineUnderMouse();
                 }
                 SceneView.Instance.Components.Remove <CreateLineRequestComponent>();
             }
             else
             {
                 line = GetLineUnderMouse();
             }
             if (line != null)
             {
                 Utils.ChangeCursorIfDefault(line.RulerOrientation == RulerOrientation.Horizontal ? MouseCursor.SizeNS : MouseCursor.SizeWE);
                 if (sceneView.Input.ConsumeKeyPress(Key.Mouse0) || lineCaptured)
                 {
                     SceneView.Instance.Components.GetOrAdd <LineSelectionComponent>().Line = line;
                     Window.Current.Invalidate();
                     Ruler.Lines.Remove(line);
                     while (Window.Current.Input.IsMousePressed())
                     {
                         SnapLineToNearestPoint(line, hulls);
                         yield return(null);
                     }
                     Ruler.Lines.Add(line);
                     Window.Current.Invalidate();
                     SceneView.Instance.Components.Remove <LineSelectionComponent>();
                 }
                 else if (Window.Current.Input.WasMouseReleased(1))
                 {
                     ProjectUserPreferences.Instance.ActiveRuler.Lines.Remove(line);
                     Window.Current.Invalidate();
                 }
             }
         }
         yield return(null);
     }
 }
        private static Vector2 LineToVector(RulerLine line, bool anchorToRoot)
        {
            var mask = line.RulerOrientation == RulerOrientation.Vertical ? Vector2.Right : Vector2.Down;

            if (anchorToRoot)
            {
                return(line.GetClosestPointToOrigin() + Document.Current.RootNode.AsWidget.Size * mask / 2);
            }
            return(line.GetClosestPointToOrigin());
        }
 private static Vector2 SnapPointToLine(Vector2 point, RulerLine line)
 {
     if (line != null)
     {
         var t    = Document.Current.Container.AsWidget.CalcTransitionToSpaceOf(Document.Current.RootNode.AsWidget);
         var mask = line.IsVertical ? Vector2.Right : Vector2.Down;
         return((point * t * (Vector2.One - mask) +
                 (line.ToVector2() + Document.Current.RootNode.AsWidget.Size * mask / 2)) * t.CalcInversed());
     }
     return(point);
 }
Exemple #5
0
        private static void SnapLineToNearestPoint(RulerLine line, IEnumerable <Quadrangle> hulls)
        {
            var step     = 1f;
            var mousePos = container.LocalMousePosition();

            if (!sceneView.Input.IsKeyPressed(Key.Shift))
            {
                step = (float)Math.Truncate(RulersWidget.CalculateEffectiveStep()) / RulersWidget.Tesselation;
            }
            var curValue = new Vector2(Utils.RoundTo(mousePos.X, step), Utils.RoundTo(mousePos.Y, step));

            if (SceneViewCommands.SnapRulerLinesToWidgets.Checked)
            {
                var mask = line.RulerOrientation.GetDirection();
                foreach (var hull in hulls)
                {
                    for (int i = 0; i < 4; i++)
                    {
                        if (((hull[i] - mousePos) * mask).Length < ((mousePos - curValue) * mask).Length &&
                            !IsRulerContainLine(line.RulerOrientation.GetComponentFor(hull[i]), line.RulerOrientation)
                            )
                        {
                            line.MakePassingThroughPoint(hull[i]);
                            Window.Current.Invalidate();
                            return;
                        }
                    }
                }
            }

            if (!IsRulerContainLine(line.RulerOrientation.GetComponentFor(curValue), line.RulerOrientation))
            {
                line.MakePassingThroughPoint(curValue);
                Window.Current.Invalidate();
            }
        }
Exemple #6
0
 protected CreateRuler(Ruler ruler, RulerLine rulerLine)
 {
     this.ruler     = ruler;
     this.rulerLine = rulerLine;
 }
Exemple #7
0
 public static void Perform(Ruler ruler, RulerLine rulerLine)
 {
     DocumentHistory.Current.Perform(new CreateRuler(ruler, rulerLine));
 }
Exemple #8
0
 protected DeleteRuler(Ruler ruler, RulerLine rulerLine)
 {
     this.ruler     = ruler;
     this.rulerLine = rulerLine;
 }
 public IEnumerator <object> Task()
 {
     while (true)
     {
         if (ProjectUserPreferences.Instance.RulerVisible &&
             !Document.Current.PreviewScene &&
             sceneView.Frame.ParentWidget.IsMouseOverThisOrDescendant()
             )
         {
             RulerLine   line;
             bool        lineCaptured;
             Func <bool> isHovered = null;
             var         hulls     = Document.Current.Container.Nodes.OfType <Widget>().Editable()
                                     .Select(w => w.CalcHullInSpaceOf(container)).ToList();
             if (lineCaptured = SceneView.Instance.Components.Contains <CreateLineRequestComponent>())
             {
                 var comp = SceneView.Instance.Components.Get <CreateLineRequestComponent>();
                 line      = new RulerLine(Vector2.Zero, comp.Orientation);
                 isHovered = comp.IsHovered;
                 SnapLineToNearestPoint(line, hulls);
                 if (IsRulerContainLine(line.Value, line.RulerOrientation))
                 {
                     line = GetLineUnderMouse();
                 }
                 SceneView.Instance.Components.Remove <CreateLineRequestComponent>();
             }
             else
             {
                 line = GetLineUnderMouse();
             }
             if (line != null)
             {
                 Utils.ChangeCursorIfDefault(line.RulerOrientation == RulerOrientation.Horizontal ? MouseCursor.SizeNS : MouseCursor.SizeWE);
                 if (sceneView.Input.ConsumeKeyPress(Key.Mouse0) || lineCaptured)
                 {
                     Window.Current.Invalidate();
                     using (Document.Current.History.BeginTransaction()) {
                         if (Ruler.ContainsLine(line))
                         {
                             Core.Operations.DeleteRuler.Perform(Ruler, line = line.Clone());
                         }
                         line = line.Clone();
                         SceneView.Instance.Components.GetOrAdd <LineSelectionComponent>().Line = line;
                         while (Window.Current.Input.IsMousePressed())
                         {
                             SnapLineToNearestPoint(line, hulls);
                             yield return(null);
                         }
                         if (isHovered == null || !isHovered())
                         {
                             Core.Operations.CreateRuler.Perform(ProjectUserPreferences.Instance.ActiveRuler, line = line.Clone());
                             Document.Current.History.CommitTransaction();
                         }
                     }
                     Window.Current.Invalidate();
                     SceneView.Instance.Components.Remove <LineSelectionComponent>();
                 }
                 else if (Window.Current.Input.WasMouseReleased(1))
                 {
                     using (Document.Current.History.BeginTransaction()) {
                         Core.Operations.DeleteRuler.Perform(ProjectUserPreferences.Instance.ActiveRuler, line);
                         Document.Current.History.CommitTransaction();
                     }
                     Window.Current.Invalidate();
                 }
             }
         }
         yield return(null);
     }
 }