Skip to content

Commit

Permalink
Use a single combo box for scale bar horizontal/vertical label placement
Browse files Browse the repository at this point in the history
Since we only have 2 choices for each, we can reduce the number
of widgets by just exposing 4 choices in a single combo
  • Loading branch information
nyalldawson committed Jul 11, 2024
1 parent 849df1b commit d89ac9b
Show file tree
Hide file tree
Showing 3 changed files with 148 additions and 120 deletions.
88 changes: 59 additions & 29 deletions src/gui/layout/qgslayoutscalebarwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,12 @@
#include "qgslayoutitemscalebar.h"
#include "qgsscalebarrendererregistry.h"
#include "qgslayout.h"
#include "qgsvectorlayer.h"
#include "qgsnumericformatselectorwidget.h"
#include "qgslayoutundostack.h"
#include "qgsfillsymbol.h"
#include "qgslinesymbol.h"
#include "qgslayoutreportcontext.h"
#include "qgsvectorlayer.h"

#include <QColorDialog>
#include <QFontDialog>
Expand All @@ -50,8 +50,7 @@ QgsLayoutScaleBarWidget::QgsLayoutScaleBarWidget( QgsLayoutItemScaleBar *scaleBa
connect( mLabelBarSpaceSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutScaleBarWidget::mLabelBarSpaceSpinBox_valueChanged );
connect( mBoxSizeSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutScaleBarWidget::mBoxSizeSpinBox_valueChanged );
connect( mAlignmentComboBox, &QgsAlignmentComboBox::changed, this, &QgsLayoutScaleBarWidget::alignmentChanged );
connect( mLabelVerticalPlacementComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutScaleBarWidget::mLabelVerticalPlacementComboBox_currentIndexChanged );
connect( mLabelHorizontalPlacementComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutScaleBarWidget::mLabelHorizontalPlacementComboBox_currentIndexChanged );
connect( mDistanceLabelPlacementComboBox, qOverload<int>( &QComboBox::currentIndexChanged ), this, &QgsLayoutScaleBarWidget::mDistanceLabelPlacementComboBox_currentIndexChanged );
connect( mUnitsComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsLayoutScaleBarWidget::mUnitsComboBox_currentIndexChanged );
connect( mMinWidthSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutScaleBarWidget::mMinWidthSpinBox_valueChanged );
connect( mMaxWidthSpinBox, static_cast < void ( QDoubleSpinBox::* )( double ) > ( &QDoubleSpinBox::valueChanged ), this, &QgsLayoutScaleBarWidget::mMaxWidthSpinBox_valueChanged );
Expand Down Expand Up @@ -96,10 +95,10 @@ QgsLayoutScaleBarWidget::QgsLayoutScaleBarWidget( QgsLayoutItemScaleBar *scaleBa
}

//label vertical/horizontal placement combo box
mLabelVerticalPlacementComboBox->addItem( tr( "Above Segments" ), static_cast< int >( QgsScaleBarSettings::LabelAboveSegment ) );
mLabelVerticalPlacementComboBox->addItem( tr( "Below Segments" ), static_cast< int >( QgsScaleBarSettings::LabelBelowSegment ) );
mLabelHorizontalPlacementComboBox->addItem( tr( "Centered at Segment Edge" ), static_cast< int >( QgsScaleBarSettings::LabelCenteredEdge ) );
mLabelHorizontalPlacementComboBox->addItem( tr( "Centered at Center of Segment" ), static_cast< int >( QgsScaleBarSettings::LabelCenteredSegment ) );
mDistanceLabelPlacementComboBox->addItem( tr( "Above Segment Edges" ), static_cast< int >( DistanceLabelPlacement::CenteredAboveSegmentEdges ) );
mDistanceLabelPlacementComboBox->addItem( tr( "Above Segment Centers" ), static_cast< int >( DistanceLabelPlacement::CenteredAboveSegmentCenters ) );
mDistanceLabelPlacementComboBox->addItem( tr( "Below Segment Edges" ), static_cast< int >( DistanceLabelPlacement::CenteredBelowSegmentEdges ) );
mDistanceLabelPlacementComboBox->addItem( tr( "Below Segment Centers" ), static_cast< int >( DistanceLabelPlacement::CenteredBelowSegmentCenters ) );

//alignment combo box
mAlignmentComboBox->setAvailableAlignments( Qt::AlignLeft | Qt::AlignHCenter | Qt::AlignRight );
Expand Down Expand Up @@ -304,8 +303,8 @@ void QgsLayoutScaleBarWidget::setGuiElements()
toggleStyleSpecificControls( style );

//label vertical/horizontal placement
mLabelVerticalPlacementComboBox->setCurrentIndex( mLabelVerticalPlacementComboBox->findData( static_cast< int >( mScalebar->labelVerticalPlacement() ) ) );
mLabelHorizontalPlacementComboBox->setCurrentIndex( mLabelHorizontalPlacementComboBox->findData( static_cast< int >( mScalebar->labelHorizontalPlacement() ) ) );
mDistanceLabelPlacementComboBox->setCurrentIndex( mDistanceLabelPlacementComboBox->findData( static_cast< int >(
distanceLabelPlacement( mScalebar->labelHorizontalPlacement(), mScalebar->labelVerticalPlacement() ) ) ) );

//alignment

Expand Down Expand Up @@ -477,6 +476,33 @@ void QgsLayoutScaleBarWidget::changeNumberFormat()
return;
}

QgsLayoutScaleBarWidget::DistanceLabelPlacement QgsLayoutScaleBarWidget::distanceLabelPlacement( QgsScaleBarSettings::LabelHorizontalPlacement horizontalPlacement, QgsScaleBarSettings::LabelVerticalPlacement verticalPlacement )
{
switch ( horizontalPlacement )
{
case QgsScaleBarSettings::LabelCenteredEdge:
switch ( verticalPlacement )
{
case QgsScaleBarSettings::LabelAboveSegment:
return DistanceLabelPlacement::CenteredAboveSegmentEdges;
case QgsScaleBarSettings::LabelBelowSegment:
return DistanceLabelPlacement::CenteredBelowSegmentEdges;
}
BUILTIN_UNREACHABLE

case QgsScaleBarSettings::LabelCenteredSegment:
switch ( verticalPlacement )
{
case QgsScaleBarSettings::LabelAboveSegment:
return DistanceLabelPlacement::CenteredAboveSegmentCenters;
case QgsScaleBarSettings::LabelBelowSegment:
return DistanceLabelPlacement::CenteredBelowSegmentCenters;
}
BUILTIN_UNREACHABLE
}
BUILTIN_UNREACHABLE
}

void QgsLayoutScaleBarWidget::mUnitLabelLineEdit_textChanged( const QString &text )
{
if ( !mScalebar )
Expand Down Expand Up @@ -558,10 +584,9 @@ void QgsLayoutScaleBarWidget::toggleStyleSpecificControls( const QString &style
mGroupBoxSegments->setCollapsed( true );
mLabelBarSpaceSpinBox->setEnabled( renderer ? renderer->flags() & QgsScaleBarRenderer::Flag::FlagUsesLabelBarSpace : true );
mLabelBarSpaceLabel->setEnabled( renderer ? renderer->flags() & QgsScaleBarRenderer::Flag::FlagUsesLabelBarSpace : true );
mLabelVerticalPlacementComboBox->setEnabled( renderer ? renderer->flags() & QgsScaleBarRenderer::Flag::FlagUsesLabelVerticalPlacement : true );
mLabelVerticalPlacementLabel->setEnabled( renderer ? renderer->flags() & QgsScaleBarRenderer::Flag::FlagUsesLabelVerticalPlacement : true );
mLabelHorizontalPlacementComboBox->setEnabled( renderer ? renderer->flags() & QgsScaleBarRenderer::Flag::FlagUsesLabelHorizontalPlacement : true );
mLabelHorizontalPlacementLabel->setEnabled( renderer ? renderer->flags() & QgsScaleBarRenderer::Flag::FlagUsesLabelHorizontalPlacement : true );
mDistanceLabelPlacementComboBox->setEnabled( renderer ? renderer->flags() & QgsScaleBarRenderer::Flag::FlagUsesLabelVerticalPlacement : true );
mLabelVerticalPlacementLabel->setEnabled( renderer ? ( renderer->flags() & QgsScaleBarRenderer::Flag::FlagUsesLabelHorizontalPlacement
|| renderer->flags() & QgsScaleBarRenderer::Flag::FlagUsesLabelVerticalPlacement ) : true );
mAlignmentComboBox->setEnabled( renderer ? renderer->flags() & QgsScaleBarRenderer::Flag::FlagUsesAlignment : true );
mAlignmentLabel->setEnabled( renderer ? renderer->flags() & QgsScaleBarRenderer::Flag::FlagUsesAlignment : true );
mFillSymbol1Button->setEnabled( renderer ? renderer->flags() & QgsScaleBarRenderer::Flag::FlagUsesFillSymbol : true );
Expand Down Expand Up @@ -606,31 +631,37 @@ void QgsLayoutScaleBarWidget::mBoxSizeSpinBox_valueChanged( double d )
mScalebar->endCommand();
}

void QgsLayoutScaleBarWidget::mLabelVerticalPlacementComboBox_currentIndexChanged( int index )
void QgsLayoutScaleBarWidget::mDistanceLabelPlacementComboBox_currentIndexChanged( int index )
{
if ( !mScalebar )
{
return;
}

mScalebar->beginCommand( tr( "Set Scalebar Label Vertical Placement" ) );
mScalebar->beginCommand( tr( "Set Scalebar Label Placement" ) );
disconnectUpdateSignal();
mScalebar->setLabelVerticalPlacement( static_cast<QgsScaleBarSettings::LabelVerticalPlacement>( mLabelVerticalPlacementComboBox->itemData( index ).toInt() ) );
mScalebar->update();
connectUpdateSignal();
mScalebar->endCommand();
}

void QgsLayoutScaleBarWidget::mLabelHorizontalPlacementComboBox_currentIndexChanged( int index )
{
if ( !mScalebar )
const DistanceLabelPlacement placement = static_cast<DistanceLabelPlacement>( mDistanceLabelPlacementComboBox->itemData( index ).toInt() );
switch ( placement )
{
return;
case DistanceLabelPlacement::CenteredAboveSegmentEdges:
mScalebar->setLabelVerticalPlacement( QgsScaleBarSettings::LabelVerticalPlacement::LabelAboveSegment );
mScalebar->setLabelHorizontalPlacement( QgsScaleBarSettings::LabelHorizontalPlacement::LabelCenteredEdge );
break;
case DistanceLabelPlacement::CenteredAboveSegmentCenters:
mScalebar->setLabelVerticalPlacement( QgsScaleBarSettings::LabelVerticalPlacement::LabelAboveSegment );
mScalebar->setLabelHorizontalPlacement( QgsScaleBarSettings::LabelHorizontalPlacement::LabelCenteredSegment );
break;
case DistanceLabelPlacement::CenteredBelowSegmentEdges:
mScalebar->setLabelVerticalPlacement( QgsScaleBarSettings::LabelVerticalPlacement::LabelBelowSegment );
mScalebar->setLabelHorizontalPlacement( QgsScaleBarSettings::LabelHorizontalPlacement::LabelCenteredEdge );
break;
case DistanceLabelPlacement::CenteredBelowSegmentCenters:
mScalebar->setLabelVerticalPlacement( QgsScaleBarSettings::LabelVerticalPlacement::LabelBelowSegment );
mScalebar->setLabelHorizontalPlacement( QgsScaleBarSettings::LabelHorizontalPlacement::LabelCenteredSegment );
break;
}

mScalebar->beginCommand( tr( "Set Scalebar Label Horizontal Placement" ) );
disconnectUpdateSignal();
mScalebar->setLabelHorizontalPlacement( static_cast<QgsScaleBarSettings::LabelHorizontalPlacement>( mLabelHorizontalPlacementComboBox->itemData( index ).toInt() ) );
mScalebar->update();
connectUpdateSignal();
mScalebar->endCommand();
Expand Down Expand Up @@ -698,8 +729,7 @@ void QgsLayoutScaleBarWidget::blockMemberSignals( bool block )
mSubdivisionStyleButton->blockSignals( block );
mLabelBarSpaceSpinBox->blockSignals( block );
mBoxSizeSpinBox->blockSignals( block );
mLabelVerticalPlacementComboBox->blockSignals( block );
mLabelHorizontalPlacementComboBox->blockSignals( block );
mDistanceLabelPlacementComboBox->blockSignals( block );
mAlignmentComboBox->blockSignals( block );
mUnitsComboBox->blockSignals( block );
mFillSymbol1Button->blockSignals( block );
Expand Down
13 changes: 11 additions & 2 deletions src/gui/layout/qgslayoutscalebarwidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include "qgis_gui.h"
#include "ui_qgslayoutscalebarwidgetbase.h"
#include "qgslayoutitemwidget.h"
#include "qgsscalebarsettings.h"

#include <QButtonGroup>

Expand Down Expand Up @@ -66,8 +67,7 @@ class GUI_EXPORT QgsLayoutScaleBarWidget: public QgsLayoutItemBaseWidget, public
void mStyleComboBox_currentIndexChanged( const QString &text );
void mLabelBarSpaceSpinBox_valueChanged( double d );
void mBoxSizeSpinBox_valueChanged( double d );
void mLabelVerticalPlacementComboBox_currentIndexChanged( int index );
void mLabelHorizontalPlacementComboBox_currentIndexChanged( int index );
void mDistanceLabelPlacementComboBox_currentIndexChanged( int index );
void alignmentChanged();
void mUnitsComboBox_currentIndexChanged( int index );
void mMinWidthSpinBox_valueChanged( double d );
Expand All @@ -81,6 +81,15 @@ class GUI_EXPORT QgsLayoutScaleBarWidget: public QgsLayoutItemBaseWidget, public
void changeNumberFormat();

private:
enum class DistanceLabelPlacement : int
{
CenteredAboveSegmentEdges,
CenteredAboveSegmentCenters,
CenteredBelowSegmentEdges,
CenteredBelowSegmentCenters,
};
static DistanceLabelPlacement distanceLabelPlacement( QgsScaleBarSettings::LabelHorizontalPlacement horizontalPlacement, QgsScaleBarSettings::LabelVerticalPlacement verticalPlacement );

QPointer< QgsLayoutItemScaleBar > mScalebar;
QgsLayoutItemPropertiesWidget *mItemPropertiesWidget = nullptr;

Expand Down
Loading

0 comments on commit d89ac9b

Please sign in to comment.