38#include <QProgressDialog>
40#include <QTreeWidgetItem>
43#include "moc_qgsrulebasedrendererwidget.cpp"
45#ifdef ENABLE_MODELTEST
73 mRenderer = std::make_unique<QgsRuleBasedRenderer>( symbol );
79 this->layout()->setContentsMargins( 0, 0, 0, 0 );
82#ifdef ENABLE_MODELTEST
83 new ModelTest(
mModel,
this );
85 viewRules->setModel(
mModel );
88 mDeleteAction->setShortcut( QKeySequence( QKeySequence::Delete ) );
94 mRefineMenu =
new QMenu( tr(
"Refine Current Rule" ), btnRefineRule );
107 connect( viewRules, &QWidget::customContextMenuRequested,
this, &QgsRuleBasedRendererWidget::showContextMenu );
132 connect(
mContextMenu, &QMenu::aboutToShow,
this, [
this] {
168 QModelIndex currentIndex = viewRules->selectionModel()->currentIndex();
169 mModel->insertRule( currentIndex.parent(), currentIndex.row() + 1, newrule );
170 QModelIndex newindex =
mModel->index( currentIndex.row() + 1, 0, currentIndex.parent() );
171 viewRules->selectionModel()->setCurrentIndex( newindex, QItemSelectionModel::ClearAndSelect );
176 int rows =
mModel->rowCount();
177 mModel->insertRule( QModelIndex(), rows, newrule );
178 QModelIndex newindex =
mModel->index( rows, 0 );
179 viewRules->selectionModel()->setCurrentIndex( newindex, QItemSelectionModel::ClearAndSelect );
186 QItemSelectionModel *sel = viewRules->selectionModel();
187 QModelIndex idx = sel->currentIndex();
188 if ( !idx.isValid() )
190 return mModel->ruleForIndex( idx );
195 editRule( viewRules->selectionModel()->currentIndex() );
200 if ( !index.isValid() )
219 mModel->updateRule( index.parent(), index.row() );
220 mModel->clearFeatureCounts();
227 QItemSelection sel = viewRules->selectionModel()->selection();
228 QgsDebugMsgLevel( QStringLiteral(
"REMOVE RULES!!! ranges: %1" ).arg( sel.count() ), 2 );
229 const auto constSel = sel;
230 for (
const QItemSelectionRange &range : constSel )
232 QgsDebugMsgLevel( QStringLiteral(
"RANGE: r %1 - %2" ).arg( range.top() ).arg( range.bottom() ), 2 );
233 if ( range.isValid() )
234 mModel->removeRows( range.top(), range.bottom() - range.top() + 1, range.parent() );
237 viewRules->selectionModel()->clear();
238 mModel->clearFeatureCounts();
244 btnEditRule->setEnabled( current.isValid() );
253#include <QDialogButtonBox>
254#include <QInputDialog>
259 QModelIndexList indexlist = viewRules->selectionModel()->selectedRows();
261 if ( indexlist.isEmpty() )
267 else if ( type == 1 )
275 const auto constIndexlist = indexlist;
276 for (
const QModelIndex &index : constIndexlist )
277 viewRules->expand( index );
315 for (
const QModelIndex &index : indexList )
320 if ( !initialRule->
symbol() )
322 QMessageBox::warning(
this, tr(
"Scale Refinement" ), tr(
"Parent rule %1 must have a symbol for this operation." ).arg( initialRule->
label() ) );
327 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):" ) );
333 const auto constSplit = txt.split(
',' );
334 for (
const QString &item : constSplit )
336 int scale = item.toInt( &ok );
338 scales.append( scale );
340 QMessageBox::information(
this, tr(
"Scale Refinement" ), tr(
"\"%1\" is not valid scale denominator, ignoring it." ).arg( item ) );
343 for (
const QModelIndex &index : indexList )
346 mModel->willAddRules( index, scales.count() + 1 );
349 mModel->finishedAddingRules();
362 mRenderer->setLegendSymbolItem( legendSymbol.ruleKey(), sym->
clone() );
371 QList<QgsSymbol *> symbolList;
378 QItemSelection sel = viewRules->selectionModel()->selection();
379 const auto constSel = sel;
380 for (
const QItemSelectionRange &range : constSel )
382 QModelIndex parent = range.parent();
385 for (
int row = range.top(); row <= range.bottom(); row++ )
387 symbolList.append( children.at( row )->symbol() );
397 QItemSelection sel = viewRules->selectionModel()->selection();
398 const auto constSel = sel;
399 for (
const QItemSelectionRange &range : constSel )
401 QModelIndex parent = range.parent();
404 for (
int row = range.top(); row <= range.bottom(); row++ )
406 rl.append( children.at( row )->clone() );
431 if ( event->key() == Qt::Key_C && event->modifiers() == Qt::ControlModifier )
437 else if ( event->key() == Qt::Key_V && event->modifiers() == Qt::ControlModifier )
439 QgsRuleBasedRenderer::RuleList::const_iterator rIt =
mCopyBuffer.constBegin();
442 int rows =
mModel->rowCount();
443 mModel->insertRule( QModelIndex(), rows, ( *rIt )->clone() );
481 QString path =
"/Windows/RuleBasedTree/sectionWidth/" + QString::number( section );
488 QString path = QStringLiteral(
"/Windows/RuleBasedTree/sectionWidth/" );
489 QHeaderView *head = viewRules->header();
490 head->resizeSection( 0, settings.
value( path + QString::number( 0 ), 150 ).toInt() );
491 head->resizeSection( 1, settings.
value( path + QString::number( 1 ), 150 ).toInt() );
492 head->resizeSection( 2, settings.
value( path + QString::number( 2 ), 80 ).toInt() );
493 head->resizeSection( 3, settings.
value( path + QString::number( 3 ), 80 ).toInt() );
494 head->resizeSection( 4, settings.
value( path + QString::number( 4 ), 50 ).toInt() );
495 head->resizeSection( 5, settings.
value( path + QString::number( 5 ), 50 ).toInt() );
500 QModelIndexList indexlist = viewRules->selectionModel()->selectedRows();
503 if ( indexlist.isEmpty() )
506 QMimeData *mime =
mModel->mimeData( indexlist );
507 QApplication::clipboard()->setMimeData( mime );
512 const QMimeData *mime = QApplication::clipboard()->mimeData();
516 QModelIndexList indexlist = viewRules->selectionModel()->selectedRows();
518 if ( indexlist.isEmpty() )
521 index = indexlist.first();
522 mModel->dropMimeData( mime, Qt::CopyAction, index.row(), index.column(), index.parent() );
531 const QModelIndexList indexList = viewRules->selectionModel()->selectedRows();
532 for (
const QModelIndex &index : indexList )
536 if ( !rule->symbol() || rule->symbol()->type() != tempSymbol->type() )
539 mModel->setSymbol( index, tempSymbol->clone() );
545void QgsRuleBasedRendererWidget::refineRuleCategoriesAccepted(
QgsPanelWidget *panel )
551 QModelIndexList indexList = viewRules->selectionModel()->selectedRows();
552 const auto constIndexList = indexList;
553 for (
const QModelIndex &index : constIndexList )
559 mModel->finishedAddingRules();
562void QgsRuleBasedRendererWidget::refineRuleRangesAccepted(
QgsPanelWidget *panel )
564 QgsGraduatedSymbolRendererWidget *w = qobject_cast<QgsGraduatedSymbolRendererWidget *>( panel );
566 QgsGraduatedSymbolRenderer *r =
static_cast<QgsGraduatedSymbolRenderer *
>( w->
renderer() );
567 QModelIndexList indexList = viewRules->selectionModel()->selectedRows();
568 const auto constIndexList = indexList;
569 for (
const QModelIndex &index : constIndexList )
571 QgsRuleBasedRenderer::Rule *initialRule =
mModel->ruleForIndex( index );
575 mModel->finishedAddingRules();
578void QgsRuleBasedRendererWidget::ruleWidgetPanelAccepted(
QgsPanelWidget *panel )
580 QgsRendererRulePropsWidget *widget = qobject_cast<QgsRendererRulePropsWidget *>( panel );
587 QModelIndex index = viewRules->selectionModel()->currentIndex();
588 mModel->updateRule( index.parent(), index.row() );
589 mModel->clearFeatureCounts();
592void QgsRuleBasedRendererWidget::liveUpdateRuleFromPanel()
594 ruleWidgetPanelAccepted( qobject_cast<QgsPanelWidget *>( sender() ) );
597void QgsRuleBasedRendererWidget::showContextMenu( QPoint )
603 const QList<QAction *> actions =
contextMenu->actions();
604 for ( QAction *act : actions )
621 QHash<QgsRuleBasedRenderer::Rule *, QgsRuleBasedRendererCount> countMap;
625 const auto constRuleList = ruleList;
628 countMap[rule].count = 0;
629 countMap[rule].duplicateCount = 0;
638 const auto constAdditionalExpressionContextScopes =
mContext.additionalExpressionContextScopes();
653 long long nFeatures =
mLayer->featureCount();
654 QProgressDialog p( tr(
"Calculating feature count." ), tr(
"Abort" ), 0, 100 );
655 p.setWindowModality( Qt::WindowModal );
656 long long featuresCounted = 0;
664 const auto constFeatureRuleList = featureRuleList;
667 countMap[rule].count++;
668 if ( featureRuleList.size() > 1 )
670 countMap[rule].duplicateCount++;
672 const auto constFeatureRuleList = featureRuleList;
675 if ( duplicateRule == rule )
677 countMap[rule].duplicateCountMap[duplicateRule] += 1;
681 if ( featuresCounted % 50 == 0 )
683 if ( featuresCounted > nFeatures )
687 p.setValue(
static_cast<double>( featuresCounted ) / nFeatures * 100.0 );
688 if ( p.wasCanceled() )
694 p.setValue( nFeatures );
699 const auto constKeys = countMap.keys();
702 QgsDebugMsgLevel( QStringLiteral(
"rule: %1 count %2" ).arg( rule->label() ).arg( countMap[rule].count ), 2 );
706 mModel->setFeatureCounts( countMap );
711 bool enabled = !viewRules->selectionModel()->selectedIndexes().isEmpty();
712 btnRefineRule->setEnabled( enabled );
713 btnRemoveRule->setEnabled( enabled );
725 layout()->setContentsMargins( 0, 0, 0, 0 );
727 mElseRadio->setChecked(
mRule->isElse() );
728 mFilterRadio->setChecked( !
mRule->isElse() );
729 editFilter->setText(
mRule->filterExpression() );
730 editFilter->setToolTip(
mRule->filterExpression() );
731 editLabel->setText(
mRule->label() );
732 editDescription->setText(
mRule->description() );
733 editDescription->setToolTip(
mRule->description() );
735 if (
mRule->dependsOnScale() )
737 groupScale->setChecked(
true );
738 mScaleRangeWidget->setScaleRange( std::max(
rule->minimumScale(), 0.0 ), std::max(
rule->maximumScale(), 0.0 ) );
740 mScaleRangeWidget->setMapCanvas(
mContext.mapCanvas() );
742 if (
mRule->symbol() )
744 groupSymbol->setChecked(
true );
749 groupSymbol->setChecked(
false );
758 QVBoxLayout *l =
new QVBoxLayout;
760 groupSymbol->setLayout( l );
770 connect( mFilterRadio, &QRadioButton::toggled,
this, [
this](
bool toggled ) { filterFrame->setEnabled( toggled ); } );
771 connect( mElseRadio, &QRadioButton::toggled,
this, [
this](
bool toggled ) {
if ( toggled ) editFilter->setText( QStringLiteral(
"ELSE" ) ); } );
780 setWindowModality( Qt::WindowModal );
783 QVBoxLayout *layout =
new QVBoxLayout(
this );
785 scrollArea->setFrameShape( QFrame::NoFrame );
786 layout->addWidget( scrollArea );
788 buttonBox =
new QDialogButtonBox( QDialogButtonBox::Cancel | QDialogButtonBox::Help | QDialogButtonBox::Ok );
791 scrollArea->setWidget( mPropsWidget );
792 layout->addWidget( buttonBox );
793 this->setWindowTitle(
"Edit Rule" );
797 connect( buttonBox, &QDialogButtonBox::rejected,
this, &QDialog::reject );
798 connect( buttonBox, &QDialogButtonBox::helpRequested,
this, &QgsRendererRulePropsDialog::showHelp );
803 mPropsWidget->testFilter();
808 mPropsWidget->buildExpression();
813 mPropsWidget->apply();
817void QgsRendererRulePropsDialog::showHelp()
819 QgsHelp::openHelp( QStringLiteral(
"working_with_vector/vector_properties.html#rule-based-rendering" ) );
828 const auto constAdditionalExpressionContextScopes =
mContext.additionalExpressionContextScopes();
842 if ( !mFilterRadio->isChecked() )
848 QMessageBox::critical(
this, tr(
"Test Filter" ), tr(
"Filter expression parsing error:\n" ) + filter.
parserErrorString() );
855 const auto constAdditionalExpressionContextScopes =
mContext.additionalExpressionContextScopes();
861 if ( !filter.
prepare( &context ) )
863 QMessageBox::critical(
this, tr(
"Test Filter" ), filter.
evalErrorString() );
867 QApplication::setOverrideCursor( Qt::WaitCursor );
880 QApplication::restoreOverrideCursor();
882 QMessageBox::information(
this, tr(
"Test Filter" ), tr(
"Filter returned %n feature(s)",
"number of filtered features", count ) );
887 QString filter = mElseRadio->isChecked() ? QStringLiteral(
"ELSE" ) : editFilter->text();
888 mRule->setFilterExpression( filter );
889 mRule->setLabel( editLabel->text() );
890 mRule->setDescription( editDescription->text() );
892 mRule->setMinimumScale( groupScale->isChecked() ? mScaleRangeWidget->minimumScale() : 0 );
893 mRule->setMaximumScale( groupScale->isChecked() ? mScaleRangeWidget->maximumScale() : 0 );
894 mRule->setSymbol( groupSymbol->isChecked() ?
mSymbol->clone() :
nullptr );
915 : QAbstractItemModel(
parent )
923 if ( !
index.isValid() )
924 return Qt::ItemIsDropEnabled;
927 Qt::ItemFlag drop = (
index.column() == 0 ? Qt::ItemIsDropEnabled : Qt::NoItemFlags );
929 Qt::ItemFlag checkable = (
index.column() == 0 ? Qt::ItemIsUserCheckable : Qt::NoItemFlags );
931 return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable | checkable | Qt::ItemIsDragEnabled | drop;
936 if ( !
index.isValid() )
941 if ( role == Qt::DisplayRole || role == Qt::ToolTipRole )
943 switch (
index.column() )
946 return rule->
label();
969 if ( role == Qt::DisplayRole )
977 QString tip = QStringLiteral(
"<p style='margin:0px;'><ul>" );
979 for (
auto it = duplicateMap.constBegin(); it != duplicateMap.constEnd(); ++it )
981 QString label = it.key()->label().replace(
'&', QLatin1String(
"&" ) ).replace(
'>', QLatin1String(
">" ) ).replace(
'<', QLatin1String(
"<" ) );
982 tip += tr(
"<li><nobr>%1 features also in rule %2</nobr></li>" ).arg( it.value() ).arg( label );
984 tip += QLatin1String(
"</ul>" );
998 else if ( role == Qt::DecorationRole &&
index.column() == 0 && rule->
symbol() )
1003 else if ( role == Qt::TextAlignmentRole )
1005 return (
index.column() == 2 ||
index.column() == 3 ) ?
static_cast<Qt::Alignment::Int
>( Qt::AlignRight ) :
static_cast<Qt::Alignment::Int
>( Qt::AlignLeft );
1007 else if ( role == Qt::FontRole &&
index.column() == 1 )
1012 italicFont.setItalic(
true );
1017 else if ( role == Qt::EditRole )
1019 switch (
index.column() )
1022 return rule->
label();
1033 else if ( role == Qt::CheckStateRole )
1035 if (
index.column() != 0 )
1037 return rule->
active() ? Qt::Checked : Qt::Unchecked;
1045 if ( orientation == Qt::Horizontal && role == Qt::DisplayRole && section >= 0 && section < 7 )
1048 lst << tr(
"Label" ) << tr(
"Rule" ) << tr(
"Min. Scale" ) << tr(
"Max. Scale" ) << tr(
"Count" ) << tr(
"Duplicate Count" );
1049 return lst[section];
1051 else if ( orientation == Qt::Horizontal && role == Qt::ToolTipRole )
1055 return tr(
"Number of features in this rule." );
1057 else if ( section == 5 )
1059 return tr(
"Number of features in this rule which are also present in other rule(s)." );
1068 if (
parent.column() > 0 )
1073 return parentRule->
children().count();
1083 if ( hasIndex( row, column,
parent ) )
1087 return createIndex( row, column, childRule );
1089 return QModelIndex();
1094 if ( !
index.isValid() )
1095 return QModelIndex();
1100 if ( parentRule ==
mR->rootRule() )
1101 return QModelIndex();
1104 int row = parentRule->
parent()->
children().indexOf( parentRule );
1106 return createIndex( row, 0, parentRule );
1111 if ( !
index.isValid() )
1116 if ( role == Qt::CheckStateRole )
1118 rule->
setActive( value.toInt() == Qt::Checked );
1123 if ( role != Qt::EditRole )
1126 switch (
index.column() )
1129 rule->
setLabel( value.toString() );
1150 return Qt::MoveAction;
1156 types << QStringLiteral(
"application/vnd.text.list" );
1162 QMimeData *
mimeData =
new QMimeData();
1163 QByteArray encodedData;
1165 QDataStream stream( &encodedData, QIODevice::WriteOnly );
1167 const auto constIndexes = indexes;
1168 for (
const QModelIndex &
index : constIndexes )
1171 if ( !
index.isValid() ||
index.column() != 0 )
1180 QDomElement rootElem = doc.createElement( QStringLiteral(
"rule_mime" ) );
1181 rootElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"renderer" ) );
1182 QDomElement rulesElem = rule->
save( doc, symbols );
1183 rootElem.appendChild( rulesElem );
1185 rootElem.appendChild( symbolsElem );
1186 doc.appendChild( rootElem );
1190 stream << doc.toString( -1 );
1193 mimeData->setData( QStringLiteral(
"application/vnd.text.list" ), encodedData );
1202 if ( ruleElem.hasAttribute( QStringLiteral(
"description" ) ) )
1203 ruleElem.setAttribute( QStringLiteral(
"label" ), ruleElem.attribute( QStringLiteral(
"description" ) ) );
1206 QDomElement childRuleElem = ruleElem.firstChildElement( QStringLiteral(
"rule" ) );
1207 while ( !childRuleElem.isNull() )
1210 childRuleElem = childRuleElem.nextSiblingElement( QStringLiteral(
"rule" ) );
1219 if ( action == Qt::IgnoreAction )
1222 if ( !
data->hasFormat( QStringLiteral(
"application/vnd.text.list" ) ) )
1225 if (
parent.column() > 0 )
1228 QByteArray encodedData =
data->data( QStringLiteral(
"application/vnd.text.list" ) );
1229 QDataStream stream( &encodedData, QIODevice::ReadOnly );
1238 while ( !stream.atEnd() )
1244 if ( !doc.setContent( text ) )
1246 QDomElement rootElem = doc.documentElement();
1247 if ( rootElem.tagName() != QLatin1String(
"rule_mime" ) )
1249 if ( rootElem.attribute( QStringLiteral(
"type" ) ) == QLatin1String(
"labeling" ) )
1250 rootElem.appendChild( doc.createElement( QStringLiteral(
"symbols" ) ) );
1251 QDomElement symbolsElem = rootElem.firstChildElement( QStringLiteral(
"symbols" ) );
1252 if ( symbolsElem.isNull() )
1255 QDomElement ruleElem = rootElem.firstChildElement( QStringLiteral(
"rule" ) );
1256 if ( rootElem.attribute( QStringLiteral(
"type" ) ) == QLatin1String(
"labeling" ) )
1269 if (
index.isValid() )
1271 return mR->rootRule();
1278 if ( row < 0 || row >= parentRule->
children().count() )
1281 QgsDebugMsgLevel( QStringLiteral(
"Called: row %1 count %2 parent ~~%3~~" ).arg( row ).arg( count ).arg( parentRule->
dump() ), 2 );
1283 beginRemoveRows(
parent, row, row + count - 1 );
1285 for (
int i = 0; i < count; i++ )
1287 if ( row < parentRule->children().count() )
1295 QgsDebugError( QStringLiteral(
"trying to remove invalid index - this should not happen!" ) );
1307 beginInsertRows(
parent, before, before );
1309 QgsDebugMsgLevel( QStringLiteral(
"insert before %1 rule: %2" ).arg( before ).arg( newrule->
dump() ), 2 );
1326 for (
int i = 0; i <
rowCount( idx ); i++ )
1335 if ( !
index.isValid() )
1356 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.
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...
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
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.
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
static QString toString(double scale, QgsScaleComboBox::RatioMode mode=QgsScaleComboBox::RatioMode::ForceUnitNumerator)
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,...
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.
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