1
/***************************************************************************
3
Smart labeling for vector layers
6
copyright : (C) Martin Dobias
7
email : wonder.sk at gmail.com
9
***************************************************************************
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. *
16
***************************************************************************/
18
#include "labelinggui.h"
20
#include <qgsvectorlayer.h>
21
#include <qgsvectordataprovider.h>
22
#include <qgsmaplayerregistry.h>
24
#include "pallabeling.h"
25
#include "engineconfigdialog.h"
27
#include <QColorDialog>
28
#include <QFontDialog>
31
#include <QApplication>
35
LabelingGui::LabelingGui( PalLabeling* lbl, QgsVectorLayer* layer, QWidget* parent )
36
: QDialog( parent ), mLBL( lbl ), mLayer( layer )
40
connect( btnTextColor, SIGNAL( clicked() ), this, SLOT( changeTextColor() ) );
41
connect( btnChangeFont, SIGNAL( clicked() ), this, SLOT( changeTextFont() ) );
42
connect( chkBuffer, SIGNAL( toggled( bool ) ), this, SLOT( updatePreview() ) );
43
connect( btnBufferColor, SIGNAL( clicked() ), this, SLOT( changeBufferColor() ) );
44
connect( spinBufferSize, SIGNAL( valueChanged( int ) ), this, SLOT( updatePreview() ) );
45
connect( btnEngineSettings, SIGNAL( clicked() ), this, SLOT( showEngineConfigDialog() ) );
47
// set placement methods page based on geometry type
48
switch ( layer->geometryType() )
51
stackedPlacement->setCurrentWidget( pagePoint );
54
stackedPlacement->setCurrentWidget( pageLine );
57
stackedPlacement->setCurrentWidget( pagePolygon );
60
Q_ASSERT( 0 && "NOOOO!" );
63
chkMergeLines->setEnabled( layer->geometryType() == QGis::Line );
67
// load labeling settings from layer
69
lyr.readFromLayer( layer );
72
switch ( lyr.placement )
74
case LayerSettings::AroundPoint:
75
radAroundPoint->setChecked( true );
76
radAroundCentroid->setChecked( true );
77
spinDistPoint->setValue( lyr.dist );
78
//spinAngle->setValue(lyr.angle);
80
case LayerSettings::OverPoint:
81
radOverPoint->setChecked( true );
82
radOverCentroid->setChecked( true );
84
case LayerSettings::Line:
85
radLineParallel->setChecked( true );
86
radPolygonPerimeter->setChecked( true );
88
case LayerSettings::Curved:
89
radLineCurved->setChecked( true );
91
case LayerSettings::Horizontal:
92
radPolygonHorizontal->setChecked( true );
93
radLineHorizontal->setChecked( true );
95
case LayerSettings::Free:
96
radPolygonFree->setChecked( true );
99
Q_ASSERT( 0 && "NOOO!" );
102
if ( lyr.placement == LayerSettings::Line || lyr.placement == LayerSettings::Curved )
104
spinDistLine->setValue( lyr.dist );
105
chkLineAbove->setChecked( lyr.placementFlags & LayerSettings::AboveLine );
106
chkLineBelow->setChecked( lyr.placementFlags & LayerSettings::BelowLine );
107
chkLineOn->setChecked( lyr.placementFlags & LayerSettings::OnLine );
108
if ( lyr.placementFlags & LayerSettings::MapOrientation )
109
radOrientationMap->setChecked( true );
111
radOrientationLine->setChecked( true );
114
cboFieldName->setCurrentIndex( cboFieldName->findText( lyr.fieldName ) );
115
chkEnableLabeling->setChecked( lyr.enabled );
116
sliderPriority->setValue( lyr.priority );
117
chkNoObstacle->setChecked( !lyr.obstacle );
118
chkLabelPerFeaturePart->setChecked( lyr.labelPerPart );
119
chkMergeLines->setChecked( lyr.mergeLines );
121
bool scaleBased = ( lyr.scaleMin != 0 && lyr.scaleMax != 0 );
122
chkScaleBasedVisibility->setChecked( scaleBased );
125
spinScaleMin->setValue( lyr.scaleMin );
126
spinScaleMax->setValue( lyr.scaleMax );
129
bool buffer = ( lyr.bufferSize != 0 );
130
chkBuffer->setChecked( buffer );
132
spinBufferSize->setValue( lyr.bufferSize );
134
btnTextColor->setColor( lyr.textColor );
135
btnBufferColor->setColor( lyr.bufferColor );
136
updateFont( lyr.textFont );
141
connect( chkBuffer, SIGNAL( toggled( bool ) ), this, SLOT( updateUi() ) );
142
connect( chkScaleBasedVisibility, SIGNAL( toggled( bool ) ), this, SLOT( updateUi() ) );
144
// setup connection to changes in the placement
145
QRadioButton* placementRadios[] =
147
radAroundPoint, radOverPoint, // point
148
radLineParallel, radLineCurved, radLineHorizontal, // line
149
radAroundCentroid, radPolygonHorizontal, radPolygonFree, radPolygonPerimeter // polygon
151
for ( unsigned int i = 0; i < sizeof( placementRadios ) / sizeof( QRadioButton* ); i++ )
152
connect( placementRadios[i], SIGNAL( toggled( bool ) ), this, SLOT( updateOptions() ) );
155
LabelingGui::~LabelingGui()
159
LayerSettings LabelingGui::layerSettings()
162
lyr.fieldName = cboFieldName->currentText();
165
lyr.placementFlags = 0;
167
if (( stackedPlacement->currentWidget() == pagePoint && radAroundPoint->isChecked() )
168
|| ( stackedPlacement->currentWidget() == pagePolygon && radAroundCentroid->isChecked() ) )
170
lyr.placement = LayerSettings::AroundPoint;
171
lyr.dist = spinDistPoint->value();
172
//lyr.angle = spinAngle->value();
174
else if (( stackedPlacement->currentWidget() == pagePoint && radOverPoint->isChecked() )
175
|| ( stackedPlacement->currentWidget() == pagePolygon && radOverCentroid->isChecked() ) )
177
lyr.placement = LayerSettings::OverPoint;
179
else if (( stackedPlacement->currentWidget() == pageLine && radLineParallel->isChecked() )
180
|| ( stackedPlacement->currentWidget() == pagePolygon && radPolygonPerimeter->isChecked() )
181
|| ( stackedPlacement->currentWidget() == pageLine && radLineCurved->isChecked() ) )
183
bool curved = ( stackedPlacement->currentWidget() == pageLine && radLineCurved->isChecked() );
184
lyr.placement = ( curved ? LayerSettings::Curved : LayerSettings::Line );
185
lyr.dist = spinDistLine->value();
186
if ( chkLineAbove->isChecked() )
187
lyr.placementFlags |= LayerSettings::AboveLine;
188
if ( chkLineBelow->isChecked() )
189
lyr.placementFlags |= LayerSettings::BelowLine;
190
if ( chkLineOn->isChecked() )
191
lyr.placementFlags |= LayerSettings::OnLine;
193
if ( radOrientationMap->isChecked() )
194
lyr.placementFlags |= LayerSettings::MapOrientation;
196
else if (( stackedPlacement->currentWidget() == pageLine && radLineHorizontal->isChecked() )
197
|| ( stackedPlacement->currentWidget() == pagePolygon && radPolygonHorizontal->isChecked() ) )
199
lyr.placement = LayerSettings::Horizontal;
201
else if ( radPolygonFree->isChecked() )
203
lyr.placement = LayerSettings::Free;
206
Q_ASSERT( 0 && "NOOO!" );
209
lyr.textColor = btnTextColor->color();
210
lyr.textFont = lblFontPreview->font();
211
lyr.enabled = chkEnableLabeling->isChecked();
212
lyr.priority = sliderPriority->value();
213
lyr.obstacle = !chkNoObstacle->isChecked();
214
lyr.labelPerPart = chkLabelPerFeaturePart->isChecked();
215
lyr.mergeLines = chkMergeLines->isChecked();
216
if ( chkScaleBasedVisibility->isChecked() )
218
lyr.scaleMin = spinScaleMin->value();
219
lyr.scaleMax = spinScaleMax->value();
223
lyr.scaleMin = lyr.scaleMax = 0;
225
if ( chkBuffer->isChecked() )
227
lyr.bufferSize = spinBufferSize->value();
228
lyr.bufferColor = btnBufferColor->color();
239
void LabelingGui::populateFieldNames()
241
QgsFieldMap fields = mLayer->dataProvider()->fields();
242
for ( QgsFieldMap::iterator it = fields.begin(); it != fields.end(); it++ )
244
cboFieldName->addItem( it->name() );
248
void LabelingGui::changeTextColor()
250
QColor color = QColorDialog::getColor( btnTextColor->color(), this );
251
if ( !color.isValid() )
254
btnTextColor->setColor( color );
258
void LabelingGui::changeTextFont()
261
QFont font = QFontDialog::getFont( &ok, lblFontPreview->font(), this );
266
void LabelingGui::updateFont( QFont font )
268
lblFontName->setText( QString( "%1, %2" ).arg( font.family() ).arg( font.pointSize() ) );
269
lblFontPreview->setFont( font );
274
void LabelingGui::updatePreview()
276
lblFontPreview->setTextColor( btnTextColor->color() );
277
if ( chkBuffer->isChecked() )
278
lblFontPreview->setBuffer( spinBufferSize->value(), btnBufferColor->color() );
280
lblFontPreview->setBuffer( 0, Qt::white );
283
void LabelingGui::showEngineConfigDialog()
285
EngineConfigDialog dlg( mLBL, this );
289
void LabelingGui::updateUi()
291
// enable/disable scale-based, buffer
292
bool buf = chkBuffer->isChecked();
293
spinBufferSize->setEnabled( buf );
294
btnBufferColor->setEnabled( buf );
296
bool scale = chkScaleBasedVisibility->isChecked();
297
spinScaleMin->setEnabled( scale );
298
spinScaleMax->setEnabled( scale );
301
void LabelingGui::changeBufferColor()
303
QColor color = QColorDialog::getColor( btnBufferColor->color(), this );
304
if ( !color.isValid() )
307
btnBufferColor->setColor( color );
311
void LabelingGui::updateOptions()
313
if (( stackedPlacement->currentWidget() == pagePoint && radAroundPoint->isChecked() )
314
|| ( stackedPlacement->currentWidget() == pagePolygon && radAroundCentroid->isChecked() ) )
316
stackedOptions->setCurrentWidget( pageOptionsPoint );
318
else if (( stackedPlacement->currentWidget() == pageLine && radLineParallel->isChecked() )
319
|| ( stackedPlacement->currentWidget() == pagePolygon && radPolygonPerimeter->isChecked() )
320
|| ( stackedPlacement->currentWidget() == pageLine && radLineCurved->isChecked() ) )
322
stackedOptions->setCurrentWidget( pageOptionsLine );
326
stackedOptions->setCurrentWidget( pageOptionsEmpty );