Skip to content

Commit

Permalink
Support LatestLevel, and fix PointRadius
Browse files Browse the repository at this point in the history
  • Loading branch information
jschementi committed May 8, 2011
1 parent b1edcc6 commit 841a144
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 9 deletions.
29 changes: 24 additions & 5 deletions Schementi.Controls.Demos.Sparkline/MainWindow.xaml
Expand Up @@ -4,10 +4,29 @@
xmlns:schementi="clr-namespace:Schementi.Controls;assembly=Schementi.Controls.Sparkline"
Title="Sparkline Demo (Jimmy Schementi)" Height="300" Width="600">
<Grid Background="Black" x:Name="Grid">
<schementi:Sparkline ShowWatermarks="True"
Foreground="#FFEEEEEE"
StrokeThickness="0.5"
PointFill="White"
PointRadius="0.5"/>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="3"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="3"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<schementi:Sparkline Margin="0 1"
Foreground="#FFEEEEEE" />
<schementi:Sparkline Grid.Column="0" Grid.Row="2" Margin="0 2"
Foreground="#FFEEEEEE"
PointFill="White" PointRadius="1"/>
<schementi:Sparkline Grid.Column="2" Grid.Row="0" Margin="0 1"
ShowWatermarks="False" ShowLatestLevel="True"
Foreground="#FFEEEEEE" />
<schementi:Sparkline Grid.Column="2" Grid.Row="2" Margin="0 1"
ShowWatermarks="True" ShowLatestLevel="True"
Foreground="#FFEEEEEE"
PointFill="White" PointRadius="0.5"/>
<GridSplitter ResizeDirection="Rows" Grid.Row="1" Grid.ColumnSpan="3" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="3"/>
<GridSplitter ResizeDirection="Columns" Grid.Column="1" Grid.RowSpan="3" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="3"/>
</Grid>
</Window>
3 changes: 2 additions & 1 deletion Schementi.Controls.Demos.Sparkline/MainWindow.xaml.cs
Expand Up @@ -11,10 +11,11 @@ public partial class MainWindow {
var sparklines = Grid.Children.OfType<Controls.Sparkline>();

var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(0.5) };
var random = new Random();

var x = 100.0;
timer.Tick += (s, e) => {
foreach (var sparkline in sparklines) {
var random = new Random();
//x = random.Next(100, 200);
x = x + (random.NextDouble() * 10 * random.NextDouble() * (random.NextDouble() < 0.5 ? -1 : 1));
if (x < 1) x = Math.Abs(x) + 1;
Expand Down
67 changes: 64 additions & 3 deletions Schementi.Controls.Sparkline/Sparkline.xaml.cs
Expand Up @@ -106,6 +106,19 @@ public partial class Sparkline {
}
#endregion

#region LatestLevel
public static DependencyProperty LatestLevelProperty = DependencyProperty.Register(
"LatestLevel",
typeof(double?),
typeof(Sparkline),
new PropertyMetadata(null));

public double? LatestLevel {
get { return (double?)GetValue(LatestLevelProperty); }
set { SetValue(LatestLevelProperty, value); }
}
#endregion

#region ShowWatermarks
public static DependencyProperty ShowWatermarksProperty = DependencyProperty.Register(
"ShowWatermarks",
Expand Down Expand Up @@ -158,6 +171,42 @@ private void OnShowWatermarksPropertyChanged()
}
#endregion

#region ShowLatestLevel
public static DependencyProperty ShowLatestLevelProperty = DependencyProperty.Register(
"ShowLatestLevel",
typeof(bool),
typeof(Sparkline),
new PropertyMetadata(false, OnShowLatestLevelPropertyChanged));

private static void OnShowLatestLevelPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
((Sparkline)d).OnShowLatestLevelPropertyChanged();
}

private void OnShowLatestLevelPropertyChanged() {
if (ShowLatestLevel) {
_latestLevel = new Rectangle {
Fill = Brushes.White,
Opacity = 0.5,
Height = this.StrokeThickness,
VerticalAlignment = VerticalAlignment.Top
};
BindingOperations.SetBinding(_latestLevel, MarginProperty,
new Binding("LatestLevel") { Source = this, Converter = new YCoordinateToThicknessConverter() });
Canvas.Children.Insert(0, _latestLevel);
} else {
if (_latestLevel != null) {
Canvas.Children.Remove(_latestLevel);
_latestLevel = null;
}
}
}

public bool ShowLatestLevel {
get { return (bool)GetValue(ShowLatestLevelProperty); }
set { SetValue(ShowLatestLevelProperty, value); }
}
#endregion

#region MinYRange
public static DependencyProperty MinYRangeProperty = DependencyProperty.Register(
"MinYRange",
Expand All @@ -183,6 +232,7 @@ private void OnShowWatermarksPropertyChanged()

private Rectangle _highwatermark;
private Rectangle _lowwatermark;
private Rectangle _latestLevel;
#endregion

#region Public API
Expand All @@ -194,6 +244,7 @@ private void OnShowWatermarksPropertyChanged()

private void InitializePolyline() {
_polyline = new Polyline();
if (this.Foreground == null) this.Foreground = Brushes.Black;
BindingOperations.SetBinding(_polyline, Shape.StrokeProperty,
new Binding("Foreground") { Mode = BindingMode.TwoWay, Source = this });
BindingOperations.SetBinding(_polyline, Shape.StrokeThicknessProperty,
Expand Down Expand Up @@ -243,8 +294,13 @@ private void OnShowWatermarksPropertyChanged()
_both = _lower = _higher = false;
Canvas.Children.Clear();
Canvas.Children.Add(_polyline);
Canvas.Children.Add(_lowwatermark);
Canvas.Children.Add(_highwatermark);
if (ShowWatermarks) {
Canvas.Children.Add(_lowwatermark);
Canvas.Children.Add(_highwatermark);
}
if (ShowLatestLevel) {
Canvas.Children.Add(_latestLevel);
}
Canvas.Height = double.NaN;
_nextXValue = 0;
foreach (var timeValue in TimeSeries) {
Expand All @@ -261,6 +317,7 @@ private void OnShowWatermarksPropertyChanged()
private void AddPoint(Point point) {
_polyline.Points.Add(point);
SetWatermarks(point.Y);
SetLatestLevel(point.Y);
SetCanvasHeight(point.Y);
if (PointRadius > 0.0)
Canvas.Children.Add(DrawDot(point));
Expand All @@ -282,7 +339,7 @@ private void OnShowWatermarksPropertyChanged()

private Path DrawDot(Point center) {
var path = new Path();
var circle = new EllipseGeometry(center, StrokeThickness, StrokeThickness);
var circle = new EllipseGeometry(center, PointRadius, PointRadius);
path.Fill = PointFill;
path.Data = circle;
return path;
Expand All @@ -302,6 +359,10 @@ private void OnShowWatermarksPropertyChanged()
else if (y < LowWaterMark) LowWaterMark = y;
}

private void SetLatestLevel(double y) {
LatestLevel = y;
}

private double _lowMargin;
private double _height;
private bool _lower;
Expand Down

0 comments on commit 841a144

Please sign in to comment.