Skip to content

Commit 5438248

Browse files
author
wonder
committed
Fixed loading and saving of layer styles
git-svn-id: http://svn.osgeo.org/qgis/branches/symbology-ng-branch@11903 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 72c842e commit 5438248

1 file changed

Lines changed: 125 additions & 121 deletions

File tree

‎src/core/qgsvectorlayer.cpp‎

Lines changed: 125 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -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

26272622
bool 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

Comments
 (0)