@@ -123,33 +123,36 @@ QgsVectorLayer::QgsVectorLayer( QString vectorLayerPath,
123123 // Always set crs
124124 setCoordinateSystem ();
125125
126- // check if there is a default style / propertysheet defined
127- // for this layer and if so apply it
128- //
129126 QSettings settings;
130127 if ( settings.value ( " /qgis/use_symbology_ng" , false ).toBool () )
131128 {
132129 // using symbology-ng!
133130 setUsingRendererV2 (true );
134- setRendererV2 ( QgsFeatureRendererV2::defaultRenderer ( geometryType () ) );
135131 }
136- else if ( loadDefaultStyleFlag )
132+
133+ // check if there is a default style / propertysheet defined
134+ // for this layer and if so apply it
135+ bool defaultLoadedFlag = false ;
136+ if ( loadDefaultStyleFlag )
137137 {
138- bool defaultLoadedFlag = false ;
139138 loadDefaultStyle ( defaultLoadedFlag );
140- if ( !defaultLoadedFlag )
139+ }
140+
141+ // if the default style failed to load or was disabled use some very basic defaults
142+ if ( !defaultLoadedFlag )
143+ {
144+ // add single symbol renderer
145+ if (mUsingRendererV2 )
146+ {
147+ setRendererV2 ( QgsFeatureRendererV2::defaultRenderer ( geometryType () ) );
148+ }
149+ else
141150 {
142- // add single symbol renderer as default
143151 QgsSingleSymbolRenderer *renderer = new QgsSingleSymbolRenderer ( geometryType () );
144152 setRenderer ( renderer );
145153 }
146154 }
147- else // Otherwise use some very basic defaults
148- {
149- // add single symbol renderer as default
150- QgsSingleSymbolRenderer *renderer = new QgsSingleSymbolRenderer ( geometryType () );
151- setRenderer ( renderer );
152- }
155+
153156 // Get the update threshold from user settings. We
154157 // do this only on construction to avoid the penality of
155158 // fetching this each time the layer is drawn. If the user
@@ -2301,27 +2304,10 @@ bool QgsVectorLayer::readXml( QDomNode & layer_node )
23012304 }
23022305 }
23032306
2304- QDomElement rendererElement = layer_node.firstChildElement (RENDERER_TAG_NAME );
2305- if (!rendererElement.isNull ())
2306- {
2307- // using renderer v2
2308- setUsingRendererV2 (true );
2309-
2310- QgsFeatureRendererV2* r = QgsFeatureRendererV2::load (rendererElement);
2311- if (r == NULL )
2312- return false ;
2313- setRendererV2 (r);
2314- }
2315- else
2307+ QString errorMsg;
2308+ if ( !readSymbology ( layer_node, errorMsg ) )
23162309 {
2317- // using renderer v1
2318- setUsingRendererV2 (false );
2319-
2320- QString errorMsg;
2321- if ( !readSymbology ( layer_node, errorMsg ) )
2322- {
2323- return false ;
2324- }
2310+ return false ;
23252311 }
23262312
23272313 return mValid ; // should be true if read successfully
@@ -2457,27 +2443,84 @@ bool QgsVectorLayer::writeXml( QDomNode & layer_node,
24572443 }
24582444
24592445 // renderer specific settings
2460- if (mUsingRendererV2 )
2446+ QString errorMsg;
2447+ if ( !writeSymbology ( layer_node, document, errorMsg ) )
24612448 {
2462- QDomElement rendererElement = mRendererV2 ->save (document);
2463- layer_node.appendChild (rendererElement);
2449+ return false ;
2450+ }
2451+
2452+ return true ;
2453+ } // bool QgsVectorLayer::writeXml
2454+
2455+ bool QgsVectorLayer::readSymbology ( const QDomNode& node, QString& errorMessage )
2456+ {
2457+ // try renderer v2 first
2458+ QDomElement rendererElement = node.firstChildElement (RENDERER_TAG_NAME );
2459+ if (!rendererElement.isNull ())
2460+ {
2461+ // using renderer v2
2462+ setUsingRendererV2 (true );
2463+
2464+ QgsFeatureRendererV2* r = QgsFeatureRendererV2::load (rendererElement);
2465+ if (r == NULL )
2466+ return false ;
2467+
2468+ setRendererV2 (r);
24642469 }
24652470 else
24662471 {
2467- QString errorMsg;
2468- if ( !writeSymbology ( layer_node, document, errorMsg ) )
2472+ // using renderer v1
2473+ setUsingRendererV2 (false );
2474+
2475+ // create and bind a renderer to this layer
2476+
2477+ QDomNode singlenode = node.namedItem ( " singlesymbol" );
2478+ QDomNode graduatednode = node.namedItem ( " graduatedsymbol" );
2479+ QDomNode continuousnode = node.namedItem ( " continuoussymbol" );
2480+ QDomNode uniquevaluenode = node.namedItem ( " uniquevalue" );
2481+
2482+ QgsRenderer * renderer = 0 ;
2483+ int returnCode = 1 ;
2484+
2485+ if ( !singlenode.isNull () )
2486+ {
2487+ renderer = new QgsSingleSymbolRenderer ( geometryType () );
2488+ returnCode = renderer->readXML ( singlenode, *this );
2489+ }
2490+ else if ( !graduatednode.isNull () )
2491+ {
2492+ renderer = new QgsGraduatedSymbolRenderer ( geometryType () );
2493+ returnCode = renderer->readXML ( graduatednode, *this );
2494+ }
2495+ else if ( !continuousnode.isNull () )
2496+ {
2497+ renderer = new QgsContinuousColorRenderer ( geometryType () );
2498+ returnCode = renderer->readXML ( continuousnode, *this );
2499+ }
2500+ else if ( !uniquevaluenode.isNull () )
2501+ {
2502+ renderer = new QgsUniqueValueRenderer ( geometryType () );
2503+ returnCode = renderer->readXML ( uniquevaluenode, *this );
2504+ }
2505+
2506+ if ( !renderer )
24692507 {
2508+ errorMessage = tr ( " Unknown renderer" );
24702509 return false ;
24712510 }
2472- }
24732511
2474- return true ;
2475- } // bool QgsVectorLayer::writeXml
2512+ if ( returnCode == 1 )
2513+ {
2514+ errorMessage = tr ( " No renderer object" ); delete renderer; return false ;
2515+ }
2516+ else if ( returnCode == 2 )
2517+ {
2518+ errorMessage = tr ( " Classification field not found" ); delete renderer; return false ;
2519+ }
24762520
2477- bool QgsVectorLayer::readSymbology ( const QDomNode& node, QString& errorMessage )
2478- {
2479- // TODO: load symbology-ng renderers
2480- setUsingRendererV2 (false );
2521+ mRenderer = renderer;
2522+
2523+ }
24812524
24822525 // process the attribute actions
24832526 mActions ->readXML ( node );
@@ -2552,54 +2595,6 @@ bool QgsVectorLayer::readSymbology( const QDomNode& node, QString& errorMessage
25522595 }
25532596 }
25542597
2555- // create and bind a renderer to this layer
2556-
2557- QDomNode singlenode = node.namedItem ( " singlesymbol" );
2558- QDomNode graduatednode = node.namedItem ( " graduatedsymbol" );
2559- QDomNode continuousnode = node.namedItem ( " continuoussymbol" );
2560- QDomNode uniquevaluenode = node.namedItem ( " uniquevalue" );
2561-
2562- QgsRenderer * renderer = 0 ;
2563- int returnCode = 1 ;
2564-
2565- if ( !singlenode.isNull () )
2566- {
2567- renderer = new QgsSingleSymbolRenderer ( geometryType () );
2568- returnCode = renderer->readXML ( singlenode, *this );
2569- }
2570- else if ( !graduatednode.isNull () )
2571- {
2572- renderer = new QgsGraduatedSymbolRenderer ( geometryType () );
2573- returnCode = renderer->readXML ( graduatednode, *this );
2574- }
2575- else if ( !continuousnode.isNull () )
2576- {
2577- renderer = new QgsContinuousColorRenderer ( geometryType () );
2578- returnCode = renderer->readXML ( continuousnode, *this );
2579- }
2580- else if ( !uniquevaluenode.isNull () )
2581- {
2582- renderer = new QgsUniqueValueRenderer ( geometryType () );
2583- returnCode = renderer->readXML ( uniquevaluenode, *this );
2584- }
2585-
2586- if ( !renderer )
2587- {
2588- errorMessage = tr ( " Unknown renderer" );
2589- return false ;
2590- }
2591-
2592- if ( returnCode == 1 )
2593- {
2594- errorMessage = tr ( " No renderer object" ); delete renderer; return false ;
2595- }
2596- else if ( returnCode == 2 )
2597- {
2598- errorMessage = tr ( " Classification field not found" ); delete renderer; return false ;
2599- }
2600-
2601- mRenderer = renderer;
2602-
26032598 // Test if labeling is on or off
26042599 QDomNode labelnode = node.namedItem ( " label" );
26052600 QDomElement element = labelnode.toElement ();
@@ -2626,23 +2621,48 @@ bool QgsVectorLayer::readSymbology( const QDomNode& node, QString& errorMessage
26262621
26272622bool QgsVectorLayer::writeSymbology ( QDomNode& node, QDomDocument& doc, QString& errorMessage ) const
26282623{
2624+ if (mUsingRendererV2 )
2625+ {
2626+ QDomElement rendererElement = mRendererV2 ->save (doc);
2627+ node.appendChild (rendererElement);
2628+ }
2629+ else
2630+ {
2631+ // classification field(s)
2632+ QgsAttributeList attributes = mRenderer ->classificationAttributes ();
2633+ const QgsFieldMap providerFields = mDataProvider ->fields ();
2634+ for ( QgsAttributeList::const_iterator it = attributes.begin (); it != attributes.end (); ++it )
2635+ {
2636+ QDomElement classificationElement = doc.createElement ( " classificationattribute" );
2637+ QDomText classificationText = doc.createTextNode ( providerFields[*it].name () );
2638+ classificationElement.appendChild ( classificationText );
2639+ node.appendChild ( classificationElement );
2640+ }
2641+
2642+ // renderer settings
2643+ const QgsRenderer * myRenderer = renderer ();
2644+ if ( myRenderer )
2645+ {
2646+ if ( !myRenderer->writeXML ( node, doc, *this ) )
2647+ {
2648+ errorMessage = " renderer failed to save" ;
2649+ return false ;
2650+ }
2651+ }
2652+ else
2653+ {
2654+ QgsDebugMsg ( " no renderer" );
2655+ errorMessage = " no renderer" ;
2656+ return false ;
2657+ }
2658+ }
2659+
26292660 // use scale dependent visibility flag
26302661 QDomElement mapLayerNode = node.toElement ();
26312662 mapLayerNode.setAttribute ( " scaleBasedLabelVisibilityFlag" , label ()->scaleBasedVisibility () ? 1 : 0 );
26322663 mapLayerNode.setAttribute ( " minLabelScale" , label ()->minScale () );
26332664 mapLayerNode.setAttribute ( " maxLabelScale" , label ()->maxScale () );
26342665
2635- // classification field(s)
2636- QgsAttributeList attributes = mRenderer ->classificationAttributes ();
2637- const QgsFieldMap providerFields = mDataProvider ->fields ();
2638- for ( QgsAttributeList::const_iterator it = attributes.begin (); it != attributes.end (); ++it )
2639- {
2640- QDomElement classificationElement = doc.createElement ( " classificationattribute" );
2641- QDomText classificationText = doc.createTextNode ( providerFields[*it].name () );
2642- classificationElement.appendChild ( classificationText );
2643- node.appendChild ( classificationElement );
2644- }
2645-
26462666 // edit types
26472667 if ( mEditTypes .size () > 0 )
26482668 {
@@ -2725,22 +2745,6 @@ bool QgsVectorLayer::writeSymbology( QDomNode& node, QDomDocument& doc, QString&
27252745 // add attribute actions
27262746 mActions ->writeXML ( node, doc );
27272747
2728- const QgsRenderer * myRenderer = renderer ();
2729- if ( myRenderer )
2730- {
2731- if ( !myRenderer->writeXML ( node, doc, *this ) )
2732- {
2733- errorMessage = " renderer failed to save" ;
2734- return false ;
2735- }
2736- }
2737- else
2738- {
2739- QgsDebugMsg ( " no renderer" );
2740- errorMessage = " no renderer" ;
2741- return false ;
2742- }
2743-
27442748 // Now we get to do all that all over again for QgsLabel
27452749
27462750 // XXX Since this is largely a cut-n-paste from the previous, this
0 commit comments