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   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     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       mLabelCurrentZoom->setText( tr( 
"Current zoom: %1" ).arg( zoom ) );
 
  331         mProxyModel->setCurrentZoom( zoom );
 
  336   connect( mCheckVisibleOnly, &QCheckBox::toggled, 
this, [ = ]( 
bool filter )
 
  338     mProxyModel->setFilterVisible( filter );
 
  357   mModel = 
new QgsVectorTileBasicLabelingListModel( mLabeling.get(), viewStyles );
 
  358   mProxyModel = 
new QgsVectorTileBasicLabelingProxyModel( mModel, viewStyles );
 
  359   viewStyles->setModel( mProxyModel );
 
  364     mProxyModel->setCurrentZoom( zoom );
 
  372 QgsVectorTileBasicLabelingWidget::~QgsVectorTileBasicLabelingWidget() = 
default;
 
  374 void QgsVectorTileBasicLabelingWidget::apply()
 
  376   mVTLayer->setLabeling( mLabeling->clone() );
 
  384   int rows = mModel->rowCount();
 
  385   mModel->insertStyle( rows, style );
 
  386   viewStyles->selectionModel()->setCurrentIndex( mProxyModel->mapFromSource( mModel->index( rows, 0 ) ), QItemSelectionModel::ClearAndSelect );
 
  389 void QgsVectorTileBasicLabelingWidget::editStyle()
 
  391   editStyleAtIndex( viewStyles->selectionModel()->currentIndex() );
 
  394 void QgsVectorTileBasicLabelingWidget::editStyleAtIndex( 
const QModelIndex &proxyIndex )
 
  396   const QModelIndex index = mProxyModel->mapToSource( proxyIndex );
 
  397   if ( index.row() < 0 || index.row() >= mLabeling->styles().count() )
 
  426     QgsLabelingPanelWidget *widget = 
new QgsLabelingPanelWidget( labelSettings, vectorLayer, mMapCanvas, panel );
 
  427     widget->setContext( context );
 
  428     widget->setPanelTitle( style.
styleName() );
 
  434     QgsLabelSettingsDialog dlg( labelSettings, vectorLayer, mMapCanvas, 
this, labelSettings.
layerType );
 
  439       mLabeling->setStyle( index.row(), style );
 
  440       emit widgetChanged();
 
  445 void QgsVectorTileBasicLabelingWidget::updateLabelingFromWidget()
 
  447   int index = mProxyModel->mapToSource( viewStyles->selectionModel()->currentIndex() ).row();
 
  453   QgsLabelingPanelWidget *widget = qobject_cast<QgsLabelingPanelWidget *>( sender() );
 
  456   mLabeling->setStyle( index, style );
 
  457   emit widgetChanged();
 
  460 void QgsVectorTileBasicLabelingWidget::removeStyle()
 
  462   const QModelIndexList sel = viewStyles->selectionModel()->selectedIndexes();
 
  465   for ( 
const QModelIndex &proxyIndex : sel )
 
  467     const QModelIndex sourceIndex = mProxyModel->mapToSource( proxyIndex );
 
  468     if ( !res.contains( sourceIndex.row() ) )
 
  469       res << sourceIndex.row();
 
  471   std::sort( res.begin(), res.end() );
 
  473   for ( 
int i = res.size() - 1; i >= 0; --i )
 
  475     mModel->removeRow( res[ i ] );
 
  478   viewStyles->selectionModel()->clear();
 
  488   mLabelingGui = 
new QgsLabelingGui( vectorLayer, mapCanvas, labelSettings, 
this, labelSettings.
layerType );
 
  489   mLabelingGui->setLabelMode( QgsLabelingGui::Labels );
 
  491   mLabelingGui->layout()->setContentsMargins( 0, 0, 0, 0 );
 
  492   QVBoxLayout *l = 
new QVBoxLayout;
 
  493   l->addWidget( mLabelingGui );
 
  499 void QgsLabelingPanelWidget::setDockMode( 
bool dockMode )
 
  502   mLabelingGui->setDockMode( dockMode );
 
  507   mLabelingGui->setContext( context );
 
  512   return mLabelingGui->layerSettings();
 
  516 QgsVectorTileBasicLabelingProxyModel::QgsVectorTileBasicLabelingProxyModel( QgsVectorTileBasicLabelingListModel *source, QObject *parent )
 
  517   : QSortFilterProxyModel( parent )
 
  519   setSourceModel( source );
 
  520   setDynamicSortFilter( 
true );
 
  523 void QgsVectorTileBasicLabelingProxyModel::setCurrentZoom( 
int zoom )
 
  529 void QgsVectorTileBasicLabelingProxyModel::setFilterVisible( 
bool enabled )
 
  531   mFilterVisible = enabled;
 
  535 bool QgsVectorTileBasicLabelingProxyModel::filterAcceptsRow( 
int source_row, 
const QModelIndex &source_parent )
 const 
  537   if ( mCurrentZoom < 0 || !mFilterVisible )
 
  540   const int rowMinZoom = sourceModel()->data( sourceModel()->index( source_row, 0, source_parent ), QgsVectorTileBasicLabelingListModel::MinZoom ).toInt();
 
  541   const int rowMaxZoom = sourceModel()->data( sourceModel()->index( source_row, 0, source_parent ), QgsVectorTileBasicLabelingListModel::MaxZoom ).toInt();
 
  543   if ( rowMinZoom >= 0 && rowMinZoom > mCurrentZoom )
 
  546   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.
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 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,...
const double ICON_PADDING_FACTOR