Skip to content

Commit

Permalink
Fixed map refresh problem caused by old MapControl.Viewport which is …
Browse files Browse the repository at this point in the history
…now replace with MapControl.Map.Viewport.
  • Loading branch information
pauldendulk committed Jun 25, 2014
1 parent 93cb4e6 commit 320ad7c
Show file tree
Hide file tree
Showing 8 changed files with 98 additions and 93 deletions.
34 changes: 16 additions & 18 deletions Mapsui.UI.WinForms/MapControl.cs
Expand Up @@ -29,7 +29,6 @@ public class MapControl : Control
#region Fields

private Map _map;
private readonly Viewport _viewport = new Viewport();
private string _errorMessage;
private Bitmap _buffer;
private Graphics _bufferGraphics;
Expand All @@ -44,12 +43,11 @@ public class MapControl : Control

public event EventHandler ErrorMessageChanged;


#region Properties

public Viewport Transform
public IViewport Transform
{
get { return _viewport; }
get { return _map.Viewport; }
}

public Map Map
Expand Down Expand Up @@ -97,7 +95,7 @@ public MapControl()

public void ZoomIn()
{
_viewport.Resolution = ZoomHelper.ZoomIn(_map.Resolutions, _viewport.Resolution);
Map.Viewport.Resolution = ZoomHelper.ZoomIn(_map.Resolutions, Map.Viewport.Resolution);
ViewChanged(true);
Invalidate();
}
Expand All @@ -108,23 +106,23 @@ public void ZoomIn(PointF mapPosition)
// We do that in 3 steps.

// 1) Temporarily center on where the mouse is
_viewport.Center = _viewport.ScreenToWorld(mapPosition.X, mapPosition.Y);
Map.Viewport.Center = Map.Viewport.ScreenToWorld(mapPosition.X, mapPosition.Y);

// 2) Then zoom
_viewport.Resolution = ZoomHelper.ZoomIn(_map.Resolutions, _viewport.Resolution);
Map.Viewport.Resolution = ZoomHelper.ZoomIn(_map.Resolutions, Map.Viewport.Resolution);

// 3) Then move the temporary center back to the mouse position
_viewport.Center = _viewport.ScreenToWorld(
_viewport.Width - mapPosition.X,
_viewport.Height - mapPosition.Y);
Map.Viewport.Center = Map.Viewport.ScreenToWorld(
Map.Viewport.Width - mapPosition.X,
Map.Viewport.Height - mapPosition.Y);

ViewChanged(true);
Invalidate();
}

public void ZoomOut()
{
_viewport.Resolution = ZoomHelper.ZoomOut(_map.Resolutions, _viewport.Resolution);
Map.Viewport.Resolution = ZoomHelper.ZoomOut(_map.Resolutions, Map.Viewport.Resolution);
ViewChanged(true);
Invalidate();
}
Expand All @@ -141,7 +139,7 @@ protected override void OnPaint(PaintEventArgs e)

//Render to the buffer
_renderer.Graphics = _bufferGraphics;
_renderer.Render(_viewport, _map.Layers);
_renderer.Render(Map.Viewport, _map.Layers);

//Render the buffer to the control
e.Graphics.DrawImage(_buffer, 0, 0);
Expand Down Expand Up @@ -194,7 +192,7 @@ private void MapControl_MouseMove(object sender, MouseEventArgs e)
{
if (_mousePosition == null) return;
var newMousePosition = new Geometries.Point(e.X, e.Y);
MapTransformHelpers.Pan(_viewport, newMousePosition, _mousePosition);
MapTransformHelpers.Pan(Map.Viewport, newMousePosition, _mousePosition);
_mousePosition = newMousePosition;

ViewChanged(false);
Expand All @@ -208,7 +206,7 @@ private void MapControl_MouseUp(object sender, MouseEventArgs e)
{
if (_mousePosition == null) return;
var newMousePosition = new Geometries.Point(e.X, e.Y);
MapTransformHelpers.Pan(_viewport, newMousePosition, _mousePosition);
MapTransformHelpers.Pan(Map.Viewport, newMousePosition, _mousePosition);
_mousePosition = newMousePosition;

ViewChanged(true);
Expand All @@ -221,8 +219,8 @@ private void MapControl_Resize(object sender, EventArgs e)
if (Width == 0) return;
if (Height == 0) return;

_viewport.Width = Width;
_viewport.Height = Height;
Map.Viewport.Width = Width;
Map.Viewport.Height = Height;

if (_buffer == null || _buffer.Width != Width || _buffer.Height != Height)
{
Expand All @@ -240,8 +238,8 @@ private void InitializeView()
if (_map == null || _map.Envelope == null || double.IsNaN(_map.Envelope.Width) || _map.Envelope.Width <= 0) return;
if (_map.Envelope.GetCentroid() == null) return;

_viewport.Center = _map.Envelope.GetCentroid();
_viewport.Resolution = _map.Envelope.Width / Width;
Map.Viewport.Center = _map.Envelope.GetCentroid();
Map.Viewport.Resolution = _map.Envelope.Width / Width;
_viewInitialized = true;
ViewChanged(true);
}
Expand Down
10 changes: 5 additions & 5 deletions Mapsui.UI.WinForms/MapTransformHelpers.cs
Expand Up @@ -21,12 +21,12 @@ namespace Mapsui.UI.WinForms
{
public static class MapTransformHelpers
{
public static void Pan(Viewport transform, Point currentMap, Point previousMap)
public static void Pan(IViewport transform, Point currentMap, Point previousMap)
{
Point current = transform.ScreenToWorld(currentMap.X, currentMap.Y);
Point previous = transform.ScreenToWorld(previousMap.X, previousMap.Y);
double diffX = previous.X - current.X;
double diffY = previous.Y - current.Y;
var current = transform.ScreenToWorld(currentMap.X, currentMap.Y);
var previous = transform.ScreenToWorld(previousMap.X, previousMap.Y);
var diffX = previous.X - current.X;
var diffY = previous.Y - current.Y;
transform.Center = new Point(transform.Center.X + diffX, transform.Center.Y + diffY);
}
}
Expand Down
49 changes: 24 additions & 25 deletions Mapsui.UI.Xaml-W8/MapControl.cs
Expand Up @@ -39,7 +39,6 @@ namespace Mapsui.UI.Xaml
public class MapControl : Grid
{
private Map _map;
private readonly Viewport _viewport = new Viewport { Center = { X = double.NaN, Y = double.NaN }, Resolution = double.NaN };
private string _errorMessage;
private readonly DoubleAnimation _zoomAnimation = new DoubleAnimation();
private readonly Storyboard _zoomStoryBoard = new Storyboard();
Expand All @@ -55,7 +54,7 @@ public class MapControl : Grid
public event EventHandler<ViewChangedEventArgs> ViewChanged;

public bool ZoomToBoxMode { get; set; }
public Viewport Viewport { get { return _viewport; } }
public IViewport Viewport { get { return Map.Viewport; } }

public Map Map
{
Expand Down Expand Up @@ -160,18 +159,18 @@ void MapControl_PointerWheelChanged(object sender, PointerRoutedEventArgs e)

var mousePosition = new Geometries.Point(currentPoint.RawPosition.X, currentPoint.RawPosition.Y);

var newResolution = DetermineNewResolution(currentPoint.Properties.MouseWheelDelta, _viewport.Resolution);
var newResolution = DetermineNewResolution(currentPoint.Properties.MouseWheelDelta, Map.Viewport.Resolution);

// 1) Temporarily center on the mouse position
_viewport.Center = _viewport.ScreenToWorld(mousePosition.X, mousePosition.Y);
Map.Viewport.Center = Map.Viewport.ScreenToWorld(mousePosition.X, mousePosition.Y);

// 2) Then zoom
_viewport.Resolution = newResolution;
Map.Viewport.Resolution = newResolution;

// 3) Then move the temporary center of the map back to the mouse position
_viewport.Center = _viewport.ScreenToWorld(
_viewport.Width - mousePosition.X,
_viewport.Height - mousePosition.Y);
Map.Viewport.Center = Map.Viewport.ScreenToWorld(
Map.Viewport.Width - mousePosition.X,
Map.Viewport.Height - mousePosition.Y);

e.Handled = true;

Expand All @@ -192,7 +191,7 @@ private void OnViewChanged(bool userAction = false)
{
if (ViewChanged != null)
{
ViewChanged(this, new ViewChangedEventArgs { Viewport = _viewport, UserAction = userAction });
ViewChanged(this, new ViewChangedEventArgs { Viewport = Map.Viewport, UserAction = userAction });
}
}
}
Expand Down Expand Up @@ -226,7 +225,7 @@ public void ZoomIn()
if (ZoomLocked) return;
if (!_viewportInitialized) return;

_viewport.Resolution = ZoomHelper.ZoomIn(_map.Resolutions, _viewport.Resolution);
Map.Viewport.Resolution = ZoomHelper.ZoomIn(_map.Resolutions, Map.Viewport.Resolution);

OnViewChanged();
}
Expand All @@ -236,7 +235,7 @@ public void ZoomOut()
if (ZoomLocked) return;
if (!_viewportInitialized) return;

_viewport.Resolution = ZoomHelper.ZoomOut(_map.Resolutions, _viewport.Resolution);
Map.Viewport.Resolution = ZoomHelper.ZoomOut(_map.Resolutions, Map.Viewport.Resolution);

OnViewChanged();
}
Expand Down Expand Up @@ -278,8 +277,8 @@ private void MapControlSizeChanged(object sender, SizeChangedEventArgs e)
private void UpdateSize()
{
if (Viewport == null) return;
_viewport.Width = ActualWidth;
_viewport.Height = ActualHeight;
Map.Viewport.Width = ActualWidth;
Map.Viewport.Height = ActualHeight;
}

public void MapDataChanged(object sender, DataChangedEventArgs e)
Expand Down Expand Up @@ -321,10 +320,10 @@ private void InitializeViewport()
if (_map.Envelope.Height.IsNanOrZero()) return;
if (_map.Envelope.GetCentroid() == null) return;

if (double.IsNaN(_viewport.Resolution))
_viewport.Resolution = _map.Envelope.Width / ActualWidth;
if (double.IsNaN(_viewport.Center.X) || double.IsNaN(_viewport.Center.Y))
_viewport.Center = _map.Envelope.GetCentroid();
if (double.IsNaN(Map.Viewport.Resolution))
Map.Viewport.Resolution = _map.Envelope.Width / ActualWidth;
if (double.IsNaN(Map.Viewport.Center.X) || double.IsNaN(Map.Viewport.Center.Y))
Map.Viewport.Center = _map.Envelope.GetCentroid();

_viewportInitialized = true;
}
Expand All @@ -337,8 +336,8 @@ void CompositionTarget_Rendering(object sender, object e)

if ((_renderer != null) && (_map != null))
{
_renderer.Render(_viewport, _map.Layers);
_renderTarget.Arrange(new Rect(0, 0, _viewport.Width, _viewport.Height));
_renderer.Render(Map.Viewport, _map.Layers);
_renderTarget.Arrange(new Rect(0, 0, Map.Viewport.Width, Map.Viewport.Height));
_invalid = false;
}
}
Expand All @@ -354,8 +353,8 @@ public void ZoomToBox(Geometries.Point beginPoint, Geometries.Point endPoint)
ZoomHelper.ZoomToBoudingbox(beginPoint.X, beginPoint.Y, endPoint.X, endPoint.Y, ActualWidth, out x, out y, out resolution);
resolution = ZoomHelper.ClipToExtremes(_map.Resolutions, resolution);

_viewport.Center = new Geometries.Point(x, y);
_viewport.Resolution = resolution;
Map.Viewport.Center = new Geometries.Point(x, y);
Map.Viewport.Resolution = resolution;

_map.ViewChanged(true);
OnViewChanged();
Expand All @@ -374,8 +373,8 @@ public void ZoomToFullEnvelope()
{
if (Map.Envelope == null) return;
if (ActualWidth.IsNanOrZero()) return;
_viewport.Resolution = Map.Envelope.Width / ActualWidth;
_viewport.Center = Map.Envelope.GetCentroid();
Map.Viewport.Resolution = Map.Envelope.Width / ActualWidth;
Map.Viewport.Center = Map.Envelope.GetCentroid();

OnViewChanged();
}
Expand Down Expand Up @@ -407,7 +406,7 @@ private void OnManipulationDelta(object sender, ManipulationDeltaRoutedEventArgs
return;
}

_viewport.Transform(e.Position.X, e.Position.Y, _previousPosition.X, _previousPosition.Y, e.Delta.Scale);
Map.Viewport.Transform(e.Position.X, e.Position.Y, _previousPosition.X, _previousPosition.Y, e.Delta.Scale);

_previousPosition = e.Position;

Expand All @@ -430,7 +429,7 @@ private void OnManipulationCompleted(object sender, ManipulationCompletedRoutedE

public class ViewChangedEventArgs : EventArgs
{
public Viewport Viewport { get; set; }
public IViewport Viewport { get; set; }
public bool UserAction { get; set; }
}

Expand Down

0 comments on commit 320ad7c

Please sign in to comment.