Skip to content

Commit 60cce74

Browse files
committedSep 16, 2015
[GRASS] refactored vector provider, initial new editing (change geometry)
1 parent 0a9bf95 commit 60cce74

16 files changed

+2740
-1643
lines changed
 

‎src/plugins/grass/CMakeLists.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ ENDIF (WIN32)
2020
# Files
2121

2222
SET (GRASS_PLUGIN_SRCS
23+
${CMAKE_CURRENT_SOURCE_DIR}/qgsgrasseditrenderer.cpp
2324
${CMAKE_CURRENT_SOURCE_DIR}/qgsgrassplugin.cpp
2425
${CMAKE_CURRENT_SOURCE_DIR}/qgsgrassselect.cpp
2526
${CMAKE_CURRENT_SOURCE_DIR}/qgsgrasstools.cpp
@@ -45,6 +46,7 @@ SET (GRASS_PLUGIN_UIS
4546
)
4647

4748
SET (GRASS_PLUGIN_MOC_HDRS
49+
${CMAKE_CURRENT_SOURCE_DIR}/qgsgrasseditrenderer.h
4850
${CMAKE_CURRENT_SOURCE_DIR}/qgsgrassplugin.h
4951
${CMAKE_CURRENT_SOURCE_DIR}/qgsgrassselect.h
5052
${CMAKE_CURRENT_SOURCE_DIR}/qgsgrasstools.h
@@ -149,8 +151,13 @@ INCLUDE_DIRECTORIES(
149151
${CMAKE_CURRENT_BINARY_DIR}
150152
../../core
151153
../../core/geometry
154+
../../core/layertree
152155
../../core/raster
156+
../../core/symbology-ng
153157
../../gui
158+
../../gui/editorwidgets
159+
../../gui/symbology-ng
160+
../../gui/layertree
154161
../../providers/grass
155162
${CMAKE_CURRENT_BINARY_DIR}/../../ui
156163
${GDAL_INCLUDE_DIR}
Lines changed: 279 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,279 @@
1+
/***************************************************************************
2+
qgsgrasseditrenderer.cpp
3+
-------------------
4+
begin : February, 2015
5+
copyright : (C) 2015 by Radim Blazek
6+
email : radim.blazek@gmail.com
7+
***************************************************************************/
8+
/***************************************************************************
9+
* *
10+
* This program is free software; you can redistribute it and/or modify *
11+
* it under the terms of the GNU General Public License as published by *
12+
* the Free Software Foundation; either version 2 of the License, or *
13+
* (at your option) any later version. *
14+
* *
15+
***************************************************************************/
16+
17+
#include <QVBoxLayout>
18+
19+
#include "qgscategorizedsymbolrendererv2.h"
20+
#include "qgscategorizedsymbolrendererv2widget.h"
21+
#include "qgsfeature.h"
22+
#include "qgslogger.h"
23+
#include "qgsrendererv2registry.h"
24+
#include "qgssymbollayerv2.h"
25+
#include "qgssymbollayerv2utils.h"
26+
#include "qgssymbolv2.h"
27+
28+
#include "qgsgrasseditrenderer.h"
29+
#include "qgsgrassprovider.h"
30+
31+
QgsGrassEditRenderer::QgsGrassEditRenderer()
32+
: QgsFeatureRendererV2( "grassEdit" )
33+
, mLineRenderer( 0 )
34+
, mMarkerRenderer( 0 )
35+
{
36+
QHash<int, QColor> colors;
37+
colors.insert( QgsGrassProvider::TopoUndefined, QColor( 125, 125, 125 ) );
38+
colors.insert( QgsGrassProvider::TopoLine, QColor( Qt::black ) );
39+
colors.insert( QgsGrassProvider::TopoBoundary0, QColor( Qt::red ) );
40+
colors.insert( QgsGrassProvider::TopoBoundary1, QColor( 255, 125, 0 ) );
41+
colors.insert( QgsGrassProvider::TopoBoundary2, QColor( Qt::green ) );
42+
43+
QHash<int, QString> labels;
44+
labels.insert( QgsGrassProvider::TopoUndefined, "Unknown type" );
45+
labels.insert( QgsGrassProvider::TopoLine, "Line" );
46+
labels.insert( QgsGrassProvider::TopoBoundary0, "Boundary (isolated)" );
47+
labels.insert( QgsGrassProvider::TopoBoundary1, "Boundary (area on one side)" );
48+
labels.insert( QgsGrassProvider::TopoBoundary2, "Boundary (areas on both sides)" );
49+
50+
QgsCategoryList categoryList;
51+
52+
foreach ( int value, colors.keys() )
53+
{
54+
QgsSymbolV2 * symbol = QgsSymbolV2::defaultSymbol( QGis::Line );
55+
symbol->setColor( colors.value( value ) );
56+
categoryList << QgsRendererCategoryV2( QVariant( value ), symbol, labels.value( value ) );
57+
}
58+
59+
mLineRenderer = new QgsCategorizedSymbolRendererV2( "topo_symbol", categoryList );
60+
61+
colors.clear();
62+
labels.clear();
63+
64+
colors.insert( QgsGrassProvider::TopoPoint, QColor( 0, 0, 0 ) );
65+
colors.insert( QgsGrassProvider::TopoCentroidIn, QColor( 0, 255, 0 ) );
66+
colors.insert( QgsGrassProvider::TopoCentroidOut, QColor( 255, 0, 0 ) );
67+
colors.insert( QgsGrassProvider::TopoCentroidDupl, QColor( 255, 0, 255 ) );
68+
69+
labels.insert( QgsGrassProvider::TopoPoint, "Point" );
70+
labels.insert( QgsGrassProvider::TopoCentroidIn, "Centroid in area" );
71+
labels.insert( QgsGrassProvider::TopoCentroidOut, "Centroid outside area" );
72+
labels.insert( QgsGrassProvider::TopoCentroidDupl, "Duplicate centroid" );
73+
74+
categoryList.clear();
75+
76+
foreach ( int value, colors.keys() )
77+
{
78+
QgsSymbolV2 * symbol = QgsSymbolV2::defaultSymbol( QGis::Point );
79+
symbol->setColor( colors.value( value ) );
80+
categoryList << QgsRendererCategoryV2( QVariant( value ), symbol, labels.value( value ) );
81+
}
82+
83+
mMarkerRenderer = new QgsCategorizedSymbolRendererV2( "topo_symbol", categoryList );
84+
}
85+
86+
QgsGrassEditRenderer::~QgsGrassEditRenderer()
87+
{
88+
}
89+
90+
void QgsGrassEditRenderer::setLineRenderer( QgsFeatureRendererV2 *renderer )
91+
{
92+
delete mLineRenderer;
93+
mLineRenderer = renderer;
94+
}
95+
void QgsGrassEditRenderer::setMarkerRenderer( QgsFeatureRendererV2 *renderer )
96+
{
97+
delete mMarkerRenderer;
98+
mMarkerRenderer = renderer;
99+
}
100+
101+
QgsSymbolV2* QgsGrassEditRenderer::symbolForFeature( QgsFeature& feature, QgsRenderContext& context )
102+
{
103+
int symbolCode = feature.attribute( "topo_symbol" ).toInt();
104+
QgsDebugMsgLevel( QString( "fid = %1 symbolCode = %2" ).arg( feature.id() ).arg( symbolCode ), 3 );
105+
106+
QgsSymbolV2* symbol = 0;
107+
if ( symbolCode == QgsGrassProvider::TopoPoint || symbolCode == QgsGrassProvider::TopoCentroidIn ||
108+
symbolCode == QgsGrassProvider::TopoCentroidOut || symbolCode == QgsGrassProvider::TopoCentroidDupl ||
109+
symbolCode == QgsGrassProvider::TopoNode0 || symbolCode == QgsGrassProvider::TopoNode1 ||
110+
symbolCode == QgsGrassProvider::TopoNode2 )
111+
{
112+
symbol = mMarkerRenderer->symbolForFeature( feature, context );
113+
}
114+
else if ( symbolCode == QgsGrassProvider::TopoLine || symbolCode == QgsGrassProvider::TopoBoundary0 ||
115+
symbolCode == QgsGrassProvider::TopoBoundary1 || symbolCode == QgsGrassProvider::TopoBoundary2 )
116+
{
117+
symbol = mLineRenderer->symbolForFeature( feature, context );
118+
}
119+
else
120+
{
121+
// should not happen
122+
QgsDebugMsg( "unknown symbol code" );
123+
}
124+
125+
if ( symbol )
126+
{
127+
QgsDebugMsgLevel( "color = " + symbol->color().name(), 3 );
128+
}
129+
else
130+
{
131+
QgsDebugMsgLevel( "no symbol", 3 );
132+
}
133+
134+
return symbol;
135+
}
136+
137+
void QgsGrassEditRenderer::startRender( QgsRenderContext& context, const QgsFields& fields )
138+
{
139+
Q_UNUSED( fields );
140+
// TODO better
141+
//QgsFields topoFields;
142+
//topoFields.append( QgsField( "topo_symbol", QVariant::Int, "int" ) );
143+
mLineRenderer->startRender( context, fields );
144+
mMarkerRenderer->startRender( context, fields );
145+
}
146+
147+
void QgsGrassEditRenderer::stopRender( QgsRenderContext& context )
148+
{
149+
mLineRenderer->stopRender( context );
150+
mMarkerRenderer->stopRender( context );
151+
}
152+
153+
QList<QString> QgsGrassEditRenderer::usedAttributes()
154+
{
155+
return mLineRenderer->usedAttributes();
156+
}
157+
158+
QgsFeatureRendererV2* QgsGrassEditRenderer::clone() const
159+
{
160+
QgsGrassEditRenderer* r = new QgsGrassEditRenderer();
161+
if ( mLineRenderer )
162+
{
163+
r->mLineRenderer = mLineRenderer->clone();
164+
}
165+
if ( mMarkerRenderer )
166+
{
167+
r->mMarkerRenderer = mMarkerRenderer->clone();
168+
}
169+
return r;
170+
}
171+
172+
QgsSymbolV2List QgsGrassEditRenderer::symbols( QgsRenderContext& context )
173+
{
174+
return mLineRenderer->symbols( context );
175+
}
176+
177+
QString QgsGrassEditRenderer::dump() const
178+
{
179+
return "GRASS edit renderer";
180+
}
181+
182+
QDomElement QgsGrassEditRenderer::save( QDomDocument& doc )
183+
{
184+
QgsDebugMsg( "entered" );
185+
QDomElement rendererElem = doc.createElement( RENDERER_TAG_NAME );
186+
rendererElem.setAttribute( "type", "grassEdit" );
187+
188+
QDomElement lineElem = doc.createElement( "line" );
189+
rendererElem.appendChild( lineElem );
190+
lineElem.appendChild( mLineRenderer->save( doc ) );
191+
192+
QDomElement pointElem = doc.createElement( "marker" );
193+
rendererElem.appendChild( pointElem );
194+
pointElem.appendChild( mMarkerRenderer->save( doc ) );
195+
196+
return rendererElem;
197+
}
198+
199+
200+
QgsFeatureRendererV2* QgsGrassEditRenderer::create( QDomElement& element )
201+
{
202+
QgsDebugMsg( "entered" );
203+
QgsGrassEditRenderer *renderer = new QgsGrassEditRenderer();
204+
205+
QDomElement childElem = element.firstChildElement();
206+
while ( !childElem.isNull() )
207+
{
208+
QDomElement elem = childElem.firstChildElement();
209+
if ( !elem.isNull() )
210+
{
211+
QString rendererType = elem.attribute( "type" );
212+
QgsDebugMsg( "childElem.tagName() = " + childElem.tagName() + " rendererType = " + rendererType );
213+
QgsRendererV2AbstractMetadata* meta = QgsRendererV2Registry::instance()->rendererMetadata( rendererType );
214+
if ( meta )
215+
{
216+
QgsFeatureRendererV2* subRenderer = meta->createRenderer( elem );
217+
if ( subRenderer )
218+
{
219+
QgsDebugMsg( "renderer created : " + renderer->type() );
220+
if ( childElem.tagName() == "line" )
221+
{
222+
renderer->setLineRenderer( subRenderer );
223+
}
224+
else if ( childElem.tagName() == "marker" )
225+
{
226+
renderer->setMarkerRenderer( subRenderer );
227+
}
228+
}
229+
}
230+
}
231+
childElem = childElem.nextSiblingElement();
232+
}
233+
return renderer;
234+
}
235+
236+
//--------------------------------------- QgsGrassEditRendererWidget --------------------------------------------
237+
238+
QgsRendererV2Widget* QgsGrassEditRendererWidget::create( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer )
239+
{
240+
QgsDebugMsg( "entered" );
241+
return new QgsGrassEditRendererWidget( layer, style, renderer );
242+
}
243+
244+
QgsGrassEditRendererWidget::QgsGrassEditRendererWidget( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer )
245+
: QgsRendererV2Widget( layer, style )
246+
, mRenderer( 0 )
247+
{
248+
QgsDebugMsg( "entered" );
249+
mRenderer = dynamic_cast<QgsGrassEditRenderer*>( renderer->clone() );
250+
if ( !mRenderer )
251+
{
252+
return;
253+
}
254+
255+
QVBoxLayout* layout = new QVBoxLayout( this );
256+
257+
mLineRendererWidget = QgsCategorizedSymbolRendererV2Widget::create( layer, style, mRenderer->lineRenderer()->clone() );
258+
layout->addWidget( mLineRendererWidget );
259+
260+
mPointRendererWidget = QgsCategorizedSymbolRendererV2Widget::create( layer, style, mRenderer->pointRenderer()->clone() );
261+
layout->addWidget( mPointRendererWidget );
262+
}
263+
264+
QgsGrassEditRendererWidget::~QgsGrassEditRendererWidget()
265+
{
266+
QgsDebugMsg( "entered" );
267+
delete mRenderer;
268+
}
269+
270+
QgsFeatureRendererV2* QgsGrassEditRendererWidget::renderer()
271+
{
272+
QgsDebugMsg( "entered" );
273+
mRenderer->setLineRenderer( mLineRendererWidget->renderer()->clone() );
274+
mRenderer->setMarkerRenderer( mPointRendererWidget->renderer()->clone() );
275+
return mRenderer;
276+
}
277+
278+
279+

0 commit comments

Comments
 (0)