26#include <QGuiApplication>
28#include "moc_qgssettingstreemodel.cpp"
33QgsSettingsTreeModelNodeData *QgsSettingsTreeModelNodeData::createRootNodeData(
const QgsSettingsTreeNode *rootNode, QObject *parent =
nullptr )
35 QgsSettingsTreeModelNodeData *nodeData =
new QgsSettingsTreeModelNodeData( parent );
36 nodeData->mType = Type::RootNode;
37 nodeData->mName = rootNode->
key();
38 nodeData->mTreeNode = rootNode;
39 nodeData->fillChildren();
43void QgsSettingsTreeModelNodeData::applyChanges()
47 case Type::NamedListTreeNode:
50 case Type::NamedListItem:
52 QList<QgsSettingsTreeModelNodeData *>::iterator it = mChildren.begin();
53 for ( ; it != mChildren.end(); ++it )
54 ( *it )->applyChanges();
61 setting()->setVariantValue( mValue, mNamedParentNodes );
68bool QgsSettingsTreeModelNodeData::setValue(
const QVariant &value )
70 Q_ASSERT( mType == Type::Setting );
71 if ( !value.isValid() && mValue.isValid() )
77 else if ( !mValue.isValid() || mValue != value )
80 mIsEdited = ( value != mOriginalValue );
89 QgsSettingsTreeModelNodeData *nodeData =
new QgsSettingsTreeModelNodeData(
this );
90 nodeData->mParent =
this;
91 nodeData->mNamedParentNodes = mNamedParentNodes;
92 nodeData->mName = node->
key();
93 nodeData->mTreeNode = node;
96 nodeData->mType = Type::NamedListTreeNode;
98 const QStringList items = nln->
items( mNamedParentNodes );
99 for (
const QString &item : items )
101 nodeData->addChildForNamedListItemNode( item, nln );
106 nodeData->mType = Type::TreeNode;
107 nodeData->fillChildren();
109 mChildren.append( nodeData );
112void QgsSettingsTreeModelNodeData::addChildForNamedListItemNode(
const QString &item,
const QgsSettingsTreeNamedListNode *namedListNode )
114 QgsSettingsTreeModelNodeData *nodeData =
new QgsSettingsTreeModelNodeData(
this );
115 nodeData->mType = Type::NamedListItem;
116 nodeData->mParent =
this;
117 nodeData->mNamedParentNodes = mNamedParentNodes;
118 nodeData->mNamedParentNodes.append( item );
119 nodeData->mName = item;
120 nodeData->mTreeNode = namedListNode;
121 nodeData->fillChildren();
122 mChildren.append( nodeData );
127 QgsSettingsTreeModelNodeData *nodeData =
new QgsSettingsTreeModelNodeData(
this );
128 nodeData->mType = Type::Setting;
129 nodeData->mParent =
this;
130 nodeData->mNamedParentNodes = mNamedParentNodes;
131 nodeData->mSetting = setting;
132 nodeData->mName = setting->
name();
134 nodeData->mOriginalValue = nodeData->mValue;
135 nodeData->mExists = setting->
exists( mNamedParentNodes );
137 switch ( mNamedParentNodes.count() )
143 QgsDebugMsgLevel( QString(
"getting %1 with %2 and %3" ).arg( setting->
definitionKey(), mNamedParentNodes.at( 0 ), mNamedParentNodes.at( 1 ) ), 3 );
154 mChildren.append( nodeData );
157void QgsSettingsTreeModelNodeData::fillChildren()
159 const QList<QgsSettingsTreeNode *> childrenNodes = mTreeNode->childrenNodes();
162 addChildForTreeNode( childNode );
164 const QList<const QgsSettingsEntryBase *> childrenSettings = mTreeNode->childrenSettings();
167 addChildForSetting( setting );
175 : QAbstractItemModel(
parent )
177 mRootNode = QgsSettingsTreeModelNodeData::createRootNodeData( rootNode,
this );
179 QPalette
pal = qApp->palette();
180 mEditedColorBack =
pal.color( QPalette::Active, QPalette::Dark );
181 mEditedColorFore =
pal.color( QPalette::Active, QPalette::BrightText );
182 mNotSetColor =
pal.color( QPalette::Disabled, QPalette::WindowText );
193 mRootNode->applyChanges();
199 if ( !
index.isValid() )
202 QObject *obj =
reinterpret_cast<QObject *
>(
index.internalPointer() );
203 return qobject_cast<QgsSettingsTreeModelNodeData *>( obj );
208 if ( !node || !node->parent() )
209 return QModelIndex();
211 QModelIndex parentIndex =
node2index( node->parent() );
213 int row = node->parent()->children().indexOf( node );
214 Q_ASSERT( row >= 0 );
222 return QModelIndex();
226 return QModelIndex();
229 return createIndex( row, column,
static_cast<QObject *
>( n->children().at( row ) ) );
234 if ( !child.isValid() )
235 return QModelIndex();
237 if ( QgsSettingsTreeModelNodeData *n =
index2node( child ) )
239 return indexOfParentSettingsTreeNode( n->parent() );
244 return QModelIndex();
248QModelIndex QgsSettingsTreeModel::indexOfParentSettingsTreeNode( QgsSettingsTreeModelNodeData *parentNode )
const
250 Q_ASSERT( parentNode );
252 const QgsSettingsTreeModelNodeData *grandParentNode = parentNode->parent();
253 if ( !grandParentNode )
254 return QModelIndex();
256 int row = grandParentNode->children().indexOf( parentNode );
257 Q_ASSERT( row >= 0 );
259 return createIndex( row, 0,
static_cast<QObject *
>( parentNode ) );
268 return n->children().count();
284 if ( role == Qt::ForegroundRole && node->type() == QgsSettingsTreeModelNodeData::Type::Setting )
286 if ( !node->exists() )
294 return mEditedColorFore;
298 if ( role == Qt::BackgroundRole && node->type() == QgsSettingsTreeModelNodeData::Type::Setting )
303 return mEditedColorBack;
311 if ( role == Qt::DisplayRole || role == Qt::EditRole )
320 if ( role == Qt::CheckStateRole )
322 if ( node->type() == QgsSettingsTreeModelNodeData::Type::Setting && node->setting()->settingsType() ==
Qgis::SettingsType::Bool )
325 return node->value().toBool() ? Qt::Checked : Qt::Unchecked;
328 if ( role == Qt::DisplayRole || role == Qt::EditRole )
330 if ( node->type() == QgsSettingsTreeModelNodeData::Type::Setting && node->setting()->settingsType() ==
Qgis::SettingsType::Bool )
337 return node->value();
340 else if ( role == Qt::BackgroundRole )
342 if ( node->type() == QgsSettingsTreeModelNodeData::Type::Setting )
344 switch ( node->setting()->settingsType() )
358 return node->value();
367 if ( node->type() == QgsSettingsTreeModelNodeData::Type::Setting )
369 if ( role == Qt::DisplayRole || role == Qt::EditRole )
371 return node->setting()->description();
386 if ( orientation == Qt::Orientation::Horizontal && role == Qt::DisplayRole )
388 switch (
static_cast<Column>( section ) )
393 return tr(
"Value" );
395 return tr(
"Description" );
407 if ( nodeData->type() == QgsSettingsTreeModelNodeData::Type::Setting )
411 return Qt::ItemIsUserCheckable | Qt::ItemIsEnabled;
415 return Qt::ItemIsEnabled | Qt::ItemIsEditable;
421 return Qt::ItemIsEnabled;
423 return Qt::NoItemFlags;
430 if ( role == Qt::EditRole || role == Qt::CheckStateRole )
433 if ( nodeData->type() == QgsSettingsTreeModelNodeData::Type::Setting )
435 if ( role == Qt::CheckStateRole )
438 nodeData->setValue( value == Qt::Checked ?
true :
false );
442 nodeData->setValue( value );
456QgsSettingsTreeItemDelegate::QgsSettingsTreeItemDelegate(
QgsSettingsTreeModel *model, QObject *parent )
457 : QItemDelegate( parent )
461QWidget *QgsSettingsTreeItemDelegate::createEditor( QWidget *parent,
const QStyleOptionViewItem &option,
const QModelIndex &index )
const
466 QModelIndex sourceIndex = index;
470 sourceIndex = proxyModel->mapToSource( index );
472 QgsSettingsTreeModelNodeData *nodeData = mModel->index2node( sourceIndex );
473 if ( nodeData->type() == QgsSettingsTreeModelNodeData::Type::Setting )
481void QgsSettingsTreeItemDelegate::setEditorData( QWidget *editor,
const QModelIndex &index )
const
486 const QVariant value = index.model()->data( index, Qt::DisplayRole );
491void QgsSettingsTreeItemDelegate::setModelData( QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index )
const
502 : QSortFilterProxyModel( parent )
505 QSortFilterProxyModel::setSourceModel( mSourceModel );
510 if ( filterText == mFilterText )
513 mFilterText = filterText;
519 QgsSettingsTreeModelNodeData *node = mSourceModel->index2node( mSourceModel->index( source_row,
static_cast<int>(
QgsSettingsTreeModel::Column::Name ), source_parent ) );
520 return nodeShown( node );
523bool QgsSettingsTreeProxyModel::nodeShown( QgsSettingsTreeModelNodeData *node )
const
527 if ( node->type() == QgsSettingsTreeModelNodeData::Type::Setting )
529 if ( node->name().contains( mFilterText, Qt::CaseInsensitive ) )
533 QModelIndex index = mSourceModel->
node2index( node ).parent();
534 while ( ( index.isValid() ) )
537 if ( parentNode->name().contains( mFilterText, Qt::CaseInsensitive ) )
540 index = index.parent();
547 if ( node->name().contains( mFilterText, Qt::CaseInsensitive ) )
550 const auto constChildren = node->children();
551 for ( QgsSettingsTreeModelNodeData *child : constChildren )
553 if ( nodeShown( child ) )
@ NamedList
Named List Node.
@ Variant
Generic variant.
@ Custom
Custom implementation.
@ StringList
List of strings.
@ VariantMap
Map of strings.
@ Double
Double precision number.
static QgsSettingsEditorWidgetRegistry * settingsEditorWidgetRegistry()
Returns the registry of settings editors.
Represents a settings entry and provides methods for reading and writing settings values.
bool exists(const QString &dynamicKeyPart=QString()) const
Returns true if the settings is contained in the underlying QSettings.
QString name() const
Returns the name of the settings.
QString definitionKey() const
Returns settings entry defining key.
QVariant valueAsVariant(const QString &dynamicKeyPart=QString()) const
Returns settings value with.
A tree model for the settings tree.
bool setData(const QModelIndex &index, const QVariant &value, int role) override
QVariant data(const QModelIndex &index, int role) const override
QModelIndex index(int row, int column, const QModelIndex &parent) const override
Qt::ItemFlags flags(const QModelIndex &index) const override
QModelIndex node2index(QgsSettingsTreeModelNodeData *node) const
Returns the index from the settings tree node.
@ Description
Description.
QVariant headerData(int section, Qt::Orientation orientation, int role) const override
void applyChanges()
Apply pending changes in the model to the corresponding settings.
int columnCount(const QModelIndex &parent) const override
QgsSettingsTreeModelNodeData * index2node(const QModelIndex &index) const
Returns settings tree node for given index or the root node if the index is invalid.
QgsSettingsTreeModel(QgsSettingsTreeNode *rootNode=nullptr, QObject *parent=nullptr)
Constructor.
QModelIndex parent(const QModelIndex &child) const override
int rowCount(const QModelIndex &parent) const override
~QgsSettingsTreeModel() override
A named list tree node for the settings tree to help organizing and introspecting the tree.
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.
Qgis::SettingsTreeNodeType type() const
Returns the type of node.
QString key() const
Returns the key of the node (without its parents).
A proxy model which allows filtering the settings tree.
QgsSettingsTreeProxyModel(QgsSettingsTreeNode *rootNode=nullptr, QObject *parent=nullptr)
Constructor.
void setFilterText(const QString &filterText=QString())
Sets the filter text.
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override
#define QgsDebugMsgLevel(str, level)
#define QgsDebugError(str)