private TimeSpan TimeFromX(double x) { double relativeProgress = (x / ActualWidth) - Midpoint; TimeSpan position = Progress + TotalDisplayedDuration.Multiply(relativeProgress); return(position); }
private double XFromTime(TimeSpan time) { TimeSpan timeFrom = Progress - TotalDisplayedDuration.Multiply(Midpoint); TimeSpan timeTo = Progress + TotalDisplayedDuration.Multiply(1 - Midpoint); double relativePosition = (time - timeFrom).Divide(timeTo - timeFrom); double absolutePosition = relativePosition * ActualWidth; return(absolutePosition); }
private bool IsTimeVisible(TimeSpan time) { if (time < Progress - TotalDisplayedDuration.Multiply(Midpoint)) { return(false); } if (time > Progress + TotalDisplayedDuration.Multiply(1 - Midpoint)) { return(false); } return(true); }
protected override void OnRender(DrawingContext drawingContext) { if (_down) { UpdateSelectedPosition(); } Pen redPen = new Pen(Brushes.Red, 1); Rect fullRect = new Rect(new Point(), new Size(ActualWidth, ActualHeight)); drawingContext.PushClip(new RectangleGeometry(fullRect)); drawingContext.DrawRectangle(Background, null, fullRect); double midPointX = ActualWidth * Midpoint; drawingContext.DrawLine(redPen, new Point(midPointX, 0), new Point(midPointX, ActualHeight)); if (Positions != null) { TimeSpan timeFrom = Progress - TotalDisplayedDuration.Multiply(Midpoint); TimeSpan timeTo = Progress + TotalDisplayedDuration.Multiply(1 - Midpoint); List <TimedPosition> absoluteBeatPositions = Positions.GetPositions(timeFrom, timeTo).ToList(); //double ToLocal(TimedPosition b) => (b.TimeStamp - timeFrom).Divide(timeTo - timeFrom) * ActualWidth; List <Point> beatPoints = absoluteBeatPositions.Select(GetPointFromPosition).ToList(); if (beatPoints.Count > 0) { PathFigure figure = new PathFigure { StartPoint = beatPoints[0] }; for (int i = 1; i < beatPoints.Count; i++) { figure.Segments.Add(new LineSegment(beatPoints[i], true)); } drawingContext.DrawGeometry(null, redPen, new PathGeometry(new[] { figure })); for (int i = 0; i < beatPoints.Count; i++) { drawingContext.DrawEllipse(Brushes.DarkRed, redPen, beatPoints[i], CircleRadius, CircleRadius); } } } drawingContext.Pop(); }
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) { if (IsReadOnly) { return; } _mousePos = e.GetPosition(this); TimeSpan timeFrom = Progress - TotalDisplayedDuration.Multiply(Midpoint); TimeSpan timeTo = Progress + TotalDisplayedDuration.Multiply(1 - Midpoint); List <TimedPosition> absoluteBeatPositions = Positions.GetPositions(timeFrom, timeTo).ToList(); double minDist = double.MaxValue; TimedPosition closest = null; foreach (TimedPosition position in absoluteBeatPositions) { double distance = GetPointFromPosition(position).DistanceTo(_mousePos); if (distance < minDist) { closest = position; minDist = distance; } } if (closest == null) { return; } if (minDist > 20) { return; } _position = closest; _down = true; CaptureMouse(); }
protected override void OnRender(DrawingContext drawingContext) { Rect fullRect = new Rect(new Point(), new Size(ActualWidth, ActualHeight)); drawingContext.PushClip(new RectangleGeometry(fullRect)); drawingContext.DrawRectangle(Background, null, fullRect); if (Positions != null) { TimeSpan timeFrom = Progress - TotalDisplayedDuration.Multiply(Midpoint); TimeSpan timeTo = Progress + TotalDisplayedDuration.Multiply(1 - Midpoint); List <TimedPosition> absoluteBeatPositions = Positions.GetPositions(timeFrom, timeTo).ToList(); double ToLocal(TimedPosition b) => (b.TimeStamp - timeFrom).Divide(timeTo - timeFrom) * ActualWidth; List <Point> beatPoints = absoluteBeatPositions.Select(a => new Point(ToLocal(a), ActualHeight * (a.Position / 99.0))).ToList(); if (beatPoints.Count > 0) { PathFigure figure = new PathFigure { StartPoint = beatPoints[0] }; for (int i = 1; i < beatPoints.Count; i++) { figure.Segments.Add(new LineSegment(beatPoints[i], true)); } drawingContext.DrawGeometry(null, new Pen(Brushes.Red, 1), new PathGeometry(new[] { figure })); for (int i = 0; i < beatPoints.Count; i++) { drawingContext.DrawEllipse(Brushes.Black, new Pen(Brushes.Red, 1), beatPoints[i], 4, 4); } } } drawingContext.Pop(); }
protected override void OnRender(DrawingContext drawingContext) { #region Background Rect fullRect = new Rect(new Point(), new Size(ActualWidth, ActualHeight)); drawingContext.PushClip(new RectangleGeometry(fullRect)); drawingContext.DrawRectangle(Background, null, fullRect); #endregion #region Selection TimeSpan timeFrom = Progress - TotalDisplayedDuration.Multiply(Midpoint); TimeSpan timeTo = Progress + TotalDisplayedDuration.Multiply(1 - Midpoint); if (Marker1 != TimeSpan.MinValue && Marker2 != TimeSpan.MinValue) { TimeSpan earlier = Marker1 < Marker2 ? Marker1 : Marker2; TimeSpan later = Marker1 > Marker2 ? Marker1 : Marker2; if (later >= timeFrom && earlier <= timeTo) { double xFrom = XFromTime(earlier); double xTo = XFromTime(later); SolidColorBrush brush = new SolidColorBrush(Colors.Cyan) { Opacity = 0.4 }; drawingContext.DrawRectangle(brush, null, new Rect(new Point(xFrom, 0), new Point(xTo, ActualHeight))); } } if (Marker1 != TimeSpan.MinValue && IsTimeVisible(Marker1)) { double x = XFromTime(Marker1); drawingContext.DrawLine(new Pen(Brushes.Cyan, 1), new Point(x, 0), new Point(x, ActualHeight)); } if (Marker2 != TimeSpan.MinValue && IsTimeVisible(Marker2)) { double x = XFromTime(Marker2); drawingContext.DrawLine(new Pen(Brushes.Cyan, 1), new Point(x, 0), new Point(x, ActualHeight)); } #endregion #region MidPoint drawingContext.DrawLine(new Pen(Brushes.Red, 11), new Point(Midpoint * ActualWidth, 0), new Point(Midpoint * ActualWidth, ActualHeight)); #endregion #region Beats if (Beats != null) { List <TimeSpan> absoluteBeatPositions = Beats.GetBeats(timeFrom, timeTo).ToList(); IEnumerable <double> relativeBeatPositions = absoluteBeatPositions.Select(b => (b - timeFrom).Divide(timeTo - timeFrom)); //const double safeSpace = 30; //double y = ActualHeight / 2.0; //DrawLine(drawingContext, Colors.Red, new Point(-safeSpace, y), // new Point(ActualWidth + safeSpace, y)); foreach (double pos in relativeBeatPositions) { DrawLine(drawingContext, LineColor, new Point(pos * ActualWidth, -5), new Point(pos * ActualWidth, ActualHeight + 5), LineWidth); } } #endregion drawingContext.Pop(); }
private TimeSpan XToPosition(double x) { return(TotalDisplayedDuration.Multiply(x / ActualWidth) + (Progress - TotalDisplayedDuration.Multiply(Midpoint))); }
private double PositionToX(TimeSpan timeStamp) { return((timeStamp - (Progress - TotalDisplayedDuration.Multiply(Midpoint))).Divide(TotalDisplayedDuration) * ActualWidth); }