aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/SideChains/RealTimeGraphEx/Components/YAxisWave.cs
blob: 1e6229b153525cecdd882d34ddf27259d7b10a95 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;

namespace RealTimeGraphEx.Components
{
    public class YAxisWave : YAxisScroll
    {
        private Grid innerGrid;

        public YAxisWave()
            : base()
        {

        }

        public override void Render(RealTimeGraphExBase graph, bool animate = false)
        {
            if (graph == null) return;

            if (innerGrid == null)
            {
                innerGrid = new Grid();
            }

            if (Interval == 0) return;
            if (Interval % 2 != 0) Interval += 1;

            var grid = innerGrid;

            var renderBounds = Graph.GetGraphRenderBounds();

            double animationTime = animate ? 0.2 : 0;

            DoubleAnimation heightAnimation = new DoubleAnimation() { Duration = new Duration(TimeSpan.FromSeconds(animationTime)) };
            heightAnimation.To = double.IsNaN(Graph.gridLinesAndImageWrapperGrid.Height) ? Graph.gridLinesAndImageWrapperGrid.ActualHeight : Graph.gridLinesAndImageWrapperGrid.Height;


            if (!double.IsNaN(grid.Height))
            {
                grid.BeginAnimation(Grid.HeightProperty, heightAnimation);
            }
            else
            {
                grid.Height = Graph.gridLinesAndImageWrapperGrid.ActualHeight;
            }
            grid.VerticalAlignment = System.Windows.VerticalAlignment.Top;

            ThicknessAnimation marginAni = new ThicknessAnimation() { Duration = new Duration(TimeSpan.FromSeconds(animationTime)) };
            marginAni.To = new Thickness(0, Graph.gridLinesAndImageWrapperGrid.Margin.Top, 0, 0);

            if (!double.IsNaN(grid.Height))
            {
                grid.BeginAnimation(MarginProperty, marginAni);
            }
            else
            {
                grid.Margin = new Thickness(0, Graph.gridLinesAndImageWrapperGrid.Margin.Top, 0, 0);
            }

            this.ClipToBounds = true;
            this.Content = grid;

            double height = double.IsNaN(Graph.gridLinesAndImageWrapperGrid.Height) ? Graph.gridLinesAndImageWrapperGrid.ActualHeight : Graph.gridLinesAndImageWrapperGrid.Height;
            int interval = (int)Math.Round((Interval * (((height * 100) / Graph.gridMain.ActualHeight) / 100)), MidpointRounding.ToEven);

            grid.RowDefinitions.Clear();
            grid.Children.Clear();

            for (int i = 0; i < interval; i++)
            {
                RowDefinition rowLabels = new RowDefinition();
                rowLabels.Height = new GridLength(1, GridUnitType.Star);
                grid.RowDefinitions.Add(rowLabels);
            }

            for (int i = 0; i < interval; i++)
            {
                AddLabel(Math.Abs((graph.Maximum - (i * ((graph.Maximum + Math.Abs(graph.Minimum)) / (interval / 2))))).ToString(StringFormat), graph, grid, i, System.Windows.VerticalAlignment.Top);
            }

            AddLabel(graph.Maximum.ToString(StringFormat), graph, grid, interval - 1, System.Windows.VerticalAlignment.Bottom);
        }

        protected override void OnGraphZoomComplete(Point transformOrigin, double scaleX, double scaleY)
        {
            Render(Graph, true);
        }

        protected override void OnGraphPanningComplete(Point translate)
        {
            if (innerGrid != null)
            {
                var renderBounds = Graph.GetGraphRenderBounds();
                innerGrid.BeginAnimation(MarginProperty, null);
                innerGrid.Margin = new Thickness(0, renderBounds.Top, 0, 0);
            }
        }
    }
}