QgsCustomLayerOrderWidget::QgsCustomLayerOrderWidget( QgsLayerTreeMapCanvasBridge* bridge, QWidget* parent ) : QWidget( parent ) , mBridge( bridge ) { mModel = new CustomLayerOrderModel( bridge, this ); mView = new QListView( this ); mView->setDragEnabled( true ); mView->setAcceptDrops( true ); mView->setDropIndicatorShown( true ); mView->setSelectionMode( QAbstractItemView::ExtendedSelection ); mView->setDefaultDropAction( Qt::MoveAction ); mView->setModel( mModel ); mChkOverride = new QCheckBox( tr( "Control rendering order" ) ); bridgeHasCustomLayerOrderChanged( bridge->hasCustomLayerOrder() ); connect( mChkOverride, SIGNAL( toggled( bool ) ), bridge, SLOT( setHasCustomLayerOrder( bool ) ) ); connect( bridge, SIGNAL( hasCustomLayerOrderChanged( bool ) ), this, SLOT( bridgeHasCustomLayerOrderChanged( bool ) ) ); connect( bridge, SIGNAL( customLayerOrderChanged( QStringList ) ), this, SLOT( bridgeCustomLayerOrderChanged( QStringList ) ) ); connect( mModel, SIGNAL( rowsInserted( QModelIndex, int, int ) ), this, SLOT( modelUpdated() ) ); connect( mModel, SIGNAL( rowsRemoved( QModelIndex, int, int ) ), this, SLOT( modelUpdated() ) ); connect( bridge->rootGroup(), SIGNAL( visibilityChanged( QgsLayerTreeNode*, Qt::CheckState ) ), this, SLOT( nodeVisibilityChanged( QgsLayerTreeNode*, Qt::CheckState ) ) ); QVBoxLayout* l = new QVBoxLayout; l->setMargin( 0 ); l->addWidget( mView ); l->addWidget( mChkOverride ); setLayout( l ); }
void QgsLayerTree::setCustomLayerOrder( const QList<QgsMapLayer *> &customLayerOrder ) { QgsWeakMapLayerPointerList newOrder = _qgis_listRawToQPointer( customLayerOrder ); if ( newOrder == mCustomLayerOrder ) return; mCustomLayerOrder = newOrder; emit customLayerOrderChanged(); if ( mHasCustomLayerOrder ) emit layerOrderChanged(); }
void QgsLayerTreeMapCanvasBridge::setCustomLayerOrder( const QStringList& order ) { if ( mCustomLayerOrder == order ) return; // verify that the new order is correct QStringList defOrder( defaultLayerOrder() ); QStringList newOrder( order ); QStringList sortedNewOrder( order ); qSort( defOrder ); qSort( sortedNewOrder ); if ( defOrder.size() < sortedNewOrder.size() ) { // might contain bad layers, but also duplicates QSet<QString> ids( defOrder.toSet() ); for ( int i = 0; i < sortedNewOrder.size(); i++ ) { if ( !ids.contains( sortedNewOrder[i] ) ) { newOrder.removeAll( sortedNewOrder[i] ); sortedNewOrder.removeAt( i-- ); } } } if ( defOrder != sortedNewOrder ) return; // must be permutation of the default order mCustomLayerOrder = newOrder; emit customLayerOrderChanged( mCustomLayerOrder ); if ( mHasCustomLayerOrder ) deferredSetCanvasLayers(); }