139 lines
4.9 KiB
JavaScript
139 lines
4.9 KiB
JavaScript
|
var _ = require('underscore');
|
||
|
var layerTypesAndKinds = require('builder/data/layer-types-and-kinds');
|
||
|
var BaseTiledLayerView = require('./layer-views/base-tiled-layer-view');
|
||
|
var PlainColorLayerView = require('./layer-views/plain-color-layer-view');
|
||
|
var BackgroundImageLayerView = require('./layer-views/background-image-layer-view');
|
||
|
var GoogleMapsBaseLayerView = require('./layer-views/google-maps-base-layer-view');
|
||
|
var DataLayerView = require('./layer-views/data-layer-view');
|
||
|
var ErroredDataLayerView = require('./layer-views/errored-data-layer-view');
|
||
|
var LabelsLayerView = require('./layer-views/labels-layer-view');
|
||
|
var LayerAnalysesView = require('./layer-analyses-view');
|
||
|
var LayerAnalysisViewFactory = require('./layer-analysis-view-factory');
|
||
|
var checkAndBuildOpts = require('builder/helpers/required-opts');
|
||
|
|
||
|
var REQUIRED_OPTS = [
|
||
|
'userActions',
|
||
|
'layerDefinitionsCollection',
|
||
|
'analysisDefinitionNodesCollection',
|
||
|
'modals',
|
||
|
'configModel',
|
||
|
'sortableSelector',
|
||
|
'stateDefinitionModel',
|
||
|
'visDefinitionModel',
|
||
|
'widgetDefinitionsCollection'
|
||
|
];
|
||
|
|
||
|
var LayerViewFactory = function (opts) {
|
||
|
opts = opts || {};
|
||
|
checkAndBuildOpts(opts, REQUIRED_OPTS, this);
|
||
|
};
|
||
|
|
||
|
LayerViewFactory.prototype.createLayerView = function (layerDefinitionModel) {
|
||
|
var layerViewOptions = {
|
||
|
model: layerDefinitionModel,
|
||
|
modals: this._modals,
|
||
|
stateDefinitionModel: this._stateDefinitionModel,
|
||
|
configModel: this._configModel
|
||
|
};
|
||
|
|
||
|
if (layerDefinitionModel.isDataLayer()) {
|
||
|
layerViewOptions = _.extend(layerViewOptions, {
|
||
|
userActions: this._userActions,
|
||
|
layerDefinitionsCollection: this._layerDefinitionsCollection,
|
||
|
newAnalysesView: this._newAnalysesView.bind(this),
|
||
|
widgetDefinitionsCollection: this._widgetDefinitionsCollection,
|
||
|
visDefinitionModel: this._visDefinitionModel,
|
||
|
analysisDefinitionNodesCollection: this._analysisDefinitionNodesCollection
|
||
|
});
|
||
|
}
|
||
|
|
||
|
var LayerViewClass = this._getLayerViewClass(layerDefinitionModel);
|
||
|
return new LayerViewClass(layerViewOptions);
|
||
|
};
|
||
|
|
||
|
LayerViewFactory.prototype._getLayerViewClass = function (layerDefinitionModel) {
|
||
|
// Base layers
|
||
|
if (this._isTiledBaseLayer(layerDefinitionModel)) {
|
||
|
return BaseTiledLayerView;
|
||
|
}
|
||
|
if (this._isPlainColorBaseLayer(layerDefinitionModel)) {
|
||
|
return PlainColorLayerView;
|
||
|
}
|
||
|
if (this._isBackgroundImageBaseLayer(layerDefinitionModel)) {
|
||
|
return BackgroundImageLayerView;
|
||
|
}
|
||
|
if (this._isGoogleMapsBaseLayer(layerDefinitionModel)) {
|
||
|
return GoogleMapsBaseLayerView;
|
||
|
}
|
||
|
|
||
|
// Data layers
|
||
|
if (layerDefinitionModel.isDataLayer()) {
|
||
|
var nodeDefModel = layerDefinitionModel.getAnalysisDefinitionNodeModel();
|
||
|
if (nodeDefModel) {
|
||
|
return DataLayerView;
|
||
|
} else {
|
||
|
// Ghost node layer (😱)
|
||
|
return ErroredDataLayerView;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Labels layer
|
||
|
if (this.isLabelsLayer(layerDefinitionModel)) {
|
||
|
return LabelsLayerView;
|
||
|
}
|
||
|
|
||
|
throw new Error('No layer view for type "' + layerDefinitionModel.get('type') + '" just yet.');
|
||
|
};
|
||
|
|
||
|
LayerViewFactory.prototype._isBaseLayer = function (layerDefinitionModel) {
|
||
|
return layerDefinitionModel.get('order') === 0;
|
||
|
};
|
||
|
|
||
|
LayerViewFactory.prototype._isTiledBaseLayer = function (layerDefinitionModel) {
|
||
|
var layerType = layerDefinitionModel.get('type');
|
||
|
return layerTypesAndKinds.isTiledType(layerType) &&
|
||
|
this._isBaseLayer(layerDefinitionModel);
|
||
|
};
|
||
|
|
||
|
LayerViewFactory.prototype._isPlainColorBaseLayer = function (layerDefinitionModel) {
|
||
|
var layerType = layerDefinitionModel.get('type');
|
||
|
return layerTypesAndKinds.isPlainType(layerType) &&
|
||
|
this._isBaseLayer(layerDefinitionModel) &&
|
||
|
layerDefinitionModel.get('color');
|
||
|
};
|
||
|
|
||
|
LayerViewFactory.prototype._isBackgroundImageBaseLayer = function (layerDefinitionModel) {
|
||
|
var layerType = layerDefinitionModel.get('type');
|
||
|
return layerTypesAndKinds.isPlainType(layerType) &&
|
||
|
this._isBaseLayer(layerDefinitionModel) &&
|
||
|
layerDefinitionModel.get('image');
|
||
|
};
|
||
|
|
||
|
LayerViewFactory.prototype._isGoogleMapsBaseLayer = function (layerDefinitionModel) {
|
||
|
var layerType = layerDefinitionModel.get('type');
|
||
|
return layerTypesAndKinds.isGMapsBase(layerType) &&
|
||
|
this._isBaseLayer(layerDefinitionModel);
|
||
|
};
|
||
|
|
||
|
LayerViewFactory.prototype.isLabelsLayer = function (layerDefinitionModel) {
|
||
|
var layerType = layerDefinitionModel.get('type');
|
||
|
return layerTypesAndKinds.isTiledType(layerType) &&
|
||
|
!this._isBaseLayer(layerDefinitionModel);
|
||
|
};
|
||
|
|
||
|
LayerViewFactory.prototype.isBasemapLayer = function (layerDefinitionModel) {
|
||
|
return this._isBaseLayer(layerDefinitionModel);
|
||
|
};
|
||
|
|
||
|
LayerViewFactory.prototype._newAnalysesView = function (el, layerDefinitionModel) {
|
||
|
var layerAnalysisViewFactory = new LayerAnalysisViewFactory(this._analysisDefinitionNodesCollection);
|
||
|
return new LayerAnalysesView({
|
||
|
el: el,
|
||
|
model: layerDefinitionModel,
|
||
|
layerAnalysisViewFactory: layerAnalysisViewFactory,
|
||
|
sortableSelector: this._sortableSelector
|
||
|
});
|
||
|
};
|
||
|
|
||
|
module.exports = LayerViewFactory;
|