27 #include <QAbstractListModel>
28 #include <QInputDialog>
36 : QAbstractListModel( parent )
41 int QgsVectorTileBasicRendererListModel::rowCount(
const QModelIndex &parent )
const
43 if ( parent.isValid() )
46 return mRenderer->styles().count();
49 int QgsVectorTileBasicRendererListModel::columnCount(
const QModelIndex & )
const
54 QVariant QgsVectorTileBasicRendererListModel::data(
const QModelIndex &index,
int role )
const
56 if ( index.row() < 0 || index.row() >= mRenderer->styles().count() )
59 const QList<QgsVectorTileBasicRendererStyle> styles = mRenderer->styles();
67 if ( index.column() == 0 )
69 else if ( index.column() == 1 )
70 return style.
layerName().isEmpty() ? tr(
"(all layers)" ) : style.layerName();
71 else if ( index.column() == 2 )
73 else if ( index.column() == 3 )
75 else if ( index.column() == 4 )
76 return style.
filterExpression().isEmpty() ? tr(
"(no filter)" ) : style.filterExpression();
83 if ( index.column() == 0 )
85 else if ( index.column() == 1 )
87 else if ( index.column() == 2 )
89 else if ( index.column() == 3 )
91 else if ( index.column() == 4 )
97 case Qt::DecorationRole:
99 if ( index.column() == 0 && style.
symbol() )
107 case Qt::CheckStateRole:
109 if ( index.column() != 0 )
111 return style.
isEnabled() ? Qt::Checked : Qt::Unchecked;
124 QVariant QgsVectorTileBasicRendererListModel::headerData(
int section, Qt::Orientation orientation,
int role )
const
126 if ( orientation == Qt::Horizontal && role == Qt::DisplayRole && section >= 0 && section < 5 )
129 lst << tr(
"Label" ) << tr(
"Layer" ) << tr(
"Min. Zoom" ) << tr(
"Max. Zoom" ) << tr(
"Filter" );
136 Qt::ItemFlags QgsVectorTileBasicRendererListModel::flags(
const QModelIndex &index )
const
138 if ( !index.isValid() )
139 return Qt::ItemIsDropEnabled;
141 const Qt::ItemFlag checkable = ( index.column() == 0 ? Qt::ItemIsUserCheckable : Qt::NoItemFlags );
143 return Qt::ItemIsEnabled | Qt::ItemIsSelectable |
144 Qt::ItemIsEditable | checkable |
145 Qt::ItemIsDragEnabled;
148 bool QgsVectorTileBasicRendererListModel::setData(
const QModelIndex &index,
const QVariant &value,
int role )
150 if ( !index.isValid() )
155 if ( role == Qt::CheckStateRole )
157 style.
setEnabled( value.toInt() == Qt::Checked );
158 mRenderer->setStyle( index.row(), style );
159 emit dataChanged( index, index );
163 if ( role == Qt::EditRole )
165 if ( index.column() == 0 )
167 else if ( index.column() == 1 )
169 else if ( index.column() == 2 )
171 else if ( index.column() == 3 )
173 else if ( index.column() == 4 )
176 mRenderer->setStyle( index.row(), style );
177 emit dataChanged( index, index );
184 bool QgsVectorTileBasicRendererListModel::removeRows(
int row,
int count,
const QModelIndex &parent )
186 QList<QgsVectorTileBasicRendererStyle> styles = mRenderer->styles();
188 if ( row < 0 || row >= styles.count() )
191 beginRemoveRows( parent, row, row + count - 1 );
193 for (
int i = 0; i < count; i++ )
195 if ( row < styles.count() )
197 styles.removeAt( row );
201 mRenderer->setStyles( styles );
209 beginInsertRows( QModelIndex(), row, row );
211 QList<QgsVectorTileBasicRendererStyle> styles = mRenderer->styles();
212 styles.insert( row, style );
213 mRenderer->setStyles( styles );
218 Qt::DropActions QgsVectorTileBasicRendererListModel::supportedDropActions()
const
220 return Qt::MoveAction;
223 QStringList QgsVectorTileBasicRendererListModel::mimeTypes()
const
226 types << QStringLiteral(
"application/vnd.text.list" );
230 QMimeData *QgsVectorTileBasicRendererListModel::mimeData(
const QModelIndexList &indexes )
const
232 QMimeData *mimeData =
new QMimeData();
233 QByteArray encodedData;
235 QDataStream stream( &encodedData, QIODevice::WriteOnly );
237 const auto constIndexes = indexes;
238 for (
const QModelIndex &index : constIndexes )
241 if ( !index.isValid() || index.column() != 0 )
247 QDomElement rootElem = doc.createElement( QStringLiteral(
"vector_tile_basic_renderer_style_mime" ) );
249 doc.appendChild( rootElem );
251 stream << doc.toString( -1 );
254 mimeData->setData( QStringLiteral(
"application/vnd.text.list" ), encodedData );
258 bool QgsVectorTileBasicRendererListModel::dropMimeData(
const QMimeData *data,
259 Qt::DropAction action,
int row,
int column,
const QModelIndex &parent )
263 if ( action == Qt::IgnoreAction )
266 if ( !data->hasFormat( QStringLiteral(
"application/vnd.text.list" ) ) )
269 if ( parent.column() > 0 )
272 QByteArray encodedData = data->data( QStringLiteral(
"application/vnd.text.list" ) );
273 QDataStream stream( &encodedData, QIODevice::ReadOnly );
279 row = rowCount( parent );
282 while ( !stream.atEnd() )
288 if ( !doc.setContent( text ) )
290 const QDomElement rootElem = doc.documentElement();
291 if ( rootElem.tagName() != QLatin1String(
"vector_tile_basic_renderer_style_mime" ) )
297 insertStyle( row + rows, style );
309 , mMapCanvas( canvas )
310 , mMessageBar( messageBar )
313 layout()->setContentsMargins( 0, 0, 0, 0 );
315 QMenu *menuAddRule =
new QMenu( btnAddRule );
319 btnAddRule->setMenu( menuAddRule );
321 connect( btnEditRule, &QPushButton::clicked,
this, &QgsVectorTileBasicRendererWidget::editStyle );
322 connect( btnRemoveRule, &QAbstractButton::clicked,
this, &QgsVectorTileBasicRendererWidget::removeStyle );
324 connect( viewStyles, &QAbstractItemView::doubleClicked,
this, &QgsVectorTileBasicRendererWidget::editStyleAtIndex );
331 mLabelCurrentZoom->setText( tr(
"Current zoom: %1" ).arg( zoom ) );
333 mProxyModel->setCurrentZoom( zoom );
338 connect( mCheckVisibleOnly, &QCheckBox::toggled,
this, [ = ](
bool filter )
340 mProxyModel->setFilterVisible( filter );
359 mModel =
new QgsVectorTileBasicRendererListModel( mRenderer.get(), viewStyles );
360 mProxyModel =
new QgsVectorTileBasicRendererProxyModel( mModel, viewStyles );
361 viewStyles->setModel( mProxyModel );
366 mProxyModel->setCurrentZoom( zoom );
374 QgsVectorTileBasicRendererWidget::~QgsVectorTileBasicRendererWidget() =
default;
376 void QgsVectorTileBasicRendererWidget::apply()
378 mVTLayer->setRenderer( mRenderer->clone() );
402 const int rows = mModel->rowCount();
403 mModel->insertStyle( rows, style );
404 viewStyles->selectionModel()->setCurrentIndex( mProxyModel->mapFromSource( mModel->index( rows, 0 ) ), QItemSelectionModel::ClearAndSelect );
407 void QgsVectorTileBasicRendererWidget::editStyle()
409 editStyleAtIndex( viewStyles->selectionModel()->currentIndex() );
412 void QgsVectorTileBasicRendererWidget::editStyleAtIndex(
const QModelIndex &proxyIndex )
414 const QModelIndex index = mProxyModel->mapToSource( proxyIndex );
415 if ( index.row() < 0 || index.row() >= mRenderer->styles().count() )
423 std::unique_ptr< QgsSymbol > symbol( style.
symbol()->
clone() );
456 if ( !dlg.exec() || !symbol )
462 mRenderer->setStyle( index.row(), style );
463 emit widgetChanged();
467 void QgsVectorTileBasicRendererWidget::updateSymbolsFromWidget()
469 const int index = mProxyModel->mapToSource( viewStyles->selectionModel()->currentIndex() ).row();
478 mRenderer->setStyle( index, style );
479 emit widgetChanged();
482 void QgsVectorTileBasicRendererWidget::cleanUpSymbolSelector(
QgsPanelWidget *container )
491 void QgsVectorTileBasicRendererWidget::removeStyle()
493 const QModelIndexList sel = viewStyles->selectionModel()->selectedIndexes();
496 for (
const QModelIndex &proxyIndex : sel )
498 const QModelIndex sourceIndex = mProxyModel->mapToSource( proxyIndex );
499 if ( !res.contains( sourceIndex.row() ) )
500 res << sourceIndex.row();
502 std::sort( res.begin(), res.end() );
504 for (
int i = res.size() - 1; i >= 0; --i )
506 mModel->removeRow( res[ i ] );
509 viewStyles->selectionModel()->clear();
512 QgsVectorTileBasicRendererProxyModel::QgsVectorTileBasicRendererProxyModel( QgsVectorTileBasicRendererListModel *source, QObject *parent )
513 : QSortFilterProxyModel( parent )
515 setSourceModel( source );
516 setDynamicSortFilter(
true );
519 void QgsVectorTileBasicRendererProxyModel::setCurrentZoom(
int zoom )
525 void QgsVectorTileBasicRendererProxyModel::setFilterVisible(
bool enabled )
527 mFilterVisible = enabled;
531 bool QgsVectorTileBasicRendererProxyModel::filterAcceptsRow(
int source_row,
const QModelIndex &source_parent )
const
533 if ( mCurrentZoom < 0 || !mFilterVisible )
536 const int rowMinZoom = sourceModel()->data( sourceModel()->index( source_row, 0, source_parent ), QgsVectorTileBasicRendererListModel::MinZoom ).toInt();
537 const int rowMaxZoom = sourceModel()->data( sourceModel()->index( source_row, 0, source_parent ), QgsVectorTileBasicRendererListModel::MaxZoom ).toInt();
539 if ( rowMinZoom >= 0 && rowMinZoom > mCurrentZoom )
542 if ( rowMaxZoom >= 0 && rowMaxZoom < mCurrentZoom )
Single scope for storing variables and functions for use within a QgsExpressionContext.
void setVariable(const QString &name, const QVariant &value, bool isStatic=false)
Convenience method for setting a variable in the context scope by name name and value.
Map canvas is a class for displaying all GIS data types on a canvas.
void scaleChanged(double)
Emitted when the scale of the map changes.
A bar for displaying non-blocking messages to the user.
The class is used as a container of context for various read/write operations on other objects.
static QgsStyle * defaultStyle()
Returns default application-wide style.
static QIcon symbolPreviewIcon(const QgsSymbol *symbol, QSize size, int padding=0, QgsLegendPatchShape *shape=nullptr)
Returns an icon preview for a color ramp.
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.
void setMapCanvas(QgsMapCanvas *canvas)
Sets the map canvas associated with the widget.
void setAdditionalExpressionContextScopes(const QList< QgsExpressionContextScope > &scopes)
Sets a list of additional expression context scopes to show as available within the layer.
void setMessageBar(QgsMessageBar *bar)
Sets the message bar associated with the widget.
static QgsSymbol * defaultSymbol(QgsWkbTypes::GeometryType geomType)
Returns a new default symbol for the specified geometry type.
virtual QgsSymbol * clone() const =0
Returns a deep copy of this symbol.
Represents a vector layer which manages a vector based data sets.
Definition of map rendering of a subset of vector tile data.
QgsSymbol * symbol() const
Returns symbol for rendering.
void setEnabled(bool enabled)
Sets whether this style is enabled (used for rendering)
void setMinZoomLevel(int minZoom)
Sets minimum zoom level index (negative number means no limit)
void setLayerName(const QString &name)
Sets name of the sub-layer to render (empty layer means that all layers match)
QString filterExpression() const
Returns filter expression (empty filter means that all features match)
QString styleName() const
Returns human readable name of this style.
void setFilterExpression(const QString &expr)
Sets filter expression (empty filter means that all features match)
void setSymbol(QgsSymbol *sym)
Sets symbol for rendering. Takes ownership of the symbol.
void writeXml(QDomElement &elem, const QgsReadWriteContext &context) const
Writes object content to given DOM element.
void setStyleName(const QString &name)
Sets human readable name of this style.
bool isEnabled() const
Returns whether this style is enabled (used for rendering)
void setMaxZoomLevel(int maxZoom)
Sets maximum zoom level index (negative number means no limit)
int minZoomLevel() const
Returns minimum zoom level index (negative number means no limit)
int maxZoomLevel() const
Returns maxnimum zoom level index (negative number means no limit)
QString layerName() const
Returns name of the sub-layer to render (empty layer means that all layers match)
void readXml(const QDomElement &elem, const QgsReadWriteContext &context)
Reads object content from given DOM element.
The default vector tile renderer implementation.
Implements a map layer that is dedicated to rendering of vector tiles.
QgsVectorTileRenderer * renderer() const
Returns currently assigned renderer.
virtual QgsVectorTileRenderer * clone() const =0
Returns a clone of the renderer.
virtual QString type() const =0
Returns unique type name of the renderer implementation.
static int scaleToZoomLevel(double mapScale, int sourceMinZoom, int sourceMaxZoom)
Finds best fitting zoom level (assuming GoogleCRS84Quad tile matrix set) given map scale denominator ...
static double scaleToZoom(double mapScale)
Finds zoom level (assuming GoogleCRS84Quad tile matrix set) given map scale denominator.
GeometryType
The geometry types are used to group QgsWkbTypes::Type in a coarse way.
QSize iconSize(bool dockableToolbar)
Returns the user-preferred size of a window's toolbar icons.
int scaleIconSize(int standardSize)
Scales an icon size to compensate for display pixel density, making the icon size hi-dpi friendly,...