Branch data Line data Source code
1 : : /***************************************************************************
2 : : qgsmaplayermodel.cpp
3 : : --------------------------------------
4 : : Date : 01.04.2014
5 : : Copyright : (C) 2014 Denis Rouzaud
6 : : Email : denis.rouzaud@gmail.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 : :
16 : : #include <QIcon>
17 : :
18 : : #include "qgsdataitem.h"
19 : : #include "qgsmaplayermodel.h"
20 : : #include "qgsproject.h"
21 : : #include "qgsapplication.h"
22 : : #include "qgsvectorlayer.h"
23 : :
24 : 0 : QgsMapLayerModel::QgsMapLayerModel( const QList<QgsMapLayer *> &layers, QObject *parent, QgsProject *project )
25 : 0 : : QAbstractItemModel( parent )
26 : 0 : , mProject( project ? project : QgsProject::instance() )
27 : 0 : {
28 : 0 : connect( mProject, static_cast < void ( QgsProject::* )( const QStringList & ) >( &QgsProject::layersWillBeRemoved ), this, &QgsMapLayerModel::removeLayers );
29 : 0 : addLayers( layers );
30 : 0 : }
31 : :
32 : 0 : QgsMapLayerModel::QgsMapLayerModel( QObject *parent, QgsProject *project )
33 : 0 : : QAbstractItemModel( parent )
34 : 0 : , mProject( project ? project : QgsProject::instance() )
35 : 0 : {
36 : 0 : connect( mProject, &QgsProject::layersAdded, this, &QgsMapLayerModel::addLayers );
37 : 0 : connect( mProject, static_cast < void ( QgsProject::* )( const QStringList & ) >( &QgsProject::layersWillBeRemoved ), this, &QgsMapLayerModel::removeLayers );
38 : 0 : addLayers( mProject->mapLayers().values() );
39 : 0 : }
40 : :
41 : 0 : void QgsMapLayerModel::setItemsCheckable( bool checkable )
42 : : {
43 : 0 : mItemCheckable = checkable;
44 : 0 : }
45 : :
46 : 0 : void QgsMapLayerModel::setItemsCanBeReordered( bool allow )
47 : : {
48 : 0 : mCanReorder = allow;
49 : 0 : }
50 : :
51 : 0 : bool QgsMapLayerModel::itemsCanBeReordered() const
52 : : {
53 : 0 : return mCanReorder;
54 : : }
55 : :
56 : 0 : void QgsMapLayerModel::checkAll( Qt::CheckState checkState )
57 : : {
58 : 0 : QMap<QString, Qt::CheckState>::iterator i = mLayersChecked.begin();
59 : 0 : for ( ; i != mLayersChecked.end(); ++i )
60 : : {
61 : 0 : *i = checkState;
62 : 0 : }
63 : 0 : emit dataChanged( index( 0, 0 ), index( rowCount() - 1, 0 ) );
64 : 0 : }
65 : :
66 : 0 : void QgsMapLayerModel::setAllowEmptyLayer( bool allowEmpty, const QString &text, const QIcon &icon )
67 : : {
68 : 0 : mEmptyText = text;
69 : 0 : mEmptyIcon = icon;
70 : 0 : if ( allowEmpty == mAllowEmpty )
71 : 0 : return;
72 : :
73 : 0 : if ( allowEmpty )
74 : : {
75 : 0 : beginInsertRows( QModelIndex(), 0, 0 );
76 : 0 : mAllowEmpty = true;
77 : 0 : endInsertRows();
78 : 0 : }
79 : : else
80 : : {
81 : 0 : beginRemoveRows( QModelIndex(), 0, 0 );
82 : 0 : mAllowEmpty = false;
83 : 0 : endRemoveRows();
84 : : }
85 : 0 : }
86 : :
87 : 0 : void QgsMapLayerModel::setShowCrs( bool showCrs )
88 : : {
89 : 0 : if ( mShowCrs == showCrs )
90 : 0 : return;
91 : :
92 : 0 : mShowCrs = showCrs;
93 : 0 : emit dataChanged( index( 0, 0 ), index( rowCount() - 1, 0 ), QVector<int>() << Qt::DisplayRole );
94 : 0 : }
95 : :
96 : 0 : QList<QgsMapLayer *> QgsMapLayerModel::layersChecked( Qt::CheckState checkState )
97 : : {
98 : 0 : QList<QgsMapLayer *> layers;
99 : 0 : const auto constMLayers = mLayers;
100 : 0 : for ( QgsMapLayer *layer : constMLayers )
101 : : {
102 : 0 : if ( mLayersChecked[layer->id()] == checkState )
103 : : {
104 : 0 : layers.append( layer );
105 : 0 : }
106 : : }
107 : 0 : return layers;
108 : 0 : }
109 : :
110 : 0 : void QgsMapLayerModel::setLayersChecked( const QList<QgsMapLayer *> &layers )
111 : : {
112 : 0 : QMap<QString, Qt::CheckState>::iterator i = mLayersChecked.begin();
113 : 0 : for ( ; i != mLayersChecked.end(); ++i )
114 : : {
115 : 0 : *i = Qt::Unchecked;
116 : 0 : }
117 : 0 : for ( const QgsMapLayer *layer : layers )
118 : : {
119 : 0 : mLayersChecked[ layer->id() ] = Qt::Checked;
120 : : }
121 : 0 : emit dataChanged( index( 0, 0 ), index( rowCount() - 1, 0 ), QVector<int>() << Qt::CheckStateRole );
122 : 0 : }
123 : :
124 : 0 : QModelIndex QgsMapLayerModel::indexFromLayer( QgsMapLayer *layer ) const
125 : : {
126 : 0 : int r = mLayers.indexOf( layer );
127 : 0 : if ( r >= 0 && mAllowEmpty )
128 : 0 : r++;
129 : 0 : return index( r, 0 );
130 : : }
131 : :
132 : 0 : QgsMapLayer *QgsMapLayerModel::layerFromIndex( const QModelIndex &index ) const
133 : : {
134 : 0 : return mProject->mapLayer( index.data( LayerIdRole ).toString() );
135 : 0 : }
136 : :
137 : 0 : void QgsMapLayerModel::setAdditionalItems( const QStringList &items )
138 : : {
139 : 0 : if ( items == mAdditionalItems )
140 : 0 : return;
141 : :
142 : 0 : int offset = 0;
143 : 0 : if ( mAllowEmpty )
144 : 0 : offset++;
145 : :
146 : 0 : offset += mLayers.count();
147 : :
148 : : //remove existing
149 : 0 : if ( !mAdditionalItems.isEmpty() )
150 : : {
151 : 0 : beginRemoveRows( QModelIndex(), offset, offset + mAdditionalItems.count() - 1 );
152 : 0 : mAdditionalItems.clear();
153 : 0 : endRemoveRows();
154 : 0 : }
155 : :
156 : : //add new
157 : 0 : beginInsertRows( QModelIndex(), offset, offset + items.count() - 1 );
158 : 0 : mAdditionalItems = items;
159 : 0 : endInsertRows();
160 : 0 : }
161 : :
162 : 0 : void QgsMapLayerModel::removeLayers( const QStringList &layerIds )
163 : : {
164 : 0 : int offset = 0;
165 : 0 : if ( mAllowEmpty )
166 : 0 : offset++;
167 : :
168 : 0 : for ( const QString &layerId : layerIds )
169 : : {
170 : 0 : QModelIndex startIndex = index( 0, 0 );
171 : 0 : QModelIndexList list = match( startIndex, LayerIdRole, layerId, 1 );
172 : 0 : if ( !list.isEmpty() )
173 : : {
174 : 0 : QModelIndex index = list[0];
175 : 0 : beginRemoveRows( QModelIndex(), index.row(), index.row() );
176 : 0 : mLayersChecked.remove( layerId );
177 : 0 : mLayers.removeAt( index.row() - offset );
178 : 0 : endRemoveRows();
179 : 0 : }
180 : 0 : }
181 : 0 : }
182 : :
183 : 0 : void QgsMapLayerModel::addLayers( const QList<QgsMapLayer *> &layers )
184 : : {
185 : 0 : if ( !layers.empty( ) )
186 : : {
187 : 0 : int offset = 0;
188 : 0 : if ( mAllowEmpty )
189 : 0 : offset++;
190 : :
191 : 0 : beginInsertRows( QModelIndex(), mLayers.count() + offset, mLayers.count() + layers.count() - 1 + offset );
192 : 0 : const auto constLayers = layers;
193 : 0 : for ( QgsMapLayer *layer : constLayers )
194 : : {
195 : 0 : mLayers.append( layer );
196 : 0 : mLayersChecked.insert( layer->id(), Qt::Unchecked );
197 : : }
198 : 0 : endInsertRows();
199 : 0 : }
200 : 0 : }
201 : :
202 : 0 : QModelIndex QgsMapLayerModel::index( int row, int column, const QModelIndex &parent ) const
203 : : {
204 : 0 : int offset = 0;
205 : 0 : if ( mAllowEmpty )
206 : 0 : offset++;
207 : :
208 : 0 : if ( hasIndex( row, column, parent ) )
209 : 0 : {
210 : 0 : QgsMapLayer *layer = nullptr;
211 : 0 : if ( row - offset >= 0 && row - offset < mLayers.count() )
212 : 0 : layer = mLayers.at( row - offset );
213 : :
214 : 0 : return createIndex( row, column, layer );
215 : : }
216 : 0 :
217 : 0 : return QModelIndex();
218 : :
219 : 0 : }
220 : :
221 : 0 : QModelIndex QgsMapLayerModel::parent( const QModelIndex &child ) const
222 : : {
223 : 0 : Q_UNUSED( child )
224 : 0 : return QModelIndex();
225 : : }
226 : :
227 : :
228 : 0 : int QgsMapLayerModel::rowCount( const QModelIndex &parent ) const
229 : : {
230 : 0 : if ( parent.isValid() )
231 : 0 : return 0;
232 : :
233 : 0 : return ( mAllowEmpty ? 1 : 0 ) + mLayers.length() + mAdditionalItems.count();
234 : 0 : }
235 : :
236 : 0 : int QgsMapLayerModel::columnCount( const QModelIndex &parent ) const
237 : : {
238 : 0 : Q_UNUSED( parent )
239 : 0 : return 1;
240 : : }
241 : :
242 : :
243 : 0 : QVariant QgsMapLayerModel::data( const QModelIndex &index, int role ) const
244 : : {
245 : 0 : if ( !index.isValid() )
246 : 0 : return QVariant();
247 : :
248 : 0 : bool isEmpty = index.row() == 0 && mAllowEmpty;
249 : 0 : int additionalIndex = index.row() - ( mAllowEmpty ? 1 : 0 ) - mLayers.count();
250 : :
251 : 0 : switch ( role )
252 : : {
253 : : case Qt::DisplayRole:
254 : : case Qt::EditRole:
255 : : {
256 : 0 : if ( index.row() == 0 && mAllowEmpty )
257 : 0 : return mEmptyText;
258 : :
259 : 0 : if ( additionalIndex >= 0 )
260 : 0 : return mAdditionalItems.at( additionalIndex );
261 : :
262 : 0 : QgsMapLayer *layer = mLayers.value( index.row() - ( mAllowEmpty ? 1 : 0 ) );
263 : 0 : if ( !layer )
264 : 0 : return QVariant();
265 : :
266 : 0 : if ( !mShowCrs || !layer->isSpatial() || role == Qt::EditRole )
267 : : {
268 : 0 : return layer->name();
269 : : }
270 : : else
271 : : {
272 : 0 : return tr( "%1 [%2]" ).arg( layer->name(), layer->crs().authid() );
273 : : }
274 : : }
275 : :
276 : : case LayerIdRole:
277 : : {
278 : 0 : if ( isEmpty || additionalIndex >= 0 )
279 : 0 : return QVariant();
280 : :
281 : 0 : QgsMapLayer *layer = mLayers.value( index.row() - ( mAllowEmpty ? 1 : 0 ) );
282 : 0 : return layer ? layer->id() : QVariant();
283 : : }
284 : :
285 : : case LayerRole:
286 : : {
287 : 0 : if ( isEmpty || additionalIndex >= 0 )
288 : 0 : return QVariant();
289 : :
290 : 0 : return QVariant::fromValue<QgsMapLayer *>( mLayers.value( index.row() - ( mAllowEmpty ? 1 : 0 ) ) );
291 : : }
292 : :
293 : : case EmptyRole:
294 : 0 : return isEmpty;
295 : :
296 : : case AdditionalRole:
297 : 0 : return additionalIndex >= 0;
298 : :
299 : : case Qt::CheckStateRole:
300 : : {
301 : 0 : if ( mItemCheckable )
302 : : {
303 : 0 : if ( isEmpty || additionalIndex >= 0 )
304 : 0 : return QVariant();
305 : :
306 : 0 : QgsMapLayer *layer = mLayers.value( index.row() - ( mAllowEmpty ? 1 : 0 ) );
307 : 0 : return layer ? mLayersChecked[layer->id()] : QVariant();
308 : : }
309 : :
310 : 0 : return QVariant();
311 : : }
312 : :
313 : : case Qt::ToolTipRole:
314 : : {
315 : 0 : QgsMapLayer *layer = mLayers.value( index.row() - ( mAllowEmpty ? 1 : 0 ) );
316 : 0 : if ( layer )
317 : : {
318 : 0 : QStringList parts;
319 : 0 : QString title = layer->title().isEmpty() ? layer->shortName() : layer->title();
320 : 0 : if ( title.isEmpty() )
321 : 0 : title = layer->name();
322 : 0 : title = "<b>" + title + "</b>";
323 : 0 : if ( layer->isSpatial() && layer->crs().isValid() )
324 : : {
325 : 0 : if ( QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( layer ) )
326 : 0 : title = tr( "%1 (%2 - %3)" ).arg( title, QgsWkbTypes::displayString( vl->wkbType() ), layer->crs().authid() );
327 : : else
328 : 0 : title = tr( "%1 (%2) " ).arg( title, layer->crs().authid() );
329 : 0 : }
330 : 0 : parts << title;
331 : :
332 : 0 : if ( !layer->abstract().isEmpty() )
333 : 0 : parts << "<br/>" + layer->abstract().replace( QLatin1String( "\n" ), QLatin1String( "<br/>" ) );
334 : 0 : parts << "<i>" + layer->publicSource() + "</i>";
335 : 0 : return parts.join( QLatin1String( "<br/>" ) );
336 : 0 : }
337 : 0 : return QVariant();
338 : : }
339 : :
340 : : case Qt::DecorationRole:
341 : : {
342 : 0 : if ( isEmpty )
343 : 0 : return mEmptyIcon.isNull() ? QVariant() : mEmptyIcon;
344 : :
345 : 0 : if ( additionalIndex >= 0 )
346 : 0 : return QVariant();
347 : :
348 : 0 : QgsMapLayer *layer = mLayers.value( index.row() - ( mAllowEmpty ? 1 : 0 ) );
349 : 0 : if ( !layer )
350 : 0 : return QVariant();
351 : :
352 : 0 : return iconForLayer( layer );
353 : : }
354 : : }
355 : :
356 : 0 : return QVariant();
357 : 0 : }
358 : :
359 : 0 : QHash<int, QByteArray> QgsMapLayerModel::roleNames() const
360 : : {
361 : 0 : QHash<int, QByteArray> roles = QAbstractItemModel::roleNames();
362 : 0 : roles[LayerIdRole] = "layerId";
363 : 0 : roles[LayerRole] = "layer";
364 : :
365 : 0 : return roles;
366 : 0 : }
367 : :
368 : 0 : Qt::ItemFlags QgsMapLayerModel::flags( const QModelIndex &index ) const
369 : : {
370 : 0 : if ( !index.isValid() )
371 : : {
372 : 0 : if ( mCanReorder )
373 : 0 : return Qt::ItemIsDropEnabled;
374 : : else
375 : 0 : return Qt::ItemFlags();
376 : : }
377 : :
378 : 0 : bool isEmpty = index.row() == 0 && mAllowEmpty;
379 : 0 : int additionalIndex = index.row() - ( mAllowEmpty ? 1 : 0 ) - mLayers.count();
380 : :
381 : 0 : Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
382 : :
383 : 0 : if ( mCanReorder && !isEmpty && additionalIndex < 0 )
384 : : {
385 : 0 : flags |= Qt::ItemIsDragEnabled;
386 : 0 : }
387 : :
388 : 0 : if ( mItemCheckable && !isEmpty && additionalIndex < 0 )
389 : : {
390 : 0 : flags |= Qt::ItemIsUserCheckable;
391 : 0 : }
392 : 0 : return flags;
393 : 0 : }
394 : :
395 : 0 : bool QgsMapLayerModel::insertRows( int row, int count, const QModelIndex &parent )
396 : : {
397 : 0 : if ( parent.isValid() )
398 : 0 : return false;
399 : :
400 : 0 : int offset = 0;
401 : 0 : if ( mAllowEmpty )
402 : 0 : offset++;
403 : :
404 : 0 : beginInsertRows( parent, row, row + count - 1 );
405 : 0 : for ( int i = row; i < row + count; ++i )
406 : 0 : mLayers.insert( i - offset, nullptr );
407 : 0 : endInsertRows();
408 : :
409 : 0 : return true;
410 : 0 : }
411 : :
412 : 0 : bool QgsMapLayerModel::removeRows( int row, int count, const QModelIndex &parent )
413 : : {
414 : 0 : if ( parent.isValid() || row < 0 )
415 : 0 : return false;
416 : :
417 : 0 : int offset = 0;
418 : 0 : if ( mAllowEmpty )
419 : : {
420 : 0 : if ( row == 0 )
421 : 0 : return false;
422 : :
423 : 0 : offset++;
424 : 0 : }
425 : :
426 : 0 : if ( row - offset > mLayers.count() - 1 )
427 : : {
428 : 0 : return false;
429 : : }
430 : :
431 : 0 : beginRemoveRows( parent, row, row + count - 1 );
432 : 0 : for ( int i = 0; i != count; ++i )
433 : 0 : mLayers.removeAt( row - offset );
434 : 0 : endRemoveRows();
435 : :
436 : 0 : return true;
437 : 0 : }
438 : :
439 : 0 : QStringList QgsMapLayerModel::mimeTypes() const
440 : : {
441 : 0 : QStringList types;
442 : 0 : types << QStringLiteral( "application/qgis.layermodeldata" );
443 : 0 : return types;
444 : 0 : }
445 : :
446 : 0 : bool QgsMapLayerModel::canDropMimeData( const QMimeData *data, Qt::DropAction action, int, int, const QModelIndex & ) const
447 : : {
448 : 0 : if ( !mCanReorder || action != Qt::MoveAction || !data->hasFormat( QStringLiteral( "application/qgis.layermodeldata" ) ) )
449 : 0 : return false;
450 : 0 : return true;
451 : 0 : }
452 : :
453 : 0 : QMimeData *QgsMapLayerModel::mimeData( const QModelIndexList &indexes ) const
454 : : {
455 : 0 : std::unique_ptr< QMimeData > mimeData = std::make_unique< QMimeData >();
456 : :
457 : 0 : QByteArray encodedData;
458 : 0 : QDataStream stream( &encodedData, QIODevice::WriteOnly );
459 : 0 : QSet< QString > addedLayers;
460 : :
461 : 0 : for ( const QModelIndex &i : indexes )
462 : : {
463 : 0 : if ( i.isValid() )
464 : : {
465 : 0 : const QString id = data( index( i.row(), 0, i.parent() ), LayerIdRole ).toString();
466 : 0 : if ( !addedLayers.contains( id ) )
467 : : {
468 : 0 : addedLayers.insert( id );
469 : 0 : stream << id;
470 : 0 : }
471 : 0 : }
472 : : }
473 : 0 : mimeData->setData( QStringLiteral( "application/qgis.layermodeldata" ), encodedData );
474 : 0 : return mimeData.release();
475 : 0 : }
476 : :
477 : 0 : bool QgsMapLayerModel::dropMimeData( const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent )
478 : : {
479 : 0 : if ( !canDropMimeData( data, action, row, column, parent ) || row < 0 )
480 : 0 : return false;
481 : :
482 : 0 : if ( action == Qt::IgnoreAction )
483 : 0 : return true;
484 : 0 : else if ( action != Qt::MoveAction )
485 : 0 : return false;
486 : :
487 : 0 : QByteArray encodedData = data->data( QStringLiteral( "application/qgis.layermodeldata" ) );
488 : 0 : QDataStream stream( &encodedData, QIODevice::ReadOnly );
489 : 0 : QStringList newItems;
490 : 0 : int rows = 0;
491 : :
492 : 0 : while ( !stream.atEnd() )
493 : : {
494 : 0 : QString text;
495 : 0 : stream >> text;
496 : 0 : newItems << text;
497 : 0 : ++rows;
498 : 0 : }
499 : :
500 : 0 : insertRows( row, rows, QModelIndex() );
501 : 0 : for ( const QString &text : std::as_const( newItems ) )
502 : : {
503 : 0 : QModelIndex idx = index( row, 0, QModelIndex() );
504 : 0 : setData( idx, text, LayerIdRole );
505 : 0 : row++;
506 : : }
507 : :
508 : 0 : return true;
509 : 0 : }
510 : :
511 : 0 : Qt::DropActions QgsMapLayerModel::supportedDropActions() const
512 : : {
513 : 0 : return Qt::MoveAction;
514 : : }
515 : :
516 : 0 : QIcon QgsMapLayerModel::iconForLayer( QgsMapLayer *layer )
517 : : {
518 : 0 : switch ( layer->type() )
519 : : {
520 : : case QgsMapLayerType::RasterLayer:
521 : : {
522 : 0 : return QgsLayerItem::iconRaster();
523 : : }
524 : :
525 : : case QgsMapLayerType::MeshLayer:
526 : : {
527 : 0 : return QgsLayerItem::iconMesh();
528 : : }
529 : :
530 : : case QgsMapLayerType::VectorTileLayer:
531 : : {
532 : 0 : return QgsLayerItem::iconVectorTile();
533 : : }
534 : :
535 : : case QgsMapLayerType::PointCloudLayer:
536 : : {
537 : 0 : return QgsLayerItem::iconPointCloud();
538 : : }
539 : :
540 : : case QgsMapLayerType::VectorLayer:
541 : : {
542 : 0 : QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( layer );
543 : 0 : if ( !vl )
544 : : {
545 : 0 : return QIcon();
546 : : }
547 : 0 : QgsWkbTypes::GeometryType geomType = vl->geometryType();
548 : 0 : switch ( geomType )
549 : : {
550 : : case QgsWkbTypes::PointGeometry:
551 : : {
552 : 0 : return QgsLayerItem::iconPoint();
553 : : }
554 : : case QgsWkbTypes::PolygonGeometry :
555 : : {
556 : 0 : return QgsLayerItem::iconPolygon();
557 : : }
558 : : case QgsWkbTypes::LineGeometry :
559 : : {
560 : 0 : return QgsLayerItem::iconLine();
561 : : }
562 : : case QgsWkbTypes::NullGeometry :
563 : : {
564 : 0 : return QgsLayerItem::iconTable();
565 : : }
566 : : default:
567 : : {
568 : 0 : return QIcon();
569 : : }
570 : : }
571 : : }
572 : :
573 : : default:
574 : : {
575 : 0 : return QIcon();
576 : : }
577 : : }
578 : 0 : }
579 : :
580 : :
581 : 0 : bool QgsMapLayerModel::setData( const QModelIndex &index, const QVariant &value, int role )
582 : : {
583 : 0 : if ( !index.isValid() )
584 : 0 : return false;
585 : :
586 : 0 : bool isEmpty = index.row() == 0 && mAllowEmpty;
587 : 0 : int additionalIndex = index.row() - ( mAllowEmpty ? 1 : 0 ) - mLayers.count();
588 : :
589 : 0 : switch ( role )
590 : : {
591 : : case Qt::CheckStateRole:
592 : : {
593 : 0 : if ( !isEmpty && additionalIndex < 0 )
594 : : {
595 : 0 : QgsMapLayer *layer = static_cast<QgsMapLayer *>( index.internalPointer() );
596 : 0 : mLayersChecked[layer->id()] = ( Qt::CheckState )value.toInt();
597 : 0 : emit dataChanged( index, index, QVector< int >() << Qt::CheckStateRole );
598 : 0 : return true;
599 : : }
600 : 0 : break;
601 : : }
602 : :
603 : : case LayerIdRole:
604 : 0 : if ( !isEmpty && additionalIndex < 0 )
605 : : {
606 : 0 : mLayers[index.row() - ( mAllowEmpty ? 1 : 0 )] = mProject->mapLayer( value.toString() );
607 : 0 : emit dataChanged( index, index );
608 : 0 : return true;
609 : : }
610 : 0 : break;
611 : : }
612 : :
613 : 0 : return false;
614 : 0 : }
|