23
23
#include < QInputDialog>
24
24
#include < QStringListModel>
25
25
26
+ #include " qgsbox3d.h"
26
27
#include " qgsmetadatawidget.h"
27
28
#include " qgslogger.h"
28
29
#include " qgslayermetadatavalidator.h"
@@ -36,9 +37,8 @@ QgsMetadataWidget::QgsMetadataWidget( QWidget *parent, QgsMapLayer *layer )
36
37
mMetadata = layer->metadata ();
37
38
tabWidget->setCurrentIndex ( 0 );
38
39
39
- // Disable the encoding and contacts
40
+ // Disable the encoding
40
41
encodingFrame->setHidden ( true );
41
- tabWidget->removeTab ( 5 );
42
42
43
43
// Default categories, we want them translated, so we are not using a CSV.
44
44
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 )
65
65
tabConstraints->setModel ( mConstraintsModel );
66
66
tabConstraints->setItemDelegate ( new ConstraintItemDelegate ( this ) );
67
67
68
+ // Extent
69
+ selectionCrs->setOptionVisible ( QgsProjectionSelectionWidget::CrsNotSet, true );
70
+ dateTimeFrom->setAllowNull ( true );
71
+ dateTimeTo->setAllowNull ( true );
72
+
68
73
// Setup the link view
69
74
mLinksModel = new QStandardItemModel ( tabLinks );
70
75
mLinksModel ->setColumnCount ( 7 );
@@ -90,9 +95,9 @@ QgsMetadataWidget::QgsMetadataWidget( QWidget *parent, QgsMapLayer *layer )
90
95
connect ( btnAddConstraint, &QPushButton::clicked, this , &QgsMetadataWidget::addConstraint );
91
96
connect ( btnRemoveConstraint, &QPushButton::clicked, this , &QgsMetadataWidget::removeSelectedConstraint );
92
97
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 );
96
101
connect ( btnAddLink, &QPushButton::clicked, this , &QgsMetadataWidget::addLink );
97
102
connect ( btnRemoveLink, &QPushButton::clicked, this , &QgsMetadataWidget::removeSelectedLink );
98
103
connect ( btnAddHistory, &QPushButton::clicked, this , &QgsMetadataWidget::addHistory );
@@ -103,7 +108,6 @@ QgsMetadataWidget::QgsMetadataWidget( QWidget *parent, QgsMapLayer *layer )
103
108
104
109
fillComboBox ();
105
110
setPropertiesFromLayer ();
106
- updateContactDetails ();
107
111
}
108
112
109
113
void QgsMetadataWidget::fillSourceFromLayer () const
@@ -196,56 +200,51 @@ void QgsMetadataWidget::removeSelectedConstraint() const
196
200
mConstraintsModel ->removeRow ( selectedRows[0 ].row () );
197
201
}
198
202
199
- void QgsMetadataWidget::fillCrsFromLayer () const
203
+ void QgsMetadataWidget::toggleExtentSelector () const
200
204
{
201
- selectionCrs->setCrs ( mLayer ->crs () );
205
+ spatialExtentSelector->setEnabled ( selectionCrs->crs ().isValid () );
206
+ spatialExtentSelector->setOutputCrs ( selectionCrs->crs () );
202
207
}
203
208
204
- void QgsMetadataWidget::addContact () const
209
+ void QgsMetadataWidget::addAddress () const
205
210
{
206
- int row = tabContacts ->rowCount ();
207
- tabContacts ->setRowCount ( row + 1 );
211
+ int row = tabAddresses ->rowCount ();
212
+ tabAddresses ->setRowCount ( row + 1 );
208
213
QTableWidgetItem *pCell = nullptr ;
209
214
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 () );
213
221
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 () );
217
230
218
- // Set last item selected
219
- tabContacts-> selectRow ( row );
231
+ // Country
232
+ tabAddresses-> setItem ( row, 5 , new QTableWidgetItem () );
220
233
}
221
234
222
- void QgsMetadataWidget::removeSelectedContact () const
235
+ void QgsMetadataWidget::removeSelectedAddress () const
223
236
{
224
- QItemSelectionModel *selectionModel = tabContacts ->selectionModel ();
237
+ QItemSelectionModel *selectionModel = tabAddresses ->selectionModel ();
225
238
const QModelIndexList selectedRows = selectionModel->selectedRows ();
226
239
for ( int i = 0 ; i < selectedRows.size () ; i++ )
227
240
{
228
- tabContacts ->model ()->removeRow ( selectedRows[i].row () );
241
+ tabAddresses ->model ()->removeRow ( selectedRows[i].row () );
229
242
}
230
243
}
231
244
232
- void QgsMetadataWidget::updateContactDetails () const
245
+ void QgsMetadataWidget::fillCrsFromLayer () const
233
246
{
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 () );
249
248
}
250
249
251
250
void QgsMetadataWidget::addLink () const
@@ -414,9 +413,57 @@ void QgsMetadataWidget::setPropertiesFromLayer() const
414
413
{
415
414
selectionCrs->setCrs ( mMetadata .crs () );
416
415
}
417
- else
416
+ toggleExtentSelector ();
417
+
418
+ // Spatial extent
419
+ const QList<QgsLayerMetadata::SpatialExtent> &spatialExtents = mMetadata .extent ().spatialExtents ();
420
+ if ( ! spatialExtents.isEmpty () )
418
421
{
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
+ }
420
467
}
421
468
422
469
// Links
@@ -483,6 +530,50 @@ void QgsMetadataWidget::saveMetadata( QgsLayerMetadata &layerMetadata ) const
483
530
// CRS
484
531
layerMetadata.setCrs ( selectionCrs->crs () );
485
532
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
+
486
577
// Links
487
578
QList<QgsLayerMetadata::Link> links;
488
579
for ( int row = 0 ; row < mLinksModel ->rowCount () ; row++ )
0 commit comments