Dart Documentationdartkart.mapMapControl

MapControl abstract class

The abstract base class for map controls.

abstract class MapControl {
 MapViewport _map;
 /// the map this control is attached to, or null
 MapViewport get map => _map;

 /// the list of currently subscriptions
 final List _subscriptions = [];

 /// the container element for the control
 Element _root;

 /// the root DOM element for this map control
 Element get root => _root;

 /**
  * Creates a new map control attached to [viewport].
  *
  * If [viewport] is missing, the control isn't attached yet.
  * Use [attach] to attach it.
  */
 MapControl([MapViewport viewport]) {
   if (viewport != null) {
     attach(viewport);
   }
 }

 /**
  * Detaches this control from the map viewport it is currently
  * attached to (if any).
  */
 void detach() {
   if (_map == null) return;
   if (_root == null) return;
   if (_map._controlsPane == null) return;
   _map.controlsPane.root.children.remove(root);
   _subscriptions.forEach((s) => s.cancel());
   _subscriptions.clear();
 }

 /**
  * Attaches this control to the map [viewport].
  */
 void attach(MapViewport viewport) {
   _require(viewport != null, "viewport must not be null");
   // already attached ?
   if (_map != null) {
     if (_map == viewport) {
       return;  // don't attach again
     } else {
       detach(); // detach the currently attached, then attach the new one
     }
   }
   this._map = viewport;
   var controlsPane = _map.controlsPane;
   //TODO: log a warning?
   if (controlsPane == null) return;
   build();
   controlsPane.controls.add(this);
   controlsPane.root.children.add(root);
   applyPosition();
 }

 _normalizePropertyValue(v) {
   if (v is int) return v.toString();
   else if (v is String) return v.trim();
   else
     throw new ArgumentError("Expected int or String, got $v");
 }

 /**
  * the default position of the control if no position has been
  * set explicitly using [placeAt].
  *
  * Override in subclasses.
  */
 Point2D get defaultPosition;

 Point2D _position;

 /**
  * Applies the current position to the appropriate DOM element.
  */
 void applyPosition() {
   if (root == null) return;
   var pos = _position == null ? defaultPosition : _position;
   if (pos == null) {
     //TODO: log a warning ?
     return;
   }
   root.style
     ..left = "${pos.x}px"
     ..top = "${pos.y}px";
 }

 /**
  * Places the control at the position ([x], [y]).
  */
 void placeAt(int x, int y) {
   _position = new Point2D(x,y);
   applyPosition();
 }

 /**
  * Abstract method which builds the DOM tree for the control.
  * Override in subclasses.
  */
 void build();

 /**
  * Invoke this to force to (re-)layout the map control in the current
  * map viewport.
  */
 void layout() {}
}

Subclasses

LayerControl, PanControl, ScaleIndicatorControl, SimpleZoomControl, ZoomControl

Constructors

new MapControl([MapViewport viewport]) #

Creates a new map control attached to viewport.

If viewport is missing, the control isn't attached yet. Use attach to attach it.

MapControl([MapViewport viewport]) {
 if (viewport != null) {
   attach(viewport);
 }
}

Properties

final Point2D defaultPosition #

the default position of the control if no position has been set explicitly using placeAt.

Override in subclasses.

Point2D get defaultPosition;

final MapViewport map #

the map this control is attached to, or null

MapViewport get map => _map;

final Element root #

the root DOM element for this map control

Element get root => _root;

Methods

void applyPosition() #

Applies the current position to the appropriate DOM element.

void applyPosition() {
 if (root == null) return;
 var pos = _position == null ? defaultPosition : _position;
 if (pos == null) {
   //TODO: log a warning ?
   return;
 }
 root.style
   ..left = "${pos.x}px"
   ..top = "${pos.y}px";
}

void attach(MapViewport viewport) #

Attaches this control to the map viewport.

void attach(MapViewport viewport) {
 _require(viewport != null, "viewport must not be null");
 // already attached ?
 if (_map != null) {
   if (_map == viewport) {
     return;  // don't attach again
   } else {
     detach(); // detach the currently attached, then attach the new one
   }
 }
 this._map = viewport;
 var controlsPane = _map.controlsPane;
 //TODO: log a warning?
 if (controlsPane == null) return;
 build();
 controlsPane.controls.add(this);
 controlsPane.root.children.add(root);
 applyPosition();
}

abstract void build() #

Abstract method which builds the DOM tree for the control. Override in subclasses.

void detach() #

Detaches this control from the map viewport it is currently attached to (if any).

void detach() {
 if (_map == null) return;
 if (_root == null) return;
 if (_map._controlsPane == null) return;
 _map.controlsPane.root.children.remove(root);
 _subscriptions.forEach((s) => s.cancel());
 _subscriptions.clear();
}

void layout() #

Invoke this to force to (re-)layout the map control in the current map viewport.

void layout() {}

void placeAt(int x, int y) #

Places the control at the position ( x, y).

void placeAt(int x, int y) {
 _position = new Point2D(x,y);
 applyPosition();
}