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 );
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, [=](
bool toggled ) { filterFrame->setEnabled( toggled ); } );
770 connect( mElseRadio, &QRadioButton::toggled,
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