Skip to content

Commit 9eb938c

Browse files
Gustrytimlinux
authored andcommittedDec 15, 2017
add missing metadata fields about contacts and extent (#5878)
1 parent 0c7cf21 commit 9eb938c

File tree

3 files changed

+385
-182
lines changed

3 files changed

+385
-182
lines changed
 

‎src/gui/qgsmetadatawidget.cpp

Lines changed: 131 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include <QInputDialog>
2424
#include <QStringListModel>
2525

26+
#include "qgsbox3d.h"
2627
#include "qgsmetadatawidget.h"
2728
#include "qgslogger.h"
2829
#include "qgslayermetadatavalidator.h"
@@ -36,9 +37,8 @@ QgsMetadataWidget::QgsMetadataWidget( QWidget *parent, QgsMapLayer *layer )
3637
mMetadata = layer->metadata();
3738
tabWidget->setCurrentIndex( 0 );
3839

39-
// Disable the encoding and contacts
40+
// Disable the encoding
4041
encodingFrame->setHidden( true );
41-
tabWidget->removeTab( 5 );
4242

4343
// Default categories, we want them translated, so we are not using a CSV.
4444
mDefaultCategories << tr( "Farming" ) << tr( "Climatology Meteorology Atmosphere" ) << tr( "Location" ) << tr( "Intelligence Military" ) << tr( "Transportation" ) << tr( "Structure" ) << tr( "Boundaries" );
@@ -65,6 +65,11 @@ QgsMetadataWidget::QgsMetadataWidget( QWidget *parent, QgsMapLayer *layer )
6565
tabConstraints->setModel( mConstraintsModel );
6666
tabConstraints->setItemDelegate( new ConstraintItemDelegate( this ) );
6767

68+
// Extent
69+
selectionCrs->setOptionVisible( QgsProjectionSelectionWidget::CrsNotSet, true );
70+
dateTimeFrom->setAllowNull( true );
71+
dateTimeTo->setAllowNull( true );
72+
6873
// Setup the link view
6974
mLinksModel = new QStandardItemModel( tabLinks );
7075
mLinksModel->setColumnCount( 7 );
@@ -90,9 +95,9 @@ QgsMetadataWidget::QgsMetadataWidget( QWidget *parent, QgsMapLayer *layer )
9095
connect( btnAddConstraint, &QPushButton::clicked, this, &QgsMetadataWidget::addConstraint );
9196
connect( btnRemoveConstraint, &QPushButton::clicked, this, &QgsMetadataWidget::removeSelectedConstraint );
9297
connect( btnAutoCrs, &QPushButton::clicked, this, &QgsMetadataWidget::fillCrsFromLayer );
93-
connect( btnAddContact, &QPushButton::clicked, this, &QgsMetadataWidget::addContact );
94-
connect( btnRemoveContact, &QPushButton::clicked, this, &QgsMetadataWidget::removeSelectedContact );
95-
connect( tabContacts, &QTableWidget::itemSelectionChanged, this, &QgsMetadataWidget::updateContactDetails );
98+
connect( selectionCrs, &QgsProjectionSelectionWidget::crsChanged, this, &QgsMetadataWidget::toggleExtentSelector );
99+
connect( btnAddAddress, &QPushButton::clicked, this, &QgsMetadataWidget::addAddress );
100+
connect( btnRemoveAddress, &QPushButton::clicked, this, &QgsMetadataWidget::removeSelectedAddress );
96101
connect( btnAddLink, &QPushButton::clicked, this, &QgsMetadataWidget::addLink );
97102
connect( btnRemoveLink, &QPushButton::clicked, this, &QgsMetadataWidget::removeSelectedLink );
98103
connect( btnAddHistory, &QPushButton::clicked, this, &QgsMetadataWidget::addHistory );
@@ -103,7 +108,6 @@ QgsMetadataWidget::QgsMetadataWidget( QWidget *parent, QgsMapLayer *layer )
103108

104109
fillComboBox();
105110
setPropertiesFromLayer();
106-
updateContactDetails();
107111
}
108112

109113
void QgsMetadataWidget::fillSourceFromLayer() const
@@ -196,56 +200,51 @@ void QgsMetadataWidget::removeSelectedConstraint() const
196200
mConstraintsModel->removeRow( selectedRows[0].row() );
197201
}
198202

199-
void QgsMetadataWidget::fillCrsFromLayer() const
203+
void QgsMetadataWidget::toggleExtentSelector() const
200204
{
201-
selectionCrs->setCrs( mLayer->crs() );
205+
spatialExtentSelector->setEnabled( selectionCrs->crs().isValid() );
206+
spatialExtentSelector->setOutputCrs( selectionCrs->crs() );
202207
}
203208

204-
void QgsMetadataWidget::addContact() const
209+
void QgsMetadataWidget::addAddress() const
205210
{
206-
int row = tabContacts->rowCount();
207-
tabContacts->setRowCount( row + 1 );
211+
int row = tabAddresses->rowCount();
212+
tabAddresses->setRowCount( row + 1 );
208213
QTableWidgetItem *pCell = nullptr;
209214

210-
// Name
211-
pCell = new QTableWidgetItem( QString( tr( "unnamed %1" ) ).arg( row + 1 ) );
212-
tabContacts->setItem( row, 0, pCell );
215+
// Type
216+
pCell = new QTableWidgetItem( QString( tr( "postal" ) ) );
217+
tabAddresses->setItem( row, 0, pCell );
218+
219+
// Address
220+
tabAddresses->setItem( row, 1, new QTableWidgetItem() );
213221

214-
// Organization
215-
pCell = new QTableWidgetItem();
216-
tabContacts->setItem( row, 1, pCell );
222+
// postal code
223+
tabAddresses->setItem( row, 2, new QTableWidgetItem() );
224+
225+
// City
226+
tabAddresses->setItem( row, 3, new QTableWidgetItem() );
227+
228+
// Admin area
229+
tabAddresses->setItem( row, 4, new QTableWidgetItem() );
217230

218-
// Set last item selected
219-
tabContacts->selectRow( row );
231+
// Country
232+
tabAddresses->setItem( row, 5, new QTableWidgetItem() );
220233
}
221234

222-
void QgsMetadataWidget::removeSelectedContact() const
235+
void QgsMetadataWidget::removeSelectedAddress() const
223236
{
224-
QItemSelectionModel *selectionModel = tabContacts->selectionModel();
237+
QItemSelectionModel *selectionModel = tabAddresses->selectionModel();
225238
const QModelIndexList selectedRows = selectionModel->selectedRows();
226239
for ( int i = 0; i < selectedRows.size() ; i++ )
227240
{
228-
tabContacts->model()->removeRow( selectedRows[i].row() );
241+
tabAddresses->model()->removeRow( selectedRows[i].row() );
229242
}
230243
}
231244

232-
void QgsMetadataWidget::updateContactDetails() const
245+
void QgsMetadataWidget::fillCrsFromLayer() const
233246
{
234-
QItemSelectionModel *selectionModel = tabContacts->selectionModel();
235-
const QModelIndexList selectedRows = selectionModel->selectedRows();
236-
237-
if ( ! selectedRows.isEmpty() )
238-
{
239-
panelDetails->setDisabled( false );
240-
lineEditContactName->setText( tabContacts->item( selectedRows[0].row(), 0 )->text() );
241-
lineEditContactOrganization->setText( tabContacts->item( selectedRows[0].row(), 1 )->text() );
242-
}
243-
else
244-
{
245-
panelDetails->setDisabled( true );
246-
lineEditContactName->clear();
247-
lineEditContactOrganization->clear();
248-
}
247+
selectionCrs->setCrs( mLayer->crs() );
249248
}
250249

251250
void QgsMetadataWidget::addLink() const
@@ -414,9 +413,57 @@ void QgsMetadataWidget::setPropertiesFromLayer() const
414413
{
415414
selectionCrs->setCrs( mMetadata.crs() );
416415
}
417-
else
416+
toggleExtentSelector();
417+
418+
// Spatial extent
419+
const QList<QgsLayerMetadata::SpatialExtent> &spatialExtents = mMetadata.extent().spatialExtents();
420+
if ( ! spatialExtents.isEmpty() )
418421
{
419-
selectionCrs->setOptionVisible( QgsProjectionSelectionWidget::CrsNotSet, true );
422+
// Even if it's a list, it's supposed to store the same extent in different CRS.
423+
spatialExtentSelector->setCurrentExtent( spatialExtents.at( 0 ).bounds.toRectangle(), spatialExtents.at( 0 ).extentCrs );
424+
spatialExtentSelector->setOutputCrs( spatialExtents.at( 0 ).extentCrs );
425+
spinBoxZMaximum->setValue( spatialExtents.at( 0 ).bounds.zMaximum() );
426+
spinBoxZMinimum->setValue( spatialExtents.at( 0 ).bounds.zMinimum() );
427+
}
428+
429+
// Temporal extent
430+
const QList<QgsDateTimeRange> &temporalExtents = mMetadata.extent().temporalExtents();
431+
if ( ! temporalExtents.isEmpty() )
432+
{
433+
// Even if it's a list, it seems we use only one for now (cf discussion with Tom)
434+
dateTimeFrom->setDateTime( temporalExtents.at( 0 ).begin() );
435+
dateTimeFrom->setDateTime( temporalExtents.at( 0 ).end() );
436+
}
437+
438+
// Contacts
439+
const QList<QgsLayerMetadata::Contact> &contacts = mMetadata.contacts();
440+
if ( ! contacts.isEmpty() )
441+
{
442+
// Only one contact supported in the UI for now
443+
const QgsLayerMetadata::Contact &contact = contacts.at( 0 );
444+
lineEditContactName->setText( contact.name );
445+
lineEditContactEmail->setText( contact.email );
446+
lineEditContactFax->setText( contact.fax );
447+
lineEditContactOrganization->setText( contact.organization );
448+
lineEditContactPosition->setText( contact.position );
449+
lineEditContactVoice->setText( contact.voice );
450+
if ( comboContactRole->findText( contact.role ) == -1 )
451+
{
452+
comboContactRole->addItem( contact.role );
453+
}
454+
comboContactRole->setCurrentIndex( comboContactRole->findText( contact.role ) );
455+
tabAddresses->setRowCount( 0 );
456+
const QList<QgsLayerMetadata::Address> &addresses = contact.addresses;
457+
for ( const QgsLayerMetadata::Address &address : addresses )
458+
{
459+
int currentRow = tabKeywords->rowCount() - 1;
460+
tabAddresses->item( currentRow, 0 )->setText( address.type );
461+
tabAddresses->item( currentRow, 1 )->setText( address.address );
462+
tabAddresses->item( currentRow, 2 )->setText( address.postalCode );
463+
tabAddresses->item( currentRow, 3 )->setText( address.city );
464+
tabAddresses->item( currentRow, 4 )->setText( address.administrativeArea );
465+
tabAddresses->item( currentRow, 5 )->setText( address.country );
466+
}
420467
}
421468

422469
// Links
@@ -483,6 +530,50 @@ void QgsMetadataWidget::saveMetadata( QgsLayerMetadata &layerMetadata ) const
483530
// CRS
484531
layerMetadata.setCrs( selectionCrs->crs() );
485532

533+
// Extent
534+
struct QgsLayerMetadata::SpatialExtent spatialExtent = QgsLayerMetadata::SpatialExtent();
535+
spatialExtent.bounds = QgsBox3d( spatialExtentSelector->outputExtent() );
536+
spatialExtent.bounds.setZMinimum( spinBoxZMinimum->value() );
537+
spatialExtent.bounds.setZMaximum( spinBoxZMaximum->value() );
538+
spatialExtent.extentCrs = spatialExtentSelector->outputCrs();
539+
QList<QgsLayerMetadata::SpatialExtent> spatialExtents;
540+
spatialExtents.append( spatialExtent );
541+
QList<QgsDateTimeRange> temporalExtents;
542+
temporalExtents.append( QgsDateTimeRange( dateTimeFrom->dateTime(), dateTimeTo->dateTime() ) );
543+
struct QgsLayerMetadata::Extent extent = QgsLayerMetadata::Extent();
544+
extent.setSpatialExtents( spatialExtents );
545+
extent.setTemporalExtents( temporalExtents );
546+
layerMetadata.setExtent( extent );
547+
548+
// Contacts, only one contact supported in the UI for now.
549+
// We don't want to lost data if more than one contact, so we update only the first one.
550+
QList<QgsLayerMetadata::Contact> contacts = mMetadata.contacts();
551+
if ( contacts.size() > 0 )
552+
contacts.removeFirst();
553+
struct QgsLayerMetadata::Contact contact = QgsLayerMetadata::Contact();
554+
contact.email = lineEditContactEmail->text();
555+
contact.position = lineEditContactPosition->text();
556+
contact.fax = lineEditContactFax->text();
557+
contact.voice = lineEditContactVoice->text();
558+
contact.name = lineEditContactName->text();
559+
contact.organization = lineEditContactOrganization->text();
560+
contact.role = comboContactRole->currentText();
561+
QList<QgsLayerMetadata::Address> addresses;
562+
for ( int i = 0; i < tabAddresses->rowCount() ; i++ )
563+
{
564+
struct QgsLayerMetadata::Address address = QgsLayerMetadata::Address();
565+
address.type = tabAddresses->item( i, 0 )->text();
566+
address.address = tabAddresses->item( i, 1 )->text();
567+
address.postalCode = tabAddresses->item( i, 2 )->text();
568+
address.city = tabAddresses->item( i, 3 )->text();
569+
address.administrativeArea = tabAddresses->item( i, 4 )->text();
570+
address.country = tabAddresses->item( i, 5 )->text();
571+
addresses.append( address );
572+
}
573+
contact.addresses = addresses;
574+
contacts.insert( 0, contact );
575+
layerMetadata.setContacts( contacts );
576+
486577
// Links
487578
QList<QgsLayerMetadata::Link> links;
488579
for ( int row = 0; row < mLinksModel->rowCount() ; row++ )

‎src/gui/qgsmetadatawidget.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,13 +101,13 @@ class GUI_EXPORT QgsMetadataWidget : public QWidget, private Ui::QgsMetadataWidg
101101
void removeSelectedRight() const;
102102
void addConstraint() const;
103103
void removeSelectedConstraint() const;
104-
void addContact() const;
105-
void removeSelectedContact() const;
104+
void toggleExtentSelector() const;
105+
void addAddress() const;
106+
void removeSelectedAddress() const;
106107
void addLink() const;
107108
void removeSelectedLink() const;
108109
void addHistory();
109110
void removeSelectedHistory() const;
110-
void updateContactDetails() const;
111111
void fillComboBox() const;
112112
void setPropertiesFromLayer() const;
113113
void syncFromCategoriesTabToKeywordsTab() const;

0 commit comments

Comments
 (0)