From c637a17b6531bbf962ca66968d17065ac2e74dad Mon Sep 17 00:00:00 2001 From: Denis Rouzaud Date: Fri, 30 Aug 2019 12:12:46 +0200 Subject: [PATCH] add classification methods registry --- src/core/qgsapplication.cpp | 8 +++ src/core/qgsapplication.h | 9 +++ .../qgsclassificationmethodregistry.cpp | 54 ++++++++++++++++++ .../qgsclassificationmethodregistry.h | 55 +++++++++++++++++++ 4 files changed, 126 insertions(+) create mode 100644 src/core/symbology/classification/qgsclassificationmethodregistry.cpp create mode 100644 src/core/symbology/classification/qgsclassificationmethodregistry.h diff --git a/src/core/qgsapplication.cpp b/src/core/qgsapplication.cpp index 591a892d6ba..45c9cba8698 100644 --- a/src/core/qgsapplication.cpp +++ b/src/core/qgsapplication.cpp @@ -41,6 +41,7 @@ #include "qgssymbollayerutils.h" #include "callouts/qgscalloutsregistry.h" #include "qgspluginlayerregistry.h" +#include "qgsclassificationmethodregistry.h" #include "qgsmessagelog.h" #include "qgsannotationregistry.h" #include "qgssettings.h" @@ -1920,6 +1921,11 @@ QgsPluginLayerRegistry *QgsApplication::pluginLayerRegistry() return members()->mPluginLayerRegistry; } +QgsClassificationMethodRegistry *QgsApplication::classificationMethodRegistry() +{ + return members()->mClassificationMethodRegistry; +} + QgsMessageLog *QgsApplication::messageLog() { return members()->mMessageLog; @@ -1983,6 +1989,7 @@ QgsApplication::ApplicationMembers::ApplicationMembers() mProjectStorageRegistry = new QgsProjectStorageRegistry(); mNetworkContentFetcherRegistry = new QgsNetworkContentFetcherRegistry(); mValidityCheckRegistry = new QgsValidityCheckRegistry(); + mClassificationMethodRegistry = new QgsClassificationMethodRegistry(); } QgsApplication::ApplicationMembers::~ApplicationMembers() @@ -2010,6 +2017,7 @@ QgsApplication::ApplicationMembers::~ApplicationMembers() delete mSymbolLayerRegistry; delete mTaskManager; delete mNetworkContentFetcherRegistry; + delete mClassificationMethodRegistry; } QgsApplication::ApplicationMembers *QgsApplication::members() diff --git a/src/core/qgsapplication.h b/src/core/qgsapplication.h index f6d1be1d63a..5ac4bd4249f 100644 --- a/src/core/qgsapplication.h +++ b/src/core/qgsapplication.h @@ -40,6 +40,7 @@ class QgsRasterRendererRegistry; class QgsGpsConnectionRegistry; class QgsDataItemProviderRegistry; class QgsPluginLayerRegistry; +class QgsClassificationMethodRegistry; class QgsMessageLog; class QgsProcessingRegistry; class QgsAnnotationRegistry; @@ -637,6 +638,13 @@ class CORE_EXPORT QgsApplication : public QApplication */ static QgsPluginLayerRegistry *pluginLayerRegistry() SIP_KEEPREFERENCE; + /** + * Returns the application's classification methods registry, used in graduated renderer + * \since QGIS 3.10 + */ + static QgsClassificationMethodRegistry *classificationMethodRegistry() SIP_KEEPREFERENCE; + + /** * Returns the application's message log. * \since QGIS 3.0 @@ -869,6 +877,7 @@ class CORE_EXPORT QgsApplication : public QApplication QgsMessageLog *mMessageLog = nullptr; QgsPaintEffectRegistry *mPaintEffectRegistry = nullptr; QgsPluginLayerRegistry *mPluginLayerRegistry = nullptr; + QgsClassificationMethodRegistry *mClassificationMethodRegistry = nullptr; QgsProcessingRegistry *mProcessingRegistry = nullptr; QgsProjectStorageRegistry *mProjectStorageRegistry = nullptr; QgsPageSizeRegistry *mPageSizeRegistry = nullptr; diff --git a/src/core/symbology/classification/qgsclassificationmethodregistry.cpp b/src/core/symbology/classification/qgsclassificationmethodregistry.cpp new file mode 100644 index 00000000000..c3e69ec842b --- /dev/null +++ b/src/core/symbology/classification/qgsclassificationmethodregistry.cpp @@ -0,0 +1,54 @@ +/*************************************************************************** + qgsclassificationmethodregistry.h + --------------------- + begin : September 2019 + copyright : (C) 2019 by Denis Rouzaud + email : denis@opengis.ch + *************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + + +#include "qgsclassificationmethodregistry.h" + +// classification methods +#include "qgsclassificationcustom.h" +#include "qgsclassificationequalinterval.h" +#include "qgsclassificationquantile.h" +#include "qgsclassificationjenks.h" +#include "qgsclassificationstandarddeviation.h" +#include "qgsclassificationprettybreaks.h" + +QgsClassificationMethodRegistry::QgsClassificationMethodRegistry() +{ + addMethod( new QgsClassificationEqualInterval() ); + addMethod( new QgsClassificationQuantile() ); + addMethod( new QgsClassificationJenks() ); + addMethod( new QgsClassificationStandardDeviation() ); + addMethod( new QgsClassificationPrettyBreaks() ); +} + +void QgsClassificationMethodRegistry::addMethod( QgsClassificationMethod *method ) +{ + mMethods.insert( method->id(), method ); +} + +QgsClassificationMethod *QgsClassificationMethodRegistry::method( const QString &id ) +{ + QgsClassificationMethod *method = mMethods.value( id, new QgsClassificationCustom() ); + return method->clone(); +} + +QMap QgsClassificationMethodRegistry::methodNames() const +{ + QMap methods; + for ( const QgsClassificationMethod *method : qgis::as_const( mMethods ) ) + methods.insert( method->id(), method->name() ); + return methods; +} + diff --git a/src/core/symbology/classification/qgsclassificationmethodregistry.h b/src/core/symbology/classification/qgsclassificationmethodregistry.h new file mode 100644 index 00000000000..02b6206b43d --- /dev/null +++ b/src/core/symbology/classification/qgsclassificationmethodregistry.h @@ -0,0 +1,55 @@ +/*************************************************************************** + qgsclassificationmethodregistry.h + --------------------- + begin : September 2019 + copyright : (C) 2019 by Denis Rouzaud + email : denis@opengis.ch + *************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + + +#ifndef QGSCLASSIFICATIONMETHODREGISTRY_H +#define QGSCLASSIFICATIONMETHODREGISTRY_H + +#include + +#include "qgis_core.h" +#include "qgis_sip.h" + +class QgsClassificationMethod; + +/** + * \ingroup gui + * This class manages all known classification methods + * + * QgsClassificationMethodRegistry is not usually directly created, but rather accessed through + * QgsApplication::classificationMethodRegistry(). + * + * \since QGIS 3.10 + */ +class CORE_EXPORT QgsClassificationMethodRegistry +{ + public: + QgsClassificationMethodRegistry(); + + //! Adds a method to the registry + void addMethod( QgsClassificationMethod *method SIP_TRANSFER ); + + //! Return a new instance of the method for the given id + QgsClassificationMethod *method( const QString &id ); + + //! Returns a map of all registered methods + QMap methodNames() const; + + private: + + QMap mMethods; +}; + +#endif // QGSCLASSIFICATIONMETHODREGISTRY_H