1 using System.Collections.Generic;
22 internal const int StartPoint = 0;
26 internal const int EndPoint = 1;
32 protected const double PenThickness = 1.0;
38 protected const double DraggingCircleRadius = 4.0;
44 protected const double DraggingCircleRadiusSquared = DraggingCircleRadius * DraggingCircleRadius;
49 protected Pen pen =
new Pen(Brushes.Green, PenThickness);
54 protected Point? startWorldPoint = null;
58 internal Point? StartWorldPoint {
get {
return startWorldPoint; } }
63 internal bool isStartPointBeingDragged =
false;
68 protected Point? endWorldPoint = null;
72 internal Point? EndWorldPoint {
get {
return endWorldPoint; } }
77 internal bool isEndPointBeingDragged =
false;
91 internal Point LastCursorPointOnCavnas {
get {
return lastCursorPointOnCanvas; } }
96 internal virtual bool IsLaneDefined
98 get {
return startWorldPoint.HasValue && endWorldPoint.HasValue; }
104 internal virtual bool IsSomePointBeingDragged
106 get {
return isStartPointBeingDragged || isEndPointBeingDragged; }
123 protected override void Render(Point currentMouseLocation)
125 RenderBuildingLane(currentMouseLocation);
134 using (DrawingContext dc = visual.RenderOpen())
136 dc.DrawLine(pen, TransformRealWorldPoint(startWorldPoint.Value), endPointOnCanvas);
139 dc.DrawEllipse(null, pen, TransformRealWorldPoint(startWorldPoint.Value), DraggingCircleRadius,
140 DraggingCircleRadius);
141 dc.DrawEllipse(null, pen, TransformRealWorldPoint(endWorldPoint.Value), DraggingCircleRadius,
142 DraggingCircleRadius);
151 internal virtual void RenderBuildingLane(Point cursorPointOnCanvas)
153 lastCursorPointOnCanvas = cursorPointOnCanvas;
154 if (startWorldPoint.HasValue)
156 if (endWorldPoint.HasValue)
158 DrawPreviewStraightLane(TransformRealWorldPoint(endWorldPoint.Value));
162 DrawPreviewStraightLane(cursorPointOnCanvas);
170 internal void RenderBuildingLane()
172 RenderBuildingLane(lastCursorPointOnCanvas);
179 internal virtual void SetPoint(Point cursorPointOnCanvas)
181 if (startWorldPoint.HasValue)
183 Debug.Assert(!endWorldPoint.HasValue,
"Incorrect application state");
184 endWorldPoint = TransformCanvasPoint(cursorPointOnCanvas);
188 startWorldPoint = TransformCanvasPoint(cursorPointOnCanvas);
190 RenderBuildingLane(cursorPointOnCanvas);
196 internal virtual void ResetRendererAndClearAnyPreview()
198 startWorldPoint = endWorldPoint = null;
199 using (DrawingContext dc = visual.RenderOpen()) { }
205 internal virtual void ResetDraggingOfPoint()
207 isStartPointBeingDragged = isEndPointBeingDragged =
false;
214 internal virtual void MovePointOfLane(Point cursorPointOnCanvas)
216 startWorldPoint += GetVectorOfMoveOfPointIfItIsBeingDragged(cursorPointOnCanvas, isStartPointBeingDragged);
217 endWorldPoint += GetVectorOfMoveOfPointIfItIsBeingDragged(cursorPointOnCanvas, isEndPointBeingDragged);
218 RenderBuildingLane(cursorPointOnCanvas);
232 Vector movement = (cursorPointOnCanvas - previousReferencePointForDragging) / PixelsPerMeter;
233 previousReferencePointForDragging = cursorPointOnCanvas;
243 internal virtual void InitializeDraggingModeOfAPointIfAnyIsNear(Point cursorPointOnCanvas)
245 IList<double> squaredDistancesOfCanvasPointToWorldLanePoints =
246 GetSquaredDistancesOfCanvasPointToWorldLanePoints(cursorPointOnCanvas);
247 SetPointToDraggingModeIfCursorIsNearAndDragging(ref isStartPointBeingDragged, cursorPointOnCanvas,
248 squaredDistancesOfCanvasPointToWorldLanePoints[
LanePoints.StartPoint],
249 squaredDistancesOfCanvasPointToWorldLanePoints);
250 SetPointToDraggingModeIfCursorIsNearAndDragging(ref isEndPointBeingDragged, cursorPointOnCanvas,
251 squaredDistancesOfCanvasPointToWorldLanePoints[
LanePoints.EndPoint],
252 squaredDistancesOfCanvasPointToWorldLanePoints);
265 Point cursorPointOnCanvas,
double squaredDistanceOfWorldPointFromCanvasPoint,
266 IList<double> squaredDistancesOfRemainingWorldPointsFromCanvasPoint)
268 if (squaredDistanceOfWorldPointFromCanvasPoint < DraggingCircleRadiusSquared)
270 if (squaredDistancesOfRemainingWorldPointsFromCanvasPoint.All(
271 i => i >= squaredDistanceOfWorldPointFromCanvasPoint))
273 pointIsInDraggingMode =
true;
274 previousReferencePointForDragging = cursorPointOnCanvas;
275 RenderBuildingLane(cursorPointOnCanvas);
286 Point cursorPointOnCanvasPoint)
288 return new List<double>
290 (cursorPointOnCanvasPoint - TransformRealWorldPoint(startWorldPoint.Value)).LengthSquared,
291 (cursorPointOnCanvasPoint - TransformRealWorldPoint(endWorldPoint.Value)).LengthSquared
302 endWorldPoint = previousLaneBuildingRenderer.EndWorldPoint;
virtual IList< double > GetSquaredDistancesOfCanvasPointToWorldLanePoints(Point cursorPointOnCanvasPoint)
Get squared distances of all lane world points from cursor point on canvas.
Point lastCursorPointOnCanvas
Last cursor point after rendering prewview of building lane.
void SetPointToDraggingModeIfCursorIsNearAndDragging(ref bool pointIsInDraggingMode, Point cursorPointOnCanvas, double squaredDistanceOfWorldPointFromCanvasPoint, IList< double > squaredDistancesOfRemainingWorldPointsFromCanvasPoint)
Set point to dragging mode if cursor is near to any point of lane.
Vector GetVectorOfMoveOfPointIfItIsBeingDragged(Point cursorPointOnCanvas, bool isBeingDragged)
Gets vector of move of point if the point is being dragged and update the previous reference point fo...
Base class for drawing visual renderer.
override void Render(Point currentMouseLocation)
Render preview change of move or zoom. Current mouse location.
Renderer for drawing lanes during their building.
void DrawPreviewStraightLane(Point endPointOnCanvas)
Draws preview of straight lane.
Point previousReferencePointForDragging
Previous reference point for dragging
Assigns integer identifiers for each point of a lane.
Point startWorldPoint
Start point of a previewing building lane.