Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add layer resolver #1589

Merged
merged 2 commits into from
Jan 12, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/core/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ SET(QFIELD_CORE_SRCS
identifytool.cpp
layertreemapcanvasbridge.cpp
layertreemodel.cpp
layerresolver.cpp
legendimageprovider.cpp
linepolygonhighlight.cpp
locatormodelsuperbridge.cpp
Expand Down Expand Up @@ -94,6 +95,7 @@ SET(QFIELD_CORE_HDRS
identifytool.h
layertreemapcanvasbridge.h
layertreemodel.h
layerresolver.h
legendimageprovider.h
linepolygonhighlight.h
locatormodelsuperbridge.h
Expand Down
128 changes: 128 additions & 0 deletions src/core/layerresolver.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
/***************************************************************************
layerresolver.cpp

-------------------
begin : January 2021
copyright : (C) 2011 by Matthias Kuhn
email : matthias@opengis.ch
***************************************************************************/

/***************************************************************************
* *
* 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 "layerresolver.h"
#include <qgsvectorlayerref.h>

LayerResolver::LayerResolver( QObject *parent )
: QObject( parent )
{

}

void LayerResolver::resolve()
{
if ( !mProject )
{
setLayer( nullptr );
return;
}

QgsVectorLayerRef ref { mLayerId,
mLayerName,
mLayerSource,
mLayerProviderName };
setLayer( ref.resolveByIdOrNameOnly( mProject ) );
}

QString LayerResolver::layerId() const
{
return mLayerId;
}

void LayerResolver::setLayerId( const QString &layerId )
{
if ( mLayerId == layerId )
return;

mLayerId = layerId;
resolve();
emit layerIdChanged();
}

QString LayerResolver::layerName() const
{
return mLayerName;
}

void LayerResolver::setLayerName( const QString &layerName )
{
if ( mLayerName == layerName )
return;

mLayerName = layerName;
resolve();
emit layerNameChanged();
}

QString LayerResolver::layerSource() const
{
return mLayerSource;
}

void LayerResolver::setLayerSource( const QString &layerSource )
{
if ( mLayerSource == layerSource )
return;

mLayerSource = layerSource;
emit layerSourceChanged();
}

QString LayerResolver::layerProviderName() const
{
return mLayerProviderName;
}

void LayerResolver::setLayerProviderName( const QString &layerProviderName )
{
if ( mLayerProviderName == layerProviderName )
return;

mLayerProviderName = layerProviderName;
resolve();
emit layerProviderNameChanged();
}

QgsVectorLayer *LayerResolver::currentLayer() const
{
return mLayer;
}

void LayerResolver::setLayer( QgsVectorLayer *layer )
{
if ( mLayer == layer )
return;

mLayer = layer;
emit currentLayerChanged();
}

QgsProject *LayerResolver::project() const
{
return mProject;
}

void LayerResolver::setProject( QgsProject *project )
{
if ( project == mProject )
return;

mProject = project;
resolve();
emit projectChanged();
}
104 changes: 104 additions & 0 deletions src/core/layerresolver.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
/***************************************************************************
layerresolver.h

-------------------
begin : January 2021
copyright : (C) 2011 by Matthias Kuhn
email : matthias@opengis.ch
***************************************************************************/

/***************************************************************************
* *
* 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 LAYERRESOLVER_H
#define LAYERRESOLVER_H

#include <QObject>

class QgsVectorLayer;
class QgsProject;

/**
* Helper class to resolve layers by id, name, source and provider.
*/
class LayerResolver : public QObject
{
Q_OBJECT

/**
* The layer id to resolve
*/
Q_PROPERTY( QString layerId READ layerId WRITE setLayerId NOTIFY layerIdChanged )

/**
* The layer name to resolve
*/
Q_PROPERTY( QString layerName READ layerName WRITE setLayerName NOTIFY layerNameChanged )

/**
* The layer source to resolve
*/
Q_PROPERTY( QString layerSource READ layerSource WRITE setLayerSource NOTIFY layerSourceChanged )

/**
* The layer provider name to resolve
*/
Q_PROPERTY( QString layerProviderName READ layerProviderName WRITE setLayerProviderName NOTIFY layerProviderNameChanged )

/**
* The qgis project from which layers will be acquired
*/
Q_PROPERTY( QgsProject *project READ project WRITE setProject NOTIFY projectChanged )

/**
* Contains the layer after a successful resolving process
*/
Q_PROPERTY( QgsVectorLayer *currentLayer READ currentLayer NOTIFY currentLayerChanged )

public:
explicit LayerResolver( QObject *parent = nullptr );

void resolve();

QString layerId() const;
void setLayerId( const QString &layerId );

QString layerName() const;
void setLayerName( const QString &layerName );

QString layerSource() const;
void setLayerSource( const QString &layerSource );

QString layerProviderName() const;
void setLayerProviderName( const QString &layerProviderName );

QgsVectorLayer *currentLayer() const;

QgsProject *project() const;
void setProject( QgsProject *project );

signals:
void layerIdChanged();
void layerNameChanged();
void layerSourceChanged();
void layerProviderNameChanged();
void currentLayerChanged();
void projectChanged();

private:
void setLayer( QgsVectorLayer *layer );

QString mLayerId;
QString mLayerName;
QString mLayerSource;
QString mLayerProviderName;
QgsProject *mProject = nullptr;
QgsVectorLayer *mLayer = nullptr;
};

#endif // LAYERRESOLVER_H
2 changes: 2 additions & 0 deletions src/core/qgismobileapp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@
#include "bluetoothdevicemodel.h"
#include "gnsspositioninformation.h"
#include "changelogcontents.h"
#include "layerresolver.h"

#define QUOTE(string) _QUOTE(string)
#define _QUOTE(string) #string
Expand Down Expand Up @@ -345,6 +346,7 @@ void QgisMobileapp::initDeclarative()
qmlRegisterType<BluetoothDeviceModel>( "org.qfield", 1, 0, "BluetoothDeviceModel" );
qmlRegisterType<BluetoothReceiver>( "org.qfield", 1, 0, "BluetoothReceiver" );
qmlRegisterType<ChangelogContents>( "org.qfield", 1, 0, "ChangelogContents" );
qmlRegisterType<LayerResolver>( "org.qfield", 1, 0, "LayerResolver" );

qRegisterMetaType<GnssPositionInformation>( "GnssPositionInformation" );

Expand Down
14 changes: 12 additions & 2 deletions src/qml/editorwidgets/ValueRelation.qml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,16 @@ Item {
height: Number(config['AllowMulti']) !== 1 ? valueRelationCombobox.height : valueRelationList.height
enabled: true

LayerResolver {
id: layerResolver

layerId: config['Layer']
layerName: config['LayerName']
layerSource: config['LayerSource']
layerProviderName: config['LayerProviderName']
project: qgisProject
}

RelationCombobox {
id: valueRelationCombobox

Expand All @@ -32,7 +42,7 @@ Item {
attributeField: field
//passing "" instead of undefined, so the model is cleared on adding new features
attributeValue: value !== undefined ? value : ""
currentLayer: qgisProject.mapLayer(config['Layer'])
currentLayer: layerResolver.currentLayer
currentFormFeature: currentFeature
keyField: config['Key']
displayValueField: config['Value']
Expand Down Expand Up @@ -65,7 +75,7 @@ Item {
attributeField: field
//passing "" instead of undefined, so the model is cleared on adding new features
attributeValue: value !== undefined ? value : ""
currentLayer: qgisProject.mapLayer(config['Layer'])
currentLayer: layerResolver.currentLayer
currentFormFeature: currentFeature
keyField: config['Key']
displayValueField: config['Value']
Expand Down