Navigation Menu

Skip to content

Commit

Permalink
Renamed originalXmlProperties methods and variables
Browse files Browse the repository at this point in the history
  • Loading branch information
elpaso committed Nov 5, 2018
1 parent 9cfb436 commit f856b4c
Show file tree
Hide file tree
Showing 10 changed files with 98 additions and 25 deletions.
4 changes: 2 additions & 2 deletions python/core/auto_generated/layertree/qgslayertreeutils.sip.in
Expand Up @@ -59,9 +59,9 @@ Returns true if any of the layers is modified
Removes layer nodes that refer to invalid layers
%End

static void storeInvalidLayersProperties( QgsLayerTreeGroup *group, const QDomDocument *doc );
static void storeOriginalLayersProperties( QgsLayerTreeGroup *group, const QDomDocument *doc );
%Docstring
Stores in a custom layer node property the layer properties XML information for an invalid layer
Stores in a layer's originalXmlProperties the layer properties information

.. versionadded:: 3.6
%End
Expand Down
18 changes: 18 additions & 0 deletions python/core/auto_generated/qgsmaplayer.sip.in
Expand Up @@ -1237,6 +1237,24 @@ Returns true if the refresh on provider nofification is enabled
.. versionadded:: 3.0
%End

QString originalXmlProperties() const;
%Docstring
Returns the XML properties of the original layer as they were when the layer
was first read from the project file. In case of new layers this is normally empty.

The storage format for the XML is qlr

.. versionadded:: 3.6
%End

void setOriginalXmlProperties( const QString &originalXmlProperties );
%Docstring
Sets the original XML properties for the layer to ``originalXmlProperties``

The storage format for the XML is qlr

.. versionadded:: 3.6
%End

public slots:

Expand Down
28 changes: 17 additions & 11 deletions src/app/qgslayertreeviewbadlayerindicator.cpp
Expand Up @@ -20,6 +20,7 @@
#include "qgslayertreeutils.h"
#include "qgslayertreemodel.h"
#include "qgsvectorlayer.h"
#include "qgsrasterlayer.h"
#include "qgisapp.h"
#include "qgsbrowsermodel.h"
#include "qgsbrowsertreeview.h"
Expand All @@ -40,14 +41,21 @@ void QgsLayerTreeViewBadLayerIndicatorProvider::onIndicatorClicked( const QModel
if ( !QgsLayerTree::isLayer( node ) )
return;

QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( QgsLayerTree::toLayer( node )->layer() );
if ( !vlayer )
// Only raster/vector for now are supported
QgsMapLayer *layer = nullptr;
if ( qobject_cast<QgsVectorLayer *>( QgsLayerTree::toLayer( node )->layer() ) ||
qobject_cast<QgsRasterLayer *>( QgsLayerTree::toLayer( node )->layer() ) )
{
layer = qobject_cast<QgsMapLayer *>( QgsLayerTree::toLayer( node )->layer() );
}
if ( !layer )
return;

// TODO: raster layers

// Get provider type
QString providerType( vlayer->providerType() );
QString providerType( layer->providerType() );
QgsMapLayer::LayerType layerType( layer->type() );

// Builds the dialog to select a new data source
QgsBrowserModel browserModel;
browserModel.initialize();
QDialog dlg;
Expand All @@ -69,8 +77,8 @@ void QgsLayerTreeViewBadLayerIndicatorProvider::onIndicatorClicked( const QModel
{
if ( index.isValid() )
{
const QgsDataItem *item( browserModel.dataItem( index ) );
if ( item->mimeUri().layerType == QStringLiteral( "vector" ) && item->mimeUri().providerKey == providerType )
const QgsLayerItem *item = qobject_cast<QgsLayerItem *>( browserModel.dataItem( index ) );
if ( item && item->mapLayerType() == layerType && item->providerKey() == providerType )
{
return true;
}
Expand All @@ -86,12 +94,11 @@ void QgsLayerTreeViewBadLayerIndicatorProvider::onIndicatorClicked( const QModel
dlg.setLayout( &lay );
if ( dlg.exec() == QDialog::Accepted )
{
// Get selected item(s)
QModelIndex index = browserWidget->currentIndex();
if ( isItemCompatible( index ) )
{
const QgsDataItem *item( browserModel.dataItem( index ) );
vlayer->setDataSource( item->mimeUri().uri, vlayer->name(), item->mimeUri().providerKey, QgsDataProvider::ProviderOptions() );
layer->setDataSource( item->mimeUri().uri, layer->name(), item->mimeUri().providerKey, QgsDataProvider::ProviderOptions() );
}
}
QgsSettings().setValue( QStringLiteral( "/Windows/selectDataSourceDialog/geometry" ), dlg.saveGeometry(), QgsSettings::Section::App );
Expand All @@ -106,8 +113,7 @@ QString QgsLayerTreeViewBadLayerIndicatorProvider::iconName( QgsMapLayer *layer
QString QgsLayerTreeViewBadLayerIndicatorProvider::tooltipText( QgsMapLayer *layer )
{
Q_UNUSED( layer );
// TODO, click here to set a new data source.
return tr( "<b>Bad layer!</b><br>Layer data source could not be found." );
return tr( "<b>Bad layer!</b><br>Layer data source could not be found. Click to set a new data source" );
}

bool QgsLayerTreeViewBadLayerIndicatorProvider::acceptLayer( QgsMapLayer *layer )
Expand Down
5 changes: 4 additions & 1 deletion src/core/layertree/qgslayertreemodellegendnode.cpp
Expand Up @@ -636,10 +636,13 @@ QImage QgsWmsLegendNode::getLegendGraphic() const

QgsRasterLayer *layer = qobject_cast<QgsRasterLayer *>( mLayerNode->layer() );
const QgsLayerTreeModel *mod = model();
if ( ! mod ) return mImage;
if ( ! mod )
return mImage;
const QgsMapSettings *ms = mod->legendFilterMapSettings();

QgsRasterDataProvider *prov = layer->dataProvider();
if ( ! prov )
return mImage;

Q_ASSERT( ! mFetcher );
mFetcher.reset( prov->getLegendGraphicFetcher( ms ) );
Expand Down
6 changes: 3 additions & 3 deletions src/core/layertree/qgslayertreeutils.cpp
Expand Up @@ -306,7 +306,7 @@ void QgsLayerTreeUtils::removeInvalidLayers( QgsLayerTreeGroup *group )
group->removeChildNode( node );
}

void QgsLayerTreeUtils::storeInvalidLayersProperties( QgsLayerTreeGroup *group, const QDomDocument *doc )
void QgsLayerTreeUtils::storeOriginalLayersProperties( QgsLayerTreeGroup *group, const QDomDocument *doc )
{
const QDomNodeList mlNodeList( doc->documentElement()
.firstChildElement( QStringLiteral( "projectlayers" ) )
Expand All @@ -316,7 +316,7 @@ void QgsLayerTreeUtils::storeInvalidLayersProperties( QgsLayerTreeGroup *group,
if ( QgsLayerTree::isLayer( node ) )
{
QgsMapLayer *l( QgsLayerTree::toLayer( node )->layer() );
if ( l && ! l->isValid( ) )
if ( l )
{
for ( int i = 0; i < mlNodeList.count(); i++ )
{
Expand All @@ -332,7 +332,7 @@ void QgsLayerTreeUtils::storeInvalidLayersProperties( QgsLayerTreeGroup *group,
QString str;
QTextStream stream( &str );
document.save( stream, 4 /*indent*/ );
l->setCustomProperty( QStringLiteral( "invalidLayerProperties" ), str );
l->setOriginalXmlProperties( str );
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/core/layertree/qgslayertreeutils.h
Expand Up @@ -63,10 +63,10 @@ class CORE_EXPORT QgsLayerTreeUtils
static void removeInvalidLayers( QgsLayerTreeGroup *group );

/**
* Stores in a custom layer node property the layer properties XML information for an invalid layer
* Stores in a layer's originalXmlProperties the layer properties information
* \since 3.6
*/
static void storeInvalidLayersProperties( QgsLayerTreeGroup *group, const QDomDocument *doc );
static void storeOriginalLayersProperties( QgsLayerTreeGroup *group, const QDomDocument *doc );

//! Remove subtree of embedded groups and replaces it with a custom property embedded-visible-layers
static void replaceChildrenOfEmbeddedGroups( QgsLayerTreeGroup *group );
Expand Down
10 changes: 10 additions & 0 deletions src/core/qgsmaplayer.cpp
Expand Up @@ -1833,6 +1833,16 @@ bool QgsMapLayer::isReadOnly() const
return true;
}

QString QgsMapLayer::originalXmlProperties() const
{
return mOriginalXmlProperties;
}

void QgsMapLayer::setOriginalXmlProperties( const QString &originalXmlProperties )
{
mOriginalXmlProperties = originalXmlProperties;
}

void QgsMapLayer::setProviderType( const QString &providerType )
{
mProviderKey = providerType;
Expand Down
25 changes: 25 additions & 0 deletions src/core/qgsmaplayer.h
Expand Up @@ -1101,6 +1101,24 @@ class CORE_EXPORT QgsMapLayer : public QObject
*/
bool isRefreshOnNotifyEnabled() const { return mIsRefreshOnNofifyEnabled; }

/**
* Returns the XML properties of the original layer as they were when the layer
* was first read from the project file. In case of new layers this is normally empty.
*
* The storage format for the XML is qlr
*
* \since QGIS 3.6
*/
QString originalXmlProperties() const;

/**
* Sets the original XML properties for the layer to \a originalXmlProperties
*
* The storage format for the XML is qlr
*
* \since QGIS 3.6
*/
void setOriginalXmlProperties( const QString &originalXmlProperties );

public slots:

Expand Down Expand Up @@ -1506,6 +1524,13 @@ class CORE_EXPORT QgsMapLayer : public QObject
//! Renderer for 3D views
QgsAbstract3DRenderer *m3DRenderer = nullptr;

/**
* Stores the original XML properties of the layer when loaded from the project
*
* This information can be used to pass through the bad layers or to reset changes on a good layer
*/
QString mOriginalXmlProperties;

};

Q_DECLARE_METATYPE( QgsMapLayer * )
Expand Down
11 changes: 5 additions & 6 deletions src/core/qgsproject.cpp
Expand Up @@ -1292,8 +1292,8 @@ bool QgsProject::readProjectFile( const QString &filename )

// After bad layer handling we might still have invalid layers,
// store them in case the user wanted to handle them later
// or she wanted to pass them through when saving
QgsLayerTreeUtils::storeInvalidLayersProperties( mRootGroup, doc.get() );
// or wanted to pass them through when saving
QgsLayerTreeUtils::storeOriginalLayersProperties( mRootGroup, doc.get() );

mRootGroup->removeCustomProperty( QStringLiteral( "loading" ) );

Expand Down Expand Up @@ -1760,17 +1760,16 @@ bool QgsProject::writeProjectFile( const QString &filename )
maplayerElem = doc->createElement( QStringLiteral( "maplayer" ) );
ml->writeLayerXml( maplayerElem, *doc, context );
}
else if ( ml->customPropertyKeys().contains( QStringLiteral( "invalidLayerProperties" ) ) )
else if ( ! ml->originalXmlProperties().isEmpty() )
{
QDomDocument document;
if ( document.setContent( ml->customProperty( QStringLiteral( "invalidLayerProperties" ) ).toString() ) )
if ( document.setContent( ml->originalXmlProperties() ) )
{
maplayerElem = document.firstChildElement();
maplayerElem.setAttribute( QStringLiteral( "invalidLayerProperties" ), QStringLiteral( "true" ) );
}
else
{
QgsDebugMsg( QStringLiteral( "Could not restore bad layer properties %1 from saved invalidLayerProperties" ).arg( ml->id() ) );
QgsDebugMsg( QStringLiteral( "Could not restore layer properties for layer %1" ).arg( ml->id() ) );
}
}

Expand Down
12 changes: 12 additions & 0 deletions tests/src/python/test_qgsprojectbadlayers.py
Expand Up @@ -59,6 +59,18 @@ def test_project_roundtrip(self):
project_path = os.path.join(temp_dir.path(), 'project.qgs')
self.assertTrue(p.write(project_path))

# Re-load the project, checking for the XML properties
self.assertTrue(p.read(project_path))
vector = list(p.mapLayersByName('lines'))[0]
raster = list(p.mapLayersByName('raster'))[0]
raster_copy = list(p.mapLayersByName('raster_copy'))[0]
self.assertTrue(vector.originalLayerXmlProperties() != '')
self.assertTrue(raster.originalLayerXmlProperties() != '')
self.assertTrue(raster_copy.originalLayerXmlProperties() != '')
# Test setter
raster.setOriginalLayerXmlProperties('pippo')
self.assertEqual(raster.originalLayerXmlProperties(), 'pippo')

# Now create and invalid project:
bad_project_path = os.path.join(temp_dir.path(), 'project_bad.qgs')
with open(project_path, 'r') as infile:
Expand Down

0 comments on commit f856b4c

Please sign in to comment.