Merge remote-tracking branch 'openlayers/master' into vector-api

This commit is contained in:
Tom Payne
2013-12-13 20:22:06 +01:00
39 changed files with 555 additions and 420 deletions
-191
View File
@@ -29,167 +29,6 @@ class Exportable(object):
return '' return ''
class Class(Exportable):
def __init__(self, name, object_literal, objects):
Exportable.__init__(self, name)
self.object_literal = object_literal
self.objects = objects
self.props = set()
__repr__ = simplerepr
def nested_options(self):
def get_class_by_object_literal_name(name):
for k, o in self.objects.iteritems():
if isinstance(o, Class) and o.object_literal.name == name:
return o
return None
for option in sorted(self.object_literal.prop_types.keys()):
types = self.object_literal.prop_types[option].split('|')
base, object_literal = None, None
for t in types:
if t in self.objects:
o = self.objects[t]
if isinstance(o, (Class, Symbol)):
if base:
raise RuntimeError('Multiple "class" types found for '
'option %s.%s: %s, %s.' %
(self.object_literal.name, option,
base.name, o.name))
base = o
elif isinstance(o, ObjectLiteral):
if object_literal:
raise RuntimeError('Multiple "literal" types found for '
'option %s.%s: %s, %s.' %
(self.object_literal.name, option,
object_literal.name, o.name))
object_literal = o
if object_literal:
if not base:
raise RuntimeError('%s "literal" type found for option %s.%s, '
'but no "class" type.' %
(object_literal.name, self.object_literal.name, option))
klass = get_class_by_object_literal_name(object_literal.name)
if not klass:
raise RuntimeError('No constructor taking a %s found.' %
object_literal.name)
yield option, object_literal, klass, base
def export(self):
lines = []
if self.object_literal is None:
lines.append('\n\ngoog.exportSymbol(\n \'%s\',\n %s);\n' % (self.name, self.name))
else:
lines.append('\n\n\n')
lines.append('/**\n')
lines.append(' * @constructor\n')
lines.append(' * @extends {%s}\n' % (self.name,))
lines.append(' * @param {%s} options Options.\n' % (self.object_literal.extern_name(),))
lines.append(' */\n')
lines.append('%s = function(options) {\n' % (self.export_name(),))
lines.append(' /** @type {%s} */\n' % (self.object_literal.name,))
lines.append(' var arg = /** @type {%s} */ (options);\n' % (self.object_literal.name,));
lines.append(' if (goog.isDefAndNotNull(options)) {\n')
# FIXME: we modify the user's options object
lines.append(''.join(
' if (!(options.%(o)s instanceof %(base)s)) {\n'
' options.%(o)s = new %(ctor)s(\n'
' /** @type {%(extern)s} */ (options.%(o)s));\n'
' }\n' %
{'o': o, 'base': b.name, 'ctor': k.export_name(),
'extern': ol.extern_name()} \
for o, ol, k, b in self.nested_options()))
lines.extend('\n'.join(' arg.%s = options.%s;' % (key, key) for key in sorted(self.object_literal.prop_types.keys())))
lines.append('\n }\n')
lines.append(' goog.base(this, arg);\n')
lines.append('};\n')
lines.append('goog.inherits(\n')
lines.append(' %sExport,\n' % (self.name,));
lines.append(' %s);\n' % (self.name,));
lines.append('goog.exportSymbol(\n')
lines.append(' \'%s\',\n' % (self.name,))
lines.append(' %s);\n' % (self.export_name(),))
lines.extend('goog.exportProperty(\n %s,\n \'%s\',\n %s.%s);\n' % (self.name, prop, self.name, prop) for prop in sorted(self.props))
return ''.join(lines)
def export_name(self):
return '%sExport' % self.name
class Function(Exportable):
def __init__(self, name, object_literal, return_type, objects):
Exportable.__init__(self, name)
self.object_literal = object_literal
self.return_type = return_type
self.objects = objects
__repr__ = simplerepr
def property_object_literal(self, object_literal, prop):
prop_object_literal = None
types = object_literal.prop_types[prop].split('|')
for t in types:
if t in self.objects:
o = self.objects[t]
if isinstance(o, ObjectLiteral):
if prop_object_literal:
raise RuntimeError('Multiple "literal" types found for '
'option %s.%s: %s, %s.' %
(object_literal.name, prop,
prop_object_literal.name, o.name))
prop_object_literal = o
return prop_object_literal
def recursive_export(self, lines, prop, object_literal, local_var=None, depth=1):
indent = ' ' * depth
if not local_var:
local_var = prop.split('.')[-1]
lines.append('%s/** @type {%s} */\n' % (indent, object_literal.name))
lines.append('%svar %s =\n' % (indent, local_var))
lines.append('%s /** @type {%s} */\n' % (indent, object_literal.name))
lines.append('%s (%s);\n' % (indent, prop))
lines.append('%sif (goog.isDefAndNotNull(%s)) {\n' % (indent, prop))
for key in sorted(object_literal.prop_types.keys()):
prop_object_literal = self.property_object_literal(object_literal, key)
if prop_object_literal:
lv = self.recursive_export(lines, '%s.%s' % (prop, key),
prop_object_literal, depth=depth + 1)
lines.append('%s %s.%s =\n%s %s;\n' %
(indent, local_var, key, indent, lv))
else:
lines.append('%s %s.%s =\n%s %s.%s;\n' %
(indent, local_var, key, indent, prop, key))
lines.append('%s}\n' % (indent,))
return local_var
def export(self):
lines = []
local_var = 'arg'
lines.append('\n\n')
lines.append('/**\n')
lines.append(' * @param {%s} options Options.\n' % (self.object_literal.extern_name(),))
if self.return_type:
lines.append(' * @return {%s} Return value.\n' % (self.return_type,))
lines.append(' */\n')
lines.append('%s = function(options) {\n' % (self.export_name(),))
self.recursive_export(lines, 'options', self.object_literal,
local_var=local_var)
if self.return_type:
lines.append(' return %s(%s);\n' % (self.name, local_var))
else:
lines.append(' %s(arg);\n' % (self.name,))
lines.append('};\n')
lines.append('goog.exportSymbol(\n')
lines.append(' \'%s\',\n' % (self.name,))
lines.append(' %s);\n' % (self.export_name(),))
return ''.join(lines)
def export_name(self):
return '%sExport' % self.name
class ObjectLiteral(Exportable): class ObjectLiteral(Exportable):
def __init__(self, name, objects): def __init__(self, name, objects):
@@ -310,18 +149,6 @@ def main(argv):
object_literal.prop_types[prop] = type object_literal.prop_types[prop] = type
continue continue
continue continue
m = re.match(r'@exportClass\s+(?P<name>\S+)(?:\s+(?P<object_literal_name>\S+))?\Z', line)
if m:
name = m.group('name')
if name in objects:
raise RuntimeError(line) # Name already defined
object_literal_name = m.group('object_literal_name')
object_literal = objects[object_literal_name]
if not isinstance(object_literal, ObjectLiteral):
raise RuntimeError(line) # Undefined object literal
klass = Class(name, object_literal, objects)
objects[name] = klass
continue
m = re.match(r'@exportProperty\s+(?P<prop>\S+)\Z', line) m = re.match(r'@exportProperty\s+(?P<prop>\S+)\Z', line)
if m: if m:
components = m.group('prop').split('.') components = m.group('prop').split('.')
@@ -338,23 +165,6 @@ def main(argv):
objects[name] = symbol objects[name] = symbol
symbol.props.add(prop) symbol.props.add(prop)
continue continue
m = re.match(r'@exportFunction\s+(?P<name>\S+)(?:\s+(?P<object_literal_name>\S+))?(?:\s+(?P<return_type>\S+))?\Z', line)
if m:
name = m.group('name')
if name in objects:
raise RuntimeError(line) # Name already defined
object_literal_name = m.group('object_literal_name')
if object_literal_name not in objects:
raise RuntimeError(line)
object_literal = objects[object_literal_name]
if not isinstance(object_literal, ObjectLiteral):
raise RuntimeError(line)
return_type = m.group('return_type')
function = Function(name, object_literal, return_type, objects)
objects[name] = function
# The require should only be for the namespace, not the function
requires.add('.'.join(name.split('.')[0:-1]))
continue
m = re.match(r'@exportSymbol\s+(?P<name>\S+)(?:\s+(?P<export_as>\S+))?\Z', line) m = re.match(r'@exportSymbol\s+(?P<name>\S+)(?:\s+(?P<export_as>\S+))?\Z', line)
if m: if m:
name = m.group('name') name = m.group('name')
@@ -375,7 +185,6 @@ def main(argv):
objects = sorted(objects.values(), key=attrgetter('name')) objects = sorted(objects.values(), key=attrgetter('name'))
if options.exports: if options.exports:
requires.update(obj.name for obj in objects if isinstance(obj, Class))
if requires: if requires:
for require in sorted(requires): for require in sorted(requires):
sys.stdout.write('goog.require(\'%s\');\n' % (require,)) sys.stdout.write('goog.require(\'%s\');\n' % (require,))
+3 -2
View File
@@ -57,9 +57,10 @@ brightness.bindTo('value', layer, 'brightness')
var rotation = new ol.dom.Input(document.getElementById('rotation')); var rotation = new ol.dom.Input(document.getElementById('rotation'));
rotation.bindTo('value', map.getView(), 'rotation') rotation.bindTo('value', /** @type {ol.View2D} */ (map.getView()), 'rotation')
.transform(parseFloat, String); .transform(parseFloat, String);
var resolution = new ol.dom.Input(document.getElementById('resolution')); var resolution = new ol.dom.Input(document.getElementById('resolution'));
resolution.bindTo('value', map.getView(), 'resolution') resolution.bindTo('value',
/** @type {ol.View2D} */ (map.getView()), 'resolution')
.transform(parseFloat, String); .transform(parseFloat, String);
+12 -10
View File
@@ -6,6 +6,10 @@ goog.require('ol.dom.Input');
goog.require('ol.layer.Tile'); goog.require('ol.layer.Tile');
goog.require('ol.source.OSM'); goog.require('ol.source.OSM');
var view = new ol.View2D({
center: [0, 0],
zoom: 2
});
var map = new ol.Map({ var map = new ol.Map({
layers: [ layers: [
new ol.layer.Tile({ new ol.layer.Tile({
@@ -14,22 +18,20 @@ var map = new ol.Map({
], ],
renderers: ol.RendererHints.createFromQueryData(), renderers: ol.RendererHints.createFromQueryData(),
target: 'map', target: 'map',
view: new ol.View2D({ view: view
center: [0, 0],
zoom: 2
})
}); });
var view = map.getView();
var deviceOrientation = new ol.DeviceOrientation(); var deviceOrientation = new ol.DeviceOrientation();
var track = new ol.dom.Input(document.getElementById('track')); var track = new ol.dom.Input(document.getElementById('track'));
track.bindTo('checked', deviceOrientation, 'tracking'); track.bindTo('checked', deviceOrientation, 'tracking');
deviceOrientation.on('change', function(event) { deviceOrientation.on('propertychange', function(event) {
document.getElementById('alpha').innerHTML = event.target.getAlpha(); // event.getKey() is the changed property name
document.getElementById('beta').innerHTML = event.target.getBeta(); var key = event.getKey();
document.getElementById('gamma').innerHTML = event.target.getGamma(); var element = document.getElementById(key);
document.getElementById('heading').innerHTML = event.target.getHeading(); if (element) {
element.innerHTML = deviceOrientation.get(key);
}
}); });
// tilt the map // tilt the map
+2 -2
View File
@@ -24,12 +24,12 @@ var map = new ol.Map({
}); });
var geolocation = new ol.Geolocation(); var geolocation = new ol.Geolocation();
geolocation.bindTo('projection', map.getView()); geolocation.bindTo('projection', /** @type {ol.View2D} */ (map.getView()));
var track = new ol.dom.Input(document.getElementById('track')); var track = new ol.dom.Input(document.getElementById('track'));
track.bindTo('checked', geolocation, 'tracking'); track.bindTo('checked', geolocation, 'tracking');
geolocation.on('change', function() { geolocation.on('propertychange', function() {
$('#accuracy').text(geolocation.getAccuracy() + ' [m]'); $('#accuracy').text(geolocation.getAccuracy() + ' [m]');
$('#altitude').text(geolocation.getAltitude() + ' [m]'); $('#altitude').text(geolocation.getAltitude() + ' [m]');
$('#altitudeAccuracy').text(geolocation.getAltitudeAccuracy() + ' [m]'); $('#altitudeAccuracy').text(geolocation.getAltitudeAccuracy() + ' [m]');
+4 -2
View File
@@ -36,8 +36,10 @@ xhr.onload = function() {
zoom: 1 zoom: 1
}) })
}); });
var units = map.getView().getProjection().getUnits(); var units = map.getView().getView2D().getProjection().getUnits();
var sld = new ol.parser.ogc.SLD().read(xhr.responseText, units); var sld = new ol.parser.ogc.SLD().read(xhr.responseText, {
units: units
});
var style = sld.namedLayers['countries'].userStyles[0]; var style = sld.namedLayers['countries'].userStyles[0];
var vector = new ol.layer.Vector({ var vector = new ol.layer.Vector({
source: new ol.source.Vector({ source: new ol.source.Vector({
+16 -12
View File
@@ -9,15 +9,19 @@ goog.require('goog.dom.TagName');
* @const * @const
* @type {boolean} * @type {boolean}
*/ */
ol.canvas.SUPPORTED = (function() { ol.canvas.SUPPORTED = (
if (!('HTMLCanvasElement' in goog.global)) { /**
return false; * @return {boolean} Canvas supported.
} */
try { function() {
var canvas = /** @type {HTMLCanvasElement} */ if (!('HTMLCanvasElement' in goog.global)) {
(goog.dom.createElement(goog.dom.TagName.CANVAS)); return false;
return !goog.isNull(canvas.getContext('2d')); }
} catch (e) { try {
return false; var canvas = /** @type {HTMLCanvasElement} */
} (goog.dom.createElement(goog.dom.TagName.CANVAS));
})(); return !goog.isNull(canvas.getContext('2d'));
} catch (e) {
return false;
}
})();
+9 -4
View File
@@ -2,10 +2,12 @@
goog.provide('ol.control.Zoom'); goog.provide('ol.control.Zoom');
goog.require('goog.asserts');
goog.require('goog.dom'); goog.require('goog.dom');
goog.require('goog.dom.TagName'); goog.require('goog.dom.TagName');
goog.require('goog.events'); goog.require('goog.events');
goog.require('goog.events.EventType'); goog.require('goog.events.EventType');
goog.require('ol.View2D');
goog.require('ol.animation'); goog.require('ol.animation');
goog.require('ol.control.Control'); goog.require('ol.control.Control');
goog.require('ol.css'); goog.require('ol.css');
@@ -77,8 +79,11 @@ ol.control.Zoom.prototype.zoomByDelta_ = function(delta, browserEvent) {
browserEvent.preventDefault(); browserEvent.preventDefault();
var map = this.getMap(); var map = this.getMap();
// FIXME works for View2D only // FIXME works for View2D only
var view = map.getView().getView2D(); var view = map.getView();
var currentResolution = view.getResolution(); goog.asserts.assert(goog.isDef(view));
var view2D = view.getView2D();
goog.asserts.assertInstanceof(view2D, ol.View2D);
var currentResolution = view2D.getResolution();
if (goog.isDef(currentResolution)) { if (goog.isDef(currentResolution)) {
if (this.duration_ > 0) { if (this.duration_ > 0) {
map.beforeRender(ol.animation.zoom({ map.beforeRender(ol.animation.zoom({
@@ -87,7 +92,7 @@ ol.control.Zoom.prototype.zoomByDelta_ = function(delta, browserEvent) {
easing: ol.easing.easeOut easing: ol.easing.easeOut
})); }));
} }
var newResolution = view.constrainResolution(currentResolution, delta); var newResolution = view2D.constrainResolution(currentResolution, delta);
view.setResolution(newResolution); view2D.setResolution(newResolution);
} }
}; };
+1 -1
View File
@@ -31,7 +31,7 @@ ol.dom.setTransform = function(element, value) {
/** /**
* @param {Element} element Element. * @param {Element} element Element.
* @param {goog.vec.Mat4.AnyType} transform Matrix. * @param {goog.vec.Mat4.Number} transform Matrix.
* @param {number=} opt_precision Precision. * @param {number=} opt_precision Precision.
*/ */
ol.dom.transformElement2D = function(element, transform, opt_precision) { ol.dom.transformElement2D = function(element, transform, opt_precision) {
+6 -4
View File
@@ -84,11 +84,13 @@ ol.interaction.DragPan.prototype.handleDragEnd = function(mapBrowserEvent) {
// FIXME works for View2D only // FIXME works for View2D only
var map = mapBrowserEvent.map; var map = mapBrowserEvent.map;
var view = map.getView().getView2D(); var view = map.getView();
view.setHint(ol.ViewHint.INTERACTING, -1); view.setHint(ol.ViewHint.INTERACTING, -1);
if (this.kinetic_ && this.kinetic_.end()) { if (this.kinetic_ && this.kinetic_.end()) {
var view2DState = view.getView2DState(); var view2D = view.getView2D();
goog.asserts.assertInstanceof(view2D, ol.View2D);
var view2DState = view2D.getView2DState();
var distance = this.kinetic_.getDistance(); var distance = this.kinetic_.getDistance();
var angle = this.kinetic_.getAngle(); var angle = this.kinetic_.getAngle();
this.kineticPreRenderFn_ = this.kinetic_.pan(view2DState.center); this.kineticPreRenderFn_ = this.kinetic_.pan(view2DState.center);
@@ -99,8 +101,8 @@ ol.interaction.DragPan.prototype.handleDragEnd = function(mapBrowserEvent) {
centerpx[0] - distance * Math.cos(angle), centerpx[0] - distance * Math.cos(angle),
centerpx[1] - distance * Math.sin(angle) centerpx[1] - distance * Math.sin(angle)
]); ]);
dest = view.constrainCenter(dest); dest = view2D.constrainCenter(dest);
view.setCenter(dest); view2D.setCenter(dest);
} }
map.requestRenderFrame(); map.requestRenderFrame();
}; };
@@ -105,13 +105,14 @@ ol.interaction.DragRotateAndZoom.prototype.handleDragEnd =
function(mapBrowserEvent) { function(mapBrowserEvent) {
var map = mapBrowserEvent.map; var map = mapBrowserEvent.map;
// FIXME works for View2D only // FIXME works for View2D only
var view = map.getView().getView2D(); var view = map.getView();
view.setHint(ol.ViewHint.INTERACTING, -1); view.setHint(ol.ViewHint.INTERACTING, -1);
var view2DState = view.getView2DState(); var view2D = view.getView2D();
var view2DState = view2D.getView2DState();
var direction = this.lastScaleDelta_ - 1; var direction = this.lastScaleDelta_ - 1;
map.withFrozenRendering(function() { map.withFrozenRendering(function() {
ol.interaction.Interaction.rotate(map, view, view2DState.rotation); ol.interaction.Interaction.rotate(map, view2D, view2DState.rotation);
ol.interaction.Interaction.zoom(map, view, view2DState.resolution, ol.interaction.Interaction.zoom(map, view2D, view2DState.resolution,
undefined, ol.interaction.DRAGROTATEANDZOOM_ANIMATION_DURATION, undefined, ol.interaction.DRAGROTATEANDZOOM_ANIMATION_DURATION,
direction); direction);
}); });
+5 -4
View File
@@ -74,11 +74,12 @@ ol.interaction.DragRotate.prototype.handleDrag = function(mapBrowserEvent) {
ol.interaction.DragRotate.prototype.handleDragEnd = function(mapBrowserEvent) { ol.interaction.DragRotate.prototype.handleDragEnd = function(mapBrowserEvent) {
var map = mapBrowserEvent.map; var map = mapBrowserEvent.map;
// FIXME works for View2D only // FIXME works for View2D only
var view = map.getView().getView2D(); var view = map.getView();
view.setHint(ol.ViewHint.INTERACTING, -1); view.setHint(ol.ViewHint.INTERACTING, -1);
var view2DState = view.getView2DState(); var view2D = view.getView2D();
ol.interaction.Interaction.rotate(map, view, view2DState.rotation, undefined, var view2DState = view2D.getView2DState();
ol.interaction.DRAGROTATE_ANIMATION_DURATION); ol.interaction.Interaction.rotate(map, view2D, view2DState.rotation,
undefined, ol.interaction.DRAGROTATE_ANIMATION_DURATION);
}; };
+16 -6
View File
@@ -2,8 +2,10 @@
goog.provide('ol.interaction.Interaction'); goog.provide('ol.interaction.Interaction');
goog.require('goog.asserts');
goog.require('goog.events.EventTarget'); goog.require('goog.events.EventTarget');
goog.require('ol.MapBrowserEvent'); goog.require('ol.MapBrowserEvent');
goog.require('ol.View2D');
goog.require('ol.animation'); goog.require('ol.animation');
goog.require('ol.easing'); goog.require('ol.easing');
@@ -58,12 +60,13 @@ ol.interaction.Interaction.prototype.setMap = function(map) {
/** /**
* @param {ol.Map} map Map. * @param {ol.Map} map Map.
* @param {ol.View2D} view View. * @param {ol.IView2D} view View.
* @param {ol.Coordinate} delta Delta. * @param {ol.Coordinate} delta Delta.
* @param {number=} opt_duration Duration. * @param {number=} opt_duration Duration.
*/ */
ol.interaction.Interaction.pan = function( ol.interaction.Interaction.pan = function(
map, view, delta, opt_duration) { map, view, delta, opt_duration) {
goog.asserts.assertInstanceof(view, ol.View2D);
var currentCenter = view.getCenter(); var currentCenter = view.getCenter();
if (goog.isDef(currentCenter)) { if (goog.isDef(currentCenter)) {
if (goog.isDef(opt_duration) && opt_duration > 0) { if (goog.isDef(opt_duration) && opt_duration > 0) {
@@ -82,13 +85,14 @@ ol.interaction.Interaction.pan = function(
/** /**
* @param {ol.Map} map Map. * @param {ol.Map} map Map.
* @param {ol.View2D} view View. * @param {ol.IView2D} view View.
* @param {number|undefined} rotation Rotation. * @param {number|undefined} rotation Rotation.
* @param {ol.Coordinate=} opt_anchor Anchor coordinate. * @param {ol.Coordinate=} opt_anchor Anchor coordinate.
* @param {number=} opt_duration Duration. * @param {number=} opt_duration Duration.
*/ */
ol.interaction.Interaction.rotate = ol.interaction.Interaction.rotate =
function(map, view, rotation, opt_anchor, opt_duration) { function(map, view, rotation, opt_anchor, opt_duration) {
goog.asserts.assertInstanceof(view, ol.View2D);
rotation = view.constrainRotation(rotation, 0); rotation = view.constrainRotation(rotation, 0);
ol.interaction.Interaction.rotateWithoutConstraints( ol.interaction.Interaction.rotateWithoutConstraints(
map, view, rotation, opt_anchor, opt_duration); map, view, rotation, opt_anchor, opt_duration);
@@ -97,13 +101,14 @@ ol.interaction.Interaction.rotate =
/** /**
* @param {ol.Map} map Map. * @param {ol.Map} map Map.
* @param {ol.View2D} view View. * @param {ol.IView2D} view View.
* @param {number|undefined} rotation Rotation. * @param {number|undefined} rotation Rotation.
* @param {ol.Coordinate=} opt_anchor Anchor coordinate. * @param {ol.Coordinate=} opt_anchor Anchor coordinate.
* @param {number=} opt_duration Duration. * @param {number=} opt_duration Duration.
*/ */
ol.interaction.Interaction.rotateWithoutConstraints = ol.interaction.Interaction.rotateWithoutConstraints =
function(map, view, rotation, opt_anchor, opt_duration) { function(map, view, rotation, opt_anchor, opt_duration) {
goog.asserts.assertInstanceof(view, ol.View2D);
if (goog.isDefAndNotNull(rotation)) { if (goog.isDefAndNotNull(rotation)) {
var currentRotation = view.getRotation(); var currentRotation = view.getRotation();
var currentCenter = view.getCenter(); var currentCenter = view.getCenter();
@@ -125,6 +130,7 @@ ol.interaction.Interaction.rotateWithoutConstraints =
if (goog.isDefAndNotNull(opt_anchor)) { if (goog.isDefAndNotNull(opt_anchor)) {
var center = view.calculateCenterRotate(rotation, opt_anchor); var center = view.calculateCenterRotate(rotation, opt_anchor);
map.withFrozenRendering(function() { map.withFrozenRendering(function() {
goog.asserts.assertInstanceof(view, ol.View2D);
view.setCenter(center); view.setCenter(center);
view.setRotation(rotation); view.setRotation(rotation);
}); });
@@ -137,7 +143,7 @@ ol.interaction.Interaction.rotateWithoutConstraints =
/** /**
* @param {ol.Map} map Map. * @param {ol.Map} map Map.
* @param {ol.View2D} view View. * @param {ol.IView2D} view View.
* @param {number|undefined} resolution Resolution to go to. * @param {number|undefined} resolution Resolution to go to.
* @param {ol.Coordinate=} opt_anchor Anchor coordinate. * @param {ol.Coordinate=} opt_anchor Anchor coordinate.
* @param {number=} opt_duration Duration. * @param {number=} opt_duration Duration.
@@ -152,6 +158,7 @@ ol.interaction.Interaction.rotateWithoutConstraints =
*/ */
ol.interaction.Interaction.zoom = ol.interaction.Interaction.zoom =
function(map, view, resolution, opt_anchor, opt_duration, opt_direction) { function(map, view, resolution, opt_anchor, opt_duration, opt_direction) {
goog.asserts.assertInstanceof(view, ol.View2D);
resolution = view.constrainResolution(resolution, 0, opt_direction); resolution = view.constrainResolution(resolution, 0, opt_direction);
ol.interaction.Interaction.zoomWithoutConstraints( ol.interaction.Interaction.zoomWithoutConstraints(
map, view, resolution, opt_anchor, opt_duration); map, view, resolution, opt_anchor, opt_duration);
@@ -160,13 +167,14 @@ ol.interaction.Interaction.zoom =
/** /**
* @param {ol.Map} map Map. * @param {ol.Map} map Map.
* @param {ol.View2D} view View. * @param {ol.IView2D} view View.
* @param {number} delta Delta from previous zoom level. * @param {number} delta Delta from previous zoom level.
* @param {ol.Coordinate=} opt_anchor Anchor coordinate. * @param {ol.Coordinate=} opt_anchor Anchor coordinate.
* @param {number=} opt_duration Duration. * @param {number=} opt_duration Duration.
*/ */
ol.interaction.Interaction.zoomByDelta = ol.interaction.Interaction.zoomByDelta =
function(map, view, delta, opt_anchor, opt_duration) { function(map, view, delta, opt_anchor, opt_duration) {
goog.asserts.assertInstanceof(view, ol.View2D);
var currentResolution = view.getResolution(); var currentResolution = view.getResolution();
var resolution = view.constrainResolution(currentResolution, delta, 0); var resolution = view.constrainResolution(currentResolution, delta, 0);
ol.interaction.Interaction.zoomWithoutConstraints( ol.interaction.Interaction.zoomWithoutConstraints(
@@ -176,13 +184,14 @@ ol.interaction.Interaction.zoomByDelta =
/** /**
* @param {ol.Map} map Map. * @param {ol.Map} map Map.
* @param {ol.View2D} view View. * @param {ol.IView2D} view View.
* @param {number|undefined} resolution Resolution to go to. * @param {number|undefined} resolution Resolution to go to.
* @param {ol.Coordinate=} opt_anchor Anchor coordinate. * @param {ol.Coordinate=} opt_anchor Anchor coordinate.
* @param {number=} opt_duration Duration. * @param {number=} opt_duration Duration.
*/ */
ol.interaction.Interaction.zoomWithoutConstraints = ol.interaction.Interaction.zoomWithoutConstraints =
function(map, view, resolution, opt_anchor, opt_duration) { function(map, view, resolution, opt_anchor, opt_duration) {
goog.asserts.assertInstanceof(view, ol.View2D);
if (goog.isDefAndNotNull(resolution)) { if (goog.isDefAndNotNull(resolution)) {
var currentResolution = view.getResolution(); var currentResolution = view.getResolution();
var currentCenter = view.getCenter(); var currentCenter = view.getCenter();
@@ -204,6 +213,7 @@ ol.interaction.Interaction.zoomWithoutConstraints =
if (goog.isDefAndNotNull(opt_anchor)) { if (goog.isDefAndNotNull(opt_anchor)) {
var center = view.calculateCenterZoom(resolution, opt_anchor); var center = view.calculateCenterZoom(resolution, opt_anchor);
map.withFrozenRendering(function() { map.withFrozenRendering(function() {
goog.asserts.assertInstanceof(view, ol.View2D);
view.setCenter(center); view.setCenter(center);
view.setResolution(resolution); view.setResolution(resolution);
}); });
+15 -10
View File
@@ -5,6 +5,7 @@ goog.require('goog.asserts');
goog.require('ol.Kinetic'); goog.require('ol.Kinetic');
goog.require('ol.Pixel'); goog.require('ol.Pixel');
goog.require('ol.PreRenderFunction'); goog.require('ol.PreRenderFunction');
goog.require('ol.View2D');
goog.require('ol.coordinate'); goog.require('ol.coordinate');
goog.require('ol.interaction.Touch'); goog.require('ol.interaction.Touch');
@@ -64,15 +65,16 @@ ol.interaction.TouchPan.prototype.handleTouchMove = function(mapBrowserEvent) {
var deltaX = this.lastCentroid[0] - centroid[0]; var deltaX = this.lastCentroid[0] - centroid[0];
var deltaY = centroid[1] - this.lastCentroid[1]; var deltaY = centroid[1] - this.lastCentroid[1];
var map = mapBrowserEvent.map; var map = mapBrowserEvent.map;
var view = map.getView().getView2D(); var view2D = map.getView().getView2D();
var view2DState = view.getView2DState(); goog.asserts.assertInstanceof(view2D, ol.View2D);
var view2DState = view2D.getView2DState();
var center = [deltaX, deltaY]; var center = [deltaX, deltaY];
ol.coordinate.scale(center, view2DState.resolution); ol.coordinate.scale(center, view2DState.resolution);
ol.coordinate.rotate(center, view2DState.rotation); ol.coordinate.rotate(center, view2DState.rotation);
ol.coordinate.add(center, view2DState.center); ol.coordinate.add(center, view2DState.center);
center = view.constrainCenter(center); center = view2D.constrainCenter(center);
map.requestRenderFrame(); map.requestRenderFrame();
view.setCenter(center); view2D.setCenter(center);
} }
this.lastCentroid = centroid; this.lastCentroid = centroid;
}; };
@@ -84,12 +86,14 @@ ol.interaction.TouchPan.prototype.handleTouchMove = function(mapBrowserEvent) {
ol.interaction.TouchPan.prototype.handleTouchEnd = ol.interaction.TouchPan.prototype.handleTouchEnd =
function(mapBrowserEvent) { function(mapBrowserEvent) {
var map = mapBrowserEvent.map; var map = mapBrowserEvent.map;
var view = map.getView(); var view2D = map.getView().getView2D();
goog.asserts.assertInstanceof(view2D, ol.View2D);
if (this.targetTouches.length === 0) { if (this.targetTouches.length === 0) {
if (!this.noKinetic_ && this.kinetic_ && this.kinetic_.end()) { if (!this.noKinetic_ && this.kinetic_ && this.kinetic_.end()) {
var distance = this.kinetic_.getDistance(); var distance = this.kinetic_.getDistance();
var angle = this.kinetic_.getAngle(); var angle = this.kinetic_.getAngle();
var center = view.getCenter(); var center = view2D.getCenter();
goog.asserts.assert(goog.isDef(center));
this.kineticPreRenderFn_ = this.kinetic_.pan(center); this.kineticPreRenderFn_ = this.kinetic_.pan(center);
map.beforeRender(this.kineticPreRenderFn_); map.beforeRender(this.kineticPreRenderFn_);
var centerpx = map.getPixelFromCoordinate(center); var centerpx = map.getPixelFromCoordinate(center);
@@ -97,8 +101,8 @@ ol.interaction.TouchPan.prototype.handleTouchEnd =
centerpx[0] - distance * Math.cos(angle), centerpx[0] - distance * Math.cos(angle),
centerpx[1] - distance * Math.sin(angle) centerpx[1] - distance * Math.sin(angle)
]); ]);
dest = view.constrainCenter(dest); dest = view2D.constrainCenter(dest);
view.setCenter(dest); view2D.setCenter(dest);
} }
map.requestRenderFrame(); map.requestRenderFrame();
return false; return false;
@@ -116,12 +120,13 @@ ol.interaction.TouchPan.prototype.handleTouchStart =
function(mapBrowserEvent) { function(mapBrowserEvent) {
if (this.targetTouches.length > 0) { if (this.targetTouches.length > 0) {
var map = mapBrowserEvent.map; var map = mapBrowserEvent.map;
var view = map.getView(); var view2D = map.getView().getView2D();
goog.asserts.assertInstanceof(view2D, ol.View2D);
this.lastCentroid = null; this.lastCentroid = null;
map.requestRenderFrame(); map.requestRenderFrame();
if (!goog.isNull(this.kineticPreRenderFn_) && if (!goog.isNull(this.kineticPreRenderFn_) &&
map.removePreRenderFunction(this.kineticPreRenderFn_)) { map.removePreRenderFunction(this.kineticPreRenderFn_)) {
view.setCenter(mapBrowserEvent.frameState.view2DState.center); view2D.setCenter(mapBrowserEvent.frameState.view2DState.center);
this.kineticPreRenderFn_ = null; this.kineticPreRenderFn_ = null;
} }
if (this.kinetic_) { if (this.kinetic_) {
+7
View File
@@ -25,3 +25,10 @@ ol.IView.prototype.getView2D = function() {
*/ */
ol.IView.prototype.getView3D = function() { ol.IView.prototype.getView3D = function() {
}; };
/**
* @return {boolean} Is defined.
*/
ol.IView.prototype.isDef = function() {
};
+7
View File
@@ -59,3 +59,10 @@ ol.IView2D.prototype.getRotation = function() {
*/ */
ol.IView2D.prototype.getView2DState = function() { ol.IView2D.prototype.getView2DState = function() {
}; };
/**
* @return {boolean} Is defined.
*/
ol.IView2D.prototype.isDef = function() {
};
+7
View File
@@ -8,3 +8,10 @@ goog.provide('ol.IView3D');
*/ */
ol.IView3D = function() { ol.IView3D = function() {
}; };
/**
* @return {boolean} Is defined.
*/
ol.IView3D.prototype.isDef = function() {
};
-9
View File
@@ -1,7 +1,6 @@
goog.provide('ol.layer.Image'); goog.provide('ol.layer.Image');
goog.require('ol.layer.Layer'); goog.require('ol.layer.Layer');
goog.require('ol.source.Image');
@@ -15,11 +14,3 @@ ol.layer.Image = function(options) {
goog.base(this, options); goog.base(this, options);
}; };
goog.inherits(ol.layer.Image, ol.layer.Layer); goog.inherits(ol.layer.Image, ol.layer.Layer);
/**
* @return {ol.source.Image} Single image source.
*/
ol.layer.Image.prototype.getImageSource = function() {
return /** @type {ol.source.Image} */ (this.getSource());
};
+29 -24
View File
@@ -84,10 +84,11 @@ ol.layer.Base.prototype.dispatchChangeEvent = function() {
/** /**
* @return {number} Brightness. * @return {number|undefined} Brightness.
*/ */
ol.layer.Base.prototype.getBrightness = function() { ol.layer.Base.prototype.getBrightness = function() {
return /** @type {number} */ (this.get(ol.layer.LayerProperty.BRIGHTNESS)); return /** @type {number|undefined} */ (
this.get(ol.layer.LayerProperty.BRIGHTNESS));
}; };
goog.exportProperty( goog.exportProperty(
ol.layer.Base.prototype, ol.layer.Base.prototype,
@@ -96,10 +97,11 @@ goog.exportProperty(
/** /**
* @return {number} Contrast. * @return {number|undefined} Contrast.
*/ */
ol.layer.Base.prototype.getContrast = function() { ol.layer.Base.prototype.getContrast = function() {
return /** @type {number} */ (this.get(ol.layer.LayerProperty.CONTRAST)); return /** @type {number|undefined} */ (
this.get(ol.layer.LayerProperty.CONTRAST));
}; };
goog.exportProperty( goog.exportProperty(
ol.layer.Base.prototype, ol.layer.Base.prototype,
@@ -108,10 +110,10 @@ goog.exportProperty(
/** /**
* @return {number} Hue. * @return {number|undefined} Hue.
*/ */
ol.layer.Base.prototype.getHue = function() { ol.layer.Base.prototype.getHue = function() {
return /** @type {number} */ (this.get(ol.layer.LayerProperty.HUE)); return /** @type {number|undefined} */ (this.get(ol.layer.LayerProperty.HUE));
}; };
goog.exportProperty( goog.exportProperty(
ol.layer.Base.prototype, ol.layer.Base.prototype,
@@ -168,10 +170,10 @@ ol.layer.Base.prototype.getLayerStatesArray = goog.abstractMethod;
/** /**
* @return {number} MaxResolution. * @return {number|undefined} MaxResolution.
*/ */
ol.layer.Base.prototype.getMaxResolution = function() { ol.layer.Base.prototype.getMaxResolution = function() {
return /** @type {number} */ ( return /** @type {number|undefined} */ (
this.get(ol.layer.LayerProperty.MAX_RESOLUTION)); this.get(ol.layer.LayerProperty.MAX_RESOLUTION));
}; };
goog.exportProperty( goog.exportProperty(
@@ -181,10 +183,10 @@ goog.exportProperty(
/** /**
* @return {number} MinResolution. * @return {number|undefined} MinResolution.
*/ */
ol.layer.Base.prototype.getMinResolution = function() { ol.layer.Base.prototype.getMinResolution = function() {
return /** @type {number} */ ( return /** @type {number|undefined} */ (
this.get(ol.layer.LayerProperty.MIN_RESOLUTION)); this.get(ol.layer.LayerProperty.MIN_RESOLUTION));
}; };
goog.exportProperty( goog.exportProperty(
@@ -194,10 +196,11 @@ goog.exportProperty(
/** /**
* @return {number} Opacity. * @return {number|undefined} Opacity.
*/ */
ol.layer.Base.prototype.getOpacity = function() { ol.layer.Base.prototype.getOpacity = function() {
return /** @type {number} */ (this.get(ol.layer.LayerProperty.OPACITY)); return /** @type {number|undefined} */ (
this.get(ol.layer.LayerProperty.OPACITY));
}; };
goog.exportProperty( goog.exportProperty(
ol.layer.Base.prototype, ol.layer.Base.prototype,
@@ -206,10 +209,11 @@ goog.exportProperty(
/** /**
* @return {number} Saturation. * @return {number|undefined} Saturation.
*/ */
ol.layer.Base.prototype.getSaturation = function() { ol.layer.Base.prototype.getSaturation = function() {
return /** @type {number} */ (this.get(ol.layer.LayerProperty.SATURATION)); return /** @type {number|undefined} */ (
this.get(ol.layer.LayerProperty.SATURATION));
}; };
goog.exportProperty( goog.exportProperty(
ol.layer.Base.prototype, ol.layer.Base.prototype,
@@ -224,10 +228,11 @@ ol.layer.Base.prototype.getSourceState = goog.abstractMethod;
/** /**
* @return {boolean} Visible. * @return {boolean|undefined} Visible.
*/ */
ol.layer.Base.prototype.getVisible = function() { ol.layer.Base.prototype.getVisible = function() {
return /** @type {boolean} */ (this.get(ol.layer.LayerProperty.VISIBLE)); return /** @type {boolean|undefined} */ (
this.get(ol.layer.LayerProperty.VISIBLE));
}; };
goog.exportProperty( goog.exportProperty(
ol.layer.Base.prototype, ol.layer.Base.prototype,
@@ -253,7 +258,7 @@ goog.exportProperty(
* [2] https://github.com/WebKit/webkit/commit/8f4765e569 * [2] https://github.com/WebKit/webkit/commit/8f4765e569
* [3] https://www.w3.org/Bugs/Public/show_bug.cgi?id=15647 * [3] https://www.w3.org/Bugs/Public/show_bug.cgi?id=15647
* *
* @param {number} brightness Brightness. * @param {number|undefined} brightness Brightness.
*/ */
ol.layer.Base.prototype.setBrightness = function(brightness) { ol.layer.Base.prototype.setBrightness = function(brightness) {
this.set(ol.layer.LayerProperty.BRIGHTNESS, brightness); this.set(ol.layer.LayerProperty.BRIGHTNESS, brightness);
@@ -269,7 +274,7 @@ goog.exportProperty(
* grey. A value of 1 will leave the contrast unchanged. Other values are * grey. A value of 1 will leave the contrast unchanged. Other values are
* linear multipliers on the effect (and values over 1 are permitted). * linear multipliers on the effect (and values over 1 are permitted).
* *
* @param {number} contrast Contrast. * @param {number|undefined} contrast Contrast.
*/ */
ol.layer.Base.prototype.setContrast = function(contrast) { ol.layer.Base.prototype.setContrast = function(contrast) {
this.set(ol.layer.LayerProperty.CONTRAST, contrast); this.set(ol.layer.LayerProperty.CONTRAST, contrast);
@@ -283,7 +288,7 @@ goog.exportProperty(
/** /**
* Apply a hue-rotation to the layer. A value of 0 will leave the hue * Apply a hue-rotation to the layer. A value of 0 will leave the hue
* unchanged. Other values are radians around the color circle. * unchanged. Other values are radians around the color circle.
* @param {number} hue Hue. * @param {number|undefined} hue Hue.
*/ */
ol.layer.Base.prototype.setHue = function(hue) { ol.layer.Base.prototype.setHue = function(hue) {
this.set(ol.layer.LayerProperty.HUE, hue); this.set(ol.layer.LayerProperty.HUE, hue);
@@ -295,7 +300,7 @@ goog.exportProperty(
/** /**
* @param {number} maxResolution MaxResolution. * @param {number|undefined} maxResolution MaxResolution.
*/ */
ol.layer.Base.prototype.setMaxResolution = function(maxResolution) { ol.layer.Base.prototype.setMaxResolution = function(maxResolution) {
this.set(ol.layer.LayerProperty.MAX_RESOLUTION, maxResolution); this.set(ol.layer.LayerProperty.MAX_RESOLUTION, maxResolution);
@@ -307,7 +312,7 @@ goog.exportProperty(
/** /**
* @param {number} minResolution MinResolution. * @param {number|undefined} minResolution MinResolution.
*/ */
ol.layer.Base.prototype.setMinResolution = function(minResolution) { ol.layer.Base.prototype.setMinResolution = function(minResolution) {
this.set(ol.layer.LayerProperty.MIN_RESOLUTION, minResolution); this.set(ol.layer.LayerProperty.MIN_RESOLUTION, minResolution);
@@ -319,7 +324,7 @@ goog.exportProperty(
/** /**
* @param {number} opacity Opacity. * @param {number|undefined} opacity Opacity.
*/ */
ol.layer.Base.prototype.setOpacity = function(opacity) { ol.layer.Base.prototype.setOpacity = function(opacity) {
this.set(ol.layer.LayerProperty.OPACITY, opacity); this.set(ol.layer.LayerProperty.OPACITY, opacity);
@@ -336,7 +341,7 @@ goog.exportProperty(
* values are linear multipliers of the effect (and values over 1 are * values are linear multipliers of the effect (and values over 1 are
* permitted). * permitted).
* *
* @param {number} saturation Saturation. * @param {number|undefined} saturation Saturation.
*/ */
ol.layer.Base.prototype.setSaturation = function(saturation) { ol.layer.Base.prototype.setSaturation = function(saturation) {
this.set(ol.layer.LayerProperty.SATURATION, saturation); this.set(ol.layer.LayerProperty.SATURATION, saturation);
@@ -348,7 +353,7 @@ goog.exportProperty(
/** /**
* @param {boolean} visible Visible. * @param {boolean|undefined} visible Visible.
*/ */
ol.layer.Base.prototype.setVisible = function(visible) { ol.layer.Base.prototype.setVisible = function(visible) {
this.set(ol.layer.LayerProperty.VISIBLE, visible); this.set(ol.layer.LayerProperty.VISIBLE, visible);
+8 -6
View File
@@ -10,6 +10,7 @@ goog.require('ol.Collection');
goog.require('ol.CollectionEvent'); goog.require('ol.CollectionEvent');
goog.require('ol.CollectionEventType'); goog.require('ol.CollectionEventType');
goog.require('ol.Object'); goog.require('ol.Object');
goog.require('ol.ObjectEventType');
goog.require('ol.layer.Base'); goog.require('ol.layer.Base');
goog.require('ol.source.State'); goog.require('ol.source.State');
@@ -104,7 +105,8 @@ ol.layer.Group.prototype.handleLayersChanged_ = function(event) {
for (i = 0, ii = layersArray.length; i < ii; i++) { for (i = 0, ii = layersArray.length; i < ii; i++) {
layer = layersArray[i]; layer = layersArray[i];
this.listenerKeys_[goog.getUid(layer).toString()] = this.listenerKeys_[goog.getUid(layer).toString()] =
goog.events.listen(layer, goog.events.EventType.CHANGE, goog.events.listen(layer,
[ol.ObjectEventType.PROPERTYCHANGE, goog.events.EventType.CHANGE],
this.handleLayerChange_, false, this); this.handleLayerChange_, false, this);
} }
} }
@@ -120,8 +122,8 @@ ol.layer.Group.prototype.handleLayersChanged_ = function(event) {
ol.layer.Group.prototype.handleLayersAdd_ = function(collectionEvent) { ol.layer.Group.prototype.handleLayersAdd_ = function(collectionEvent) {
var layer = /** @type {ol.layer.Base} */ (collectionEvent.getElement()); var layer = /** @type {ol.layer.Base} */ (collectionEvent.getElement());
this.listenerKeys_[goog.getUid(layer).toString()] = goog.events.listen( this.listenerKeys_[goog.getUid(layer).toString()] = goog.events.listen(
layer, goog.events.EventType.CHANGE, this.handleLayerChange_, false, layer, [ol.ObjectEventType.PROPERTYCHANGE, goog.events.EventType.CHANGE],
this); this.handleLayerChange_, false, this);
this.dispatchChangeEvent(); this.dispatchChangeEvent();
}; };
@@ -140,11 +142,11 @@ ol.layer.Group.prototype.handleLayersRemove_ = function(collectionEvent) {
/** /**
* @return {ol.Collection} Collection of layers. * @return {ol.Collection|undefined} Collection of layers.
* @todo stability experimental * @todo stability experimental
*/ */
ol.layer.Group.prototype.getLayers = function() { ol.layer.Group.prototype.getLayers = function() {
return /** @type {ol.Collection} */ (this.get( return /** @type {ol.Collection|undefined} */ (this.get(
ol.layer.GroupProperty.LAYERS)); ol.layer.GroupProperty.LAYERS));
}; };
goog.exportProperty( goog.exportProperty(
@@ -154,7 +156,7 @@ goog.exportProperty(
/** /**
* @param {ol.Collection} layers Collection of layers. * @param {ol.Collection|undefined} layers Collection of layers.
* @todo stability experimental * @todo stability experimental
*/ */
ol.layer.Group.prototype.setLayers = function(layers) { ol.layer.Group.prototype.setLayers = function(layers) {
-9
View File
@@ -1,7 +1,6 @@
goog.provide('ol.layer.Tile'); goog.provide('ol.layer.Tile');
goog.require('ol.layer.Layer'); goog.require('ol.layer.Layer');
goog.require('ol.source.Tile');
/** /**
@@ -44,14 +43,6 @@ goog.exportProperty(
ol.layer.Tile.prototype.getPreload); ol.layer.Tile.prototype.getPreload);
/**
* @return {ol.source.Tile} Source.
*/
ol.layer.Tile.prototype.getTileSource = function() {
return /** @type {ol.source.Tile} */ (this.getSource());
};
/** /**
* @param {number} preload Preload. * @param {number} preload Preload.
* @todo stability experimental * @todo stability experimental
+37 -12
View File
@@ -39,6 +39,7 @@ goog.require('ol.MapBrowserEventHandler');
goog.require('ol.MapEvent'); goog.require('ol.MapEvent');
goog.require('ol.MapEventType'); goog.require('ol.MapEventType');
goog.require('ol.Object'); goog.require('ol.Object');
goog.require('ol.ObjectEvent');
goog.require('ol.ObjectEventType'); goog.require('ol.ObjectEventType');
goog.require('ol.Pixel'); goog.require('ol.Pixel');
goog.require('ol.PostRenderFunction'); goog.require('ol.PostRenderFunction');
@@ -208,9 +209,9 @@ ol.Map = function(options) {
/** /**
* @private * @private
* @type {goog.events.Key} * @type {Array.<goog.events.Key>}
*/ */
this.layerGroupPropertyListenerKey_ = null; this.layerGroupPropertyListenerKeys_ = null;
/** /**
* @private * @private
@@ -603,11 +604,16 @@ goog.exportProperty(
/** /**
* Get the collection of layers associated with this map. * Get the collection of layers associated with this map.
* @return {ol.Collection} Layers. * @return {ol.Collection|undefined} Layers.
* @todo stability experimental * @todo stability experimental
*/ */
ol.Map.prototype.getLayers = function() { ol.Map.prototype.getLayers = function() {
return this.getLayerGroup().getLayers(); var layerGroup = this.getLayerGroup();
if (goog.isDef(layerGroup)) {
return layerGroup.getLayers();
} else {
return undefined;
}
}; };
@@ -643,7 +649,7 @@ goog.exportProperty(
/** /**
* Get the view associated with this map. This can be a 2D or 3D view. A 2D * Get the view associated with this map. This can be a 2D or 3D view. A 2D
* view manages properties such as center and resolution. * view manages properties such as center and resolution.
* @return {ol.View} View. * @return {ol.View|undefined} View.
* @todo stability experimental * @todo stability experimental
*/ */
ol.Map.prototype.getView = function() { ol.Map.prototype.getView = function() {
@@ -871,7 +877,7 @@ ol.Map.prototype.handleViewChanged_ = function() {
var view = this.getView(); var view = this.getView();
if (goog.isDefAndNotNull(view)) { if (goog.isDefAndNotNull(view)) {
this.viewPropertyListenerKey_ = goog.events.listen( this.viewPropertyListenerKey_ = goog.events.listen(
view, ol.ObjectEventType.CHANGE, view, ol.ObjectEventType.PROPERTYCHANGE,
this.handleViewPropertyChanged_, false, this); this.handleViewPropertyChanged_, false, this);
} }
this.render(); this.render();
@@ -882,7 +888,18 @@ ol.Map.prototype.handleViewChanged_ = function() {
* @param {goog.events.Event} event Event. * @param {goog.events.Event} event Event.
* @private * @private
*/ */
ol.Map.prototype.handleLayerGroupMemberChanged_ = function(event) {
goog.asserts.assertInstanceof(event, goog.events.Event);
this.render();
};
/**
* @param {ol.ObjectEvent} event Event.
* @private
*/
ol.Map.prototype.handleLayerGroupPropertyChanged_ = function(event) { ol.Map.prototype.handleLayerGroupPropertyChanged_ = function(event) {
goog.asserts.assertInstanceof(event, ol.ObjectEvent);
this.render(); this.render();
}; };
@@ -891,15 +908,23 @@ ol.Map.prototype.handleLayerGroupPropertyChanged_ = function(event) {
* @private * @private
*/ */
ol.Map.prototype.handleLayerGroupChanged_ = function() { ol.Map.prototype.handleLayerGroupChanged_ = function() {
if (!goog.isNull(this.layerGroupPropertyListenerKey_)) { if (!goog.isNull(this.layerGroupPropertyListenerKeys_)) {
goog.events.unlistenByKey(this.layerGroupPropertyListenerKey_); var length = this.layerGroupPropertyListenerKeys_.length;
this.layerGroupPropertyListenerKey_ = null; for (var i = 0; i < length; ++i) {
goog.events.unlistenByKey(this.layerGroupPropertyListenerKeys_[i]);
}
this.layerGroupPropertyListenerKeys_ = null;
} }
var layerGroup = this.getLayerGroup(); var layerGroup = this.getLayerGroup();
if (goog.isDefAndNotNull(layerGroup)) { if (goog.isDefAndNotNull(layerGroup)) {
this.layerGroupPropertyListenerKey_ = goog.events.listen( this.layerGroupPropertyListenerKeys_ = [
layerGroup, ol.ObjectEventType.CHANGE, goog.events.listen(
this.handleLayerGroupPropertyChanged_, false, this); layerGroup, ol.ObjectEventType.PROPERTYCHANGE,
this.handleLayerGroupPropertyChanged_, false, this),
goog.events.listen(
layerGroup, goog.events.EventType.CHANGE,
this.handleLayerGroupMemberChanged_, false, this)
];
} }
this.render(); this.render();
}; };
+3
View File
@@ -7,3 +7,6 @@
@exportProperty ol.Object.prototype.setValues @exportProperty ol.Object.prototype.setValues
@exportProperty ol.Object.prototype.unbind @exportProperty ol.Object.prototype.unbind
@exportProperty ol.Object.prototype.unbindAll @exportProperty ol.Object.prototype.unbindAll
@exportSymbol ol.ObjectEvent
@exportProperty ol.ObjectEvent.prototype.getKey
+87 -2
View File
@@ -6,10 +6,12 @@
*/ */
goog.provide('ol.Object'); goog.provide('ol.Object');
goog.provide('ol.ObjectEvent');
goog.provide('ol.ObjectEventType'); goog.provide('ol.ObjectEventType');
goog.require('goog.array'); goog.require('goog.array');
goog.require('goog.events'); goog.require('goog.events');
goog.require('goog.events.Event');
goog.require('goog.functions'); goog.require('goog.functions');
goog.require('goog.object'); goog.require('goog.object');
goog.require('ol.Observable'); goog.require('ol.Observable');
@@ -19,7 +21,40 @@ goog.require('ol.Observable');
* @enum {string} * @enum {string}
*/ */
ol.ObjectEventType = { ol.ObjectEventType = {
CHANGE: 'change' BEFOREPROPERTYCHANGE: 'beforepropertychange',
PROPERTYCHANGE: 'propertychange'
};
/**
* Object representing a property change event.
*
* @param {string} type The event type.
* @param {string} key The property name.
* @extends {goog.events.Event}
* @constructor
*/
ol.ObjectEvent = function(type, key) {
goog.base(this, type);
/**
* The name of the property whose value is changing.
* @type {string}
* @private
*/
this.key_ = key;
};
goog.inherits(ol.ObjectEvent, goog.events.Event);
/**
* Get the name of the property associated with this event.
* @return {string} Object property name.
*/
ol.ObjectEvent.prototype.getKey = function() {
return this.key_;
}; };
@@ -94,6 +129,13 @@ ol.Object = function(opt_values) {
*/ */
this.values_ = {}; this.values_ = {};
/**
* Lookup of beforechange listener keys.
* @type {Object.<string, goog.events.Key>}
* @private
*/
this.beforeChangeListeners_ = {};
if (goog.isDef(opt_values)) { if (goog.isDef(opt_values)) {
this.setValues(opt_values); this.setValues(opt_values);
} }
@@ -216,11 +258,20 @@ ol.Object.getSetterName = function(key) {
ol.Object.prototype.bindTo = function(key, target, opt_targetKey) { ol.Object.prototype.bindTo = function(key, target, opt_targetKey) {
var targetKey = opt_targetKey || key; var targetKey = opt_targetKey || key;
this.unbind(key); this.unbind(key);
// listen for change:targetkey events
var eventType = ol.Object.getChangeEventType(targetKey); var eventType = ol.Object.getChangeEventType(targetKey);
var listeners = ol.Object.getListeners(this); var listeners = ol.Object.getListeners(this);
listeners[key] = goog.events.listen(target, eventType, function() { listeners[key] = goog.events.listen(target, eventType, function() {
this.notifyInternal_(key); this.notifyInternal_(key);
}, undefined, this); }, undefined, this);
// listen for beforechange events and relay if key matches
this.beforeChangeListeners_[key] = goog.events.listen(target,
ol.ObjectEventType.BEFOREPROPERTYCHANGE,
this.createBeforeChangeListener_(key, targetKey),
undefined, this);
var accessor = new ol.ObjectAccessor(target, targetKey); var accessor = new ol.ObjectAccessor(target, targetKey);
var accessors = ol.Object.getAccessors(this); var accessors = ol.Object.getAccessors(this);
accessors[key] = accessor; accessors[key] = accessor;
@@ -229,6 +280,30 @@ ol.Object.prototype.bindTo = function(key, target, opt_targetKey) {
}; };
/**
* Create a listener for beforechange events on a target object. This listener
* will relay events on this object if the event key matches the provided target
* key.
* @param {string} key The key on this object whose value will be changing.
* @param {string} targetKey The key on the target object.
* @return {function(this: ol.Object, ol.ObjectEvent)} Listener.
* @private
*/
ol.Object.prototype.createBeforeChangeListener_ = function(key, targetKey) {
/**
* Conditionally relay beforechange events if event key matches target key.
* @param {ol.ObjectEvent} event The beforechange event from the target.
* @this {ol.Object}
*/
return function(event) {
if (event.getKey() === targetKey) {
this.dispatchEvent(
new ol.ObjectEvent(ol.ObjectEventType.BEFOREPROPERTYCHANGE, key));
}
};
};
/** /**
* Gets a value. * Gets a value.
* @param {string} key Key name. * @param {string} key Key name.
@@ -331,7 +406,8 @@ ol.Object.prototype.notify = function(key) {
ol.Object.prototype.notifyInternal_ = function(key) { ol.Object.prototype.notifyInternal_ = function(key) {
var eventType = ol.Object.getChangeEventType(key); var eventType = ol.Object.getChangeEventType(key);
this.dispatchEvent(eventType); this.dispatchEvent(eventType);
this.dispatchEvent(ol.ObjectEventType.CHANGE); this.dispatchEvent(
new ol.ObjectEvent(ol.ObjectEventType.PROPERTYCHANGE, key));
}; };
@@ -342,6 +418,8 @@ ol.Object.prototype.notifyInternal_ = function(key) {
* @todo stability experimental * @todo stability experimental
*/ */
ol.Object.prototype.set = function(key, value) { ol.Object.prototype.set = function(key, value) {
this.dispatchEvent(
new ol.ObjectEvent(ol.ObjectEventType.BEFOREPROPERTYCHANGE, key));
var accessors = ol.Object.getAccessors(this); var accessors = ol.Object.getAccessors(this);
if (accessors.hasOwnProperty(key)) { if (accessors.hasOwnProperty(key)) {
var accessor = accessors[key]; var accessor = accessors[key];
@@ -397,6 +475,13 @@ ol.Object.prototype.unbind = function(key) {
delete accessors[key]; delete accessors[key];
this.values_[key] = value; this.values_[key] = value;
} }
// unregister any beforechange listener
var listenerKey = this.beforeChangeListeners_[key];
if (listenerKey) {
goog.events.unlistenByKey(listenerKey);
delete this.beforeChangeListeners_[key];
}
}; };
@@ -1,5 +1,6 @@
goog.provide('ol.renderer.canvas.ImageLayer'); goog.provide('ol.renderer.canvas.ImageLayer');
goog.require('goog.asserts');
goog.require('goog.events'); goog.require('goog.events');
goog.require('goog.events.EventType'); goog.require('goog.events.EventType');
goog.require('goog.vec.Mat4'); goog.require('goog.vec.Mat4');
@@ -9,6 +10,7 @@ goog.require('ol.ViewHint');
goog.require('ol.layer.Image'); goog.require('ol.layer.Image');
goog.require('ol.renderer.Map'); goog.require('ol.renderer.Map');
goog.require('ol.renderer.canvas.Layer'); goog.require('ol.renderer.canvas.Layer');
goog.require('ol.source.Image');
goog.require('ol.vec.Mat4'); goog.require('ol.vec.Mat4');
@@ -48,15 +50,6 @@ ol.renderer.canvas.ImageLayer.prototype.getImage = function() {
}; };
/**
* @protected
* @return {ol.layer.Image} Single image layer.
*/
ol.renderer.canvas.ImageLayer.prototype.getImageLayer = function() {
return /** @type {ol.layer.Image} */ (this.getLayer());
};
/** /**
* @inheritDoc * @inheritDoc
*/ */
@@ -77,8 +70,10 @@ ol.renderer.canvas.ImageLayer.prototype.prepareFrame =
var viewRotation = view2DState.rotation; var viewRotation = view2DState.rotation;
var image; var image;
var imageLayer = this.getImageLayer(); var imageLayer = this.getLayer();
var imageSource = imageLayer.getImageSource(); goog.asserts.assertInstanceof(imageLayer, ol.layer.Image);
var imageSource = imageLayer.getSource();
goog.asserts.assertInstanceof(imageSource, ol.source.Image);
var hints = frameState.viewHints; var hints = frameState.viewHints;
+5 -4
View File
@@ -137,10 +137,11 @@ ol.renderer.canvas.Map.prototype.renderFrame = function(frameState) {
var layerStates = frameState.layerStates; var layerStates = frameState.layerStates;
var layersArray = frameState.layersArray; var layersArray = frameState.layersArray;
var viewResolution = frameState.view2DState.resolution; var viewResolution = frameState.view2DState.resolution;
var canvasLayerRenderer, i, ii, layer, layerState; var i, ii, layer, layerRenderer, layerState;
for (i = 0, ii = layersArray.length; i < ii; ++i) { for (i = 0, ii = layersArray.length; i < ii; ++i) {
layer = layersArray[i]; layer = layersArray[i];
canvasLayerRenderer = this.getCanvasLayerRenderer(layer); layerRenderer = this.getLayerRenderer(layer);
goog.asserts.assertInstanceof(layerRenderer, ol.renderer.canvas.Layer);
layerState = layerStates[goog.getUid(layer)]; layerState = layerStates[goog.getUid(layer)];
if (!layerState.visible || if (!layerState.visible ||
layerState.sourceState != ol.source.State.READY || layerState.sourceState != ol.source.State.READY ||
@@ -148,8 +149,8 @@ ol.renderer.canvas.Map.prototype.renderFrame = function(frameState) {
viewResolution < layerState.minResolution) { viewResolution < layerState.minResolution) {
continue; continue;
} }
canvasLayerRenderer.prepareFrame(frameState, layerState); layerRenderer.prepareFrame(frameState, layerState);
canvasLayerRenderer.composeFrame(frameState, layerState, context); layerRenderer.composeFrame(frameState, layerState, context);
} }
this.dispatchComposeEvent_(ol.render.EventType.POSTCOMPOSE, frameState); this.dispatchComposeEvent_(ol.render.EventType.POSTCOMPOSE, frameState);
@@ -18,6 +18,7 @@ goog.require('ol.extent');
goog.require('ol.layer.Tile'); goog.require('ol.layer.Tile');
goog.require('ol.renderer.Map'); goog.require('ol.renderer.Map');
goog.require('ol.renderer.canvas.Layer'); goog.require('ol.renderer.canvas.Layer');
goog.require('ol.source.Tile');
goog.require('ol.vec.Mat4'); goog.require('ol.vec.Mat4');
@@ -86,15 +87,6 @@ ol.renderer.canvas.TileLayer.prototype.getImage = function() {
}; };
/**
* @protected
* @return {ol.layer.Tile} Tile layer.
*/
ol.renderer.canvas.TileLayer.prototype.getTileLayer = function() {
return /** @type {ol.layer.Tile} */ (this.getLayer());
};
/** /**
* @inheritDoc * @inheritDoc
*/ */
@@ -175,8 +167,10 @@ ol.renderer.canvas.TileLayer.prototype.prepareFrame =
var view2DState = frameState.view2DState; var view2DState = frameState.view2DState;
var projection = view2DState.projection; var projection = view2DState.projection;
var tileLayer = this.getTileLayer(); var tileLayer = this.getLayer();
var tileSource = tileLayer.getTileSource(); goog.asserts.assertInstanceof(tileLayer, ol.layer.Tile);
var tileSource = tileLayer.getSource();
goog.asserts.assertInstanceof(tileSource, ol.source.Tile);
var tileGrid = tileSource.getTileGrid(); var tileGrid = tileSource.getTileGrid();
if (goog.isNull(tileGrid)) { if (goog.isNull(tileGrid)) {
tileGrid = ol.tilegrid.getForProjection(projection); tileGrid = ol.tilegrid.getForProjection(projection);
+8 -13
View File
@@ -1,5 +1,6 @@
goog.provide('ol.renderer.dom.ImageLayer'); goog.provide('ol.renderer.dom.ImageLayer');
goog.require('goog.asserts');
goog.require('goog.dom'); goog.require('goog.dom');
goog.require('goog.dom.TagName'); goog.require('goog.dom.TagName');
goog.require('goog.events'); goog.require('goog.events');
@@ -11,6 +12,7 @@ goog.require('ol.ViewHint');
goog.require('ol.dom'); goog.require('ol.dom');
goog.require('ol.layer.Image'); goog.require('ol.layer.Image');
goog.require('ol.renderer.dom.Layer'); goog.require('ol.renderer.dom.Layer');
goog.require('ol.source.Image');
goog.require('ol.vec.Mat4'); goog.require('ol.vec.Mat4');
@@ -36,7 +38,7 @@ ol.renderer.dom.ImageLayer = function(mapRenderer, imageLayer) {
/** /**
* @private * @private
* @type {goog.vec.Mat4.AnyType} * @type {goog.vec.Mat4.Number}
*/ */
this.transform_ = goog.vec.Mat4.createNumberIdentity(); this.transform_ = goog.vec.Mat4.createNumberIdentity();
@@ -44,15 +46,6 @@ ol.renderer.dom.ImageLayer = function(mapRenderer, imageLayer) {
goog.inherits(ol.renderer.dom.ImageLayer, ol.renderer.dom.Layer); goog.inherits(ol.renderer.dom.ImageLayer, ol.renderer.dom.Layer);
/**
* @protected
* @return {ol.layer.Image} Image layer.
*/
ol.renderer.dom.ImageLayer.prototype.getImageLayer = function() {
return /** @type {ol.layer.Image} */ (this.getLayer());
};
/** /**
* @inheritDoc * @inheritDoc
*/ */
@@ -65,8 +58,10 @@ ol.renderer.dom.ImageLayer.prototype.prepareFrame =
var viewRotation = view2DState.rotation; var viewRotation = view2DState.rotation;
var image = this.image_; var image = this.image_;
var imageLayer = this.getImageLayer(); var imageLayer = this.getLayer();
var imageSource = imageLayer.getImageSource(); goog.asserts.assertInstanceof(imageLayer, ol.layer.Image);
var imageSource = imageLayer.getSource();
goog.asserts.assertInstanceof(imageSource, ol.source.Image);
var hints = frameState.viewHints; var hints = frameState.viewHints;
@@ -115,7 +110,7 @@ ol.renderer.dom.ImageLayer.prototype.prepareFrame =
/** /**
* @param {goog.vec.Mat4.AnyType} transform Transform. * @param {goog.vec.Mat4.Number} transform Transform.
* @private * @private
*/ */
ol.renderer.dom.ImageLayer.prototype.setTransform_ = function(transform) { ol.renderer.dom.ImageLayer.prototype.setTransform_ = function(transform) {
+3 -2
View File
@@ -9,6 +9,7 @@ goog.require('ol.layer.Image');
goog.require('ol.layer.Tile'); goog.require('ol.layer.Tile');
goog.require('ol.renderer.Map'); goog.require('ol.renderer.Map');
goog.require('ol.renderer.dom.ImageLayer'); goog.require('ol.renderer.dom.ImageLayer');
goog.require('ol.renderer.dom.Layer');
goog.require('ol.renderer.dom.TileLayer'); goog.require('ol.renderer.dom.TileLayer');
goog.require('ol.source.State'); goog.require('ol.source.State');
@@ -93,8 +94,8 @@ ol.renderer.dom.Map.prototype.renderFrame = function(frameState) {
var layerKey; var layerKey;
for (layerKey in this.getLayerRenderers()) { for (layerKey in this.getLayerRenderers()) {
if (!(layerKey in layerStates)) { if (!(layerKey in layerStates)) {
layerRenderer = /** @type {ol.renderer.dom.Layer} */ layerRenderer = this.getLayerRendererByKey(layerKey);
(this.getLayerRendererByKey(layerKey)); goog.asserts.assertInstanceof(layerRenderer, ol.renderer.dom.Layer);
goog.dom.removeNode(layerRenderer.getTarget()); goog.dom.removeNode(layerRenderer.getTarget());
} }
} }
+7 -13
View File
@@ -20,6 +20,7 @@ goog.require('ol.dom');
goog.require('ol.extent'); goog.require('ol.extent');
goog.require('ol.layer.Tile'); goog.require('ol.layer.Tile');
goog.require('ol.renderer.dom.Layer'); goog.require('ol.renderer.dom.Layer');
goog.require('ol.source.Tile');
goog.require('ol.tilegrid.TileGrid'); goog.require('ol.tilegrid.TileGrid');
goog.require('ol.vec.Mat4'); goog.require('ol.vec.Mat4');
@@ -66,15 +67,6 @@ ol.renderer.dom.TileLayer = function(mapRenderer, tileLayer) {
goog.inherits(ol.renderer.dom.TileLayer, ol.renderer.dom.Layer); goog.inherits(ol.renderer.dom.TileLayer, ol.renderer.dom.Layer);
/**
* @protected
* @return {ol.layer.Tile} Tile layer.
*/
ol.renderer.dom.TileLayer.prototype.getTileLayer = function() {
return /** @type {ol.layer.Tile} */ (this.getLayer());
};
/** /**
* @inheritDoc * @inheritDoc
*/ */
@@ -92,8 +84,10 @@ ol.renderer.dom.TileLayer.prototype.prepareFrame =
var view2DState = frameState.view2DState; var view2DState = frameState.view2DState;
var projection = view2DState.projection; var projection = view2DState.projection;
var tileLayer = this.getTileLayer(); var tileLayer = this.getLayer();
var tileSource = tileLayer.getTileSource(); goog.asserts.assertInstanceof(tileLayer, ol.layer.Tile);
var tileSource = tileLayer.getSource();
goog.asserts.assertInstanceof(tileSource, ol.source.Tile);
var tileGrid = tileSource.getTileGrid(); var tileGrid = tileSource.getTileGrid();
if (goog.isNull(tileGrid)) { if (goog.isNull(tileGrid)) {
tileGrid = ol.tilegrid.getForProjection(projection); tileGrid = ol.tilegrid.getForProjection(projection);
@@ -309,7 +303,7 @@ ol.renderer.dom.TileLayerZ_ = function(tileGrid, tileCoordOrigin) {
/** /**
* @private * @private
* @type {goog.vec.Mat4.AnyType} * @type {goog.vec.Mat4.Number}
*/ */
this.transform_ = goog.vec.Mat4.createNumberIdentity(); this.transform_ = goog.vec.Mat4.createNumberIdentity();
@@ -418,7 +412,7 @@ ol.renderer.dom.TileLayerZ_.prototype.removeTilesOutsideExtent =
/** /**
* @param {goog.vec.Mat4.AnyType} transform Transform. * @param {goog.vec.Mat4.Number} transform Transform.
*/ */
ol.renderer.dom.TileLayerZ_.prototype.setTransform = function(transform) { ol.renderer.dom.TileLayerZ_.prototype.setTransform = function(transform) {
if (!ol.vec.Mat4.equals2D(transform, this.transform_)) { if (!ol.vec.Mat4.equals2D(transform, this.transform_)) {
+2
View File
@@ -20,6 +20,8 @@ goog.require('ol.source.Tile');
* @extends {goog.Disposable} * @extends {goog.Disposable}
* @param {ol.renderer.Map} mapRenderer Map renderer. * @param {ol.renderer.Map} mapRenderer Map renderer.
* @param {ol.layer.Layer} layer Layer. * @param {ol.layer.Layer} layer Layer.
* @suppress {checkStructDictInheritance}
* @struct
*/ */
ol.renderer.Layer = function(mapRenderer, layer) { ol.renderer.Layer = function(mapRenderer, layer) {
+2
View File
@@ -17,6 +17,8 @@ goog.require('ol.vec.Mat4');
* @extends {goog.Disposable} * @extends {goog.Disposable}
* @param {Element} container Container. * @param {Element} container Container.
* @param {ol.Map} map Map. * @param {ol.Map} map Map.
* @suppress {checkStructDictInheritance}
* @struct
*/ */
ol.renderer.Map = function(container, map) { ol.renderer.Map = function(container, map) {
@@ -12,6 +12,7 @@ goog.require('ol.ImageState');
goog.require('ol.ViewHint'); goog.require('ol.ViewHint');
goog.require('ol.layer.Image'); goog.require('ol.layer.Image');
goog.require('ol.renderer.webgl.Layer'); goog.require('ol.renderer.webgl.Layer');
goog.require('ol.source.Image');
@@ -71,15 +72,6 @@ ol.renderer.webgl.ImageLayer.prototype.createTexture_ = function(image) {
}; };
/**
* @protected
* @return {ol.layer.Image} Tile layer.
*/
ol.renderer.webgl.ImageLayer.prototype.getImageLayer = function() {
return /** @type {ol.layer.Image} */ (this.getLayer());
};
/** /**
* @inheritDoc * @inheritDoc
*/ */
@@ -95,8 +87,10 @@ ol.renderer.webgl.ImageLayer.prototype.prepareFrame =
var image = this.image_; var image = this.image_;
var texture = this.texture; var texture = this.texture;
var imageLayer = this.getImageLayer(); var imageLayer = this.getLayer();
var imageSource = imageLayer.getImageSource(); goog.asserts.assertInstanceof(imageLayer, ol.layer.Image);
var imageSource = imageLayer.getSource();
goog.asserts.assertInstanceof(imageSource, ol.source.Image);
var hints = frameState.viewHints; var hints = frameState.viewHints;
+4 -13
View File
@@ -363,17 +363,6 @@ ol.renderer.webgl.Map.prototype.getTileTextureQueue = function() {
}; };
/**
* @param {ol.layer.Layer} layer Layer.
* @return {ol.renderer.webgl.Layer} WebGL layer renderer.
*/
ol.renderer.webgl.Map.prototype.getWebGLLayerRenderer = function(layer) {
var layerRenderer = this.getLayerRenderer(layer);
goog.asserts.assertInstanceof(layerRenderer, ol.renderer.webgl.Layer);
return /** @type {ol.renderer.webgl.Layer} */ (layerRenderer);
};
/** /**
* @param {goog.events.Event} event Event. * @param {goog.events.Event} event Event.
* @protected * @protected
@@ -482,7 +471,8 @@ ol.renderer.webgl.Map.prototype.renderFrame = function(frameState) {
for (i = 0, ii = layersToDraw.length; i < ii; ++i) { for (i = 0, ii = layersToDraw.length; i < ii; ++i) {
layer = layersToDraw[i]; layer = layersToDraw[i];
layerRenderer = this.getWebGLLayerRenderer(layer); layerRenderer = this.getLayerRenderer(layer);
goog.asserts.assertInstanceof(layerRenderer, ol.renderer.webgl.Layer);
layerState = frameState.layerStates[goog.getUid(layer)]; layerState = frameState.layerStates[goog.getUid(layer)];
layerRenderer.prepareFrame(frameState, layerState); layerRenderer.prepareFrame(frameState, layerState);
} }
@@ -505,7 +495,8 @@ ol.renderer.webgl.Map.prototype.renderFrame = function(frameState) {
for (i = 0, ii = layersToDraw.length; i < ii; ++i) { for (i = 0, ii = layersToDraw.length; i < ii; ++i) {
layer = layersToDraw[i]; layer = layersToDraw[i];
layerState = frameState.layerStates[goog.getUid(layer)]; layerState = frameState.layerStates[goog.getUid(layer)];
layerRenderer = this.getWebGLLayerRenderer(layer); layerRenderer = this.getLayerRenderer(layer);
goog.asserts.assertInstanceof(layerRenderer, ol.renderer.webgl.Layer);
layerRenderer.composeFrame(frameState, layerState, context); layerRenderer.composeFrame(frameState, layerState, context);
} }
@@ -4,6 +4,7 @@
goog.provide('ol.renderer.webgl.TileLayer'); goog.provide('ol.renderer.webgl.TileLayer');
goog.require('goog.array'); goog.require('goog.array');
goog.require('goog.asserts');
goog.require('goog.object'); goog.require('goog.object');
goog.require('goog.vec.Vec4'); goog.require('goog.vec.Vec4');
goog.require('goog.webgl'); goog.require('goog.webgl');
@@ -15,6 +16,7 @@ goog.require('ol.layer.Tile');
goog.require('ol.math'); goog.require('ol.math');
goog.require('ol.renderer.webgl.Layer'); goog.require('ol.renderer.webgl.Layer');
goog.require('ol.renderer.webgl.tilelayer.shader'); goog.require('ol.renderer.webgl.tilelayer.shader');
goog.require('ol.source.Tile');
goog.require('ol.structs.Buffer'); goog.require('ol.structs.Buffer');
goog.require('ol.vec.Mat4'); goog.require('ol.vec.Mat4');
@@ -93,15 +95,6 @@ ol.renderer.webgl.TileLayer.prototype.disposeInternal = function() {
}; };
/**
* @protected
* @return {ol.layer.Tile} Tile layer.
*/
ol.renderer.webgl.TileLayer.prototype.getTileLayer = function() {
return /** @type {ol.layer.Tile} */ (this.getLayer());
};
/** /**
* @inheritDoc * @inheritDoc
*/ */
@@ -124,8 +117,10 @@ ol.renderer.webgl.TileLayer.prototype.prepareFrame =
var view2DState = frameState.view2DState; var view2DState = frameState.view2DState;
var projection = view2DState.projection; var projection = view2DState.projection;
var tileLayer = this.getTileLayer(); var tileLayer = this.getLayer();
var tileSource = tileLayer.getTileSource(); goog.asserts.assertInstanceof(tileLayer, ol.layer.Tile);
var tileSource = tileLayer.getSource();
goog.asserts.assertInstanceof(tileSource, ol.source.Tile);
var tileGrid = tileSource.getTileGrid(); var tileGrid = tileSource.getTileGrid();
if (goog.isNull(tileGrid)) { if (goog.isNull(tileGrid)) {
tileGrid = ol.tilegrid.getForProjection(projection); tileGrid = ol.tilegrid.getForProjection(projection);
+1 -1
View File
@@ -61,7 +61,7 @@ ol.vec.Mat4.equals2D = function(mat1, mat2) {
* transformed vector into resultVec. The input vector is multiplied against the * transformed vector into resultVec. The input vector is multiplied against the
* upper 2x4 matrix omitting the projective component. * upper 2x4 matrix omitting the projective component.
* *
* @param {goog.vec.Mat4.AnyType} mat The matrix supplying the transformation. * @param {goog.vec.Mat4.Number} mat The matrix supplying the transformation.
* @param {Array.<number>} vec The 3 element vector to transform. * @param {Array.<number>} vec The 3 element vector to transform.
* @param {Array.<number>} resultVec The 3 element vector to receive the results * @param {Array.<number>} resultVec The 3 element vector to receive the results
* (may be vec). * (may be vec).
+20 -2
View File
@@ -47,13 +47,31 @@ ol.View.prototype.getHints = function() {
/** /**
* @inheritDoc * @inheritDoc
*/ */
ol.View.prototype.getView2D = goog.abstractMethod; ol.View.prototype.getView2D = function() {
// FIXME for some reason, we can't use goog.abstractMethod here
goog.asserts.fail();
return null;
};
/** /**
* @inheritDoc * @inheritDoc
*/ */
ol.View.prototype.getView3D = goog.abstractMethod; ol.View.prototype.getView3D = function() {
// FIXME for some reason, we can't use goog.abstractMethod here
goog.asserts.fail();
return null;
};
/**
* @inheritDoc
*/
ol.View.prototype.isDef = function() {
// FIXME for some reason, we can't use goog.abstractMethod here
goog.asserts.fail();
return false;
};
/** /**
+6 -6
View File
@@ -212,7 +212,7 @@ describe('ol.layer.Layer', function() {
it('triggers a change event', function() { it('triggers a change event', function() {
var listener = sinon.spy(); var listener = sinon.spy();
layer.on(ol.ObjectEventType.CHANGE, listener); layer.on(ol.ObjectEventType.PROPERTYCHANGE, listener);
layer.setBrightness(0.5); layer.setBrightness(0.5);
expect(listener.calledOnce).to.be(true); expect(listener.calledOnce).to.be(true);
}); });
@@ -247,7 +247,7 @@ describe('ol.layer.Layer', function() {
it('triggers a change event', function() { it('triggers a change event', function() {
var listener = sinon.spy(); var listener = sinon.spy();
layer.on(ol.ObjectEventType.CHANGE, listener); layer.on(ol.ObjectEventType.PROPERTYCHANGE, listener);
layer.setContrast(43); layer.setContrast(43);
expect(listener.calledOnce).to.be(true); expect(listener.calledOnce).to.be(true);
}); });
@@ -293,7 +293,7 @@ describe('ol.layer.Layer', function() {
it('triggers a change event', function() { it('triggers a change event', function() {
var listener = sinon.spy(); var listener = sinon.spy();
layer.on(ol.ObjectEventType.CHANGE, listener); layer.on(ol.ObjectEventType.PROPERTYCHANGE, listener);
layer.setHue(0.5); layer.setHue(0.5);
expect(listener.calledOnce).to.be(true); expect(listener.calledOnce).to.be(true);
}); });
@@ -324,7 +324,7 @@ describe('ol.layer.Layer', function() {
it('triggers a change event', function() { it('triggers a change event', function() {
var listener = sinon.spy(); var listener = sinon.spy();
layer.on(ol.ObjectEventType.CHANGE, listener); layer.on(ol.ObjectEventType.PROPERTYCHANGE, listener);
layer.setOpacity(0.4); layer.setOpacity(0.4);
expect(listener.calledOnce).to.be(true); expect(listener.calledOnce).to.be(true);
}); });
@@ -360,7 +360,7 @@ describe('ol.layer.Layer', function() {
it('triggers a change event', function() { it('triggers a change event', function() {
var listener = sinon.spy(); var listener = sinon.spy();
layer.on(ol.ObjectEventType.CHANGE, listener); layer.on(ol.ObjectEventType.PROPERTYCHANGE, listener);
layer.setSaturation(42); layer.setSaturation(42);
expect(listener.calledOnce).to.be(true); expect(listener.calledOnce).to.be(true);
}); });
@@ -393,7 +393,7 @@ describe('ol.layer.Layer', function() {
it('fires a change event', function() { it('fires a change event', function() {
var listener = sinon.spy(); var listener = sinon.spy();
layer.on(ol.ObjectEventType.CHANGE, listener); layer.on(ol.ObjectEventType.PROPERTYCHANGE, listener);
layer.setVisible(false); layer.setVisible(false);
expect(listener.callCount).to.be(1); expect(listener.callCount).to.be(1);
+43 -3
View File
@@ -63,7 +63,7 @@ describe('ol.layer.Group', function() {
}); });
describe('change event', function() { describe('generic change event', function() {
var layer, group, listener; var layer, group, listener;
beforeEach(function() { beforeEach(function() {
@@ -84,14 +84,14 @@ describe('ol.layer.Group', function() {
}); });
it('is dispatched by the group when layer opacity changes', function() { it('is dispatched by the group when layer opacity changes', function() {
group.on(ol.ObjectEventType.CHANGE, listener); group.on(goog.events.EventType.CHANGE, listener);
layer.setOpacity(0.5); layer.setOpacity(0.5);
expect(listener.calledOnce).to.be(true); expect(listener.calledOnce).to.be(true);
}); });
it('is dispatched by the group when layer visibility changes', function() { it('is dispatched by the group when layer visibility changes', function() {
group.on(ol.ObjectEventType.CHANGE, listener); group.on(goog.events.EventType.CHANGE, listener);
layer.setVisible(false); layer.setVisible(false);
expect(listener.callCount).to.be(1); expect(listener.callCount).to.be(1);
@@ -102,6 +102,45 @@ describe('ol.layer.Group', function() {
}); });
describe('property change event', function() {
var layer, group, listener;
beforeEach(function() {
layer = new ol.layer.Layer({
source: new ol.source.Source({
projection: 'EPSG:4326'
})
});
group = new ol.layer.Group({
layers: [layer]
});
listener = sinon.spy();
});
afterEach(function() {
goog.dispose(group);
goog.dispose(layer);
});
it('is dispatched by the group when group opacity changes', function() {
group.on(ol.ObjectEventType.PROPERTYCHANGE, listener);
group.setOpacity(0.5);
expect(listener.calledOnce).to.be(true);
});
it('is dispatched by the group when group visibility changes', function() {
group.on(ol.ObjectEventType.PROPERTYCHANGE, listener);
group.setVisible(false);
expect(listener.callCount).to.be(1);
group.setVisible(true);
expect(listener.callCount).to.be(2);
});
});
describe('constructor (options)', function() { describe('constructor (options)', function() {
it('accepts options', function() { it('accepts options', function() {
@@ -352,6 +391,7 @@ describe('ol.layer.Group', function() {
}); });
goog.require('goog.dispose'); goog.require('goog.dispose');
goog.require('goog.events.EventType');
goog.require('ol.ObjectEventType'); goog.require('ol.ObjectEventType');
goog.require('ol.layer.Layer'); goog.require('ol.layer.Layer');
goog.require('ol.layer.Group'); goog.require('ol.layer.Group');
+153 -5
View File
@@ -106,7 +106,7 @@ describe('ol.Object', function() {
goog.events.listen(o, 'change:k', listener1); goog.events.listen(o, 'change:k', listener1);
listener2 = sinon.spy(); listener2 = sinon.spy();
goog.events.listen(o, 'change', listener2); goog.events.listen(o, ol.ObjectEventType.PROPERTYCHANGE, listener2);
var o2 = new ol.Object(); var o2 = new ol.Object();
o2.bindTo('k', o); o2.bindTo('k', o);
@@ -121,7 +121,11 @@ describe('ol.Object', function() {
it('dispatches generic change events to bound objects', function() { it('dispatches generic change events to bound objects', function() {
o.notify('k'); o.notify('k');
expect(listener2).to.be.called(); expect(listener2.calledOnce).to.be(true);
var args = listener2.firstCall.args;
expect(args).to.have.length(1);
var event = args[0];
expect(event.getKey()).to.be('k');
}); });
it('dispatches events to bound objects', function() { it('dispatches events to bound objects', function() {
@@ -139,7 +143,7 @@ describe('ol.Object', function() {
goog.events.listen(o, 'change:k', listener1); goog.events.listen(o, 'change:k', listener1);
listener2 = sinon.spy(); listener2 = sinon.spy();
goog.events.listen(o, 'change', listener2); goog.events.listen(o, ol.ObjectEventType.PROPERTYCHANGE, listener2);
o2 = new ol.Object(); o2 = new ol.Object();
o2.bindTo('k', o); o2.bindTo('k', o);
@@ -157,7 +161,25 @@ describe('ol.Object', function() {
it('dispatches generic change events to object', function() { it('dispatches generic change events to object', function() {
o.set('k', 1); o.set('k', 1);
expect(listener2).to.be.called(); expect(listener2.calledOnce).to.be(true);
var args = listener2.firstCall.args;
expect(args).to.have.length(1);
var event = args[0];
expect(event.getKey()).to.be('k');
});
it('dispatches beforechange events to object', function() {
o.set('k', 1);
var oldValue;
var beforeListener = sinon.spy(function(event) {
oldValue = o2.get(event.getKey());
});
o.on(ol.ObjectEventType.BEFOREPROPERTYCHANGE, beforeListener);
o.set('k', 2);
expect(beforeListener.calledOnce).to.be(true);
expect(oldValue).to.be(1);
}); });
it('dispatches events to bound object', function() { it('dispatches events to bound object', function() {
@@ -175,8 +197,80 @@ describe('ol.Object', function() {
it('dispatches generic change events to object bound to', function() { it('dispatches generic change events to object bound to', function() {
o2.set('k', 2); o2.set('k', 2);
expect(listener2).to.be.called(); expect(listener2.calledOnce).to.be(true);
var args = listener2.firstCall.args;
expect(args).to.have.length(1);
var event = args[0];
expect(event.getKey()).to.be('k');
}); });
it('dispatches beforechange before changing bound objects', function() {
o2.set('k', 1);
var oldValue;
var beforeListener = sinon.spy(function(event) {
oldValue = o2.get(event.getKey());
});
o.on(ol.ObjectEventType.BEFOREPROPERTYCHANGE, beforeListener);
o2.set('k', 2);
expect(beforeListener.calledOnce).to.be(true);
var args = beforeListener.firstCall.args;
expect(args).to.have.length(1);
var event = args[0];
expect(event.getKey()).to.be('k');
expect(oldValue).to.be(1);
});
it('relays beforechange events from bound objects', function() {
var target = new ol.Object({
foo: 'original value'
});
var object = new ol.Object();
object.bindTo('foo', target);
var oldValue;
var beforeListener = sinon.spy(function(event) {
oldValue = object.get(event.getKey());
});
object.on(ol.ObjectEventType.BEFOREPROPERTYCHANGE, beforeListener);
target.set('foo', 'new value');
expect(beforeListener.calledOnce).to.be(true);
var args = beforeListener.firstCall.args;
expect(args).to.have.length(1);
var event = args[0];
expect(event.getKey()).to.be('foo');
expect(oldValue).to.be('original value');
expect(object.get('foo')).to.be('new value');
});
it('relays beforechange events when bound with a new key', function() {
var target = new ol.Object({
foo: 'original value'
});
var object = new ol.Object();
object.bindTo('bar', target, 'foo');
var oldValue;
var beforeListener = sinon.spy(function(event) {
oldValue = object.get(event.getKey());
});
object.on(ol.ObjectEventType.BEFOREPROPERTYCHANGE, beforeListener);
target.set('foo', 'new value');
expect(beforeListener.calledOnce).to.be(true);
var args = beforeListener.firstCall.args;
expect(args).to.have.length(1);
var event = args[0];
expect(event.getKey()).to.be('bar');
expect(oldValue).to.be('original value');
expect(object.get('bar')).to.be('new value');
});
}); });
describe('bind', function() { describe('bind', function() {
@@ -256,6 +350,59 @@ describe('ol.Object', function() {
expect(o.get('k')).to.eql(1); expect(o.get('k')).to.eql(1);
expect(o2.get('k')).to.eql(2); expect(o2.get('k')).to.eql(2);
}); });
it('stops relaying beforechange events', function() {
var target = new ol.Object({
foo: 'original value'
});
var object = new ol.Object();
object.bindTo('foo', target);
var listener = sinon.spy();
object.on(ol.ObjectEventType.BEFOREPROPERTYCHANGE, listener);
target.set('foo', 'new value');
expect(listener.calledOnce).to.be(true);
var call = listener.firstCall;
expect(call.args).to.have.length(1);
expect(call.args[0].getKey()).to.be('foo');
object.unbind('foo');
target.set('foo', 'another new value');
expect(listener.calledOnce).to.be(true);
expect(object.get('foo')).to.be('new value');
});
it('selectively stops relaying beforechange events', function() {
var target = new ol.Object({
foo: 'original foo',
bar: 'original bar'
});
var object = new ol.Object();
object.bindTo('foo', target);
object.bindTo('bar', target);
var listener = sinon.spy();
object.on(ol.ObjectEventType.BEFOREPROPERTYCHANGE, listener);
target.set('foo', 'new foo');
expect(listener.calledOnce).to.be(true);
target.set('bar', 'new bar');
expect(listener.callCount).to.be(2);
object.unbind('foo');
target.set('foo', 'another new foo');
expect(listener.callCount).to.be(2);
target.set('bar', 'another new bar');
expect(listener.callCount).to.be(3);
var lastCall = listener.getCall(2);
expect(lastCall.args).to.have.length(1);
expect(lastCall.args[0].getKey()).to.be('bar');
});
}); });
describe('unbindAll', function() { describe('unbindAll', function() {
@@ -567,3 +714,4 @@ describe('ol.Object', function() {
goog.require('goog.events'); goog.require('goog.events');
goog.require('ol.Object'); goog.require('ol.Object');
goog.require('ol.ObjectEventType');