32 : QAbstractListModel( parent )
37 int QgsVectorTileBasicLabelingListModel::rowCount(
const QModelIndex &parent )
const
39 if ( parent.isValid() )
42 return mLabeling->styles().count();
45 int QgsVectorTileBasicLabelingListModel::columnCount(
const QModelIndex & )
const
50 QVariant QgsVectorTileBasicLabelingListModel::data(
const QModelIndex &index,
int role )
const
52 if ( index.row() < 0 || index.row() >= mLabeling->styles().count() )
55 const QList<QgsVectorTileBasicLabelingStyle> styles = mLabeling->styles();
63 if ( index.column() == 0 )
65 else if ( index.column() == 1 )
66 return style.
layerName().isEmpty() ? tr(
"(all layers)" ) : style.layerName();
67 else if ( index.column() == 2 )
69 else if ( index.column() == 3 )
71 else if ( index.column() == 4 )
72 return style.
filterExpression().isEmpty() ? tr(
"(no filter)" ) : style.filterExpression();
79 if ( index.column() == 0 )
81 else if ( index.column() == 1 )
83 else if ( index.column() == 2 )
85 else if ( index.column() == 3 )
87 else if ( index.column() == 4 )
93 case Qt::CheckStateRole:
95 if ( index.column() != 0 )
97 return style.
isEnabled() ? Qt::Checked : Qt::Unchecked;
100 case Qt::DecorationRole:
102 if ( index.column() == 0 )
120 QVariant QgsVectorTileBasicLabelingListModel::headerData(
int section, Qt::Orientation orientation,
int role )
const
122 if ( orientation == Qt::Horizontal && role == Qt::DisplayRole && section >= 0 && section < 5 )
125 lst << tr(
"Label" ) << tr(
"Layer" ) << tr(
"Min. Zoom" ) << tr(
"Max. Zoom" ) << tr(
"Filter" );
132 Qt::ItemFlags QgsVectorTileBasicLabelingListModel::flags(
const QModelIndex &index )
const
134 if ( !index.isValid() )
135 return Qt::ItemIsDropEnabled;
137 const Qt::ItemFlag checkable = ( index.column() == 0 ? Qt::ItemIsUserCheckable : Qt::NoItemFlags );
139 return Qt::ItemIsEnabled | Qt::ItemIsSelectable |
140 Qt::ItemIsEditable | checkable |
141 Qt::ItemIsDragEnabled;
144 bool QgsVectorTileBasicLabelingListModel::setData(
const QModelIndex &index,
const QVariant &value,
int role )
146 if ( !index.isValid() )
151 if ( role == Qt::CheckStateRole )
153 style.
setEnabled( value.toInt() == Qt::Checked );
154 mLabeling->setStyle( index.row(), style );
155 emit dataChanged( index, index );
159 if ( role == Qt::EditRole )
161 if ( index.column() == 0 )
163 else if ( index.column() == 1 )
165 else if ( index.column() == 2 )
167 else if ( index.column() == 3 )
169 else if ( index.column() == 4 )
172 mLabeling->setStyle( index.row(), style );
173 emit dataChanged( index, index );
180 bool QgsVectorTileBasicLabelingListModel::removeRows(
int row,
int count,
const QModelIndex &parent )
182 QList<QgsVectorTileBasicLabelingStyle> styles = mLabeling->styles();
184 if ( row < 0 || row >= styles.count() )
187 beginRemoveRows( parent, row, row + count - 1 );
189 for (
int i = 0; i < count; i++ )
191 if ( row < styles.count() )
193 styles.removeAt( row );
197 mLabeling->setStyles( styles );
205 beginInsertRows( QModelIndex(), row, row );
207 QList<QgsVectorTileBasicLabelingStyle> styles = mLabeling->styles();
208 styles.insert( row, style );
209 mLabeling->setStyles( styles );
214 Qt::DropActions QgsVectorTileBasicLabelingListModel::supportedDropActions()
const
216 return Qt::MoveAction;
219 QStringList QgsVectorTileBasicLabelingListModel::mimeTypes()
const
222 types << QStringLiteral(
"application/vnd.text.list" );
226 QMimeData *QgsVectorTileBasicLabelingListModel::mimeData(
const QModelIndexList &indexes )
const
228 QMimeData *mimeData =
new QMimeData();
229 QByteArray encodedData;
231 QDataStream stream( &encodedData, QIODevice::WriteOnly );
233 const auto constIndexes = indexes;
234 for (
const QModelIndex &index : constIndexes )
237 if ( !index.isValid() || index.column() != 0 )
243 QDomElement rootElem = doc.createElement( QStringLiteral(
"vector_tile_basic_labeling_style_mime" ) );
245 doc.appendChild( rootElem );
247 stream << doc.toString( -1 );
250 mimeData->setData( QStringLiteral(
"application/vnd.text.list" ), encodedData );
254 bool QgsVectorTileBasicLabelingListModel::dropMimeData(
const QMimeData *data,
255 Qt::DropAction action,
int row,
int column,
const QModelIndex &parent )
259 if ( action == Qt::IgnoreAction )
262 if ( !data->hasFormat( QStringLiteral(
"application/vnd.text.list" ) ) )
265 if ( parent.column() > 0 )
268 QByteArray encodedData = data->data( QStringLiteral(
"application/vnd.text.list" ) );
269 QDataStream stream( &encodedData, QIODevice::ReadOnly );
275 row = rowCount( parent );
278 while ( !stream.atEnd() )
284 if ( !doc.setContent( text ) )
286 const QDomElement rootElem = doc.documentElement();
287 if ( rootElem.tagName() != QLatin1String(
"vector_tile_basic_labeling_style_mime" ) )
293 insertStyle( row + rows, style );
305 , mMapCanvas( canvas )
306 , mMessageBar( messageBar )
310 layout()->setContentsMargins( 0, 0, 0, 0 );
312 QMenu *menuAddRule =
new QMenu( btnAddRule );
316 btnAddRule->setMenu( menuAddRule );
319 connect( btnEditRule, &QPushButton::clicked,
this, &QgsVectorTileBasicLabelingWidget::editStyle );
320 connect( btnRemoveRule, &QAbstractButton::clicked,
this, &QgsVectorTileBasicLabelingWidget::removeStyle );
322 connect( viewStyles, &QAbstractItemView::doubleClicked,
this, &QgsVectorTileBasicLabelingWidget::editStyleAtIndex );
329 const double tileScale = mVTLayer ? mVTLayer->tileMatrixSet().calculateTileScaleForMap( scale,
335 mLabelCurrentZoom->setText( tr(
"Current zoom: %1" ).arg( zoom ) );
337 mProxyModel->setCurrentZoom( zoom );
341 const double tileScale = mVTLayer ? mVTLayer->tileMatrixSet().calculateTileScaleForMap( mMapCanvas->scale(),
342 mapSettings.destinationCrs(),
343 mapSettings.visibleExtent(),
344 mapSettings.outputSize(),
345 mapSettings.outputDpi() ) : mMapCanvas->
scale();
346 mLabelCurrentZoom->setText( tr(
"Current zoom: %1" ).arg( mVTLayer ? mVTLayer->tileMatrixSet().scaleToZoomLevel( tileScale ) :
QgsVectorTileUtils::scaleToZoomLevel( tileScale, 0, 99 ) ) );
349 connect( mCheckVisibleOnly, &QCheckBox::toggled,
this, [ = ](
bool filter )
351 mProxyModel->setFilterVisible( filter );
370 mModel =
new QgsVectorTileBasicLabelingListModel( mLabeling.get(), viewStyles );
371 mProxyModel =
new QgsVectorTileBasicLabelingProxyModel( mModel, viewStyles );
372 viewStyles->setModel( mProxyModel );
377 const double tileScale = mVTLayer ? mVTLayer->tileMatrixSet().calculateTileScaleForMap( mMapCanvas->scale(),
383 mProxyModel->setCurrentZoom( zoom );
391 QgsVectorTileBasicLabelingWidget::~QgsVectorTileBasicLabelingWidget() =
default;
393 void QgsVectorTileBasicLabelingWidget::apply()
395 mVTLayer->setLabeling( mLabeling->clone() );
418 const int rows = mModel->rowCount();
419 mModel->insertStyle( rows, style );
420 viewStyles->selectionModel()->setCurrentIndex( mProxyModel->mapFromSource( mModel->index( rows, 0 ) ), QItemSelectionModel::ClearAndSelect );
423 void QgsVectorTileBasicLabelingWidget::editStyle()
425 editStyleAtIndex( viewStyles->selectionModel()->currentIndex() );
428 void QgsVectorTileBasicLabelingWidget::editStyleAtIndex(
const QModelIndex &proxyIndex )
430 const QModelIndex index = mProxyModel->mapToSource( proxyIndex );
431 if ( index.row() < 0 || index.row() >= mLabeling->styles().count() )
447 const double tileScale = mVTLayer ? mVTLayer->tileMatrixSet().calculateTileScaleForMap( mMapCanvas->scale(),
466 QgsLabelingPanelWidget *widget =
new QgsLabelingPanelWidget( labelSettings, vectorLayer, mMapCanvas, panel );
467 widget->setContext( context );
468 widget->setPanelTitle( style.
styleName() );
474 QgsLabelSettingsDialog dlg( labelSettings, vectorLayer, mMapCanvas,
this, labelSettings.
layerType );
479 mLabeling->setStyle( index.row(), style );
480 emit widgetChanged();
485 void QgsVectorTileBasicLabelingWidget::updateLabelingFromWidget()
487 const int index = mProxyModel->mapToSource( viewStyles->selectionModel()->currentIndex() ).row();
493 QgsLabelingPanelWidget *widget = qobject_cast<QgsLabelingPanelWidget *>( sender() );
496 mLabeling->setStyle( index, style );
497 emit widgetChanged();
500 void QgsVectorTileBasicLabelingWidget::removeStyle()
502 const QModelIndexList sel = viewStyles->selectionModel()->selectedIndexes();
505 for (
const QModelIndex &proxyIndex : sel )
507 const QModelIndex sourceIndex = mProxyModel->mapToSource( proxyIndex );
508 if ( !res.contains( sourceIndex.row() ) )
509 res << sourceIndex.row();
511 std::sort( res.begin(), res.end() );
513 for (
int i = res.size() - 1; i >= 0; --i )
515 mModel->removeRow( res[ i ] );
518 viewStyles->selectionModel()->clear();
528 mLabelingGui =
new QgsLabelingGui( vectorLayer, mapCanvas, labelSettings,
this, labelSettings.
layerType );
529 mLabelingGui->setLabelMode( QgsLabelingGui::Labels );
531 mLabelingGui->layout()->setContentsMargins( 0, 0, 0, 0 );
532 QVBoxLayout *l =
new QVBoxLayout;
533 l->addWidget( mLabelingGui );
539 void QgsLabelingPanelWidget::setDockMode(
bool dockMode )
542 mLabelingGui->setDockMode( dockMode );
547 mLabelingGui->setContext( context );
552 return mLabelingGui->layerSettings();
556 QgsVectorTileBasicLabelingProxyModel::QgsVectorTileBasicLabelingProxyModel( QgsVectorTileBasicLabelingListModel *source, QObject *parent )
557 : QSortFilterProxyModel( parent )
559 setSourceModel( source );
560 setDynamicSortFilter(
true );
563 void QgsVectorTileBasicLabelingProxyModel::setCurrentZoom(
int zoom )
569 void QgsVectorTileBasicLabelingProxyModel::setFilterVisible(
bool enabled )
571 mFilterVisible = enabled;
575 bool QgsVectorTileBasicLabelingProxyModel::filterAcceptsRow(
int source_row,
const QModelIndex &source_parent )
const
577 if ( mCurrentZoom < 0 || !mFilterVisible )
580 const int rowMinZoom = sourceModel()->data( sourceModel()->index( source_row, 0, source_parent ), QgsVectorTileBasicLabelingListModel::MinZoom ).toInt();
581 const int rowMaxZoom = sourceModel()->data( sourceModel()->index( source_row, 0, source_parent ), QgsVectorTileBasicLabelingListModel::MaxZoom ).toInt();
583 if ( rowMinZoom >= 0 && rowMinZoom > mCurrentZoom )
586 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.
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.
Contains settings for how a map layer will be labeled.
static QPixmap labelSettingsPreviewPixmap(const QgsPalLayerSettings &settings, QSize size, const QString &previewText=QString(), int padding=0)
Returns a pixmap preview for label settings.
QgsWkbTypes::GeometryType layerType
Geometry type of layers associated with these settings.
The class is used as a container of context for various read/write operations on other objects.
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.
void widgetChanged()
Emitted when the text format defined by the widget changes.
Represents a vector layer which manages a vector based data sets.
Configuration of a single style within QgsVectorTileBasicLabeling.
QgsPalLayerSettings labelSettings() const
Returns labeling configuration of this style.
void setGeometryType(QgsWkbTypes::GeometryType geomType)
Sets type of the geometry that will be used (point / line / polygon)
QString layerName() const
Returns name of the sub-layer to render (empty layer means that all layers match)
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)
void setMinZoomLevel(int minZoom)
Sets minimum zoom level index (negative number means no limit)
void writeXml(QDomElement &elem, const QgsReadWriteContext &context) const
Writes object content to given DOM element.
QgsWkbTypes::GeometryType geometryType() const
Returns type of the geometry that will be used (point / line / polygon)
int maxZoomLevel() const
Returns maxnimum zoom level index (negative number means no limit)
void setFilterExpression(const QString &expr)
Sets filter expression (empty filter means that all features match)
int minZoomLevel() const
Returns minimum zoom level index (negative number means no limit)
void readXml(const QDomElement &elem, const QgsReadWriteContext &context)
Reads object content from given DOM element.
void setMaxZoomLevel(int maxZoom)
Sets maximum zoom level index (negative number means no limit)
void setStyleName(const QString &name)
Sets human readable name of this style.
void setLabelSettings(const QgsPalLayerSettings &settings)
Sets labeling configuration of this style.
void setEnabled(bool enabled)
Sets whether this style is enabled (used for rendering)
QString styleName() const
Returns human readable name of this style.
bool isEnabled() const
Returns whether this style is enabled (used for rendering)
Basic labeling configuration for vector tile layers.
virtual QString type() const =0
Unique type string of the labeling configuration implementation.
virtual QgsVectorTileLabeling * clone() const =0SIP_FACTORY
Returns a new copy of the object.
Implements a map layer that is dedicated to rendering of vector tiles.
QgsVectorTileLabeling * labeling() const
Returns currently assigned labeling.
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.
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,...
const double ICON_PADDING_FACTOR