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 );
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 );
179 viewRules->selectionModel()->setCurrentIndex( newindex, QItemSelectionModel::ClearAndSelect );
186 QItemSelectionModel *sel = viewRules->selectionModel();
187 QModelIndex idx = sel->currentIndex();
188 if ( !idx.isValid() )
195 editRule( viewRules->selectionModel()->currentIndex() );
200 if ( !index.isValid() )
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();
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,
328 tr(
"Scale Refinement" ),
329 tr(
"Please enter scale denominators at which will split the rule, separate them by commas (e.g. 1000,5000):" ) );
335 const auto constSplit = txt.split(
',' );
336 for (
const QString &item : constSplit )
338 int scale = item.toInt( &ok );
340 scales.append( scale );
342 QMessageBox::information(
this, tr(
"Scale Refinement" ), tr(
"\"%1\" is not valid scale denominator, ignoring it." ).arg( item ) );
345 for (
const QModelIndex &index : indexList )
364 mRenderer->setLegendSymbolItem( legendSymbol.ruleKey(), sym->
clone() );
373 QList<QgsSymbol *> symbolList;
380 QItemSelection sel = viewRules->selectionModel()->selection();
381 const auto constSel = sel;
382 for (
const QItemSelectionRange &range : constSel )
384 QModelIndex parent = range.parent();
387 for (
int row = range.top(); row <= range.bottom(); row++ )
389 symbolList.append( children.at( row )->symbol() );
399 QItemSelection sel = viewRules->selectionModel()->selection();
400 const auto constSel = sel;
401 for (
const QItemSelectionRange &range : constSel )
403 QModelIndex parent = range.parent();
406 for (
int row = range.top(); row <= range.bottom(); row++ )
408 rl.append( children.at( row )->clone() );
433 if ( event->key() == Qt::Key_C && event->modifiers() == Qt::ControlModifier )
439 else if ( event->key() == Qt::Key_V && event->modifiers() == Qt::ControlModifier )
441 QgsRuleBasedRenderer::RuleList::const_iterator rIt =
mCopyBuffer.constBegin();
484 QString path =
"/Windows/RuleBasedTree/sectionWidth/" + QString::number( section );
491 QString path = QStringLiteral(
"/Windows/RuleBasedTree/sectionWidth/" );
492 QHeaderView *head = viewRules->header();
493 head->resizeSection( 0, settings.
value( path + QString::number( 0 ), 150 ).toInt() );
494 head->resizeSection( 1, settings.
value( path + QString::number( 1 ), 150 ).toInt() );
495 head->resizeSection( 2, settings.
value( path + QString::number( 2 ), 80 ).toInt() );
496 head->resizeSection( 3, settings.
value( path + QString::number( 3 ), 80 ).toInt() );
497 head->resizeSection( 4, settings.
value( path + QString::number( 4 ), 50 ).toInt() );
498 head->resizeSection( 5, settings.
value( path + QString::number( 5 ), 50 ).toInt() );
503 QModelIndexList indexlist = viewRules->selectionModel()->selectedRows();
506 if ( indexlist.isEmpty() )
510 QApplication::clipboard()->setMimeData( mime );
515 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() )
545void QgsRuleBasedRendererWidget::refineRuleCategoriesAccepted(
QgsPanelWidget *panel )
551 QModelIndexList indexList = viewRules->selectionModel()->selectedRows();
552 const auto constIndexList = indexList;
553 for (
const QModelIndex &index : constIndexList )
562void QgsRuleBasedRendererWidget::refineRuleRangesAccepted(
QgsPanelWidget *panel )
567 QModelIndexList indexList = viewRules->selectionModel()->selectedRows();
568 const auto constIndexList = indexList;
569 for (
const QModelIndex &index : constIndexList )
578void QgsRuleBasedRendererWidget::ruleWidgetPanelAccepted(
QgsPanelWidget *panel )
587 QModelIndex index = viewRules->selectionModel()->currentIndex();
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;
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 )
continue;
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 );
744 groupSymbol->setChecked(
true );
749 groupSymbol->setChecked(
false );
758 QVBoxLayout *l =
new QVBoxLayout;
760 groupSymbol->setLayout( l );
770 connect( mFilterRadio, &QRadioButton::toggled,
this, [ = ](
bool toggled ) { filterFrame->setEnabled( toggled ) ; } );
771 connect( mElseRadio, &QRadioButton::toggled,
this, [ = ](
bool toggled ) {
if ( toggled ) editFilter->setText( QStringLiteral(
"ELSE" ) );} );
781 setWindowModality( Qt::WindowModal );
784 QVBoxLayout *layout =
new QVBoxLayout(
this );
786 scrollArea->setFrameShape( QFrame::NoFrame );
787 layout->addWidget( scrollArea );
789 buttonBox =
new QDialogButtonBox( QDialogButtonBox::Cancel | QDialogButtonBox::Help | QDialogButtonBox::Ok );
792 scrollArea->setWidget( mPropsWidget );
793 layout->addWidget( buttonBox );
794 this->setWindowTitle(
"Edit Rule" );
798 connect( buttonBox, &QDialogButtonBox::rejected,
this, &QDialog::reject );
799 connect( buttonBox, &QDialogButtonBox::helpRequested,
this, &QgsRendererRulePropsDialog::showHelp );
814 mPropsWidget->
apply();
818void QgsRendererRulePropsDialog::showHelp()
820 QgsHelp::openHelp( QStringLiteral(
"working_with_vector/vector_properties.html#rule-based-rendering" ) );
843 if ( !mFilterRadio->isChecked() )
849 QMessageBox::critical(
this, tr(
"Test Filter" ), tr(
"Filter expression parsing error:\n" ) + filter.
parserErrorString() );
862 if ( !filter.
prepare( &context ) )
864 QMessageBox::critical(
this, tr(
"Test Filter" ), filter.
evalErrorString() );
868 QApplication::setOverrideCursor( Qt::WaitCursor );
884 QApplication::restoreOverrideCursor();
886 QMessageBox::information(
this, tr(
"Test Filter" ), tr(
"Filter returned %n feature(s)",
"number of filtered features", count ) );
891 QString filter = mElseRadio->isChecked() ? QStringLiteral(
"ELSE" ) : editFilter->text();
919 : QAbstractItemModel( parent )
927 if ( !
index.isValid() )
928 return Qt::ItemIsDropEnabled;
931 Qt::ItemFlag drop = (
index.column() == 0 ? Qt::ItemIsDropEnabled : Qt::NoItemFlags );
933 Qt::ItemFlag checkable = (
index.column() == 0 ? Qt::ItemIsUserCheckable : Qt::NoItemFlags );
935 return Qt::ItemIsEnabled | Qt::ItemIsSelectable |
936 Qt::ItemIsEditable | checkable |
937 Qt::ItemIsDragEnabled | drop;
942 if ( !
index.isValid() )
947 if ( role == Qt::DisplayRole || role == Qt::ToolTipRole )
949 switch (
index.column() )
952 return rule->
label();
975 if ( role == Qt::DisplayRole )
983 QString tip = QStringLiteral(
"<p style='margin:0px;'><ul>" );
985 for (
auto it = duplicateMap.constBegin(); it != duplicateMap.constEnd(); ++it )
987 QString label = it.key()->label().replace(
'&', QLatin1String(
"&" ) ).replace(
'>', QLatin1String(
">" ) ).replace(
'<', QLatin1String(
"<" ) );
988 tip += tr(
"<li><nobr>%1 features also in rule %2</nobr></li>" ).arg( it.value() ).arg( label );
990 tip += QLatin1String(
"</ul>" );
1004 else if ( role == Qt::DecorationRole &&
index.column() == 0 && rule->
symbol() )
1009 else if ( role == Qt::TextAlignmentRole )
1011 return (
index.column() == 2 ||
index.column() == 3 ) ?
static_cast<Qt::Alignment::Int
>( Qt::AlignRight ) :
static_cast<Qt::Alignment::Int
>( Qt::AlignLeft );
1013 else if ( role == Qt::FontRole &&
index.column() == 1 )
1018 italicFont.setItalic(
true );
1023 else if ( role == Qt::EditRole )
1025 switch (
index.column() )
1028 return rule->
label();
1039 else if ( role == Qt::CheckStateRole )
1041 if (
index.column() != 0 )
1043 return rule->
active() ? Qt::Checked : Qt::Unchecked;
1051 if ( orientation == Qt::Horizontal && role == Qt::DisplayRole && section >= 0 && section < 7 )
1054 lst << tr(
"Label" ) << tr(
"Rule" ) << tr(
"Min. Scale" ) << tr(
"Max. Scale" ) << tr(
"Count" ) << tr(
"Duplicate Count" );
1055 return lst[section];
1057 else if ( orientation == Qt::Horizontal && role == Qt::ToolTipRole )
1061 return tr(
"Number of features in this rule." );
1063 else if ( section == 5 )
1065 return tr(
"Number of features in this rule which are also present in other rule(s)." );
1074 if (
parent.column() > 0 )
1079 return parentRule->
children().count();
1089 if ( hasIndex( row, column,
parent ) )
1093 return createIndex( row, column, childRule );
1095 return QModelIndex();
1100 if ( !
index.isValid() )
1101 return QModelIndex();
1107 return QModelIndex();
1110 int row = parentRule->
parent()->
children().indexOf( parentRule );
1112 return createIndex( row, 0, parentRule );
1117 if ( !
index.isValid() )
1122 if ( role == Qt::CheckStateRole )
1124 rule->
setActive( value.toInt() == Qt::Checked );
1129 if ( role != Qt::EditRole )
1132 switch (
index.column() )
1135 rule->
setLabel( value.toString() );
1156 return Qt::MoveAction;
1162 types << QStringLiteral(
"application/vnd.text.list" );
1168 QMimeData *
mimeData =
new QMimeData();
1169 QByteArray encodedData;
1171 QDataStream stream( &encodedData, QIODevice::WriteOnly );
1173 const auto constIndexes = indexes;
1174 for (
const QModelIndex &
index : constIndexes )
1177 if ( !
index.isValid() ||
index.column() != 0 )
1186 QDomElement rootElem = doc.createElement( QStringLiteral(
"rule_mime" ) );
1187 rootElem.setAttribute( QStringLiteral(
"type" ), QStringLiteral(
"renderer" ) );
1188 QDomElement rulesElem = rule->
save( doc, symbols );
1189 rootElem.appendChild( rulesElem );
1191 rootElem.appendChild( symbolsElem );
1192 doc.appendChild( rootElem );
1196 stream << doc.toString( -1 );
1199 mimeData->setData( QStringLiteral(
"application/vnd.text.list" ), encodedData );
1208 if ( ruleElem.hasAttribute( QStringLiteral(
"description" ) ) )
1209 ruleElem.setAttribute( QStringLiteral(
"label" ), ruleElem.attribute( QStringLiteral(
"description" ) ) );
1212 QDomElement childRuleElem = ruleElem.firstChildElement( QStringLiteral(
"rule" ) );
1213 while ( !childRuleElem.isNull() )
1216 childRuleElem = childRuleElem.nextSiblingElement( QStringLiteral(
"rule" ) );
1222 Qt::DropAction action,
int row,
int column,
const QModelIndex &parent )
1226 if ( action == Qt::IgnoreAction )
1229 if ( !
data->hasFormat( QStringLiteral(
"application/vnd.text.list" ) ) )
1232 if (
parent.column() > 0 )
1235 QByteArray encodedData =
data->data( QStringLiteral(
"application/vnd.text.list" ) );
1236 QDataStream stream( &encodedData, QIODevice::ReadOnly );
1245 while ( !stream.atEnd() )
1251 if ( !doc.setContent( text ) )
1253 QDomElement rootElem = doc.documentElement();
1254 if ( rootElem.tagName() != QLatin1String(
"rule_mime" ) )
1256 if ( rootElem.attribute( QStringLiteral(
"type" ) ) == QLatin1String(
"labeling" ) )
1257 rootElem.appendChild( doc.createElement( QStringLiteral(
"symbols" ) ) );
1258 QDomElement symbolsElem = rootElem.firstChildElement( QStringLiteral(
"symbols" ) );
1259 if ( symbolsElem.isNull() )
1262 QDomElement ruleElem = rootElem.firstChildElement( QStringLiteral(
"rule" ) );
1263 if ( rootElem.attribute( QStringLiteral(
"type" ) ) == QLatin1String(
"labeling" ) )
1276 if (
index.isValid() )
1285 if ( row < 0 || row >= parentRule->
children().count() )
1288 QgsDebugMsgLevel( QStringLiteral(
"Called: row %1 count %2 parent ~~%3~~" ).arg( row ).arg( count ).arg( parentRule->
dump() ), 2 );
1290 beginRemoveRows(
parent, row, row + count - 1 );
1292 for (
int i = 0; i < count; i++ )
1294 if ( row < parentRule->children().count() )
1302 QgsDebugError( QStringLiteral(
"trying to remove invalid index - this should not happen!" ) );
1314 beginInsertRows(
parent, before, before );
1316 QgsDebugMsgLevel( QStringLiteral(
"insert before %1 rule: %2" ).arg( before ).arg( newrule->
dump() ), 2 );
1332 emit dataChanged(
index( 0, 0, idx ),
1335 for (
int i = 0; i <
rowCount( idx ); i++ )
1344 if ( !
index.isValid() )
1365 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.
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.
Class for 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.
This class 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.
The class stores information about one class/rule of a vector layer renderer in a unified way that ca...
The class is used as a container of context for various read/write operations on other 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.
QgsRuleBasedRenderer::Rule * rule()
QgsRendererRulePropsDialog(QgsRuleBasedRenderer::Rule *rule, QgsVectorLayer *layer, QgsStyle *style, QWidget *parent=nullptr, const QgsSymbolWidgetContext &context=QgsSymbolWidgetContext())
Constructor for QgsRendererRulePropsDialog.
Tree model for the 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()
This class keeps data about a rules for 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.
This class is a composition of two QSettings instances:
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.
static 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 data sets.
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