16#include <QGuiApplication> 
   30QgsSettingsTreeModelNodeData *QgsSettingsTreeModelNodeData::createRootNodeData( 
const QgsSettingsTreeNode *rootNode, QObject *parent = 
nullptr )
 
   32  QgsSettingsTreeModelNodeData *nodeData = 
new QgsSettingsTreeModelNodeData( parent );
 
   33  nodeData->mType = Type::RootNode;
 
   34  nodeData->mName = rootNode->
key();
 
   35  nodeData->mTreeNode = rootNode;
 
   36  nodeData->fillChildren();
 
   40void QgsSettingsTreeModelNodeData::applyChanges()
 
   44    case Type::NamedListTreeNode:
 
   47    case Type::NamedListItem:
 
   49      QList<QgsSettingsTreeModelNodeData *>::iterator it = mChildren.begin();
 
   50      for ( ; it != mChildren.end(); ++it )
 
   51        ( *it )->applyChanges();
 
   58        setting()->setVariantValue( mValue, mNamedParentNodes );
 
   65bool QgsSettingsTreeModelNodeData::setValue( 
const QVariant &value )
 
   67  Q_ASSERT( mType == Type::Setting );
 
   68  if ( !value.isValid() && mValue.isValid() )
 
   74  else if ( !mValue.isValid() || mValue != value )
 
   77    mIsEdited = ( value != mOriginalValue );
 
   86  QgsSettingsTreeModelNodeData *nodeData = 
new QgsSettingsTreeModelNodeData( 
this );
 
   87  nodeData->mParent = 
this;
 
   88  nodeData->mNamedParentNodes = mNamedParentNodes;
 
   89  nodeData->mName = node->
key();
 
   90  nodeData->mTreeNode = node;
 
   93    nodeData->
mType = Type::NamedListTreeNode;
 
   95    const QStringList items = nln->
items( mNamedParentNodes );
 
   96    for ( 
const QString &item : items )
 
   98      nodeData->addChildForNamedListItemNode( item, nln );
 
  103    nodeData->mType = Type::TreeNode;
 
  104    nodeData->fillChildren();
 
  106  mChildren.append( nodeData );
 
  109void QgsSettingsTreeModelNodeData::addChildForNamedListItemNode( 
const QString &item, 
const QgsSettingsTreeNamedListNode *namedListNode )
 
  111  QgsSettingsTreeModelNodeData *nodeData = 
new QgsSettingsTreeModelNodeData( 
this );
 
  112  nodeData->mType = Type::NamedListItem;
 
  113  nodeData->mParent = 
this;
 
  114  nodeData->mNamedParentNodes = mNamedParentNodes;
 
  115  nodeData->mNamedParentNodes.append( item );
 
  116  nodeData->mName = item;
 
  117  nodeData->mTreeNode = namedListNode;
 
  118  nodeData->fillChildren();
 
  119  mChildren.append( nodeData );
 
  124  QgsSettingsTreeModelNodeData *nodeData = 
new QgsSettingsTreeModelNodeData( 
this );
 
  125  nodeData->mType = Type::Setting;
 
  126  nodeData->mParent = 
this;
 
  127  nodeData->mNamedParentNodes = mNamedParentNodes;
 
  128  nodeData->mSetting = setting;
 
  129  nodeData->mName = setting->
name();
 
  131  nodeData->mOriginalValue = nodeData->mValue;
 
  132  nodeData->mExists = setting->
exists( mNamedParentNodes );
 
  134  switch ( mNamedParentNodes.count() )
 
  140      QgsDebugMsgLevel( QString( 
"getting %1 with %2 and %3" ).arg( setting->
definitionKey(), mNamedParentNodes.at( 0 ), mNamedParentNodes.at( 1 ) ), 3 );
 
  151  mChildren.append( nodeData );
 
  154void QgsSettingsTreeModelNodeData::fillChildren()
 
  156  const QList<QgsSettingsTreeNode *> childrenNodes = mTreeNode->childrenNodes();
 
  159    addChildForTreeNode( childNode );
 
  161  const QList<const QgsSettingsEntryBase *> childrenSettings = mTreeNode->childrenSettings();
 
  164    addChildForSetting( setting );
 
  173  : QAbstractItemModel( parent )
 
  175  mRootNode = QgsSettingsTreeModelNodeData::createRootNodeData( rootNode, 
this );
 
  177  QPalette 
pal = qApp->palette();
 
  178  mEditedColorBack = 
pal.color( QPalette::Active, QPalette::Dark );
 
  179  mEditedColorFore = 
pal.color( QPalette::Active, QPalette::BrightText );
 
  180  mNotSetColor = 
pal.color( QPalette::Disabled, QPalette::WindowText );
 
 
  191  mRootNode->applyChanges();
 
 
  197  if ( !
index.isValid() )
 
  200  QObject *obj = 
reinterpret_cast<QObject *
>( 
index.internalPointer() );
 
  201  return qobject_cast<QgsSettingsTreeModelNodeData *>( obj );
 
 
  206  if ( !node || !node->parent() )
 
  207    return QModelIndex(); 
 
  209  QModelIndex parentIndex = 
node2index( node->parent() );
 
  211  int row = node->parent()->children().indexOf( node );
 
  212  Q_ASSERT( row >= 0 );
 
 
  221    return QModelIndex();
 
  225    return QModelIndex(); 
 
  228  return createIndex( row, column, 
static_cast<QObject *
>( n->children().at( row ) ) );
 
 
  233  if ( !child.isValid() )
 
  234    return QModelIndex();
 
  236  if ( QgsSettingsTreeModelNodeData *n = 
index2node( child ) )
 
  238    return indexOfParentSettingsTreeNode( n->parent() ); 
 
  243    return QModelIndex();
 
 
  247QModelIndex QgsSettingsTreeModel::indexOfParentSettingsTreeNode( QgsSettingsTreeModelNodeData *parentNode )
 const 
  249  Q_ASSERT( parentNode );
 
  251  const QgsSettingsTreeModelNodeData *grandParentNode = parentNode->parent();
 
  252  if ( !grandParentNode )
 
  253    return QModelIndex(); 
 
  255  int row = grandParentNode->children().indexOf( parentNode );
 
  256  Q_ASSERT( row >= 0 );
 
  258  return createIndex( row, 0, 
static_cast<QObject *
>( parentNode ) );
 
  267  return n->children().count();
 
 
  283  if ( role == Qt::ForegroundRole && node->type() == QgsSettingsTreeModelNodeData::Type::Setting )
 
  285    if ( !node->exists() )
 
  291    if ( node->isEdited() &&
 
  294      return mEditedColorFore;
 
  298  if ( role == Qt::BackgroundRole && node->type() == QgsSettingsTreeModelNodeData::Type::Setting )
 
  301    if ( node->isEdited() &&
 
  304      return mEditedColorBack;
 
  312      if ( role == Qt::DisplayRole || role == Qt::EditRole )
 
  321      if ( role == Qt::CheckStateRole )
 
  323        if ( node->type() == QgsSettingsTreeModelNodeData::Type::Setting &&
 
  327          return node->value().toBool() ? Qt::Checked : Qt::Unchecked;
 
  330      if ( role == Qt::DisplayRole || role == Qt::EditRole )
 
  332        if ( node->type() == QgsSettingsTreeModelNodeData::Type::Setting &&
 
  340          return node->value();
 
  343      else if ( role == Qt::BackgroundRole )
 
  345        if ( node->type() == QgsSettingsTreeModelNodeData::Type::Setting )
 
  347          switch ( node->setting()->settingsType() )
 
  361              return node->value();
 
  370      if ( node->type() == QgsSettingsTreeModelNodeData::Type::Setting )
 
  372        if ( role == Qt::DisplayRole || role == Qt::EditRole )
 
  374          return node->setting()->description();
 
 
  389  if ( orientation == Qt::Orientation::Horizontal && role == Qt::DisplayRole )
 
  391    switch ( 
static_cast<Column>( section ) )
 
  396        return tr( 
"Value" );
 
  398        return tr( 
"Description" );
 
 
  410    if ( nodeData->type() == QgsSettingsTreeModelNodeData::Type::Setting )
 
  414        return Qt::ItemIsUserCheckable | Qt::ItemIsEnabled;
 
  418        return Qt::ItemIsEnabled | Qt::ItemIsEditable;
 
  424    return Qt::ItemIsEnabled;
 
  426  return Qt::NoItemFlags;
 
 
  433    if ( role == Qt::EditRole || role == Qt::CheckStateRole )
 
  436      if ( nodeData->type() == QgsSettingsTreeModelNodeData::Type::Setting )
 
  438        if ( role == Qt::CheckStateRole )
 
  441          nodeData->setValue( value == Qt::Checked ? 
true : false );
 
  445          nodeData->setValue( value );
 
 
  459QgsSettingsTreeItemDelegate::QgsSettingsTreeItemDelegate( 
QgsSettingsTreeModel *model, QObject *parent )
 
  460  : QItemDelegate( parent )
 
  465QWidget *QgsSettingsTreeItemDelegate::createEditor( QWidget *parent, 
const QStyleOptionViewItem &option, 
const QModelIndex &index )
 const 
  470    QModelIndex sourceIndex = index;
 
  474      sourceIndex = proxyModel->mapToSource( index );
 
  476    QgsSettingsTreeModelNodeData *nodeData = mModel->index2node( sourceIndex );
 
  477    if ( nodeData->type() == QgsSettingsTreeModelNodeData::Type::Setting )
 
  485void QgsSettingsTreeItemDelegate::setEditorData( QWidget *editor, 
const QModelIndex &index )
 const 
  492void QgsSettingsTreeItemDelegate::setModelData( QWidget *editor, QAbstractItemModel *model, 
const QModelIndex &index )
 const 
  506  : QSortFilterProxyModel( parent )
 
  509  QSortFilterProxyModel::setSourceModel( mSourceModel );
 
 
  514  if ( filterText == mFilterText )
 
  517  mFilterText = filterText;
 
 
  524  return nodeShown( node );
 
 
  527bool QgsSettingsTreeProxyModel::nodeShown( QgsSettingsTreeModelNodeData *node )
 const 
  531  if ( node->type() == QgsSettingsTreeModelNodeData::Type::Setting )
 
  533    if ( node->name().contains( mFilterText, Qt::CaseInsensitive ) )
 
  537    QModelIndex index = mSourceModel->
node2index( node ).parent();
 
  538    while ( ( index.isValid() ) )
 
  541      if ( parentNode->name().contains( mFilterText, Qt::CaseInsensitive ) )
 
  544      index = index.parent();
 
  551    if ( node->name().contains( mFilterText, Qt::CaseInsensitive ) )
 
  554    const auto constChildren = node->children();
 
  555    for ( QgsSettingsTreeModelNodeData *child : constChildren )
 
  557      if ( nodeShown( child ) )
 
@ 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.
Represent 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.
QgsSettingsTreeModel is 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
QgsSettingsTreeNamedListNode is a named list tree node for the settings tree to help organizing and i...
QStringList items(const QStringList &parentsNamedItems=QStringList()) const
Returns the list of items.
QgsSettingsTreeNode is a tree node for the settings tree to help organizing and introspecting the tre...
Qgis::SettingsTreeNodeType type() const
Returns the type of node.
Qgis::SettingsTreeNodeType mType
QString key() const
Returns the key of the node (without its parents)
QgsSettingsTreeProxyModel 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)