示例#1
0
        private TimeSpan TimeFromX(double x)
        {
            double   relativeProgress = (x / ActualWidth) - Midpoint;
            TimeSpan position         = Progress + TotalDisplayedDuration.Multiply(relativeProgress);

            return(position);
        }
示例#2
0
        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);
        }
示例#3
0
        private bool IsTimeVisible(TimeSpan time)
        {
            if (time < Progress - TotalDisplayedDuration.Multiply(Midpoint))
            {
                return(false);
            }
            if (time > Progress + TotalDisplayedDuration.Multiply(1 - Midpoint))
            {
                return(false);
            }

            return(true);
        }
示例#4
0
        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();
        }
示例#5
0
        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();
        }
示例#6
0
        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();
        }
示例#7
0
        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();
        }
示例#8
0
 private TimeSpan XToPosition(double x)
 {
     return(TotalDisplayedDuration.Multiply(x / ActualWidth) + (Progress - TotalDisplayedDuration.Multiply(Midpoint)));
 }
示例#9
0
 private double PositionToX(TimeSpan timeStamp)
 {
     return((timeStamp - (Progress - TotalDisplayedDuration.Multiply(Midpoint))).Divide(TotalDisplayedDuration) * ActualWidth);
 }