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