30#include <QInputDialog>
33#include <QStringListModel>
35#include "moc_qgsmetadatawidget.cpp"
38 : QWidget( parent ), mLayer( layer )
41 tabWidget->setCurrentIndex( 0 );
44 encodingFrame->setHidden(
true );
46 spinBoxZMinimum->setClearValue( 0 );
47 spinBoxZMaximum->setClearValue( 0 );
50 mDefaultCategories << tr(
"Farming" ) << tr(
"Climatology Meteorology Atmosphere" ) << tr(
"Location" ) << tr(
"Intelligence Military" ) << tr(
"Transportation" ) << tr(
"Structure" ) << tr(
"Boundaries" );
51 mDefaultCategories << tr(
"Inland Waters" ) << tr(
"Planning Cadastre" ) << tr(
"Geoscientific Information" ) << tr(
"Elevation" ) << tr(
"Health" ) << tr(
"Biota" ) << tr(
"Oceans" ) << tr(
"Environment" );
52 mDefaultCategories << tr(
"Utilities Communication" ) << tr(
"Economy" ) << tr(
"Society" ) << tr(
"Imagery Base Maps Earth Cover" );
53 mDefaultCategoriesModel =
new QStringListModel( mDefaultCategories,
this );
54 mDefaultCategoriesModel->sort( 0 );
55 listDefaultCategories->setModel( mDefaultCategoriesModel );
58 mCategoriesModel =
new QStringListModel( listCategories );
59 listCategories->setModel( mCategoriesModel );
62 mRightsModel =
new QStringListModel( listRights );
63 listRights->setModel( mRightsModel );
66 mConstraintsModel =
new QStandardItemModel( tabConstraints );
67 mConstraintsModel->setColumnCount( 2 );
68 QStringList constraintheaders;
69 constraintheaders << tr(
"Type" ) << tr(
"Constraint" );
70 mConstraintsModel->setHorizontalHeaderLabels( constraintheaders );
71 tabConstraints->setModel( mConstraintsModel );
72 tabConstraints->setItemDelegate(
new ConstraintItemDelegate(
this ) );
75 dateTimeFrom->setAllowNull(
true );
76 dateTimeTo->setAllowNull(
true );
79 mLinksModel =
new QStandardItemModel( tabLinks );
80 mLinksModel->setColumnCount( 7 );
81 QStringList headers = QStringList();
82 headers << tr(
"Name" ) << tr(
"Type" ) << tr(
"URL" ) << tr(
"Description" ) << tr(
"Format" ) << tr(
"MIME" ) << tr(
"Size" );
83 mLinksModel->setHorizontalHeaderLabels( headers );
84 tabLinks->setModel( mLinksModel );
85 tabLinks->setItemDelegate(
new LinkItemDelegate(
this ) );
88 mHistoryModel =
new QStringListModel( listHistory );
89 listHistory->setModel( mHistoryModel );
93 mCreationDateTimeEdit,
94 mCreationDateTimeEdit2,
95 mPublishedDateTimeEdit,
97 mSupersededDateTimeEdit
100 w->setAllowNull(
true );
101 w->setNullRepresentation( tr(
"Not set" ) );
105 connect( tabWidget, &QTabWidget::currentChanged,
this, &QgsMetadataWidget::updatePanel );
106 connect( btnAutoSource, &QPushButton::clicked,
this, &QgsMetadataWidget::fillSourceFromLayer );
107 connect( btnAddVocabulary, &QPushButton::clicked,
this, &QgsMetadataWidget::addVocabulary );
108 connect( btnRemoveVocabulary, &QPushButton::clicked,
this, &QgsMetadataWidget::removeSelectedVocabulary );
109 connect( btnAddRight, &QPushButton::clicked,
this, &QgsMetadataWidget::addRight );
110 connect( btnRemoveRight, &QPushButton::clicked,
this, &QgsMetadataWidget::removeSelectedRight );
111 connect( btnAddLicence, &QPushButton::clicked,
this, &QgsMetadataWidget::addLicence );
112 connect( btnRemoveLicence, &QPushButton::clicked,
this, &QgsMetadataWidget::removeSelectedLicence );
113 connect( btnAddConstraint, &QPushButton::clicked,
this, &QgsMetadataWidget::addConstraint );
114 connect( btnRemoveConstraint, &QPushButton::clicked,
this, &QgsMetadataWidget::removeSelectedConstraint );
115 connect( btnSetCrsFromLayer, &QPushButton::clicked,
this, &QgsMetadataWidget::fillCrsFromLayer );
116 connect( btnSetCrsFromProvider, &QPushButton::clicked,
this, &QgsMetadataWidget::fillCrsFromProvider );
117 connect( btnAddAddress, &QPushButton::clicked,
this, &QgsMetadataWidget::addAddress );
118 connect( btnRemoveAddress, &QPushButton::clicked,
this, &QgsMetadataWidget::removeSelectedAddress );
119 connect( btnAddLink, &QPushButton::clicked,
this, &QgsMetadataWidget::addLink );
120 connect( btnRemoveLink, &QPushButton::clicked,
this, &QgsMetadataWidget::removeSelectedLink );
121 connect( btnAddHistory, &QPushButton::clicked,
this, &QgsMetadataWidget::addHistory );
122 connect( btnRemoveHistory, &QPushButton::clicked,
this, &QgsMetadataWidget::removeSelectedHistory );
123 connect( btnNewCategory, &QPushButton::clicked,
this, &QgsMetadataWidget::addNewCategory );
124 connect( btnAddDefaultCategory, &QPushButton::clicked,
this, &QgsMetadataWidget::addDefaultCategories );
125 connect( btnRemoveCategory, &QPushButton::clicked,
this, &QgsMetadataWidget::removeSelectedCategories );
130 btnAutoSource->setEnabled(
false );
131 btnAutoEncoding->setEnabled(
false );
132 btnSetCrsFromLayer->setEnabled(
false );
137 mMetadata.reset( mLayer->metadata().clone() );
153 type = tr(
"dataset" );
154 typeUpper = tr(
"Dataset" );
155 mEncodingFrame->show();
156 mAuthorFrame->hide();
157 btnAutoSource->setEnabled( mLayer );
161 type = tr(
"project" );
162 typeUpper = tr(
"Project" );
163 mEncodingFrame->hide();
164 mAuthorFrame->show();
165 tabWidget->removeTab( 4 );
166 tabWidget->removeTab( 3 );
167 btnAutoSource->setEnabled(
true );
170 connect( mCreationDateTimeEdit, &QDateTimeEdit::dateTimeChanged,
this, [
this](
const QDateTime &value ) {
171 if ( value.isValid() )
172 mCreationDateTimeEdit2->setDateTime( value );
173 else if ( mCreationDateTimeEdit2->dateTime().isValid() )
174 mCreationDateTimeEdit2->clear();
176 connect( mCreationDateTimeEdit2, &QDateTimeEdit::dateTimeChanged,
this, [
this](
const QDateTime &value ) {
177 if ( value.isValid() )
178 mCreationDateTimeEdit->setDateTime( value );
179 else if ( mCreationDateTimeEdit->dateTime().isValid() )
180 mCreationDateTimeEdit->clear();
186 mIdLabel->setText( tr(
"This page describes the basic attribution of the %1. Please use the tooltips for more information." ).arg( type ) );
187 mLabelCategories->setText( tr(
"%1 categories." ).arg( typeUpper ) );
188 mLabelContact->setText( tr(
"Contacts related to the %1." ).arg( type ) );
189 mLabelLinks->setText( tr(
"Links describe ancillary resources and information related to this %1." ).arg( type ) );
190 mLabelHistory->setText( tr(
"History about the %1." ).arg( type ) );
191 labelKeywords->setText( tr(
"<html><head/><body><p>Keywords are optional, and provide a way to provide additional descriptive information about "
192 "the %1. Edits made in the categories tab will update the category entry below. For the concept, we suggest "
193 "to use a standard based vocabulary such as <a href=\"https://www.eionet.europa.eu/gemet/en/inspire-themes/\">"
194 "<span style=\" text-decoration: underline; color:#0000ff;\">GEMET.</span></a></p></body></html>" )
196 btnAutoSource->setText( tr(
"Set from %1" ).arg( mMode ==
LayerMetadata ? tr(
"layer" ) : tr(
"project" ) ) );
209 mMetadata.reset(
metadata->clone() );
215 std::unique_ptr<QgsAbstractMetadataBase> md;
219 md = std::make_unique<QgsLayerMetadata>();
223 md = std::make_unique<QgsProjectMetadata>();
230void QgsMetadataWidget::fillSourceFromLayer()
247void QgsMetadataWidget::addVocabulary()
249 const int row = tabKeywords->rowCount();
250 tabKeywords->setRowCount( row + 1 );
251 QTableWidgetItem *pCell =
nullptr;
254 pCell =
new QTableWidgetItem( tr(
"undefined %1" ).arg( row + 1 ) );
255 tabKeywords->setItem( row, 0, pCell );
258 pCell =
new QTableWidgetItem();
259 tabKeywords->setItem( row, 1, pCell );
262void QgsMetadataWidget::removeSelectedVocabulary()
264 QItemSelectionModel *selectionModel = tabKeywords->selectionModel();
265 const QModelIndexList selectedRows = selectionModel->selectedRows();
266 for (
int i = 0; i < selectedRows.size(); i++ )
268 tabKeywords->model()->removeRow( selectedRows[i].row() );
272void QgsMetadataWidget::addLicence()
274 QString newLicence = QInputDialog::getItem(
this, tr(
"New Licence" ), tr(
"New Licence" ),
parseLicenses(), 0,
true );
275 if ( tabLicenses->findItems( newLicence, Qt::MatchExactly ).isEmpty() )
277 const int row = tabLicenses->rowCount();
278 tabLicenses->setRowCount( row + 1 );
279 QTableWidgetItem *pCell =
new QTableWidgetItem( newLicence );
280 tabLicenses->setItem( row, 0, pCell );
284void QgsMetadataWidget::removeSelectedLicence()
286 QItemSelectionModel *selectionModel = tabLicenses->selectionModel();
287 const QModelIndexList selectedRows = selectionModel->selectedRows();
288 for (
int i = 0; i < selectedRows.size(); i++ )
290 tabLicenses->model()->removeRow( selectedRows[i].row() );
294void QgsMetadataWidget::addRight()
296 QString newRight = QInputDialog::getText(
this, tr(
"New Right" ), tr(
"New Right" ) );
297 QStringList existingRights = mRightsModel->stringList();
298 if ( !existingRights.contains( newRight ) )
300 existingRights.append( newRight );
301 mRightsModel->setStringList( existingRights );
305void QgsMetadataWidget::removeSelectedRight()
307 QItemSelectionModel *selection = listRights->selectionModel();
308 if ( selection->hasSelection() )
310 QModelIndex indexElementSelectionne = selection->currentIndex();
312 QVariant item = mRightsModel->data( indexElementSelectionne, Qt::DisplayRole );
313 QStringList list = mRightsModel->stringList();
314 list.removeOne( item.toString() );
315 mRightsModel->setStringList( list );
319void QgsMetadataWidget::addConstraint()
321 const int row = mConstraintsModel->rowCount();
322 mConstraintsModel->setItem( row, 0,
new QStandardItem( tr(
"undefined %1" ).arg( row + 1 ) ) );
323 mConstraintsModel->setItem( row, 1,
new QStandardItem( tr(
"undefined %1" ).arg( row + 1 ) ) );
326void QgsMetadataWidget::removeSelectedConstraint()
328 const QModelIndexList selectedRows = tabConstraints->selectionModel()->selectedRows();
329 if ( selectedRows.empty() )
331 mConstraintsModel->removeRow( selectedRows[0].row() );
336 if ( ( mCrs.isValid() ) && ( mLayer ) )
338 lblCurrentCrs->setText( tr(
"CRS: %1" ).arg( mCrs.userFriendlyIdentifier() ) );
339 spatialExtentSelector->setEnabled(
true );
340 spatialExtentSelector->setOutputCrs( mCrs );
342 if ( mCrs == mLayer->crs() && mCrs == mLayer->dataProvider()->crs() )
344 lblCurrentCrsStatus->setText( tr(
"Same as layer properties and provider." ) );
346 else if ( mCrs == mLayer->crs() && mCrs != mLayer->dataProvider()->crs() )
348 lblCurrentCrsStatus->setText( tr(
"Same as layer properties but different than the provider." ) );
350 else if ( mCrs != mLayer->crs() && mCrs == mLayer->dataProvider()->crs() )
352 lblCurrentCrsStatus->setText( tr(
"Same as the provider but different than the layer properties." ) );
356 lblCurrentCrsStatus->setText( tr(
"Does not match either layer properties or the provider." ) );
361 lblCurrentCrs->setText( tr(
"CRS: Not set." ) );
362 lblCurrentCrsStatus->setText( QString() );
363 spatialExtentSelector->setEnabled(
false );
367void QgsMetadataWidget::addAddress()
369 const int row = tabAddresses->rowCount();
370 tabAddresses->setRowCount( row + 1 );
371 QTableWidgetItem *pCell =
nullptr;
374 pCell =
new QTableWidgetItem( tr(
"postal" ) );
375 tabAddresses->setItem( row, 0, pCell );
378 tabAddresses->setItem( row, 1,
new QTableWidgetItem() );
381 tabAddresses->setItem( row, 2,
new QTableWidgetItem() );
384 tabAddresses->setItem( row, 3,
new QTableWidgetItem() );
387 tabAddresses->setItem( row, 4,
new QTableWidgetItem() );
390 tabAddresses->setItem( row, 5,
new QTableWidgetItem() );
393void QgsMetadataWidget::removeSelectedAddress()
395 QItemSelectionModel *selectionModel = tabAddresses->selectionModel();
396 const QModelIndexList selectedRows = selectionModel->selectedRows();
397 for (
int i = 0; i < selectedRows.size(); i++ )
399 tabAddresses->model()->removeRow( selectedRows[i].row() );
403void QgsMetadataWidget::fillCrsFromLayer()
405 mCrs = mLayer->crs();
409void QgsMetadataWidget::fillCrsFromProvider()
411 mCrs = mLayer->dataProvider()->crs();
415void QgsMetadataWidget::addLink()
417 const int row = mLinksModel->rowCount();
418 mLinksModel->setItem( row, 0,
new QStandardItem( tr(
"undefined %1" ).arg( row + 1 ) ) );
419 mLinksModel->setItem( row, 1,
new QStandardItem() );
420 mLinksModel->setItem( row, 2,
new QStandardItem() );
421 mLinksModel->setItem( row, 3,
new QStandardItem() );
422 mLinksModel->setItem( row, 4,
new QStandardItem() );
423 mLinksModel->setItem( row, 5,
new QStandardItem() );
424 mLinksModel->setItem( row, 6,
new QStandardItem() );
427void QgsMetadataWidget::removeSelectedLink()
429 const QModelIndexList selectedRows = tabLinks->selectionModel()->selectedRows();
430 if ( selectedRows.empty() )
433 mLinksModel->removeRow( selectedRows[0].row() );
436void QgsMetadataWidget::addHistory()
438 QString newHistory = QInputDialog::getText(
this, tr(
"New History" ), tr(
"New History" ) );
439 QStringList existingHistory = mHistoryModel->stringList();
440 if ( !existingHistory.contains( newHistory ) )
442 existingHistory.append( newHistory );
443 mHistoryModel->setStringList( existingHistory );
447void QgsMetadataWidget::removeSelectedHistory()
449 QItemSelectionModel *selection = listHistory->selectionModel();
450 if ( selection->hasSelection() )
452 QModelIndex indexElementSelectionne = selection->currentIndex();
454 QVariant item = mHistoryModel->data( indexElementSelectionne, Qt::DisplayRole );
455 QStringList list = mHistoryModel->stringList();
456 list.removeOne( item.toString() );
457 mHistoryModel->setStringList( list );
461void QgsMetadataWidget::fillComboBox()
466 comboType->setEditable(
true );
469 const QStringList &keys = types.keys();
471 for (
const QString &type : keys )
473 comboType->insertItem( i, type );
474 comboType->setItemData( i, types.value( type ), Qt::ToolTipRole );
480 comboLanguage->setEditable(
true );
481 comboLanguage->clear();
483 const QStringList &k = countries.keys();
485 for (
const QString &countryCode : k )
487 comboLanguage->insertItem( i, countryCode );
488 comboLanguage->setItemData( i, countries.value( countryCode ), Qt::ToolTipRole );
493void QgsMetadataWidget::setUiFromMetadata()
496 lineEditParentId->setText( mMetadata->parentIdentifier() );
499 if ( !mMetadata->identifier().isEmpty() )
501 lineEditIdentifier->setText( mMetadata->identifier() );
505 if ( !mMetadata->title().isEmpty() )
507 whileBlocking( lineEditTitle )->setText( mMetadata->title() );
511 if ( !mMetadata->type().isEmpty() )
513 if ( comboType->findText( mMetadata->type() ) == -1 )
515 comboType->addItem( mMetadata->type() );
517 comboType->setCurrentIndex( comboType->findText( mMetadata->type() ) );
521 if ( !mMetadata->language().isEmpty() )
523 if ( comboLanguage->findText( mMetadata->language() ) == -1 )
525 comboLanguage->addItem( mMetadata->language() );
527 comboLanguage->setCurrentIndex( comboLanguage->findText( mMetadata->language() ) );
531 textEditAbstract->setPlainText( mMetadata->abstract() );
534 mCategoriesModel->setStringList( mMetadata->categories() );
537 tabKeywords->setRowCount( 0 );
538 QMapIterator<QString, QStringList> i( mMetadata->keywords() );
539 while ( i.hasNext() )
543 int currentRow = tabKeywords->rowCount() - 1;
544 tabKeywords->item( currentRow, 0 )->setText( i.key() );
545 tabKeywords->item( currentRow, 1 )->setText( i.value().join( QLatin1Char(
',' ) ) );
548 if ( QgsLayerMetadata *layerMetadata =
dynamic_cast<QgsLayerMetadata *
>( mMetadata.get() ) )
551 comboEncoding->setCurrentText( layerMetadata->encoding() );
554 lineEditFees->setText( layerMetadata->fees() );
557 tabLicenses->setRowCount( 0 );
558 const QStringList &licenses = layerMetadata->licenses();
559 for (
const QString &licence : licenses )
561 int currentRow = tabLicenses->rowCount();
562 tabLicenses->setRowCount( currentRow + 1 );
563 QTableWidgetItem *pCell = tabLicenses->item( currentRow, 0 );
566 pCell =
new QTableWidgetItem;
567 tabLicenses->setItem( currentRow, 0, pCell );
569 pCell->setText( licence );
573 mRightsModel->setStringList( layerMetadata->rights() );
576 mConstraintsModel->clear();
577 const QList<QgsLayerMetadata::Constraint> &constraints = layerMetadata->constraints();
578 for (
const QgsLayerMetadata::Constraint &constraint : constraints )
580 const int row = mConstraintsModel->rowCount();
581 mConstraintsModel->setItem( row, 0,
new QStandardItem( constraint.type ) );
582 mConstraintsModel->setItem( row, 1,
new QStandardItem( constraint.constraint ) );
586 mCrs = layerMetadata->crs();
590 const QList<QgsLayerMetadata::SpatialExtent> &spatialExtents = layerMetadata->extent().spatialExtents();
591 if ( !spatialExtents.isEmpty() )
594 spatialExtentSelector->setOutputCrs( spatialExtents.at( 0 ).extentCrs );
595 spatialExtentSelector->setOriginalExtent( spatialExtents.at( 0 ).bounds.toRectangle(), spatialExtents.at( 0 ).extentCrs );
596 spatialExtentSelector->setOutputExtentFromOriginal();
597 spinBoxZMaximum->setValue( spatialExtents.at( 0 ).bounds.zMaximum() );
598 spinBoxZMinimum->setValue( spatialExtents.at( 0 ).bounds.zMinimum() );
602 const QList<QgsDateTimeRange> &temporalExtents = layerMetadata->extent().temporalExtents();
603 if ( !temporalExtents.isEmpty() )
606 dateTimeFrom->setDateTime( temporalExtents.at( 0 ).begin() );
607 dateTimeTo->setDateTime( temporalExtents.at( 0 ).end() );
611 dateTimeFrom->clear();
615 else if ( QgsProjectMetadata *projectMetadata =
dynamic_cast<QgsProjectMetadata *
>( mMetadata.get() ) )
617 mLineEditAuthor->setText( projectMetadata->author() );
621 const QList<QgsAbstractMetadataBase::Contact> &contacts = mMetadata->contacts();
622 if ( !contacts.isEmpty() )
625 const QgsAbstractMetadataBase::Contact &contact = contacts.at( 0 );
626 lineEditContactName->setText( contact.
name );
627 lineEditContactEmail->setText( contact.
email );
628 lineEditContactFax->setText( contact.
fax );
629 lineEditContactOrganization->setText( contact.
organization );
630 lineEditContactPosition->setText( contact.
position );
631 lineEditContactVoice->setText( contact.
voice );
632 if ( comboContactRole->findText( contact.
role ) == -1 )
634 comboContactRole->addItem( contact.
role );
636 comboContactRole->setCurrentIndex( comboContactRole->findText( contact.
role ) );
637 tabAddresses->setRowCount( 0 );
638 const QList<QgsAbstractMetadataBase::Address> &addresses = contact.
addresses;
639 for (
const QgsAbstractMetadataBase::Address &address : addresses )
641 int currentRow = tabAddresses->rowCount();
642 tabAddresses->setRowCount( currentRow + 1 );
643 tabAddresses->setItem( currentRow, 0,
new QTableWidgetItem( address.type ) );
644 tabAddresses->setItem( currentRow, 1,
new QTableWidgetItem( address.address ) );
645 tabAddresses->setItem( currentRow, 2,
new QTableWidgetItem( address.postalCode ) );
646 tabAddresses->setItem( currentRow, 3,
new QTableWidgetItem( address.city ) );
647 tabAddresses->setItem( currentRow, 4,
new QTableWidgetItem( address.administrativeArea ) );
648 tabAddresses->setItem( currentRow, 5,
new QTableWidgetItem( address.country ) );
653 const QList<QgsAbstractMetadataBase::Link> &links = mMetadata->links();
654 mLinksModel->setRowCount( 0 );
655 for (
const QgsAbstractMetadataBase::Link &link : links )
657 const int row = mLinksModel->rowCount();
658 mLinksModel->setItem( row, 0,
new QStandardItem( link.name ) );
659 mLinksModel->setItem( row, 1,
new QStandardItem( link.type ) );
660 mLinksModel->setItem( row, 2,
new QStandardItem( link.url ) );
661 mLinksModel->setItem( row, 3,
new QStandardItem( link.description ) );
662 mLinksModel->setItem( row, 4,
new QStandardItem( link.format ) );
663 mLinksModel->setItem( row, 5,
new QStandardItem( link.mimeType ) );
664 mLinksModel->setItem( row, 6,
new QStandardItem( link.size ) );
668 mHistoryModel->setStringList( mMetadata->history() );
674 mCreationDateTimeEdit2->clear();
679 mPublishedDateTimeEdit->clear();
684 mRevisedDateTimeEdit->clear();
689 mSupersededDateTimeEdit->clear();
697 metadata->setParentIdentifier( lineEditParentId->text() );
698 metadata->setIdentifier( lineEditIdentifier->text() );
699 metadata->setTitle( lineEditTitle->text() );
700 metadata->setType( comboType->currentText() );
701 metadata->setLanguage( comboLanguage->currentText() );
702 metadata->setAbstract( textEditAbstract->toPlainText() );
705 syncFromCategoriesTabToKeywordsTab();
706 QMap<QString, QStringList> keywords;
707 for (
int i = 0; i < tabKeywords->rowCount(); i++ )
709 keywords.insert( tabKeywords->item( i, 0 )->text(), tabKeywords->item( i, 1 )->text().split(
',' ) );
719 layerMetadata->
setFees( lineEditFees->text() );
722 QStringList licenses;
723 for (
int i = 0; i < tabLicenses->rowCount(); i++ )
725 licenses.append( tabLicenses->item( i, 0 )->text() );
730 layerMetadata->
setRights( mRightsModel->stringList() );
733 layerMetadata->
setEncoding( comboEncoding->currentText() );
736 QList<QgsLayerMetadata::Constraint> constraints;
737 for (
int row = 0; row < mConstraintsModel->rowCount(); row++ )
740 constraint.
type = mConstraintsModel->item( row, 0 )->text();
741 constraint.
constraint = mConstraintsModel->item( row, 1 )->text();
742 constraints.append( constraint );
747 if ( mCrs.isValid() )
749 layerMetadata->
setCrs( mCrs );
754 spatialExtent.
bounds =
QgsBox3D( spatialExtentSelector->outputExtent() );
757 spatialExtent.
extentCrs = spatialExtentSelector->outputCrs();
758 QList<QgsLayerMetadata::SpatialExtent> spatialExtents;
759 spatialExtents.append( spatialExtent );
760 QList<QgsDateTimeRange> temporalExtents;
761 temporalExtents.append(
QgsDateTimeRange( dateTimeFrom->dateTime(), dateTimeTo->dateTime() ) );
772 projectMetadata->
setAuthor( mLineEditAuthor->text() );
779 QList<QgsAbstractMetadataBase::Contact> contacts = mMetadata->contacts();
780 if ( contacts.size() > 0 )
781 contacts.removeFirst();
783 contact.
email = lineEditContactEmail->text();
784 contact.
position = lineEditContactPosition->text();
785 contact.
fax = lineEditContactFax->text();
786 contact.
voice = lineEditContactVoice->text();
787 contact.
name = lineEditContactName->text();
788 contact.
organization = lineEditContactOrganization->text();
789 contact.
role = comboContactRole->currentText();
790 QList<QgsAbstractMetadataBase::Address> addresses;
791 for (
int i = 0; i < tabAddresses->rowCount(); i++ )
794 address.
type = tabAddresses->item( i, 0 )->text();
795 address.
address = tabAddresses->item( i, 1 )->text();
796 address.
postalCode = tabAddresses->item( i, 2 )->text();
797 address.
city = tabAddresses->item( i, 3 )->text();
799 address.
country = tabAddresses->item( i, 5 )->text();
800 addresses.append( address );
803 contacts.insert( 0, contact );
807 QList<QgsAbstractMetadataBase::Link> links;
808 for (
int row = 0; row < mLinksModel->rowCount(); row++ )
811 link.
name = mLinksModel->item( row, 0 )->text();
812 link.
type = mLinksModel->item( row, 1 )->text();
813 link.
url = mLinksModel->item( row, 2 )->text();
814 link.
description = mLinksModel->item( row, 3 )->text();
815 link.
format = mLinksModel->item( row, 4 )->text();
816 link.
mimeType = mLinksModel->item( row, 5 )->text();
817 link.
size = mLinksModel->item( row, 6 )->text();
818 links.append( link );
823 metadata->setHistory( mHistoryModel->stringList() );
834 std::unique_ptr<QgsAbstractMetadataBase> md(
metadata() );
836 std::unique_ptr<QgsNativeMetadataBaseValidator> validator;
840 validator = std::make_unique<QgsNativeMetadataValidator>();
844 validator = std::make_unique<QgsNativeProjectMetadataValidator>();
848 QList<QgsAbstractMetadataBaseValidator::ValidationResult> validationResults;
849 bool results = validator->validate( md.get(), validationResults );
856 errors += QLatin1String(
"<b>" ) % result.section;
859 errors += QLatin1Char(
' ' ) % QVariant( result.identifier().toInt() + 1 ).toString();
861 errors += QLatin1String(
"</b>: " ) % result.note % QLatin1String(
"<br />" );
866 errors = tr(
"Ok, it seems valid according to the QGIS Schema." );
870 myStyle.append( QStringLiteral(
"body { margin: 10px; }\n " ) );
871 resultsCheckMetadata->clear();
872 resultsCheckMetadata->document()->setDefaultStyleSheet( myStyle );
873 resultsCheckMetadata->setHtml( errors );
880 QMap<QString, QString> countries;
881 countries.insert( QString(), QString() );
885 if ( !file.open( QIODevice::ReadOnly ) )
887 QgsDebugError( QStringLiteral(
"Error while opening the CSV file: %1, %2 " ).arg( path, file.errorString() ) );
893 while ( !file.atEnd() )
895 QByteArray line = file.readLine();
896 QList<QByteArray> items = line.split(
',' );
897 countries.insert( QString( items.at( 0 ).constData() ).trimmed(), QString( items.at( 1 ).constData() ).trimmed() );
902 QFile secondFile( path );
903 if ( !secondFile.open( QIODevice::ReadOnly ) )
905 QgsDebugError( QStringLiteral(
"Error while opening the CSV file: %1, %2 " ).arg( path, file.errorString() ) );
910 secondFile.readLine();
911 while ( !secondFile.atEnd() )
913 QByteArray line = secondFile.readLine();
914 QList<QByteArray> items = line.split(
',' );
915 countries.insert( QString( items.at( 2 ).constData() ).trimmed(), QString( items.at( 0 ).constData() ).trimmed() );
923 QStringList wordList;
924 wordList.append( QString() );
928 if ( !file.open( QIODevice::ReadOnly ) )
930 QgsDebugError( QStringLiteral(
"Error while opening the CSV file: %1, %2 " ).arg( path, file.errorString() ) );
936 while ( !file.atEnd() )
938 QByteArray line = file.readLine();
939 wordList.append( line.split(
',' ).at( 0 ).trimmed() );
947 QStringList wordList;
948 wordList.append( QString() );
952 if ( !file.open( QIODevice::ReadOnly ) )
954 QgsDebugError( QStringLiteral(
"Error while opening the CSV file: %1, %2 " ).arg( path, file.errorString() ) );
960 while ( !file.atEnd() )
962 QByteArray line = file.readLine();
963 wordList.append( line.split(
',' ).at( 0 ).trimmed() );
971 QStringList wordList;
972 wordList.append( QString() );
976 if ( !file.open( QIODevice::ReadOnly ) )
978 QgsDebugError( QStringLiteral(
"Error while opening the CSV file: %1, %2 " ).arg( path, file.errorString() ) );
982 while ( !file.atEnd() )
984 QByteArray line = file.readLine();
985 wordList.append( line.split(
',' ).at( 0 ).trimmed() );
993 QMap<QString, QString> types;
994 types.insert( QString(), QString() );
997 if ( !file.open( QIODevice::ReadOnly ) )
999 QgsDebugError( QStringLiteral(
"Error while opening the CSV file: %1, %2 " ).arg( path, file.errorString() ) );
1003 types.insert( QString(), QString() );
1004 while ( !file.atEnd() )
1006 QByteArray line = file.readLine();
1007 QList<QByteArray> items = line.split(
';' );
1008 types.insert( items.at( 0 ).constData(), items.at( 1 ).constData() );
1022 return lineEditTitle->text();
1027 if (
title != lineEditTitle->text() )
1043 mLayer->setMetadata( *
static_cast<QgsLayerMetadata *
>( mMetadata.get() ) );
1053void QgsMetadataWidget::syncFromCategoriesTabToKeywordsTab()
1055 if ( mCategoriesModel->rowCount() > 0 )
1057 QList<QTableWidgetItem *> categories = tabKeywords->findItems( QStringLiteral(
"gmd:topicCategory" ), Qt::MatchExactly );
1059 if ( !categories.isEmpty() )
1061 row = categories.at( 0 )->row();
1067 row = tabKeywords->rowCount() - 1;
1068 tabKeywords->item( row, 0 )->setText( QStringLiteral(
"gmd:topicCategory" ) );
1070 tabKeywords->item( row, 1 )->setText( mCategoriesModel->stringList().join( QLatin1Char(
',' ) ) );
1074void QgsMetadataWidget::updatePanel()
1076 int index = tabWidget->currentIndex();
1077 QString currentTabText = tabWidget->widget( index )->objectName();
1078 if ( currentTabText == QLatin1String(
"tabCategoriesDialog" ) )
1082 QList<QTableWidgetItem *> categories = tabKeywords->findItems( QStringLiteral(
"gmd:topicCategory" ), Qt::MatchExactly );
1083 if ( !categories.isEmpty() )
1085 const int row = categories.at( 0 )->row();
1086 mCategoriesModel->setStringList( tabKeywords->item( row, 1 )->text().split(
',' ) );
1090 mCategoriesModel->setStringList( QStringList() );
1093 else if ( currentTabText == QLatin1String(
"tabKeywordsDialog" ) )
1097 syncFromCategoriesTabToKeywordsTab();
1099 else if ( currentTabText == QLatin1String(
"tabValidationDialog" ) )
1105void QgsMetadataWidget::addNewCategory()
1108 QString text = QInputDialog::getText(
this, tr(
"New Category" ), tr(
"New Category:" ), QLineEdit::Normal, QString(), &ok );
1109 if ( ok && !text.isEmpty() )
1111 QStringList list = mCategoriesModel->stringList();
1112 if ( !list.contains( text ) )
1114 list.append( text );
1115 mCategoriesModel->setStringList( list );
1116 mCategoriesModel->sort( 0 );
1121void QgsMetadataWidget::addDefaultCategories()
1123 const QModelIndexList selectedIndexes = listDefaultCategories->selectionModel()->selectedIndexes();
1124 QStringList defaultCategoriesList = mDefaultCategoriesModel->stringList();
1125 QStringList selectedCategories = mCategoriesModel->stringList();
1127 for (
const QModelIndex &selection : selectedIndexes )
1129 QVariant item = mDefaultCategoriesModel->data( selection, Qt::DisplayRole );
1130 defaultCategoriesList.removeOne( item.toString() );
1132 selectedCategories.append( item.toString() );
1135 mDefaultCategoriesModel->setStringList( defaultCategoriesList );
1136 mCategoriesModel->setStringList( selectedCategories );
1137 mCategoriesModel->sort( 0 );
1140void QgsMetadataWidget::removeSelectedCategories()
1142 const QModelIndexList selectedIndexes = listCategories->selectionModel()->selectedIndexes();
1143 QStringList categories = mCategoriesModel->stringList();
1144 QStringList defaultList = mDefaultCategoriesModel->stringList();
1146 for (
const QModelIndex &selection : selectedIndexes )
1148 QVariant item = mCategoriesModel->data( selection, Qt::DisplayRole );
1149 categories.removeOne( item.toString() );
1151 if ( mDefaultCategories.contains( item.toString() ) )
1153 defaultList.append( item.toString() );
1156 mCategoriesModel->setStringList( categories );
1158 mDefaultCategoriesModel->setStringList( defaultList );
1159 mDefaultCategoriesModel->sort( 0 );
1163LinkItemDelegate::LinkItemDelegate( QObject *parent )
1164 : QStyledItemDelegate( parent )
1168QWidget *LinkItemDelegate::createEditor( QWidget *parent,
const QStyleOptionViewItem &option,
const QModelIndex &index )
const
1170 if ( index.column() == 1 )
1173 QComboBox *typeEditor =
new QComboBox( parent );
1174 typeEditor->setEditable(
true );
1175 QStringListModel *model =
new QStringListModel( parent );
1177 typeEditor->setModel( model );
1180 else if ( index.column() == 5 )
1183 QComboBox *mimeEditor =
new QComboBox( parent );
1184 mimeEditor->setEditable(
true );
1185 QStringListModel *model =
new QStringListModel( parent );
1187 mimeEditor->setModel( model );
1191 return QStyledItemDelegate::createEditor( parent, option, index );
1194ConstraintItemDelegate::ConstraintItemDelegate( QObject *parent )
1195 : QStyledItemDelegate( parent )
1199QWidget *ConstraintItemDelegate::createEditor( QWidget *parent,
const QStyleOptionViewItem &option,
const QModelIndex &index )
const
1201 if ( index.column() == 0 )
1204 QComboBox *typeEditor =
new QComboBox( parent );
1205 typeEditor->setEditable(
true );
1207 types << QStringLiteral(
"access" ) << QStringLiteral(
"use" ) << QStringLiteral(
"other" );
1208 QStringListModel *model =
new QStringListModel( parent );
1209 model->setStringList( types );
1210 typeEditor->setModel( model );
1214 return QStyledItemDelegate::createEditor( parent, option, index );
@ Published
Date published.
@ Superseded
Date superseded.
static QString reportStyleSheet(QgsApplication::StyleSheetType styleSheetType=QgsApplication::StyleSheetType::Qt)
Returns a css style sheet for reports, the styleSheetType argument determines what type of stylesheet...
static QString metadataPath()
Returns the path to the metadata directory.
A 3-dimensional box composed of x, y, z coordinates.
void setZMinimum(double z)
Sets the minimum z value.
void setZMaximum(double z)
Sets the maximum z value.
A QDateTimeEdit with the capability of setting/reading null date/times.
Map canvas is a class for displaying all GIS data types on a canvas.
const QgsMapSettings & mapSettings() const
Gets access to properties used for map rendering.
QgsRectangle extent() const
Returns the current zoom extent of the map canvas.
Base class for all map layer types.
QString publicSource(bool hidePassword=false) const
Gets a version of the internal layer definition that has sensitive bits removed (for example,...
QgsCoordinateReferenceSystem destinationCrs() const
Returns the destination coordinate reference system for the map render.
static QgsProject * instance()
Returns the QgsProject singleton instance.
void setMetadata(const QgsProjectMetadata &metadata)
Sets the project's metadata store.
static bool isNull(const QVariant &variant, bool silenceNullWarnings=false)
Returns true if the specified variant should be considered a NULL value.
QgsSignalBlocker< Object > whileBlocking(Object *object)
Temporarily blocks signals from a QObject while calling a single method from the object.
#define QgsDebugError(str)
QgsTemporalRange< QDateTime > QgsDateTimeRange
QgsRange which stores a range of date times.