summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Maps/Map.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Xamarin.Forms.Maps/Map.cs')
-rw-r--r--Xamarin.Forms.Maps/Map.cs107
1 files changed, 107 insertions, 0 deletions
diff --git a/Xamarin.Forms.Maps/Map.cs b/Xamarin.Forms.Maps/Map.cs
new file mode 100644
index 00000000..a4587a3e
--- /dev/null
+++ b/Xamarin.Forms.Maps/Map.cs
@@ -0,0 +1,107 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Collections.Specialized;
+using System.Linq;
+
+namespace Xamarin.Forms.Maps
+{
+ public class Map : View, IEnumerable<Pin>
+ {
+ public static readonly BindableProperty MapTypeProperty = BindableProperty.Create("MapType", typeof(MapType), typeof(Map), default(MapType));
+
+ public static readonly BindableProperty IsShowingUserProperty = BindableProperty.Create("IsShowingUser", typeof(bool), typeof(Map), default(bool));
+
+ public static readonly BindableProperty HasScrollEnabledProperty = BindableProperty.Create("HasScrollEnabled", typeof(bool), typeof(Map), true);
+
+ public static readonly BindableProperty HasZoomEnabledProperty = BindableProperty.Create("HasZoomEnabled", typeof(bool), typeof(Map), true);
+
+ readonly ObservableCollection<Pin> _pins = new ObservableCollection<Pin>();
+ MapSpan _visibleRegion;
+
+ public Map(MapSpan region)
+ {
+ LastMoveToRegion = region;
+
+ VerticalOptions = HorizontalOptions = LayoutOptions.FillAndExpand;
+
+ _pins.CollectionChanged += PinsOnCollectionChanged;
+ }
+
+ // center on Rome by default
+ public Map() : this(new MapSpan(new Position(41.890202, 12.492049), 0.1, 0.1))
+ {
+ }
+
+ public bool HasScrollEnabled
+ {
+ get { return (bool)GetValue(HasScrollEnabledProperty); }
+ set { SetValue(HasScrollEnabledProperty, value); }
+ }
+
+ public bool HasZoomEnabled
+ {
+ get { return (bool)GetValue(HasZoomEnabledProperty); }
+ set { SetValue(HasZoomEnabledProperty, value); }
+ }
+
+ public bool IsShowingUser
+ {
+ get { return (bool)GetValue(IsShowingUserProperty); }
+ set { SetValue(IsShowingUserProperty, value); }
+ }
+
+ public MapType MapType
+ {
+ get { return (MapType)GetValue(MapTypeProperty); }
+ set { SetValue(MapTypeProperty, value); }
+ }
+
+ public IList<Pin> Pins
+ {
+ get { return _pins; }
+ }
+
+ public MapSpan VisibleRegion
+ {
+ get { return _visibleRegion; }
+ internal set
+ {
+ if (_visibleRegion == value)
+ return;
+ if (value == null)
+ throw new ArgumentNullException(nameof(value));
+ OnPropertyChanging();
+ _visibleRegion = value;
+ OnPropertyChanged();
+ }
+ }
+
+ internal MapSpan LastMoveToRegion { get; private set; }
+
+ IEnumerator IEnumerable.GetEnumerator()
+ {
+ return GetEnumerator();
+ }
+
+ public IEnumerator<Pin> GetEnumerator()
+ {
+ return _pins.GetEnumerator();
+ }
+
+ public void MoveToRegion(MapSpan mapSpan)
+ {
+ if (mapSpan == null)
+ throw new ArgumentNullException(nameof(mapSpan));
+ LastMoveToRegion = mapSpan;
+ MessagingCenter.Send(this, "MapMoveToRegion", mapSpan);
+ }
+
+ void PinsOnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
+ {
+ if (e.NewItems != null && e.NewItems.Cast<Pin>().Any(pin => pin.Label == null))
+ throw new ArgumentException("Pin must have a Label to be added to a map");
+ }
+ }
+} \ No newline at end of file