ZoomControl class
A control element for controling the zoom level.
class ZoomControl extends MapControl{ static const SVG_CONTENT = """<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1"> <!-- for styles see CSS file in the assets directory --> <g class="zoom-control"> <!-- content is created dynamically --> </g> </svg> """; ZoomControl([MapViewport map]) : super(map); _zoomIn(evt) => _map.zoomIn(); _zoomOut(evt) => _map.zoomOut(); _onZoomLevelClick(evt) { try { var zoom = int.parse(evt.target.dataset["zoom"]); print("setting zoom: $zoom"); _map.zoom = zoom; } catch(e) { print(e); } } _onZoomChanged(evt) { var levels = _root.queryAll(".zoom-level"); levels.forEach((l) => l.classes.remove("current")); levels.firstWhere((el) => el.dataset["zoom"] == "${evt.newValue}") .classes.add("current"); } @override void build() { _buildSvg(); _wireEventHandlers(); } _buildSvg() { _root = new Element.tag("div"); var svg = new SvgElement.svg(SVG_CONTENT); svg.attributes["width"] = "40"; svg.attributes["height"] = "250"; var control = svg.query(".zoom-control"); var zoomInNob = new SvgElement.svg(""" <g class="zoom-in-nob"> <rect x="0" y="0" width="20" height="20"> <title>Zoom in</title> </rect> <line x1="10" y1="3" x2="10" y2="17" /> <line x1="3" y1="10" x2="17" y2="10" /> </g> """ ); var zoomOutNob = new SvgElement.svg(""" <g transform="translate(0, 200)" class="zoom-out-nob"> <rect x="0" y="0" width="20" height="20"> <title>Zoom out</title> </rect> <line x1="3" y1="10" x2="17" y2="10"/> </g> """ ); var levels = []; for (int i = 0; i<=20; i++) { var level = new SvgElement.svg(""" <rect x="0" y="${25 + (i * 8)}" width="20" height="6" data-zoom="${20-i}"> <title>Set zoom level ${20-i}</title> </rect> """); level.classes.add("zoom-level"); if (_map.zoom == (20 -i)) level.classes.add("current"); levels.add(level); } control.children.add(zoomInNob); control.children.add(zoomOutNob); levels.forEach((l) => control.children.add(l)); _root.children.add(svg); _root.style ..position = "relative" ..left = "20px" ..top = "100px" ..width ="200px" ..height = "100px"; } _wireEventHandlers() { _root.queryAll(".zoom-level").forEach((el) { _subscriptions.add(el.onMouseOver.listen((evt) { evt.target.classes.add("hover"); })); _subscriptions.add(el.onMouseOut.listen((evt) { evt.target.classes.remove("hover"); })); _subscriptions.add(el.onClick.listen(_onZoomLevelClick)); }); _onMouseOver(evt) { var parent = evt.target.parent; parent.classes.add("hover"); } _onMouseOut(evt) { var parent = evt.target.parent; parent.classes.remove("hover"); } [_root.query(".zoom-in-nob"), _root.query(".zoom-out-nob")] .forEach((el) { _subscriptions.add(el.onMouseOver.listen(_onMouseOver)); _subscriptions.add(el.onMouseOut.listen(_onMouseOut)); }); _subscriptions.add(_root.query(".zoom-in-nob").onClick.listen(_zoomIn)); _subscriptions.add(_root.query(".zoom-out-nob").onClick.listen(_zoomOut)); _subscriptions.add( _map.onPropertyChanged .where((e) => e.name == "zoom") .listen(_onZoomChanged) ); } static var _DEFAULT_POS = new Point2D(60,150); @override get defaultPosition => _DEFAULT_POS; }
Extends
MapControl > ZoomControl
Static Properties
const SVG_CONTENT #
static const SVG_CONTENT = """<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.1"> <!-- for styles see CSS file in the assets directory --> <g class="zoom-control"> <!-- content is created dynamically --> </g> </svg> """
Constructors
new ZoomControl([MapViewport map]) #
ZoomControl([MapViewport map]) : super(map);
Properties
final defaultPosition #
the default position of the control if no position has been
set explicitly using placeAt
.
Override in subclasses.
docs inherited from MapControl
@override get defaultPosition => _DEFAULT_POS;
final MapViewport map #
inherited from MapControl
the map this control is attached to, or null
MapViewport get map => _map;
final Element root #
inherited from MapControl
the root DOM element for this map control
Element get root => _root;
Methods
void applyPosition() #
inherited from MapControl
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) #
inherited from MapControl
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(); }
void build() #
Abstract method which builds the DOM tree for the control. Override in subclasses.
docs inherited from MapControl
@override void build() { _buildSvg(); _wireEventHandlers(); }
void detach() #
inherited from MapControl
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() #
inherited from MapControl
Invoke this to force to (re-)layout the map control in the current map viewport.
void layout() {}
void placeAt(int x, int y) #
inherited from MapControl
Places the control at the position ( x, y).
void placeAt(int x, int y) { _position = new Point2D(x,y); applyPosition(); }