[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