Skip to content

Commit

Permalink
Nicer sorting of numeric format choices
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Jan 8, 2020
1 parent 591e1a2 commit 6b9cafb
Show file tree
Hide file tree
Showing 27 changed files with 131 additions and 8 deletions.
Expand Up @@ -29,6 +29,8 @@ Default constructor

virtual QString visibleName() const;

virtual int sortKey();

virtual QString formatDouble( double value, const QgsNumericFormatContext &context ) const;

virtual QgsNumericFormat *clone() const /Factory/;
Expand Down
Expand Up @@ -36,6 +36,8 @@ Default constructor

virtual QString visibleName() const;

virtual int sortKey();

virtual QString formatDouble( double value, const QgsNumericFormatContext &context ) const;

virtual QgsNumericFormat *clone() const /Factory/;
Expand Down
Expand Up @@ -29,6 +29,8 @@ Default constructor

virtual QString visibleName() const;

virtual int sortKey();

virtual QString formatDouble( double value, const QgsNumericFormatContext &context ) const;

virtual QgsNumericFormat *clone() const /Factory/;
Expand Down
Expand Up @@ -28,6 +28,8 @@ Default constructor

virtual QString visibleName() const;

virtual int sortKey();

virtual QString formatDouble( double value, const QgsNumericFormatContext &context ) const;

virtual QgsNumericFormat *clone() const /Factory/;
Expand Down
Expand Up @@ -120,6 +120,13 @@ This id is used to identify this numeric format in the registry with :py:func:`Q
virtual QString visibleName() const = 0;
%Docstring
Returns the translated, user-visible name for this format.
%End

virtual int sortKey();
%Docstring
Returns a sorting key value, where formats with a lower sort key will be shown earlier in lists.

Generally, subclasses should return QgsNumericFormat.sortKey() as their sorting key.
%End

virtual QString formatDouble( double value, const QgsNumericFormatContext &context ) const = 0;
Expand Down
Expand Up @@ -85,6 +85,11 @@ The caller takes ownership of the returned object.
QString visibleName( const QString &id ) const;
%Docstring
Returns the translated, user-visible name for the format with matching ``id``.
%End

int sortKey( const QString &id ) const;
%Docstring
Returns the sorting key for the format with matching ``id``.
%End

};
Expand Down
Expand Up @@ -35,6 +35,8 @@ Default constructor

virtual QString visibleName() const;

virtual int sortKey();

virtual QString formatDouble( double value, const QgsNumericFormatContext &context ) const;

virtual QgsNumericFormat *clone() const /Factory/;
Expand Down
Expand Up @@ -29,6 +29,8 @@ Default constructor

virtual QString visibleName() const;

virtual int sortKey();

virtual QString formatDouble( double value, const QgsNumericFormatContext &context ) const;

virtual QgsNumericFormat *clone() const /Factory/;
Expand Down
Expand Up @@ -33,6 +33,13 @@ Sets the format to show in the widget.
Returns a new format object representing the settings currently configured in the widget.

The caller takes ownership of the returned object.
%End

signals:

void changed();
%Docstring
Emitted whenever the format configured in the widget is changed.
%End

};
Expand Down
5 changes: 5 additions & 0 deletions src/core/numericformats/qgsbasicnumericformat.cpp
Expand Up @@ -51,6 +51,11 @@ QString QgsBasicNumericFormat::visibleName() const
return QObject::tr( "Number" );
}

int QgsBasicNumericFormat::sortKey()
{
return 1;
}

QString QgsBasicNumericFormat::formatDouble( double value, const QgsNumericFormatContext &context ) const
{
std::ostringstream os;
Expand Down
1 change: 1 addition & 0 deletions src/core/numericformats/qgsbasicnumericformat.h
Expand Up @@ -39,6 +39,7 @@ class CORE_EXPORT QgsBasicNumericFormat : public QgsNumericFormat

QString id() const override;
QString visibleName() const override;
int sortKey() override;
QString formatDouble( double value, const QgsNumericFormatContext &context ) const override;
QgsNumericFormat *clone() const override SIP_FACTORY;
QgsNumericFormat *create( const QVariantMap &configuration, const QgsReadWriteContext &context ) const override SIP_FACTORY;
Expand Down
5 changes: 5 additions & 0 deletions src/core/numericformats/qgsbearingnumericformat.cpp
Expand Up @@ -32,6 +32,11 @@ QString QgsBearingNumericFormat::visibleName() const
return QObject::tr( "Bearing" );
}

int QgsBearingNumericFormat::sortKey()
{
return QgsNumericFormat::sortKey();
}

QString QgsBearingNumericFormat::formatDouble( double value, const QgsNumericFormatContext &context ) const
{
switch ( mDirectionFormat )
Expand Down
1 change: 1 addition & 0 deletions src/core/numericformats/qgsbearingnumericformat.h
Expand Up @@ -47,6 +47,7 @@ class CORE_EXPORT QgsBearingNumericFormat : public QgsBasicNumericFormat

QString id() const override;
QString visibleName() const override;
int sortKey() override;
QString formatDouble( double value, const QgsNumericFormatContext &context ) const override;
QgsNumericFormat *clone() const override SIP_FACTORY;
QgsNumericFormat *create( const QVariantMap &configuration, const QgsReadWriteContext &context ) const override SIP_FACTORY;
Expand Down
5 changes: 5 additions & 0 deletions src/core/numericformats/qgscurrencynumericformat.cpp
Expand Up @@ -33,6 +33,11 @@ QString QgsCurrencyNumericFormat::visibleName() const
return QObject::tr( "Currency" );
}

int QgsCurrencyNumericFormat::sortKey()
{
return QgsNumericFormat::sortKey();
}

QString QgsCurrencyNumericFormat::formatDouble( double value, const QgsNumericFormatContext &context ) const
{
QString res = QgsBasicNumericFormat::formatDouble( value, context );
Expand Down
1 change: 1 addition & 0 deletions src/core/numericformats/qgscurrencynumericformat.h
Expand Up @@ -36,6 +36,7 @@ class CORE_EXPORT QgsCurrencyNumericFormat : public QgsBasicNumericFormat

QString id() const override;
QString visibleName() const override;
int sortKey() override;
QString formatDouble( double value, const QgsNumericFormatContext &context ) const override;
QgsNumericFormat *clone() const override SIP_FACTORY;
QgsNumericFormat *create( const QVariantMap &configuration, const QgsReadWriteContext &context ) const override SIP_FACTORY;
Expand Down
5 changes: 5 additions & 0 deletions src/core/numericformats/qgsfallbacknumericformat.cpp
Expand Up @@ -27,6 +27,11 @@ QString QgsFallbackNumericFormat::visibleName() const
return QObject::tr( "General" );
}

int QgsFallbackNumericFormat::sortKey()
{
return 0;
}

QString QgsFallbackNumericFormat::formatDouble( double value, const QgsNumericFormatContext & ) const
{
return QString::number( value );
Expand Down
1 change: 1 addition & 0 deletions src/core/numericformats/qgsfallbacknumericformat.h
Expand Up @@ -35,6 +35,7 @@ class CORE_EXPORT QgsFallbackNumericFormat : public QgsNumericFormat
QgsFallbackNumericFormat() = default;
QString id() const override;
QString visibleName() const override;
int sortKey() override;
QString formatDouble( double value, const QgsNumericFormatContext &context ) const override;
QgsNumericFormat *clone() const override SIP_FACTORY;
QgsNumericFormat *create( const QVariantMap &configuration, const QgsReadWriteContext &context ) const override SIP_FACTORY;
Expand Down
5 changes: 5 additions & 0 deletions src/core/numericformats/qgsnumericformat.cpp
Expand Up @@ -26,6 +26,11 @@ QgsNumericFormatContext::QgsNumericFormatContext()
mDecimalSep = l.decimalPoint();
}

int QgsNumericFormat::sortKey()
{
return 100;
}

void QgsNumericFormat::writeXml( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const
{
const QVariantMap config = configuration( context );
Expand Down
7 changes: 7 additions & 0 deletions src/core/numericformats/qgsnumericformat.h
Expand Up @@ -152,6 +152,13 @@ class CORE_EXPORT QgsNumericFormat
*/
virtual QString visibleName() const = 0;

/**
* Returns a sorting key value, where formats with a lower sort key will be shown earlier in lists.
*
* Generally, subclasses should return QgsNumericFormat::sortKey() as their sorting key.
*/
virtual int sortKey();

/**
* Returns a formatted string representation of a numeric double value.
*/
Expand Down
8 changes: 8 additions & 0 deletions src/core/numericformats/qgsnumericformatregistry.cpp
Expand Up @@ -98,3 +98,11 @@ QString QgsNumericFormatRegistry::visibleName( const QString &id ) const

return QString();
}

int QgsNumericFormatRegistry::sortKey( const QString &id ) const
{
if ( mFormats.contains( id ) )
return mFormats.value( id )->sortKey();

return 0;
}
5 changes: 5 additions & 0 deletions src/core/numericformats/qgsnumericformatregistry.h
Expand Up @@ -102,6 +102,11 @@ class CORE_EXPORT QgsNumericFormatRegistry
*/
QString visibleName( const QString &id ) const;

/**
* Returns the sorting key for the format with matching \a id.
*/
int sortKey( const QString &id ) const;

private:
QHash<QString, QgsNumericFormat *> mFormats;
};
Expand Down
7 changes: 6 additions & 1 deletion src/core/numericformats/qgspercentagenumericformat.cpp
Expand Up @@ -29,7 +29,12 @@ QString QgsPercentageNumericFormat::id() const

QString QgsPercentageNumericFormat::visibleName() const
{
return QObject::tr( "Perctange" );
return QObject::tr( "Percentage" );
}

int QgsPercentageNumericFormat::sortKey()
{
return QgsNumericFormat::sortKey();
}

QString QgsPercentageNumericFormat::formatDouble( double value, const QgsNumericFormatContext &context ) const
Expand Down
1 change: 1 addition & 0 deletions src/core/numericformats/qgspercentagenumericformat.h
Expand Up @@ -43,6 +43,7 @@ class CORE_EXPORT QgsPercentageNumericFormat : public QgsBasicNumericFormat

QString id() const override;
QString visibleName() const override;
int sortKey() override;
QString formatDouble( double value, const QgsNumericFormatContext &context ) const override;
QgsNumericFormat *clone() const override SIP_FACTORY;
QgsNumericFormat *create( const QVariantMap &configuration, const QgsReadWriteContext &context ) const override SIP_FACTORY;
Expand Down
5 changes: 5 additions & 0 deletions src/core/numericformats/qgsscientificnumericformat.cpp
Expand Up @@ -33,6 +33,11 @@ QString QgsScientificNumericFormat::visibleName() const
return QObject::tr( "Scientific" );
}

int QgsScientificNumericFormat::sortKey()
{
return QgsNumericFormat::sortKey();
}

QString QgsScientificNumericFormat::formatDouble( double value, const QgsNumericFormatContext &context ) const
{
return QgsBasicNumericFormat::formatDouble( value, context );
Expand Down
1 change: 1 addition & 0 deletions src/core/numericformats/qgsscientificnumericformat.h
Expand Up @@ -36,6 +36,7 @@ class CORE_EXPORT QgsScientificNumericFormat : public QgsBasicNumericFormat

QString id() const override;
QString visibleName() const override;
int sortKey() override;
QString formatDouble( double value, const QgsNumericFormatContext &context ) const override;
QgsNumericFormat *clone() const override SIP_FACTORY;
QgsNumericFormat *create( const QVariantMap &configuration, const QgsReadWriteContext &context ) const override SIP_FACTORY;
Expand Down
38 changes: 31 additions & 7 deletions src/gui/numericformats/qgsnumericformatselectorwidget.cpp
Expand Up @@ -17,24 +17,27 @@
#include "qgsapplication.h"
#include "qgsnumericformatregistry.h"
#include "qgsnumericformat.h"
#include "qgis.h"
#include <mutex>


static void _initWidgetFunctions()
{
static bool sInitialized = false;
if ( sInitialized )
return;
static std::once_flag initialized;
std::call_once( initialized, [ = ]
{

sInitialized = true;
} );
}


QgsNumericFormatSelectorWidget::QgsNumericFormatSelectorWidget( QWidget *parent )
: QgsPanelWidget( parent )
{
setupUi( this );
_initWidgetFunctions();

populateTypes();
mCategoryCombo->setCurrentIndex( 0 );
}

void QgsNumericFormatSelectorWidget::setFormat( const QgsNumericFormat *format )
Expand All @@ -44,10 +47,14 @@ void QgsNumericFormatSelectorWidget::setFormat( const QgsNumericFormat *format )

const QString id = format->id();
const int index = mCategoryCombo->findData( id );
const QString prevId = mCategoryCombo->currentData().toString();
if ( index < 0 )
mCategoryCombo->setCurrentIndex( mCategoryCombo->findData( QStringLiteral( "fallback" ) ) );
else
mCategoryCombo->setCurrentIndex( index );

if ( prevId != id )
emit changed();
}

QgsNumericFormat *QgsNumericFormatSelectorWidget::format() const
Expand All @@ -57,8 +64,25 @@ QgsNumericFormat *QgsNumericFormatSelectorWidget::format() const

void QgsNumericFormatSelectorWidget::populateTypes()
{
const QStringList ids = QgsApplication::numericFormatRegistry()->formats();
QStringList ids = QgsApplication::numericFormatRegistry()->formats();

std::sort( ids.begin(), ids.end(), [ = ]( const QString & a, const QString & b )->bool
{
if ( QgsApplication::numericFormatRegistry()->sortKey( a ) < QgsApplication::numericFormatRegistry()->sortKey( b ) )
return true;
else if ( QgsApplication::numericFormatRegistry()->sortKey( a ) > QgsApplication::numericFormatRegistry()->sortKey( b ) )
return false;
else
{
int res = QString::localeAwareCompare( QgsApplication::numericFormatRegistry()->visibleName( a ), QgsApplication::numericFormatRegistry()->visibleName( b ) );
if ( res < 0 )
return true;
else if ( res > 0 )
return false;
}
return false;
} );

for ( const QString &id : ids )
for ( const QString &id : qgis::as_const( ids ) )
mCategoryCombo->addItem( QgsApplication::numericFormatRegistry()->visibleName( id ), id );
}
7 changes: 7 additions & 0 deletions src/gui/numericformats/qgsnumericformatselectorwidget.h
Expand Up @@ -50,6 +50,13 @@ class GUI_EXPORT QgsNumericFormatSelectorWidget : public QgsPanelWidget, private
*/
QgsNumericFormat *format() const SIP_TRANSFERBACK;

signals:

/**
* Emitted whenever the format configured in the widget is changed.
*/
void changed();

private:

void populateTypes();
Expand Down

0 comments on commit 6b9cafb

Please sign in to comment.