Skip to content

Commit e97c28c

Browse files
author
mhugent
committedMar 21, 2010
[FEATURE]: Add point displacement renderer plugin
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@13139 c8812cc2-4d05-0410-92ff-de0c093fc19c

9 files changed

+1501
-0
lines changed
 

‎src/plugins/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ SUBDIRS (copyright_label
1212
diagram_overlay
1313
evis
1414
labeling
15+
point_displacement_renderer
1516
)
1617

1718
IF (POSTGRES_FOUND)
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
########################################################
2+
# Files
3+
4+
SET (POINT_DISPLACEMENT_SRCS
5+
qgsdisplacementplugin.cpp
6+
qgspointdisplacementrenderer.cpp
7+
qgspointdisplacementrendererwidget.cpp
8+
)
9+
10+
SET (POINT_DISPLACEMENT_UIS
11+
qgspointdisplacementrendererwidgetbase.ui
12+
)
13+
14+
SET (POINT_DISPLACEMENT_MOC_HDRS
15+
qgspointdisplacementrendererwidget.h
16+
)
17+
18+
########################################################
19+
# Build
20+
21+
QT4_WRAP_UI (POINT_DISPLACEMENT_UIS_H ${POINT_DISPLACEMENT_UIS})
22+
23+
QT4_WRAP_CPP (POINT_DISPLACEMENT_MOC_SRCS ${POINT_DISPLACEMENT_MOC_HDRS})
24+
25+
ADD_LIBRARY (displacementplugin MODULE
26+
${POINT_DISPLACEMENT_SRCS}
27+
${POINT_DISPLACEMENT_UIS_H}
28+
${POINT_DISPLACEMENT_MOC_SRCS}
29+
)
30+
31+
INCLUDE_DIRECTORIES(
32+
${CMAKE_CURRENT_BINARY_DIR}
33+
${CMAKE_CURRENT_BINARY_DIR}/../../ui
34+
../../core
35+
../../core/symbology-ng
36+
../../core/spatialindex
37+
../../gui
38+
../../gui/symbology-ng
39+
..
40+
.
41+
)
42+
43+
TARGET_LINK_LIBRARIES(displacementplugin
44+
qgis_core
45+
qgis_gui
46+
)
47+
48+
49+
########################################################
50+
# Install
51+
52+
INSTALL(TARGETS displacementplugin
53+
RUNTIME DESTINATION ${QGIS_PLUGIN_DIR}
54+
LIBRARY DESTINATION ${QGIS_PLUGIN_DIR}
55+
)
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
/***************************************************************************
2+
qgsdisplacementplugin.cpp
3+
-------------------------
4+
begin : January 26, 2010
5+
copyright : (C) 2010 by Marco Hugentobler
6+
email : marco at hugis dot net
7+
***************************************************************************/
8+
9+
/***************************************************************************
10+
* *
11+
* This program is free software; you can redistribute it and/or modify *
12+
* it under the terms of the GNU General Public License as published by *
13+
* the Free Software Foundation; either version 2 of the License, or *
14+
* (at your option) any later version. *
15+
* *
16+
***************************************************************************/
17+
18+
#include "qgsdisplacementplugin.h"
19+
#include "qgisinterface.h"
20+
#include "qgspointdisplacementrenderer.h"
21+
#include "qgspointdisplacementrendererwidget.h"
22+
#include "qgsrendererv2registry.h"
23+
#include "qgssymbollayerv2registry.h"
24+
#include <QObject>
25+
26+
static const QString name_ = QObject::tr( "Displacement plugin" );
27+
static const QString description_ = QObject::tr( "Adds a new renderer that automatically handles point displacement in case they have the same position" );
28+
static const QString version_ = QObject::tr( "Version 0.1" );
29+
30+
QgsDisplacementPlugin::QgsDisplacementPlugin( QgisInterface* iface ): mIface( iface )
31+
{
32+
33+
}
34+
35+
QgsDisplacementPlugin::~QgsDisplacementPlugin()
36+
{
37+
38+
}
39+
40+
void QgsDisplacementPlugin::initGui()
41+
{
42+
//Add new renderer to the registry
43+
44+
QgsRendererV2Registry::instance()->addRenderer( new QgsRendererV2Metadata( "pointDisplacement",
45+
QObject::tr( "point Displacement" ),
46+
QgsPointDisplacementRenderer::create, QIcon(),
47+
QgsPointDisplacementRendererWidget::create ) );
48+
}
49+
50+
void QgsDisplacementPlugin::unload()
51+
{
52+
//Remove renderer type from the registry
53+
QgsRendererV2Registry::instance()->removeRenderer( "pointDisplacement" );
54+
}
55+
56+
QGISEXTERN QgisPlugin * classFactory( QgisInterface * theQgisInterfacePointer )
57+
{
58+
return new QgsDisplacementPlugin( theQgisInterfacePointer );
59+
}
60+
61+
QGISEXTERN QString name()
62+
{
63+
return name_;
64+
}
65+
66+
QGISEXTERN QString description()
67+
{
68+
return description_;
69+
}
70+
71+
QGISEXTERN QString version()
72+
{
73+
return version_;
74+
}
75+
76+
QGISEXTERN int type()
77+
{
78+
return QgisPlugin::UI;
79+
}
80+
81+
QGISEXTERN void unload( QgisPlugin* thePluginPointer )
82+
{
83+
delete thePluginPointer;
84+
}
85+
86+
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/***************************************************************************
2+
qgsdisplacementplugin.h
3+
-----------------------
4+
begin : January 26, 2010
5+
copyright : (C) 2010 by Marco Hugentobler
6+
email : marco at hugis dot net
7+
***************************************************************************/
8+
9+
/***************************************************************************
10+
* *
11+
* This program is free software; you can redistribute it and/or modify *
12+
* it under the terms of the GNU General Public License as published by *
13+
* the Free Software Foundation; either version 2 of the License, or *
14+
* (at your option) any later version. *
15+
* *
16+
***************************************************************************/
17+
18+
#ifndef QGSDISPLACEMENTPLUGIN_H
19+
#define QGSDISPLACEMENTPLUGIN_H
20+
21+
#include "qgisplugin.h"
22+
23+
class QgisInterface;
24+
25+
/**A plugin that adds a point displacement renderer to the symbol registry*/
26+
class QgsDisplacementPlugin: public QgisPlugin
27+
{
28+
public:
29+
QgsDisplacementPlugin( QgisInterface* iface );
30+
~QgsDisplacementPlugin();
31+
/**Adds renderer to the registry*/
32+
void initGui();
33+
/**Removes renderer from the registry*/
34+
void unload();
35+
36+
private:
37+
QgisInterface* mIface;
38+
};
39+
40+
#endif // QGSDISPLACEMENTPLUGIN_H

‎src/plugins/point_displacement_renderer/qgspointdisplacementrenderer.cpp

Lines changed: 557 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
/***************************************************************************
2+
qgspointdisplacementrenderer.cpp
3+
--------------------------------
4+
begin : January 26, 2010
5+
copyright : (C) 2010 by Marco Hugentobler
6+
email : marco at hugis dot net
7+
***************************************************************************/
8+
9+
/***************************************************************************
10+
* *
11+
* This program is free software; you can redistribute it and/or modify *
12+
* it under the terms of the GNU General Public License as published by *
13+
* the Free Software Foundation; either version 2 of the License, or *
14+
* (at your option) any later version. *
15+
* *
16+
***************************************************************************/
17+
18+
#ifndef QGSPOINTDISPLACEMENTRENDERER_H
19+
#define QGSPOINTDISPLACEMENTRENDERER_H
20+
21+
#include "qgsfeature.h"
22+
#include "qgssymbolv2.h"
23+
#include "qgspoint.h"
24+
#include "qgsrendererv2.h"
25+
#include <QFont>
26+
#include <QSet>
27+
28+
class QgsVectorLayer;
29+
30+
/**A renderer that automatically displaces points with the same position*/
31+
class QgsPointDisplacementRenderer: public QgsFeatureRendererV2
32+
{
33+
public:
34+
QgsPointDisplacementRenderer( const QString& labelAttributeName = "" );
35+
~QgsPointDisplacementRenderer();
36+
37+
QgsFeatureRendererV2* clone();
38+
39+
/**Reimplemented from QgsFeatureRendererV2*/
40+
void renderFeature( QgsFeature& feature, QgsRenderContext& context, int layer = -1, bool drawVertexMarker = false );
41+
42+
QgsSymbolV2* symbolForFeature( QgsFeature& feature );
43+
44+
void startRender( QgsRenderContext& context, const QgsVectorLayer *vlayer );
45+
46+
void stopRender( QgsRenderContext& context );
47+
48+
QList<QString> usedAttributes();
49+
QgsSymbolV2List symbols();
50+
51+
//! create a renderer from XML element
52+
static QgsFeatureRendererV2* create( QDomElement& symbologyElem );
53+
QDomElement save( QDomDocument& doc );
54+
55+
QgsLegendSymbologyList legendSymbologyItems( QSize iconSize );
56+
57+
void setLabelAttributeName( const QString& name ) { mLabelAttributeName = name; }
58+
QString labelAttributeName() const { return mLabelAttributeName; }
59+
60+
/**Sets embedded renderer (takes ownership)*/
61+
void setEmbeddedRenderer( QgsFeatureRendererV2* r );
62+
QgsFeatureRendererV2* embeddedRenderer() { return mRenderer;}
63+
64+
void setDisplacementGroups( const QList<QMap<int, QgsFeature> >& list );
65+
66+
void setLabelFont( const QFont& f ) { mLabelFont = f; }
67+
QFont labelFont() const { return mLabelFont;}
68+
69+
void setCircleWidth( double w ) { mCircleWidth = w; }
70+
double circleWidth() const { return mCircleWidth; }
71+
72+
void setCircleColor( const QColor& c ) { mCircleColor = c; }
73+
QColor circleColor() const { return mCircleColor; }
74+
75+
void setLabelColor( const QColor& c ) { mLabelColor = c;}
76+
QColor labelColor() const { return mLabelColor; }
77+
78+
void setCircleRadiusAddition( double d ) { mCircleRadiusAddition = d; }
79+
double circleRadiusAddition() const { return mCircleRadiusAddition; }
80+
81+
void setMaxLabelScaleDenominator( double d ) { mMaxLabelScaleDenominator = d; }
82+
double maxLabelScaleDenominator() const { return mMaxLabelScaleDenominator; }
83+
84+
/**Returns the symbol for the center of a displacement group (but _not_ ownership of the symbol)*/
85+
QgsMarkerSymbolV2* centerSymbol() { return mCenterSymbol;}
86+
/**Sets the center symbol (takes ownership)*/
87+
void setCenterSymbol( QgsMarkerSymbolV2* symbol );
88+
89+
private:
90+
91+
/**Embedded renderer. Like This, it is possible to use a classification together with point displacement*/
92+
QgsFeatureRendererV2* mRenderer;
93+
94+
/**Attribute name for labeling. Empty string means no labelling will be done*/
95+
QString mLabelAttributeName;
96+
/**Label attribute index (or -1 if none). This index is not stored, it is requested in the startRender() method*/
97+
int mLabelIndex;
98+
99+
/**Center symbol for a displacement group*/
100+
QgsMarkerSymbolV2* mCenterSymbol;
101+
102+
/**Tolerance. Points that are closer together are considered as equal*/
103+
double mTolerance;
104+
105+
/**Font that is passed to the renderer*/
106+
QFont mLabelFont;
107+
QColor mLabelColor;
108+
/**Line width for the circle*/
109+
double mCircleWidth;
110+
/**Color to draw the circle*/
111+
QColor mCircleColor;
112+
/**Addition to the default circle radius*/
113+
double mCircleRadiusAddition;
114+
/**Is set internally from startRender() depending on scale denominator*/
115+
bool mDrawLabels;
116+
/**Maximum scale denominator for label display. Negative number means no scale limitation*/
117+
double mMaxLabelScaleDenominator;
118+
119+
/**Groups of features that have the same position*/
120+
QList<QMap<int, QgsFeature> > mDisplacementGroups;
121+
/**Set that contains all the ids the display groups (for quicker lookup)*/
122+
QSet<int> mDisplacementIds;
123+
124+
/**Create the displacement groups efficiently using a spatial index*/
125+
void createDisplacementGroups( QgsVectorLayer *vlayer, const QgsRectangle& viewExtent );
126+
/**Creates a search rectangle with mTolerance*/
127+
QgsRectangle searchRect( const QgsPoint& p ) const;
128+
/**This is a debugging function to check the entries in the displacement groups*/
129+
void printInfoDisplacementGroups();
130+
131+
/**Returns the label for a feature (using mLabelAttributeName as attribute field)*/
132+
QString getLabel( const QgsFeature& f );
133+
134+
//rendering methods
135+
void renderPoint( const QPointF& point, QgsSymbolV2RenderContext& context, const QList<QgsMarkerSymbolV2*>& symbols, \
136+
const QStringList& labels );
137+
138+
//helper functions
139+
void calculateSymbolAndLabelPositions( const QPointF& centerPoint, int nPosition, double radius, double symbolDiagonal, QList<QPointF>& symbolPositions, QList<QPointF>& labelShifts ) const;
140+
void drawCircle( double radiusPainterUnits, QgsSymbolV2RenderContext& context, const QPointF& centerPoint, int nSymbols );
141+
void drawSymbols( QgsRenderContext& context, const QList<QgsMarkerSymbolV2*>& symbolList, const QList<QPointF>& symbolPositions );
142+
void drawLabels( const QPointF& centerPoint, QgsSymbolV2RenderContext& context, const QList<QPointF>& labelShifts, const QStringList& labelList );
143+
};
144+
145+
#endif // QGSPOINTDISPLACEMENTRENDERER_H
Lines changed: 335 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,335 @@
1+
/***************************************************************************
2+
qgspointdisplacementrendererwidget.cpp
3+
--------------------------------------
4+
begin : January 26, 2010
5+
copyright : (C) 2010 by Marco Hugentobler
6+
email : marco at hugis dot net
7+
***************************************************************************/
8+
9+
/***************************************************************************
10+
* *
11+
* This program is free software; you can redistribute it and/or modify *
12+
* it under the terms of the GNU General Public License as published by *
13+
* the Free Software Foundation; either version 2 of the License, or *
14+
* (at your option) any later version. *
15+
* *
16+
***************************************************************************/
17+
18+
#include "qgspointdisplacementrendererwidget.h"
19+
#include "qgspointdisplacementrenderer.h"
20+
#include "qgsrendererv2registry.h"
21+
#include "qgsfield.h"
22+
#include "qgsstylev2.h"
23+
#include "qgssymbolv2selectordialog.h"
24+
#include "qgssymbollayerv2utils.h"
25+
#include "qgsvectorlayer.h"
26+
#include <QColorDialog>
27+
#include <QFontDialog>
28+
29+
QgsRendererV2Widget* QgsPointDisplacementRendererWidget::create( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer )
30+
{
31+
return new QgsPointDisplacementRendererWidget( layer, style, renderer );
32+
}
33+
34+
QgsPointDisplacementRendererWidget::QgsPointDisplacementRendererWidget( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer ): \
35+
QgsRendererV2Widget( layer, style ), mEmbeddedRendererWidget( 0 )
36+
{
37+
if ( !layer )
38+
{
39+
return;
40+
}
41+
42+
//the renderer only applies to point vector layers
43+
if ( layer->wkbType() != QGis::WKBPoint && layer->wkbType() != QGis::WKBPoint25D )
44+
{
45+
//setup blank dialog
46+
mRenderer = 0;
47+
setupBlankUi( layer->name() );
48+
return;
49+
}
50+
setupUi( this );
51+
52+
if ( renderer && renderer->type() == "pointDisplacement" )
53+
{
54+
mRenderer = dynamic_cast<QgsPointDisplacementRenderer*>( renderer->clone() );
55+
}
56+
else
57+
{
58+
mRenderer = new QgsPointDisplacementRenderer();
59+
}
60+
61+
blockAllSignals( true );
62+
63+
//insert attributes into combo box
64+
if ( layer )
65+
{
66+
const QgsFieldMap layerAttributes = layer->pendingFields();
67+
QgsFieldMap::const_iterator it = layerAttributes.constBegin();
68+
for ( ; it != layerAttributes.constEnd(); ++it )
69+
{
70+
mLabelFieldComboBox->addItem( it.value().name() );
71+
}
72+
mLabelFieldComboBox->addItem( tr( "None" ) );
73+
74+
QString currentLabelAttribute = mRenderer->labelAttributeName();
75+
if ( !currentLabelAttribute.isEmpty() )
76+
{
77+
mLabelFieldComboBox->setCurrentIndex( mLabelFieldComboBox->findText( currentLabelAttribute ) );
78+
}
79+
else
80+
{
81+
mLabelFieldComboBox->setCurrentIndex( mLabelFieldComboBox->findText( tr( "None" ) ) );
82+
}
83+
}
84+
85+
//insert possible renderer types
86+
QStringList rendererList = QgsRendererV2Registry::instance()->renderersList();
87+
QStringList::const_iterator it = rendererList.constBegin();
88+
for ( ; it != rendererList.constEnd(); ++it )
89+
{
90+
if ( *it != "pointDisplacement" )
91+
{
92+
QgsRendererV2AbstractMetadata* m = QgsRendererV2Registry::instance()->rendererMetadata( *it );
93+
mRendererComboBox->addItem( m->icon(), m->visibleName(), *it );
94+
}
95+
}
96+
97+
mCircleWidthSpinBox->setValue( mRenderer->circleWidth() );
98+
mCircleColorButton->setColor( mRenderer->circleColor() );
99+
mLabelColorButton->setColor( mRenderer->labelColor() );
100+
mCircleModificationSpinBox->setValue( mRenderer->circleRadiusAddition() );
101+
102+
//scale dependent labelling
103+
mMaxScaleDenominatorEdit->setText( QString::number( mRenderer->maxLabelScaleDenominator() ) );
104+
mMaxScaleDenominatorEdit->setValidator( new QDoubleValidator( mMaxScaleDenominatorEdit ) );
105+
if ( mRenderer->maxLabelScaleDenominator() > 0 )
106+
{
107+
mScaleDependentLabelsCheckBox->setCheckState( Qt::Checked );
108+
}
109+
else
110+
{
111+
mScaleDependentLabelsCheckBox->setCheckState( Qt::Unchecked );
112+
mMaxScaleDenominatorEdit->setEnabled( false );
113+
}
114+
115+
116+
blockAllSignals( false );
117+
118+
//set the appropriate renderer dialog
119+
if ( mRenderer && mRenderer->embeddedRenderer() )
120+
{
121+
QString rendererName = mRenderer->embeddedRenderer()->type();
122+
int rendererIndex = mRendererComboBox->findData( rendererName );
123+
if ( rendererIndex != -1 )
124+
{
125+
mRendererComboBox->setCurrentIndex( rendererIndex );
126+
on_mRendererComboBox_currentIndexChanged( rendererIndex );
127+
}
128+
}
129+
130+
updateCenterIcon();
131+
}
132+
133+
QgsPointDisplacementRendererWidget::~QgsPointDisplacementRendererWidget()
134+
{
135+
delete mRenderer;
136+
delete mEmbeddedRendererWidget;
137+
}
138+
139+
QgsFeatureRendererV2* QgsPointDisplacementRendererWidget::renderer()
140+
{
141+
if ( mRenderer && mEmbeddedRendererWidget )
142+
{
143+
QgsFeatureRendererV2* embeddedRenderer = mEmbeddedRendererWidget->renderer();
144+
if ( embeddedRenderer )
145+
{
146+
mRenderer->setEmbeddedRenderer( embeddedRenderer->clone() );
147+
}
148+
}
149+
return mRenderer;
150+
}
151+
152+
void QgsPointDisplacementRendererWidget::on_mLabelFieldComboBox_currentIndexChanged( const QString& text )
153+
{
154+
if ( mRenderer )
155+
{
156+
if ( text == tr( "None" ) )
157+
{
158+
mRenderer->setLabelAttributeName( "" );
159+
}
160+
else
161+
{
162+
mRenderer->setLabelAttributeName( text );
163+
}
164+
}
165+
}
166+
167+
void QgsPointDisplacementRendererWidget::on_mRendererComboBox_currentIndexChanged( int index )
168+
{
169+
QString rendererId = mRendererComboBox->itemData( index ).toString();
170+
QgsRendererV2AbstractMetadata* m = QgsRendererV2Registry::instance()->rendererMetadata( rendererId );
171+
if ( m )
172+
{
173+
delete mEmbeddedRendererWidget;
174+
mEmbeddedRendererWidget = m->createRendererWidget( mLayer, mStyle, mRenderer->embeddedRenderer()->clone() );
175+
}
176+
}
177+
178+
void QgsPointDisplacementRendererWidget::on_mRendererSettingsButton_clicked()
179+
{
180+
if ( mEmbeddedRendererWidget )
181+
{
182+
//create a dialog with the embedded widget
183+
QDialog* d = new QDialog();
184+
QGridLayout* layout = new QGridLayout( d );
185+
mEmbeddedRendererWidget->setParent( d );
186+
QDialogButtonBox* buttonBox = new QDialogButtonBox( d );
187+
buttonBox->addButton( QDialogButtonBox::Ok );
188+
QObject::connect( buttonBox, SIGNAL( accepted() ), d, SLOT( accept() ) );
189+
layout->addWidget( mEmbeddedRendererWidget, 0, 0 );
190+
layout->addWidget( buttonBox, 1, 0 );
191+
d->exec();
192+
mEmbeddedRendererWidget->setParent( 0 );
193+
delete d;
194+
}
195+
}
196+
197+
void QgsPointDisplacementRendererWidget::on_mLabelFontButton_clicked()
198+
{
199+
if ( !mRenderer )
200+
{
201+
return;
202+
}
203+
204+
bool ok;
205+
QFont newFont = QFontDialog::getFont( &ok, mRenderer->labelFont(), 0, tr( "Label Font" ) );
206+
if ( ok )
207+
{
208+
mRenderer->setLabelFont( newFont );
209+
}
210+
}
211+
212+
void QgsPointDisplacementRendererWidget::on_mCircleWidthSpinBox_valueChanged( double d )
213+
{
214+
if ( mRenderer )
215+
{
216+
mRenderer->setCircleWidth( d );
217+
}
218+
}
219+
220+
void QgsPointDisplacementRendererWidget::on_mCircleColorButton_clicked()
221+
{
222+
if ( !mRenderer )
223+
{
224+
return;
225+
}
226+
227+
QColor newColor = QColorDialog::getColor( mRenderer->circleColor(), 0, tr( "Circle color" ), QColorDialog::ShowAlphaChannel );
228+
if ( newColor.isValid() )
229+
{
230+
mRenderer->setCircleColor( newColor );
231+
mCircleColorButton->setColor( newColor );
232+
}
233+
}
234+
235+
void QgsPointDisplacementRendererWidget::on_mLabelColorButton_clicked()
236+
{
237+
if ( !mRenderer )
238+
{
239+
return;
240+
}
241+
242+
QColor newColor = QColorDialog::getColor( mRenderer->labelColor(), 0, tr( "Label color" ), QColorDialog::ShowAlphaChannel );
243+
if ( newColor.isValid() )
244+
{
245+
mRenderer->setLabelColor( newColor );
246+
mLabelColorButton->setColor( newColor );
247+
}
248+
}
249+
250+
void QgsPointDisplacementRendererWidget::on_mCircleModificationSpinBox_valueChanged( double d )
251+
{
252+
if ( !mRenderer )
253+
{
254+
return;
255+
}
256+
257+
mRenderer->setCircleRadiusAddition( d );
258+
}
259+
260+
void QgsPointDisplacementRendererWidget::on_mScaleDependentLabelsCheckBox_stateChanged( int state )
261+
{
262+
if ( state == Qt::Unchecked )
263+
{
264+
mMaxScaleDenominatorEdit->setText( "-1" );
265+
mMaxScaleDenominatorEdit->setEnabled( false );
266+
}
267+
else
268+
{
269+
mMaxScaleDenominatorEdit->setEnabled( true );
270+
}
271+
}
272+
273+
void QgsPointDisplacementRendererWidget::on_mMaxScaleDenominatorEdit_textChanged( const QString & text )
274+
{
275+
if ( !mRenderer )
276+
{
277+
return;
278+
}
279+
280+
bool ok;
281+
double scaleDenominator = text.toDouble( &ok );
282+
if ( ok )
283+
{
284+
mRenderer->setMaxLabelScaleDenominator( scaleDenominator );
285+
}
286+
}
287+
288+
void QgsPointDisplacementRendererWidget::blockAllSignals( bool block )
289+
{
290+
mLabelFieldComboBox->blockSignals( block );
291+
mLabelFontButton->blockSignals( block );
292+
mCircleWidthSpinBox->blockSignals( block );
293+
mCircleColorButton->blockSignals( block );
294+
mRendererComboBox->blockSignals( block );
295+
mLabelColorButton->blockSignals( block );
296+
mCircleModificationSpinBox->blockSignals( block );
297+
mScaleDependentLabelsCheckBox->blockSignals( block );
298+
mMaxScaleDenominatorEdit->blockSignals( block );
299+
mCenterSymbolPushButton->blockSignals( block );
300+
}
301+
302+
void QgsPointDisplacementRendererWidget::on_mCenterSymbolPushButton_clicked()
303+
{
304+
if ( !mRenderer || !mRenderer->centerSymbol() )
305+
{
306+
return;
307+
}
308+
QgsMarkerSymbolV2* markerSymbol = dynamic_cast<QgsMarkerSymbolV2*>( mRenderer->centerSymbol()->clone() );
309+
QgsSymbolV2SelectorDialog dlg( markerSymbol, QgsStyleV2::defaultStyle(), this );
310+
if ( dlg.exec() == QDialog::Rejected )
311+
{
312+
delete markerSymbol;
313+
return;
314+
}
315+
mRenderer->setCenterSymbol( markerSymbol );
316+
updateCenterIcon();
317+
}
318+
319+
void QgsPointDisplacementRendererWidget::updateCenterIcon()
320+
{
321+
QgsMarkerSymbolV2* symbol = mRenderer->centerSymbol();
322+
if ( !symbol )
323+
{
324+
return;
325+
}
326+
QIcon icon = QgsSymbolLayerV2Utils::symbolPreviewIcon( symbol, mCenterSymbolPushButton->iconSize() );
327+
mCenterSymbolPushButton->setIcon( icon );
328+
}
329+
330+
void QgsPointDisplacementRendererWidget::setupBlankUi( const QString& layerName )
331+
{
332+
QGridLayout* layout = new QGridLayout( this );
333+
QLabel* label = new QLabel( tr( "The point displacement renderer only applies to (single) point layers. \n'%1' is not a point layer and cannot be displayed by the point displacement renderer" ).arg( layerName ), this );
334+
layout->addWidget( label );
335+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/***************************************************************************
2+
qgspointdisplacementrendererwidget.h
3+
------------------------------------
4+
begin : January 26, 2010
5+
copyright : (C) 2010 by Marco Hugentobler
6+
email : marco at hugis dot net
7+
***************************************************************************/
8+
9+
/***************************************************************************
10+
* *
11+
* This program is free software; you can redistribute it and/or modify *
12+
* it under the terms of the GNU General Public License as published by *
13+
* the Free Software Foundation; either version 2 of the License, or *
14+
* (at your option) any later version. *
15+
* *
16+
***************************************************************************/
17+
18+
#ifndef QGSPOINTDISPLACEMENTRENDERERWIDGET_H
19+
#define QGSPOINTDISPLACEMENTRENDERERWIDGET_H
20+
21+
#include "ui_qgspointdisplacementrendererwidgetbase.h"
22+
#include "qgsrendererv2widget.h"
23+
24+
class QgsPointDisplacementRenderer;
25+
26+
class QgsPointDisplacementRendererWidget: public QgsRendererV2Widget, private Ui::QgsPointDisplacementRendererWidgetBase
27+
{
28+
Q_OBJECT
29+
public:
30+
static QgsRendererV2Widget* create( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer );
31+
QgsPointDisplacementRendererWidget( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer );
32+
~QgsPointDisplacementRendererWidget();
33+
34+
QgsFeatureRendererV2* renderer();
35+
36+
private:
37+
QgsPointDisplacementRenderer* mRenderer;
38+
QgsRendererV2Widget* mEmbeddedRendererWidget;
39+
40+
void blockAllSignals( bool block );
41+
void updateCenterIcon();
42+
void setupBlankUi( const QString& layerName );
43+
44+
private slots:
45+
void on_mLabelFieldComboBox_currentIndexChanged( const QString& text );
46+
void on_mRendererComboBox_currentIndexChanged( int index );
47+
void on_mLabelFontButton_clicked();
48+
void on_mCircleWidthSpinBox_valueChanged( double d );
49+
void on_mCircleColorButton_clicked();
50+
void on_mLabelColorButton_clicked();
51+
void on_mCircleModificationSpinBox_valueChanged( double d );
52+
void on_mScaleDependentLabelsCheckBox_stateChanged( int state );
53+
void on_mMaxScaleDenominatorEdit_textChanged( const QString & text );
54+
void on_mCenterSymbolPushButton_clicked();
55+
void on_mRendererSettingsButton_clicked();
56+
};
57+
58+
#endif // QGSPOINTDISPLACEMENTRENDERERWIDGET_H
Lines changed: 224 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,224 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<ui version="4.0">
3+
<class>QgsPointDisplacementRendererWidgetBase</class>
4+
<widget class="QWidget" name="QgsPointDisplacementRendererWidgetBase">
5+
<property name="geometry">
6+
<rect>
7+
<x>0</x>
8+
<y>0</y>
9+
<width>328</width>
10+
<height>469</height>
11+
</rect>
12+
</property>
13+
<property name="windowTitle">
14+
<string>Form</string>
15+
</property>
16+
<layout class="QGridLayout" name="gridLayout_3">
17+
<item row="0" column="0">
18+
<layout class="QHBoxLayout" name="horizontalLayout_9">
19+
<item>
20+
<widget class="QLabel" name="mCenterSymbolLabel">
21+
<property name="text">
22+
<string>Center symbol:</string>
23+
</property>
24+
</widget>
25+
</item>
26+
<item>
27+
<widget class="QPushButton" name="mCenterSymbolPushButton">
28+
<property name="text">
29+
<string/>
30+
</property>
31+
</widget>
32+
</item>
33+
</layout>
34+
</item>
35+
<item row="1" column="0">
36+
<layout class="QHBoxLayout" name="horizontalLayout_4">
37+
<item>
38+
<widget class="QLabel" name="mRendererLabel">
39+
<property name="text">
40+
<string>Renderer:</string>
41+
</property>
42+
</widget>
43+
</item>
44+
<item>
45+
<widget class="QComboBox" name="mRendererComboBox"/>
46+
</item>
47+
</layout>
48+
</item>
49+
<item row="2" column="0">
50+
<widget class="QPushButton" name="mRendererSettingsButton">
51+
<property name="text">
52+
<string>Renderer settings...</string>
53+
</property>
54+
</widget>
55+
</item>
56+
<item row="3" column="0">
57+
<widget class="QGroupBox" name="mDisplacementCirclesGroupBox">
58+
<property name="title">
59+
<string>Displacement circles</string>
60+
</property>
61+
<layout class="QGridLayout" name="gridLayout_2">
62+
<item row="0" column="0">
63+
<layout class="QHBoxLayout" name="horizontalLayout_2">
64+
<item>
65+
<widget class="QLabel" name="mCircleWidthLabel">
66+
<property name="text">
67+
<string>Circle pen width:</string>
68+
</property>
69+
</widget>
70+
</item>
71+
<item>
72+
<widget class="QDoubleSpinBox" name="mCircleWidthSpinBox"/>
73+
</item>
74+
</layout>
75+
</item>
76+
<item row="1" column="0">
77+
<layout class="QHBoxLayout" name="horizontalLayout_3">
78+
<item>
79+
<widget class="QLabel" name="mCircleColorLabel">
80+
<property name="text">
81+
<string>Circle color:</string>
82+
</property>
83+
</widget>
84+
</item>
85+
<item>
86+
<widget class="QgsColorButton" name="mCircleColorButton">
87+
<property name="sizePolicy">
88+
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
89+
<horstretch>0</horstretch>
90+
<verstretch>0</verstretch>
91+
</sizepolicy>
92+
</property>
93+
<property name="text">
94+
<string/>
95+
</property>
96+
</widget>
97+
</item>
98+
</layout>
99+
</item>
100+
<item row="2" column="0">
101+
<layout class="QHBoxLayout" name="horizontalLayout_6">
102+
<item>
103+
<widget class="QLabel" name="mCircleRadiusLabel">
104+
<property name="text">
105+
<string>Circle radius modification:</string>
106+
</property>
107+
</widget>
108+
</item>
109+
<item>
110+
<widget class="QDoubleSpinBox" name="mCircleModificationSpinBox">
111+
<property name="minimum">
112+
<double>-99.000000000000000</double>
113+
</property>
114+
</widget>
115+
</item>
116+
</layout>
117+
</item>
118+
</layout>
119+
</widget>
120+
</item>
121+
<item row="4" column="0">
122+
<widget class="QGroupBox" name="mLabellingGroupBox">
123+
<property name="title">
124+
<string>Labels</string>
125+
</property>
126+
<layout class="QGridLayout" name="gridLayout">
127+
<item row="0" column="0">
128+
<layout class="QHBoxLayout" name="horizontalLayout">
129+
<item>
130+
<widget class="QLabel" name="mLabelAttributeLabel">
131+
<property name="text">
132+
<string>Label attribute:</string>
133+
</property>
134+
</widget>
135+
</item>
136+
<item>
137+
<widget class="QComboBox" name="mLabelFieldComboBox"/>
138+
</item>
139+
</layout>
140+
</item>
141+
<item row="1" column="0">
142+
<layout class="QHBoxLayout" name="horizontalLayout_8">
143+
<item>
144+
<widget class="QPushButton" name="mLabelFontButton">
145+
<property name="text">
146+
<string>Label font...</string>
147+
</property>
148+
</widget>
149+
</item>
150+
<item>
151+
<spacer name="horizontalSpacer">
152+
<property name="orientation">
153+
<enum>Qt::Horizontal</enum>
154+
</property>
155+
<property name="sizeHint" stdset="0">
156+
<size>
157+
<width>94</width>
158+
<height>20</height>
159+
</size>
160+
</property>
161+
</spacer>
162+
</item>
163+
</layout>
164+
</item>
165+
<item row="2" column="0">
166+
<layout class="QHBoxLayout" name="horizontalLayout_5">
167+
<item>
168+
<widget class="QLabel" name="mLabelColorLabel">
169+
<property name="text">
170+
<string>Label color:</string>
171+
</property>
172+
</widget>
173+
</item>
174+
<item>
175+
<widget class="QgsColorButton" name="mLabelColorButton">
176+
<property name="sizePolicy">
177+
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
178+
<horstretch>0</horstretch>
179+
<verstretch>0</verstretch>
180+
</sizepolicy>
181+
</property>
182+
<property name="text">
183+
<string/>
184+
</property>
185+
</widget>
186+
</item>
187+
</layout>
188+
</item>
189+
<item row="3" column="0">
190+
<widget class="QCheckBox" name="mScaleDependentLabelsCheckBox">
191+
<property name="text">
192+
<string>Use scale dependent labelling</string>
193+
</property>
194+
</widget>
195+
</item>
196+
<item row="4" column="0">
197+
<layout class="QHBoxLayout" name="horizontalLayout_7">
198+
<item>
199+
<widget class="QLabel" name="mMaxScaleLabel">
200+
<property name="text">
201+
<string>max scale denominator:</string>
202+
</property>
203+
</widget>
204+
</item>
205+
<item>
206+
<widget class="QLineEdit" name="mMaxScaleDenominatorEdit"/>
207+
</item>
208+
</layout>
209+
</item>
210+
</layout>
211+
</widget>
212+
</item>
213+
</layout>
214+
</widget>
215+
<customwidgets>
216+
<customwidget>
217+
<class>QgsColorButton</class>
218+
<extends>QToolButton</extends>
219+
<header>qgscolorbutton.h</header>
220+
</customwidget>
221+
</customwidgets>
222+
<resources/>
223+
<connections/>
224+
</ui>

0 commit comments

Comments
 (0)
Please sign in to comment.