Skip to content

Commit

Permalink
Expose chart ranges options
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Jan 17, 2023
1 parent 60baa03 commit 054c459
Show file tree
Hide file tree
Showing 8 changed files with 280 additions and 6 deletions.
4 changes: 4 additions & 0 deletions python/core/auto_generated/layout/qgslayoutitem.sip.in
Expand Up @@ -263,6 +263,10 @@ Base class for graphical items within a :py:class:`QgsLayout`.
UndoElevationProfileElevationFormat,
UndoElevationProfileElevationFont,
UndoElevationProfileElevationLabels,
UndoElevationProfileMinimumDistance,
UndoElevationProfileMaximumDistance,
UndoElevationProfileMinimumElevation,
UndoElevationProfileMaximumElevation,

UndoCustomCommand,
};
Expand Down
4 changes: 4 additions & 0 deletions python/core/auto_generated/layout/qgslayoutobject.sip.in
Expand Up @@ -198,6 +198,10 @@ A base class for objects which belong to a layout.
ElevationProfileElevationMajorInterval,
ElevationProfileElevationMinorInterval,
ElevationProfileElevationLabelInterval,
ElevationProfileMinimumDistance,
ElevationProfileMaximumDistance,
ElevationProfileMinimumElevation,
ElevationProfileMaximumElevation,
};

enum PropertyValueType
Expand Down
4 changes: 4 additions & 0 deletions src/core/layout/qgslayoutitem.h
Expand Up @@ -314,6 +314,10 @@ class CORE_EXPORT QgsLayoutItem : public QgsLayoutObject, public QGraphicsRectIt
UndoElevationProfileElevationFormat, //!< Change elevation profile elevation axis number format
UndoElevationProfileElevationFont, //!< Change elevation profile elevation axis number font
UndoElevationProfileElevationLabels, //!< Change elevation profile elevation axis label interval
UndoElevationProfileMinimumDistance, //!< Change elevation profile minimum distance
UndoElevationProfileMaximumDistance, //!< Change elevation profile maximum distance
UndoElevationProfileMinimumElevation, //!< Change elevation profile minimum elevation
UndoElevationProfileMaximumElevation, //!< Change elevation profile maximum elevation

UndoCustomCommand, //!< Base id for plugin based item undo commands
};
Expand Down
80 changes: 80 additions & 0 deletions src/core/layout/qgslayoutitemelevationprofile.cpp
Expand Up @@ -85,6 +85,86 @@ void QgsLayoutItemElevationProfile::refreshDataDefinedProperty( DataDefinedPrope

bool forceUpdate = false;

if ( ( property == QgsLayoutObject::ElevationProfileMinimumDistance || property == QgsLayoutObject::AllProperties )
&& ( mDataDefinedProperties.isActive( QgsLayoutObject::ElevationProfileMinimumDistance ) ) )
{
double value = mPlot->xMinimum();

bool ok = false;
value = mDataDefinedProperties.valueAsDouble( QgsLayoutObject::ElevationProfileMinimumDistance, context, value, &ok );

if ( !ok )
{
QgsMessageLog::logMessage( tr( "Elevation profile minimum distance expression eval error" ) );
}
else
{
mPlot->setXMinimum( value );
}

forceUpdate = true;
}

if ( ( property == QgsLayoutObject::ElevationProfileMaximumDistance || property == QgsLayoutObject::AllProperties )
&& ( mDataDefinedProperties.isActive( QgsLayoutObject::ElevationProfileMaximumDistance ) ) )
{
double value = mPlot->xMaximum();

bool ok = false;
value = mDataDefinedProperties.valueAsDouble( QgsLayoutObject::ElevationProfileMaximumDistance, context, value, &ok );

if ( !ok )
{
QgsMessageLog::logMessage( tr( "Elevation profile maximum distance expression eval error" ) );
}
else
{
mPlot->setXMaximum( value );
}

forceUpdate = true;
}

if ( ( property == QgsLayoutObject::ElevationProfileMinimumElevation || property == QgsLayoutObject::AllProperties )
&& ( mDataDefinedProperties.isActive( QgsLayoutObject::ElevationProfileMinimumElevation ) ) )
{
double value = mPlot->yMinimum();

bool ok = false;
value = mDataDefinedProperties.valueAsDouble( QgsLayoutObject::ElevationProfileMinimumElevation, context, value, &ok );

if ( !ok )
{
QgsMessageLog::logMessage( tr( "Elevation profile minimum elevation expression eval error" ) );
}
else
{
mPlot->setYMinimum( value );
}

forceUpdate = true;
}

if ( ( property == QgsLayoutObject::ElevationProfileMaximumElevation || property == QgsLayoutObject::AllProperties )
&& ( mDataDefinedProperties.isActive( QgsLayoutObject::ElevationProfileMaximumElevation ) ) )
{
double value = mPlot->yMaximum();

bool ok = false;
value = mDataDefinedProperties.valueAsDouble( QgsLayoutObject::ElevationProfileMaximumElevation, context, value, &ok );

if ( !ok )
{
QgsMessageLog::logMessage( tr( "Elevation profile maximum elevation expression eval error" ) );
}
else
{
mPlot->setYMaximum( value );
}

forceUpdate = true;
}

if ( ( property == QgsLayoutObject::ElevationProfileDistanceMajorInterval || property == QgsLayoutObject::AllProperties )
&& ( mDataDefinedProperties.isActive( QgsLayoutObject::ElevationProfileDistanceMajorInterval ) ) )
{
Expand Down
8 changes: 8 additions & 0 deletions src/core/layout/qgslayoutobject.cpp
Expand Up @@ -115,6 +115,10 @@ void QgsLayoutObject::initPropertyDefinitions()
{ QgsLayoutObject::ElevationProfileElevationMajorInterval, QgsPropertyDefinition( "dataDefinedElevationProfileElevationMajorInterval", QObject::tr( "Major grid line interval" ), QgsPropertyDefinition::DoublePositive ) },
{ QgsLayoutObject::ElevationProfileElevationMinorInterval, QgsPropertyDefinition( "dataDefinedElevationProfileElevationMinorInterval", QObject::tr( "Minor grid line interval" ), QgsPropertyDefinition::DoublePositive ) },
{ QgsLayoutObject::ElevationProfileElevationLabelInterval, QgsPropertyDefinition( "dataDefinedElevationProfileElevationLabelInterval", QObject::tr( "Label interval" ), QgsPropertyDefinition::DoublePositive ) },
{ QgsLayoutObject::ElevationProfileMinimumDistance, QgsPropertyDefinition( "dataDefinedElevationProfileMinimumDistance", QObject::tr( "Minimum distance" ), QgsPropertyDefinition::DoublePositive ) },
{ QgsLayoutObject::ElevationProfileMaximumDistance, QgsPropertyDefinition( "dataDefinedElevationProfileMaximumDistance", QObject::tr( "Maximum distance" ), QgsPropertyDefinition::DoublePositive ) },
{ QgsLayoutObject::ElevationProfileMinimumElevation, QgsPropertyDefinition( "dataDefinedElevationProfileMinimumElevation", QObject::tr( "Minimum elevation" ), QgsPropertyDefinition::Double ) },
{ QgsLayoutObject::ElevationProfileMaximumElevation, QgsPropertyDefinition( "dataDefinedElevationProfileMaximumElevation", QObject::tr( "Maximum elevation" ), QgsPropertyDefinition::Double ) },
};
}

Expand Down Expand Up @@ -207,6 +211,10 @@ bool QgsLayoutObject::propertyAssociatesWithParentMultiframe( QgsLayoutObject::D
case QgsLayoutObject::ElevationProfileElevationMajorInterval:
case QgsLayoutObject::ElevationProfileElevationMinorInterval:
case QgsLayoutObject::ElevationProfileElevationLabelInterval:
case QgsLayoutObject::ElevationProfileMinimumDistance:
case QgsLayoutObject::ElevationProfileMaximumDistance:
case QgsLayoutObject::ElevationProfileMinimumElevation:
case QgsLayoutObject::ElevationProfileMaximumElevation:
return false;
}
return false;
Expand Down
4 changes: 4 additions & 0 deletions src/core/layout/qgslayoutobject.h
Expand Up @@ -226,6 +226,10 @@ class CORE_EXPORT QgsLayoutObject: public QObject, public QgsExpressionContextGe
ElevationProfileElevationMajorInterval, //!< Major grid line interval for elevation profile elevation axis (since QGIS 3.30)
ElevationProfileElevationMinorInterval, //!< Minor grid line interval for elevation profile elevation axis (since QGIS 3.30)
ElevationProfileElevationLabelInterval, //!< Label interval for elevation profile elevation axis (since QGIS 3.30)
ElevationProfileMinimumDistance, //!< Minimum distance value for elevation profile (since QGIS 3.30)
ElevationProfileMaximumDistance, //!< Maximum distance value for elevation profile (since QGIS 3.30)
ElevationProfileMinimumElevation, //!< Minimum elevation value for elevation profile (since QGIS 3.30)
ElevationProfileMaximumElevation, //!< Maximum elevation value for elevation profile (since QGIS 3.30)
};

/**
Expand Down
59 changes: 59 additions & 0 deletions src/gui/layout/qgslayoutelevationprofilewidget.cpp
Expand Up @@ -39,6 +39,52 @@ QgsLayoutElevationProfileWidget::QgsLayoutElevationProfileWidget( QgsLayoutItemE
mItemPropertiesWidget = new QgsLayoutItemPropertiesWidget( this, profile );
mainLayout->addWidget( mItemPropertiesWidget );

mSpinMinDistance->setClearValue( 0 );
connect( mSpinMinDistance, qOverload< double >( &QDoubleSpinBox::valueChanged ), this, [ = ]( double value )
{
if ( !mProfile || mBlockChanges )
return;

mProfile->beginCommand( tr( "Change Profile Chart Minimum Distance" ), QgsLayoutItem::UndoElevationProfileMinimumDistance );
mProfile->plot()->setXMinimum( value );
mProfile->update();
mProfile->endCommand();
} );

connect( mSpinMaxDistance, qOverload< double >( &QDoubleSpinBox::valueChanged ), this, [ = ]( double value )
{
if ( !mProfile || mBlockChanges )
return;

mProfile->beginCommand( tr( "Change Profile Chart Maximum Distance" ), QgsLayoutItem::UndoElevationProfileMaximumDistance );
mProfile->plot()->setXMaximum( value );
mProfile->update();
mProfile->endCommand();
} );

mSpinMinElevation->setClearValue( 0 );
connect( mSpinMinElevation, qOverload< double >( &QDoubleSpinBox::valueChanged ), this, [ = ]( double value )
{
if ( !mProfile || mBlockChanges )
return;

mProfile->beginCommand( tr( "Change Profile Chart Minimum Elevation" ), QgsLayoutItem::UndoElevationProfileMinimumElevation );
mProfile->plot()->setYMinimum( value );
mProfile->update();
mProfile->endCommand();
} );

connect( mSpinMaxElevation, qOverload< double >( &QDoubleSpinBox::valueChanged ), this, [ = ]( double value )
{
if ( !mProfile || mBlockChanges )
return;

mProfile->beginCommand( tr( "Change Profile Chart Maximum Elevation" ), QgsLayoutItem::UndoElevationProfileMaximumElevation );
mProfile->plot()->setYMaximum( value );
mProfile->update();
mProfile->endCommand();
} );

mDistanceAxisMajorLinesSymbolButton->setSymbolType( Qgis::SymbolType::Line );
connect( mDistanceAxisMajorLinesSymbolButton, &QgsSymbolButton::changed, this, [ = ]
{
Expand Down Expand Up @@ -240,6 +286,10 @@ QgsLayoutElevationProfileWidget::QgsLayoutElevationProfileWidget( QgsLayoutItemE
mProfile->update();
} );

registerDataDefinedButton( mDDBtnMinDistance, QgsLayoutObject::ElevationProfileMinimumDistance );
registerDataDefinedButton( mDDBtnMaxDistance, QgsLayoutObject::ElevationProfileMaximumDistance );
registerDataDefinedButton( mDDBtnMinElevation, QgsLayoutObject::ElevationProfileMinimumElevation );
registerDataDefinedButton( mDDBtnMaxElevation, QgsLayoutObject::ElevationProfileMaximumElevation );
registerDataDefinedButton( mDDBtnDistanceMajorInterval, QgsLayoutObject::ElevationProfileDistanceMajorInterval );
registerDataDefinedButton( mDDBtnDistanceMinorInterval, QgsLayoutObject::ElevationProfileDistanceMinorInterval );
registerDataDefinedButton( mDDBtnDistanceLabelInterval, QgsLayoutObject::ElevationProfileDistanceLabelInterval );
Expand Down Expand Up @@ -326,6 +376,11 @@ void QgsLayoutElevationProfileWidget::setGuiElementValues()
{
mBlockChanges++;

mSpinMinDistance->setValue( mProfile->plot()->xMinimum() );
mSpinMaxDistance->setValue( mProfile->plot()->xMaximum() );
mSpinMinElevation->setValue( mProfile->plot()->yMinimum() );
mSpinMaxElevation->setValue( mProfile->plot()->yMaximum() );

if ( mProfile->plot()->xAxis().gridMajorSymbol() )
mDistanceAxisMajorLinesSymbolButton->setSymbol( mProfile->plot()->xAxis().gridMajorSymbol()->clone() );
if ( mProfile->plot()->xAxis().gridMinorSymbol() )
Expand All @@ -351,6 +406,10 @@ void QgsLayoutElevationProfileWidget::setGuiElementValues()
if ( mProfile->plot()->chartBorderSymbol() )
mChartBorderSymbolButton->setSymbol( mProfile->plot()->chartBorderSymbol()->clone() );

updateDataDefinedButton( mDDBtnMinDistance );
updateDataDefinedButton( mDDBtnMaxDistance );
updateDataDefinedButton( mDDBtnMinElevation );
updateDataDefinedButton( mDDBtnMaxElevation );
updateDataDefinedButton( mDDBtnDistanceMajorInterval );
updateDataDefinedButton( mDDBtnDistanceMinorInterval );
updateDataDefinedButton( mDDBtnDistanceLabelInterval );
Expand Down
123 changes: 117 additions & 6 deletions src/ui/layout/qgslayoutelevationprofilewidgetbase.ui
Expand Up @@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>385</width>
<width>506</width>
<height>705</height>
</rect>
</property>
Expand Down Expand Up @@ -61,17 +61,128 @@
<rect>
<x>0</x>
<y>0</y>
<width>383</width>
<height>681</height>
<width>490</width>
<height>834</height>
</rect>
</property>
<layout class="QVBoxLayout" name="mainLayout">
<item>
<widget class="QgsCollapsibleGroupBoxBasic" name="groupChartRanges">
<property name="title">
<string>Chart Ranges</string>
</property>
<layout class="QGridLayout" name="gridLayout_4" columnstretch="1,2,0">
<item row="2" column="0">
<widget class="QLabel" name="label_20">
<property name="text">
<string>Minimum elevation</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QgsDoubleSpinBox" name="mSpinMinElevation">
<property name="decimals">
<number>6</number>
</property>
<property name="minimum">
<double>-999999999.000000000000000</double>
</property>
<property name="maximum">
<double>999999999.000000000000000</double>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QgsDoubleSpinBox" name="mSpinMinDistance">
<property name="decimals">
<number>6</number>
</property>
<property name="maximum">
<double>999999999.000000000000000</double>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QgsDoubleSpinBox" name="mSpinMaxDistance">
<property name="decimals">
<number>6</number>
</property>
<property name="maximum">
<double>999999999.000000000000000</double>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_18">
<property name="text">
<string>Minimum distance</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QgsDoubleSpinBox" name="mSpinMaxElevation">
<property name="decimals">
<number>6</number>
</property>
<property name="minimum">
<double>-999999999.000000000000000</double>
</property>
<property name="maximum">
<double>999999999.000000000000000</double>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_21">
<property name="text">
<string>Maximum elevation</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_19">
<property name="text">
<string>Maximum distance</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QgsPropertyOverrideButton" name="mDDBtnMinDistance">
<property name="text">
<string>…</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QgsPropertyOverrideButton" name="mDDBtnMaxDistance">
<property name="text">
<string>…</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QgsPropertyOverrideButton" name="mDDBtnMinElevation">
<property name="text">
<string>…</string>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QgsPropertyOverrideButton" name="mDDBtnMaxElevation">
<property name="text">
<string>…</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QgsCollapsibleGroupBoxBasic" name="groupDistanceAxis">
<property name="title">
<string>Distance Axis</string>
</property>
<layout class="QGridLayout" name="gridLayout_2" columnstretch="0,1,0,0">
<layout class="QGridLayout" name="gridLayout_2" columnstretch="1,0,2,0">
<item row="6" column="2" colspan="2">
<widget class="QgsFontButton" name="mDistanceAxisLabelFontButton">
<property name="sizePolicy">
Expand Down Expand Up @@ -235,7 +346,7 @@
<property name="title">
<string>Elevation Axis</string>
</property>
<layout class="QGridLayout" name="gridLayout_3" columnstretch="0,1,0,0">
<layout class="QGridLayout" name="gridLayout_3" columnstretch="1,0,2,0">
<item row="0" column="2">
<widget class="QgsDoubleSpinBox" name="mElevationAxisMajorIntervalSpin">
<property name="decimals">
Expand Down Expand Up @@ -399,7 +510,7 @@
<property name="title">
<string>Chart Area</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<layout class="QGridLayout" name="gridLayout" columnstretch="1,2">
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
Expand Down

0 comments on commit 054c459

Please sign in to comment.