22#include <QInputDialog>
23#include <QStringListModel>
39 tabWidget->setCurrentIndex( 0 );
42 encodingFrame->setHidden(
true );
44 spinBoxZMinimum->setClearValue( 0 );
45 spinBoxZMaximum->setClearValue( 0 );
48 mDefaultCategories << tr(
"Farming" ) << tr(
"Climatology Meteorology Atmosphere" ) << tr(
"Location" ) << tr(
"Intelligence Military" ) << tr(
"Transportation" ) << tr(
"Structure" ) << tr(
"Boundaries" );
49 mDefaultCategories << tr(
"Inland Waters" ) << tr(
"Planning Cadastre" ) << tr(
"Geoscientific Information" ) << tr(
"Elevation" ) << tr(
"Health" ) << tr(
"Biota" ) << tr(
"Oceans" ) << tr(
"Environment" );
50 mDefaultCategories << tr(
"Utilities Communication" ) << tr(
"Economy" ) << tr(
"Society" ) << tr(
"Imagery Base Maps Earth Cover" );
51 mDefaultCategoriesModel =
new QStringListModel( mDefaultCategories,
this );
52 mDefaultCategoriesModel->sort( 0 );
53 listDefaultCategories->setModel( mDefaultCategoriesModel );
56 mCategoriesModel =
new QStringListModel( listCategories );
57 listCategories->setModel( mCategoriesModel );
60 mRightsModel =
new QStringListModel( listRights );
61 listRights->setModel( mRightsModel );
64 mConstraintsModel =
new QStandardItemModel( tabConstraints );
65 mConstraintsModel->setColumnCount( 2 );
66 QStringList constraintheaders;
67 constraintheaders << tr(
"Type" ) << tr(
"Constraint" );
68 mConstraintsModel->setHorizontalHeaderLabels( constraintheaders );
69 tabConstraints->setModel( mConstraintsModel );
70 tabConstraints->setItemDelegate(
new ConstraintItemDelegate(
this ) );
73 dateTimeFrom->setAllowNull(
true );
74 dateTimeTo->setAllowNull(
true );
77 mLinksModel =
new QStandardItemModel( tabLinks );
78 mLinksModel->setColumnCount( 7 );
79 QStringList headers = QStringList();
80 headers << tr(
"Name" ) << tr(
"Type" ) << tr(
"URL" ) << tr(
"Description" ) << tr(
"Format" ) << tr(
"MIME" ) << tr(
"Size" );
81 mLinksModel->setHorizontalHeaderLabels( headers );
82 tabLinks->setModel( mLinksModel );
83 tabLinks->setItemDelegate(
new LinkItemDelegate(
this ) );
86 mHistoryModel =
new QStringListModel( listHistory );
87 listHistory->setModel( mHistoryModel );
90 connect( tabWidget, &QTabWidget::currentChanged,
this, &QgsMetadataWidget::updatePanel );
91 connect( btnAutoSource, &QPushButton::clicked,
this, &QgsMetadataWidget::fillSourceFromLayer );
92 connect( btnAddVocabulary, &QPushButton::clicked,
this, &QgsMetadataWidget::addVocabulary );
93 connect( btnRemoveVocabulary, &QPushButton::clicked,
this, &QgsMetadataWidget::removeSelectedVocabulary );
94 connect( btnAddRight, &QPushButton::clicked,
this, &QgsMetadataWidget::addRight );
95 connect( btnRemoveRight, &QPushButton::clicked,
this, &QgsMetadataWidget::removeSelectedRight );
96 connect( btnAddLicence, &QPushButton::clicked,
this, &QgsMetadataWidget::addLicence );
97 connect( btnRemoveLicence, &QPushButton::clicked,
this, &QgsMetadataWidget::removeSelectedLicence );
98 connect( btnAddConstraint, &QPushButton::clicked,
this, &QgsMetadataWidget::addConstraint );
99 connect( btnRemoveConstraint, &QPushButton::clicked,
this, &QgsMetadataWidget::removeSelectedConstraint );
100 connect( btnSetCrsFromLayer, &QPushButton::clicked,
this, &QgsMetadataWidget::fillCrsFromLayer );
101 connect( btnSetCrsFromProvider, &QPushButton::clicked,
this, &QgsMetadataWidget::fillCrsFromProvider );
102 connect( btnAddAddress, &QPushButton::clicked,
this, &QgsMetadataWidget::addAddress );
103 connect( btnRemoveAddress, &QPushButton::clicked,
this, &QgsMetadataWidget::removeSelectedAddress );
104 connect( btnAddLink, &QPushButton::clicked,
this, &QgsMetadataWidget::addLink );
105 connect( btnRemoveLink, &QPushButton::clicked,
this, &QgsMetadataWidget::removeSelectedLink );
106 connect( btnAddHistory, &QPushButton::clicked,
this, &QgsMetadataWidget::addHistory );
107 connect( btnRemoveHistory, &QPushButton::clicked,
this, &QgsMetadataWidget::removeSelectedHistory );
108 connect( btnNewCategory, &QPushButton::clicked,
this, &QgsMetadataWidget::addNewCategory );
109 connect( btnAddDefaultCategory, &QPushButton::clicked,
this, &QgsMetadataWidget::addDefaultCategories );
110 connect( btnRemoveCategory, &QPushButton::clicked,
this, &QgsMetadataWidget::removeSelectedCategories );
115 btnAutoSource->setEnabled(
false );
116 btnAutoEncoding->setEnabled(
false );
117 btnSetCrsFromLayer->setEnabled(
false );
138 type = tr(
"dataset" );
139 typeUpper = tr(
"Dataset" );
140 mEncodingFrame->show();
141 mAuthorFrame->hide();
142 btnAutoSource->setEnabled( mLayer );
146 type = tr(
"project" );
147 typeUpper = tr(
"Project" );
148 mEncodingFrame->hide();
149 mAuthorFrame->show();
150 tabWidget->removeTab( 4 );
151 tabWidget->removeTab( 3 );
152 btnAutoSource->setEnabled(
true );
156 mIdLabel->setText( tr(
"This page describes the basic attribution of the %1. Please use the tooltips for more information." ).arg( type ) );
157 mLabelCategories->setText( tr(
"%1 categories." ).arg( typeUpper ) );
158 mLabelContact->setText( tr(
"Contacts related to the %1." ).arg( type ) );
159 mLabelLinks->setText( tr(
"Links describe ancillary resources and information related to this %1." ).arg( type ) );
160 mLabelHistory->setText( tr(
"History about the %1." ).arg( type ) );
161 labelKeywords->setText( tr(
"<html><head/><body><p>Keywords are optional, and provide a way to provide additional descriptive information about "
162 "the %1. Edits made in the categories tab will update the category entry below. For the concept, we suggest "
163 "to use a standard based vocabulary such as <a href=\"https://www.eionet.europa.eu/gemet/en/inspire-themes/\">"
164 "<span style=\" text-decoration: underline; color:#0000ff;\">GEMET.</span></a></p></body></html>" ).arg( type ) );
165 btnAutoSource->setText( tr(
"Set from %1" ).arg( mMode ==
LayerMetadata ? tr(
"layer" ) : tr(
"project" ) ) );
184 std::unique_ptr< QgsAbstractMetadataBase > md;
188 md = std::make_unique< QgsLayerMetadata >();
192 md = std::make_unique< QgsProjectMetadata >();
200void QgsMetadataWidget::fillSourceFromLayer()
218void QgsMetadataWidget::addVocabulary()
220 const int row = tabKeywords->rowCount();
221 tabKeywords->setRowCount( row + 1 );
222 QTableWidgetItem *pCell =
nullptr;
225 pCell =
new QTableWidgetItem( tr(
"undefined %1" ).arg( row + 1 ) );
226 tabKeywords->setItem( row, 0, pCell );
229 pCell =
new QTableWidgetItem();
230 tabKeywords->setItem( row, 1, pCell );
233void QgsMetadataWidget::removeSelectedVocabulary()
235 QItemSelectionModel *selectionModel = tabKeywords->selectionModel();
236 const QModelIndexList selectedRows = selectionModel->selectedRows();
237 for (
int i = 0; i < selectedRows.size() ; i++ )
239 tabKeywords->model()->removeRow( selectedRows[i].row() );
243void QgsMetadataWidget::addLicence()
245 QString newLicence = QInputDialog::getItem(
this, tr(
"New Licence" ), tr(
"New Licence" ),
parseLicenses(), 0,
true );
246 if ( tabLicenses->findItems( newLicence, Qt::MatchExactly ).isEmpty() )
248 const int row = tabLicenses->rowCount();
249 tabLicenses->setRowCount( row + 1 );
250 QTableWidgetItem *pCell =
new QTableWidgetItem( newLicence );
251 tabLicenses->setItem( row, 0, pCell );
255void QgsMetadataWidget::removeSelectedLicence()
257 QItemSelectionModel *selectionModel = tabLicenses->selectionModel();
258 const QModelIndexList selectedRows = selectionModel->selectedRows();
259 for (
int i = 0; i < selectedRows.size() ; i++ )
261 tabLicenses->model()->removeRow( selectedRows[i].row() );
265void QgsMetadataWidget::addRight()
267 QString newRight = QInputDialog::getText(
this, tr(
"New Right" ), tr(
"New Right" ) );
268 QStringList existingRights = mRightsModel->stringList();
269 if ( ! existingRights.contains( newRight ) )
271 existingRights.append( newRight );
272 mRightsModel->setStringList( existingRights );
276void QgsMetadataWidget::removeSelectedRight()
278 QItemSelectionModel *selection = listRights->selectionModel();
279 if ( selection->hasSelection() )
281 QModelIndex indexElementSelectionne = selection->currentIndex();
283 QVariant item = mRightsModel->data( indexElementSelectionne, Qt::DisplayRole );
284 QStringList list = mRightsModel->stringList();
285 list.removeOne( item.toString() );
286 mRightsModel->setStringList( list );
290void QgsMetadataWidget::addConstraint()
292 const int row = mConstraintsModel->rowCount();
293 mConstraintsModel->setItem( row, 0,
new QStandardItem( tr(
"undefined %1" ).arg( row + 1 ) ) );
294 mConstraintsModel->setItem( row, 1,
new QStandardItem( tr(
"undefined %1" ).arg( row + 1 ) ) );
297void QgsMetadataWidget::removeSelectedConstraint()
299 const QModelIndexList selectedRows = tabConstraints->selectionModel()->selectedRows();
300 if ( selectedRows.empty() )
302 mConstraintsModel->removeRow( selectedRows[0].row() );
307 if ( ( mCrs.
isValid() ) && ( mLayer ) )
310 spatialExtentSelector->setEnabled(
true );
311 spatialExtentSelector->setOutputCrs( mCrs );
315 lblCurrentCrsStatus->setText( tr(
"Same as layer properties and provider." ) );
319 lblCurrentCrsStatus->setText( tr(
"Same as layer properties but different than the provider." ) );
323 lblCurrentCrsStatus->setText( tr(
"Same as the provider but different than the layer properties." ) );
327 lblCurrentCrsStatus->setText( tr(
"Does not match either layer properties or the provider." ) );
332 lblCurrentCrs->setText( tr(
"CRS: Not set." ) );
333 lblCurrentCrsStatus->setText( QString() );
334 spatialExtentSelector->setEnabled(
false );
338void QgsMetadataWidget::addAddress()
340 const int row = tabAddresses->rowCount();
341 tabAddresses->setRowCount( row + 1 );
342 QTableWidgetItem *pCell =
nullptr;
345 pCell =
new QTableWidgetItem( tr(
"postal" ) );
346 tabAddresses->setItem( row, 0, pCell );
349 tabAddresses->setItem( row, 1,
new QTableWidgetItem() );
352 tabAddresses->setItem( row, 2,
new QTableWidgetItem() );
355 tabAddresses->setItem( row, 3,
new QTableWidgetItem() );
358 tabAddresses->setItem( row, 4,
new QTableWidgetItem() );
361 tabAddresses->setItem( row, 5,
new QTableWidgetItem() );
364void QgsMetadataWidget::removeSelectedAddress()
366 QItemSelectionModel *selectionModel = tabAddresses->selectionModel();
367 const QModelIndexList selectedRows = selectionModel->selectedRows();
368 for (
int i = 0; i < selectedRows.size() ; i++ )
370 tabAddresses->model()->removeRow( selectedRows[i].row() );
374void QgsMetadataWidget::fillCrsFromLayer()
376 mCrs = mLayer->
crs();
380void QgsMetadataWidget::fillCrsFromProvider()
386void QgsMetadataWidget::addLink()
388 const int row = mLinksModel->rowCount();
389 mLinksModel->setItem( row, 0,
new QStandardItem( tr(
"undefined %1" ).arg( row + 1 ) ) );
390 mLinksModel->setItem( row, 1,
new QStandardItem() );
391 mLinksModel->setItem( row, 2,
new QStandardItem() );
392 mLinksModel->setItem( row, 3,
new QStandardItem() );
393 mLinksModel->setItem( row, 4,
new QStandardItem() );
394 mLinksModel->setItem( row, 5,
new QStandardItem() );
395 mLinksModel->setItem( row, 6,
new QStandardItem() );
398void QgsMetadataWidget::removeSelectedLink()
400 const QModelIndexList selectedRows = tabLinks->selectionModel()->selectedRows();
401 if ( selectedRows.empty() )
404 mLinksModel->removeRow( selectedRows[0].row() );
407void QgsMetadataWidget::addHistory()
409 QString newHistory = QInputDialog::getText(
this, tr(
"New History" ), tr(
"New History" ) );
410 QStringList existingHistory = mHistoryModel->stringList();
411 if ( ! existingHistory.contains( newHistory ) )
413 existingHistory.append( newHistory );
414 mHistoryModel->setStringList( existingHistory );
418void QgsMetadataWidget::removeSelectedHistory()
420 QItemSelectionModel *selection = listHistory->selectionModel();
421 if ( selection->hasSelection() )
423 QModelIndex indexElementSelectionne = selection->currentIndex();
425 QVariant item = mHistoryModel->data( indexElementSelectionne, Qt::DisplayRole );
426 QStringList list = mHistoryModel->stringList();
427 list.removeOne( item.toString() );
428 mHistoryModel->setStringList( list );
432void QgsMetadataWidget::fillComboBox()
437 comboType->setEditable(
true );
440 const QStringList &keys = types.keys();
442 for (
const QString &type : keys )
444 comboType->insertItem( i, type );
445 comboType->setItemData( i, types.value( type ), Qt::ToolTipRole );
451 comboLanguage->setEditable(
true );
452 comboLanguage->clear();
454 const QStringList &k = countries.keys();
456 for (
const QString &countryCode : k )
458 comboLanguage->insertItem( i, countryCode );
459 comboLanguage->setItemData( i, countries.value( countryCode ), Qt::ToolTipRole );
464void QgsMetadataWidget::setUiFromMetadata()
467 lineEditParentId->setText( mMetadata->parentIdentifier() );
470 if ( ! mMetadata->identifier().isEmpty() )
472 lineEditIdentifier->setText( mMetadata->identifier() );
476 if ( ! mMetadata->title().isEmpty() )
478 whileBlocking( lineEditTitle )->setText( mMetadata->title() );
482 if ( ! mMetadata->type().isEmpty() )
484 if ( comboType->findText( mMetadata->type() ) == -1 )
486 comboType->addItem( mMetadata->type() );
488 comboType->setCurrentIndex( comboType->findText( mMetadata->type() ) );
492 if ( ! mMetadata->language().isEmpty() )
494 if ( comboLanguage->findText( mMetadata->language() ) == -1 )
496 comboLanguage->addItem( mMetadata->language() );
498 comboLanguage->setCurrentIndex( comboLanguage->findText( mMetadata->language() ) );
502 textEditAbstract->setPlainText( mMetadata->abstract() );
505 mCategoriesModel->setStringList( mMetadata->categories() );
508 tabKeywords->setRowCount( 0 );
509 QMapIterator<QString, QStringList> i( mMetadata->keywords() );
510 while ( i.hasNext() )
514 int currentRow = tabKeywords->rowCount() - 1;
515 tabKeywords->item( currentRow, 0 )->setText( i.key() );
516 tabKeywords->item( currentRow, 1 )->setText( i.value().join( QLatin1Char(
',' ) ) );
522 comboEncoding->setCurrentText( layerMetadata->encoding() );
525 lineEditFees->setText( layerMetadata->fees() );
528 tabLicenses->setRowCount( 0 );
529 const QStringList &licenses = layerMetadata->licenses();
530 for (
const QString &licence : licenses )
532 int currentRow = tabLicenses->rowCount();
533 tabLicenses->setRowCount( currentRow + 1 );
534 QTableWidgetItem *pCell = tabLicenses->item( currentRow, 0 );
537 pCell =
new QTableWidgetItem;
538 tabLicenses->setItem( currentRow, 0, pCell );
540 pCell->setText( licence );
544 mRightsModel->setStringList( layerMetadata->rights() );
547 mConstraintsModel->clear();
548 const QList<QgsLayerMetadata::Constraint> &constraints = layerMetadata->constraints();
551 const int row = mConstraintsModel->rowCount();
552 mConstraintsModel->setItem( row, 0,
new QStandardItem( constraint.type ) );
553 mConstraintsModel->setItem( row, 1,
new QStandardItem( constraint.constraint ) );
557 mCrs = layerMetadata->crs();
561 const QList<QgsLayerMetadata::SpatialExtent> &spatialExtents = layerMetadata->extent().spatialExtents();
562 if ( ! spatialExtents.isEmpty() )
565 spatialExtentSelector->setOutputCrs( spatialExtents.at( 0 ).extentCrs );
566 spatialExtentSelector->setOriginalExtent( spatialExtents.at( 0 ).bounds.toRectangle(), spatialExtents.at( 0 ).extentCrs );
567 spatialExtentSelector->setOutputExtentFromOriginal();
568 spinBoxZMaximum->setValue( spatialExtents.at( 0 ).bounds.zMaximum() );
569 spinBoxZMinimum->setValue( spatialExtents.at( 0 ).bounds.zMinimum() );
573 const QList<QgsDateTimeRange> &temporalExtents = layerMetadata->extent().temporalExtents();
574 if ( ! temporalExtents.isEmpty() )
577 dateTimeFrom->setDateTime( temporalExtents.at( 0 ).begin() );
578 dateTimeTo->setDateTime( temporalExtents.at( 0 ).end() );
582 dateTimeFrom->clear();
588 mLineEditAuthor->setText( projectMetadata->author() );
589 mCreationDateTimeEdit->setDateTime( projectMetadata->creationDateTime() );
593 const QList<QgsAbstractMetadataBase::Contact> &contacts = mMetadata->contacts();
594 if ( ! contacts.isEmpty() )
598 lineEditContactName->setText( contact.
name );
599 lineEditContactEmail->setText( contact.
email );
600 lineEditContactFax->setText( contact.
fax );
601 lineEditContactOrganization->setText( contact.
organization );
602 lineEditContactPosition->setText( contact.
position );
603 lineEditContactVoice->setText( contact.
voice );
604 if ( comboContactRole->findText( contact.
role ) == -1 )
606 comboContactRole->addItem( contact.
role );
608 comboContactRole->setCurrentIndex( comboContactRole->findText( contact.
role ) );
609 tabAddresses->setRowCount( 0 );
610 const QList<QgsAbstractMetadataBase::Address> &addresses = contact.
addresses;
613 int currentRow = tabAddresses->rowCount();
614 tabAddresses->setRowCount( currentRow + 1 );
615 tabAddresses->setItem( currentRow, 0,
new QTableWidgetItem( address.type ) );
616 tabAddresses->setItem( currentRow, 1,
new QTableWidgetItem( address.address ) );
617 tabAddresses->setItem( currentRow, 2,
new QTableWidgetItem( address.postalCode ) );
618 tabAddresses->setItem( currentRow, 3,
new QTableWidgetItem( address.city ) );
619 tabAddresses->setItem( currentRow, 4,
new QTableWidgetItem( address.administrativeArea ) );
620 tabAddresses->setItem( currentRow, 5,
new QTableWidgetItem( address.country ) );
625 const QList<QgsAbstractMetadataBase::Link> &links = mMetadata->links();
626 mLinksModel->setRowCount( 0 );
629 const int row = mLinksModel->rowCount();
630 mLinksModel->setItem( row, 0,
new QStandardItem( link.name ) );
631 mLinksModel->setItem( row, 1,
new QStandardItem( link.type ) );
632 mLinksModel->setItem( row, 2,
new QStandardItem( link.url ) );
633 mLinksModel->setItem( row, 3,
new QStandardItem( link.description ) );
634 mLinksModel->setItem( row, 4,
new QStandardItem( link.format ) );
635 mLinksModel->setItem( row, 5,
new QStandardItem( link.mimeType ) );
636 mLinksModel->setItem( row, 6,
new QStandardItem( link.size ) );
640 mHistoryModel->setStringList( mMetadata->history() );
656 syncFromCategoriesTabToKeywordsTab();
657 QMap<QString, QStringList> keywords;
658 for (
int i = 0; i < tabKeywords->rowCount() ; i++ )
660 keywords.insert( tabKeywords->item( i, 0 )->text(), tabKeywords->item( i, 1 )->text().split(
',' ) );
670 layerMetadata->
setFees( lineEditFees->text() );
673 QStringList licenses;
674 for (
int i = 0; i < tabLicenses->rowCount() ; i++ )
676 licenses.append( tabLicenses->item( i, 0 )->text() );
681 layerMetadata->
setRights( mRightsModel->stringList() );
684 layerMetadata->
setEncoding( comboEncoding->currentText() );
687 QList<QgsLayerMetadata::Constraint> constraints;
688 for (
int row = 0; row < mConstraintsModel->rowCount() ; row++ )
691 constraint.
type = mConstraintsModel->item( row, 0 )->text();
692 constraint.
constraint = mConstraintsModel->item( row, 1 )->text();
693 constraints.append( constraint );
700 layerMetadata->
setCrs( mCrs );
705 spatialExtent.
bounds =
QgsBox3d( spatialExtentSelector->outputExtent() );
708 spatialExtent.
extentCrs = spatialExtentSelector->outputCrs();
709 QList<QgsLayerMetadata::SpatialExtent> spatialExtents;
710 spatialExtents.append( spatialExtent );
711 QList<QgsDateTimeRange> temporalExtents;
712 temporalExtents.append(
QgsDateTimeRange( dateTimeFrom->dateTime(), dateTimeTo->dateTime() ) );
723 projectMetadata->
setAuthor( mLineEditAuthor->text() );
731 QList<QgsAbstractMetadataBase::Contact> contacts = mMetadata->contacts();
732 if ( contacts.size() > 0 )
733 contacts.removeFirst();
735 contact.
email = lineEditContactEmail->text();
736 contact.
position = lineEditContactPosition->text();
737 contact.
fax = lineEditContactFax->text();
738 contact.
voice = lineEditContactVoice->text();
739 contact.
name = lineEditContactName->text();
740 contact.
organization = lineEditContactOrganization->text();
741 contact.
role = comboContactRole->currentText();
742 QList<QgsAbstractMetadataBase::Address> addresses;
743 for (
int i = 0; i < tabAddresses->rowCount() ; i++ )
746 address.
type = tabAddresses->item( i, 0 )->text();
747 address.
address = tabAddresses->item( i, 1 )->text();
748 address.
postalCode = tabAddresses->item( i, 2 )->text();
749 address.
city = tabAddresses->item( i, 3 )->text();
751 address.
country = tabAddresses->item( i, 5 )->text();
752 addresses.append( address );
755 contacts.insert( 0, contact );
759 QList<QgsAbstractMetadataBase::Link> links;
760 for (
int row = 0; row < mLinksModel->rowCount() ; row++ )
763 link.
name = mLinksModel->item( row, 0 )->text();
764 link.
type = mLinksModel->item( row, 1 )->text();
765 link.
url = mLinksModel->item( row, 2 )->text();
766 link.
description = mLinksModel->item( row, 3 )->text();
767 link.
format = mLinksModel->item( row, 4 )->text();
768 link.
mimeType = mLinksModel->item( row, 5 )->text();
769 link.
size = mLinksModel->item( row, 6 )->text();
770 links.append( link );
780 std::unique_ptr< QgsAbstractMetadataBase > md(
metadata() );
782 std::unique_ptr< QgsNativeMetadataBaseValidator > validator;
786 validator = std::make_unique< QgsNativeMetadataValidator>();
790 validator = std::make_unique< QgsNativeProjectMetadataValidator>();
794 QList<QgsAbstractMetadataBaseValidator::ValidationResult> validationResults;
795 bool results = validator->validate( md.get(), validationResults );
802 errors += QLatin1String(
"<b>" ) % result.section;
805 errors += QLatin1Char(
' ' ) % QVariant( result._identifier().toInt() + 1 ).toString();
807 errors += QLatin1String(
"</b>: " ) % result.note % QLatin1String(
"<br />" );
812 errors = tr(
"Ok, it seems valid according to the QGIS Schema." );
816 myStyle.append( QStringLiteral(
"body { margin: 10px; }\n " ) );
817 resultsCheckMetadata->clear();
818 resultsCheckMetadata->document()->setDefaultStyleSheet( myStyle );
819 resultsCheckMetadata->setHtml( errors );
826 QMap<QString, QString> countries;
827 countries.insert( QString(), QString() );
831 if ( !file.open( QIODevice::ReadOnly ) )
833 QgsDebugMsg( QStringLiteral(
"Error while opening the CSV file: %1, %2 " ).arg( path, file.errorString() ) );
839 while ( !file.atEnd() )
841 QByteArray line = file.readLine();
842 QList<QByteArray> items = line.split(
',' );
843 countries.insert( QString( items.at( 0 ).constData() ).trimmed(), QString( items.at( 1 ).constData() ).trimmed() );
848 QFile secondFile( path );
849 if ( !secondFile.open( QIODevice::ReadOnly ) )
851 QgsDebugMsg( QStringLiteral(
"Error while opening the CSV file: %1, %2 " ).arg( path, file.errorString() ) );
856 secondFile.readLine();
857 while ( !secondFile.atEnd() )
859 QByteArray line = secondFile.readLine();
860 QList<QByteArray> items = line.split(
',' );
861 countries.insert( QString( items.at( 2 ).constData() ).trimmed(), QString( items.at( 0 ).constData() ).trimmed() );
869 QStringList wordList;
870 wordList.append( QString() );
874 if ( !file.open( QIODevice::ReadOnly ) )
876 QgsDebugMsg( QStringLiteral(
"Error while opening the CSV file: %1, %2 " ).arg( path, file.errorString() ) );
882 while ( !file.atEnd() )
884 QByteArray line = file.readLine();
885 wordList.append( line.split(
',' ).at( 0 ).trimmed() );
893 QStringList wordList;
894 wordList.append( QString() );
898 if ( !file.open( QIODevice::ReadOnly ) )
900 QgsDebugMsg( QStringLiteral(
"Error while opening the CSV file: %1, %2 " ).arg( path, file.errorString() ) );
906 while ( !file.atEnd() )
908 QByteArray line = file.readLine();
909 wordList.append( line.split(
',' ).at( 0 ).trimmed() );
917 QStringList wordList;
918 wordList.append( QString() );
922 if ( !file.open( QIODevice::ReadOnly ) )
924 QgsDebugMsg( QStringLiteral(
"Error while opening the CSV file: %1, %2 " ).arg( path, file.errorString() ) );
928 while ( !file.atEnd() )
930 QByteArray line = file.readLine();
931 wordList.append( line.split(
',' ).at( 0 ).trimmed() );
939 QMap<QString, QString> types;
940 types.insert( QString(), QString() );
943 if ( !file.open( QIODevice::ReadOnly ) )
945 QgsDebugMsg( QStringLiteral(
"Error while opening the CSV file: %1, %2 " ).arg( path, file.errorString() ) );
949 types.insert( QString(), QString() );
950 while ( !file.atEnd() )
952 QByteArray line = file.readLine();
953 QList<QByteArray> items = line.split(
';' );
954 types.insert( items.at( 0 ).constData(), items.at( 1 ).constData() );
968 return lineEditTitle->text();
973 if (
title != lineEditTitle->text() )
999void QgsMetadataWidget::syncFromCategoriesTabToKeywordsTab()
1001 if ( mCategoriesModel->rowCount() > 0 )
1003 QList<QTableWidgetItem *> categories = tabKeywords->findItems( QStringLiteral(
"gmd:topicCategory" ), Qt::MatchExactly );
1005 if ( !categories.isEmpty() )
1007 row = categories.at( 0 )->row();
1013 row = tabKeywords->rowCount() - 1;
1014 tabKeywords->item( row, 0 )->setText( QStringLiteral(
"gmd:topicCategory" ) );
1016 tabKeywords->item( row, 1 )->setText( mCategoriesModel->stringList().join( QLatin1Char(
',' ) ) );
1020void QgsMetadataWidget::updatePanel()
1022 int index = tabWidget->currentIndex();
1023 QString currentTabText = tabWidget->widget( index )->objectName();
1024 if ( currentTabText == QLatin1String(
"tabCategoriesDialog" ) )
1028 QList<QTableWidgetItem *> categories = tabKeywords->findItems( QStringLiteral(
"gmd:topicCategory" ), Qt::MatchExactly );
1029 if ( !categories.isEmpty() )
1031 const int row = categories.at( 0 )->row();
1032 mCategoriesModel->setStringList( tabKeywords->item( row, 1 )->text().split(
',' ) );
1036 mCategoriesModel->setStringList( QStringList() );
1039 else if ( currentTabText == QLatin1String(
"tabKeywordsDialog" ) )
1043 syncFromCategoriesTabToKeywordsTab();
1045 else if ( currentTabText == QLatin1String(
"tabValidationDialog" ) )
1051void QgsMetadataWidget::addNewCategory()
1054 QString text = QInputDialog::getText(
this, tr(
"New Category" ),
1055 tr(
"New Category:" ), QLineEdit::Normal,
1057 if ( ok && !text.isEmpty() )
1059 QStringList list = mCategoriesModel->stringList();
1060 if ( ! list.contains( text ) )
1062 list.append( text );
1063 mCategoriesModel->setStringList( list );
1064 mCategoriesModel->sort( 0 );
1069void QgsMetadataWidget::addDefaultCategories()
1071 const QModelIndexList selectedIndexes = listDefaultCategories->selectionModel()->selectedIndexes();
1072 QStringList defaultCategoriesList = mDefaultCategoriesModel->stringList();
1073 QStringList selectedCategories = mCategoriesModel->stringList();
1075 for (
const QModelIndex &selection : selectedIndexes )
1077 QVariant item = mDefaultCategoriesModel->data( selection, Qt::DisplayRole );
1078 defaultCategoriesList.removeOne( item.toString() );
1080 selectedCategories.append( item.toString() );
1083 mDefaultCategoriesModel->setStringList( defaultCategoriesList );
1084 mCategoriesModel->setStringList( selectedCategories );
1085 mCategoriesModel->sort( 0 );
1088void QgsMetadataWidget::removeSelectedCategories()
1090 const QModelIndexList selectedIndexes = listCategories->selectionModel()->selectedIndexes();
1091 QStringList categories = mCategoriesModel->stringList();
1092 QStringList defaultList = mDefaultCategoriesModel->stringList();
1094 for (
const QModelIndex &selection : selectedIndexes )
1096 QVariant item = mCategoriesModel->data( selection, Qt::DisplayRole );
1097 categories.removeOne( item.toString() );
1099 if ( mDefaultCategories.contains( item.toString() ) )
1101 defaultList.append( item.toString() );
1104 mCategoriesModel->setStringList( categories );
1106 mDefaultCategoriesModel->setStringList( defaultList );
1107 mDefaultCategoriesModel->sort( 0 );
1111LinkItemDelegate::LinkItemDelegate( QObject *parent )
1112 : QStyledItemDelegate( parent )
1117QWidget *LinkItemDelegate::createEditor( QWidget *parent,
const QStyleOptionViewItem &option,
const QModelIndex &index )
const
1119 if ( index.column() == 1 )
1122 QComboBox *typeEditor =
new QComboBox( parent );
1123 typeEditor->setEditable(
true );
1124 QStringListModel *model =
new QStringListModel( parent );
1126 typeEditor->setModel( model );
1129 else if ( index.column() == 5 )
1132 QComboBox *mimeEditor =
new QComboBox( parent );
1133 mimeEditor->setEditable(
true );
1134 QStringListModel *model =
new QStringListModel( parent );
1136 mimeEditor->setModel( model );
1140 return QStyledItemDelegate::createEditor( parent, option, index );
1143ConstraintItemDelegate::ConstraintItemDelegate( QObject *parent )
1144 : QStyledItemDelegate( parent )
1149QWidget *ConstraintItemDelegate::createEditor( QWidget *parent,
const QStyleOptionViewItem &option,
const QModelIndex &index )
const
1151 if ( index.column() == 0 )
1154 QComboBox *typeEditor =
new QComboBox( parent );
1155 typeEditor->setEditable(
true );
1157 types << QStringLiteral(
"access" ) << QStringLiteral(
"use" ) << QStringLiteral(
"other" );
1158 QStringListModel *model =
new QStringListModel( parent );
1159 model->setStringList( types );
1160 typeEditor->setModel( model );
1164 return QStyledItemDelegate::createEditor( parent, option, index );
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.
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
QString userFriendlyIdentifier(IdentifierType type=MediumString) const
Returns a user friendly identifier for the CRS.
virtual QgsCoordinateReferenceSystem crs() const =0
Returns the coordinate system for the data source.
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() const
Gets a version of the internal layer definition that has sensitive bits removed (for example,...
QgsCoordinateReferenceSystem crs
QgsLayerMetadata metadata
virtual void setMetadata(const QgsLayerMetadata &metadata)
Sets the layer's metadata store.
virtual Q_INVOKABLE QgsDataProvider * dataProvider()
Returns the layer's data provider, it may be nullptr.
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)
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.
QgsTemporalRange< QDateTime > QgsDateTimeRange
QgsRange which stores a range of date times.