QModelIndex QgsLayerTreeModel::parent( const QModelIndex &child ) const { if ( !child.isValid() ) return QModelIndex(); QgsLayerTreeNode *parentNode = 0; QgsLayerTreeNode *n = index2node( child ); if ( !n ) { QgsLayerTreeModelLegendNode* sym = index2legendNode( child ); Q_ASSERT( sym ); parentNode = sym->layerNode(); } else { parentNode = n->parent(); // must not be null } Q_ASSERT( parentNode ); QgsLayerTreeNode* grandParentNode = parentNode->parent(); if ( !grandParentNode ) return QModelIndex(); // root node -> invalid index int row = grandParentNode->children().indexOf( parentNode ); Q_ASSERT( row >= 0 ); return createIndex( row, 0, static_cast<QObject*>( parentNode ) ); }
QModelIndex QgsLayerTreeModel::index( int row, int column, const QModelIndex &parent ) const { if ( column != 0 || row < 0 || row >= rowCount( parent ) ) return QModelIndex(); QgsLayerTreeNode* n = index2node( parent ); if ( !n ) { QgsLayerTreeModelLegendNode* sym = index2legendNode( parent ); Q_ASSERT( sym ); return QModelIndex(); // have no children } if ( !n || column != 0 || row >= rowCount( parent ) ) return QModelIndex(); if ( testFlag( ShowLegend ) && QgsLayerTree::isLayer( n ) ) { QgsLayerTreeLayer* nL = QgsLayerTree::toLayer( n ); Q_ASSERT( mLegendNodes.contains( nL ) ); return createIndex( row, column, static_cast<QObject*>( mLegendNodes[nL].at( row ) ) ); } return createIndex( row, column, static_cast<QObject*>( n->children().at( row ) ) ); }
Qt::ItemFlags QgsLegendModel::flags( const QModelIndex &index ) const { // make the legend nodes selectable even if they are not by default if ( index2legendNode( index ) ) return QgsLayerTreeModel::flags( index ) | Qt::ItemIsSelectable; return QgsLayerTreeModel::flags( index ); }
bool QgsLayerTreeModel::setData( const QModelIndex& index, const QVariant& value, int role ) { QgsLayerTreeModelLegendNode *sym = index2legendNode( index ); if ( sym ) { if ( role == Qt::CheckStateRole && !testFlag( AllowLegendChangeState ) ) return false; bool res = sym->setData( value, role ); if ( res ) emit dataChanged( index, index ); return res; } QgsLayerTreeNode* node = index2node( index ); if ( !node ) return QgsLayerTreeModel::setData( index, value, role ); if ( role == Qt::CheckStateRole ) { if ( !testFlag( AllowNodeChangeVisibility ) ) return false; if ( QgsLayerTree::isLayer( node ) ) { QgsLayerTreeLayer* layer = QgsLayerTree::toLayer( node ); layer->setVisible(( Qt::CheckState )value.toInt() ); return true; } if ( QgsLayerTree::isGroup( node ) ) { QgsLayerTreeGroup* group = QgsLayerTree::toGroup( node ); group->setVisible(( Qt::CheckState )value.toInt() ); return true; } return true; } else if ( role == Qt::EditRole ) { if ( !testFlag( AllowNodeRename ) ) return false; if ( QgsLayerTree::isLayer( node ) ) { QgsLayerTreeLayer* layer = QgsLayerTree::toLayer( node ); layer->setLayerName( value.toString() ); emit dataChanged( index, index ); } else if ( QgsLayerTree::isGroup( node ) ) { QgsLayerTree::toGroup( node )->setName( value.toString() ); emit dataChanged( index, index ); } } return QAbstractItemModel::setData( index, value, role ); }
int QgsLayerTreeModel::rowCount( const QModelIndex &parent ) const { if ( QgsLayerTreeModelLegendNode* nodeLegend = index2legendNode( parent ) ) return legendNodeRowCount( nodeLegend ); QgsLayerTreeNode* n = index2node( parent ); if ( !n ) return 0; if ( QgsLayerTree::isLayer( n ) ) { if ( !testFlag( ShowLegend ) ) return 0; return legendRootRowCount( QgsLayerTree::toLayer( n ) ); } return n->children().count(); }
QModelIndex QgsLayerTreeModel::index( int row, int column, const QModelIndex &parent ) const { if ( column < 0 || column >= columnCount( parent ) || row < 0 || row >= rowCount( parent ) ) return QModelIndex(); if ( QgsLayerTreeModelLegendNode* nodeLegend = index2legendNode( parent ) ) return legendNodeIndex( row, column, nodeLegend ); QgsLayerTreeNode *n = index2node( parent ); if ( !n ) return QModelIndex(); // have no children if ( testFlag( ShowLegend ) && QgsLayerTree::isLayer( n ) ) { return legendRootIndex( row, column, QgsLayerTree::toLayer( n ) ); } return createIndex( row, column, static_cast<QObject*>( n->children().at( row ) ) ); }
QModelIndex QgsLayerTreeModel::parent( const QModelIndex &child ) const { if ( !child.isValid() ) return QModelIndex(); if ( QgsLayerTreeNode *n = index2node( child ) ) { return indexOfParentLayerTreeNode( n->parent() ); // must not be null } else if ( QgsLayerTreeModelLegendNode* legendNode = index2legendNode( child ) ) { return legendParent( legendNode ); } else { Q_ASSERT( false ); // no other node types! return QModelIndex(); } }
Qt::ItemFlags QgsLayerTreeModel::flags( const QModelIndex& index ) const { if ( !index.isValid() ) { Qt::ItemFlags rootFlags = 0; if ( testFlag( AllowNodeReorder ) ) rootFlags |= Qt::ItemIsDropEnabled; return rootFlags; } if ( QgsLayerTreeModelLegendNode* symn = index2legendNode( index ) ) { Qt::ItemFlags f = symn->flags(); if ( !testFlag( AllowLegendChangeState ) ) f &= ~Qt::ItemIsUserCheckable; return f; } Qt::ItemFlags f = Qt::ItemIsEnabled | Qt::ItemIsSelectable; if ( testFlag( AllowNodeRename ) ) f |= Qt::ItemIsEditable; QgsLayerTreeNode* node = index2node( index ); bool isEmbedded = node->customProperty( "embedded" ).toInt(); if ( testFlag( AllowNodeReorder ) ) { // only root embedded nodes can be reordered if ( !isEmbedded || ( isEmbedded && node->parent() && !node->parent()->customProperty( "embedded" ).toInt() ) ) f |= Qt::ItemIsDragEnabled; } if ( testFlag( AllowNodeChangeVisibility ) && ( QgsLayerTree::isLayer( node ) || QgsLayerTree::isGroup( node ) ) ) f |= Qt::ItemIsUserCheckable; if ( testFlag( AllowNodeReorder ) && QgsLayerTree::isGroup( node ) && !isEmbedded ) f |= Qt::ItemIsDropEnabled; return f; }
int QgsLayerTreeModel::rowCount( const QModelIndex &parent ) const { if ( index2legendNode( parent ) ) return 0; // they are leaves QgsLayerTreeNode* n = index2node( parent ); if ( !n ) return 0; if ( QgsLayerTree::isLayer( n ) ) { if ( !testFlag( ShowLegend ) ) return 0; QgsLayerTreeLayer* nL = QgsLayerTree::toLayer( n ); if ( mLegendNodes[nL].count() == 1 && mLegendNodes[nL][0]->isEmbeddedInParent() ) return 0; return mLegendNodes[nL].count(); } return n->children().count(); }
int QgsLayerTreeModel::rowCount( const QModelIndex &parent ) const { if ( index2legendNode( parent ) ) { return 0; // they are leaves } QgsLayerTreeNode* n = index2node( parent ); if ( parent.isValid() && parent.column() != 0 ) return 0; if ( QgsLayerTree::isLayer( n ) ) { QgsLayerTreeLayer* nL = QgsLayerTree::toLayer( n ); if ( mLegendNodes[nL].count() == 1 && mLegendNodes[nL][0]->isEmbeddedInParent() ) return 0; return mLegendNodes[nL].count(); } return n->children().count(); }
QVariant QgsLayerTreeModel::data( const QModelIndex &index, int role ) const { if ( !index.isValid() || index.column() > 1 ) return QVariant(); if ( QgsLayerTreeModelLegendNode* sym = index2legendNode( index ) ) { if ( role == Qt::CheckStateRole && !testFlag( AllowLegendChangeState ) ) return QVariant(); return sym->data( role ); } QgsLayerTreeNode* node = index2node( index ); if ( role == Qt::DisplayRole || role == Qt::EditRole ) { if ( QgsLayerTree::isGroup( node ) ) return QgsLayerTree::toGroup( node )->name(); if ( QgsLayerTree::isLayer( node ) ) { QgsLayerTreeLayer* nodeLayer = QgsLayerTree::toLayer( node ); QString name = nodeLayer->layerName(); if ( nodeLayer->customProperty( "showFeatureCount", 0 ).toInt() && role == Qt::DisplayRole ) { QgsVectorLayer* vlayer = qobject_cast<QgsVectorLayer*>( nodeLayer->layer() ); if ( vlayer && vlayer->pendingFeatureCount() >= 0 ) name += QString( " [%1]" ).arg( vlayer->pendingFeatureCount() ); } return name; } } else if ( role == Qt::DecorationRole && index.column() == 0 ) { if ( QgsLayerTree::isGroup( node ) ) return iconGroup(); if ( QgsLayerTree::isLayer( node ) ) { QgsLayerTreeLayer *nodeLayer = QgsLayerTree::toLayer( node ); QgsMapLayer *layer = nodeLayer->layer(); if ( !layer ) return QVariant(); // icons possibly overriding default icon if ( layer->type() == QgsMapLayer::RasterLayer ) { if ( testFlag( ShowRasterPreviewIcon ) ) { QgsRasterLayer* rlayer = qobject_cast<QgsRasterLayer *>( layer ); return QIcon( rlayer->previewAsPixmap( QSize( 32, 32 ) ) ); } } QgsVectorLayer *vlayer = dynamic_cast<QgsVectorLayer*>( layer ); if ( layer->type() == QgsMapLayer::RasterLayer ) { return QgsLayerItem::iconRaster(); } QIcon icon; // if there's just on legend entry that should be embedded in layer - do that! if ( testFlag( ShowLegend ) && mLegendNodes[nodeLayer].count() == 1 && mLegendNodes[nodeLayer][0]->isEmbeddedInParent() ) { icon = QIcon( qvariant_cast<QPixmap>( mLegendNodes[nodeLayer][0]->data( Qt::DecorationRole ) ) ); } else if ( layer->type() == QgsMapLayer::VectorLayer ) { if ( vlayer->geometryType() == QGis::Point ) icon = QgsLayerItem::iconPoint(); else if ( vlayer->geometryType() == QGis::Line ) icon = QgsLayerItem::iconLine(); else if ( vlayer->geometryType() == QGis::Polygon ) icon = QgsLayerItem::iconPolygon(); else if ( vlayer->geometryType() == QGis::NoGeometry ) icon = QgsLayerItem::iconTable(); else icon = QgsLayerItem::iconDefault(); } if ( vlayer && vlayer->isEditable() ) { QPixmap pixmap( icon.pixmap( 16, 16 ) ); QPainter painter( &pixmap ); painter.drawPixmap( 0, 0, 16, 16, QgsApplication::getThemePixmap( vlayer->isModified() ? "/mIconEditableEdits.png" : "/mIconEditable.png" ) ); painter.end(); icon = QIcon( pixmap ); } return icon; } } else if ( role == Qt::CheckStateRole ) { if ( !testFlag( AllowNodeChangeVisibility ) ) return QVariant(); if ( QgsLayerTree::isLayer( node ) ) { QgsLayerTreeLayer* nodeLayer = QgsLayerTree::toLayer( node ); if ( nodeLayer->layer() && nodeLayer->layer()->type() == QgsMapLayer::VectorLayer ) { if ( qobject_cast<QgsVectorLayer*>( nodeLayer->layer() )->geometryType() == QGis::NoGeometry ) return QVariant(); // do not show checkbox for non-spatial tables } return nodeLayer->isVisible(); } else if ( QgsLayerTree::isGroup( node ) ) { QgsLayerTreeGroup* nodeGroup = QgsLayerTree::toGroup( node ); return nodeGroup->isVisible(); } } else if ( role == Qt::FontRole ) { QFont f( QgsLayerTree::isLayer( node ) ? mFontLayer : ( QgsLayerTree::isGroup( node ) ? mFontGroup : QFont() ) ); if ( node->customProperty( "embedded" ).toInt() ) f.setItalic( true ); if ( index == mCurrentIndex ) f.setUnderline( true ); return f; } else if ( role == Qt::ToolTipRole ) { if ( QgsLayerTree::isLayer( node ) ) { if ( QgsMapLayer* layer = QgsLayerTree::toLayer( node )->layer() ) return layer->publicSource(); } } return QVariant(); }
QVariant QgsLayerTreeModel::data( const QModelIndex &index, int role ) const { if ( !index.isValid() || index.column() > 1 ) return QVariant(); if ( QgsLayerTreeModelLegendNode* sym = index2legendNode( index ) ) return legendNodeData( sym, role ); QgsLayerTreeNode* node = index2node( index ); if ( role == Qt::DisplayRole || role == Qt::EditRole ) { if ( QgsLayerTree::isGroup( node ) ) return QgsLayerTree::toGroup( node )->name(); if ( QgsLayerTree::isLayer( node ) ) { QgsLayerTreeLayer* nodeLayer = QgsLayerTree::toLayer( node ); QString name = nodeLayer->layerName(); if ( nodeLayer->customProperty( "showFeatureCount", 0 ).toInt() && role == Qt::DisplayRole ) { QgsVectorLayer* vlayer = qobject_cast<QgsVectorLayer*>( nodeLayer->layer() ); if ( vlayer && vlayer->featureCount() >= 0 ) name += QString( " [%1]" ).arg( vlayer->featureCount() ); } return name; } } else if ( role == Qt::DecorationRole && index.column() == 0 ) { if ( QgsLayerTree::isGroup( node ) ) return iconGroup(); if ( QgsLayerTree::isLayer( node ) ) { QgsLayerTreeLayer *nodeLayer = QgsLayerTree::toLayer( node ); QgsMapLayer *layer = nodeLayer->layer(); if ( !layer ) return QVariant(); // icons possibly overriding default icon if ( layer->type() == QgsMapLayer::RasterLayer ) { if ( testFlag( ShowRasterPreviewIcon ) ) { QgsRasterLayer* rlayer = qobject_cast<QgsRasterLayer *>( layer ); return QIcon( QPixmap::fromImage( rlayer->previewAsImage( QSize( 32, 32 ) ) ) ); } else { return QgsLayerItem::iconRaster(); } } QgsVectorLayer *vlayer = dynamic_cast<QgsVectorLayer*>( layer ); QIcon icon; // if there's just on legend entry that should be embedded in layer - do that! if ( testFlag( ShowLegend ) && legendEmbeddedInParent( nodeLayer ) ) { icon = legendIconEmbeddedInParent( nodeLayer ); } else if ( vlayer && layer->type() == QgsMapLayer::VectorLayer ) { if ( vlayer->geometryType() == QGis::Point ) icon = QgsLayerItem::iconPoint(); else if ( vlayer->geometryType() == QGis::Line ) icon = QgsLayerItem::iconLine(); else if ( vlayer->geometryType() == QGis::Polygon ) icon = QgsLayerItem::iconPolygon(); else if ( vlayer->geometryType() == QGis::NoGeometry ) icon = QgsLayerItem::iconTable(); else icon = QgsLayerItem::iconDefault(); } if ( vlayer && vlayer->isEditable() ) { QPixmap pixmap( icon.pixmap( 16, 16 ) ); QPainter painter( &pixmap ); painter.drawPixmap( 0, 0, 16, 16, QgsApplication::getThemePixmap( vlayer->isModified() ? "/mIconEditableEdits.png" : "/mIconEditable.png" ) ); painter.end(); icon = QIcon( pixmap ); } return icon; } } else if ( role == Qt::CheckStateRole ) { if ( !testFlag( AllowNodeChangeVisibility ) ) return QVariant(); if ( QgsLayerTree::isLayer( node ) ) { QgsLayerTreeLayer* nodeLayer = QgsLayerTree::toLayer( node ); if ( nodeLayer->layer() && nodeLayer->layer()->type() == QgsMapLayer::VectorLayer ) { if ( qobject_cast<QgsVectorLayer*>( nodeLayer->layer() )->geometryType() == QGis::NoGeometry ) return QVariant(); // do not show checkbox for non-spatial tables } return nodeLayer->isVisible(); } else if ( QgsLayerTree::isGroup( node ) ) { QgsLayerTreeGroup* nodeGroup = QgsLayerTree::toGroup( node ); return nodeGroup->isVisible(); } } else if ( role == Qt::FontRole ) { QFont f( QgsLayerTree::isLayer( node ) ? mFontLayer : ( QgsLayerTree::isGroup( node ) ? mFontGroup : QFont() ) ); if ( node->customProperty( "embedded" ).toInt() ) f.setItalic( true ); if ( index == mCurrentIndex ) f.setUnderline( true ); return f; } else if ( role == Qt::ForegroundRole ) { QBrush brush( Qt::black, Qt::SolidPattern ); if ( QgsLayerTree::isLayer( node ) ) { const QgsMapLayer* layer = QgsLayerTree::toLayer( node )->layer(); if ( layer && !layer->isInScaleRange( mLegendMapViewScale ) ) { brush.setColor( Qt::lightGray ); } } return brush; } else if ( role == Qt::ToolTipRole ) { if ( QgsLayerTree::isLayer( node ) ) { if ( QgsMapLayer* layer = QgsLayerTree::toLayer( node )->layer() ) { QString tooltip = "<b>" + ( layer->title().isEmpty() ? layer->shortName() : layer->title() ) + "</b>"; if ( !layer->abstract().isEmpty() ) tooltip += "<br/>" + layer->abstract().replace( "\n", "<br/>" ); tooltip += "<br/><i>" + layer->publicSource() + "</i>"; return tooltip; } } } return QVariant(); }