QGIS API Documentation 3.32.0-Lima (311a8cb8a6)
•All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
qgsvectortilebasicrendererwidget.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsvectortilebasicrendererwidget.cpp
3 --------------------------------------
4 Date : April 2020
5 Copyright : (C) 2020 by Martin Dobias
6 Email : wonder dot sk at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
17
18#include "qgsguiutils.h"
19#include "qgssymbollayerutils.h"
21#include "qgsvectortilelayer.h"
23#include "qgsstyle.h"
24#include "qgsmapcanvas.h"
25#include "qgsvectortileutils.h"
26#include "qgsprojectutils.h"
27
28#include <QAbstractListModel>
29#include <QInputDialog>
30#include <QMenu>
31#include <QScreen>
32#include <QPointer>
33
34
36
37
38QgsVectorTileBasicRendererListModel::QgsVectorTileBasicRendererListModel( QgsVectorTileBasicRenderer *r, QObject *parent, QScreen *screen )
39 : QAbstractListModel( parent )
40 , mRenderer( r )
41 , mScreen( screen )
42{
43}
44
45int QgsVectorTileBasicRendererListModel::rowCount( const QModelIndex &parent ) const
46{
47 if ( parent.isValid() )
48 return 0;
49
50 return mRenderer->styles().count();
51}
52
53int QgsVectorTileBasicRendererListModel::columnCount( const QModelIndex & ) const
54{
55 return 5;
56}
57
58QVariant QgsVectorTileBasicRendererListModel::data( const QModelIndex &index, int role ) const
59{
60 if ( index.row() < 0 || index.row() >= mRenderer->styles().count() )
61 return QVariant();
62
63 const QList<QgsVectorTileBasicRendererStyle> styles = mRenderer->styles();
64 const QgsVectorTileBasicRendererStyle &style = styles[index.row()];
65
66 switch ( role )
67 {
68 case Qt::DisplayRole:
69 case Qt::ToolTipRole:
70 {
71 if ( index.column() == 0 )
72 return style.styleName();
73 else if ( index.column() == 1 )
74 return style.layerName().isEmpty() ? tr( "(all layers)" ) : style.layerName();
75 else if ( index.column() == 2 )
76 return style.minZoomLevel() >= 0 ? style.minZoomLevel() : QVariant();
77 else if ( index.column() == 3 )
78 return style.maxZoomLevel() >= 0 ? style.maxZoomLevel() : QVariant();
79 else if ( index.column() == 4 )
80 return style.filterExpression().isEmpty() ? tr( "(no filter)" ) : style.filterExpression();
81
82 break;
83 }
84
85 case Qt::EditRole:
86 {
87 if ( index.column() == 0 )
88 return style.styleName();
89 else if ( index.column() == 1 )
90 return style.layerName();
91 else if ( index.column() == 2 )
92 return style.minZoomLevel();
93 else if ( index.column() == 3 )
94 return style.maxZoomLevel();
95 else if ( index.column() == 4 )
96 return style.filterExpression();
97
98 break;
99 }
100
101 case Qt::DecorationRole:
102 {
103 if ( index.column() == 0 && style.symbol() )
104 {
105 const int iconSize = QgsGuiUtils::scaleIconSize( 16 );
106 return QgsSymbolLayerUtils::symbolPreviewIcon( style.symbol(), QSize( iconSize, iconSize ), 0, nullptr, QgsScreenProperties( mScreen.data() ) );
107 }
108 break;
109 }
110
111 case Qt::CheckStateRole:
112 {
113 if ( index.column() != 0 )
114 return QVariant();
115 return style.isEnabled() ? Qt::Checked : Qt::Unchecked;
116 }
117
118 case MinZoom:
119 return style.minZoomLevel();
120
121 case MaxZoom:
122 return style.maxZoomLevel();
123
124 case Label:
125 return style.styleName();
126
127 case Layer:
128 return style.layerName();
129
130 case Filter:
131 return style.filterExpression();
132
133 }
134 return QVariant();
135}
136
137QVariant QgsVectorTileBasicRendererListModel::headerData( int section, Qt::Orientation orientation, int role ) const
138{
139 if ( orientation == Qt::Horizontal && role == Qt::DisplayRole && section >= 0 && section < 5 )
140 {
141 QStringList lst;
142 lst << tr( "Label" ) << tr( "Layer" ) << tr( "Min. Zoom" ) << tr( "Max. Zoom" ) << tr( "Filter" );
143 return lst[section];
144 }
145
146 return QVariant();
147}
148
149Qt::ItemFlags QgsVectorTileBasicRendererListModel::flags( const QModelIndex &index ) const
150{
151 if ( !index.isValid() )
152 return Qt::ItemIsDropEnabled;
153
154 const Qt::ItemFlag checkable = ( index.column() == 0 ? Qt::ItemIsUserCheckable : Qt::NoItemFlags );
155
156 return Qt::ItemIsEnabled | Qt::ItemIsSelectable |
157 Qt::ItemIsEditable | checkable |
158 Qt::ItemIsDragEnabled;
159}
160
161bool QgsVectorTileBasicRendererListModel::setData( const QModelIndex &index, const QVariant &value, int role )
162{
163 if ( !index.isValid() )
164 return false;
165
166 QgsVectorTileBasicRendererStyle style = mRenderer->style( index.row() );
167
168 if ( role == Qt::CheckStateRole )
169 {
170 style.setEnabled( value.toInt() == Qt::Checked );
171 mRenderer->setStyle( index.row(), style );
172 emit dataChanged( index, index );
173 return true;
174 }
175
176 if ( role == Qt::EditRole )
177 {
178 if ( index.column() == 0 )
179 style.setStyleName( value.toString() );
180 else if ( index.column() == 1 )
181 style.setLayerName( value.toString() );
182 else if ( index.column() == 2 )
183 style.setMinZoomLevel( value.toInt() );
184 else if ( index.column() == 3 )
185 style.setMaxZoomLevel( value.toInt() );
186 else if ( index.column() == 4 )
187 style.setFilterExpression( value.toString() );
188
189 mRenderer->setStyle( index.row(), style );
190 emit dataChanged( index, index );
191 return true;
192 }
193
194 return false;
195}
196
197bool QgsVectorTileBasicRendererListModel::removeRows( int row, int count, const QModelIndex &parent )
198{
199 QList<QgsVectorTileBasicRendererStyle> styles = mRenderer->styles();
200
201 if ( row < 0 || row >= styles.count() )
202 return false;
203
204 beginRemoveRows( parent, row, row + count - 1 );
205
206 for ( int i = 0; i < count; i++ )
207 {
208 if ( row < styles.count() )
209 {
210 styles.removeAt( row );
211 }
212 }
213
214 mRenderer->setStyles( styles );
215
216 endRemoveRows();
217 return true;
218}
219
220void QgsVectorTileBasicRendererListModel::insertStyle( int row, const QgsVectorTileBasicRendererStyle &style )
221{
222 beginInsertRows( QModelIndex(), row, row );
223
224 QList<QgsVectorTileBasicRendererStyle> styles = mRenderer->styles();
225 styles.insert( row, style );
226 mRenderer->setStyles( styles );
227
228 endInsertRows();
229}
230
231Qt::DropActions QgsVectorTileBasicRendererListModel::supportedDropActions() const
232{
233 return Qt::MoveAction;
234}
235
236QStringList QgsVectorTileBasicRendererListModel::mimeTypes() const
237{
238 QStringList types;
239 types << QStringLiteral( "application/vnd.text.list" );
240 return types;
241}
242
243QMimeData *QgsVectorTileBasicRendererListModel::mimeData( const QModelIndexList &indexes ) const
244{
245 QMimeData *mimeData = new QMimeData();
246 QByteArray encodedData;
247
248 QDataStream stream( &encodedData, QIODevice::WriteOnly );
249
250 const auto constIndexes = indexes;
251 for ( const QModelIndex &index : constIndexes )
252 {
253 // each item consists of several columns - let's add it with just first one
254 if ( !index.isValid() || index.column() != 0 )
255 continue;
256
257 const QgsVectorTileBasicRendererStyle style = mRenderer->style( index.row() );
258
259 QDomDocument doc;
260 QDomElement rootElem = doc.createElement( QStringLiteral( "vector_tile_basic_renderer_style_mime" ) );
261 style.writeXml( rootElem, QgsReadWriteContext() );
262 doc.appendChild( rootElem );
263
264 stream << doc.toString( -1 );
265 }
266
267 mimeData->setData( QStringLiteral( "application/vnd.text.list" ), encodedData );
268 return mimeData;
269}
270
271bool QgsVectorTileBasicRendererListModel::dropMimeData( const QMimeData *data,
272 Qt::DropAction action, int row, int column, const QModelIndex &parent )
273{
274 Q_UNUSED( column )
275
276 if ( action == Qt::IgnoreAction )
277 return true;
278
279 if ( !data->hasFormat( QStringLiteral( "application/vnd.text.list" ) ) )
280 return false;
281
282 if ( parent.column() > 0 )
283 return false;
284
285 QByteArray encodedData = data->data( QStringLiteral( "application/vnd.text.list" ) );
286 QDataStream stream( &encodedData, QIODevice::ReadOnly );
287 int rows = 0;
288
289 if ( row == -1 )
290 {
291 // the item was dropped at a parent - we may decide where to put the items - let's append them
292 row = rowCount( parent );
293 }
294
295 while ( !stream.atEnd() )
296 {
297 QString text;
298 stream >> text;
299
300 QDomDocument doc;
301 if ( !doc.setContent( text ) )
302 continue;
303 const QDomElement rootElem = doc.documentElement();
304 if ( rootElem.tagName() != QLatin1String( "vector_tile_basic_renderer_style_mime" ) )
305 continue;
306
308 style.readXml( rootElem, QgsReadWriteContext() );
309
310 insertStyle( row + rows, style );
311 ++rows;
312 }
313 return true;
314}
315
316
317//
318
319
320QgsVectorTileBasicRendererWidget::QgsVectorTileBasicRendererWidget( QgsVectorTileLayer *layer, QgsMapCanvas *canvas, QgsMessageBar *messageBar, QWidget *parent )
321 : QgsMapLayerConfigWidget( layer, canvas, parent )
322 , mMapCanvas( canvas )
323 , mMessageBar( messageBar )
324{
325 setupUi( this );
326 layout()->setContentsMargins( 0, 0, 0, 0 );
327
328 mFilterLineEdit->setShowClearButton( true );
329 mFilterLineEdit->setShowSearchIcon( true );
330 mFilterLineEdit->setPlaceholderText( tr( "Filter rules" ) );
331
332 QMenu *menuAddRule = new QMenu( btnAddRule );
333 menuAddRule->addAction( tr( "Marker" ), this, [this] { addStyle( Qgis::GeometryType::Point ); } );
334 menuAddRule->addAction( tr( "Line" ), this, [this] { addStyle( Qgis::GeometryType::Line ); } );
335 menuAddRule->addAction( tr( "Fill" ), this, [this] { addStyle( Qgis::GeometryType::Polygon ); } );
336 btnAddRule->setMenu( menuAddRule );
337
338 connect( btnEditRule, &QPushButton::clicked, this, &QgsVectorTileBasicRendererWidget::editStyle );
339 connect( btnRemoveRule, &QAbstractButton::clicked, this, &QgsVectorTileBasicRendererWidget::removeStyle );
340
341 connect( viewStyles, &QAbstractItemView::doubleClicked, this, &QgsVectorTileBasicRendererWidget::editStyleAtIndex );
342
343 if ( mMapCanvas )
344 {
345 connect( mMapCanvas, &QgsMapCanvas::scaleChanged, this, [ = ]( double scale )
346 {
347 const QgsMapSettings &mapSettings = mMapCanvas->mapSettings();
348 const double tileScale = mVTLayer ? mVTLayer->tileMatrixSet().calculateTileScaleForMap( mMapCanvas->scale(),
349 mapSettings.destinationCrs(),
350 mapSettings.visibleExtent(),
351 mapSettings.outputSize(),
352 mapSettings.outputDpi() ) : scale;
353 const int zoom = mVTLayer ? mVTLayer->tileMatrixSet().scaleToZoomLevel( tileScale ) : QgsVectorTileUtils::scaleToZoomLevel( tileScale, 0, 99 );
354 mLabelCurrentZoom->setText( tr( "Current zoom: %1" ).arg( zoom ) );
355 if ( mProxyModel )
356 mProxyModel->setCurrentZoom( zoom );
357 } );
358
359 const QgsMapSettings &mapSettings = mMapCanvas->mapSettings();
360 const double tileScale = mVTLayer ? mVTLayer->tileMatrixSet().calculateTileScaleForMap( mMapCanvas->scale(),
361 mapSettings.destinationCrs(),
362 mapSettings.visibleExtent(),
363 mapSettings.outputSize(),
364 mapSettings.outputDpi() ) : mMapCanvas->scale();
365 mLabelCurrentZoom->setText( tr( "Current zoom: %1" ).arg( mVTLayer ? mVTLayer->tileMatrixSet().scaleToZoomLevel( tileScale ) : QgsVectorTileUtils::scaleToZoomLevel( tileScale, 0, 99 ) ) );
366 }
367
368 connect( mCheckVisibleOnly, &QCheckBox::toggled, this, [ = ]( bool filter )
369 {
370 mProxyModel->setFilterVisible( filter );
371 } );
372
373 connect( mFilterLineEdit, &QgsFilterLineEdit::textChanged, this, [ = ]( const QString & text )
374 {
375 mProxyModel->setFilterString( text );
376 } );
377
378 syncToLayer( layer );
379
380 connect( mOpacityWidget, &QgsOpacityWidget::opacityChanged, this, &QgsPanelWidget::widgetChanged );
381 connect( mBlendModeComboBox, static_cast<void ( QComboBox::* )( int )>( &QComboBox::currentIndexChanged ), this, &QgsPanelWidget::widgetChanged );
382}
383
384void QgsVectorTileBasicRendererWidget::syncToLayer( QgsMapLayer *layer )
385{
386 QgsVectorTileLayer *vtLayer = qobject_cast<QgsVectorTileLayer *>( layer );
387 if ( !vtLayer )
388 return;
389
390 mVTLayer = vtLayer;
391
392 if ( layer && vtLayer->renderer() && vtLayer->renderer()->type() == QLatin1String( "basic" ) )
393 {
394 mRenderer.reset( static_cast<QgsVectorTileBasicRenderer *>( vtLayer->renderer()->clone() ) );
395 }
396 else
397 {
398 mRenderer.reset( new QgsVectorTileBasicRenderer() );
399 }
400
401 mModel = new QgsVectorTileBasicRendererListModel( mRenderer.get(), viewStyles, screen() );
402 mProxyModel = new QgsVectorTileBasicRendererProxyModel( mModel, viewStyles );
403 viewStyles->setModel( mProxyModel );
404
405 if ( mMapCanvas )
406 {
407 const QgsMapSettings &mapSettings = mMapCanvas->mapSettings();
408 const double tileScale = mVTLayer ? mVTLayer->tileMatrixSet().calculateTileScaleForMap( mMapCanvas->scale(),
409 mapSettings.destinationCrs(),
410 mapSettings.visibleExtent(),
411 mapSettings.outputSize(),
412 mapSettings.outputDpi() ) : mMapCanvas->scale();
413 const int zoom = mVTLayer ? mVTLayer->tileMatrixSet().scaleToZoomLevel( tileScale ) : QgsVectorTileUtils::scaleToZoomLevel( tileScale, 0, 99 );
414 mProxyModel->setCurrentZoom( zoom );
415 }
416
417 connect( mModel, &QAbstractItemModel::dataChanged, this, &QgsPanelWidget::widgetChanged );
418 connect( mModel, &QAbstractItemModel::rowsInserted, this, &QgsPanelWidget::widgetChanged );
419 connect( mModel, &QAbstractItemModel::rowsRemoved, this, &QgsPanelWidget::widgetChanged );
420
421 mOpacityWidget->setOpacity( mVTLayer->opacity() );
422
423 //blend mode
424 mBlendModeComboBox->setShowClippingModes( QgsProjectUtils::layerIsContainedInGroupLayer( QgsProject::instance(), mVTLayer ) );
425 mBlendModeComboBox->setBlendMode( mVTLayer->blendMode() );
426}
427
428QgsVectorTileBasicRendererWidget::~QgsVectorTileBasicRendererWidget() = default;
429
430void QgsVectorTileBasicRendererWidget::apply()
431{
432 mVTLayer->setRenderer( mRenderer->clone() );
433 mVTLayer->setBlendMode( mBlendModeComboBox->blendMode() );
434 mVTLayer->setOpacity( mOpacityWidget->opacity() );
435}
436
437void QgsVectorTileBasicRendererWidget::addStyle( Qgis::GeometryType geomType )
438{
439 QgsVectorTileBasicRendererStyle style( QString(), QString(), geomType );
440 style.setSymbol( QgsSymbol::defaultSymbol( geomType ) );
441
442 switch ( geomType )
443 {
444 case Qgis::GeometryType::Point:
445 style.setFilterExpression( QStringLiteral( "geometry_type($geometry)='Point'" ) );
446 break;
447 case Qgis::GeometryType::Line:
448 style.setFilterExpression( QStringLiteral( "geometry_type($geometry)='Line'" ) );
449 break;
450 case Qgis::GeometryType::Polygon:
451 style.setFilterExpression( QStringLiteral( "geometry_type($geometry)='Polygon'" ) );
452 break;
453 case Qgis::GeometryType::Unknown:
454 case Qgis::GeometryType::Null:
455 break;
456 }
457
458 const int rows = mModel->rowCount();
459 mModel->insertStyle( rows, style );
460 viewStyles->selectionModel()->setCurrentIndex( mProxyModel->mapFromSource( mModel->index( rows, 0 ) ), QItemSelectionModel::ClearAndSelect );
461}
462
463void QgsVectorTileBasicRendererWidget::editStyle()
464{
465 editStyleAtIndex( viewStyles->selectionModel()->currentIndex() );
466}
467
468void QgsVectorTileBasicRendererWidget::editStyleAtIndex( const QModelIndex &proxyIndex )
469{
470 const QModelIndex index = mProxyModel->mapToSource( proxyIndex );
471 if ( index.row() < 0 || index.row() >= mRenderer->styles().count() )
472 return;
473
474 QgsVectorTileBasicRendererStyle style = mRenderer->style( index.row() );
475
476 if ( !style.symbol() )
477 return;
478
479 std::unique_ptr< QgsSymbol > symbol( style.symbol()->clone() );
480
482 context.setMapCanvas( mMapCanvas );
483 context.setMessageBar( mMessageBar );
484
485 if ( mMapCanvas )
486 {
487 const QgsMapSettings &mapSettings = mMapCanvas->mapSettings();
488 const double tileScale = mVTLayer ? mVTLayer->tileMatrixSet().calculateTileScaleForMap( mMapCanvas->scale(),
489 mapSettings.destinationCrs(),
490 mapSettings.visibleExtent(),
491 mapSettings.outputSize(),
492 mapSettings.outputDpi() ) : mMapCanvas->scale();
493 const int zoom = mVTLayer ? mVTLayer->tileMatrixSet().scaleToZoomLevel( tileScale ) : QgsVectorTileUtils::scaleToZoomLevel( tileScale, 0, 99 );
494 QList<QgsExpressionContextScope> scopes = context.additionalExpressionContextScopes();
496 tileScope.setVariable( "zoom_level", zoom, true );
497 tileScope.setVariable( "vector_tile_zoom", mVTLayer ? mVTLayer->tileMatrixSet().scaleToZoom( mMapCanvas->scale() ) : QgsVectorTileUtils::scaleToZoom( mMapCanvas->scale() ), true );
498 scopes << tileScope;
499 context.setAdditionalExpressionContextScopes( scopes );
500 }
501
502 QgsVectorLayer *vectorLayer = nullptr; // TODO: have a temporary vector layer with sub-layer's fields?
503
505 if ( panel && panel->dockMode() )
506 {
507 QgsSymbolSelectorWidget *dlg = new QgsSymbolSelectorWidget( symbol.release(), QgsStyle::defaultStyle(), vectorLayer, panel );
508 dlg->setContext( context );
509 dlg->setPanelTitle( style.styleName() );
510 connect( dlg, &QgsPanelWidget::widgetChanged, this, &QgsVectorTileBasicRendererWidget::updateSymbolsFromWidget );
511 connect( dlg, &QgsPanelWidget::panelAccepted, this, &QgsVectorTileBasicRendererWidget::cleanUpSymbolSelector );
512 openPanel( dlg );
513 }
514 else
515 {
516 QgsSymbolSelectorDialog dlg( symbol.get(), QgsStyle::defaultStyle(), vectorLayer, panel );
517 dlg.setContext( context );
518 if ( !dlg.exec() || !symbol )
519 {
520 return;
521 }
522
523 style.setSymbol( symbol.release() );
524 mRenderer->setStyle( index.row(), style );
525 emit widgetChanged();
526 }
527}
528
529void QgsVectorTileBasicRendererWidget::updateSymbolsFromWidget()
530{
531 const int index = mProxyModel->mapToSource( viewStyles->selectionModel()->currentIndex() ).row();
532 if ( index < 0 )
533 return;
534
535 QgsVectorTileBasicRendererStyle style = mRenderer->style( index );
536
537 QgsSymbolSelectorWidget *dlg = qobject_cast<QgsSymbolSelectorWidget *>( sender() );
538 style.setSymbol( dlg->symbol()->clone() );
539
540 mRenderer->setStyle( index, style );
541 emit widgetChanged();
542}
543
544void QgsVectorTileBasicRendererWidget::cleanUpSymbolSelector( QgsPanelWidget *container )
545{
546 QgsSymbolSelectorWidget *dlg = qobject_cast<QgsSymbolSelectorWidget *>( container );
547 if ( !dlg )
548 return;
549
550 delete dlg->symbol();
551}
552
553void QgsVectorTileBasicRendererWidget::removeStyle()
554{
555 const QModelIndexList sel = viewStyles->selectionModel()->selectedIndexes();
556
557 QList<int > res;
558 for ( const QModelIndex &proxyIndex : sel )
559 {
560 const QModelIndex sourceIndex = mProxyModel->mapToSource( proxyIndex );
561 if ( !res.contains( sourceIndex.row() ) )
562 res << sourceIndex.row();
563 }
564 std::sort( res.begin(), res.end() );
565
566 for ( int i = res.size() - 1; i >= 0; --i )
567 {
568 mModel->removeRow( res[ i ] );
569 }
570 // make sure that the selection is gone
571 viewStyles->selectionModel()->clear();
572}
573
574QgsVectorTileBasicRendererProxyModel::QgsVectorTileBasicRendererProxyModel( QgsVectorTileBasicRendererListModel *source, QObject *parent )
575 : QSortFilterProxyModel( parent )
576{
577 setSourceModel( source );
578 setDynamicSortFilter( true );
579}
580
581void QgsVectorTileBasicRendererProxyModel::setCurrentZoom( int zoom )
582{
583 mCurrentZoom = zoom;
584 invalidateFilter();
585}
586
587void QgsVectorTileBasicRendererProxyModel::setFilterVisible( bool enabled )
588{
589 mFilterVisible = enabled;
590 invalidateFilter();
591}
592
593void QgsVectorTileBasicRendererProxyModel::setFilterString( const QString &string )
594{
595 mFilterString = string;
596 invalidateFilter();
597}
598
599bool QgsVectorTileBasicRendererProxyModel::filterAcceptsRow( int source_row, const QModelIndex &source_parent ) const
600{
601 if ( mCurrentZoom >= 0 && mFilterVisible )
602 {
603 const int rowMinZoom = sourceModel()->data( sourceModel()->index( source_row, 0, source_parent ), QgsVectorTileBasicRendererListModel::MinZoom ).toInt();
604 const int rowMaxZoom = sourceModel()->data( sourceModel()->index( source_row, 0, source_parent ), QgsVectorTileBasicRendererListModel::MaxZoom ).toInt();
605
606 if ( rowMinZoom >= 0 && rowMinZoom > mCurrentZoom )
607 return false;
608
609 if ( rowMaxZoom >= 0 && rowMaxZoom < mCurrentZoom )
610 return false;
611 }
612
613 if ( !mFilterString.isEmpty() )
614 {
615 const QString name = sourceModel()->data( sourceModel()->index( source_row, 0, source_parent ), QgsVectorTileBasicRendererListModel::Label ).toString();
616 const QString layer = sourceModel()->data( sourceModel()->index( source_row, 0, source_parent ), QgsVectorTileBasicRendererListModel::Layer ).toString();
617 const QString filter = sourceModel()->data( sourceModel()->index( source_row, 0, source_parent ), QgsVectorTileBasicRendererListModel::Filter ).toString();
618 if ( !name.contains( mFilterString, Qt::CaseInsensitive )
619 && !layer.contains( mFilterString, Qt::CaseInsensitive )
620 && !filter.contains( mFilterString, Qt::CaseInsensitive ) )
621 {
622 return false;
623 }
624 }
625
626 return true;
627}
628
629
630
GeometryType
The geometry types are used to group Qgis::WkbType in a coarse way.
Definition: qgis.h:227
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.
Definition: qgsmapcanvas.h:90
void scaleChanged(double)
Emitted when the scale of the map changes.
A panel widget that can be shown in the map style dock.
Base class for all map layer types.
Definition: qgsmaplayer.h:73
The QgsMapSettings class contains configuration for rendering of the map.
double scale() const
Returns the calculated map scale.
QSize outputSize() const
Returns the size of the resulting map image, in pixels.
QgsRectangle visibleExtent() const
Returns the actual extent derived from requested extent that takes output image size into account.
double outputDpi() const
Returns the DPI (dots per inch) used for conversion between real world units (e.g.
QgsCoordinateReferenceSystem destinationCrs() const
Returns the destination coordinate reference system for the map render.
A bar for displaying non-blocking messages to the user.
Definition: qgsmessagebar.h:61
void opacityChanged(double opacity)
Emitted when the opacity is changed in the widget, where opacity ranges from 0.0 (transparent) to 1....
Base class for any widget that can be shown as a inline panel.
void panelAccepted(QgsPanelWidget *panel)
Emitted when the panel is accepted by the user.
void widgetChanged()
Emitted when the widget state changes.
static QgsPanelWidget * findParentPanel(QWidget *widget)
Traces through the parents of a widget to find if it is contained within a QgsPanelWidget widget.
void setPanelTitle(const QString &panelTitle)
Set the title of the panel when shown in the interface.
bool dockMode()
Returns the dock mode state.
static bool layerIsContainedInGroupLayer(QgsProject *project, QgsMapLayer *layer)
Returns true if the specified layer is a child layer from any QgsGroupLayer in the given project.
static QgsProject * instance()
Returns the QgsProject singleton instance.
Definition: qgsproject.cpp:484
The class is used as a container of context for various read/write operations on other objects.
Stores properties relating to a screen.
static QgsStyle * defaultStyle()
Returns default application-wide style.
Definition: qgsstyle.cpp:145
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.
Symbol selector widget that can be used to select and build a symbol.
void setContext(const QgsSymbolWidgetContext &context)
Sets the context in which the symbol widget is shown, e.g., the associated map canvas and expression ...
QgsSymbol * symbol()
Returns the symbol that is currently active in the widget.
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.
virtual QgsSymbol * clone() const =0
Returns a deep copy of this symbol.
static QgsSymbol * defaultSymbol(Qgis::GeometryType geomType)
Returns a new default symbol for the specified geometry type.
Definition: qgssymbol.cpp:704
Represents a vector layer which manages a vector based data sets.
Definition of map rendering of a subset of vector tile data.
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)
QgsSymbol * symbol() const
Returns symbol for rendering.
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 the minimum zoom level index (negative number means no limit).
int maxZoomLevel() const
Returns the maximum 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 QString type() const =0
Returns unique type name of the renderer implementation.
virtual QgsVectorTileRenderer * clone() const =0
Returns a clone of the renderer.
static double scaleToZoom(double mapScale, double z0Scale=559082264.0287178)
Finds zoom level given map scale denominator.
static int scaleToZoomLevel(double mapScale, int sourceMinZoom, int sourceMaxZoom, double z0Scale=559082264.0287178)
Finds the best fitting zoom level given a map scale denominator and allowed zoom level range.
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,...