From ee1f40827f630cc502e3c52ddc6fe66f85df33d9 Mon Sep 17 00:00:00 2001 From: David Date: Wed, 13 Dec 2017 15:41:51 +0100 Subject: [PATCH 1/5] improvement in statusbar widget size handling only the scale line edit has the minimum size instead of the whole scale widget coordinates line edit size is now dynamic depending on the coordinate value --- src/app/qgisapp.cpp | 6 ------ src/app/qgsstatusbarcoordinateswidget.cpp | 16 ++++++---------- src/app/qgsstatusbarscalewidget.cpp | 5 +++++ 3 files changed, 11 insertions(+), 16 deletions(-) diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp index c79c9b94a40..9b7226b6057 100644 --- a/src/app/qgisapp.cpp +++ b/src/app/qgisapp.cpp @@ -9113,12 +9113,6 @@ void QgisApp::saveLastMousePosition( const QgsPointXY &p ) void QgisApp::showScale( double scale ) { mScaleWidget->setScale( scale ); - - // Not sure if the lines below do anything meaningful /Homann - if ( mScaleWidget->width() > mScaleWidget->minimumWidth() ) - { - mScaleWidget->setMinimumWidth( mScaleWidget->width() ); - } } diff --git a/src/app/qgsstatusbarcoordinateswidget.cpp b/src/app/qgsstatusbarcoordinateswidget.cpp index 20937fd9e1c..61d3a837203 100644 --- a/src/app/qgsstatusbarcoordinateswidget.cpp +++ b/src/app/qgsstatusbarcoordinateswidget.cpp @@ -46,7 +46,6 @@ QgsStatusBarCoordinatesWidget::QgsStatusBarCoordinatesWidget( QWidget *parent ) mLineEdit = new QLineEdit( this ); mLineEdit->setMinimumWidth( 10 ); - mLineEdit->setMaximumWidth( 300 ); //mLineEdit->setMaximumHeight( 20 ); mLineEdit->setContentsMargins( 0, 0, 0, 0 ); mLineEdit->setAlignment( Qt::AlignCenter ); @@ -226,10 +225,9 @@ void QgsStatusBarCoordinatesWidget::showMouseCoordinates( const QgsPointXY &p ) mLineEdit->setText( QgsCoordinateUtils::formatCoordinateForProject( p, mMapCanvas->mapSettings().destinationCrs(), mMousePrecisionDecimalPlaces ) ); - if ( mLineEdit->width() > mLineEdit->minimumWidth() ) - { - mLineEdit->setMinimumWidth( mLineEdit->width() ); - } + //ensure the label is big (and small) enough + mLineEdit->setMinimumWidth( mLineEdit->fontMetrics().width( mLineEdit->text() ) + 10 ); + mLineEdit->setMaximumWidth( mLineEdit->fontMetrics().width( mLineEdit->text() ) + 10 ); } @@ -244,9 +242,7 @@ void QgsStatusBarCoordinatesWidget::showExtent() QgsRectangle myExtents = mMapCanvas->extent(); mLabel->setText( tr( "Extents:" ) ); mLineEdit->setText( myExtents.toString( true ) ); - //ensure the label is big enough - if ( mLineEdit->width() > mLineEdit->minimumWidth() ) - { - mLineEdit->setMinimumWidth( mLineEdit->width() ); - } + //ensure the label is big (and small) enough + mLineEdit->setMinimumWidth( mLineEdit->fontMetrics().width( mLineEdit->text() ) + 10 ); + mLineEdit->setMaximumWidth( mLineEdit->fontMetrics().width( mLineEdit->text() ) + 10 ); } diff --git a/src/app/qgsstatusbarscalewidget.cpp b/src/app/qgsstatusbarscalewidget.cpp index b7673d075c0..612c5e17712 100644 --- a/src/app/qgsstatusbarscalewidget.cpp +++ b/src/app/qgsstatusbarscalewidget.cpp @@ -78,6 +78,11 @@ void QgsStatusBarScaleWidget::setScale( double scale ) mScale->blockSignals( true ); mScale->setScale( scale ); mScale->blockSignals( false ); + + if ( mScale->width() > mScale->minimumWidth() ) + { + mScale->setMinimumWidth( mScale->width() ); + } } bool QgsStatusBarScaleWidget::isLocked() const From 77be1ceebe42d08b36d76c16d38f27f206e6432f Mon Sep 17 00:00:00 2001 From: David Date: Wed, 21 Feb 2018 13:00:48 +0000 Subject: [PATCH 2/5] only change size when difference > 4 to avoid the flickering --- src/app/qgsstatusbarcoordinateswidget.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/app/qgsstatusbarcoordinateswidget.cpp b/src/app/qgsstatusbarcoordinateswidget.cpp index 61d3a837203..6b97d06ee8a 100644 --- a/src/app/qgsstatusbarcoordinateswidget.cpp +++ b/src/app/qgsstatusbarcoordinateswidget.cpp @@ -226,8 +226,12 @@ void QgsStatusBarCoordinatesWidget::showMouseCoordinates( const QgsPointXY &p ) mMousePrecisionDecimalPlaces ) ); //ensure the label is big (and small) enough - mLineEdit->setMinimumWidth( mLineEdit->fontMetrics().width( mLineEdit->text() ) + 10 ); - mLineEdit->setMaximumWidth( mLineEdit->fontMetrics().width( mLineEdit->text() ) + 10 ); + int width = mLineEdit->fontMetrics().width( mLineEdit->text() ) + 10; + if( mLineEdit->minimumWidth()+4 < width || mLineEdit->minimumWidth()-4 > width ) + { + mLineEdit->setMinimumWidth( width ); + mLineEdit->setMaximumWidth( width ); + } } @@ -242,7 +246,12 @@ void QgsStatusBarCoordinatesWidget::showExtent() QgsRectangle myExtents = mMapCanvas->extent(); mLabel->setText( tr( "Extents:" ) ); mLineEdit->setText( myExtents.toString( true ) ); + //ensure the label is big (and small) enough - mLineEdit->setMinimumWidth( mLineEdit->fontMetrics().width( mLineEdit->text() ) + 10 ); - mLineEdit->setMaximumWidth( mLineEdit->fontMetrics().width( mLineEdit->text() ) + 10 ); + int width = mLineEdit->fontMetrics().width( mLineEdit->text() ) + 10; + if( mLineEdit->minimumWidth()+4 < width || mLineEdit->minimumWidth()-4 > width ) + { + mLineEdit->setMinimumWidth( width ); + mLineEdit->setMaximumWidth( width ); + } } From ffd1e4bcf8618d924e01b4ae2eaf6b3a5126d4d6 Mon Sep 17 00:00:00 2001 From: David Date: Wed, 21 Feb 2018 13:45:54 +0000 Subject: [PATCH 3/5] fix indentation --- src/app/qgsstatusbarcoordinateswidget.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/qgsstatusbarcoordinateswidget.cpp b/src/app/qgsstatusbarcoordinateswidget.cpp index 6b97d06ee8a..45bf845ee0c 100644 --- a/src/app/qgsstatusbarcoordinateswidget.cpp +++ b/src/app/qgsstatusbarcoordinateswidget.cpp @@ -227,7 +227,7 @@ void QgsStatusBarCoordinatesWidget::showMouseCoordinates( const QgsPointXY &p ) //ensure the label is big (and small) enough int width = mLineEdit->fontMetrics().width( mLineEdit->text() ) + 10; - if( mLineEdit->minimumWidth()+4 < width || mLineEdit->minimumWidth()-4 > width ) + if ( mLineEdit->minimumWidth() + 4 < width || mLineEdit->minimumWidth() - 4 > width ) { mLineEdit->setMinimumWidth( width ); mLineEdit->setMaximumWidth( width ); @@ -249,7 +249,7 @@ void QgsStatusBarCoordinatesWidget::showExtent() //ensure the label is big (and small) enough int width = mLineEdit->fontMetrics().width( mLineEdit->text() ) + 10; - if( mLineEdit->minimumWidth()+4 < width || mLineEdit->minimumWidth()-4 > width ) + if ( mLineEdit->minimumWidth() + 4 < width || mLineEdit->minimumWidth() - 4 > width ) { mLineEdit->setMinimumWidth( width ); mLineEdit->setMaximumWidth( width ); From f17ba6bc29ff52e51e33f2733fa1573809fa8a3b Mon Sep 17 00:00:00 2001 From: David Date: Wed, 21 Feb 2018 20:33:18 +0000 Subject: [PATCH 4/5] only decrease when larger than two signs and increase always. but decrease again only when more than the size of "00" difference. --- src/app/qgsstatusbarcoordinateswidget.cpp | 16 ++++++++-------- src/app/qgsstatusbarcoordinateswidget.h | 1 + 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/app/qgsstatusbarcoordinateswidget.cpp b/src/app/qgsstatusbarcoordinateswidget.cpp index 45bf845ee0c..0119e03971d 100644 --- a/src/app/qgsstatusbarcoordinateswidget.cpp +++ b/src/app/qgsstatusbarcoordinateswidget.cpp @@ -225,13 +225,7 @@ void QgsStatusBarCoordinatesWidget::showMouseCoordinates( const QgsPointXY &p ) mLineEdit->setText( QgsCoordinateUtils::formatCoordinateForProject( p, mMapCanvas->mapSettings().destinationCrs(), mMousePrecisionDecimalPlaces ) ); - //ensure the label is big (and small) enough - int width = mLineEdit->fontMetrics().width( mLineEdit->text() ) + 10; - if ( mLineEdit->minimumWidth() + 4 < width || mLineEdit->minimumWidth() - 4 > width ) - { - mLineEdit->setMinimumWidth( width ); - mLineEdit->setMaximumWidth( width ); - } + ensureCoordinatesVisible(); } @@ -247,11 +241,17 @@ void QgsStatusBarCoordinatesWidget::showExtent() mLabel->setText( tr( "Extents:" ) ); mLineEdit->setText( myExtents.toString( true ) ); + ensureCoordinatesVisible(); +} + +void QgsStatusBarCoordinatesWidget::ensureCoordinatesVisible(){ + //ensure the label is big (and small) enough int width = mLineEdit->fontMetrics().width( mLineEdit->text() ) + 10; - if ( mLineEdit->minimumWidth() + 4 < width || mLineEdit->minimumWidth() - 4 > width ) + if ( mLineEdit->minimumWidth() < width || ( mLineEdit->minimumWidth() - width ) > fontMetrics().width( QStringLiteral( "OO" ) ) ) { mLineEdit->setMinimumWidth( width ); mLineEdit->setMaximumWidth( width ); } } + diff --git a/src/app/qgsstatusbarcoordinateswidget.h b/src/app/qgsstatusbarcoordinateswidget.h index 988087d922c..e891525969c 100644 --- a/src/app/qgsstatusbarcoordinateswidget.h +++ b/src/app/qgsstatusbarcoordinateswidget.h @@ -59,6 +59,7 @@ class APP_EXPORT QgsStatusBarCoordinatesWidget : public QWidget void validateCoordinates(); void dizzy(); void showExtent(); + void ensureCoordinatesVisible(); private: void refreshMapCanvas(); From 5cfe27848124444fbe63e9b3d0cfee90f2388e7b Mon Sep 17 00:00:00 2001 From: David Date: Wed, 21 Feb 2018 21:47:57 +0000 Subject: [PATCH 5/5] calculate mTwoCharSize --- src/app/qgsstatusbarcoordinateswidget.cpp | 8 ++++++-- src/app/qgsstatusbarcoordinateswidget.h | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/app/qgsstatusbarcoordinateswidget.cpp b/src/app/qgsstatusbarcoordinateswidget.cpp index 0119e03971d..781d946b26e 100644 --- a/src/app/qgsstatusbarcoordinateswidget.cpp +++ b/src/app/qgsstatusbarcoordinateswidget.cpp @@ -33,6 +33,9 @@ QgsStatusBarCoordinatesWidget::QgsStatusBarCoordinatesWidget( QWidget *parent ) : QWidget( parent ) , mMousePrecisionDecimalPlaces( 0 ) { + // calculate the size of two chars + mTwoCharSize = fontMetrics().width( QStringLiteral( "OO" ) ); + // add a label to show current position mLabel = new QLabel( QString(), this ); mLabel->setObjectName( QStringLiteral( "mCoordsLabel" ) ); @@ -244,11 +247,12 @@ void QgsStatusBarCoordinatesWidget::showExtent() ensureCoordinatesVisible(); } -void QgsStatusBarCoordinatesWidget::ensureCoordinatesVisible(){ +void QgsStatusBarCoordinatesWidget::ensureCoordinatesVisible() +{ //ensure the label is big (and small) enough int width = mLineEdit->fontMetrics().width( mLineEdit->text() ) + 10; - if ( mLineEdit->minimumWidth() < width || ( mLineEdit->minimumWidth() - width ) > fontMetrics().width( QStringLiteral( "OO" ) ) ) + if ( mLineEdit->minimumWidth() < width || ( mLineEdit->minimumWidth() - width ) > mTwoCharSize ) { mLineEdit->setMinimumWidth( width ); mLineEdit->setMaximumWidth( width ); diff --git a/src/app/qgsstatusbarcoordinateswidget.h b/src/app/qgsstatusbarcoordinateswidget.h index e891525969c..f745c8c06ae 100644 --- a/src/app/qgsstatusbarcoordinateswidget.h +++ b/src/app/qgsstatusbarcoordinateswidget.h @@ -72,6 +72,7 @@ class APP_EXPORT QgsStatusBarCoordinatesWidget : public QWidget QValidator *mCoordsEditValidator = nullptr; QTimer *mDizzyTimer = nullptr; QgsMapCanvas *mMapCanvas = nullptr; + int mTwoCharSize; //! The number of decimal places to use if not automatic unsigned int mMousePrecisionDecimalPlaces;