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 )
462QWidget *QgsSettingsTreeItemDelegate::createEditor( QWidget *parent,
const QStyleOptionViewItem &option,
const QModelIndex &index )
const
467 QModelIndex sourceIndex = index;
471 sourceIndex = proxyModel->mapToSource( index );
473 QgsSettingsTreeModelNodeData *nodeData = mModel->index2node( sourceIndex );
474 if ( nodeData->type() == QgsSettingsTreeModelNodeData::Type::Setting )
482void QgsSettingsTreeItemDelegate::setEditorData( QWidget *editor,
const QModelIndex &index )
const
487 const QVariant value = index.model()->data( index, Qt::DisplayRole );
492void QgsSettingsTreeItemDelegate::setModelData( QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index )
const
503 : QSortFilterProxyModel( parent )
506 QSortFilterProxyModel::setSourceModel( mSourceModel );
511 if ( filterText == mFilterText )
514 mFilterText = filterText;
520 QgsSettingsTreeModelNodeData *node = mSourceModel->index2node( mSourceModel->index( source_row,
static_cast<int>(
QgsSettingsTreeModel::Column::Name ), source_parent ) );
521 return nodeShown( node );
524bool QgsSettingsTreeProxyModel::nodeShown( QgsSettingsTreeModelNodeData *node )
const
528 if ( node->type() == QgsSettingsTreeModelNodeData::Type::Setting )
530 if ( node->name().contains( mFilterText, Qt::CaseInsensitive ) )
534 QModelIndex index = mSourceModel->
node2index( node ).parent();
535 while ( ( index.isValid() ) )
538 if ( parentNode->name().contains( mFilterText, Qt::CaseInsensitive ) )
541 index = index.parent();
548 if ( node->name().contains( mFilterText, Qt::CaseInsensitive ) )
551 const auto constChildren = node->children();
552 for ( QgsSettingsTreeModelNodeData *child : constChildren )
554 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)