forked from ArduPilot/MissionPlanner
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathOverlayAdapter.cs
120 lines (111 loc) · 3.96 KB
/
OverlayAdapter.cs
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
108
109
110
111
112
113
114
115
116
117
118
119
120
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Threading;
using System.Windows.Forms;
using AltitudeAngelWings.ApiClient.Models;
using AltitudeAngelWings.Extra;
using GeoJSON.Net.Feature;
using GMap.NET;
using GMap.NET.WindowsForms;
namespace AltitudeAngelWings.Plugin
{
internal class OverlayAdapter : IOverlay
{
private readonly GMapOverlay _overlay;
private readonly SynchronizationContext _context;
public OverlayAdapter(GMapOverlay overlay)
{
_context = new WindowsFormsSynchronizationContext();
_overlay = overlay;
}
public bool IsVisible
{
get
{
var value = false;
_context.Send(state =>
{
value = _overlay.IsVisibile;
}, null);
return value;
}
set
{
_context.Send(state =>
{
_overlay.IsVisibile = value;
}, null);
}
}
public void AddOrUpdatePolygon(string name, List<LatLong> points, ColorInfo colorInfo, Feature featureInfo)
{
_context.Send(_ =>
{
var polygon = _overlay.Polygons.FirstOrDefault(p => p.Name == name);
if (polygon == null)
{
polygon = new GMapPolygon(points.ConvertAll(p => new PointLatLng(p.Latitude, p.Longitude)), name);
_overlay.Polygons.Add(polygon);
}
polygon.Fill = new SolidBrush(Color.FromArgb((int)colorInfo.FillColor));
polygon.Stroke = new Pen(Color.FromArgb((int)colorInfo.StrokeColor), colorInfo.StrokeWidth);
polygon.IsHitTestVisible = true;
polygon.Tag = featureInfo;
}, null);
}
public void RemovePolygonsExcept(List<string> names)
{
_context.Send(_ =>
{
var remove = _overlay.Polygons
.Where(p => !names.Contains(p.Name))
.ToArray();
foreach (var polygon in remove)
{
_overlay.Polygons.Remove(polygon);
}
}, null);
}
public bool PolygonExists(string name)
{
var polygonExists = false;
_context.Send(_ => polygonExists = _overlay.Polygons.Any(i => i.Name == name), null);
return polygonExists;
}
public void AddOrUpdateLine(string name, List<LatLong> points, ColorInfo colorInfo, Feature featureInfo)
{
_context.Send(_ =>
{
var route = _overlay.Routes.FirstOrDefault(r => r.Name == name);
if (route == null)
{
route = new GMapRoute(points.ConvertAll(p => new PointLatLng(p.Latitude, p.Longitude)), name);
_overlay.Routes.Add(route);
}
route.Stroke = new Pen(Color.FromArgb((int)colorInfo.StrokeColor), colorInfo.StrokeWidth + 2);
route.IsHitTestVisible = true;
route.Tag = featureInfo;
}, null);
}
public void RemoveLinesExcept(List<string> names)
{
_context.Send(_ =>
{
var remove = _overlay.Routes
.Where(p => !names.Contains(p.Name))
.ToArray();
foreach (var route in remove)
{
_overlay.Routes.Remove(route);
}
}, null);
}
public bool LineExists(string name)
{
var exists = false;
_context.Send(_ => exists = _overlay.Routes.Any(i => i.Name == name), null);
return exists;
}
}
}