-
Notifications
You must be signed in to change notification settings - Fork 29
/
Copy path_layerMixin.js
executable file
·126 lines (122 loc) · 4.99 KB
/
_layerMixin.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
define([
'dojo/_base/declare',
'dojo/_base/lang',
'dojo/_base/array',
'dojo/topic',
'dojo/ready'
], function (declare, lang, array, topic, ready) {
return declare(null, {
layersWaitForReady: true,
postCreate: function () {
this.inherited(arguments);
if (!this.layerInfos) {
topic.publish('viewer/handleError', {
source: 'AppSettings',
error: 'layerInfos are required'
});
return;
}
this._defaultAppSettings.layerVisibility = {
save: false,
value: {},
checkbox: true,
label: 'Save Layer Visibility',
urlLoad: false
};
},
init: function () {
this.inherited(arguments);
if (!this._appSettings.layerVisibility) {
return;
}
if (this._appSettings.layerVisibility.save ||
this._appSettings.layerVisibility.urlLoad) {
//needs to be ready so other widgets can update layers
//accordingly
if (this.layersWaitForReady) {
ready(3, this, '_loadSavedLayers');
} else {
this._loadSavedLayers();
}
}
//needs to come after the loadSavedLayers function
//so also needs to be ready
ready(4, this, '_setLayerVisibilityHandles');
},
/**
* sets the visibility of the loaded layers if save or urlLoad is true
*/
_loadSavedLayers: function () {
var layers = this._appSettings.layerVisibility.value;
//load visible layers
array.forEach(this.layerInfos, lang.hitch(this, function (layer) {
if (layers.hasOwnProperty(layer.layer.id)) {
if (layers[layer.layer.id].visibleLayers &&
layer.layer.setVisibleLayers) {
layer.layer.setVisibleLayers(layers[layer.layer.id].visibleLayers);
topic.publish('layerControl/setVisibleLayers', {
id: layer.layer.id,
visibleLayers: layers[layer.layer.id]
.visibleLayers
});
}
if (layers[layer.layer.id].visible !== null) {
layer.layer.setVisibility(layers[layer.layer.id].visible);
}
}
}));
//reset url flag
this._appSettings.layerVisibility.urlLoad = false;
},
_setLayerVisibilityHandles: function () {
var setting = this._appSettings.layerVisibility;
setting.value = {};
//since the javascript api visibleLayers property starts
//with a different set of layers than what is actually turned
//on, we need to iterate through, find the parent layers,
array.forEach(this.layerInfos, lang.hitch(this, '_setLayerHandle'));
this.own(topic.subscribe('layerControl/setVisibleLayers', lang.hitch(this, function (layer) {
setting.value[layer.id].visibleLayers = layer.visibleLayers;
this._saveAppSettings();
})));
this.own(topic.subscribe('layerControl/layerToggle', lang.hitch(this, function (layer) {
setting.value[layer.id].visible = layer.visible;
this._saveAppSettings();
})));
this.own(topic.subscribe('layerControl/addLayerControls', lang.hitch(this, '_handleLayerAdds')));
},
_setLayerHandle: function (layer) {
var setting = this._appSettings.layerVisibility;
var id = layer.layer.id;
var visibleLayers;
if (layer.layer.hasOwnProperty('visibleLayers')) {
visibleLayers = [];
array.forEach(layer.layer.visibleLayers, lang.hitch(this, function (subLayerId) {
var layerInfo = this.getLayerInfo(layer.layer.layerInfos, subLayerId);
if (layerInfo) {
visibleLayers.push(subLayerId);
}
}));
if (visibleLayers.length === 0) {
visibleLayers.push(-1);
}
}
setting.value[id] = {
visible: layer.layer.visible,
visibleLayers: visibleLayers
};
},
_handleLayerAdds: function (layerInfos) {
layerInfos.forEach(lang.hitch(this, '_setLayerHandle'));
},
getLayerInfo: function (layerInfos, id) {
if (!layerInfos || !layerInfos.length || id === -1) {
return false;
}
var info = array.filter(layerInfos, function (inf) {
return inf.id === id;
});
return info[0];
}
});
});