Skip to content

Commit fe54a78

Browse files
committedApr 5, 2016
Merge pull request #2974 from nirvn/diagram_line_unit
[diagram] add unit type setting for outlines (fixes #14614)
2 parents 410a438 + dc5d7ab commit fe54a78

File tree

7 files changed

+120
-62
lines changed

7 files changed

+120
-62
lines changed
 

‎python/core/qgsdiagramrendererv2.sip‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,14 @@ class QgsDiagramSettings
289289
//! @note added in 2.10
290290
QList< QString > categoryLabels;
291291
QSizeF size; //size
292-
SizeType sizeType; //mm or map units
292+
//! Diagram size unit index (mm, map units, or pixels)
293+
QgsSymbolV2::OutputUnit sizeType;
294+
//! Diagram size unit scale
295+
QgsMapUnitScale sizeScale;
296+
//! Line unit index (mm, map units, or pixels)
297+
QgsSymbolV2::OutputUnit lineSizeType;
298+
//! Line unit scale
299+
QgsMapUnitScale lineSizeScale;
293300
QColor backgroundColor;
294301
QColor penColor;
295302
double penWidth;

‎src/app/qgsdiagramproperties.cpp‎

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,8 @@ QgsDiagramProperties::QgsDiagramProperties( QgsVectorLayer* layer, QWidget* pare
8484

8585
mMaxValueSpinBox->setShowClearButton( false );
8686

87-
mDiagramUnitComboBox->insertItem( 0, tr( "mm" ), QgsDiagramSettings::MM );
88-
mDiagramUnitComboBox->insertItem( 1, tr( "Map units" ), QgsDiagramSettings::MapUnits );
87+
mDiagramUnitComboBox->setUnits( QgsSymbolV2::OutputUnitList() << QgsSymbolV2::MM << QgsSymbolV2::MapUnit << QgsSymbolV2::Pixel );
88+
mDiagramLineUnitComboBox->setUnits( QgsSymbolV2::OutputUnitList() << QgsSymbolV2::MM << QgsSymbolV2::MapUnit << QgsSymbolV2::Pixel );
8989

9090
QGis::GeometryType layerType = layer->geometryType();
9191
if ( layerType == QGis::UnknownGeometry || layerType == QGis::NoGeometry )
@@ -192,7 +192,8 @@ QgsDiagramProperties::QgsDiagramProperties( QgsVectorLayer* layer, QWidget* pare
192192
mDiagramTypeFrame->setEnabled( false );
193193
mDiagramFrame->setEnabled( false );
194194
mFixedSizeRadio->setChecked( true );
195-
mDiagramUnitComboBox->setCurrentIndex( mDiagramUnitComboBox->findText( tr( "mm" ) ) );
195+
mDiagramUnitComboBox->setUnit( QgsSymbolV2::MM );
196+
mDiagramLineUnitComboBox->setUnit( QgsSymbolV2::MM );
196197
mLabelPlacementComboBox->setCurrentIndex( mLabelPlacementComboBox->findText( tr( "x-height" ) ) );
197198
mDiagramSizeSpinBox->setEnabled( true );
198199
mDiagramSizeSpinBox->setValue( 15 );
@@ -263,14 +264,10 @@ QgsDiagramProperties::QgsDiagramProperties( QgsVectorLayer* layer, QWidget* pare
263264
mScaleRangeWidget->setScaleRange( 1.0 / ( settingList.at( 0 ).maxScaleDenominator > 0 ? settingList.at( 0 ).maxScaleDenominator : layer->maximumScale() ),
264265
1.0 / ( settingList.at( 0 ).minScaleDenominator > 0 ? settingList.at( 0 ).minScaleDenominator : layer->minimumScale() ) );
265266
mScaleVisibilityGroupBox->setChecked( settingList.at( 0 ).scaleBasedVisibility );
266-
if ( settingList.at( 0 ).sizeType == QgsDiagramSettings::MM )
267-
{
268-
mDiagramUnitComboBox->setCurrentIndex( 0 );
269-
}
270-
else
271-
{
272-
mDiagramUnitComboBox->setCurrentIndex( 1 );
273-
}
267+
mDiagramUnitComboBox->setUnit( settingList.at( 0 ).sizeType );
268+
mDiagramUnitComboBox->setMapUnitScale( settingList.at( 0 ).sizeScale );
269+
mDiagramLineUnitComboBox->setUnit( settingList.at( 0 ).lineSizeType );
270+
mDiagramLineUnitComboBox->setMapUnitScale( settingList.at( 0 ).lineSizeScale );
274271

275272
if ( settingList.at( 0 ).labelPlacementMethod == QgsDiagramSettings::Height )
276273
{
@@ -700,7 +697,10 @@ void QgsDiagramProperties::apply()
700697
ds.categoryAttributes = categoryAttributes;
701698
ds.categoryLabels = categoryLabels;
702699
ds.size = QSizeF( mDiagramSizeSpinBox->value(), mDiagramSizeSpinBox->value() );
703-
ds.sizeType = static_cast<QgsDiagramSettings::SizeType>( mDiagramUnitComboBox->itemData( mDiagramUnitComboBox->currentIndex() ).toInt() );
700+
ds.sizeType = mDiagramUnitComboBox->unit();
701+
ds.sizeScale = mDiagramUnitComboBox->getMapUnitScale();
702+
ds.lineSizeType = mDiagramLineUnitComboBox->unit();
703+
ds.lineSizeScale = mDiagramLineUnitComboBox->getMapUnitScale();
704704
ds.labelPlacementMethod = static_cast<QgsDiagramSettings::LabelPlacementMethod>( mLabelPlacementComboBox->itemData( mLabelPlacementComboBox->currentIndex() ).toInt() );
705705
ds.scaleByArea = mScaleDependencyComboBox->itemData( mScaleDependencyComboBox->currentIndex() ).toBool();
706706

‎src/core/diagram/qgsdiagram.cpp‎

Lines changed: 6 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -70,51 +70,30 @@ QgsExpression *QgsDiagram::getExpression( const QString &expression, const QgsEx
7070

7171
void QgsDiagram::setPenWidth( QPen& pen, const QgsDiagramSettings& s, const QgsRenderContext& c )
7272
{
73-
if ( s.sizeType == QgsDiagramSettings::MM )
74-
{
75-
pen.setWidthF( s.penWidth * c.scaleFactor() );
76-
}
77-
else
78-
{
79-
pen.setWidthF( s.penWidth / c.mapToPixel().mapUnitsPerPixel() );
80-
}
73+
pen.setWidthF( QgsSymbolLayerV2Utils::convertToPainterUnits( c, s.penWidth, s.lineSizeType, s.lineSizeScale ) );
8174
}
8275

8376

8477
QSizeF QgsDiagram::sizePainterUnits( QSizeF size, const QgsDiagramSettings& s, const QgsRenderContext& c )
8578
{
86-
if ( s.sizeType == QgsDiagramSettings::MM )
87-
{
88-
return QSizeF( size.width() * c.scaleFactor(), size.height() * c.scaleFactor() );
89-
}
90-
else
91-
{
92-
return QSizeF( size.width() / c.mapToPixel().mapUnitsPerPixel(), size.height() / c.mapToPixel().mapUnitsPerPixel() );
93-
}
79+
return QSizeF( QgsSymbolLayerV2Utils::convertToPainterUnits( c, size.width(), s.sizeType, s.sizeScale ), QgsSymbolLayerV2Utils::convertToPainterUnits( c, size.height(), s.sizeType, s.sizeScale ) );
9480
}
9581

9682
float QgsDiagram::sizePainterUnits( float l, const QgsDiagramSettings& s, const QgsRenderContext& c )
9783
{
98-
if ( s.sizeType == QgsDiagramSettings::MM )
99-
{
100-
return l * c.scaleFactor();
101-
}
102-
else
103-
{
104-
return l / c.mapToPixel().mapUnitsPerPixel();
105-
}
84+
return QgsSymbolLayerV2Utils::convertToPainterUnits( c, l, s.sizeType, s.sizeScale );
10685
}
10786

10887
QFont QgsDiagram::scaledFont( const QgsDiagramSettings& s, const QgsRenderContext& c )
10988
{
11089
QFont f = s.font;
111-
if ( s.sizeType == QgsDiagramSettings::MM )
90+
if ( s.sizeType == QgsSymbolV2::MapUnit )
11291
{
113-
f.setPixelSize( s.font.pointSizeF() * 0.376 * c.scaleFactor() );
92+
f.setPixelSize( s.font.pointSizeF() / c.mapToPixel().mapUnitsPerPixel() );
11493
}
11594
else
11695
{
117-
f.setPixelSize( s.font.pointSizeF() / c.mapToPixel().mapUnitsPerPixel() );
96+
f.setPixelSize( s.font.pointSizeF() * 0.376 * c.scaleFactor() );
11897
}
11998

12099
return f;

‎src/core/qgsdiagramrendererv2.cpp‎

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -181,15 +181,21 @@ void QgsDiagramSettings::readXML( const QDomElement& elem, const QgsVectorLayer*
181181
scaleBasedVisibility = minScaleDenominator >= 0 && maxScaleDenominator >= 0;
182182
}
183183

184-
//mm vs map units
185-
if ( elem.attribute( "sizeType" ) == "MM" )
184+
//diagram size unit type and scale
185+
if ( elem.attribute( "sizeType" ) == "MapUnits" )
186186
{
187-
sizeType = MM;
187+
//compatibility with pre-2.16 project files
188+
sizeType = QgsSymbolV2::MapUnit;
188189
}
189190
else
190191
{
191-
sizeType = MapUnits;
192+
sizeType = QgsSymbolLayerV2Utils::decodeOutputUnit( elem.attribute( "sizeType" ) );
192193
}
194+
sizeScale = QgsSymbolLayerV2Utils::decodeMapUnitScale( elem.attribute( "sizeScale" ) );
195+
196+
//line width unit type and scale
197+
lineSizeType = QgsSymbolLayerV2Utils::decodeOutputUnit( elem.attribute( "lineSizeType" ) );
198+
lineSizeScale = QgsSymbolLayerV2Utils::decodeMapUnitScale( elem.attribute( "lineSizeScale" ) );
193199

194200
//label placement method
195201
if ( elem.attribute( "labelPlacementMethod" ) == "Height" )
@@ -299,15 +305,13 @@ void QgsDiagramSettings::writeXML( QDomElement& rendererElem, QDomDocument& doc,
299305
categoryElem.setAttribute( "maxScaleDenominator", QString::number( maxScaleDenominator ) );
300306
categoryElem.setAttribute( "transparency", QString::number( transparency ) );
301307

302-
// site type (mm vs. map units)
303-
if ( sizeType == MM )
304-
{
305-
categoryElem.setAttribute( "sizeType", "MM" );
306-
}
307-
else
308-
{
309-
categoryElem.setAttribute( "sizeType", "MapUnits" );
310-
}
308+
//diagram size unit type and scale
309+
categoryElem.setAttribute( "sizeType", QgsSymbolLayerV2Utils::encodeOutputUnit( sizeType ) );
310+
categoryElem.setAttribute( "sizeScale", QgsSymbolLayerV2Utils::encodeMapUnitScale( sizeScale ) );
311+
312+
//line width unit type and scale
313+
categoryElem.setAttribute( "lineSizeType", QgsSymbolLayerV2Utils::encodeOutputUnit( lineSizeType ) );
314+
categoryElem.setAttribute( "lineSizeScale", QgsSymbolLayerV2Utils::encodeMapUnitScale( lineSizeScale ) );
311315

312316
// label placement method (text diagram)
313317
if ( labelPlacementMethod == Height )
@@ -417,9 +421,20 @@ QSizeF QgsDiagramRendererV2::sizeMapUnits( const QgsFeature& feature, const QgsR
417421
}
418422

419423
QSizeF size = diagramSize( feature, c );
420-
if ( s.sizeType == QgsDiagramSettings::MM )
424+
if ( size.isValid() )
421425
{
422-
convertSizeToMapUnits( size, c );
426+
if ( s.sizeType == QgsSymbolV2::MM )
427+
{
428+
double pixelToMap = c.scaleFactor() * c.mapToPixel().mapUnitsPerPixel();
429+
size.rwidth() *= pixelToMap;
430+
size.rheight() *= pixelToMap;
431+
}
432+
else if ( s.sizeType == QgsSymbolV2::Pixel )
433+
{
434+
double pixelToMap = c.mapToPixel().mapUnitsPerPixel();
435+
size.rwidth() *= pixelToMap;
436+
size.rheight() *= pixelToMap;
437+
}
423438
}
424439
return size;
425440
}

‎src/core/qgsdiagramrendererv2.h‎

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
#include "qgsfeature.h"
2626
#include "qgsexpressioncontext.h"
27+
#include "qgssymbollayerv2.h"
2728

2829
class QgsDiagram;
2930
class QgsDiagramRendererV2;
@@ -320,7 +321,8 @@ class CORE_EXPORT QgsDiagramSettings
320321

321322
QgsDiagramSettings()
322323
: enabled( true )
323-
, sizeType( MM )
324+
, sizeType( QgsSymbolV2::MM )
325+
, lineSizeType( QgsSymbolV2::MM )
324326
, penWidth( 0.0 )
325327
, labelPlacementMethod( QgsDiagramSettings::Height )
326328
, diagramOrientation( QgsDiagramSettings::Up )
@@ -340,7 +342,22 @@ class CORE_EXPORT QgsDiagramSettings
340342
//! @note added in 2.10
341343
QList< QString > categoryLabels;
342344
QSizeF size; //size
343-
SizeType sizeType; //mm or map units
345+
/** Diagram size unit index (mm, map units, or pixels)
346+
* @note added in 2.16
347+
*/
348+
QgsSymbolV2::OutputUnit sizeType;
349+
/** Diagram size unit scale
350+
* @note added in 2.16
351+
*/
352+
QgsMapUnitScale sizeScale;
353+
/** Line unit index (mm, map units, or pixels)
354+
* @note added in 2.16
355+
*/
356+
QgsSymbolV2::OutputUnit lineSizeType;
357+
/** Line unit scale
358+
* @note added in 2.16
359+
*/
360+
QgsMapUnitScale lineSizeScale;
344361
QColor backgroundColor;
345362
QColor penColor;
346363
double penWidth;

‎src/ui/qgsdiagrampropertiesbase.ui‎

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -702,7 +702,10 @@
702702
<item row="1" column="1">
703703
<widget class="QgsDoubleSpinBox" name="mBarWidthSpinBox">
704704
<property name="minimum">
705-
<double>0.010000000000000</double>
705+
<double>0.00000000000000</double>
706+
</property>
707+
<property name="maximum">
708+
<double>99999999.99000000000</double>
706709
</property>
707710
<property name="value">
708711
<double>5.000000000000000</double>
@@ -763,13 +766,33 @@
763766
</widget>
764767
</item>
765768
<item row="5" column="0">
769+
<widget class="QLabel" name="mPenWidthLabel">
770+
<property name="text">
771+
<string>Line Unit</string>
772+
</property>
773+
</widget>
774+
</item>
775+
<item row="5" column="1">
776+
<widget class="QgsUnitSelectionWidget" name="mDiagramLineUnitComboBox" native="true">
777+
<property name="minimumSize">
778+
<size>
779+
<width>0</width>
780+
<height>0</height>
781+
</size>
782+
</property>
783+
<property name="focusPolicy">
784+
<enum>Qt::StrongFocus</enum>
785+
</property>
786+
</widget>
787+
</item>
788+
<item row="6" column="0">
766789
<widget class="QLabel" name="mAngleOffsetLabel">
767790
<property name="text">
768791
<string>Start angle</string>
769792
</property>
770793
</widget>
771794
</item>
772-
<item row="5" column="1">
795+
<item row="6" column="1">
773796
<widget class="QComboBox" name="mAngleOffsetComboBox"/>
774797
</item>
775798
<item row="3" column="1">
@@ -986,7 +1009,17 @@
9861009
</widget>
9871010
</item>
9881011
<item row="0" column="1">
989-
<widget class="QComboBox" name="mDiagramUnitComboBox"/>
1012+
<widget class="QgsUnitSelectionWidget" name="mDiagramUnitComboBox" native="true">
1013+
<property name="minimumSize">
1014+
<size>
1015+
<width>0</width>
1016+
<height>0</height>
1017+
</size>
1018+
</property>
1019+
<property name="focusPolicy">
1020+
<enum>Qt::StrongFocus</enum>
1021+
</property>
1022+
</widget>
9901023
</item>
9911024
<item row="4" column="0">
9921025
<spacer name="verticalSpacer_3">
@@ -1839,6 +1872,12 @@
18391872
<extends>QWidget</extends>
18401873
<header>qgsscalerangewidget.h</header>
18411874
</customwidget>
1875+
<customwidget>
1876+
<class>QgsUnitSelectionWidget</class>
1877+
<extends>QWidget</extends>
1878+
<header>qgsunitselectionwidget.h</header>
1879+
<container>1</container>
1880+
</customwidget>
18421881
</customwidgets>
18431882
<tabstops>
18441883
<tabstop>mEnableDiagramsCheckBox</tabstop>
@@ -1858,6 +1897,7 @@
18581897
<tabstop>mBackgroundColorButton</tabstop>
18591898
<tabstop>mDiagramPenColorButton</tabstop>
18601899
<tabstop>mPenWidthSpinBox</tabstop>
1900+
<tabstop>mDiagramLineUnitComboBox</tabstop>
18611901
<tabstop>mAngleOffsetComboBox</tabstop>
18621902
<tabstop>mDiagramFontButton</tabstop>
18631903
<tabstop>mShowAllCheckBox</tabstop>

‎tests/src/core/testqgsdiagram.cpp‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ class TestQgsDiagram : public QObject
144144
ds.penColor = Qt::green;
145145
ds.penWidth = .5;
146146
ds.scaleByArea = true;
147-
ds.sizeType = QgsDiagramSettings::MM;
147+
ds.sizeType = QgsSymbolV2::MM;
148148
ds.size = QSizeF( 5, 5 );
149149
ds.angleOffset = 0;
150150

@@ -181,7 +181,7 @@ class TestQgsDiagram : public QObject
181181
ds.penColor = Qt::green;
182182
ds.penWidth = .5;
183183
ds.scaleByArea = true;
184-
ds.sizeType = QgsDiagramSettings::MM;
184+
ds.sizeType = QgsSymbolV2::MM;
185185
ds.size = QSizeF( 5, 5 );
186186
ds.angleOffset = 0;
187187

0 commit comments

Comments
 (0)
Please sign in to comment.