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 )