Skip to content
This repository was archived by the owner on Jul 4, 2024. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 50 additions & 29 deletions src/Figure.cs
Original file line number Diff line number Diff line change
Expand Up @@ -101,12 +101,13 @@ public Thickness ExtraPadding
/// <returns>Padding with maximum values for each side from padding of all children</returns>
protected override Thickness AggregatePadding()
{
var ep = base.AggregatePadding();
return new Thickness(
ep.Left + ExtraPadding.Left,
ep.Top + ExtraPadding.Top,
ep.Right + ExtraPadding.Right,
ep.Bottom + ExtraPadding.Bottom);
return ExtraPadding;
}

// Helper function to add up the left and right size as width, as well as the top and bottom size as height
private static Size HelperCollapseThickness(Thickness th)
{
return new Size(th.Left + th.Right, th.Top + th.Bottom);
}

/// <summary>
Expand Down Expand Up @@ -138,9 +139,18 @@ protected override Size MeasureOverride(Size availableSize)
//then meassuring left and right with top and bottom output values

// Create transform for first iteration

//Handle Padding
Thickness _padding = ComputePadding();
Size padding = HelperCollapseThickness(_padding);

if (double.IsNaN(availableSize.Width) || double.IsNaN(availableSize.Height) ||
double.IsInfinity(availableSize.Width) || double.IsInfinity(availableSize.Height))
availableSize = new Size(100, 100);
availableSize = new Size(Math.Max(0.0, 100 - padding.Width),
Math.Max(0.0, 100 - padding.Height));
else
availableSize = new Size(Math.Max(0.0, availableSize.Width - padding.Width),
Math.Max(0.0, availableSize.Height - padding.Height));

Fit(desiredRect, availableSize);

Expand Down Expand Up @@ -290,7 +300,8 @@ protected override Size MeasureOverride(Size availableSize)
}

centerSize = availCenterSize;
return new Size(availCenterSize.Width + leftRightWidth, availCenterSize.Height + topBottomHeight);

return new Size(availCenterSize.Width + leftRightWidth + padding.Width, availCenterSize.Height + topBottomHeight + padding.Height);
}

/// <summary>
Expand All @@ -308,58 +319,64 @@ protected override Size ArrangeOverride(Size finalSize)

double x = 0, y = 0;

//Handle Padding
Thickness _padding = ComputePadding();
Size padding = HelperCollapseThickness(_padding);

//Arranging top elements and setting clip bounds
if (topHeight < topHeight2)
{
y += _padding.Top;
foreach (var elt in topElts)
{
double finalHeight = elt.DesiredSize.Height * topHeight / topHeight2;
elt.Arrange(new Rect(leftWidth, y, centerSize.Width, finalHeight));
elt.Clip = new RectangleGeometry { Rect = new Rect(-leftWidth, 0, finalSize.Width, finalHeight) };
elt.Arrange(new Rect(leftWidth + _padding.Left, y, centerSize.Width, finalHeight));
elt.Clip = new RectangleGeometry { Rect = new Rect(-leftWidth - _padding.Left, 0, finalSize.Width, finalHeight) };
y += finalHeight;
}
}
else
{
double iy = topHeight;
double iy = topHeight + _padding.Top;
for (int i = topElts.Length - 1; i > -1; i--)
{
UIElement elt = topElts[i];
elt.Arrange(new Rect(leftWidth, iy - elt.DesiredSize.Height, centerSize.Width, elt.DesiredSize.Height));
elt.Clip = new RectangleGeometry { Rect = new Rect(-leftWidth, 0, finalSize.Width, elt.DesiredSize.Height) };
elt.Arrange(new Rect(leftWidth + _padding.Left, iy - elt.DesiredSize.Height, centerSize.Width, elt.DesiredSize.Height));
elt.Clip = new RectangleGeometry { Rect = new Rect(-leftWidth - _padding.Left, 0, finalSize.Width, elt.DesiredSize.Height) };
iy -= elt.DesiredSize.Height;
}
y = topHeight;
y = topHeight + _padding.Top;
}

// Arranging left elements and setting clip bounds
if (leftWidth < leftWidth2)
{
x += _padding.Left;
foreach (var elt in leftElts)
{
double finalWidth = elt.DesiredSize.Width * leftWidth / leftWidth2;
elt.Arrange(new Rect(x, topHeight, finalWidth, centerSize.Height));
elt.Clip = new RectangleGeometry { Rect = new Rect(0, -topHeight, finalWidth, finalSize.Height) };
elt.Arrange(new Rect(x, topHeight + _padding.Top, finalWidth, centerSize.Height));
elt.Clip = new RectangleGeometry { Rect = new Rect(0, -topHeight - _padding.Top, finalWidth, finalSize.Height) };
x += finalWidth;
}
}
else
{
double ix = leftWidth;
double ix = leftWidth + _padding.Left;
for (int i = leftElts.Length - 1; i > -1; i--)
{
UIElement elt = leftElts[i];
elt.Arrange(new Rect(ix - elt.DesiredSize.Width, topHeight, elt.DesiredSize.Width, centerSize.Height));
elt.Clip = new RectangleGeometry { Rect = new Rect(0, -topHeight, elt.DesiredSize.Width, finalSize.Height) };
elt.Arrange(new Rect(ix - elt.DesiredSize.Width, topHeight + _padding.Top, elt.DesiredSize.Width, centerSize.Height));
elt.Clip = new RectangleGeometry { Rect = new Rect(0, -topHeight - _padding.Top, elt.DesiredSize.Width, finalSize.Height) };
ix -= elt.DesiredSize.Width;
}
x = leftWidth;
x = leftWidth + _padding.Left;
}

// Arranging center elements
foreach (var elt in centerElts)
{
elt.Arrange(new Rect(leftWidth, topHeight, centerSize.Width, centerSize.Height));
elt.Arrange(new Rect(leftWidth + _padding.Left, topHeight + _padding.Top, centerSize.Width, centerSize.Height));
}

x += centerSize.Width;
Expand All @@ -371,20 +388,22 @@ protected override Size ArrangeOverride(Size finalSize)
foreach (var elt in bottomElts)
{
double finalHeight = elt.DesiredSize.Height * bottomHeight / bottomHeight2;
elt.Arrange(new Rect(leftWidth, y, centerSize.Width, finalHeight));
elt.Clip = new RectangleGeometry { Rect = new Rect(-leftWidth, 0, finalSize.Width, finalHeight) };
elt.Arrange(new Rect(leftWidth + _padding.Left, y, centerSize.Width, finalHeight));
elt.Clip = new RectangleGeometry { Rect = new Rect(-leftWidth - _padding.Left, 0, finalSize.Width, finalHeight) };
y += finalHeight;
}
y += _padding.Bottom;
}
else
{
for (int i = bottomElts.Length - 1; i > -1; i--)
{
UIElement elt = bottomElts[i];
elt.Arrange(new Rect(leftWidth, y, centerSize.Width, elt.DesiredSize.Height));
elt.Clip = new RectangleGeometry { Rect = new Rect(-leftWidth, 0, finalSize.Width, elt.DesiredSize.Height) };
elt.Arrange(new Rect(leftWidth + _padding.Left, y, centerSize.Width, elt.DesiredSize.Height));
elt.Clip = new RectangleGeometry { Rect = new Rect(-leftWidth - _padding.Left, 0, finalSize.Width, elt.DesiredSize.Height) };
y += elt.DesiredSize.Height;
}
y += _padding.Bottom;
}

// Arranging right elements and setting clip bounds
Expand All @@ -393,20 +412,22 @@ protected override Size ArrangeOverride(Size finalSize)
foreach (var elt in rightElts)
{
double finalWidth = elt.DesiredSize.Width * rightWidth / rightWidth2;
elt.Arrange(new Rect(x, topHeight, finalWidth, centerSize.Height));
elt.Clip = new RectangleGeometry { Rect = new Rect(0, -topHeight, finalWidth, finalSize.Height) };
elt.Arrange(new Rect(x, topHeight + _padding.Top, finalWidth, centerSize.Height));
elt.Clip = new RectangleGeometry { Rect = new Rect(0, -topHeight - _padding.Top, finalWidth, finalSize.Height) };
x += finalWidth;
}
x += _padding.Right;
}
else
{
for (int i = rightElts.Length - 1; i > -1; i--)
{
UIElement elt = rightElts[i];
elt.Arrange(new Rect(x, topHeight, elt.DesiredSize.Width, centerSize.Height));
elt.Clip = new RectangleGeometry { Rect = new Rect(0, -topHeight, elt.DesiredSize.Width, finalSize.Height) };
elt.Arrange(new Rect(x, topHeight + _padding.Top, elt.DesiredSize.Width, centerSize.Height));
elt.Clip = new RectangleGeometry { Rect = new Rect(0, -topHeight - _padding.Top, elt.DesiredSize.Width, finalSize.Height) };
x += elt.DesiredSize.Width;
}
x += _padding.Right;
}

return new Size(x, y);
Expand Down
2 changes: 1 addition & 1 deletion src/InteractiveDataDisplay.WPF.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
</PropertyGroup>
<PropertyGroup>
<LanguageTargets Condition="Exists('$(MSBuildExtensionsPath)\$(VisualStudioVersion)\Bin\Microsoft.CSharp.targets')">$(MSBuildExtensionsPath)\$(VisualStudioVersion)\Bin\Microsoft.CSharp.targets</LanguageTargets>
<Version>1.1.0</Version>
<Version>1.1.1</Version>
<Company>Microsoft; MSU ITIS Lab</Company>
<Authors>Sergey Berezin, Vassily Lyutsarev, Nikita Skoblov, Natalia Stepanova</Authors>
<Description>Interactive Data Display for WPF is a set of controls for adding interactive visualization of dynamic data to your application.</Description>
Expand Down
2 changes: 1 addition & 1 deletion src/Navigation/MouseNavigation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -416,7 +416,7 @@ private bool HandleMouseDown(MouseEventArgs e)
else
{
DateTime d = DateTime.Now;
if ((d - lastClick).TotalMilliseconds < 200)
if ((d - lastClick).TotalMilliseconds < 200 && IsVerticalNavigationEnabled && IsHorizontalNavigationEnabled)
{
masterPlot.IsAutoFitEnabled = true;
return true;
Expand Down
12 changes: 7 additions & 5 deletions src/Themes/Generic.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@
<Setter.Value>
<ControlTemplate TargetType="d3:Chart">
<Grid>
<d3:Figure x:Name="PART_figure" Margin="1"
<d3:Figure x:Name="PART_figure"
Margin="1"
PlotHeight="{Binding PlotHeight, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
PlotWidth="{Binding PlotWidth, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
PlotOriginX="{Binding PlotOriginX, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
Expand All @@ -40,7 +41,8 @@
IsAutoFitEnabled="{Binding IsAutoFitEnabled, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
AspectRatio="{Binding AspectRatio, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
ExtraPadding="{TemplateBinding BorderThickness}"
Background="{TemplateBinding Background}">
Background="{TemplateBinding Background}"
Padding="{TemplateBinding Padding}">
<d3:MouseNavigation IsVerticalNavigationEnabled="{TemplateBinding IsVerticalNavigationEnabled}"
IsHorizontalNavigationEnabled="{TemplateBinding IsHorizontalNavigationEnabled}"
x:Name="PART_mouseNavigation"/>
Expand All @@ -52,11 +54,11 @@
VerticalAlignment="Center"
IsTabStop="False"/>
<d3:PlotAxis x:Name="PART_verticalAxis"
d3:Figure.Placement="Left"
d3:Figure.Placement="Left"
AxisOrientation="Left"
IsReversed = "{Binding IsYAxisReversed, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
Foreground="{TemplateBinding Foreground}">
<d3:MouseNavigation IsHorizontalNavigationEnabled="False"/>
<d3:MouseNavigation IsHorizontalNavigationEnabled="False" IsVerticalNavigationEnabled="{TemplateBinding IsVerticalNavigationEnabled}"/>
</d3:PlotAxis>
<d3:AxisGrid x:Name="PART_axisGrid"
VerticalTicks="{Binding Ticks,ElementName=PART_verticalAxis, Mode=OneWay}"
Expand Down Expand Up @@ -84,7 +86,7 @@
AxisOrientation="Bottom"
IsReversed = "{Binding IsXAxisReversed, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
Foreground="{TemplateBinding Foreground}">
<d3:MouseNavigation IsVerticalNavigationEnabled="False"/>
<d3:MouseNavigation IsVerticalNavigationEnabled="False" IsHorizontalNavigationEnabled="{TemplateBinding IsHorizontalNavigationEnabled}"/>
</d3:PlotAxis>
<ContentPresenter/>
<Border BorderThickness="{TemplateBinding BorderThickness}"
Expand Down