Files
DynamicDataDisplay/Backup/Viewport2dDeferredPanningProxy.cs
2024-02-23 09:29:44 -05:00

102 lines
2.3 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using Microsoft.Research.DynamicDataDisplay.Common;
namespace Microsoft.Research.DynamicDataDisplay
{
internal sealed class Viewport2dDeferredPanningProxy : Viewport2D
{
private Viewport2D viewport;
internal Viewport2dDeferredPanningProxy(Viewport2D viewport)
: base(viewport.HostElement, viewport.Plotter2D)
{
viewport.PropertyChanged += viewport_PropertyChanged;
viewport.PanningStateChanged += viewport_PanningStateChanged;
this.viewport = viewport;
}
DataRect prevVisible;
private void viewport_PanningStateChanged(object sender, ValueChangedEventArgs<Viewport2DPanningState> e)
{
if (e.CurrentValue == Viewport2DPanningState.Panning && e.PreviousValue == Viewport2DPanningState.NotPanning)
{
prevVisible = Visible;
}
else if (e.CurrentValue == Viewport2DPanningState.NotPanning && e.PreviousValue == Viewport2DPanningState.Panning)
{
notMineEvent = true;
try
{
Visible = viewport.Visible;
}
finally { notMineEvent = false; }
}
}
protected override DataRect CoerceVisible(DataRect newVisible)
{
if (viewport == null)
return new DataRect(0, 0, 1, 1);
if (viewport.PanningState == Viewport2DPanningState.Panning)
return prevVisible;
return base.CoerceVisible(newVisible);
}
private bool notMineEvent = false;
private void viewport_PropertyChanged(object sender, ExtendedPropertyChangedEventArgs e)
{
notMineEvent = true;
try
{
RaisePropertyChanged(e);
}
finally
{
notMineEvent = false;
}
}
public override CoordinateTransform Transform
{
get
{
if (viewport.PanningState == Viewport2DPanningState.Panning)
return viewport.Transform.WithRects(prevVisible, viewport.Output);
return viewport.Transform;
}
set
{
base.Transform = value;
}
}
protected override void RaisePropertyChanged(ExtendedPropertyChangedEventArgs args)
{
if (args.PropertyName == "Visible")
{
if (notMineEvent)
{
if (viewport.PanningState == Viewport2DPanningState.NotPanning)
{
base.RaisePropertyChanged(args);
}
else
{
// do nothing
}
}
}
else
{
base.RaisePropertyChanged(args);
}
}
}
}