Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Fixes #50292 - Optionally show coordinates in measure tool
  • Loading branch information
YoannQDQ committed Apr 17, 2023
1 parent 47d88e9 commit bb9b4a9
Show file tree
Hide file tree
Showing 3 changed files with 115 additions and 15 deletions.
76 changes: 64 additions & 12 deletions src/app/qgsmeasuredialog.cpp
Expand Up @@ -58,7 +58,16 @@ QgsMeasureDialog::QgsMeasureDialog( QgsMeasureTool *tool, Qt::WindowFlags f )
{
QPushButton *cpb = new QPushButton( tr( "Copy &All" ) );
buttonBox->addButton( cpb, QDialogButtonBox::ActionRole );
connect( cpb, &QAbstractButton::clicked, this, &QgsMeasureDialog::copyMeasurements );
connect( cpb, &QAbstractButton::clicked, this, [this] {copyMeasurements( mShowCoordinates->isChecked() );} );

// Toggle the coordinates columns visibility
connect( mShowCoordinates, &QCheckBox::clicked, this, &QgsMeasureDialog::showCoordinatesChanged );
showCoordinatesChanged();

}
else
{
mShowCoordinates->hide();
}

repopulateComboBoxUnits( mMeasureArea );
Expand Down Expand Up @@ -137,6 +146,14 @@ void QgsMeasureDialog::crsChanged()
updateUi();
}

void QgsMeasureDialog::showCoordinatesChanged()
{
mTable->setColumnHidden( Columns::StartX, !mShowCoordinates->isChecked() );
mTable->setColumnHidden( Columns::StartY, !mShowCoordinates->isChecked() );
mTable->setColumnHidden( Columns::EndX, !mShowCoordinates->isChecked() );
mTable->setColumnHidden( Columns::EndY, !mShowCoordinates->isChecked() );
}

void QgsMeasureDialog::updateSettings()
{
const QgsSettings settings;
Expand Down Expand Up @@ -239,7 +256,11 @@ void QgsMeasureDialog::mouseMove( const QgsPointXY &point )
QTreeWidgetItem *item = mTable->topLevelItem( mTable->topLevelItemCount() - 1 );
if ( item )
{
item->setText( 0, QLocale().toString( d, 'f', mDecimalPlaces ) );
item->setText( Columns::StartX, QLocale().toString( p1.x(), 'f', mDecimalPlacesCoordinates ) );
item->setText( Columns::StartY, QLocale().toString( p1.y(), 'f', mDecimalPlacesCoordinates ) );
item->setText( Columns::EndX, QLocale().toString( p2.x(), 'f', mDecimalPlacesCoordinates ) );
item->setText( Columns::EndY, QLocale().toString( p2.y(), 'f', mDecimalPlacesCoordinates ) );
item->setText( Columns::Distance, QLocale().toString( d, 'f', mDecimalPlaces ) );
}
}
}
Expand All @@ -256,8 +277,14 @@ void QgsMeasureDialog::addPoint()
{
if ( !mTool->done() )
{
QTreeWidgetItem *item = new QTreeWidgetItem( QStringList( QLocale().toString( 0.0, 'f', mDecimalPlaces ) ) );
item->setTextAlignment( 0, Qt::AlignRight );
QTreeWidgetItem *item = new QTreeWidgetItem();
QgsPointXY lastPoint = mTool->points().last();
item->setText( Columns::StartX, QLocale().toString( lastPoint.x(), 'f', mDecimalPlacesCoordinates ) );
item->setText( Columns::StartY, QLocale().toString( lastPoint.y(), 'f', mDecimalPlacesCoordinates ) );
item->setText( Columns::EndX, QLocale().toString( lastPoint.x(), 'f', mDecimalPlacesCoordinates ) );
item->setText( Columns::EndY, QLocale().toString( lastPoint.y(), 'f', mDecimalPlacesCoordinates ) );
item->setText( Columns::Distance, QLocale().toString( 0.0, 'f', mDecimalPlaces ) );
item->setTextAlignment( Columns::Distance, Qt::AlignRight );
mTable->addTopLevelItem( item );
mTable->scrollToItem( item );
}
Expand Down Expand Up @@ -304,7 +331,11 @@ void QgsMeasureDialog::removeLastPoint()
d = convertLength( d, mDistanceUnits );

QTreeWidgetItem *item = mTable->topLevelItem( mTable->topLevelItemCount() - 1 );
item->setText( 0, QLocale().toString( d, 'f', mDecimalPlaces ) );
item->setText( Columns::StartX, QLocale().toString( p1.x(), 'f', mDecimalPlacesCoordinates ) );
item->setText( Columns::StartY, QLocale().toString( p1.y(), 'f', mDecimalPlacesCoordinates ) );
item->setText( Columns::EndX, QLocale().toString( mLastMousePoint.x(), 'f', mDecimalPlacesCoordinates ) );
item->setText( Columns::EndY, QLocale().toString( mLastMousePoint.y(), 'f', mDecimalPlacesCoordinates ) );
item->setText( Columns::Distance, QLocale().toString( d, 'f', mDecimalPlaces ) );
editTotal->setText( formatDistance( mTotal + d ) );
}
else
Expand Down Expand Up @@ -551,6 +582,15 @@ void QgsMeasureDialog::updateUi()
}
}

if ( mCanvas->mapSettings().destinationCrs().mapUnits() == Qgis::DistanceUnit::Degrees )
{
mDecimalPlacesCoordinates = 5;
}
else
{
mDecimalPlacesCoordinates = 3;
}

editTotal->setToolTip( toolTip );
mTable->setToolTip( toolTip );
mNotesLabel->setText( toolTip );
Expand All @@ -567,15 +607,15 @@ void QgsMeasureDialog::updateUi()
if ( mUseMapUnits )
{
mUnitsCombo->setCurrentIndex( mUnitsCombo->findData( static_cast< int >( Qgis::DistanceUnit::Unknown ) ) );
mTable->setHeaderLabels( QStringList( tr( "Segments [%1]" ).arg( QgsUnitTypes::toString( mMapDistanceUnits ) ) ) );
mTable->headerItem()->setText( Columns::Distance, tr( "Segments [%1]" ).arg( QgsUnitTypes::toString( mMapDistanceUnits ) ) );
}
else
{
mUnitsCombo->setCurrentIndex( mUnitsCombo->findData( static_cast< int >( mDistanceUnits ) ) );
if ( mDistanceUnits != Qgis::DistanceUnit::Unknown )
mTable->setHeaderLabels( QStringList( tr( "Segments [%1]" ).arg( QgsUnitTypes::toString( mDistanceUnits ) ) ) );
mTable->headerItem()->setText( Columns::Distance, tr( "Segments [%1]" ).arg( QgsUnitTypes::toString( mDistanceUnits ) ) );
else
mTable->setHeaderLabels( QStringList( tr( "Segments" ) ) );
mTable->headerItem()->setText( Columns::Distance, tr( "Segments" ) );
}
}

Expand Down Expand Up @@ -613,8 +653,13 @@ void QgsMeasureDialog::updateUi()
d = convertLength( d, mDistanceUnits );
}

QTreeWidgetItem *item = new QTreeWidgetItem( QStringList( QLocale().toString( d, 'f', mDecimalPlaces ) ) );
item->setTextAlignment( 0, Qt::AlignRight );
QTreeWidgetItem *item = new QTreeWidgetItem();
item->setText( Columns::StartX, QLocale().toString( p1.x(), 'f', mDecimalPlacesCoordinates ) );
item->setText( Columns::StartY, QLocale().toString( p1.y(), 'f', mDecimalPlacesCoordinates ) );
item->setText( Columns::EndX, QLocale().toString( p2.x(), 'f', mDecimalPlacesCoordinates ) );
item->setText( Columns::EndY, QLocale().toString( p2.y(), 'f', mDecimalPlacesCoordinates ) );
item->setText( Columns::Distance, QLocale().toString( d, 'f', mDecimalPlaces ) );
item->setTextAlignment( Columns::Distance, Qt::AlignRight );
mTable->addTopLevelItem( item );
mTable->scrollToItem( item );
}
Expand Down Expand Up @@ -674,14 +719,21 @@ double QgsMeasureDialog::convertArea( double area, Qgis::AreaUnit toUnit ) const
return mDa.convertAreaMeasurement( area, toUnit );
}

void QgsMeasureDialog::copyMeasurements()
void QgsMeasureDialog::copyMeasurements( bool copyCoordinates )
{
QClipboard *clipboard = QApplication::clipboard();
QString text;
QTreeWidgetItemIterator it( mTable );
while ( *it )
{
text += ( *it )->text( 0 ) + QStringLiteral( "\n" );
if ( copyCoordinates )
{
text += ( *it )->text( Columns::StartX ) + QStringLiteral( "\t" );
text += ( *it )->text( Columns::EndX ) + QStringLiteral( "\t" );
text += ( *it )->text( Columns::StartY ) + QStringLiteral( "\t" );
text += ( *it )->text( Columns::EndY ) + QStringLiteral( "\t" );
}
text += ( *it )->text( Columns::Distance ) + QStringLiteral( "\n" );
it++;
}
clipboard->setText( text );
Expand Down
22 changes: 20 additions & 2 deletions src/app/qgsmeasuredialog.h
Expand Up @@ -70,15 +70,30 @@ class APP_EXPORT QgsMeasureDialog : public QDialog, private Ui::QgsMeasureBase
//! Open configuration tab
void openConfigTab();

//! Copy measurements to the clipboard
void copyMeasurements();
/**
* Copy measurements to the clipboard
* \param copyCoordinates \since QGIS 3.32 set to TRUE to also copy coordinates to clipboard
*/
void copyMeasurements( bool copyCoordinates = false );

void showCoordinatesChanged();

void crsChanged();

void projChanged();

private:

//! \since QGIS 3.32 columns
enum Columns
{
StartX = 0,
StartY,
EndX,
EndY,
Distance,
};

//! formats distance to most appropriate units
QString formatDistance( double distance, bool convertUnits = true ) const;

Expand Down Expand Up @@ -112,6 +127,9 @@ class APP_EXPORT QgsMeasureDialog : public QDialog, private Ui::QgsMeasureBase
//! Number of decimal places we want.
int mDecimalPlaces = 3;

//! Number of decimal places we want for the coordinates.
int mDecimalPlacesCoordinates = 3;

//! Current unit for input values
Qgis::DistanceUnit mCanvasUnits = Qgis::DistanceUnit::Unknown;

Expand Down
32 changes: 31 additions & 1 deletion src/ui/qgsmeasurebase.ui
Expand Up @@ -48,8 +48,31 @@
<bool>false</bool>
</property>
<property name="columnCount">
<number>1</number>
<number>5</number>
</property>
<attribute name="headerDefaultSectionSize">
<number>85</number>
</attribute>
<column>
<property name="text">
<string>x1</string>
</property>
</column>
<column>
<property name="text">
<string>y1</string>
</property>
</column>
<column>
<property name="text">
<string>x2</string>
</property>
</column>
<column>
<property name="text">
<string>y2</string>
</property>
</column>
<column>
<property name="text">
<string>Segments</string>
Expand Down Expand Up @@ -187,6 +210,13 @@
</property>
</spacer>
</item>
<item row="8" column="0" colspan="4">
<widget class="QCheckBox" name="mShowCoordinates">
<property name="text">
<string>Show coordinates</string>
</property>
</widget>
</item>
</layout>
</widget>
<layoutdefault spacing="6" margin="11"/>
Expand Down

0 comments on commit bb9b4a9

Please sign in to comment.