mirror of
https://github.com/qgis/QGIS.git
synced 2025-03-01 00:46:20 -05:00
QgsLayerTreeViewIndicatorProvider refactoring
This commit is contained in:
parent
fc53e64ef5
commit
a9a5039789
@ -60,11 +60,12 @@ SET(QGIS_APP_SRCS
|
||||
qgslabelinggui.cpp
|
||||
qgslabelingwidget.cpp
|
||||
qgslayercapabilitiesmodel.cpp
|
||||
qgslayertreeviewindicatorprovider.cpp
|
||||
qgslayertreeviewembeddedindicator.cpp
|
||||
qgslayertreeviewfilterindicator.cpp
|
||||
qgslayertreeviewmemoryindicator.cpp
|
||||
qgslayertreeviewnonremovableindicator.cpp
|
||||
qgslayertreeviewbadlayerindicatorprovider.cpp
|
||||
qgslayertreeviewbadlayerindicator.cpp
|
||||
qgsmapcanvasdockwidget.cpp
|
||||
qgsmaplayerstylecategoriesmodel.cpp
|
||||
qgsmaplayerstyleguiutils.cpp
|
||||
@ -290,11 +291,12 @@ SET (QGIS_APP_MOC_HDRS
|
||||
qgslabelingwidget.h
|
||||
qgslabelpropertydialog.h
|
||||
qgslayercapabilitiesmodel.h
|
||||
qgslayertreeviewindicatorprovider.h
|
||||
qgslayertreeviewembeddedindicator.h
|
||||
qgslayertreeviewmemoryindicator.h
|
||||
qgslayertreeviewfilterindicator.h
|
||||
qgslayertreeviewnonremovableindicator.h
|
||||
qgslayertreeviewbadlayerindicatorprovider.h
|
||||
qgslayertreeviewbadlayerindicator.h
|
||||
qgsmapcanvasdockwidget.h
|
||||
qgsmaplayerstylecategoriesmodel.h
|
||||
qgsmaplayerstyleguiutils.h
|
||||
|
@ -209,7 +209,7 @@ Q_GUI_EXPORT extern int qt_defaultDpiX();
|
||||
#include "qgslayertreeviewembeddedindicator.h"
|
||||
#include "qgslayertreeviewfilterindicator.h"
|
||||
#include "qgslayertreeviewmemoryindicator.h"
|
||||
#include "qgslayertreeviewbadlayerindicatorprovider.h"
|
||||
#include "qgslayertreeviewbadlayerindicator.h"
|
||||
#include "qgslayertreeviewnonremovableindicator.h"
|
||||
#include "qgslayout.h"
|
||||
#include "qgslayoutatlas.h"
|
||||
|
56
src/app/qgslayertreeviewbadlayerindicator.cpp
Normal file
56
src/app/qgslayertreeviewbadlayerindicator.cpp
Normal file
@ -0,0 +1,56 @@
|
||||
/***************************************************************************
|
||||
qgslayertreeviewbadlayerindicatorprovider.cpp - QgsLayerTreeViewBadLayerIndicatorProvider
|
||||
|
||||
---------------------
|
||||
begin : 17.10.2018
|
||||
copyright : (C) 2018 by Alessandro Pasotti
|
||||
email : elpaso@itopen.it
|
||||
***************************************************************************
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
|
||||
#include "qgslayertreeviewbadlayerindicator.h"
|
||||
#include "qgslayertree.h"
|
||||
#include "qgslayertreeview.h"
|
||||
#include "qgslayertreeutils.h"
|
||||
#include "qgslayertreemodel.h"
|
||||
#include "qgsvectorlayer.h"
|
||||
#include "qgisapp.h"
|
||||
|
||||
QgsLayerTreeViewBadLayerIndicatorProvider::QgsLayerTreeViewBadLayerIndicatorProvider( QgsLayerTreeView *view )
|
||||
: QgsLayerTreeViewIndicatorProvider( view )
|
||||
{
|
||||
}
|
||||
|
||||
void QgsLayerTreeViewBadLayerIndicatorProvider::onIndicatorClicked( const QModelIndex &index )
|
||||
{
|
||||
QgsLayerTreeNode *node = mLayerTreeView->layerTreeModel()->index2node( index );
|
||||
if ( !QgsLayerTree::isLayer( node ) )
|
||||
return;
|
||||
|
||||
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( QgsLayerTree::toLayer( node )->layer() );
|
||||
if ( !vlayer )
|
||||
return;
|
||||
|
||||
// TODO: open source select dialog
|
||||
}
|
||||
|
||||
QString QgsLayerTreeViewBadLayerIndicatorProvider::iconName()
|
||||
{
|
||||
return QStringLiteral( "/mIndicatorBadLayer.svg" );
|
||||
}
|
||||
|
||||
QString QgsLayerTreeViewBadLayerIndicatorProvider::tooltipText()
|
||||
{
|
||||
return tr( "<b>Bad layer!</b><br>Layer data source could not be found, click here to set a new data source." );
|
||||
}
|
||||
|
||||
bool QgsLayerTreeViewBadLayerIndicatorProvider::acceptLayer( QgsMapLayer *layer )
|
||||
{
|
||||
return ! layer->isValid();
|
||||
}
|
41
src/app/qgslayertreeviewbadlayerindicator.h
Normal file
41
src/app/qgslayertreeviewbadlayerindicator.h
Normal file
@ -0,0 +1,41 @@
|
||||
/***************************************************************************
|
||||
qgslayertreeviewbadlayerindicatorprovider.h - QgsLayerTreeViewBadLayerIndicatorProvider
|
||||
|
||||
---------------------
|
||||
begin : 17.10.2018
|
||||
copyright : (C) 2018 by Alessandro Pasotti
|
||||
email : elpaso@itopen.it
|
||||
***************************************************************************
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
#ifndef QGSLAYERTREEVIEWBADLAYERINDICATORPROVIDER_H
|
||||
#define QGSLAYERTREEVIEWBADLAYERINDICATORPROVIDER_H
|
||||
|
||||
#include "qgslayertreeviewindicatorprovider.h"
|
||||
|
||||
#include <QObject>
|
||||
|
||||
|
||||
//! Indicators for bad layers
|
||||
class QgsLayerTreeViewBadLayerIndicatorProvider : public QgsLayerTreeViewIndicatorProvider
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit QgsLayerTreeViewBadLayerIndicatorProvider( QgsLayerTreeView *view );
|
||||
|
||||
private slots:
|
||||
void onIndicatorClicked( const QModelIndex &index ) override;
|
||||
|
||||
private:
|
||||
QString iconName() override;
|
||||
QString tooltipText() override;
|
||||
bool acceptLayer( QgsMapLayer *layer ) override;
|
||||
};
|
||||
|
||||
#endif // QGSLAYERTREEVIEWBADLAYERINDICATORPROVIDER_H
|
187
src/app/qgslayertreeviewindicatorprovider.cpp
Normal file
187
src/app/qgslayertreeviewindicatorprovider.cpp
Normal file
@ -0,0 +1,187 @@
|
||||
/***************************************************************************
|
||||
qgslayertreeviewindicatorprovider.cpp - QgsLayerTreeViewIndicatorProvider
|
||||
|
||||
---------------------
|
||||
begin : 17.10.2018
|
||||
copyright : (C) 2018 by ale
|
||||
email : [your-email-here]
|
||||
***************************************************************************
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
#include "qgslayertreeviewindicatorprovider.h"
|
||||
|
||||
#include "qgslayertree.h"
|
||||
#include "qgslayertreemodel.h"
|
||||
#include "qgslayertreeutils.h"
|
||||
#include "qgslayertreeview.h"
|
||||
#include "qgsvectorlayer.h"
|
||||
#include "qgisapp.h"
|
||||
|
||||
QgsLayerTreeViewIndicatorProvider::QgsLayerTreeViewIndicatorProvider( QgsLayerTreeView *view )
|
||||
: QObject( view )
|
||||
, mLayerTreeView( view )
|
||||
{
|
||||
|
||||
QgsLayerTree *tree = mLayerTreeView->layerTreeModel()->rootGroup();
|
||||
onAddedChildren( tree, 0, tree->children().count() - 1 );
|
||||
|
||||
connect( tree, &QgsLayerTree::addedChildren, this, &QgsLayerTreeViewIndicatorProvider::onAddedChildren );
|
||||
connect( tree, &QgsLayerTree::willRemoveChildren, this, &QgsLayerTreeViewIndicatorProvider::onWillRemoveChildren );
|
||||
}
|
||||
|
||||
void QgsLayerTreeViewIndicatorProvider::onAddedChildren( QgsLayerTreeNode *node, int indexFrom, int indexTo )
|
||||
{
|
||||
// recursively populate indicators
|
||||
QList<QgsLayerTreeNode *> children = node->children();
|
||||
for ( int i = indexFrom; i <= indexTo; ++i )
|
||||
{
|
||||
QgsLayerTreeNode *childNode = children[i];
|
||||
|
||||
if ( QgsLayerTree::isGroup( childNode ) )
|
||||
{
|
||||
onAddedChildren( childNode, 0, childNode->children().count() - 1 );
|
||||
}
|
||||
else if ( QgsLayerTree::isLayer( childNode ) )
|
||||
{
|
||||
if ( QgsLayerTreeLayer *layerNode = dynamic_cast< QgsLayerTreeLayer * >( childNode ) )
|
||||
{
|
||||
if ( layerNode->layer() )
|
||||
{
|
||||
connectSignals( layerNode->layer() );
|
||||
addOrRemoveIndicator( childNode, layerNode->layer() );
|
||||
}
|
||||
else
|
||||
{
|
||||
// wait for layer to be loaded (e.g. when loading project, first the tree is loaded, afterwards the references to layers are resolved)
|
||||
connect( layerNode, &QgsLayerTreeLayer::layerLoaded, this, &QgsLayerTreeViewIndicatorProvider::onLayerLoaded );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void QgsLayerTreeViewIndicatorProvider::onWillRemoveChildren( QgsLayerTreeNode *node, int indexFrom, int indexTo )
|
||||
{
|
||||
// recursively call disconnect signals
|
||||
|
||||
QList<QgsLayerTreeNode *> children = node->children();
|
||||
for ( int i = indexFrom; i <= indexTo; ++i )
|
||||
{
|
||||
QgsLayerTreeNode *childNode = children[i];
|
||||
|
||||
if ( QgsLayerTree::isGroup( childNode ) )
|
||||
{
|
||||
onWillRemoveChildren( childNode, 0, childNode->children().count() - 1 );
|
||||
}
|
||||
else if ( QgsLayerTree::isLayer( childNode ) )
|
||||
{
|
||||
QgsLayerTreeLayer *childLayerNode = QgsLayerTree::toLayer( childNode );
|
||||
if ( QgsLayerTreeUtils::countMapLayerInTree( mLayerTreeView->layerTreeModel()->rootGroup(), childLayerNode->layer() ) == 1 )
|
||||
disconnectSignals( childLayerNode->layer() );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void QgsLayerTreeViewIndicatorProvider::onLayerLoaded()
|
||||
{
|
||||
QgsLayerTreeLayer *layerNode = qobject_cast<QgsLayerTreeLayer *>( sender() );
|
||||
if ( !layerNode )
|
||||
return;
|
||||
|
||||
if ( QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( layerNode->layer() ) )
|
||||
{
|
||||
if ( vlayer )
|
||||
{
|
||||
connectSignals( vlayer );
|
||||
addOrRemoveIndicator( layerNode, vlayer );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void QgsLayerTreeViewIndicatorProvider::onLayerChanged()
|
||||
{
|
||||
QgsMapLayer *layer = qobject_cast<QgsMapLayer *>( sender() );
|
||||
if ( !layer )
|
||||
return;
|
||||
|
||||
// walk the tree and find layer node that needs to be updated
|
||||
const QList<QgsLayerTreeLayer *> layerNodes = mLayerTreeView->layerTreeModel()->rootGroup()->findLayers();
|
||||
for ( QgsLayerTreeLayer *node : layerNodes )
|
||||
{
|
||||
if ( node->layer() && node->layer() == layer )
|
||||
{
|
||||
addOrRemoveIndicator( node, layer );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void QgsLayerTreeViewIndicatorProvider::connectSignals(QgsMapLayer* layer)
|
||||
{
|
||||
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( layer );
|
||||
if ( !vlayer )
|
||||
return;
|
||||
connect( vlayer, &QgsVectorLayer::dataSourceChanged, this, &QgsLayerTreeViewIndicatorProvider::onLayerChanged );
|
||||
}
|
||||
|
||||
void QgsLayerTreeViewIndicatorProvider::disconnectSignals(QgsMapLayer* layer)
|
||||
{
|
||||
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( layer );
|
||||
if ( !vlayer )
|
||||
return;
|
||||
disconnect( vlayer, &QgsVectorLayer::dataSourceChanged, this, &QgsLayerTreeViewIndicatorProvider::onLayerChanged );
|
||||
}
|
||||
|
||||
std::unique_ptr< QgsLayerTreeViewIndicator > QgsLayerTreeViewIndicatorProvider::newIndicator()
|
||||
{
|
||||
std::unique_ptr< QgsLayerTreeViewIndicator > indicator = qgis::make_unique< QgsLayerTreeViewIndicator >( this );
|
||||
indicator->setIcon( QgsApplication::getThemeIcon( iconName() ) );
|
||||
indicator->setToolTip( tooltipText() );
|
||||
connect( indicator.get(), &QgsLayerTreeViewIndicator::clicked, this, &QgsLayerTreeViewIndicatorProvider::onIndicatorClicked );
|
||||
mIndicators.insert( indicator.get() );
|
||||
return indicator;
|
||||
}
|
||||
|
||||
void QgsLayerTreeViewIndicatorProvider::addOrRemoveIndicator(QgsLayerTreeNode *node, QgsMapLayer* layer )
|
||||
{
|
||||
|
||||
if ( acceptLayer( layer ) )
|
||||
{
|
||||
const QList<QgsLayerTreeViewIndicator *> nodeIndicators = mLayerTreeView->indicators( node );
|
||||
|
||||
// maybe the indicator exists already
|
||||
for ( QgsLayerTreeViewIndicator *indicator : nodeIndicators )
|
||||
{
|
||||
if ( mIndicators.contains( indicator ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// it does not exist: need to create a new one
|
||||
mLayerTreeView->addIndicator( node, newIndicator().release() );
|
||||
}
|
||||
else
|
||||
{
|
||||
const QList<QgsLayerTreeViewIndicator *> nodeIndicators = mLayerTreeView->indicators( node );
|
||||
|
||||
// there may be existing indicator we need to get rid of
|
||||
for ( QgsLayerTreeViewIndicator *indicator : nodeIndicators )
|
||||
{
|
||||
if ( mIndicators.contains( indicator ) )
|
||||
{
|
||||
mLayerTreeView->removeIndicator( node, indicator );
|
||||
indicator->deleteLater();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// no indicator was there before, nothing to do
|
||||
}
|
||||
}
|
||||
|
79
src/app/qgslayertreeviewindicatorprovider.h
Normal file
79
src/app/qgslayertreeviewindicatorprovider.h
Normal file
@ -0,0 +1,79 @@
|
||||
/***************************************************************************
|
||||
qgslayertreeviewindicatorprovider.h - QgsLayerTreeViewIndicatorProvider
|
||||
|
||||
---------------------
|
||||
begin : 17.10.2018
|
||||
copyright : (C) 2018 by ale
|
||||
email : [your-email-here]
|
||||
***************************************************************************
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
#ifndef QGSLAYERTREEVIEWINDICATORPROVIDER_H
|
||||
#define QGSLAYERTREEVIEWINDICATORPROVIDER_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QSet>
|
||||
#include <memory>
|
||||
|
||||
#include "qgslayertreeviewindicator.h"
|
||||
|
||||
class QgsLayerTreeNode;
|
||||
class QgsLayerTreeView;
|
||||
class QgsMapLayer;
|
||||
|
||||
|
||||
/**
|
||||
* The QgsLayerTreeViewIndicatorProvider class provides an interface for
|
||||
* layer tree indicator providers.
|
||||
*
|
||||
* Subclasses must override:
|
||||
* - iconName()
|
||||
* - tooltipText()
|
||||
* - acceptLayer() filter function to determine whether the indicator must be added for the layer
|
||||
*
|
||||
* Subclasses may override:
|
||||
* - onIndicatorClicked() default implementation does nothing
|
||||
* - connectSignals() default implementation connects vector layers to dataSourceChanged
|
||||
* - disconnectSignals() default implementation disconnects vector layers from dataSourceChanged
|
||||
*/
|
||||
class QgsLayerTreeViewIndicatorProvider : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
|
||||
explicit QgsLayerTreeViewIndicatorProvider( QgsLayerTreeView *view );
|
||||
|
||||
protected slots:
|
||||
//! Connects to signals of layers newly added to the tree
|
||||
virtual void onAddedChildren( QgsLayerTreeNode *node, int indexFrom, int indexTo );
|
||||
//! Disconnects from layers about to be removed from the tree
|
||||
virtual void onWillRemoveChildren( QgsLayerTreeNode *node, int indexFrom, int indexTo );
|
||||
virtual void onLayerLoaded();
|
||||
//! Adds/removes indicator of a layer
|
||||
virtual void onLayerChanged();
|
||||
//! Action on indicator clicked
|
||||
virtual void onIndicatorClicked( const QModelIndex &index ) { Q_UNUSED( index ) }
|
||||
//! Connect signals
|
||||
virtual void connectSignals( QgsMapLayer *layer );
|
||||
//! Disconnect signals
|
||||
virtual void disconnectSignals( QgsMapLayer *layer );
|
||||
|
||||
private:
|
||||
//! Layer filter
|
||||
virtual bool acceptLayer( QgsMapLayer *layer ) = 0;
|
||||
virtual QString iconName() = 0;
|
||||
virtual QString tooltipText() = 0;
|
||||
virtual std::unique_ptr< QgsLayerTreeViewIndicator > newIndicator();
|
||||
virtual void addOrRemoveIndicator( QgsLayerTreeNode *node, QgsMapLayer *layer );
|
||||
|
||||
protected:
|
||||
QgsLayerTreeView *mLayerTreeView = nullptr;
|
||||
QSet<QgsLayerTreeViewIndicator *> mIndicators;
|
||||
};
|
||||
|
||||
#endif // QGSLAYERTREEVIEWINDICATORPROVIDER_H
|
@ -14,115 +14,16 @@
|
||||
***************************************************************************/
|
||||
|
||||
#include "qgslayertreeviewmemoryindicator.h"
|
||||
#include "qgslayertreeview.h"
|
||||
#include "qgslayertree.h"
|
||||
#include "qgslayertreemodel.h"
|
||||
#include "qgslayertreeutils.h"
|
||||
#include "qgslayertreeview.h"
|
||||
#include "qgsvectorlayer.h"
|
||||
#include "qgisapp.h"
|
||||
|
||||
QgsLayerTreeViewMemoryIndicatorProvider::QgsLayerTreeViewMemoryIndicatorProvider( QgsLayerTreeView *view )
|
||||
: QObject( view )
|
||||
, mLayerTreeView( view )
|
||||
: QgsLayerTreeViewIndicatorProvider( view )
|
||||
{
|
||||
mIcon = QgsApplication::getThemeIcon( QStringLiteral( "/mIndicatorMemory.svg" ) );
|
||||
|
||||
QgsLayerTree *tree = mLayerTreeView->layerTreeModel()->rootGroup();
|
||||
onAddedChildren( tree, 0, tree->children().count() - 1 );
|
||||
|
||||
connect( tree, &QgsLayerTree::addedChildren, this, &QgsLayerTreeViewMemoryIndicatorProvider::onAddedChildren );
|
||||
connect( tree, &QgsLayerTree::willRemoveChildren, this, &QgsLayerTreeViewMemoryIndicatorProvider::onWillRemoveChildren );
|
||||
}
|
||||
|
||||
void QgsLayerTreeViewMemoryIndicatorProvider::onAddedChildren( QgsLayerTreeNode *node, int indexFrom, int indexTo )
|
||||
{
|
||||
// recursively populate indicators
|
||||
QList<QgsLayerTreeNode *> children = node->children();
|
||||
for ( int i = indexFrom; i <= indexTo; ++i )
|
||||
{
|
||||
QgsLayerTreeNode *childNode = children[i];
|
||||
|
||||
if ( QgsLayerTree::isGroup( childNode ) )
|
||||
{
|
||||
onAddedChildren( childNode, 0, childNode->children().count() - 1 );
|
||||
}
|
||||
else if ( QgsLayerTree::isLayer( childNode ) )
|
||||
{
|
||||
if ( QgsLayerTreeLayer *layerNode = dynamic_cast< QgsLayerTreeLayer * >( childNode ) )
|
||||
{
|
||||
if ( QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( layerNode->layer() ) )
|
||||
{
|
||||
if ( QgsLayerTreeUtils::countMapLayerInTree( mLayerTreeView->layerTreeModel()->rootGroup(), vlayer ) == 1 )
|
||||
connect( vlayer, &QgsVectorLayer::dataSourceChanged, this, &QgsLayerTreeViewMemoryIndicatorProvider::onDataSourceChanged );
|
||||
addOrRemoveIndicator( childNode, vlayer );
|
||||
}
|
||||
else if ( !layerNode->layer() )
|
||||
{
|
||||
// wait for layer to be loaded (e.g. when loading project, first the tree is loaded, afterwards the references to layers are resolved)
|
||||
connect( layerNode, &QgsLayerTreeLayer::layerLoaded, this, &QgsLayerTreeViewMemoryIndicatorProvider::onLayerLoaded );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void QgsLayerTreeViewMemoryIndicatorProvider::onWillRemoveChildren( QgsLayerTreeNode *node, int indexFrom, int indexTo )
|
||||
{
|
||||
// recursively disconnect from providers' dataChanged() signal
|
||||
|
||||
QList<QgsLayerTreeNode *> children = node->children();
|
||||
for ( int i = indexFrom; i <= indexTo; ++i )
|
||||
{
|
||||
QgsLayerTreeNode *childNode = children[i];
|
||||
|
||||
if ( QgsLayerTree::isGroup( childNode ) )
|
||||
{
|
||||
onWillRemoveChildren( childNode, 0, childNode->children().count() - 1 );
|
||||
}
|
||||
else if ( QgsLayerTree::isLayer( childNode ) )
|
||||
{
|
||||
QgsLayerTreeLayer *childLayerNode = QgsLayerTree::toLayer( childNode );
|
||||
if ( QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( childLayerNode->layer() ) )
|
||||
{
|
||||
if ( QgsLayerTreeUtils::countMapLayerInTree( mLayerTreeView->layerTreeModel()->rootGroup(), childLayerNode->layer() ) == 1 )
|
||||
disconnect( vlayer, &QgsVectorLayer::dataSourceChanged, this, &QgsLayerTreeViewMemoryIndicatorProvider::onDataSourceChanged );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void QgsLayerTreeViewMemoryIndicatorProvider::onLayerLoaded()
|
||||
{
|
||||
QgsLayerTreeLayer *layerNode = qobject_cast<QgsLayerTreeLayer *>( sender() );
|
||||
if ( !layerNode )
|
||||
return;
|
||||
|
||||
if ( QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( layerNode->layer() ) )
|
||||
{
|
||||
if ( vlayer )
|
||||
{
|
||||
connect( vlayer, &QgsVectorLayer::dataSourceChanged, this, &QgsLayerTreeViewMemoryIndicatorProvider::onDataSourceChanged );
|
||||
addOrRemoveIndicator( layerNode, vlayer );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void QgsLayerTreeViewMemoryIndicatorProvider::onDataSourceChanged()
|
||||
{
|
||||
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( sender() );
|
||||
if ( !vlayer )
|
||||
return;
|
||||
|
||||
// walk the tree and find layer node that needs to be updated
|
||||
const QList<QgsLayerTreeLayer *> layerNodes = mLayerTreeView->layerTreeModel()->rootGroup()->findLayers();
|
||||
for ( QgsLayerTreeLayer *node : layerNodes )
|
||||
{
|
||||
if ( node->layer() && node->layer() == vlayer )
|
||||
{
|
||||
addOrRemoveIndicator( node, vlayer );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void QgsLayerTreeViewMemoryIndicatorProvider::onIndicatorClicked( const QModelIndex &index )
|
||||
@ -138,51 +39,22 @@ void QgsLayerTreeViewMemoryIndicatorProvider::onIndicatorClicked( const QModelIn
|
||||
QgisApp::instance()->makeMemoryLayerPermanent( vlayer );
|
||||
}
|
||||
|
||||
std::unique_ptr< QgsLayerTreeViewIndicator > QgsLayerTreeViewMemoryIndicatorProvider::newIndicator()
|
||||
|
||||
bool QgsLayerTreeViewMemoryIndicatorProvider::acceptLayer( QgsMapLayer *layer )
|
||||
{
|
||||
std::unique_ptr< QgsLayerTreeViewIndicator > indicator = qgis::make_unique< QgsLayerTreeViewIndicator >( this );
|
||||
indicator->setIcon( mIcon );
|
||||
indicator->setToolTip( tr( "<b>Temporary scratch layer only!</b><br>Contents will be discarded after closing this project" ) );
|
||||
connect( indicator.get(), &QgsLayerTreeViewIndicator::clicked, this, &QgsLayerTreeViewMemoryIndicatorProvider::onIndicatorClicked );
|
||||
mIndicators.insert( indicator.get() );
|
||||
return indicator;
|
||||
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( layer );
|
||||
if ( !vlayer )
|
||||
return false;
|
||||
return vlayer->dataProvider()->name() == QLatin1String( "memory" );
|
||||
}
|
||||
|
||||
void QgsLayerTreeViewMemoryIndicatorProvider::addOrRemoveIndicator( QgsLayerTreeNode *node, QgsVectorLayer *vlayer )
|
||||
QString QgsLayerTreeViewMemoryIndicatorProvider::iconName()
|
||||
{
|
||||
const bool isMemory = vlayer->dataProvider()->name() == QLatin1String( "memory" );
|
||||
|
||||
if ( isMemory )
|
||||
{
|
||||
const QList<QgsLayerTreeViewIndicator *> nodeIndicators = mLayerTreeView->indicators( node );
|
||||
|
||||
// maybe the indicator exists already
|
||||
for ( QgsLayerTreeViewIndicator *indicator : nodeIndicators )
|
||||
{
|
||||
if ( mIndicators.contains( indicator ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// it does not exist: need to create a new one
|
||||
mLayerTreeView->addIndicator( node, newIndicator().release() );
|
||||
}
|
||||
else
|
||||
{
|
||||
const QList<QgsLayerTreeViewIndicator *> nodeIndicators = mLayerTreeView->indicators( node );
|
||||
|
||||
// there may be existing indicator we need to get rid of
|
||||
for ( QgsLayerTreeViewIndicator *indicator : nodeIndicators )
|
||||
{
|
||||
if ( mIndicators.contains( indicator ) )
|
||||
{
|
||||
mLayerTreeView->removeIndicator( node, indicator );
|
||||
indicator->deleteLater();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// no indicator was there before, nothing to do
|
||||
}
|
||||
return QStringLiteral( "/mIndicatorMemory.svg" );
|
||||
}
|
||||
|
||||
QString QgsLayerTreeViewMemoryIndicatorProvider::tooltipText()
|
||||
{
|
||||
return tr( "<b>Temporary scratch layer only!</b><br>Contents will be discarded after closing this project" );
|
||||
}
|
||||
|
||||
|
@ -16,41 +16,23 @@
|
||||
#ifndef QGSLAYERTREEVIEWMEMORYINDICATOR_H
|
||||
#define QGSLAYERTREEVIEWMEMORYINDICATOR_H
|
||||
|
||||
#include "qgslayertreeviewindicator.h"
|
||||
|
||||
#include <QSet>
|
||||
#include <memory>
|
||||
|
||||
class QgsLayerTreeNode;
|
||||
class QgsLayerTreeView;
|
||||
class QgsVectorLayer;
|
||||
#include "qgslayertreeviewindicatorprovider.h"
|
||||
|
||||
//! Adds indicators showing whether layers are memory layers.
|
||||
class QgsLayerTreeViewMemoryIndicatorProvider : public QObject
|
||||
class QgsLayerTreeViewMemoryIndicatorProvider : public QgsLayerTreeViewIndicatorProvider
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit QgsLayerTreeViewMemoryIndicatorProvider( QgsLayerTreeView *view );
|
||||
|
||||
private slots:
|
||||
//! Connects to signals of layers newly added to the tree
|
||||
void onAddedChildren( QgsLayerTreeNode *node, int indexFrom, int indexTo );
|
||||
//! Disconnects from layers about to be removed from the tree
|
||||
void onWillRemoveChildren( QgsLayerTreeNode *node, int indexFrom, int indexTo );
|
||||
void onLayerLoaded();
|
||||
//! Adds/removes indicator of a layer
|
||||
void onDataSourceChanged();
|
||||
protected slots:
|
||||
|
||||
void onIndicatorClicked( const QModelIndex &index );
|
||||
void onIndicatorClicked( const QModelIndex &index ) override;
|
||||
|
||||
private:
|
||||
std::unique_ptr< QgsLayerTreeViewIndicator > newIndicator();
|
||||
void addOrRemoveIndicator( QgsLayerTreeNode *node, QgsVectorLayer *vlayer );
|
||||
|
||||
private:
|
||||
QgsLayerTreeView *mLayerTreeView = nullptr;
|
||||
QIcon mIcon;
|
||||
QSet<QgsLayerTreeViewIndicator *> mIndicators;
|
||||
bool acceptLayer( QgsMapLayer *layer ) override;
|
||||
QString iconName() override;
|
||||
QString tooltipText() override;
|
||||
};
|
||||
|
||||
#endif // QGSLAYERTREEVIEWMEMORYINDICATOR_H
|
||||
|
Loading…
x
Reference in New Issue
Block a user