[Commits] r1215 - in apps/opengeo/geoexplorer/trunk: externals src/script/app src/script/app/GeoExplorer
commits at geoext.org
commits at geoext.org
Fri Jul 3 22:54:20 CEST 2009
Author: tschaub
Date: 2009-07-03 22:54:20 +0200 (Fri, 03 Jul 2009)
New Revision: 1215
Modified:
apps/opengeo/geoexplorer/trunk/externals/
apps/opengeo/geoexplorer/trunk/src/script/app/GeoExplorer.js
apps/opengeo/geoexplorer/trunk/src/script/app/GeoExplorer/GroupContainer.js
Log:
Use radio in layer node ui to control exclusive visibility. Will be simplified significantly when #109 is closed.
Property changes on: apps/opengeo/geoexplorer/trunk/externals
___________________________________________________________________
Name: svn:externals
- openlayers http://svn.openlayers.org/tags/openlayers/release-2.8/
geoext http://svn.geoext.org/core/tags/geoext/release-0.5/
ext http://svn.geoext.org/ext/2.2.1/
+ openlayers http://svn.openlayers.org/tags/openlayers/release-2.8/
geoext http://svn.geoext.org/core/trunk/geoext
ext http://svn.geoext.org/ext/2.2.1/
Modified: apps/opengeo/geoexplorer/trunk/src/script/app/GeoExplorer/GroupContainer.js
===================================================================
--- apps/opengeo/geoexplorer/trunk/src/script/app/GeoExplorer/GroupContainer.js 2009-07-03 15:59:14 UTC (rev 1214)
+++ apps/opengeo/geoexplorer/trunk/src/script/app/GeoExplorer/GroupContainer.js 2009-07-03 20:54:20 UTC (rev 1215)
@@ -27,31 +27,126 @@
});
},
- /**
- * Method: addLayerNode
- * Adds a child node representing a overlay layer of the map
- *
- * Parameters:
- * layerRecord - {Ext.data.Record} the layer record to add a node for
+ /** private: method[render]
+ * :param bulkRender: ``Boolean``
*/
- addLayerNode: function(layerRecord) {
+ render: function(bulkRender) {
+ var first = !this.rendered;
+ GeoExplorer.GroupContainer.superclass.render.call(this, bulkRender);
+ if (first) {
+ this.layerStore.on({
+ update: this.onStoreUpdate,
+ scope: this
+ });
+ }
+ },
+
+ /** private: method[onStoreAdd]
+ * :param store: ``Ext.data.Store``
+ * :param records: ``Array(Ext.data.Record)``
+ * :param index: ``Number``
+ *
+ * Listener for the store's add event.
+ */
+ onStoreAdd: function(store, records, index) {
+ /**
+ * Containers with checkedGroup should have only one visible layer.
+ * This listener can be removed if the LayerNode is made to fire
+ * checkchange when the radio button is unchecked.
+ * TODO: http://www.geoext.org/trac/geoext/ticket/109
+ */
+ GeoExplorer.GroupContainer.superclass.onStoreAdd.apply(this, arguments);
+ if (this.defaults && this.defaults.checkedGroup && !this._reordering) {
+ Ext.each(records, function(record) {
+ this.enforceOneVisible(record);
+ }, this);
+ }
+ },
+
+
+ /** private: onStoreUpdate
+ * :param store: ``Ext.data.Store``
+ * :param record: ``Ext.data.Record``
+ * :param operation: ``String``
+ *
+ * Listener for the store's update event.
+ */
+ onStoreUpdate: function(store, record, operation) {
+ /**
+ * Containers with checkedGroup should have only one visible layer.
+ * This listener can be removed if the LayerNode is made to fire
+ * checkchange when the radio button is unchecked.
+ * TODO: http://www.geoext.org/trac/geoext/ticket/109
+ */
+ if (this.defaults && this.defaults.checkedGroup) {
+ this.enforceOneVisible(record);
+ }
+ },
+
+ /** private: enforceOneVisible
+ * TODO: remove this when http://www.geoext.org/trac/geoext/ticket/109 is closed
+ */
+ enforceOneVisible: function(record) {
+ var layer = record.get("layer");
+ var inGroup = false;
+ this.eachChild(function(node) {
+ if(node.layer === layer) {
+ inGroup = true;
+ }
+ return !inGroup;
+ });
+ if(inGroup) {
+ var vis = layer.getVisibility();
+ if(vis) {
+ // make sure there is not more than one
+ this.eachChild(function(node) {
+ if(node.layer !== layer && node.layer.getVisibility()) {
+ window.setTimeout(function() {
+ node.layer.setVisibility(false);
+ }, 0);
+ }
+ });
+ } else {
+ // make sure there is at least one
+ this.eachChild(function(node) {
+ vis = vis || node.layer.getVisibility();
+ });
+ if(!vis) {
+ var child = this.lastChild;
+ window.setTimeout(function() {
+ child.layer.setVisibility(true);
+ }, 0);
+ }
+ }
+ }
+ },
+
+ /** private: method[addLayerNode]
+ * :param layerRecord: ``Ext.data.Record`` The layer record containing the
+ * layer to be added.
+ * :param index: ``Number`` Optional index for the new layer. Default is 0.
+ *
+ * Adds a child node representing a layer of the map
+ */
+ addLayerNode: function(layerRecord, index) {
if (layerRecord.get("group") == this.group) {
- GeoExplorer.GroupContainer.superclass.addLayerNode.call(this,
- layerRecord);
+ GeoExplorer.GroupContainer.superclass.addLayerNode.apply(
+ this, arguments
+ );
}
},
- /**
- * Method: removeLayerNode
- * Removes a child node representing an overlay layer of the map
+ /** private: method[removeLayerNode]
+ * :param layerRecord: ``Ext.data.Record`` The layer record containing the
+ * layer to be removed.
*
- * Parameters:
- * layerRecord - {Ext.data.Record} the layer record to remove the node for
+ * Removes a child node representing a layer of the map
*/
removeLayerNode: function(layerRecord) {
if (layerRecord.get("group") == this.group) {
- GeoExplorer.GroupContainer.superclass.removeLayerNode.call(
- this, layerRecord);
+ GeoExplorer.GroupContainer.superclass.removeLayerNode.apply(
+ this, arguments
+ );
}
},
@@ -88,11 +183,13 @@
var store = this.layerStore;
var count = store.getCount();
var nodeIndex = -1;
- var record;
+ var layer = this.item(index).layer;
+ var record, l;
for(var i=count-1; i>=0; --i) {
record = store.getAt(i);
- if(record.get("layer").displayInLayerSwitcher &&
- record.get("group") == this.group) {
+ l = record.get("layer");
+ if(l.displayInLayerSwitcher &&
+ (record.get("group") == this.group || l === layer)) {
++nodeIndex;
if(index === nodeIndex) {
break;
@@ -120,8 +217,36 @@
})
);
if(record.get("group") !== this.group) {
- record.set("group", this.group);
+ window.setTimeout(function() {
+ var store = container.layerStore;
+ var index = container.indexOf(node);
+ var recIndex = container.nodeIndexToRecordIndex(
+ container.indexOf(node)
+ );
+ store.remove(record);
+ node.remove();
+
+ // TODO: record.clone()
+ Ext.data.Record.AUTO_ID++;
+ record = record.copy(Ext.data.Record.AUTO_ID);
+ var layer = record.get("layer").clone();
+ record.set("layer", null);
+ record.set("layer", layer);
+
+ record.set("group", container.group);
+ store.insert(recIndex, [record]);
+ }, 0);
+
}
+ },
+
+ /** private: method[destroy]
+ */
+ destroy: function() {
+ if(this.layerStore) {
+ this.layerStore.un("update", this.onStoreUpdate, this);
+ }
+ GeoExplorer.GroupContainer.superclass.destroy.apply(this, arguments);
}
Modified: apps/opengeo/geoexplorer/trunk/src/script/app/GeoExplorer.js
===================================================================
--- apps/opengeo/geoexplorer/trunk/src/script/app/GeoExplorer.js 2009-07-03 15:59:14 UTC (rev 1214)
+++ apps/opengeo/geoexplorer/trunk/src/script/app/GeoExplorer.js 2009-07-03 20:54:20 UTC (rev 1215)
@@ -318,7 +318,6 @@
// create layer store
this.layers = this.mapPanel.layers;
- this.registerBackgroundListeners();
var addLayerButton = new Ext.Button({
tooltip : "Add Layers",
@@ -372,6 +371,7 @@
iconCls: "gx-folder",
expanded: true,
group: "background",
+ defaults: {checkedGroup: "background"},
layerStore: this.mapPanel.layers,
singleClickExpand: true,
allowDrag: false,
@@ -501,79 +501,6 @@
}
});
},
-
- registerBackgroundListeners: function() {
-
- var updateBackground = function(store, candidate) {
-
- var vis = [], all = [];
- store.each(function(record) {
- if(record.get("group") === "background") {
- all.push(record);
- if(record.get("layer").getVisibility()) {
- vis.push(record);
- }
- }
- });
-
- if(all.length) {
- candidate = candidate || all[0];
- if(vis.length === 0) {
- window.setTimeout(function() {
- candidate.get("layer").setVisibility(true);
- }, 0);
- } else if(vis.length > 1) {
- Ext.each(vis, function(r) {
- if(r !== candidate) {
- window.setTimeout(function() {
- r.get("layer").setVisibility(false);
- }, 0);
- return false;
- }
- });
- }
- }
- };
-
- // make sure one base layer is always visible after add, remove or update
- this.layers.on({
- add: function(store, records, index) {
- var candidate;
- Ext.each(records, function(r) {
- if(r.get("group") === "background") {
- candidate = r;
- return false;
- }
- });
- if(candidate) {
- updateBackground(store, candidate);
- }
- },
- remove: function(store, record, index) {
- if(record.get("group") === "background") {
- updateBackground(store);
- }
- },
- update: function(store, record, op) {
- if(record.get("group") === "background") {
- updateBackground(store, record);
- } else {
- // the visible background layer might have been moved to a new group
- var candidate;
- store.each(function(r) {
- if(r.get("group") === "background") {
- candidate = r;
- return false;
- }
- });
- if(candidate) {
- updateBackground(store, candidate);
- }
- }
- }
- });
-
- },
/** private: method[activate]
* Activate the application. Call after application is configured.
More information about the Commits
mailing list