21 #include <QVBoxLayout>
36 mModel =
new CustomLayerOrderModel( bridge,
this );
38 mView =
new QListView(
this );
39 mView->setDragEnabled(
true );
40 mView->setAcceptDrops(
true );
41 mView->setDropIndicatorShown(
true );
42 mView->setSelectionMode( QAbstractItemView::ExtendedSelection );
43 mView->setDefaultDropAction( Qt::MoveAction );
45 mView->setModel( mModel );
47 mChkOverride =
new QCheckBox( tr(
"Control rendering order" ) );
54 connect( mModel, &QAbstractItemModel::rowsInserted,
this, &QgsCustomLayerOrderWidget::modelUpdated );
55 connect( mModel, &QAbstractItemModel::rowsRemoved,
this, &QgsCustomLayerOrderWidget::modelUpdated );
59 QVBoxLayout *l =
new QVBoxLayout;
60 l->setContentsMargins( 0, 0, 0, 0 );
61 l->addWidget( mView );
62 l->addWidget( mChkOverride );
66 void QgsCustomLayerOrderWidget::bridgeHasCustomLayerOrderChanged(
bool state )
68 mChkOverride->setChecked( state );
69 mView->setEnabled( state );
72 void QgsCustomLayerOrderWidget::bridgeCustomLayerOrderChanged()
77 void QgsCustomLayerOrderWidget::nodeVisibilityChanged(
QgsLayerTreeNode *node )
85 void QgsCustomLayerOrderWidget::modelUpdated()
95 : QAbstractListModel( parent )
100 int CustomLayerOrderModel::rowCount(
const QModelIndex & )
const
102 return mOrder.count();
105 QVariant CustomLayerOrderModel::data(
const QModelIndex &index,
int role )
const
107 QString
id = mOrder.at( index.row() );
109 if ( role == Qt::DisplayRole )
113 return layer->
name();
116 if ( role == Qt::UserRole + 1 )
123 if ( role == Qt::CheckStateRole )
133 bool CustomLayerOrderModel::setData(
const QModelIndex &index,
const QVariant &value,
int role )
136 if ( role == Qt::CheckStateRole )
138 QString
id = mOrder.at( index.row() );
149 Qt::ItemFlags CustomLayerOrderModel::flags(
const QModelIndex &index )
const
151 if ( !index.isValid() )
152 return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDropEnabled;
153 return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsUserCheckable;
156 Qt::DropActions CustomLayerOrderModel::supportedDropActions()
const
158 return Qt::CopyAction | Qt::MoveAction;
161 QStringList CustomLayerOrderModel::mimeTypes()
const
164 types << QStringLiteral(
"application/qgis.layerorderdata" );
168 QMimeData *CustomLayerOrderModel::mimeData(
const QModelIndexList &indexes )
const
171 const auto constIndexes = indexes;
172 for (
const QModelIndex &index : constIndexes )
173 lst << data( index, Qt::UserRole + 1 ).toString();
175 QMimeData *mimeData =
new QMimeData();
176 mimeData->setData( QStringLiteral(
"application/qgis.layerorderdata" ), lst.join( QLatin1Char(
'\n' ) ).toUtf8() );
180 bool CustomLayerOrderModel::dropMimeData(
const QMimeData *data, Qt::DropAction action,
int row,
int column,
const QModelIndex &parent )
185 if ( action == Qt::IgnoreAction )
188 if ( !data->hasFormat( QStringLiteral(
"application/qgis.layerorderdata" ) ) )
191 QByteArray encodedData = data->data( QStringLiteral(
"application/qgis.layerorderdata" ) );
192 QStringList lst = QString::fromUtf8( encodedData ).split(
'\n' );
195 row = mOrder.count();
197 beginInsertRows( QModelIndex(), row, row + lst.count() - 1 );
198 for (
int i = 0; i < lst.count(); ++i )
199 mOrder.insert( row + i, lst[i] );
205 bool CustomLayerOrderModel::removeRows(
int row,
int count,
const QModelIndex &parent )
211 beginRemoveRows( QModelIndex(), row, row + count - 1 );
212 while ( --count >= 0 )
213 mOrder.removeAt( row );
218 void CustomLayerOrderModel::refreshModel(
const QList<QgsMapLayer *> &order )
220 QStringList orderedIds;
221 const auto constOrder = order;
225 orderedIds.append( layer->
id() );
228 if ( orderedIds != mOrder )
236 void CustomLayerOrderModel::updateLayerVisibility(
const QString &layerId )
238 int row = mOrder.indexOf( layerId );
240 emit dataChanged( index( row ), index( row ) );
Layer tree node points to a map layer.
The QgsLayerTreeMapCanvasBridge class takes care of updates of layer set for QgsMapCanvas from a laye...
QgsLayerTree * rootGroup() const
This class is a base class for nodes in a layer tree.
bool isVisible() const
Returns whether a node is really visible (ie checked and all its ancestors checked as well)
void visibilityChanged(QgsLayerTreeNode *node)
Emitted when check state of a node within the tree has been changed.
void setItemVisibilityChecked(bool checked)
Check or uncheck a node (independently of its ancestors or children)
bool itemVisibilityChecked() const
Returns whether a node is checked (independently of its ancestors or children)
bool hasCustomLayerOrder() const
Determines if the layer order should be derived from the layer tree or if a custom override order sha...
void customLayerOrderChanged()
Emitted when the custom layer order has changed.
QList< QgsMapLayer * > layerOrder() const
The order in which layers will be rendered on the canvas.
void hasCustomLayerOrderChanged(bool hasCustomLayerOrder)
Emitted when the hasCustomLayerOrder flag changes.
static bool isLayer(const QgsLayerTreeNode *node)
Check whether the node is a valid layer node.
static QgsLayerTreeLayer * toLayer(QgsLayerTreeNode *node)
Cast node to a layer.
void setHasCustomLayerOrder(bool hasCustomLayerOrder)
Determines if the layer order should be derived from the layer tree or if a custom override order sha...
void setCustomLayerOrder(const QList< QgsMapLayer * > &customLayerOrder)
The order in which layers will be rendered on the canvas.
Base class for all map layer types.
QString id() const
Returns the layer's unique ID, which is used to access this layer from QgsProject.
static QgsProject * instance()
Returns the QgsProject singleton instance.
Q_INVOKABLE QgsMapLayer * mapLayer(const QString &layerId) const
Retrieve a pointer to a registered layer by layer ID.