QGIS/src/gui/qgsowssourceselect.cpp

774 lines
24 KiB
C++

/***************************************************************************
qgsowssourceselect.cpp - selector for WMS,WFS,WCS
-------------------
begin : 3 April 2005
copyright :
original : (C) 2005 by Brendan Morley email : morb at ozemail dot com dot au
wms search : (C) 2009 Mathias Walker <mwa at sourcepole.ch>, Sourcepole AG
wms-c support : (C) 2010 Juergen E. Fischer < jef at norbit dot de >, norBIT GmbH
generalized : (C) 2012 Radim Blazek, based on qgswmssourceselect.cpp
***************************************************************************/
/***************************************************************************
* *
* 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 "qgis.h" // GEO_EPSG_CRS_ID
#include "qgscontexthelp.h"
#include "qgscoordinatereferencesystem.h"
#include "qgsdatasourceuri.h"
#include "qgsprojectionselectiondialog.h"
#include "qgslogger.h"
#include "qgsmanageconnectionsdialog.h"
#include "qgsmessageviewer.h"
#include "qgsnewhttpconnection.h"
#include "qgstreewidgetitem.h"
#include "qgsproject.h"
#include "qgsproviderregistry.h"
#include "qgsowsconnection.h"
#include "qgsdataprovider.h"
#include "qgsowssourceselect.h"
#include "qgsnetworkaccessmanager.h"
#include "qgsapplication.h"
#include "qgssettings.h"
#include <QButtonGroup>
#include <QFileDialog>
#include <QRadioButton>
#include <QDomDocument>
#include <QHeaderView>
#include <QImageReader>
#include <QInputDialog>
#include <QMap>
#include <QMessageBox>
#include <QPicture>
#include <QUrl>
#include <QValidator>
#include <QNetworkRequest>
#include <QNetworkReply>
QgsOWSSourceSelect::QgsOWSSourceSelect( const QString &service, QWidget *parent, Qt::WindowFlags fl, bool managerMode, bool embeddedMode )
: QDialog( parent, fl )
, mService( service )
, mManagerMode( managerMode )
, mEmbeddedMode( embeddedMode )
, mCurrentTileset( nullptr )
{
setupUi( this );
if ( mEmbeddedMode )
{
mDialogButtonBox->button( QDialogButtonBox::Close )->hide();
}
setWindowTitle( tr( "Add Layer(s) from a %1 Server" ).arg( service ) );
mAddButton = mDialogButtonBox->button( QDialogButtonBox::Apply );
mAddButton->setText( tr( "&Add" ) );
mAddButton->setToolTip( tr( "Add selected layers to map" ) );
mAddButton->setEnabled( false );
clearCrs();
mTileWidthLineEdit->setValidator( new QIntValidator( 0, 9999, this ) );
mTileHeightLineEdit->setValidator( new QIntValidator( 0, 9999, this ) );
mFeatureCountLineEdit->setValidator( new QIntValidator( 0, 9999, this ) );
mCacheComboBox->addItem( tr( "Always cache" ), QNetworkRequest::AlwaysCache );
mCacheComboBox->addItem( tr( "Prefer cache" ), QNetworkRequest::PreferCache );
mCacheComboBox->addItem( tr( "Prefer network" ), QNetworkRequest::PreferNetwork );
mCacheComboBox->addItem( tr( "Always network" ), QNetworkRequest::AlwaysNetwork );
// 'Prefer network' is the default noted in the combobox's tool tip
mCacheComboBox->setCurrentIndex( mCacheComboBox->findData( QNetworkRequest::PreferNetwork ) );
if ( !mManagerMode )
{
connect( mAddButton, &QAbstractButton::clicked, this, &QgsOWSSourceSelect::addClicked );
//set the current project CRS if available
QgsCoordinateReferenceSystem currentRefSys = QgsProject::instance()->crs();
//convert CRS id to epsg
if ( currentRefSys.isValid() )
{
mSelectedCRS = currentRefSys.authid();
}
}
else
{
mTabWidget->removeTab( mTabWidget->indexOf( mLayerOrderTab ) );
mTabWidget->removeTab( mTabWidget->indexOf( mTilesetsTab ) );
mTimeWidget->hide();
mFormatWidget->hide();
mCRSWidget->hide();
mAddButton->hide();
mCacheWidget->hide();
}
// set up the WMS connections we already know about
populateConnectionList();
QgsSettings settings;
QgsDebugMsg( "restoring geometry" );
restoreGeometry( settings.value( QStringLiteral( "Windows/WMSSourceSelect/geometry" ) ).toByteArray() );
}
QgsOWSSourceSelect::~QgsOWSSourceSelect()
{
QgsSettings settings;
QgsDebugMsg( "saving geometry" );
settings.setValue( QStringLiteral( "Windows/WMSSourceSelect/geometry" ), saveGeometry() );
}
void QgsOWSSourceSelect::clearFormats()
{
mFormatComboBox->clear();
mFormatComboBox->setEnabled( false );
}
void QgsOWSSourceSelect::populateFormats()
{
// A server may offer more similar formats, which are mapped
// to the same GDAL format, e.g. GeoTIFF and TIFF
// -> recreate always buttons for all available formats, enable supported
clearFormats();
if ( mProviderFormats.isEmpty() )
{
mProviderFormats = providerFormats();
for ( int i = 0; i < mProviderFormats.size(); i++ )
{
// GDAL mime types may be image/tiff, image/png, ...
mMimeLabelMap.insert( mProviderFormats[i].format, mProviderFormats[i].label );
}
}
// selectedLayersFormats may come in various forms:
// image/tiff, GTiff, GeoTIFF, TIFF, geotiff_int16, geotiff_rgb,
// PNG, GTOPO30, ARCGRID, IMAGEMOSAIC
// and even any string defined in server configuration, for example the
// value used in UMN Mapserver for OUTPUTFORMAT->NAME is used in
// WCS 1.0.0 SupportedFormats/Format
// TODO: It is impossible to cover all possible formats coming from server
// -> enabled all formats, GDAL may be able to open them
QMap<QString, QString> formatsMap;
formatsMap.insert( QStringLiteral( "geotiff" ), QStringLiteral( "tiff" ) );
formatsMap.insert( QStringLiteral( "gtiff" ), QStringLiteral( "tiff" ) );
formatsMap.insert( QStringLiteral( "tiff" ), QStringLiteral( "tiff" ) );
formatsMap.insert( QStringLiteral( "tif" ), QStringLiteral( "tiff" ) );
formatsMap.insert( QStringLiteral( "gif" ), QStringLiteral( "gif" ) );
formatsMap.insert( QStringLiteral( "jpeg" ), QStringLiteral( "jpeg" ) );
formatsMap.insert( QStringLiteral( "jpg" ), QStringLiteral( "jpeg" ) );
formatsMap.insert( QStringLiteral( "png" ), QStringLiteral( "png" ) );
int preferred = -1;
QStringList layersFormats = selectedLayersFormats();
for ( int i = 0; i < layersFormats.size(); i++ )
{
QString format = layersFormats.value( i );
QgsDebugMsg( "server format = " + format );
QString simpleFormat = format.toLower().remove( QStringLiteral( "image/" ) ).remove( QRegExp( "_.*" ) );
QgsDebugMsg( "server simpleFormat = " + simpleFormat );
QString mimeFormat = "image/" + formatsMap.value( simpleFormat );
QgsDebugMsg( "server mimeFormat = " + mimeFormat );
QString label = format;
if ( mMimeLabelMap.contains( mimeFormat ) )
{
if ( format != mMimeLabelMap.value( mimeFormat ) )
{
// Append name of GDAL driver
label += " / " + mMimeLabelMap.value( mimeFormat );
}
if ( simpleFormat.contains( QLatin1String( "tif" ) ) ) // prefer *tif*
{
if ( preferred < 0 || simpleFormat.startsWith( 'g' ) ) // prefer geotiff
{
preferred = i;
}
}
}
else
{
// We cannot always say that the format is not supported by GDAL because
// server can use strange names, but format itself is supported
QgsDebugMsg( QString( "format %1 unknown" ).arg( format ) );
}
mFormatComboBox->insertItem( i, label );
}
// Set preferred
// TODO: all enabled for now, see above
preferred = preferred >= 0 ? preferred : 0;
mFormatComboBox->setCurrentIndex( preferred );
mFormatComboBox->setEnabled( true );
}
void QgsOWSSourceSelect::populateTimes()
{
mTimeComboBox->clear();
mTimeComboBox->insertItems( 0, selectedLayersTimes() );
mTimeComboBox->setEnabled( !selectedLayersTimes().isEmpty() );
}
void QgsOWSSourceSelect::clearTimes()
{
mTimeComboBox->clear();
mTimeComboBox->setEnabled( false );
}
void QgsOWSSourceSelect::populateConnectionList()
{
mConnectionsComboBox->clear();
mConnectionsComboBox->addItems( QgsOwsConnection::connectionList( mService ) );
setConnectionListPosition();
}
void QgsOWSSourceSelect::on_mNewButton_clicked()
{
QgsNewHttpConnection *nc = new QgsNewHttpConnection( this, "/Qgis/connections-" + mService.toLower() + '/' );
if ( nc->exec() )
{
populateConnectionList();
emit connectionsChanged();
}
delete nc;
}
void QgsOWSSourceSelect::on_mEditButton_clicked()
{
QgsNewHttpConnection *nc = new QgsNewHttpConnection( this, "/Qgis/connections-" + mService.toLower() + '/', mConnectionsComboBox->currentText() );
if ( nc->exec() )
{
populateConnectionList();
emit connectionsChanged();
}
delete nc;
}
void QgsOWSSourceSelect::on_mDeleteButton_clicked()
{
QString msg = tr( "Are you sure you want to remove the %1 connection and all associated settings?" )
.arg( mConnectionsComboBox->currentText() );
QMessageBox::StandardButton result = QMessageBox::information( this, tr( "Confirm Delete" ), msg, QMessageBox::Ok | QMessageBox::Cancel );
if ( result == QMessageBox::Ok )
{
QgsOwsConnection::deleteConnection( mService, mConnectionsComboBox->currentText() );
mConnectionsComboBox->removeItem( mConnectionsComboBox->currentIndex() ); // populateConnectionList();
setConnectionListPosition();
emit connectionsChanged();
}
}
void QgsOWSSourceSelect::on_mSaveButton_clicked()
{
QgsManageConnectionsDialog dlg( this, QgsManageConnectionsDialog::Export, QgsManageConnectionsDialog::WCS );
dlg.exec();
}
void QgsOWSSourceSelect::on_mLoadButton_clicked()
{
QString fileName = QFileDialog::getOpenFileName( this, tr( "Load connections" ), QDir::homePath(),
tr( "XML files (*.xml *XML)" ) );
if ( fileName.isEmpty() )
{
return;
}
QgsManageConnectionsDialog dlg( this, QgsManageConnectionsDialog::Import, QgsManageConnectionsDialog::WCS, fileName );
dlg.exec();
populateConnectionList();
emit connectionsChanged();
}
QgsTreeWidgetItem *QgsOWSSourceSelect::createItem(
int id,
const QStringList &names,
QMap<int, QgsTreeWidgetItem *> &items,
int &layerAndStyleCount,
const QMap<int, int> &layerParents,
const QMap<int, QStringList> &layerParentNames )
{
QgsDebugMsg( QString( "id = %1 layerAndStyleCount = %2 names = %3 " ).arg( id ).arg( layerAndStyleCount ).arg( names.join( "," ) ) );
if ( items.contains( id ) )
return items[id];
QgsTreeWidgetItem *item = nullptr;
if ( layerParents.contains( id ) )
{
// it has parent -> create first its parent
int parent = layerParents[ id ];
item = new QgsTreeWidgetItem( createItem( parent, layerParentNames[ parent ], items, layerAndStyleCount, layerParents, layerParentNames ) );
}
else
item = new QgsTreeWidgetItem( mLayersTreeWidget );
item->setText( 0, QString::number( ++layerAndStyleCount ) );
item->setText( 1, names[0].simplified() );
item->setText( 2, names[1].simplified() );
item->setText( 3, names[2].simplified() );
item->setToolTip( 3, "<font color=black>" + names[2].simplified() + "</font>" );
items[ id ] = item;
return item;
}
void QgsOWSSourceSelect::populateLayerList()
{
}
void QgsOWSSourceSelect::on_mConnectButton_clicked()
{
mLayersTreeWidget->clear();
clearFormats();
clearTimes();
clearCrs();
mConnName = mConnectionsComboBox->currentText();
QgsOwsConnection connection( mService, mConnectionsComboBox->currentText() );
mUri = connection.uri();
QApplication::setOverrideCursor( Qt::WaitCursor );
QgsDebugMsg( "call populateLayerList" );
populateLayerList();
QApplication::restoreOverrideCursor();
}
void QgsOWSSourceSelect::addClicked()
{
}
void QgsOWSSourceSelect::enableLayersForCrs( QTreeWidgetItem * )
{
}
void QgsOWSSourceSelect::on_mChangeCRSButton_clicked()
{
QStringList layers;
Q_FOREACH ( QTreeWidgetItem *item, mLayersTreeWidget->selectedItems() )
{
QString layer = item->data( 0, Qt::UserRole + 0 ).toString();
if ( !layer.isEmpty() )
layers << layer;
}
QgsProjectionSelectionDialog *mySelector = new QgsProjectionSelectionDialog( this );
mySelector->setMessage( QString() );
mySelector->setOgcWmsCrsFilter( mSelectedLayersCRSs );
QgsCoordinateReferenceSystem defaultCRS = QgsProject::instance()->crs();
if ( defaultCRS.isValid() )
{
mySelector->setCrs( defaultCRS );
}
if ( !mySelector->exec() )
return;
mSelectedCRS = mySelector->crs().authid();
delete mySelector;
mSelectedCRSLabel->setText( descriptionForAuthId( mSelectedCRS ) );
for ( int i = 0; i < mLayersTreeWidget->topLevelItemCount(); i++ )
{
enableLayersForCrs( mLayersTreeWidget->topLevelItem( i ) );
}
updateButtons();
}
void QgsOWSSourceSelect::on_mLayersTreeWidget_itemSelectionChanged()
{
}
void QgsOWSSourceSelect::populateCrs()
{
clearCrs();
mSelectedLayersCRSs = selectedLayersCrses().toSet();
mCRSLabel->setText( tr( "Coordinate Reference System (%n available)", "crs count", mSelectedLayersCRSs.count() ) + ':' );
mChangeCRSButton->setDisabled( mSelectedLayersCRSs.isEmpty() );
if ( !mSelectedLayersCRSs.isEmpty() )
{
// check whether current CRS is supported
// if not, use one of the available CRS
QString defaultCRS;
QSet<QString>::const_iterator it = mSelectedLayersCRSs.constBegin();
for ( ; it != mSelectedLayersCRSs.constEnd(); ++it )
{
if ( it->compare( mSelectedCRS, Qt::CaseInsensitive ) == 0 )
break;
// save first CRS in case the current CRS is not available
if ( it == mSelectedLayersCRSs.begin() )
defaultCRS = *it;
// prefer value of DEFAULT_GEO_EPSG_CRS_ID if available
if ( *it == GEO_EPSG_CRS_AUTHID )
defaultCRS = *it;
}
if ( it == mSelectedLayersCRSs.end() )
{
// not found
mSelectedCRS = defaultCRS;
}
mSelectedCRSLabel->setText( descriptionForAuthId( mSelectedCRS ) );
mChangeCRSButton->setEnabled( true );
}
QgsDebugMsg( "mSelectedCRS = " + mSelectedCRS );
}
void QgsOWSSourceSelect::clearCrs()
{
mCRSLabel->setText( tr( "Coordinate Reference System" ) + ':' );
mSelectedCRS = QLatin1String( "" );
mSelectedCRSLabel->setText( QLatin1String( "" ) );
mChangeCRSButton->setEnabled( false );
}
void QgsOWSSourceSelect::on_mTilesetsTableWidget_itemClicked( QTableWidgetItem *item )
{
Q_UNUSED( item );
QTableWidgetItem *rowItem = mTilesetsTableWidget->item( mTilesetsTableWidget->currentRow(), 0 );
bool wasSelected = mCurrentTileset == rowItem;
mTilesetsTableWidget->blockSignals( true );
mTilesetsTableWidget->clearSelection();
if ( !wasSelected )
{
QgsDebugMsg( QString( "selecting current row %1" ).arg( mTilesetsTableWidget->currentRow() ) );
mTilesetsTableWidget->selectRow( mTilesetsTableWidget->currentRow() );
mCurrentTileset = rowItem;
}
else
{
mCurrentTileset = nullptr;
}
mTilesetsTableWidget->blockSignals( false );
updateButtons();
}
QString QgsOWSSourceSelect::connName()
{
return mConnName;
}
QString QgsOWSSourceSelect::connectionInfo()
{
return mConnectionInfo;
}
QString QgsOWSSourceSelect::selectedFormat()
{
return selectedLayersFormats().value( mFormatComboBox->currentIndex() );
}
QNetworkRequest::CacheLoadControl QgsOWSSourceSelect::selectedCacheLoadControl()
{
int cache = mCacheComboBox->currentData().toInt();
return static_cast<QNetworkRequest::CacheLoadControl>( cache );
}
QString QgsOWSSourceSelect::selectedCrs()
{
return mSelectedCRS;
}
QString QgsOWSSourceSelect::selectedTime()
{
return mTimeComboBox->currentText();
}
void QgsOWSSourceSelect::setConnectionListPosition()
{
QString toSelect = QgsOwsConnection::selectedConnection( mService );
mConnectionsComboBox->setCurrentIndex( mConnectionsComboBox->findText( toSelect ) );
if ( mConnectionsComboBox->currentIndex() < 0 )
{
if ( toSelect.isNull() )
mConnectionsComboBox->setCurrentIndex( 0 );
else
mConnectionsComboBox->setCurrentIndex( mConnectionsComboBox->count() - 1 );
}
if ( mConnectionsComboBox->count() == 0 )
{
// No connections - disable various buttons
mConnectButton->setEnabled( false );
mEditButton->setEnabled( false );
mDeleteButton->setEnabled( false );
mSaveButton->setEnabled( false );
}
else
{
// Connections - enable various buttons
mConnectButton->setEnabled( true );
mEditButton->setEnabled( true );
mDeleteButton->setEnabled( true );
mSaveButton->setEnabled( true );
}
QgsOwsConnection::setSelectedConnection( mService, mConnectionsComboBox->currentText() );
}
void QgsOWSSourceSelect::showStatusMessage( QString const &message )
{
mStatusLabel->setText( message );
// update the display of this widget
update();
}
void QgsOWSSourceSelect::showError( QString const &title, QString const &format, QString const &error )
{
QgsMessageViewer *mv = new QgsMessageViewer( this );
mv->setWindowTitle( title );
if ( format == QLatin1String( "text/html" ) )
{
mv->setMessageAsHtml( error );
}
else
{
mv->setMessageAsPlainText( tr( "Could not understand the response:\n%1" ).arg( error ) );
}
mv->showMessage( true ); // Is deleted when closed
}
void QgsOWSSourceSelect::on_mConnectionsComboBox_activated( int )
{
// Remember which server was selected.
QgsOwsConnection::setSelectedConnection( mService, mConnectionsComboBox->currentText() );
}
void QgsOWSSourceSelect::on_mAddDefaultButton_clicked()
{
addDefaultServers();
}
QString QgsOWSSourceSelect::descriptionForAuthId( const QString &authId )
{
if ( mCrsNames.contains( authId ) )
return mCrsNames[ authId ];
QgsCoordinateReferenceSystem qgisSrs = QgsCoordinateReferenceSystem::fromOgcWmsCrs( authId );
mCrsNames.insert( authId, qgisSrs.description() );
return qgisSrs.description();
}
void QgsOWSSourceSelect::addDefaultServers()
{
QMap<QString, QString> exampleServers;
exampleServers[QStringLiteral( "DM Solutions GMap" )] = QStringLiteral( "http://www2.dmsolutions.ca/cgi-bin/mswms_gmap" );
exampleServers[QStringLiteral( "Lizardtech server" )] = QStringLiteral( "http://wms.lizardtech.com/lizardtech/iserv/ows" );
// Nice to have the qgis users map, but I'm not sure of the URL at the moment.
// exampleServers["Qgis users map"] = "http://qgis.org/wms.cgi";
QgsSettings settings;
settings.beginGroup( "/Qgis/connections-" + mService.toLower() );
QMap<QString, QString>::const_iterator i = exampleServers.constBegin();
for ( ; i != exampleServers.constEnd(); ++i )
{
// Only do a server if it's name doesn't already exist.
QStringList keys = settings.childGroups();
if ( !keys.contains( i.key() ) )
{
QString path = i.key();
settings.setValue( path + "/url", i.value() );
}
}
settings.endGroup();
populateConnectionList();
QMessageBox::information( this, tr( "WMS proxies" ), "<p>" + tr( "Several WMS servers have "
"been added to the server list. Note that if "
"you access the internet via a web proxy, you will "
"need to set the proxy settings in the QGIS options dialog." ) + "</p>" );
}
void QgsOWSSourceSelect::addWmsListRow( const QDomElement &item, int row )
{
QDomElement title = item.firstChildElement( QStringLiteral( "title" ) );
addWmsListItem( title, row, 0 );
QDomElement description = item.firstChildElement( QStringLiteral( "description" ) );
addWmsListItem( description, row, 1 );
QDomElement link = item.firstChildElement( QStringLiteral( "link" ) );
addWmsListItem( link, row, 2 );
}
void QgsOWSSourceSelect::addWmsListItem( const QDomElement &el, int row, int column )
{
if ( !el.isNull() )
{
QTableWidgetItem *tableItem = new QTableWidgetItem( el.text() );
// TODO: add linebreaks to long tooltips?
tableItem->setToolTip( el.text() );
mSearchTableWidget->setItem( row, column, tableItem );
}
}
void QgsOWSSourceSelect::on_mSearchButton_clicked()
{
// clear results
mSearchTableWidget->clearContents();
mSearchTableWidget->setRowCount( 0 );
// disable Add WMS button
mSearchAddButton->setEnabled( false );
QApplication::setOverrideCursor( Qt::WaitCursor );
QgsSettings settings;
// geopole.org (geopole.ch) 25.4.2012 : 503 Service Unavailable, archive: Recently added 20 Jul 2011
QString mySearchUrl = settings.value( QStringLiteral( "qgis/WMSSearchUrl" ), "http://geopole.org/wms/search?search=%1&type=rss" ).toString();
QUrl url( mySearchUrl.arg( mSearchTermLineEdit->text() ) );
QgsDebugMsg( url.toString() );
QNetworkReply *r = QgsNetworkAccessManager::instance()->get( QNetworkRequest( url ) );
connect( r, &QNetworkReply::finished, this, &QgsOWSSourceSelect::searchFinished );
}
void QgsOWSSourceSelect::searchFinished()
{
QApplication::restoreOverrideCursor();
QNetworkReply *r = qobject_cast<QNetworkReply *>( sender() );
if ( !r )
return;
if ( r->error() == QNetworkReply::NoError )
{
// parse results
QDomDocument doc( QStringLiteral( "RSS" ) );
QByteArray res = r->readAll();
QString error;
int line, column;
if ( doc.setContent( res, &error, &line, &column ) )
{
QDomNodeList list = doc.elementsByTagName( QStringLiteral( "item" ) );
mSearchTableWidget->setRowCount( list.size() );
for ( int i = 0; i < list.size(); i++ )
{
if ( list.item( i ).isElement() )
{
QDomElement item = list.item( i ).toElement();
addWmsListRow( item, i );
}
}
mSearchTableWidget->resizeColumnsToContents();
}
else
{
QgsDebugMsg( "setContent failed" );
showStatusMessage( tr( "parse error at row %1, column %2: %3" ).arg( line ).arg( column ).arg( error ) );
}
}
else
{
showStatusMessage( tr( "network error: %1" ).arg( r->error() ) );
}
r->deleteLater();
}
void QgsOWSSourceSelect::on_mSearchTableWidget_itemSelectionChanged()
{
mSearchAddButton->setEnabled( mSearchTableWidget->currentRow() != -1 );
}
void QgsOWSSourceSelect::on_mLayerUpButton_clicked()
{
QList<QTreeWidgetItem *> selectionList = mLayerOrderTreeWidget->selectedItems();
if ( selectionList.size() < 1 )
{
return;
}
int selectedIndex = mLayerOrderTreeWidget->indexOfTopLevelItem( selectionList[0] );
if ( selectedIndex < 1 )
{
return; //item not existing or already on top
}
QTreeWidgetItem *selectedItem = mLayerOrderTreeWidget->takeTopLevelItem( selectedIndex );
mLayerOrderTreeWidget->insertTopLevelItem( selectedIndex - 1, selectedItem );
mLayerOrderTreeWidget->clearSelection();
selectedItem->setSelected( true );
}
void QgsOWSSourceSelect::on_mLayerDownButton_clicked()
{
QList<QTreeWidgetItem *> selectionList = mLayerOrderTreeWidget->selectedItems();
if ( selectionList.size() < 1 )
{
return;
}
int selectedIndex = mLayerOrderTreeWidget->indexOfTopLevelItem( selectionList[0] );
if ( selectedIndex < 0 || selectedIndex > mLayerOrderTreeWidget->topLevelItemCount() - 2 )
{
return; //item not existing or already at bottom
}
QTreeWidgetItem *selectedItem = mLayerOrderTreeWidget->takeTopLevelItem( selectedIndex );
mLayerOrderTreeWidget->insertTopLevelItem( selectedIndex + 1, selectedItem );
mLayerOrderTreeWidget->clearSelection();
selectedItem->setSelected( true );
}
QList<QgsOWSSourceSelect::SupportedFormat> QgsOWSSourceSelect::providerFormats()
{
return QList<SupportedFormat>();
}
QStringList QgsOWSSourceSelect::selectedLayersFormats()
{
return QStringList();
}
QStringList QgsOWSSourceSelect::selectedLayersCrses()
{
return QStringList();
}
QStringList QgsOWSSourceSelect::selectedLayersTimes()
{
return QStringList();
}
void QgsOWSSourceSelect::updateButtons()
{
}