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); }
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); }
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(); } }
protected CreateRuler(Ruler ruler, RulerLine rulerLine) { this.ruler = ruler; this.rulerLine = rulerLine; }
public static void Perform(Ruler ruler, RulerLine rulerLine) { DocumentHistory.Current.Perform(new CreateRuler(ruler, rulerLine)); }
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); } }