From dc5d7ab985adfc4848de25d50b51dbd8022fb285 Mon Sep 17 00:00:00 2001 From: nirvn <nirvn.asia@gmail.com> Date: Tue, 5 Apr 2016 15:05:55 +0700 Subject: [PATCH] [diagram] make use of unit widget for diagram size --- python/core/qgsdiagramrendererv2.sip | 13 ++++----- src/app/qgsdiagramproperties.cpp | 18 ++++-------- src/core/diagram/qgsdiagram.cpp | 24 ++++------------ src/core/qgsdiagramrendererv2.cpp | 41 ++++++++++++++++------------ src/core/qgsdiagramrendererv2.h | 11 ++++++-- src/ui/qgsdiagrampropertiesbase.ui | 17 ++++++++++-- tests/src/core/testqgsdiagram.cpp | 4 +-- 7 files changed, 67 insertions(+), 61 deletions(-) diff --git a/python/core/qgsdiagramrendererv2.sip b/python/core/qgsdiagramrendererv2.sip index ca618f445c1..7a92eb1717b 100644 --- a/python/core/qgsdiagramrendererv2.sip +++ b/python/core/qgsdiagramrendererv2.sip @@ -289,14 +289,13 @@ class QgsDiagramSettings //! @note added in 2.10 QList< QString > categoryLabels; QSizeF size; //size - SizeType sizeType; //mm or map units - /** Line unit index (mm, map units, or pixels) - * @note added in 2.16 - */ + //! Diagram size unit index (mm, map units, or pixels) + QgsSymbolV2::OutputUnit sizeType; + //! Diagram size unit scale + QgsMapUnitScale sizeScale; + //! Line unit index (mm, map units, or pixels) QgsSymbolV2::OutputUnit lineSizeType; - /** Line unit scale - * @note added in 2.16 - */ + //! Line unit scale QgsMapUnitScale lineSizeScale; QColor backgroundColor; QColor penColor; diff --git a/src/app/qgsdiagramproperties.cpp b/src/app/qgsdiagramproperties.cpp index 3bca62a13ac..aa23849fd87 100644 --- a/src/app/qgsdiagramproperties.cpp +++ b/src/app/qgsdiagramproperties.cpp @@ -84,8 +84,7 @@ QgsDiagramProperties::QgsDiagramProperties( QgsVectorLayer* layer, QWidget* pare mMaxValueSpinBox->setShowClearButton( false ); - mDiagramUnitComboBox->insertItem( 0, tr( "mm" ), QgsDiagramSettings::MM ); - mDiagramUnitComboBox->insertItem( 1, tr( "Map units" ), QgsDiagramSettings::MapUnits ); + mDiagramUnitComboBox->setUnits( QgsSymbolV2::OutputUnitList() << QgsSymbolV2::MM << QgsSymbolV2::MapUnit << QgsSymbolV2::Pixel ); mDiagramLineUnitComboBox->setUnits( QgsSymbolV2::OutputUnitList() << QgsSymbolV2::MM << QgsSymbolV2::MapUnit << QgsSymbolV2::Pixel ); QGis::GeometryType layerType = layer->geometryType(); @@ -193,7 +192,7 @@ QgsDiagramProperties::QgsDiagramProperties( QgsVectorLayer* layer, QWidget* pare mDiagramTypeFrame->setEnabled( false ); mDiagramFrame->setEnabled( false ); mFixedSizeRadio->setChecked( true ); - mDiagramUnitComboBox->setCurrentIndex( mDiagramUnitComboBox->findText( tr( "mm" ) ) ); + mDiagramUnitComboBox->setUnit( QgsSymbolV2::MM ); mDiagramLineUnitComboBox->setUnit( QgsSymbolV2::MM ); mLabelPlacementComboBox->setCurrentIndex( mLabelPlacementComboBox->findText( tr( "x-height" ) ) ); mDiagramSizeSpinBox->setEnabled( true ); @@ -265,14 +264,8 @@ QgsDiagramProperties::QgsDiagramProperties( QgsVectorLayer* layer, QWidget* pare mScaleRangeWidget->setScaleRange( 1.0 / ( settingList.at( 0 ).maxScaleDenominator > 0 ? settingList.at( 0 ).maxScaleDenominator : layer->maximumScale() ), 1.0 / ( settingList.at( 0 ).minScaleDenominator > 0 ? settingList.at( 0 ).minScaleDenominator : layer->minimumScale() ) ); mScaleVisibilityGroupBox->setChecked( settingList.at( 0 ).scaleBasedVisibility ); - if ( settingList.at( 0 ).sizeType == QgsDiagramSettings::MM ) - { - mDiagramUnitComboBox->setCurrentIndex( 0 ); - } - else - { - mDiagramUnitComboBox->setCurrentIndex( 1 ); - } + mDiagramUnitComboBox->setUnit( settingList.at( 0 ).sizeType ); + mDiagramUnitComboBox->setMapUnitScale( settingList.at( 0 ).sizeScale ); mDiagramLineUnitComboBox->setUnit( settingList.at( 0 ).lineSizeType ); mDiagramLineUnitComboBox->setMapUnitScale( settingList.at( 0 ).lineSizeScale ); @@ -704,7 +697,8 @@ void QgsDiagramProperties::apply() ds.categoryAttributes = categoryAttributes; ds.categoryLabels = categoryLabels; ds.size = QSizeF( mDiagramSizeSpinBox->value(), mDiagramSizeSpinBox->value() ); - ds.sizeType = static_cast<QgsDiagramSettings::SizeType>( mDiagramUnitComboBox->itemData( mDiagramUnitComboBox->currentIndex() ).toInt() ); + ds.sizeType = mDiagramUnitComboBox->unit(); + ds.sizeScale = mDiagramUnitComboBox->getMapUnitScale(); ds.lineSizeType = mDiagramLineUnitComboBox->unit(); ds.lineSizeScale = mDiagramLineUnitComboBox->getMapUnitScale(); ds.labelPlacementMethod = static_cast<QgsDiagramSettings::LabelPlacementMethod>( mLabelPlacementComboBox->itemData( mLabelPlacementComboBox->currentIndex() ).toInt() ); diff --git a/src/core/diagram/qgsdiagram.cpp b/src/core/diagram/qgsdiagram.cpp index c5e077e0e7e..22d76a78407 100644 --- a/src/core/diagram/qgsdiagram.cpp +++ b/src/core/diagram/qgsdiagram.cpp @@ -76,38 +76,24 @@ void QgsDiagram::setPenWidth( QPen& pen, const QgsDiagramSettings& s, const QgsR QSizeF QgsDiagram::sizePainterUnits( QSizeF size, const QgsDiagramSettings& s, const QgsRenderContext& c ) { - if ( s.sizeType == QgsDiagramSettings::MM ) - { - return QSizeF( size.width() * c.scaleFactor(), size.height() * c.scaleFactor() ); - } - else - { - return QSizeF( size.width() / c.mapToPixel().mapUnitsPerPixel(), size.height() / c.mapToPixel().mapUnitsPerPixel() ); - } + return QSizeF( QgsSymbolLayerV2Utils::convertToPainterUnits( c, size.width(), s.sizeType, s.sizeScale ), QgsSymbolLayerV2Utils::convertToPainterUnits( c, size.height(), s.sizeType, s.sizeScale ) ); } float QgsDiagram::sizePainterUnits( float l, const QgsDiagramSettings& s, const QgsRenderContext& c ) { - if ( s.sizeType == QgsDiagramSettings::MM ) - { - return l * c.scaleFactor(); - } - else - { - return l / c.mapToPixel().mapUnitsPerPixel(); - } + return QgsSymbolLayerV2Utils::convertToPainterUnits( c, l, s.sizeType, s.sizeScale ); } QFont QgsDiagram::scaledFont( const QgsDiagramSettings& s, const QgsRenderContext& c ) { QFont f = s.font; - if ( s.sizeType == QgsDiagramSettings::MM ) + if ( s.sizeType == QgsSymbolV2::MapUnit ) { - f.setPixelSize( s.font.pointSizeF() * 0.376 * c.scaleFactor() ); + f.setPixelSize( s.font.pointSizeF() / c.mapToPixel().mapUnitsPerPixel() ); } else { - f.setPixelSize( s.font.pointSizeF() / c.mapToPixel().mapUnitsPerPixel() ); + f.setPixelSize( s.font.pointSizeF() * 0.376 * c.scaleFactor() ); } return f; diff --git a/src/core/qgsdiagramrendererv2.cpp b/src/core/qgsdiagramrendererv2.cpp index df4714c21f5..d018e4bcd27 100644 --- a/src/core/qgsdiagramrendererv2.cpp +++ b/src/core/qgsdiagramrendererv2.cpp @@ -181,17 +181,19 @@ void QgsDiagramSettings::readXML( const QDomElement& elem, const QgsVectorLayer* scaleBasedVisibility = minScaleDenominator >= 0 && maxScaleDenominator >= 0; } - //mm vs map units for diagram - if ( elem.attribute( "sizeType" ) == "MM" ) + //diagram size unit type and scale + if ( elem.attribute( "sizeType" ) == "MapUnits" ) { - sizeType = MM; + //compatibility with pre-2.16 project files + sizeType = QgsSymbolV2::MapUnit; } else { - sizeType = MapUnits; + sizeType = QgsSymbolLayerV2Utils::decodeOutputUnit( elem.attribute( "sizeType" ) ); } + sizeScale = QgsSymbolLayerV2Utils::decodeMapUnitScale( elem.attribute( "sizeScale" ) ); - //mm vs map units for line + //line width unit type and scale lineSizeType = QgsSymbolLayerV2Utils::decodeOutputUnit( elem.attribute( "lineSizeType" ) ); lineSizeScale = QgsSymbolLayerV2Utils::decodeMapUnitScale( elem.attribute( "lineSizeScale" ) ); @@ -303,17 +305,11 @@ void QgsDiagramSettings::writeXML( QDomElement& rendererElem, QDomDocument& doc, categoryElem.setAttribute( "maxScaleDenominator", QString::number( maxScaleDenominator ) ); categoryElem.setAttribute( "transparency", QString::number( transparency ) ); - // site type (mm vs. map units) for diagram - if ( sizeType == MM ) - { - categoryElem.setAttribute( "sizeType", "MM" ); - } - else - { - categoryElem.setAttribute( "sizeType", "MapUnits" ); - } + //diagram size unit type and scale + categoryElem.setAttribute( "sizeType", QgsSymbolLayerV2Utils::encodeOutputUnit( sizeType ) ); + categoryElem.setAttribute( "sizeScale", QgsSymbolLayerV2Utils::encodeMapUnitScale( sizeScale ) ); - // site type (mm vs. map units) for line + //line width unit type and scale categoryElem.setAttribute( "lineSizeType", QgsSymbolLayerV2Utils::encodeOutputUnit( lineSizeType ) ); categoryElem.setAttribute( "lineSizeScale", QgsSymbolLayerV2Utils::encodeMapUnitScale( lineSizeScale ) ); @@ -425,9 +421,20 @@ QSizeF QgsDiagramRendererV2::sizeMapUnits( const QgsFeature& feature, const QgsR } QSizeF size = diagramSize( feature, c ); - if ( s.sizeType == QgsDiagramSettings::MM ) + if ( size.isValid() ) { - convertSizeToMapUnits( size, c ); + if ( s.sizeType == QgsSymbolV2::MM ) + { + double pixelToMap = c.scaleFactor() * c.mapToPixel().mapUnitsPerPixel(); + size.rwidth() *= pixelToMap; + size.rheight() *= pixelToMap; + } + else if ( s.sizeType == QgsSymbolV2::Pixel ) + { + double pixelToMap = c.mapToPixel().mapUnitsPerPixel(); + size.rwidth() *= pixelToMap; + size.rheight() *= pixelToMap; + } } return size; } diff --git a/src/core/qgsdiagramrendererv2.h b/src/core/qgsdiagramrendererv2.h index 23551d7a09e..0953533963d 100644 --- a/src/core/qgsdiagramrendererv2.h +++ b/src/core/qgsdiagramrendererv2.h @@ -321,7 +321,7 @@ class CORE_EXPORT QgsDiagramSettings QgsDiagramSettings() : enabled( true ) - , sizeType( MM ) + , sizeType( QgsSymbolV2::MM ) , lineSizeType( QgsSymbolV2::MM ) , penWidth( 0.0 ) , labelPlacementMethod( QgsDiagramSettings::Height ) @@ -342,7 +342,14 @@ class CORE_EXPORT QgsDiagramSettings //! @note added in 2.10 QList< QString > categoryLabels; QSizeF size; //size - SizeType sizeType; //mm or map units + /** Diagram size unit index (mm, map units, or pixels) + * @note added in 2.16 + */ + QgsSymbolV2::OutputUnit sizeType; + /** Diagram size unit scale + * @note added in 2.16 + */ + QgsMapUnitScale sizeScale; /** Line unit index (mm, map units, or pixels) * @note added in 2.16 */ diff --git a/src/ui/qgsdiagrampropertiesbase.ui b/src/ui/qgsdiagrampropertiesbase.ui index f40c42a0693..1821b5a56f7 100644 --- a/src/ui/qgsdiagrampropertiesbase.ui +++ b/src/ui/qgsdiagrampropertiesbase.ui @@ -702,7 +702,10 @@ <item row="1" column="1"> <widget class="QgsDoubleSpinBox" name="mBarWidthSpinBox"> <property name="minimum"> - <double>0.010000000000000</double> + <double>0.00000000000000</double> + </property> + <property name="maximum"> + <double>99999999.99000000000</double> </property> <property name="value"> <double>5.000000000000000</double> @@ -1006,7 +1009,17 @@ </widget> </item> <item row="0" column="1"> - <widget class="QComboBox" name="mDiagramUnitComboBox"/> + <widget class="QgsUnitSelectionWidget" name="mDiagramUnitComboBox" native="true"> + <property name="minimumSize"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + <property name="focusPolicy"> + <enum>Qt::StrongFocus</enum> + </property> + </widget> </item> <item row="4" column="0"> <spacer name="verticalSpacer_3"> diff --git a/tests/src/core/testqgsdiagram.cpp b/tests/src/core/testqgsdiagram.cpp index 137e5f2b9c2..5426aa50c28 100644 --- a/tests/src/core/testqgsdiagram.cpp +++ b/tests/src/core/testqgsdiagram.cpp @@ -144,7 +144,7 @@ class TestQgsDiagram : public QObject ds.penColor = Qt::green; ds.penWidth = .5; ds.scaleByArea = true; - ds.sizeType = QgsDiagramSettings::MM; + ds.sizeType = QgsSymbolV2::MM; ds.size = QSizeF( 5, 5 ); ds.angleOffset = 0; @@ -181,7 +181,7 @@ class TestQgsDiagram : public QObject ds.penColor = Qt::green; ds.penWidth = .5; ds.scaleByArea = true; - ds.sizeType = QgsDiagramSettings::MM; + ds.sizeType = QgsSymbolV2::MM; ds.size = QSizeF( 5, 5 ); ds.angleOffset = 0;