25#include "moc_qgssettingstreenode.cpp"
27using namespace Qt::StringLiterals;
32 mParent->unregisterChildNode(
this );
38 const auto nodes = mChildrenNodes;
39 for (
const auto *node : nodes )
41 const auto settings = mChildrenSettings;
42 for (
const auto *setting : settings )
48 QgsSettingsTreeNode *te =
new QgsSettingsTreeNode();
51 te->mCompleteKey = u
"/"_s;
61 throw QgsSettingsException( QObject::tr(
"Settings tree node '%1' already holds a child setting with key '%2'." ).arg( this->
key(), key ) );
63 te =
new QgsSettingsTreeNode();
65 te->init(
this,
key );
78 throw QgsSettingsException( QObject::tr(
"Settings tree node '%1' already holds a child node with key '%2', but it is not a named list.." ).arg( this->
key(), key ) );
81 throw QgsSettingsException( QObject::tr(
"Settings tree node '%1' already holds a child setting with key '%2'." ).arg( this->
key(), key ) );
85 te->init(
this,
key );
94 QList<QgsSettingsTreeNode *>::const_iterator it = mChildrenNodes.constBegin();
95 for ( ; it != mChildrenNodes.constEnd(); ++it )
97 if ( ( *it )->key() ==
key )
105 const QString testCompleteKey = u
"%1%2"_s.arg( mCompleteKey,
key );
106 QList<const QgsSettingsEntryBase *>::const_iterator it = mChildrenSettings.constBegin();
107 for ( ; it != mChildrenSettings.constEnd(); ++it )
109 if ( ( *it )->definitionKey() == testCompleteKey )
118 throw QgsSettingsException( QObject::tr(
"Settings tree node '%1' already holds a child tree node with key '%2'." ).arg( this->
key(), key ) );
120 throw QgsSettingsException( QObject::tr(
"Settings tree node '%1' already holds a child setting with key '%2'." ).arg( this->
key(), key ) );
122 mChildrenSettings.append( setting );
128 mChildrenNodes.append( node );
133 if ( deleteSettingValues )
134 setting->
remove( parentsNamedItems );
136 mChildrenSettings.removeAll( setting );
141 mChildrenNodes.removeAll( node );
159 mSelectedItemSetting = std::make_unique<QgsSettingsEntryString>( u
"%1/selected"_s.arg( mCompleteKey ),
nullptr );
162 mNamedNodesCount = mParent->namedNodesCount() + 1;
163 mItemsCompleteKey = u
"%1items/"_s.arg( mCompleteKey );
164 mCompleteKey.append( u
"items/%%1/"_s.arg( mNamedNodesCount ) );
180 QObject::tr(
"The number of given parent named items (%1) for the node '%2' doesn't match with the number of named items in the key (%3)." )
181 .arg( QString::number( parentsNamedItems.count() ), mCompleteKey, QString::number(
namedNodesCount() ) )
184 const QString completeKeyParam = completeKeyWithNamedItems( mItemsCompleteKey, parentsNamedItems );
192 settings.beginGroup( completeKeyParam );
193 res = settings.childGroups();
201 for (
const QString &group : globalGroups )
203 if ( !res.contains( group ) )
215 QObject::tr(
"The number of given parent named items (%1) for the node '%2' doesn't match with the number of named items in the key (%3)." )
216 .arg( QString::number( parentsNamedItems.count() ), mCompleteKey, QString::number(
namedNodesCount() ) )
219 throw QgsSettingsException( QObject::tr(
"The named list node '%1' has no option to set the current selected entry." ).arg( mCompleteKey ) );
221 mSelectedItemSetting->setValue( item, parentsNamedItems );
228 QObject::tr(
"The number of given parent named items (%1) for the node '%2' doesn't match with the number of named items in the key (%3)." )
229 .arg( QString::number( parentsNamedItems.count() ), mCompleteKey, QString::number(
namedNodesCount() ) )
232 throw QgsSettingsException( QObject::tr(
"The named list node '%1' has no option to set the current selected entry." ).arg( mCompleteKey ) );
234 return mSelectedItemSetting->value( parentsNamedItems );
241 QObject::tr(
"The number of given parent named items (%1) doesn't match with the number of named items in the key (%2)." ).arg( parentsNamedItems.count(),
namedNodesCount() )
244 QStringList args = parentsNamedItems;
246 QString
key = completeKeyWithNamedItems( mCompleteKey, args );
254 QObject::tr(
"The number of given parent named items (%1) doesn't match with the number of named items in the key (%2)." ).arg( parentsNamedItems.count(),
namedNodesCount() )
257 const QStringList children =
items( parentsNamedItems );
259 for (
const QString &child : children )
261 QStringList args = parentsNamedItems;
263 QString
key = completeKeyWithNamedItems( mCompleteKey, args );
264 settings.remove(
key );
268QString QgsSettingsTreeNamedListNode::completeKeyWithNamedItems(
const QString &key,
const QStringList &namedItems )
const
270 switch ( namedItems.count() )
275 return key.arg( namedItems[0] );
277 return key.arg( namedItems[0], namedItems[1] );
279 return key.arg( namedItems[0], namedItems[1], namedItems[2] );
281 return key.arg( namedItems[0], namedItems[1], namedItems[2], namedItems[3] );
283 return key.arg( namedItems[0], namedItems[1], namedItems[2], namedItems[3], namedItems[4] );
285 throw QgsSettingsException( QObject::tr(
"Current implementation of QgsSettingsTreeNamedListNode::items doesn't handle more than 5 parent named items" ) );
@ NamedList
Named List Node.
QFlags< SettingsTreeNodeOption > SettingsTreeNodeOptions
@ NamedListSelectedItemSetting
Creates a setting to store which is the current item.
SettingsOrigin
The setting origin describes where a setting is stored.
@ Global
Global settings are stored in qgis_global_settings.ini.
@ Local
Local settings are stored in the user profile.
Represents a settings entry and provides methods for reading and writing settings values.
static QStringList globalChildGroups(const QString &prefix)
Returns the list of child group names found under prefix in the global defaults hash.
static QSettings & userSettings()
Returns a reference to the thread-local QSettings instance used internally by all QgsSettingsEntry op...
void remove(const QString &dynamicKeyPart=QString()) const
Removes the settings from the underlying QSettings.
Custom exception class for settings related exceptions.
void deleteAllItems(const QStringList &parentsNamedItems=QStringList())
Deletes all items from the named list node.
void deleteItem(const QString &item, const QStringList &parentsNamedItems=QStringList())
Deletes a named item from the named list node.
void initNamedList(const Qgis::SettingsTreeNodeOptions &options)
Init the nodes with the specific options.
~QgsSettingsTreeNamedListNode() override
QString selectedItem(const QStringList &parentsNamedItems=QStringList())
Returns the selected named item from the named list node.
void setSelectedItem(const QString &item, const QStringList &parentsNamedItems=QStringList())
Sets the selected named item from the named list node.
QStringList items(const QStringList &parentsNamedItems=QStringList()) const
Returns the list of items.
A tree node for the settings tree to help organizing and introspecting the tree.
void registerChildNode(QgsSettingsTreeNode *node)
Registers a child nodes.
Qgis::SettingsTreeNodeType type() const
Returns the type of node.
QgsSettingsTreeNode * createChildNode(const QString &key)
Creates a normal tree node It will return the existing child node if it exists at the given key.
Qgis::SettingsTreeNodeType mType
QgsSettingsTreeNode * childNode(const QString &key) const
Returns the existing child node if it exists at the given key.
QString completeKey() const
Returns the complete key of the node (including its parents).
int namedNodesCount() const
Returns the number of named nodes in the complete key.
static QgsSettingsTreeNode * createRootNode()
Creates a tree root node.
QString key() const
Returns the key of the node (without its parents).
friend class QgsSettingsTreeNamedListNode
void unregisterChildSetting(const QgsSettingsEntryBase *setting, bool deleteSettingValues=false, const QStringList &parentsNamedItems=QStringList())
Unregisters the child setting.
virtual ~QgsSettingsTreeNode()
QgsSettingsTreeNode * parent() const
Returns the parent of the node or nullptr if it does not exists.
void unregisterChildNode(QgsSettingsTreeNode *node)
Unregisters the child tree node.
void registerChildSetting(const QgsSettingsEntryBase *setting, const QString &key)
Registers a child setting.
const QgsSettingsEntryBase * childSetting(const QString &key) const
Returns the existing child settings if it exists at the given key.
QgsSettingsTreeNamedListNode * createNamedListNode(const QString &key, const Qgis::SettingsTreeNodeOptions &options=Qgis::SettingsTreeNodeOptions())
Creates a named list tree node.