Merge branch 'refactor' into snapshotserver
authorAndy Allan <andy@gravitystorm.co.uk>
Wed, 15 Jun 2011 14:47:45 +0000 (15:47 +0100)
committerAndy Allan <andy@gravitystorm.co.uk>
Wed, 15 Jun 2011 14:47:45 +0000 (15:47 +0100)
18 files changed:
net/systemeD/halcyon/Map.as
net/systemeD/halcyon/MapPaint.as
net/systemeD/halcyon/TileSet.as
net/systemeD/potlatch2/VectorSourceDialog.mxml
net/systemeD/potlatch2/collections/CollectionEvent.as [new file with mode: 0644]
net/systemeD/potlatch2/collections/Imagery.as
net/systemeD/potlatch2/collections/Stylesheets.as
net/systemeD/potlatch2/controller/ControllerState.as
net/systemeD/potlatch2/utils/BugLoader.as
net/systemeD/potlatch2/utils/Importer.as
potlatch2.mxml
resources/stylesheets/core_interactive.css
resources/stylesheets/core_landuse.css
resources/stylesheets/core_ways.css
resources/stylesheets/enhanced.css
resources/stylesheets/network.css
resources/stylesheets/opencyclemap.css
resources/stylesheets/potlatch.css

index 9dcb118..b65ac7a 100644 (file)
@@ -74,8 +74,6 @@ package net.systemeD.halcyon {
                public var backdrop:Object; 
                /** background tile object */
                public var tileset:TileSet; 
-               /** background tile URL, name and scheme */
-               public var tileparams:Object={ url:'' }; 
                /** show all objects, even if unstyled? */
                public var showall:Boolean=true; 
                
@@ -245,10 +243,11 @@ package net.systemeD.halcyon {
                // ------------------------------------------------------------------------------------------
                // Add layers
                
-               public function addLayer(connection:Connection, styleurl:String, backgroundlayer:Boolean=true):MapPaint {
+               public function addLayer(connection:Connection, styleurl:String, backgroundlayer:Boolean=true, interactive:Boolean=false):MapPaint {
                        var paint:MapPaint=new MapPaint(this, connection, styleurl, -5, 5);
                        paintContainer.addChild(paint);
                        paint.isBackground=backgroundlayer;
+                       paint.interactive=interactive;
                        return paint;
                }
 
@@ -326,12 +325,6 @@ package net.systemeD.halcyon {
                        download();
                }
 
-               /** Select a new background imagery. */
-               public function setBackground(bg:Object):void {
-                       tileparams=bg;
-                       if (tileset) { tileset.init(bg, bg.url!=''); }
-               }
-
                /** Set background dimming on/off. */
                public function setDimming(dim:Boolean):void {
                        if (tileset) { tileset.setDimming(dim); }
index 8206aef..c1fb5a6 100644 (file)
@@ -31,6 +31,8 @@ package net.systemeD.halcyon {
         private var markeruis:Object=new Object();
         /** Is this a background layer or the core paint object? */
                public var isBackground:Boolean = true;
+               /** Can the user select entities in this layer? */
+               public var interactive:Boolean = false;
                /** Hash of index->position */
                public var sublayerIndex:Object={};
 
index b546955..5d2e1ea 100644 (file)
@@ -47,9 +47,7 @@ package net.systemeD.halcyon {
                 * @param dim Start with imagery faded?
                 * @param sharpen Start with sharpen filter applied?
                 */
-               public function init(params:Object, update:Boolean=false, dim:Boolean=true, sharpen:Boolean=false):void {
-                       setDimming(dim);
-                       sharpening=sharpen;
+               public function init(params:Object, update:Boolean=false):void {
                        baseurl=params.url;
                        scheme =params.scheme ? params.scheme : '900913';
                        tiles={};
index f2ee64c..42a61d0 100644 (file)
@@ -3,12 +3,12 @@
         xmlns:mx="http://www.adobe.com/2006/mxml" 
         layout="vertical" showCloseButton="true"
         horizontalAlign="center" title="Load vector file"
-        width="400" height="350" verticalGap="0">
+        width="500" height="350" verticalGap="0">
 
        <mx:DataGrid editable="true" width="100%" height="100%" id="dataGrid" 
                dataProvider="{vectorLayers}" itemEditEnd="dataEdited(event)">
            <mx:columns>
-               <mx:DataGridColumn editable="false" dataField="visible" headerText="Show" width="45">
+               <mx:DataGridColumn editable="false" dataField="visible" headerText="Show?" width="45">
                                <mx:itemRenderer>
                                        <mx:Component>
                                                <mx:CheckBox selectedField="isSelected"
                                        </mx:Component>
                                </mx:itemRenderer>
                        </mx:DataGridColumn>
+               <mx:DataGridColumn editable="false" dataField="interactive" headerText="Select?" width="45">
+                               <mx:itemRenderer>
+                                       <!-- There should really be a way to hide this for the editable layer. See
+                                            http://stackoverflow.com/questions/6329895/how-do-i-change-the-style-of-one-individual-cell-in-a-flex-datagrid 
+                                            Leave it as a FIXME until we move to Flex 4 -->
+                                       <mx:Component>
+                                               <mx:CheckBox selectedField="isInteractive"
+                                                                        click="data.isInteractive=!data.isInteractive; this.parent.parent.dispatchEvent(new Event('interactive_changed'));" 
+                                                            paddingLeft="5"/>
+                                       </mx:Component>
+                               </mx:itemRenderer>
+                       </mx:DataGridColumn>
                <mx:DataGridColumn editable="true"  dataField="name"  headerText="Name"/>
                <mx:DataGridColumn editable="false" dataField="url"   headerText="URL"/>
                <mx:DataGridColumn editable="false" dataField="style" headerText="Style">
         PopUpManager.centerPopUp(this);
         this.addEventListener(CloseEvent.CLOSE, vectorDialog_close);
                dataGrid.addEventListener("visibility_changed", toggleVisibility);
+               dataGrid.addEventListener("interactive_changed", toggleInteractive);
                map = Globals.vars.root;
                dispatchEvent(new Event("layers_changed"));
     }
        private function get vectorLayers():Array {
         var v:Array=[];
         for each (var a:MapPaint in map.getLayers() ) {
-            v.push( { name:a.connection.name, visible:a.visible, url:a.connection.apiBase, style:a.style, isBackground:a.isBackground } );
+            v.push( { name:a.connection.name, visible:a.visible, interactive:a.interactive, url:a.connection.apiBase, style:a.style, isBackground:a.isBackground } );
         }
                return v;
        }
        private function toggleVisibility(event:Event):void {
                map.findLayer(dataGrid.selectedItem.name).visible = !map.findLayer(dataGrid.selectedItem.name).visible;
        }
+
+       private function toggleInteractive(event:Event):void {
+               map.findLayer(dataGrid.selectedItem.name).interactive = !map.findLayer(dataGrid.selectedItem.name).interactive;
+       }
        
        private function dataEdited(event:DataGridEvent):void {
                if (event.dataField=='name') {
diff --git a/net/systemeD/potlatch2/collections/CollectionEvent.as b/net/systemeD/potlatch2/collections/CollectionEvent.as
new file mode 100644 (file)
index 0000000..bab3ee3
--- /dev/null
@@ -0,0 +1,17 @@
+package net.systemeD.potlatch2.collections {
+
+    import flash.events.Event;
+
+    public class CollectionEvent extends Event {
+
+               public static const SELECT:String = "select";
+
+               public var data:Object;
+
+        public function CollectionEvent(eventname:String, data:Object) {
+            super(eventname);
+                       this.data=data;
+        }
+    }
+
+}
index d0443c5..580017b 100644 (file)
@@ -24,7 +24,7 @@ package net.systemeD.potlatch2.collections {
         public static function instance():Imagery { return GLOBAL_INSTANCE; }
 
                public var collection:Array=[];
-               public var selected:Object={};
+               private var _selected:Object={};
 
                private var _map:Map;
                private var _overlay:Sprite;
@@ -157,9 +157,9 @@ package net.systemeD.potlatch2.collections {
 
                public function setBackground(bg:Object):void {
                        // set background
-                       selected=bg;
-                       if (bg.url=='yahoo') { _map.setBackground({url:''}); _yahoo.show(); }
-                                       else { _map.setBackground(bg      ); _yahoo.hide(); }
+                       _selected=bg;
+                       if (bg.url=='yahoo') { dispatchEvent(new CollectionEvent(CollectionEvent.SELECT, {url:''})); _yahoo.show(); }
+                                       else { dispatchEvent(new CollectionEvent(CollectionEvent.SELECT, bg      )); _yahoo.hide(); }
                        // update attribution and logo
                        _overlay.visible=bg.attribution || bg.logo || bg.terms_url;
                        setLogo(); setAttribution(); setTerms();
@@ -170,6 +170,8 @@ package net.systemeD.potlatch2.collections {
                        obj.flush();
                }
                
+               public function get selected():Object { return _selected; }
+               
                private function findBackgroundWithName(name:String):Object {
                        for each (var bg:Object in collection) {
                                if (bg.name==name) { return bg; }
@@ -184,10 +186,10 @@ package net.systemeD.potlatch2.collections {
                private function setAttribution():void {
                        var tf:TextField=TextField(_overlay.getChildAt(0));
                        tf.text='';
-                       if (!selected.attribution) return;
+                       if (!_selected.attribution) return;
                        var attr:Array=[];
-                       for (var provider:String in selected.attribution) {
-                               for each (var bounds:Array in selected.attribution[provider]) {
+                       for (var provider:String in _selected.attribution) {
+                               for each (var bounds:Array in _selected.attribution[provider]) {
                                        if (_map.scale>=bounds[0] && _map.scale<=bounds[1] &&
                                          ((_map.edge_l>bounds[3] && _map.edge_l<bounds[5]) ||
                                           (_map.edge_r>bounds[3] && _map.edge_r<bounds[5]) ||
@@ -212,24 +214,24 @@ package net.systemeD.potlatch2.collections {
 
                private function setLogo():void {
                        while (_overlay.numChildren>2) { _overlay.removeChildAt(2); }
-                       if (!selected.logoData) return;
+                       if (!_selected.logoData) return;
                        var logo:Sprite=new Sprite();
-                       logo.addChild(new Bitmap(selected.logoData));
-                       if (selected.logo_url) { logo.buttonMode=true; logo.addEventListener(MouseEvent.CLICK, launchLogoLink, false, 0, true); }
+                       logo.addChild(new Bitmap(_selected.logoData));
+                       if (_selected.logo_url) { logo.buttonMode=true; logo.addEventListener(MouseEvent.CLICK, launchLogoLink, false, 0, true); }
                        _overlay.addChild(logo);
                        positionLogo();
                }
                private function positionLogo():void {
                        _overlay.getChildAt(2).x=5;
-                       _overlay.getChildAt(2).y=_map.mapheight - 5 - selected.logoHeight - (selected.terms_url ? 10 : 0);
+                       _overlay.getChildAt(2).y=_map.mapheight - 5 - _selected.logoHeight - (_selected.terms_url ? 10 : 0);
                }
                private function launchLogoLink(e:Event):void {
-                       if (!selected.logo_url) return;
-                       navigateToURL(new URLRequest(selected.logo_url), '_blank');
+                       if (!_selected.logo_url) return;
+                       navigateToURL(new URLRequest(_selected.logo_url), '_blank');
                }
                private function setTerms():void {
                        var terms:TextField=TextField(_overlay.getChildAt(1));
-                       if (!selected.terms_url) { terms.text=''; return; }
+                       if (!_selected.terms_url) { terms.text=''; return; }
                        terms.text="Background terms of use";
                        positionTerms();
                        terms.addEventListener(MouseEvent.CLICK, launchTermsLink, false, 0, true);
@@ -239,14 +241,14 @@ package net.systemeD.potlatch2.collections {
                        _overlay.getChildAt(1).y=_map.mapheight - 15;
                }
                private function launchTermsLink(e:Event):void {
-                       if (!selected.terms_url) return;
-                       navigateToURL(new URLRequest(selected.terms_url), '_blank');
+                       if (!_selected.terms_url) return;
+                       navigateToURL(new URLRequest(_selected.terms_url), '_blank');
                }
 
                private function resizeHandler(event:MapEvent):void {
-                       if (selected.logoData) positionLogo();
-                       if (selected.terms_url) positionTerms();
-                       if (selected.attribution) positionAttribution();
+                       if (_selected.logoData) positionLogo();
+                       if (_selected.terms_url) positionTerms();
+                       if (_selected.attribution) positionAttribution();
                }
 
                [Bindable(event="collection_changed")]
index f10d079..1ac3f63 100644 (file)
@@ -14,24 +14,31 @@ package net.systemeD.potlatch2.collections {
         private static const GLOBAL_INSTANCE:Stylesheets = new Stylesheets();
         public static function instance():Stylesheets { return GLOBAL_INSTANCE; }
 
+               private static const DEFAULT:String = 'stylesheets/potlatch.css';
+
                public var collection:Array=[];
-               public var selected:Object={};
-               private var _map:Map;
+               private var _selected:String;
 
                /* Load catalogue file */
 
-               public function init(map:Map):void {
-                       _map=map;
+               public function init(request_url:String=null):void {
+                       // First, we set _selected in case it's needed before the stylesheet catalogue loads
+                       _selected=request_url;
+                       _selected=_selected ? _selected : SharedObject.getLocal("user_state").data['stylesheet_url'];
+                       _selected=_selected ? _selected : DEFAULT;
+                       
+                       // Load the stylesheet catalogue
                        var request:DebugURLRequest = new DebugURLRequest("stylesheets.xml");
                        var loader:URLLoader = new URLLoader();
-               loader.addEventListener(Event.COMPLETE, onStylesheetsLoad);
+               loader.addEventListener(Event.COMPLETE, function(e:Event):void { onStylesheetsLoad(e,request_url); });
                loader.load(request.request);
                }
 
-               private function onStylesheetsLoad(event:Event):void {
+               private function onStylesheetsLoad(event:Event, request_url:String=null):void {
                        var xml:XML = new XML(URLLoader(event.target).data);
                        var saved_url:String = SharedObject.getLocal("user_state").data['stylesheet_url'];
                        var saved_name:String= SharedObject.getLocal("user_state").data['stylesheet_name'];
+                       if (request_url && request_url!=saved_url) { saved_url=request_url; saved_name='Custom'; }
                        var isInMenu:Boolean=false, isSet:Boolean=false;
 
             // first, build the menu from the stylesheet list.
@@ -64,8 +71,8 @@ package net.systemeD.potlatch2.collections {
                 setStylesheet(s.name, s.url);
               } else {
                 //hit and hope. FIXME should this be an error state?
-                collection.push({ name:'Potlatch', url:'stylesheets/potlatch.css'});
-                setStylesheet('Potlatch','stylesheets/potlatch.css');
+                collection.push({ name:'Potlatch', url:DEFAULT});
+                setStylesheet('Potlatch',DEFAULT);
               }
             }
                        FunctionKeyManager.instance().registerListener('Map style',
@@ -74,13 +81,15 @@ package net.systemeD.potlatch2.collections {
                }
 
                public function setStylesheet(name:String,url:String):void {
-                       _map.editableLayer.setStyle(url);
-                       // >>>> REFACTOR: not great to have a reference to editableLayer in here
+                       _selected=url;
+                       dispatchEvent(new CollectionEvent(CollectionEvent.SELECT, url));
                        var obj:SharedObject = SharedObject.getLocal("user_state");
                        obj.setProperty("stylesheet_url",url);
                        obj.setProperty("stylesheet_name",name);
                        obj.flush();
                }
+               
+               public function get selected():String { return _selected; }
 
                private function findStylesheetURLWithName(name:String):String {
                        for each (var ss:Object in collection) {
index f6f00a9..ad8ac7f 100644 (file)
@@ -99,11 +99,10 @@ package net.systemeD.potlatch2.controller {
                                        var newEntity:Entity=paint.pullThrough(entity,editableLayer);
                                        if      (entity is Way ) { return new SelectedWay(newEntity as Way); }
                                        else if (entity is Node) { return new SelectedPOINode(newEntity as Node); }
-                } else if (event.type == MouseEvent.MOUSE_DOWN && entity is Marker) {
-                    return new SelectedMarker(entity as Marker, paint);
-                } else if (event.type == MouseEvent.MOUSE_DOWN) {
-                    if      (entity is Way ) { return new SelectedBackgroundWay(entity as Way); }
-                    else if (entity is Node) { return new SelectedBackgroundNode(entity as Node, paint); }
+                } else if (event.type == MouseEvent.MOUSE_DOWN && paint.interactive) {
+                    if      (entity is Way   ) { return new SelectedBackgroundWay(entity as Way); }
+                    else if (entity is Node  ) { return new SelectedBackgroundNode(entity as Node, paint); }
+                                       else if (entity is Marker) { return new SelectedMarker(entity as Marker, paint); }
                                } else if ( event.type == MouseEvent.MOUSE_UP ) {
                                        return (this is NoSelection) ? null : new NoSelection();
                                } else { return null; }
index 7cb6bf4..4c6f08b 100644 (file)
@@ -31,7 +31,7 @@ package net.systemeD.potlatch2.utils {
 
         public function load():void {
             if (!_layer) {
-                _layer = map.addLayer(connection, STYLESHEET);
+                _layer = map.addLayer(connection, STYLESHEET, true, true);
             }
             connection.loadBbox(map.edge_l, map.edge_r, map.edge_t, map.edge_b);
         }
index e53355d..263dacb 100644 (file)
@@ -2,7 +2,6 @@ package net.systemeD.potlatch2.utils {
 
        import net.systemeD.halcyon.Map;
        import net.systemeD.halcyon.ExtendedURLLoader;
-       import net.systemeD.halcyon.DebugURLRequest;
     import net.systemeD.halcyon.connection.*;
        import flash.net.URLLoader;
        import flash.display.LoaderInfo;
@@ -30,7 +29,7 @@ package net.systemeD.potlatch2.utils {
                        // Use forEach to avoid closure problem (http://stackoverflow.com/questions/422784/how-to-fix-closure-problem-in-actionscript-3-as3#3971784)
                        filenames.forEach(function(fn:String, index:int, array:Array):void {
                                trace("requesting file "+index);
-                               var request:DebugURLRequest = new DebugURLRequest(fn);
+                               var request:URLRequest = new URLRequest(fn);
                                var loader:URLLoader = new URLLoader();
                                loader.dataFormat=URLLoaderDataFormat.BINARY;
                                loader.addEventListener(Event.COMPLETE,function(e:Event):void { fileLoaded(e,index); });
@@ -38,7 +37,7 @@ package net.systemeD.potlatch2.utils {
                                        loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,      securityErrorHandler);
                                        loader.addEventListener(IOErrorEvent.IO_ERROR,                          ioErrorHandler);
                                }
-                               loader.load(request.request);
+                               loader.load(request);
                        });
                }
                
index 9ad7000..055f0a6 100644 (file)
                        _root.addChild(yahoo);
                        _root.addChild(theMap);
 
-                       // Initialise 900913 background
-                       // >>>> REFACTOR: something odd about accessing map.tileparams here...
-                       theMap.tileset.blocks=[new RegExp("google","i")];       // hard-coded block on Google tiles
-                       theMap.tileset.init(theMap.tileparams, false, 
-                                           params['background_dim']    ==null ? true  : params['background_dim'],
-                                           params['background_sharpen']==null ? false : params['background_sharpen']);
+                       // Initialise stylesheets
+                       Stylesheets.instance().init();
+                       Stylesheets.instance().addEventListener(CollectionEvent.SELECT,
+                               function(e:CollectionEvent):void { theMap.editableLayer.setStyle(String(e.data)); }
+                       );
 
                        // Add core data layer
-                       // >>>> REFACTOR: shouldn't be hardcoded to XMLConnection
                        var conn:Connection = new XMLConnection("Main", params['api'], params['policy'], params);
             conn.addEventListener(Connection.LOAD_STARTED, onDataStart);
             conn.addEventListener(Connection.LOAD_COMPLETED, onDataComplete);
                        conn.addEventListener(MapEvent.ERROR, onMapError);
                        conn.addEventListener(AttentionEvent.ATTENTION, onAttention);
                        conn.addEventListener(AttentionEvent.ALERT, onAlert);
-                       // >>>> REFACTOR: shouldn't be trying to find out stylesheet from here
-                       theMap.addLayer(conn,params['styleurl'] ? params['styleurl'] : 'stylesheets/potlatch.css',false);
+                       theMap.addLayer(conn, Stylesheets.instance().selected, false, true);
 
             // Auto-load vector backgrounds from config
             theMap.addEventListener(MapEvent.INITIALISED, function(e:Event):void { VectorBackgrounds.instance().init(theMap); });
 
                        // Set start position of map
-                       // >>>> REFACTOR: what happens if lat/lon/zoom not supplied? (Hurleston GPX case)
+                       // ** FIXME: if lat/lon/zoom aren't supplied, we need to keep the map in a non-loading state 
+                       //           until the user has decided where to start editing (e.g. when the first GPX loads)
                        theMap.init(params['lat'], params['lon'], params['zoom']);
 
                        // add attribution/logo sprite
                        Globals.vars.map_area.addEventListener(MouseEvent.MOUSE_MOVE, theMap.mouseMoveHandler);
                        Globals.vars.map_area.addEventListener(MouseEvent.MOUSE_DOWN, theMap.mouseDownHandler);
 
-                       // initialise imagery and stylesheets
+                       // initialise imagery
+                       theMap.tileset.blocks=[new RegExp("google","i")];       // hard-coded block on Google tiles
+                       theMap.tileset.setDimming(params['background_dim']    ==null ? true  : params['background_dim']);
+                       theMap.tileset.setSharpen(params['background_sharpen']==null ? false : params['background_sharpen']);
                        Imagery.instance().init(theMap, overlay, yahoo);
-                       Stylesheets.instance().init(theMap);
                        Imagery.instance().addEventListener(MapEvent.BUMP, bumpHandler);
+                       Imagery.instance().addEventListener(CollectionEvent.SELECT,
+                               function(e:CollectionEvent):void { theMap.tileset.init(e.data, e.data!=''); }
+                       );
 
                        // keyboard event attached to stage
                        stage.addEventListener(KeyboardEvent.KEY_UP, theMap.keyUpHandler);
             t.visible = loaderInfo.parameters["show_debug"] == 'true';
                        Globals.vars.root=theMap;       // just for the addDebug function
 
+                       // create controller
             theController = new EditController(theMap, tagViewer, toolbox);
             theController.setActive();
                        theController.addEventListener(AttentionEvent.ATTENTION, onAttention);
index 402d86d..6fec5f7 100644 (file)
@@ -4,10 +4,10 @@ relation[type=restriction] node { z-index:11; icon-image: icons/restriction.png;
 
 /* Interactive way behaviour */
 
-way :hover     { z-index: 2; width: eval('_width+10'); color: #ffff99; }
-way :selected { z-index: 2; width: eval('_width+10'); color: yellow; opacity: 0.7;}
-way :restrictfrom { z-index: -1; width: eval('_width+10'); color: red; opacity: 0.7;}
-way :restrictto { z-index: -1; width: eval('_width+10'); color: blue; opacity: 0.7;}
+way::highlight :hover  { z-index: 2; width: eval('_width+10'); color: #ffff99; }
+way::highlight :selected { z-index: 2; width: eval('_width+10'); color: yellow; opacity: 0.7;}
+way::highlight :restrictfrom { z-index: -1; width: eval('_width+10'); color: red; opacity: 0.7;}
+way::highlight :restrictto { z-index: -1; width: eval('_width+10'); color: blue; opacity: 0.7;}
 /*way !:drawn !:hasTags{ z-index:10; width: 0.5; color: red; }*/
 way !:drawn { z-index:10; width: 1; color: #333333; }
 way :tiger { casing-color: #ff00ff;}
index 7eeb117..a113cc7 100644 (file)
@@ -28,10 +28,10 @@ way[leisure=pitch] :area                                    { z-index: 6; color: #88bb44; width: 2; fill-color:
 way[landuse=recreation_ground] :area        { color: green; fill-color: green; set .area_small_name;}
 way[amenity=parking] :area                  { color: #bbaa66;    width: 1; fill-color: #bbaa66;    fill-opacity: 0.2; }
 way[public_transport=pay_scale_area] :area  { color: gray;    width: 1; fill-color: gray;    fill-opacity: 0.1; }
-way[man_made=pier]                                                     { z-index: 4; color: #777; width: 3; casing-color: black; casing-width: 5;}
+way[man_made=pier]                                                     { z-index: 4; color: #777; width: 3; casing-color: black; casing-width: 1;}
 way[man_made=pier][floating=yes]                       { dashes: 4,2; casing-color: #444;}
 way[leisure=marina] :area                                      { color: pink; fill-color: pink; fill-opacity: 0.4; set .area_small_name;}
-way[leisure=slipway]                                           { color: grey; width: 3; casing-color: blue; casing-width: 7; }
+way[leisure=slipway]                                           { color: grey; width: 3; casing-color: blue; casing-width: 2; }
 way[leisure=golf_course] :area { color: #44ee22; width: 2; fill-color: #44ee22; fill-opacity: 0.2; set .area_small_name;}
 way[boundary]                               { color: #000066; width: 2; opacity: 0.6; dashes: 24,4, 4, 4; z-index: 4;}
 /* Perhaps should be filled, on lower zooms. */
index 876c5b5..b7c2823 100644 (file)
@@ -7,23 +7,23 @@ way[highway=primary],way[highway=primary_link],
 way[highway=secondary],way[highway=secondary_link],
 way[highway=tertiary],way[highway=tertiary_link],
 way[highway=residential],way[highway=unclassified]  { text: name; text-color: black; font-size: 10; text-position: line; text-halo-color: white; text-halo-radius: 2; }
-way[highway=motorway],way[highway=motorway_link]    { z-index: 9; color: #809BC0; width: 7; casing-color: black; casing-width: 8; }
-way[highway=trunk],way[highway=trunk_link]          { z-index: 9; color: #7FC97F; width: 7; casing-color: black; casing-width: 8; }
-way[highway=primary],way[highway=primary_link]      { z-index: 8; color: #E46D71; width: 7; casing-color: black; casing-width: 8; }
-way[highway=secondary],way[highway=secondary_link]  { z-index: 7; color: #FDBF6F; width: 7; casing-width: 8; }
-way[highway=tertiary]                               { z-index: 6; color: #FEFECB; width: 5; casing-width: 7; }
-way[highway=unclassified]                           { z-index: 6; color: #D0D0D0; width: 5; casing-width: 7; }
-way[highway=tertiary_link]                          { z-index: 5; color: #FEFECB; width: 4; casing-width: 5; }
-way[highway=residential]                            { z-index: 5; color: #E8E8E8; width: 5; casing-color: gray; casing-width: 7; }
-way[highway=service][service!=parking_aisle]        { color: white; width: 3; casing-color: gray; casing-width: 5; }
-way[highway=service][service=parking_aisle]         { color: white; width: 1; casing-color: #aaaaaa; casing-width: 2; }
-way[highway=service][service=alley]                 { color: white; width: 2; dashes: 6,2; casing-color: black; casing-width: 4; }
-way[highway=road]                                   { color: gray; width: 5; casing-color: white; casing-width: 7; }
-way[highway=living_street]                          { z-index: 5; color: #ddffee; width: 3; casing-color: #555555; casing-width: 4; }
+way[highway=motorway],way[highway=motorway_link]    { z-index: 9; color: #809BC0; width: 7; casing-color: black; casing-width: 1; }
+way[highway=trunk],way[highway=trunk_link]          { z-index: 9; color: #7FC97F; width: 7; casing-color: black; casing-width: 1; }
+way[highway=primary],way[highway=primary_link]      { z-index: 8; color: #E46D71; width: 7; casing-color: black; casing-width: 1; }
+way[highway=secondary],way[highway=secondary_link]  { z-index: 7; color: #FDBF6F; width: 7; casing-width: 1; }
+way[highway=tertiary]                               { z-index: 6; color: #FEFECB; width: 5; casing-width: 1; }
+way[highway=unclassified]                           { z-index: 6; color: #D0D0D0; width: 5; casing-width: 1; }
+way[highway=tertiary_link]                          { z-index: 5; color: #FEFECB; width: 4; casing-width: 1; }
+way[highway=residential]                            { z-index: 5; color: #E8E8E8; width: 5; casing-color: gray; casing-width: 1; }
+way[highway=service][service!=parking_aisle]        { color: white; width: 3; casing-color: gray; casing-width: 1; }
+way[highway=service][service=parking_aisle]         { color: white; width: 1; casing-color: #aaaaaa; casing-width: 1; }
+way[highway=service][service=alley]                 { color: white; width: 2; dashes: 6,2; casing-color: black; casing-width: 1; }
+way[highway=road]                                   { color: gray; width: 5; casing-color: white; casing-width: 1; }
+way[highway=living_street]                          { z-index: 5; color: #ddffee; width: 3; casing-color: #555555; casing-width: 1; }
 
 /* Road areas */
 
-way[highway=pedestrian] !:area { color: #ddddee; width: 5; casing-color: #555555; casing-width: 6; casing-dashes: 2,4;}
+way[highway=pedestrian] !:area { color: #ddddee; width: 5; casing-color: #555555; casing-width: 1; casing-dashes: 2,4;}
 way[highway=pedestrian] :area  { color: #555555; width: 1; fill-color: #ddddee; fill-opacity: 0.8; }
 
 /* Paths */
@@ -35,29 +35,28 @@ way[highway=bridleway] { z-index:9; color: #996644; width: 2; dashes: 4, 2, 2, 2
 way[highway=track]     { color: #996644; width: 2; dashes: 4, 2; set .path;}
 way[highway=path]      { color: brown; width: 2; dashes: 2, 2; set .path;}
 way[highway=cycleway]  { color: blue; width: 2; dashes: 4, 2; set .path;}
-way[railway=tram]      { z-index: 11; color: #999999; width: 2; casing-color: black; casing-width: 6; }
+way[railway=tram]      { z-index: 11; color: #999999; width: 2; casing-color: black; casing-width: 2; }
 way .path              { text:name; text-color: black; text-position: offset; text-offset: 5;}
 
 /* Under construction */
 
 way[highway=proposed] { color: #88ffff; width: 6; dashes: 8, 4; }
-way[highway=construction] { color: #ffffbb; width: 6; dashes: 8, 4; casing-color: #0000aa; casing-width: 8; casing-dashes: 8,4;}
-way[construction=rail] 
-       { z-index: 6; color: black; width: 5; dashes: 6, 6, 4, 8;}
-       { z-index: 7; color: white; width: 3; dashes: 6,18; }
+way[highway=construction] { color: #ffffbb; width: 6; dashes: 8, 4; casing-color: #0000aa; casing-width: 1; casing-dashes: 8,4;}
+way[construction=rail] { z-index: 6; color: black; width: 5; dashes: 6, 6, 4, 8;}
+way[construction=rail]::inner { z-index: 7; color: white; width: 3; dashes: 6,18; }
 
 /* Railways */
 
-way[railway=rail]
-       { z-index: 6; color: black; width: 5; }
-       { z-index: 7; color: white; width: 3; dashes: 12,12; }
+way[railway=rail] { z-index: 6; color: black; width: 5; }
+way[railway=rail]::dashes { z-index: 7; color: white; width: 3; dashes: 12,12; }
+
 way[railway=platform] { color:black; width: 2; }
-way[railway=subway]
-    { z-index: 6; color: #444444; width: 5; }
-    { z-index: 7; color: white; width: 3; dashes: 8,8; }
-way[railway=disused],way[railway=abandoned]
-    { z-index: 6; color: #444400; width: 3; dashes: 17, 2, 5, 0; }
-    { z-index: 7; color: #999999; width: 2; dashes: 12,12; }
+
+way[railway=subway] { z-index: 6; color: #444444; width: 5; }
+way[railway=subway]::dashes  { z-index: 7; color: white; width: 3; dashes: 8,8; }
+
+way[railway=disused],way[railway=abandoned] { z-index: 6; color: #444400; width: 3; dashes: 17, 2, 5, 0; }
+way[railway=disused]::dashes,way[railway=abandoned]::dashes { z-index: 7; color: #999999; width: 2; dashes: 12,12; }
 
 /* Waterways */        
 
@@ -70,25 +69,26 @@ way[waterway][tunnel=yes]                {dashes: 8,4;}
 /* Aeroways */
 
 way[aeroway=aerodrome] :area
-    { z-index: 3; color: #bb44bb; width: 3; casing-color: #66066;  casing-width: 4;  }
+    { z-index: 3; color: #bb44bb; width: 3; casing-color: #66066;  casing-width: 1;  }
 way|z-15[aeroway=aerodrome] :area
     { z-index: 3; fill-color: #bb99bb;  fill-opacity: 0.5;}
-way[aeroway=taxiway] !:area { z-index: 8; color: #999999; width: 3; casing-color: #aa66aa; casing-width: 6; } 
+way[aeroway=taxiway] !:area { z-index: 8; color: #999999; width: 3; casing-color: #aa66aa; casing-width: 2; }
 way[aeroway=taxiway]  :area { z-index: 8; color: #bb99bb; width: 3; fill-color: #ccaacc; } 
-way|z17-[aeroway=runway] !:area 
-    { z-index: 9; color: black; width: 11; casing-color: #aa66aa; casing-width: 12; } 
-    { z-index: 10; color: white; width: 9;  dashes: 0, 20, 4, 76; } 
-    { z-index: 11; color: black; width: 7; } 
-    { z-index: 12; color: white; width: 5;  dashes: 0, 20, 4, 76; } 
-    { z-index: 13; color: black; width: 3; } 
-    { z-index: 14; color: white; width: 1;  dashes: 4, 16; } 
-way|z15-16[aeroway=runway] !:area 
-    { z-index: 9; color: black; width: 5;  } 
-    { z-index: 12; color: white; width: 5;  dashes: 0, 20, 4, 76; } 
-    { z-index: 13; color: black; width: 3; } 
-    { z-index: 14; color: white; width: 1;  dashes: 4, 16; } 
-way|z-14[aeroway=runway] !:area 
-    { z-index: 9; color: #444444; width: 3;  } 
+
+way|z17-[aeroway=runway] !:area { z-index: 9; color: black; width: 11; casing-color: #aa66aa; casing-width: 1; }
+way|z17-[aeroway=runway]::aa !:area { z-index: 10; color: white; width: 9;  dashes: 0, 20, 4, 76; }
+way|z17-[aeroway=runway]::bb !:area { z-index: 11; color: black; width: 7; }
+way|z17-[aeroway=runway]::cc !:area { z-index: 12; color: white; width: 5;  dashes: 0, 20, 4, 76; }
+way|z17-[aeroway=runway]::dd !:area { z-index: 13; color: black; width: 3; }
+way|z17-[aeroway=runway]::ee !:area { z-index: 14; color: white; width: 1;  dashes: 4, 16; }
+
+way|z15-16[aeroway=runway] !:area { z-index: 9; color: black; width: 5;  }
+way|z15-16[aeroway=runway]::aa !:area { z-index: 12; color: white; width: 5;  dashes: 0, 20, 4, 76; }
+way|z15-16[aeroway=runway]::bb !:area { z-index: 13; color: black; width: 3; }
+way|z15-16[aeroway=runway]::cc !:area { z-index: 14; color: white; width: 1;  dashes: 4, 16; }
+
+way|z-14[aeroway=runway] !:area { z-index: 9; color: #444444; width: 3;  }
+
 way[aeroway=runway] :area { z-index: 9; color: black; width: 3; fill-color: #775577; } 
 way[aeroway=apron] :area { z-index: 4; color: #cc66cc; width: 1; fill-color: #ddaadd; fill-opacity: 0.5;} 
 
@@ -99,14 +99,14 @@ way[barrier=fence] {color: #000000; width: 1; dashes: 8,4,2,4; }
 
 /* Power */
 
-way[power=line] {color: darkgray; width: 3; dashes: 12,2; casing-color: black; casing-width: 8; casing-dashes: 4, 38;}
-way[power=minor_line] {color: gray; width: 2; dashes: 2,4; casing-width: 8; casing-color: white; casing-dashes: 2,22;}
+way[power=line] {color: darkgray; width: 3; dashes: 12,2; casing-color: black; casing-width: 2; casing-dashes: 4, 38;}
+way[power=minor_line] {color: gray; width: 2; dashes: 2,4; casing-width: 3; casing-color: white; casing-dashes: 2,22;}
 way[power=station] :area { color: black; width: 2; fill-color: #666666; fill-opacity: 0.6; set .area_small_name;}
 way[power=generator] :area { color: black; width: 2; fill-color: #444444; fill-opacity: 0.6; set .area_small_name;}
 
 /* Leisure */
 
-way[golf=hole] {color: darkgreen; width: 5; casing-color: green; casing-width: 10; }
+way[golf=hole] {color: darkgreen; width: 5; casing-color: green; casing-width: 2; }
 way[leisure=sports_centre] :area { color: #66ddcc; fill-color: #66ddcc; set .area_small_name; }
 
 
index 61315b3..23966e0 100644 (file)
 
 /* Access */
 
-way[access=private],way[access=no] { z-index: 10; color: red; width: eval('_width+2'); dashes: 2,5;}
-way[access=permissive] { z-index: 10; color: green; width: eval('_width+2'); dashes: 1,3;}
+way[access=private]::access,way[access=no]::access { z-index: 10; color: red; width: eval('_width+2'); dashes: 2,5;}
+way[access=permissive]::access { z-index: 10; color: green; width: eval('_width+2'); dashes: 1,3;}
 
 /* Physical */
 
-way[embankment=yes], way[cutting=yes]
+way[embankment=yes]::hatches, way[cutting=yes]::hatches
     { z-index: 3; opacity: 0.5; color: grey; width: eval('_width+5'); dashes: 2, 2; }
 
 /* Interactive behaviour */
@@ -28,8 +28,8 @@ way .area_small_name {text-color: black; font-size: 9; text: name; text-halo: #f
 
 /* Direction on selected ways */
 
-way[highway][!oneway][junction!=roundabout]:selected,
-way[aerial_way]:selected { z-index: 14; color: #999922; width: 2; dashes: 3,60; line-style: arrows; }
-way[waterway]:selected { z-index: 14; color: #4444CC; width: 2; dashes: 5,60; line-style: arrows; }
-way[railway] :selected{ z-index: 14; color: #999999; width: 3; dashes: 4,92; line-style: arrows; }
+way[highway][!oneway][junction!=roundabout]::direction :selected,
+way[aerial_way]::direction :selected { z-index: 14; color: #999922; width: 2; dashes: 3,60; line-style: arrows; }
+way[waterway]::direction :selected { z-index: 14; color: #4444CC; width: 2; dashes: 5,60; line-style: arrows; }
+way[railway]::direction :selected{ z-index: 14; color: #999999; width: 3; dashes: 4,92; line-style: arrows; }
 
index a8f72a6..d2a60a9 100644 (file)
 
 /* Access */
 
-way[access=private],way[access=no] { z-index: 10; color: red; width: eval('_width+2'); dashes: 2,5;}
-way[access=permissive] { z-index: 10; color: green; width: eval('_width+2'); dashes: 1,3;}
+way[access=private]::access,way[access=no]::access { z-index: 10; color: red; width: eval('_width+2'); dashes: 2,5;}
+way[access=permissive]::access { z-index: 10; color: green; width: eval('_width+2'); dashes: 1,3;}
 
 /* Physical */
 
-way[embankment=yes], way[cutting=yes]
+way[embankment=yes]::hatches, way[cutting=yes]::hatches
     { z-index: 3; opacity: 0.5; color: grey; width: eval('_width+5'); dashes: 2, 2; }
 
 /* Interactive behaviour */
@@ -28,8 +28,8 @@ way .area_small_name {text-color: black; font-size: 9; text: name; text-halo: #f
 
 /* Direction on selected ways */
 
-way[highway][!oneway][junction!=roundabout]:selected,
-way[aerial_way]:selected { z-index: 14; color: #999922; width: 2; dashes: 3,60; line-style: arrows; }
-way[waterway]:selected { z-index: 14; color: #4444CC; width: 2; dashes: 5,60; line-style: arrows; }
-way[railway] :selected{ z-index: 14; color: #999999; width: 3; dashes: 4,92; line-style: arrows; }
+way[highway][!oneway][junction!=roundabout]::direction :selected,
+way[aerial_way]::direction :selected { z-index: 14; color: #999922; width: 2; dashes: 3,60; line-style: arrows; }
+way[waterway]::direction :selected { z-index: 14; color: #4444CC; width: 2; dashes: 5,60; line-style: arrows; }
+way[railway]::direction :selected{ z-index: 14; color: #999999; width: 3; dashes: 4,92; line-style: arrows; }
 
index 194d910..1270ba2 100644 (file)
@@ -27,17 +27,17 @@ way[highway=primary],way[highway=primary_link],
 way[highway=secondary],way[highway=secondary_link],
 way[highway=tertiary],way[highway=tertiary_link],
 way[highway=residential]                             { text: name; text-color: black; font-size: 7; text-position: line;}*/
-way[highway=motorway],way[highway=motorway_link]    { z-index: 9; color: #bfbfcf; width: 7; casing-color: #506077; casing-width: 9; }
-way[highway=trunk],way[highway=trunk_link]          { z-index: 9; color: #c8d8c8; width: 7; casing-color: #477147; casing-width: 9; }
-way[highway=primary],way[highway=primary_link]      { z-index: 8; color: #d8c8c8; width: 7; casing-color: #8d4346; casing-width: 9; }
-way[highway=secondary],way[highway=secondary_link]  { z-index: 7; color: #eeeec9; width: 7; casing-color: #a37b48; casing-width: 9; }
-way[highway=tertiary],way[highway=unclassified]     { z-index: 6; color: #eeeec9; width: 5; casing-color: #999999; casing-width: 7; }
-way[highway=residential]                            { z-index: 5; color: white; width: 5; casing-color: #999; casing-width: 7; }
-way[highway=service]                                { color: white; width: 3; casing-color: #999; casing-width: 5; }
+way[highway=motorway],way[highway=motorway_link]    { z-index: 9; color: #bfbfcf; width: 7; casing-color: #506077; casing-width: 1; }
+way[highway=trunk],way[highway=trunk_link]          { z-index: 9; color: #c8d8c8; width: 7; casing-color: #477147; casing-width: 1; }
+way[highway=primary],way[highway=primary_link]      { z-index: 8; color: #d8c8c8; width: 7; casing-color: #8d4346; casing-width: 1; }
+way[highway=secondary],way[highway=secondary_link]  { z-index: 7; color: #eeeec9; width: 7; casing-color: #a37b48; casing-width: 1; }
+way[highway=tertiary],way[highway=unclassified]     { z-index: 6; color: #eeeec9; width: 5; casing-color: #999999; casing-width: 1; }
+way[highway=residential]                            { z-index: 5; color: white; width: 5; casing-color: #999; casing-width: 1; }
+way[highway=service]                                { color: white; width: 3; casing-color: #999; casing-width: 1; }
 
 /* Pedestrian precincts need to be treated carefully. Only closed-loops with an explicit
 area=yes tag should be filled. The below doesn't yet work as intended. */
-way[highway=pedestrian] !:area { color: #ddddee; width: 5; casing-color: #555555; casing-width: 6; }
+way[highway=pedestrian] !:area { color: #ddddee; width: 5; casing-color: #555555; casing-width: 1; }
 way[highway=pedestrian] :area  { color: #555555; width: 1; fill-color: #ddddee; fill-opacity: 0.8; }
 
 way[highway=steps]     { color: #be6c6c; width: 2; dashes: 4, 2; }
@@ -107,26 +107,22 @@ node[barrier=cattle_grid] { icon-image: icons/cattle_grid.png; }*/
        
 /* We can stack styles at different z-index (depth) */
 
-way[railway=rail]
-       { z-index: 6; color: #444444; width: 5; } 
-       { z-index: 7; color: white; width: 3; dashes: 12,12; }
+way[railway=rail] { z-index: 6; color: #444444; width: 5; }
+way[railway=rail]::dashes { z-index: 7; color: white; width: 3; dashes: 12,12; }
 way[railway=platform] { color:black; width: 2; }
-way[railway=subway]
-        { z-index: 6; color: #444444; width: 5; }
-        { z-index: 7; color: white; width: 3; dashes: 8,8; }
+way[railway=subway] { z-index: 6; color: #444444; width: 5; }
+way[railway=subway]::dashes { z-index: 7; color: white; width: 3; dashes: 8,8; }
 
 /* Bridge */
-way[bridge=yes], way[bridge=viaduct], way[bridge=suspension]
-    { z-index: 4; color: white; width: eval('_width+3'); }
-    { z-index: 3; color: black; width: eval('_width+6'); }
+way[bridge=yes]::bridge1, way[bridge=viaduct]::bridge1, way[bridge=suspension]::bridge1  { z-index: 4; color: white; width: eval('_width+3'); }
+way[bridge=yes]::bridge2, way[bridge=viaduct]::bridge2, way[bridge=suspension]::bridge2  { z-index: 3; color: black; width: eval('_width+6'); }
     
 /* Tunnel */
-way[tunnel=yes]
-    { z-index: 4; color: white; width: eval('_width+2'); }
-    { z-index: 3; color: black; width: eval('_width+6'); dashes: 4,4; }
+way[tunnel=yes]::tunnel1 { z-index: 4; color: white; width: eval('_width+2'); }
+way[tunnel=yes]::tunnel2 { z-index: 3; color: black; width: eval('_width+6'); dashes: 4,4; }
 
 /* Oneway */
-way[oneway=yes] { z-index: 10; color: #6c70d5; width: 2; dashes: 10,30; line-style: arrows; }
+way[oneway=yes]::arrows { z-index: 10; color: #6c70d5; width: 2; dashes: 10,30; line-style: arrows; }
 
 
 /* Change the road colour based on dynamically set "highlighted" tag (see earlier) */
@@ -136,24 +132,16 @@ way .highlighted { color: pink; }
 /* Interactive editors may choose different behaviour when a user mouses-over or selects
    an object. Potlatch 2 supports these but the stand-alone Halcyon viewer does not */
 
-way :hover     { z-index: 2; width: eval('_width+10'); color: #ffff99; }
-way :selected { z-index: 2; width: eval('_width+10'); color: yellow; opacity: 0.7;}
-way !:drawn { z-index:10; width: 0.5; color: gray; } 
+@import("stylesheets/core_interactive.css");
 
-node :selectedway { z-index: 9; icon-image: square; icon-width: 8; color: red; casing-color: #cc0000; casing-width: 1;}
-node :hoverway { z-index: 9; icon-image: square; icon-width: 7; color: blue; }
-node !:drawn :poi { z-index: 2; icon-image: circle; icon-width: 3; color: lightsteelblue; casing-color: black; casing-width: 1; }
-node :selected { z-index: 1; icon-image: square; icon-width: eval('_width+10'); color: yellow; }
-node :junction :selectedway { z-index: 8; icon-image: square; icon-width: 12; casing-color: black; casing-width: 1; }
-       
 /* Descendant selectors provide an easy way to style relations: this example means "any way
    which is part of a relation whose type=route". */
 
-relation[type=route] way { z-index: 1; width: 17; color: yellow; opacity: 0.3; }
-relation[type=route][route=bicycle][network=ncn] way { z-index: 1; width: 12; color: red; opacity: 0.3; }
-relation[type=route][route=bicycle][network=rcn] way { z-index: 1; width: 12; color: cyan; opacity: 0.3; }
-relation[type=route][route=bicycle][network=lcn] way { z-index: 1; width: 12; color: blue; opacity: 0.3; }
-relation[type=route][route=bicycle][network=mtb] way { z-index: 1; width: 12; color: #48a448; opacity: 0.3; }
+relation[type=route] way::routeline { z-index: 1; width: 17; color: yellow; opacity: 0.3; }
+relation[type=route][route=bicycle][network=ncn] way::routeline { z-index: 1; width: 12; color: red; opacity: 0.3; }
+relation[type=route][route=bicycle][network=rcn] way::routeline { z-index: 1; width: 12; color: cyan; opacity: 0.3; }
+relation[type=route][route=bicycle][network=lcn] way::routeline { z-index: 1; width: 12; color: blue; opacity: 0.3; }
+relation[type=route][route=bicycle][network=mtb] way::routeline { z-index: 1; width: 12; color: #48a448; opacity: 0.3; }
 
 
 
index 39cc22c..34fd3bc 100644 (file)
@@ -20,9 +20,9 @@ way .area_small_name {text-color: black; font-size: 9; text: name; text-halo: #f
 
 /* Test rendering for licence status */
 
-way[_status=no]       { z-index: 0; width: 20; color: red; }
-way[_status=partial]  { z-index: 0; width: 20; color: red; opacity: 0.4; }
-way[_status=unsure]   { z-index: 0; width: 20; color: orange; opacity: 0.4; }
-node[_status=no]      { z-index: 0; icon-image: square; icon-width: 15; color: red; }
-node[_status=partial] { z-index: 0; icon-image: square; icon-width: 15; color: red; opacity: 0.4; }
-node[_status=unsure]  { z-index: 0; icon-image: square; icon-width: 15; color: orange; opacity: 0.4; }
+way[_status=no]::status       { z-index: 0; width: 20; color: red; }
+way[_status=partial]::status  { z-index: 0; width: 20; color: red; opacity: 0.4; }
+way[_status=unsure]::status   { z-index: 0; width: 20; color: orange; opacity: 0.4; }
+node[_status=no]::status      { z-index: 0; icon-image: square; icon-width: 15; color: red; }
+node[_status=partial]::status { z-index: 0; icon-image: square; icon-width: 15; color: red; opacity: 0.4; }
+node[_status=unsure]::status  { z-index: 0; icon-image: square; icon-width: 15; color: orange; opacity: 0.4; }