Branch data Line data Source code
1 : : /***************************************************************************
2 : : qgssymbollayerregistry.cpp
3 : : ---------------------
4 : : begin : November 2009
5 : : copyright : (C) 2009 by Martin Dobias
6 : : email : wonder dot sk at gmail dot com
7 : : ***************************************************************************
8 : : * *
9 : : * This program is free software; you can redistribute it and/or modify *
10 : : * it under the terms of the GNU General Public License as published by *
11 : : * the Free Software Foundation; either version 2 of the License, or *
12 : : * (at your option) any later version. *
13 : : * *
14 : : ***************************************************************************/
15 : :
16 : : #include "qgssymbollayerregistry.h"
17 : :
18 : : #include "qgsarrowsymbollayer.h"
19 : : #include "qgsellipsesymbollayer.h"
20 : : #include "qgsmarkersymbollayer.h"
21 : : #include "qgslinesymbollayer.h"
22 : : #include "qgsfillsymbollayer.h"
23 : : #include "qgsvectorfieldsymbollayer.h"
24 : : #include "qgsmasksymbollayer.h"
25 : : #include "qgsgeometrygeneratorsymbollayer.h"
26 : :
27 : 5 : QgsSymbolLayerRegistry::QgsSymbolLayerRegistry()
28 : : {
29 : : // init registry with known symbol layers
30 : 10 : addSymbolLayerType( new QgsSymbolLayerMetadata( QStringLiteral( "SimpleLine" ), QObject::tr( "Simple Line" ), QgsSymbol::Line,
31 : : QgsSimpleLineSymbolLayer::create, QgsSimpleLineSymbolLayer::createFromSld ) );
32 : 10 : addSymbolLayerType( new QgsSymbolLayerMetadata( QStringLiteral( "MarkerLine" ), QObject::tr( "Marker Line" ), QgsSymbol::Line,
33 : : QgsMarkerLineSymbolLayer::create, QgsMarkerLineSymbolLayer::createFromSld ) );
34 : 10 : addSymbolLayerType( new QgsSymbolLayerMetadata( QStringLiteral( "HashLine" ), QObject::tr( "Hashed Line" ), QgsSymbol::Line,
35 : : QgsHashedLineSymbolLayer::create ) );
36 : 10 : addSymbolLayerType( new QgsSymbolLayerMetadata( QStringLiteral( "ArrowLine" ), QObject::tr( "Arrow" ), QgsSymbol::Line, QgsArrowSymbolLayer::create ) );
37 : :
38 : 10 : addSymbolLayerType( new QgsSymbolLayerMetadata( QStringLiteral( "SimpleMarker" ), QObject::tr( "Simple Marker" ), QgsSymbol::Marker,
39 : : QgsSimpleMarkerSymbolLayer::create, QgsSimpleMarkerSymbolLayer::createFromSld ) );
40 : 10 : addSymbolLayerType( new QgsSymbolLayerMetadata( QStringLiteral( "FilledMarker" ), QObject::tr( "Filled Marker" ), QgsSymbol::Marker,
41 : : QgsFilledMarkerSymbolLayer::create ) );
42 : 10 : addSymbolLayerType( new QgsSymbolLayerMetadata( QStringLiteral( "SvgMarker" ), QObject::tr( "SVG Marker" ), QgsSymbol::Marker,
43 : : QgsSvgMarkerSymbolLayer::create, QgsSvgMarkerSymbolLayer::createFromSld, QgsSvgMarkerSymbolLayer::resolvePaths ) );
44 : 10 : addSymbolLayerType( new QgsSymbolLayerMetadata( QStringLiteral( "RasterMarker" ), QObject::tr( "Raster Image Marker" ), QgsSymbol::Marker,
45 : : QgsRasterMarkerSymbolLayer::create, nullptr, QgsRasterFillSymbolLayer::resolvePaths ) );
46 : 10 : addSymbolLayerType( new QgsSymbolLayerMetadata( QStringLiteral( "FontMarker" ), QObject::tr( "Font Marker" ), QgsSymbol::Marker,
47 : : QgsFontMarkerSymbolLayer::create, QgsFontMarkerSymbolLayer::createFromSld ) );
48 : 10 : addSymbolLayerType( new QgsSymbolLayerMetadata( QStringLiteral( "EllipseMarker" ), QObject::tr( "Ellipse Marker" ), QgsSymbol::Marker,
49 : : QgsEllipseSymbolLayer::create, QgsEllipseSymbolLayer::createFromSld ) );
50 : 10 : addSymbolLayerType( new QgsSymbolLayerMetadata( QStringLiteral( "VectorField" ), QObject::tr( "Vector Field Marker" ), QgsSymbol::Marker,
51 : : QgsVectorFieldSymbolLayer::create ) );
52 : 10 : addSymbolLayerType( new QgsSymbolLayerMetadata( QStringLiteral( "MaskMarker" ), QObject::tr( "Mask" ), QgsSymbol::Marker,
53 : : QgsMaskMarkerSymbolLayer::create ) );
54 : :
55 : 10 : addSymbolLayerType( new QgsSymbolLayerMetadata( QStringLiteral( "SimpleFill" ), QObject::tr( "Simple Fill" ), QgsSymbol::Fill,
56 : : QgsSimpleFillSymbolLayer::create, QgsSimpleFillSymbolLayer::createFromSld ) );
57 : 10 : addSymbolLayerType( new QgsSymbolLayerMetadata( QStringLiteral( "GradientFill" ), QObject::tr( "Gradient Fill" ), QgsSymbol::Fill,
58 : : QgsGradientFillSymbolLayer::create ) );
59 : 10 : addSymbolLayerType( new QgsSymbolLayerMetadata( QStringLiteral( "ShapeburstFill" ), QObject::tr( "Shapeburst Fill" ), QgsSymbol::Fill,
60 : : QgsShapeburstFillSymbolLayer::create ) );
61 : 10 : addSymbolLayerType( new QgsSymbolLayerMetadata( QStringLiteral( "RasterFill" ), QObject::tr( "Raster Image Fill" ), QgsSymbol::Fill,
62 : : QgsRasterFillSymbolLayer::create, nullptr, QgsRasterFillSymbolLayer::resolvePaths ) );
63 : 10 : addSymbolLayerType( new QgsSymbolLayerMetadata( QStringLiteral( "SVGFill" ), QObject::tr( "SVG Fill" ), QgsSymbol::Fill,
64 : : QgsSVGFillSymbolLayer::create, QgsSVGFillSymbolLayer::createFromSld, QgsSVGFillSymbolLayer::resolvePaths ) );
65 : 10 : addSymbolLayerType( new QgsSymbolLayerMetadata( QStringLiteral( "CentroidFill" ), QObject::tr( "Centroid Fill" ), QgsSymbol::Fill,
66 : : QgsCentroidFillSymbolLayer::create, QgsCentroidFillSymbolLayer::createFromSld ) );
67 : 10 : addSymbolLayerType( new QgsSymbolLayerMetadata( QStringLiteral( "RandomMarkerFill" ), QObject::tr( "Random Marker Fill" ), QgsSymbol::Fill,
68 : : QgsRandomMarkerFillSymbolLayer::create ) );
69 : 10 : addSymbolLayerType( new QgsSymbolLayerMetadata( QStringLiteral( "LinePatternFill" ), QObject::tr( "Line Pattern Fill" ), QgsSymbol::Fill,
70 : : QgsLinePatternFillSymbolLayer::create, QgsLinePatternFillSymbolLayer::createFromSld ) );
71 : 10 : addSymbolLayerType( new QgsSymbolLayerMetadata( QStringLiteral( "PointPatternFill" ), QObject::tr( "Point Pattern Fill" ), QgsSymbol::Fill,
72 : : QgsPointPatternFillSymbolLayer::create, QgsPointPatternFillSymbolLayer::createFromSld ) );
73 : :
74 : 10 : addSymbolLayerType( new QgsSymbolLayerMetadata( QStringLiteral( "GeometryGenerator" ), QObject::tr( "Geometry Generator" ), QgsSymbol::Hybrid,
75 : : QgsGeometryGeneratorSymbolLayer::create ) );
76 : 5 : }
77 : :
78 : 5 : QgsSymbolLayerRegistry::~QgsSymbolLayerRegistry()
79 : : {
80 : 5 : qDeleteAll( mMetadata );
81 : 5 : }
82 : :
83 : 110 : bool QgsSymbolLayerRegistry::addSymbolLayerType( QgsSymbolLayerAbstractMetadata *metadata )
84 : : {
85 : 110 : if ( !metadata || mMetadata.contains( metadata->name() ) )
86 : 0 : return false;
87 : :
88 : 110 : mMetadata[metadata->name()] = metadata;
89 : 110 : return true;
90 : 110 : }
91 : :
92 : :
93 : 0 : QgsSymbolLayerAbstractMetadata *QgsSymbolLayerRegistry::symbolLayerMetadata( const QString &name ) const
94 : : {
95 : 0 : return mMetadata.value( name );
96 : : }
97 : :
98 : 0 : QgsSymbolLayer *QgsSymbolLayerRegistry::defaultSymbolLayer( QgsSymbol::SymbolType type )
99 : : {
100 : 0 : switch ( type )
101 : : {
102 : : case QgsSymbol::Marker:
103 : 0 : return QgsSimpleMarkerSymbolLayer::create();
104 : :
105 : : case QgsSymbol::Line:
106 : 0 : return QgsSimpleLineSymbolLayer::create();
107 : :
108 : : case QgsSymbol::Fill:
109 : 0 : return QgsSimpleFillSymbolLayer::create();
110 : :
111 : : case QgsSymbol::Hybrid:
112 : 0 : return nullptr;
113 : : }
114 : :
115 : 0 : return nullptr;
116 : 0 : }
117 : :
118 : :
119 : 990 : QgsSymbolLayer *QgsSymbolLayerRegistry::createSymbolLayer( const QString &name, const QVariantMap &properties ) const
120 : : {
121 : 990 : if ( !mMetadata.contains( name ) )
122 : 0 : return nullptr;
123 : :
124 : 990 : return mMetadata[name]->createSymbolLayer( properties );
125 : 990 : }
126 : :
127 : 0 : QgsSymbolLayer *QgsSymbolLayerRegistry::createSymbolLayerFromSld( const QString &name, QDomElement &element ) const
128 : : {
129 : 0 : if ( !mMetadata.contains( name ) )
130 : 0 : return nullptr;
131 : :
132 : 0 : return mMetadata[name]->createSymbolLayerFromSld( element );
133 : 0 : }
134 : :
135 : 990 : void QgsSymbolLayerRegistry::resolvePaths( const QString &name, QVariantMap &properties, const QgsPathResolver &pathResolver, bool saving ) const
136 : : {
137 : 990 : if ( !mMetadata.contains( name ) )
138 : 0 : return;
139 : :
140 : 990 : mMetadata[name]->resolvePaths( properties, pathResolver, saving );
141 : 990 : }
142 : :
143 : 0 : QStringList QgsSymbolLayerRegistry::symbolLayersForType( QgsSymbol::SymbolType type )
144 : : {
145 : 0 : QStringList lst;
146 : 0 : QMap<QString, QgsSymbolLayerAbstractMetadata *>::ConstIterator it = mMetadata.constBegin();
147 : 0 : for ( ; it != mMetadata.constEnd(); ++it )
148 : : {
149 : 0 : if ( it.value()->type() == type || it.value()->type() == QgsSymbol::Hybrid )
150 : 0 : lst.append( it.key() );
151 : 0 : }
152 : 0 : return lst;
153 : 0 : }
|