Skip to content

Commit

Permalink
Merge pull request #31351 from rldhont/server-wms-dimensions
Browse files Browse the repository at this point in the history
Support WMS dimensions in QGIS Server
  • Loading branch information
rldhont committed Sep 18, 2019
2 parents c7aeb4c + 4823054 commit 7a77d90
Show file tree
Hide file tree
Showing 48 changed files with 3,247 additions and 49 deletions.
7 changes: 7 additions & 0 deletions python/core/auto_generated/qgsvectorlayer.sip.in
Expand Up @@ -546,6 +546,13 @@ which is used by the layer, so any changes are immediately applied.
%End


QgsVectorLayerServerProperties *serverProperties();
%Docstring
Returns QGIS Server Properties of the vector layer

.. versionadded:: 3.10
%End

int selectedFeatureCount() const;
%Docstring
Returns the number of features that are selected in this layer.
Expand Down
130 changes: 130 additions & 0 deletions python/core/auto_generated/qgsvectorlayerserverproperties.sip.in
@@ -0,0 +1,130 @@
/************************************************************************
* This file has been generated automatically from *
* *
* src/core/qgsvectorlayerserverproperties.h *
* *
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
************************************************************************/






class QgsVectorLayerServerProperties
{
%Docstring
Manages QGIS Server properties for a vector layer

.. versionadded:: 3.10
%End

%TypeHeaderCode
#include "qgsvectorlayerserverproperties.h"
%End
public:
static const QMetaObject staticMetaObject;

public:

enum PredefinedWmsDimensionName
{
TIME,
ELEVATION
};

struct WmsDimensionInfo
{

enum DefaultDisplay
{
AllValues,
MinValue,
MaxValue,
ReferenceValue,
};

explicit WmsDimensionInfo( const QString &dimName,
const QString &dimFieldName,
const QString &dimEndFieldName = QString(),
const QString &dimUnits = QString(),
const QString &dimUnitSymbol = QString(),
const int &dimDefaultDisplayType = QgsVectorLayerServerProperties::WmsDimensionInfo::AllValues,
const QVariant &dimReferenceValue = QVariant() );
%Docstring
Constructor for WmsDimensionInfo.
%End
QString name;
QString fieldName;
QString endFieldName;
QString units;
QString unitSymbol;
int defaultDisplayType;
QVariant referenceValue;
};

QgsVectorLayerServerProperties( QgsVectorLayer *layer = 0 );
%Docstring
Constructor - Creates a Vector Layer QGIS Server Properties

:param layer: The vector layer
%End

static QMap<int, QString> wmsDimensionDefaultDisplayLabels();
%Docstring
Returns WMS Dimension default display labels

.. versionadded:: 3.10
%End

bool addWmsDimension( const QgsVectorLayerServerProperties::WmsDimensionInfo &wmsDimInfo );
%Docstring
Adds a QGIS Server WMS Dimension

:param wmsDimInfo: QGIS Server WMS Dimension object with, name, field, etc

:return: ``True`` if QGIS Server WMS Dimension has been successfully added

.. versionadded:: 3.10
%End

bool removeWmsDimension( const QString &wmsDimName );
%Docstring
Removes a QGIS Server WMS Dimension

:return: ``True`` if QGIS Server WMS Dimension was found and successfully removed

.. versionadded:: 3.10
%End

const QList<QgsVectorLayerServerProperties::WmsDimensionInfo> wmsDimensions() const;
%Docstring
Returns the QGIS Server WMS Dimension list.

.. versionadded:: 3.10
%End


void writeXml( QDomNode &layer_node, QDomDocument &document ) const;
%Docstring
Saves server properties to xml under the layer node

.. versionadded:: 3.10
%End

void readXml( const QDomNode &layer_node );
%Docstring
Reads server properties from project file.

.. versionadded:: 3.10
%End

};

/************************************************************************
* This file has been generated automatically from *
* *
* src/core/qgsvectorlayerserverproperties.h *
* *
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
************************************************************************/
1 change: 1 addition & 0 deletions python/core/core_auto.sip
Expand Up @@ -410,6 +410,7 @@
%Include auto_generated/qgsvectorlayerjoinbuffer.sip
%Include auto_generated/qgsvectorlayertools.sip
%Include auto_generated/qgsvectorsimplifymethod.sip
%Include auto_generated/qgsvectorlayerserverproperties.sip
%Include auto_generated/qgssettings.sip
%Include auto_generated/annotations/qgsannotation.sip
%Include auto_generated/annotations/qgsannotationmanager.sip
Expand Down
2 changes: 2 additions & 0 deletions src/app/CMakeLists.txt
Expand Up @@ -21,6 +21,7 @@ SET(QGIS_APP_SRCS
qgsaddtaborgroup.cpp
qgsappscreenshots.cpp
qgsjoindialog.cpp
qgswmsdimensiondialog.cpp
qgsannotationwidget.cpp
qgsappsslerrorhandler.cpp
qgsattributeactiondialog.cpp
Expand Down Expand Up @@ -266,6 +267,7 @@ SET (QGIS_APP_MOC_HDRS
qgsappcoordinateoperationhandlers.h
qgsappscreenshots.h
qgsjoindialog.h
qgswmsdimensiondialog.h
qgsaddtaborgroup.h
qgsannotationwidget.h
qgsapplayertreeviewmenuprovider.h
Expand Down
161 changes: 161 additions & 0 deletions src/app/qgsvectorlayerproperties.cpp
Expand Up @@ -22,6 +22,7 @@
#include "qgisapp.h"
#include "qgsactionmanager.h"
#include "qgsjoindialog.h"
#include "qgswmsdimensiondialog.h"
#include "qgsapplication.h"
#include "qgsattributeactiondialog.h"
#include "qgsapplydialog.h"
Expand Down Expand Up @@ -114,6 +115,10 @@ QgsVectorLayerProperties::QgsVectorLayerProperties(
connect( mButtonEditJoin, &QPushButton::clicked, this, &QgsVectorLayerProperties::mButtonEditJoin_clicked );
connect( mJoinTreeWidget, &QTreeWidget::itemDoubleClicked, this, &QgsVectorLayerProperties::mJoinTreeWidget_itemDoubleClicked );
connect( mButtonRemoveJoin, &QPushButton::clicked, this, &QgsVectorLayerProperties::mButtonRemoveJoin_clicked );
connect( mButtonAddWmsDimension, &QPushButton::clicked, this, &QgsVectorLayerProperties::mButtonAddWmsDimension_clicked );
connect( mButtonEditWmsDimension, &QPushButton::clicked, this, &QgsVectorLayerProperties::mButtonEditWmsDimension_clicked );
connect( mWmsDimensionsTreeWidget, &QTreeWidget::itemDoubleClicked, this, &QgsVectorLayerProperties::mWmsDimensionsTreeWidget_itemDoubleClicked );
connect( mButtonRemoveWmsDimension, &QPushButton::clicked, this, &QgsVectorLayerProperties::mButtonRemoveWmsDimension_clicked );
connect( mSimplifyDrawingGroupBox, &QGroupBox::toggled, this, &QgsVectorLayerProperties::mSimplifyDrawingGroupBox_toggled );
connect( buttonBox, &QDialogButtonBox::helpRequested, this, &QgsVectorLayerProperties::showHelp );

Expand Down Expand Up @@ -326,6 +331,13 @@ QgsVectorLayerProperties::QgsVectorLayerProperties(
)
);

//insert existing dimension info
const QList<QgsVectorLayerServerProperties::WmsDimensionInfo> &wmsDims = mLayer->serverProperties()->wmsDimensions();
for ( const QgsVectorLayerServerProperties::WmsDimensionInfo &dim : wmsDims )
{
addWmsDimensionInfoToTreeWidget( dim );
}

QString myStyle = QgsApplication::reportStyleSheet();
myStyle.append( QStringLiteral( "body { margin: 10px; }\n " ) );
teMetadataViewer->clear();
Expand Down Expand Up @@ -1579,6 +1591,155 @@ void QgsVectorLayerProperties::mButtonRemoveJoin_clicked()
}


void QgsVectorLayerProperties::mButtonAddWmsDimension_clicked()
{
if ( !mLayer )
return;

// get wms dimensions name
QStringList alreadyDefinedDimensions;
const QList<QgsVectorLayerServerProperties::WmsDimensionInfo> &dims = mLayer->serverProperties()->wmsDimensions();
for ( const QgsVectorLayerServerProperties::WmsDimensionInfo &dim : dims )
{
alreadyDefinedDimensions << dim.name;
}

QgsWmsDimensionDialog d( mLayer, alreadyDefinedDimensions );
if ( d.exec() == QDialog::Accepted )
{
QgsVectorLayerServerProperties::WmsDimensionInfo info = d.info();
// save dimension
mLayer->serverProperties()->addWmsDimension( info );
addWmsDimensionInfoToTreeWidget( info );
}
}

void QgsVectorLayerProperties::mButtonEditWmsDimension_clicked()
{
QTreeWidgetItem *currentWmsDimensionItem = mWmsDimensionsTreeWidget->currentItem();
mWmsDimensionsTreeWidget_itemDoubleClicked( currentWmsDimensionItem, 0 );
}

void QgsVectorLayerProperties::mWmsDimensionsTreeWidget_itemDoubleClicked( QTreeWidgetItem *item, int )
{
if ( !mLayer || !item )
{
return;
}

QString wmsDimName = item->data( 0, Qt::UserRole ).toString();
const QList<QgsVectorLayerServerProperties::WmsDimensionInfo> &dims = mLayer->serverProperties()->wmsDimensions();
QStringList alreadyDefinedDimensions;
int j = -1;
for ( int i = 0; i < dims.size(); ++i )
{
QString dimName = dims[i].name;
if ( dimName == wmsDimName )
{
j = i;
}
else
{
alreadyDefinedDimensions << dimName;
}
}
if ( j == -1 )
{
return;
}

QgsWmsDimensionDialog d( mLayer, alreadyDefinedDimensions );
d.setWindowTitle( tr( "Edit WMS Dimension" ) );
d.setInfo( dims[j] );

if ( d.exec() == QDialog::Accepted )
{
QgsVectorLayerServerProperties::WmsDimensionInfo info = d.info();

// remove old
mLayer->serverProperties()->removeWmsDimension( wmsDimName );
int idx = mWmsDimensionsTreeWidget->indexOfTopLevelItem( item );
mWmsDimensionsTreeWidget->takeTopLevelItem( idx );

// save new
mLayer->serverProperties()->addWmsDimension( info );
addWmsDimensionInfoToTreeWidget( info, idx );
}
}

void QgsVectorLayerProperties::addWmsDimensionInfoToTreeWidget( const QgsVectorLayerServerProperties::WmsDimensionInfo &wmsDim, const int insertIndex )
{
QTreeWidgetItem *wmsDimensionItem = new QTreeWidgetItem();
wmsDimensionItem->setFlags( Qt::ItemIsEnabled );

wmsDimensionItem->setText( 0, tr( "Dimension" ) );
wmsDimensionItem->setText( 1, wmsDim.name );

QFont f = wmsDimensionItem->font( 0 );
f.setBold( true );
wmsDimensionItem->setFont( 0, f );
wmsDimensionItem->setFont( 1, f );

wmsDimensionItem->setData( 0, Qt::UserRole, wmsDim.name );

QTreeWidgetItem *childWmsDimensionField = new QTreeWidgetItem();
childWmsDimensionField->setText( 0, tr( "Field" ) );
childWmsDimensionField->setText( 1, wmsDim.fieldName );
childWmsDimensionField->setFlags( Qt::ItemIsEnabled );
wmsDimensionItem->addChild( childWmsDimensionField );

QTreeWidgetItem *childWmsDimensionEndField = new QTreeWidgetItem();
childWmsDimensionEndField->setText( 0, tr( "End field" ) );
childWmsDimensionEndField->setText( 1, wmsDim.endFieldName );
childWmsDimensionEndField->setFlags( Qt::ItemIsEnabled );
wmsDimensionItem->addChild( childWmsDimensionEndField );

QTreeWidgetItem *childWmsDimensionUnits = new QTreeWidgetItem();
childWmsDimensionUnits->setText( 0, tr( "Units" ) );
childWmsDimensionUnits->setText( 1, wmsDim.units );
childWmsDimensionUnits->setFlags( Qt::ItemIsEnabled );
wmsDimensionItem->addChild( childWmsDimensionUnits );

QTreeWidgetItem *childWmsDimensionUnitSymbol = new QTreeWidgetItem();
childWmsDimensionUnitSymbol->setText( 0, tr( "Unit symbol" ) );
childWmsDimensionUnitSymbol->setText( 1, wmsDim.unitSymbol );
childWmsDimensionUnitSymbol->setFlags( Qt::ItemIsEnabled );
wmsDimensionItem->addChild( childWmsDimensionUnitSymbol );

QTreeWidgetItem *childWmsDimensionDefaultValue = new QTreeWidgetItem();
childWmsDimensionDefaultValue->setText( 0, tr( "Default display" ) );
childWmsDimensionDefaultValue->setText( 1, QgsVectorLayerServerProperties::wmsDimensionDefaultDisplayLabels()[wmsDim.defaultDisplayType] );
childWmsDimensionDefaultValue->setFlags( Qt::ItemIsEnabled );
wmsDimensionItem->addChild( childWmsDimensionDefaultValue );

QTreeWidgetItem *childWmsDimensionRefValue = new QTreeWidgetItem();
childWmsDimensionRefValue->setText( 0, tr( "Reference value" ) );
childWmsDimensionRefValue->setText( 1, wmsDim.referenceValue.toString() );
childWmsDimensionRefValue->setFlags( Qt::ItemIsEnabled );
wmsDimensionItem->addChild( childWmsDimensionRefValue );

if ( insertIndex >= 0 )
mWmsDimensionsTreeWidget->insertTopLevelItem( insertIndex, wmsDimensionItem );
else
mWmsDimensionsTreeWidget->addTopLevelItem( wmsDimensionItem );

mWmsDimensionsTreeWidget->setCurrentItem( wmsDimensionItem );
mWmsDimensionsTreeWidget->header()->setSectionResizeMode( QHeaderView::ResizeToContents );
}

void QgsVectorLayerProperties::mButtonRemoveWmsDimension_clicked()
{
QTreeWidgetItem *currentWmsDimensionItem = mWmsDimensionsTreeWidget->currentItem();
if ( !mLayer || !currentWmsDimensionItem )
{
return;
}

mLayer->serverProperties()->removeWmsDimension( currentWmsDimensionItem->data( 0, Qt::UserRole ).toString() );
mWmsDimensionsTreeWidget->takeTopLevelItem( mWmsDimensionsTreeWidget->indexOfTopLevelItem( currentWmsDimensionItem ) );
}


void QgsVectorLayerProperties::updateSymbologyPage()
{

Expand Down
9 changes: 9 additions & 0 deletions src/app/qgsvectorlayerproperties.h
Expand Up @@ -25,6 +25,7 @@
#include "qgshelp.h"
#include "qgsmaplayerstylemanager.h"
#include "qgsvectorlayerjoininfo.h"
#include "qgsvectorlayerserverproperties.h"
#include "layertree/qgslayertree.h"
#include "layertree/qgslayertreemodel.h"
#include "layertree/qgslayertreegroup.h"
Expand Down Expand Up @@ -130,6 +131,11 @@ class APP_EXPORT QgsVectorLayerProperties : public QgsOptionsDialogBase, private
void mJoinTreeWidget_itemDoubleClicked( QTreeWidgetItem *item, int column );
void mButtonRemoveJoin_clicked();

void mButtonAddWmsDimension_clicked();
void mButtonEditWmsDimension_clicked();
void mWmsDimensionsTreeWidget_itemDoubleClicked( QTreeWidgetItem *item, int column );
void mButtonRemoveWmsDimension_clicked();

void mSimplifyDrawingGroupBox_toggled( bool checked );

signals:
Expand Down Expand Up @@ -222,6 +228,9 @@ class APP_EXPORT QgsVectorLayerProperties : public QgsOptionsDialogBase, private
//! Adds a new join to mJoinTreeWidget
void addJoinToTreeWidget( const QgsVectorLayerJoinInfo &join, int insertIndex = -1 );

//! Adds a QGIS Server WMS dimension to mWmsDimensionTreeWidget
void addWmsDimensionInfoToTreeWidget( const QgsVectorLayerServerProperties::WmsDimensionInfo &wmsDim, int insertIndex = -1 );

void updateAuxiliaryStoragePage();
void deleteAuxiliaryField( int index );

Expand Down

0 comments on commit 7a77d90

Please sign in to comment.