17#include "moc_qgsrulebasedrendererwidget.cpp" 
   36#include <QProgressDialog> 
   37#include <QTreeWidgetItem> 
   44#ifdef ENABLE_MODELTEST 
   56  , mContextMenu( new QMenu( this ) )
 
   72    mRenderer = std::make_unique<QgsRuleBasedRenderer>( symbol );
 
   78  this->layout()->setContentsMargins( 0, 0, 0, 0 );
 
   81#ifdef ENABLE_MODELTEST 
   82  new ModelTest( 
mModel, 
this ); 
 
   84  viewRules->setModel( 
mModel );
 
   87  mDeleteAction->setShortcut( QKeySequence( QKeySequence::Delete ) );
 
   93  mRefineMenu = 
new QMenu( tr( 
"Refine Current Rule" ), btnRefineRule );
 
  106  connect( viewRules, &QWidget::customContextMenuRequested, 
this, &QgsRuleBasedRendererWidget::showContextMenu );
 
  131  connect( 
mContextMenu, &QMenu::aboutToShow, 
this, [
this] {
 
 
  167    QModelIndex currentIndex = viewRules->selectionModel()->currentIndex();
 
  168    mModel->
insertRule( currentIndex.parent(), currentIndex.row() + 1, newrule );
 
  169    QModelIndex newindex = 
mModel->
index( currentIndex.row() + 1, 0, currentIndex.parent() );
 
  170    viewRules->selectionModel()->setCurrentIndex( newindex, QItemSelectionModel::ClearAndSelect );
 
  178    viewRules->selectionModel()->setCurrentIndex( newindex, QItemSelectionModel::ClearAndSelect );
 
 
  185  QItemSelectionModel *sel = viewRules->selectionModel();
 
  186  QModelIndex idx = sel->currentIndex();
 
  187  if ( !idx.isValid() )
 
 
  194  editRule( viewRules->selectionModel()->currentIndex() );
 
 
  199  if ( !index.isValid() )
 
 
  226  QItemSelection sel = viewRules->selectionModel()->selection();
 
  227  QgsDebugMsgLevel( QStringLiteral( 
"REMOVE RULES!!! ranges: %1" ).arg( sel.count() ), 2 );
 
  228  const auto constSel = sel;
 
  229  for ( 
const QItemSelectionRange &range : constSel )
 
  231    QgsDebugMsgLevel( QStringLiteral( 
"RANGE: r %1 - %2" ).arg( range.top() ).arg( range.bottom() ), 2 );
 
  232    if ( range.isValid() )
 
  233      mModel->
removeRows( range.top(), range.bottom() - range.top() + 1, range.parent() );
 
  236  viewRules->selectionModel()->clear();
 
 
  243  btnEditRule->setEnabled( current.isValid() );
 
 
  252#include <QDialogButtonBox> 
  253#include <QInputDialog> 
  258  QModelIndexList indexlist = viewRules->selectionModel()->selectedRows();
 
  260  if ( indexlist.isEmpty() )
 
  266  else if ( type == 1 ) 
 
  274  const auto constIndexlist = indexlist;
 
  275  for ( 
const QModelIndex &index : constIndexlist )
 
  276    viewRules->expand( index );
 
 
  314  for ( 
const QModelIndex &index : indexList )
 
  319    if ( !initialRule->
symbol() )
 
  321      QMessageBox::warning( 
this, tr( 
"Scale Refinement" ), tr( 
"Parent rule %1 must have a symbol for this operation." ).arg( initialRule->
label() ) );
 
  326  QString txt = QInputDialog::getText( 
this, tr( 
"Scale Refinement" ), tr( 
"Please enter scale denominators at which will split the rule, separate them by commas (e.g. 1000,5000):" ) );
 
  332  const auto constSplit = txt.split( 
',' );
 
  333  for ( 
const QString &item : constSplit )
 
  335    int scale = item.toInt( &ok );
 
  337      scales.append( scale );
 
  339      QMessageBox::information( 
this, tr( 
"Scale Refinement" ), tr( 
"\"%1\" is not valid scale denominator, ignoring it." ).arg( item ) );
 
  342  for ( 
const QModelIndex &index : indexList )
 
 
  361      mRenderer->setLegendSymbolItem( legendSymbol.ruleKey(), sym->
clone() );
 
 
  370  QList<QgsSymbol *> symbolList;
 
  377  QItemSelection sel = viewRules->selectionModel()->selection();
 
  378  const auto constSel = sel;
 
  379  for ( 
const QItemSelectionRange &range : constSel )
 
  381    QModelIndex parent = range.parent();
 
  384    for ( 
int row = range.top(); row <= range.bottom(); row++ )
 
  386      symbolList.append( children.at( row )->symbol() );
 
 
  396  QItemSelection sel = viewRules->selectionModel()->selection();
 
  397  const auto constSel = sel;
 
  398  for ( 
const QItemSelectionRange &range : constSel )
 
  400    QModelIndex parent = range.parent();
 
  403    for ( 
int row = range.top(); row <= range.bottom(); row++ )
 
  405      rl.append( children.at( row )->clone() );
 
 
  430  if ( event->key() == Qt::Key_C && event->modifiers() == Qt::ControlModifier )
 
  436  else if ( event->key() == Qt::Key_V && event->modifiers() == Qt::ControlModifier )
 
  438    QgsRuleBasedRenderer::RuleList::const_iterator rIt = 
mCopyBuffer.constBegin();
 
 
  480  QString path = 
"/Windows/RuleBasedTree/sectionWidth/" + QString::number( section );
 
 
  487  QString path = QStringLiteral( 
"/Windows/RuleBasedTree/sectionWidth/" );
 
  488  QHeaderView *head = viewRules->header();
 
  489  head->resizeSection( 0, settings.
value( path + QString::number( 0 ), 150 ).toInt() );
 
  490  head->resizeSection( 1, settings.
value( path + QString::number( 1 ), 150 ).toInt() );
 
  491  head->resizeSection( 2, settings.
value( path + QString::number( 2 ), 80 ).toInt() );
 
  492  head->resizeSection( 3, settings.
value( path + QString::number( 3 ), 80 ).toInt() );
 
  493  head->resizeSection( 4, settings.
value( path + QString::number( 4 ), 50 ).toInt() );
 
  494  head->resizeSection( 5, settings.
value( path + QString::number( 5 ), 50 ).toInt() );
 
 
  499  QModelIndexList indexlist = viewRules->selectionModel()->selectedRows();
 
  502  if ( indexlist.isEmpty() )
 
  506  QApplication::clipboard()->setMimeData( mime );
 
 
  511  const QMimeData *mime = QApplication::clipboard()->mimeData();
 
  515  QModelIndexList indexlist = viewRules->selectionModel()->selectedRows();
 
  517  if ( indexlist.isEmpty() )
 
  520    index = indexlist.first();
 
  521  mModel->
dropMimeData( mime, Qt::CopyAction, index.row(), index.column(), index.parent() );
 
 
  530  const QModelIndexList indexList = viewRules->selectionModel()->selectedRows();
 
  531  for ( 
const QModelIndex &index : indexList )
 
  535      if ( !rule->symbol() || rule->symbol()->type() != tempSymbol->type() )
 
 
  544void QgsRuleBasedRendererWidget::refineRuleCategoriesAccepted( 
QgsPanelWidget *panel )
 
  550  QModelIndexList indexList = viewRules->selectionModel()->selectedRows();
 
  551  const auto constIndexList = indexList;
 
  552  for ( 
const QModelIndex &index : constIndexList )
 
  561void QgsRuleBasedRendererWidget::refineRuleRangesAccepted( 
QgsPanelWidget *panel )
 
  566  QModelIndexList indexList = viewRules->selectionModel()->selectedRows();
 
  567  const auto constIndexList = indexList;
 
  568  for ( 
const QModelIndex &index : constIndexList )
 
  577void QgsRuleBasedRendererWidget::ruleWidgetPanelAccepted( 
QgsPanelWidget *panel )
 
  586  QModelIndex index = viewRules->selectionModel()->currentIndex();
 
  591void QgsRuleBasedRendererWidget::liveUpdateRuleFromPanel()
 
  593  ruleWidgetPanelAccepted( qobject_cast<QgsPanelWidget *>( sender() ) );
 
  596void QgsRuleBasedRendererWidget::showContextMenu( QPoint )
 
  602  const QList<QAction *> actions = 
contextMenu->actions();
 
  603  for ( QAction *act : actions )
 
  620  QHash<QgsRuleBasedRenderer::Rule *, QgsRuleBasedRendererCount> countMap;
 
  624  const auto constRuleList = ruleList;
 
  627    countMap[rule].count = 0;
 
  628    countMap[rule].duplicateCount = 0;
 
  653  QProgressDialog p( tr( 
"Calculating feature count." ), tr( 
"Abort" ), 0, 100 );
 
  654  p.setWindowModality( Qt::WindowModal );
 
  655  long long featuresCounted = 0;
 
  663    const auto constFeatureRuleList = featureRuleList;
 
  666      countMap[rule].count++;
 
  667      if ( featureRuleList.size() > 1 )
 
  669        countMap[rule].duplicateCount++;
 
  671      const auto constFeatureRuleList = featureRuleList;
 
  674        if ( duplicateRule == rule )
 
  676        countMap[rule].duplicateCountMap[duplicateRule] += 1;
 
  680    if ( featuresCounted % 50 == 0 )
 
  682      if ( featuresCounted > nFeatures ) 
 
  686      p.setValue( 
static_cast<double>( featuresCounted ) / nFeatures * 100.0 );
 
  687      if ( p.wasCanceled() )
 
  693  p.setValue( nFeatures );
 
  698  const auto constKeys = countMap.keys();
 
  701    QgsDebugMsgLevel( QStringLiteral( 
"rule: %1 count %2" ).arg( rule->label() ).arg( countMap[rule].count ), 2 );
 
 
  710  bool enabled = !viewRules->selectionModel()->selectedIndexes().isEmpty();
 
  711  btnRefineRule->setEnabled( enabled );
 
  712  btnRemoveRule->setEnabled( enabled );
 
 
  721  , mContext( context )
 
  724  layout()->setContentsMargins( 0, 0, 0, 0 );
 
  736    groupScale->setChecked( 
true );
 
  743    groupSymbol->setChecked( 
true );
 
  748    groupSymbol->setChecked( 
false );
 
  757  QVBoxLayout *l = 
new QVBoxLayout;
 
  759  groupSymbol->setLayout( l );
 
  769  connect( mFilterRadio, &QRadioButton::toggled, 
this, [
this]( 
bool toggled ) { filterFrame->setEnabled( toggled ); } );
 
  770  connect( mElseRadio, &QRadioButton::toggled, 
this, [
this]( 
bool toggled ) { 
if ( toggled ) editFilter->setText( QStringLiteral( 
"ELSE" ) ); } );
 
 
  779  setWindowModality( Qt::WindowModal );
 
  782  QVBoxLayout *layout = 
new QVBoxLayout( 
this );
 
  784  scrollArea->setFrameShape( QFrame::NoFrame );
 
  785  layout->addWidget( scrollArea );
 
  787  buttonBox = 
new QDialogButtonBox( QDialogButtonBox::Cancel | QDialogButtonBox::Help | QDialogButtonBox::Ok );
 
  790  scrollArea->setWidget( mPropsWidget );
 
  791  layout->addWidget( buttonBox );
 
  792  this->setWindowTitle( 
"Edit Rule" );
 
  796  connect( buttonBox, &QDialogButtonBox::rejected, 
this, &QDialog::reject );
 
  797  connect( buttonBox, &QDialogButtonBox::helpRequested, 
this, &QgsRendererRulePropsDialog::showHelp );
 
 
  812  mPropsWidget->
apply();
 
 
  816void QgsRendererRulePropsDialog::showHelp()
 
  818  QgsHelp::openHelp( QStringLiteral( 
"working_with_vector/vector_properties.html#rule-based-rendering" ) );
 
  841  if ( !mFilterRadio->isChecked() )
 
  847    QMessageBox::critical( 
this, tr( 
"Test Filter" ), tr( 
"Filter expression parsing error:\n" ) + filter.
parserErrorString() );
 
  860  if ( !filter.
prepare( &context ) )
 
  862    QMessageBox::critical( 
this, tr( 
"Test Filter" ), filter.
evalErrorString() );
 
  866  QApplication::setOverrideCursor( Qt::WaitCursor );
 
  879  QApplication::restoreOverrideCursor();
 
  881  QMessageBox::information( 
this, tr( 
"Test Filter" ), tr( 
"Filter returned %n feature(s)", 
"number of filtered features", count ) );
 
 
  886  QString filter = mElseRadio->isChecked() ? QStringLiteral( 
"ELSE" ) : editFilter->text();
 
 
  914  : QAbstractItemModel( parent )
 
 
  922  if ( !
index.isValid() )
 
  923    return Qt::ItemIsDropEnabled;
 
  926  Qt::ItemFlag drop = ( 
index.column() == 0 ? Qt::ItemIsDropEnabled : Qt::NoItemFlags );
 
  928  Qt::ItemFlag checkable = ( 
index.column() == 0 ? Qt::ItemIsUserCheckable : Qt::NoItemFlags );
 
  930  return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable | checkable | Qt::ItemIsDragEnabled | drop;
 
 
  935  if ( !
index.isValid() )
 
  940  if ( role == Qt::DisplayRole || role == Qt::ToolTipRole )
 
  942    switch ( 
index.column() )
 
  945        return rule->
label();
 
  968          if ( role == Qt::DisplayRole )
 
  976              QString tip = QStringLiteral( 
"<p style='margin:0px;'><ul>" );
 
  978              for ( 
auto it = duplicateMap.constBegin(); it != duplicateMap.constEnd(); ++it )
 
  980                QString label = it.key()->label().replace( 
'&', QLatin1String( 
"&" ) ).replace( 
'>', QLatin1String( 
">" ) ).replace( 
'<', QLatin1String( 
"<" ) );
 
  981                tip += tr( 
"<li><nobr>%1 features also in rule %2</nobr></li>" ).arg( it.value() ).arg( label );
 
  983              tip += QLatin1String( 
"</ul>" );
 
  997  else if ( role == Qt::DecorationRole && 
index.column() == 0 && rule->
symbol() )
 
 1002  else if ( role == Qt::TextAlignmentRole )
 
 1004    return ( 
index.column() == 2 || 
index.column() == 3 ) ? 
static_cast<Qt::Alignment::Int
>( Qt::AlignRight ) : 
static_cast<Qt::Alignment::Int
>( Qt::AlignLeft );
 
 1006  else if ( role == Qt::FontRole && 
index.column() == 1 )
 
 1011      italicFont.setItalic( 
true );
 
 1016  else if ( role == Qt::EditRole )
 
 1018    switch ( 
index.column() )
 
 1021        return rule->
label();
 
 1032  else if ( role == Qt::CheckStateRole )
 
 1034    if ( 
index.column() != 0 )
 
 1036    return rule->
active() ? Qt::Checked : Qt::Unchecked;
 
 
 1044  if ( orientation == Qt::Horizontal && role == Qt::DisplayRole && section >= 0 && section < 7 )
 
 1047    lst << tr( 
"Label" ) << tr( 
"Rule" ) << tr( 
"Min. Scale" ) << tr( 
"Max. Scale" ) << tr( 
"Count" ) << tr( 
"Duplicate Count" );
 
 1048    return lst[section];
 
 1050  else if ( orientation == Qt::Horizontal && role == Qt::ToolTipRole )
 
 1054      return tr( 
"Number of features in this rule." );
 
 1056    else if ( section == 5 ) 
 
 1058      return tr( 
"Number of features in this rule which are also present in other rule(s)." );
 
 
 1067  if ( 
parent.column() > 0 )
 
 1072  return parentRule->
children().count();
 
 
 1082  if ( hasIndex( row, column, 
parent ) )
 
 1086    return createIndex( row, column, childRule );
 
 1088  return QModelIndex();
 
 
 1093  if ( !
index.isValid() )
 
 1094    return QModelIndex();
 
 1100    return QModelIndex();
 
 1103  int row = parentRule->
parent()->
children().indexOf( parentRule );
 
 1105  return createIndex( row, 0, parentRule );
 
 
 1110  if ( !
index.isValid() )
 
 1115  if ( role == Qt::CheckStateRole )
 
 1117    rule->
setActive( value.toInt() == Qt::Checked );
 
 1122  if ( role != Qt::EditRole )
 
 1125  switch ( 
index.column() )
 
 1128      rule->
setLabel( value.toString() );
 
 
 1149  return Qt::MoveAction; 
 
 
 1155  types << QStringLiteral( 
"application/vnd.text.list" );
 
 
 1161  QMimeData *
mimeData = 
new QMimeData();
 
 1162  QByteArray encodedData;
 
 1164  QDataStream stream( &encodedData, QIODevice::WriteOnly );
 
 1166  const auto constIndexes = indexes;
 
 1167  for ( 
const QModelIndex &
index : constIndexes )
 
 1170    if ( !
index.isValid() || 
index.column() != 0 )
 
 1179    QDomElement rootElem = doc.createElement( QStringLiteral( 
"rule_mime" ) );
 
 1180    rootElem.setAttribute( QStringLiteral( 
"type" ), QStringLiteral( 
"renderer" ) ); 
 
 1181    QDomElement rulesElem = rule->
save( doc, symbols );
 
 1182    rootElem.appendChild( rulesElem );
 
 1184    rootElem.appendChild( symbolsElem );
 
 1185    doc.appendChild( rootElem );
 
 1189    stream << doc.toString( -1 );
 
 1192  mimeData->setData( QStringLiteral( 
"application/vnd.text.list" ), encodedData );
 
 
 1201  if ( ruleElem.hasAttribute( QStringLiteral( 
"description" ) ) )
 
 1202    ruleElem.setAttribute( QStringLiteral( 
"label" ), ruleElem.attribute( QStringLiteral( 
"description" ) ) );
 
 1205  QDomElement childRuleElem = ruleElem.firstChildElement( QStringLiteral( 
"rule" ) );
 
 1206  while ( !childRuleElem.isNull() )
 
 1209    childRuleElem = childRuleElem.nextSiblingElement( QStringLiteral( 
"rule" ) );
 
 
 1218  if ( action == Qt::IgnoreAction )
 
 1221  if ( !
data->hasFormat( QStringLiteral( 
"application/vnd.text.list" ) ) )
 
 1224  if ( 
parent.column() > 0 )
 
 1227  QByteArray encodedData = 
data->data( QStringLiteral( 
"application/vnd.text.list" ) );
 
 1228  QDataStream stream( &encodedData, QIODevice::ReadOnly );
 
 1237  while ( !stream.atEnd() )
 
 1243    if ( !doc.setContent( text ) )
 
 1245    QDomElement rootElem = doc.documentElement();
 
 1246    if ( rootElem.tagName() != QLatin1String( 
"rule_mime" ) )
 
 1248    if ( rootElem.attribute( QStringLiteral( 
"type" ) ) == QLatin1String( 
"labeling" ) )
 
 1249      rootElem.appendChild( doc.createElement( QStringLiteral( 
"symbols" ) ) );
 
 1250    QDomElement symbolsElem = rootElem.firstChildElement( QStringLiteral( 
"symbols" ) );
 
 1251    if ( symbolsElem.isNull() )
 
 1254    QDomElement ruleElem = rootElem.firstChildElement( QStringLiteral( 
"rule" ) );
 
 1255    if ( rootElem.attribute( QStringLiteral( 
"type" ) ) == QLatin1String( 
"labeling" ) )
 
 
 1268  if ( 
index.isValid() )
 
 
 1277  if ( row < 0 || row >= parentRule->
children().count() )
 
 1280  QgsDebugMsgLevel( QStringLiteral( 
"Called: row %1 count %2 parent ~~%3~~" ).arg( row ).arg( count ).arg( parentRule->
dump() ), 2 );
 
 1282  beginRemoveRows( 
parent, row, row + count - 1 );
 
 1284  for ( 
int i = 0; i < count; i++ )
 
 1286    if ( row < parentRule->children().count() )
 
 1294      QgsDebugError( QStringLiteral( 
"trying to remove invalid index - this should not happen!" ) );
 
 
 1306  beginInsertRows( 
parent, before, before );
 
 1308  QgsDebugMsgLevel( QStringLiteral( 
"insert before %1 rule: %2" ).arg( before ).arg( newrule->
dump() ), 2 );
 
 
 1325  for ( 
int i = 0; i < 
rowCount( idx ); i++ )
 
 
 1334  if ( !
index.isValid() )
 
 
 1355  beginInsertRows( 
parent, row, row + count - 1 );
 
 
@ NoGeometry
Geometry is not required. It may still be returned if e.g. required for a filter condition.
 
static QString iconPath(const QString &iconFile)
Returns path to the desired icon file.
 
A feature renderer which represents features using a list of renderer categories.
 
const QgsCategoryList & categories() const
Returns a list of all categories recognized by the renderer.
 
A generic dialog for building expression strings.
 
Single scope for storing variables and functions for use within a QgsExpressionContext.
 
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
 
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
 
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
 
Handles parsing and evaluation of expressions (formerly called "search strings").
 
bool prepare(const QgsExpressionContext *context)
Gets the expression ready for evaluation - find out column indexes.
 
bool hasParserError() const
Returns true if an error occurred when parsing the input expression.
 
QString evalErrorString() const
Returns evaluation error.
 
QString parserErrorString() const
Returns parser error.
 
Wrapper for iterator of features from vector data provider or vector layer.
 
bool nextFeature(QgsFeature &f)
Fetch next feature and stores in f, returns true on success.
 
Abstract base class for all 2D vector feature renderers.
 
void copyRendererData(QgsFeatureRenderer *destRenderer) const
Clones generic renderer data to another renderer.
 
Wraps a request for features to a vector layer (or directly its vector data provider).
 
QgsFeatureRequest & setFlags(Qgis::FeatureRequestFlags flags)
Sets flags that affect how features will be fetched.
 
QgsFeatureRequest & setSubsetOfAttributes(const QgsAttributeList &attrs)
Set a subset of attributes that will be fetched.
 
QgsFeatureRequest & setFilterExpression(const QString &expression)
Set the filter expression.
 
QgsFeatureRequest & setExpressionContext(const QgsExpressionContext &context)
Sets the expression context used to evaluate filter expressions.
 
QgsFeatureRequest & setNoAttributes()
Set that no attributes will be fetched.
 
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
 
A vector feature renderer which uses numeric attributes to classify features into different ranges.
 
const QgsRangeList & ranges() const
Returns a list of all ranges used in the classification.
 
static void enableAutoGeometryRestore(QWidget *widget, const QString &key=QString())
Register the widget to allow its position to be automatically saved and restored when open and closed...
 
static void openHelp(const QString &key)
Opens help topic for the given help key using default system web browser.
 
Stores information about one class/rule of a vector layer renderer in a unified way that can be used ...
 
A container for the context for various read/write operations on objects.
 
Contains information about the context of a rendering operation.
 
QgsExpressionContext & expressionContext()
Gets the expression context.
 
void setExpressionContext(const QgsExpressionContext &context)
Sets the expression context.
 
void setRendererScale(double scale)
Sets the renderer map scale.
 
A dialog for editing the details of a rule based renderer rule.
 
QgsRuleBasedRenderer::Rule * rule()
 
QgsRendererRulePropsDialog(QgsRuleBasedRenderer::Rule *rule, QgsVectorLayer *layer, QgsStyle *style, QWidget *parent=nullptr, const QgsSymbolWidgetContext &context=QgsSymbolWidgetContext())
Constructor for QgsRendererRulePropsDialog.
 
Tree model for a rule-based renderer's rules.
 
QgsRuleBasedRenderer::Rule * ruleForIndex(const QModelIndex &index) const
 
bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole) override
 
QPointer< QScreen > mScreen
 
QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const override
 
bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override
 
void updateRule(const QModelIndex &parent, int row)
 
void willAddRules(const QModelIndex &parent, int count)
 
Qt::ItemFlags flags(const QModelIndex &index) const override
 
int rowCount(const QModelIndex &parent=QModelIndex()) const override
 
void setSymbol(const QModelIndex &index, QgsSymbol *symbol)
Sets the symbol for the rule at the specified index.
 
void clearFeatureCounts()
 
QStringList mimeTypes() const override
 
void removeRule(const QModelIndex &index)
 
int columnCount(const QModelIndex &=QModelIndex()) const override
 
Qt::DropActions supportedDropActions() const override
 
QgsRuleBasedRendererModel(QgsRuleBasedRenderer *renderer, QObject *parent, QScreen *screen=nullptr)
Constructor for QgsRuleBasedRendererModel, for the specified renderer.
 
void setFeatureCounts(const QHash< QgsRuleBasedRenderer::Rule *, QgsRuleBasedRendererCount > &countMap)
 
QgsRuleBasedRenderer * mR
 
QModelIndex parent(const QModelIndex &index) const override
 
QHash< QgsRuleBasedRenderer::Rule *, QgsRuleBasedRendererCount > mFeatureCountMap
 
QMimeData * mimeData(const QModelIndexList &indexes) const override
 
QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const override
 
QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const override
 
void insertRule(const QModelIndex &parent, int before, QgsRuleBasedRenderer::Rule *newrule)
 
bool removeRows(int row, int count, const QModelIndex &parent=QModelIndex()) override
 
void finishedAddingRules()
 
Represents an individual rule for a rule-based renderer.
 
void setSymbol(QgsSymbol *sym)
Sets a new symbol (or nullptr). Deletes old symbol.
 
void removeChild(QgsRuleBasedRenderer::Rule *rule)
delete child rule
 
void insertChild(int i, QgsRuleBasedRenderer::Rule *rule)
add child rule, take ownership, sets this as parent
 
void setDescription(const QString &description)
Set a human readable description for this rule.
 
bool dependsOnScale() const
 
const QgsRuleBasedRenderer::RuleList & children() const
Returns all children rules of this rule.
 
double maximumScale() const
Returns the maximum map scale (i.e.
 
QgsRuleBasedRenderer::Rule * parent()
The parent rule.
 
bool isElse() const
Check if this rule is an ELSE rule.
 
QgsRuleBasedRenderer::Rule * clone() const
clone this rule, return new instance
 
void removeChildAt(int i)
delete child rule
 
void setMaximumScale(double scale)
Sets the maximum map scale (i.e.
 
void setActive(bool state)
Sets if this rule is active.
 
QDomElement save(QDomDocument &doc, QgsSymbolMap &symbolMap) const
 
double minimumScale() const
Returns the minimum map scale (i.e.
 
QString description() const
A human readable description for this rule.
 
void setMinimumScale(double scale)
Sets the minimum map scale (i.e.
 
void setFilterExpression(const QString &filterExp)
Set the expression used to check if a given feature shall be rendered with this rule.
 
void setLabel(const QString &label)
 
QString dump(int indent=0) const
Dump for debug purpose.
 
static QgsRuleBasedRenderer::Rule * create(QDomElement &ruleElem, QgsSymbolMap &symbolMap, bool reuseId=true)
Create a rule from an XML definition.
 
QString filterExpression() const
A filter that will check if this rule applies.
 
bool active() const
Returns if this rule is active.
 
static void refineRuleCategories(QgsRuleBasedRenderer::Rule *initialRule, QgsCategorizedSymbolRenderer *r)
take a rule and create a list of new rules based on the categories from categorized symbol renderer
 
static void refineRuleRanges(QgsRuleBasedRenderer::Rule *initialRule, QgsGraduatedSymbolRenderer *r)
take a rule and create a list of new rules based on the ranges from graduated symbol renderer
 
static QgsRuleBasedRenderer * convertFromRenderer(const QgsFeatureRenderer *renderer, QgsVectorLayer *layer=nullptr)
Creates a new QgsRuleBasedRenderer from an existing renderer.
 
static void refineRuleScales(QgsRuleBasedRenderer::Rule *initialRule, QList< int > scales)
take a rule and create a list of new rules with intervals of scales given by the passed scale denomin...
 
QList< QgsRuleBasedRenderer::Rule * > RuleList
 
QgsRuleBasedRenderer::Rule * rootRule()
 
static QString toString(double scale)
Helper function to convert a scale double to scale string.
 
Stores properties relating to a screen.
 
Stores settings for use within QGIS.
 
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
 
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
 
A database of saved style entities, including symbols, color ramps, text formats and others.
 
static std::unique_ptr< QgsSymbol > symbolFromMimeData(const QMimeData *data)
Attempts to parse mime data as a symbol.
 
static QgsSymbolMap loadSymbols(QDomElement &element, const QgsReadWriteContext &context)
Reads a collection of symbols from XML and returns them in a map. Caller is responsible for deleting ...
 
static QDomElement saveSymbols(QgsSymbolMap &symbols, const QString &tagName, QDomDocument &doc, const QgsReadWriteContext &context)
Writes a collection of symbols to XML with specified tagName for the top-level element.
 
static QIcon symbolPreviewIcon(const QgsSymbol *symbol, QSize size, int padding=0, QgsLegendPatchShape *shape=nullptr, const QgsScreenProperties &screen=QgsScreenProperties())
Returns an icon preview for a color ramp.
 
A dialog which allows the user to modify the rendering order of symbol layers.
 
QgsLegendSymbolList symbolLevels() const
Returns the current legend symbols with rendering passes set, as defined in the widget.
 
bool usingLevels() const
Returns whether the level ordering is enabled.
 
void setForceOrderingEnabled(bool enabled)
 
Contains settings which reflect the context in which a symbol (or renderer) widget is shown,...
 
QList< QgsExpressionContextScope > additionalExpressionContextScopes() const
Returns the list of additional expression context scopes to show as available within the layer.
 
QList< QgsExpressionContextScope * > globalProjectAtlasMapLayerScopes(const QgsMapLayer *layer) const
Returns list of scopes: global, project, atlas, map, layer.
 
QgsMapCanvas * mapCanvas() const
Returns the map canvas associated with the widget.
 
Abstract base class for all rendered symbols.
 
virtual QgsSymbol * clone() const =0
Returns a deep copy of this symbol.
 
int symbolLayerCount() const
Returns the total number of symbol layers contained in the symbol.
 
static QgsSymbol * defaultSymbol(Qgis::GeometryType geomType)
Returns a new default symbol for the specified geometry type.
 
Represents a vector layer which manages a vector based dataset.
 
long long featureCount(const QString &legendKey) const
Number of features rendered with specified legend key.
 
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const FINAL
Queries the layer for features specified in request.
 
Q_INVOKABLE Qgis::GeometryType geometryType() const
Returns point, line or polygon.
 
int scaleIconSize(int standardSize)
Scales an icon size to compensate for display pixel density, making the icon size hi-dpi friendly,...
 
#define QgsDebugMsgLevel(str, level)
 
#define QgsDebugError(str)
 
QMap< QString, QgsSymbol * > QgsSymbolMap