diff --git a/python/core/auto_generated/mesh/qgsmeshlayer.sip.in b/python/core/auto_generated/mesh/qgsmeshlayer.sip.in index a5061d9fe542..e78fea6251c4 100644 --- a/python/core/auto_generated/mesh/qgsmeshlayer.sip.in +++ b/python/core/auto_generated/mesh/qgsmeshlayer.sip.in @@ -146,6 +146,8 @@ QgsMeshLayer cannot be copied. virtual QStringList subLayers() const; + virtual QString htmlMetadata() const; + QString providerType() const; %Docstring diff --git a/src/core/mesh/qgsmeshlayer.cpp b/src/core/mesh/qgsmeshlayer.cpp index 962b3a79bdad..71dc016d0ba9 100644 --- a/src/core/mesh/qgsmeshlayer.cpp +++ b/src/core/mesh/qgsmeshlayer.cpp @@ -36,6 +36,7 @@ #include "qgsstyle.h" #include "qgstriangularmesh.h" #include "qgsmesh3daveraging.h" +#include "qgslayermetadataformatter.h" QgsMeshLayer::QgsMeshLayer( const QString &meshLayerPath, const QString &baseName, @@ -1251,6 +1252,115 @@ QStringList QgsMeshLayer::subLayers() const return QStringList(); } +QString QgsMeshLayer::htmlMetadata() const +{ + QgsLayerMetadataFormatter htmlFormatter( metadata() ); + QString myMetadata = QStringLiteral( "\n\n" ); + + // Begin Provider section + myMetadata += QStringLiteral( "

" ) + tr( "Information from provider" ) + QStringLiteral( "

\n
\n" ); + myMetadata += QLatin1String( "\n" ); + + // name + myMetadata += QStringLiteral( "\n" ); + + // local path + QVariantMap uriComponents = QgsProviderRegistry::instance()->decodeUri( mProviderKey, publicSource() ); + QString path; + if ( uriComponents.contains( QStringLiteral( "path" ) ) ) + { + path = uriComponents[QStringLiteral( "path" )].toString(); + if ( QFile::exists( path ) ) + myMetadata += QStringLiteral( "\n" ); + } + if ( uriComponents.contains( QStringLiteral( "url" ) ) ) + { + const QString url = uriComponents[QStringLiteral( "url" )].toString(); + myMetadata += QStringLiteral( "\n" ); + } + + // data source + if ( publicSource() != path ) + myMetadata += QStringLiteral( "\n" ); + + // EPSG + myMetadata += QStringLiteral( "\n" ); + + // Extent + myMetadata += QStringLiteral( "\n" ); + + // unit + myMetadata += QStringLiteral( "\n" ); + + // feature count + QLocale locale = QLocale(); + locale.setNumberOptions( locale.numberOptions() &= ~QLocale::NumberOption::OmitGroupSeparator ); + + if ( dataProvider() ) + { + myMetadata += QStringLiteral( "\n" ); + myMetadata += QStringLiteral( "\n" ); + myMetadata += QStringLiteral( "\n" ); + myMetadata += QStringLiteral( "\n" ); + } + + // End Provider section + myMetadata += QLatin1String( "
" ) + tr( "Name" ) + QStringLiteral( "" ) + name() + QStringLiteral( "
" ) + tr( "Path" ) + QStringLiteral( "%1" ).arg( QStringLiteral( "%2" ).arg( QUrl::fromLocalFile( path ).toString(), QDir::toNativeSeparators( path ) ) ) + QStringLiteral( "
" ) + tr( "URL" ) + QStringLiteral( "%1" ).arg( QStringLiteral( "%2" ).arg( QUrl( url ).toString(), url ) ) + QStringLiteral( "
" ) + tr( "Source" ) + QStringLiteral( "%1" ).arg( publicSource() ) + QStringLiteral( "
" ) + tr( "CRS" ) + QStringLiteral( "" ); + if ( crs().isValid() ) + { + myMetadata += crs().userFriendlyIdentifier( QgsCoordinateReferenceSystem::FullString ) + QStringLiteral( " - " ); + if ( crs().isGeographic() ) + myMetadata += tr( "Geographic" ); + else + myMetadata += tr( "Projected" ); + } + myMetadata += QLatin1String( "
" ) + tr( "Extent" ) + QStringLiteral( "" ) + extent().toString() + QStringLiteral( "
" ) + tr( "Unit" ) + QStringLiteral( "" ) + QgsUnitTypes::toString( crs().mapUnits() ) + QStringLiteral( "
" ) + + tr( "Vertex count" ) + QStringLiteral( "" ) + + ( locale.toString( static_cast( dataProvider()->vertexCount() ) ) ) + + QStringLiteral( "
" ) + + tr( "Face count" ) + QStringLiteral( "" ) + + ( locale.toString( static_cast( dataProvider()->faceCount() ) ) ) + + QStringLiteral( "
" ) + + tr( "Edge count" ) + QStringLiteral( "" ) + + ( locale.toString( static_cast( dataProvider()->edgeCount() ) ) ) + + QStringLiteral( "
" ) + + tr( "Dataset groups count" ) + QStringLiteral( "" ) + + ( locale.toString( static_cast( dataProvider()->datasetGroupCount() ) ) ) + + QStringLiteral( "
\n

" ); + + // identification section + myMetadata += QStringLiteral( "

" ) + tr( "Identification" ) + QStringLiteral( "

\n
\n" ); + myMetadata += htmlFormatter.identificationSectionHtml( ); + myMetadata += QLatin1String( "

\n" ); + + // extent section + myMetadata += QStringLiteral( "

" ) + tr( "Extent" ) + QStringLiteral( "

\n
\n" ); + myMetadata += htmlFormatter.extentSectionHtml( isSpatial() ); + myMetadata += QLatin1String( "

\n" ); + + // Start the Access section + myMetadata += QStringLiteral( "

" ) + tr( "Access" ) + QStringLiteral( "

\n
\n" ); + myMetadata += htmlFormatter.accessSectionHtml( ); + myMetadata += QLatin1String( "

\n" ); + + // Start the contacts section + myMetadata += QStringLiteral( "

" ) + tr( "Contacts" ) + QStringLiteral( "

\n
\n" ); + myMetadata += htmlFormatter.contactsSectionHtml( ); + myMetadata += QLatin1String( "

\n" ); + + // Start the links section + myMetadata += QStringLiteral( "

" ) + tr( "Links" ) + QStringLiteral( "

\n
\n" ); + myMetadata += htmlFormatter.linksSectionHtml( ); + myMetadata += QLatin1String( "

\n" ); + + // Start the history section + myMetadata += QStringLiteral( "

" ) + tr( "History" ) + QStringLiteral( "

\n
\n" ); + myMetadata += htmlFormatter.historySectionHtml( ); + myMetadata += QLatin1String( "

\n" ); + + myMetadata += QLatin1String( "\n\n\n" ); + return myMetadata; +} bool QgsMeshLayer::setDataProvider( QString const &provider, const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags ) { diff --git a/src/core/mesh/qgsmeshlayer.h b/src/core/mesh/qgsmeshlayer.h index ce09940ddc82..e9d285de7c5f 100644 --- a/src/core/mesh/qgsmeshlayer.h +++ b/src/core/mesh/qgsmeshlayer.h @@ -169,6 +169,7 @@ class CORE_EXPORT QgsMeshLayer : public QgsMapLayer QgsMapLayerTemporalProperties *temporalProperties() override; void reload() override; QStringList subLayers() const override; + QString htmlMetadata() const override; //! Returns the provider type for this layer QString providerType() const; diff --git a/src/gui/mesh/qgsmeshlayerproperties.cpp b/src/gui/mesh/qgsmeshlayerproperties.cpp index f67e8a6f56ca..13b50f6e6343 100644 --- a/src/gui/mesh/qgsmeshlayerproperties.cpp +++ b/src/gui/mesh/qgsmeshlayerproperties.cpp @@ -38,8 +38,10 @@ #include "qgsproviderregistry.h" #include "qgsdatumtransformdialog.h" #include "qgsmaplayerconfigwidgetfactory.h" +#include "qgsgui.h" +#include "qgsnative.h" - +#include #include #include @@ -159,22 +161,13 @@ void QgsMeshLayerProperties::syncToLayer() /* * Information Tab */ - QString info; - if ( mMeshLayer->dataProvider() ) - { - info += QLatin1String( "" ); - info += QStringLiteral( "" ).arg( tr( "Uri" ) ).arg( mMeshLayer->dataProvider()->dataSourceUri() ); - info += QStringLiteral( "" ).arg( tr( "Vertex count" ) ).arg( mMeshLayer->dataProvider()->vertexCount() ); - info += QStringLiteral( "" ).arg( tr( "Face count" ) ).arg( mMeshLayer->dataProvider()->faceCount() ); - info += QStringLiteral( "" ).arg( tr( "Edge count" ) ).arg( mMeshLayer->dataProvider()->edgeCount() ); - info += QStringLiteral( "" ).arg( tr( "Dataset groups count" ) ).arg( mMeshLayer->dataProvider()->datasetGroupCount() ); - info += QLatin1String( "
%1: %2
%1: %2
%1: %2
%1: %2
%1: %2
" ); - } - else - { - info += tr( "Invalid data provider" ); - } - mInformationTextBrowser->setText( info ); + QString myStyle = QgsApplication::reportStyleSheet(); + myStyle.append( QStringLiteral( "body { margin: 10px; }\n " ) ); + mInformationTextBrowser->clear(); + mInformationTextBrowser->document()->setDefaultStyleSheet( myStyle ); + mInformationTextBrowser->setHtml( mMeshLayer->htmlMetadata() ); + mInformationTextBrowser->setOpenLinks( false ); + connect( mInformationTextBrowser, &QTextBrowser::anchorClicked, this, &QgsMeshLayerProperties::urlClicked ); QgsDebugMsgLevel( QStringLiteral( "populate source tab" ), 4 ); /* @@ -468,3 +461,12 @@ void QgsMeshLayerProperties::onStaticDatasetCheckBoxChanged() { mStaticDatasetGroupBox->setCollapsed( !mTemporalStaticDatasetCheckBox->isChecked() && mIsMapSettingsTemporal ); } + +void QgsMeshLayerProperties::urlClicked( const QUrl &url ) +{ + QFileInfo file( url.toLocalFile() ); + if ( file.exists() && !file.isDir() ) + QgsGui::instance()->nativePlatformInterface()->openFileExplorerAndSelectFile( url.toLocalFile() ); + else + QDesktopServices::openUrl( url ); +} diff --git a/src/gui/mesh/qgsmeshlayerproperties.h b/src/gui/mesh/qgsmeshlayerproperties.h index e99c8077e0fa..74a2169b9280 100644 --- a/src/gui/mesh/qgsmeshlayerproperties.h +++ b/src/gui/mesh/qgsmeshlayerproperties.h @@ -86,6 +86,9 @@ class GUI_EXPORT QgsMeshLayerProperties : public QgsOptionsDialogBase, private U void onTimeReferenceChange(); void onStaticDatasetCheckBoxChanged(); + + void urlClicked( const QUrl &url ); + private: //! Pointer to the mesh styling widget QgsRendererMeshPropertiesWidget *mRendererMeshPropertiesWidget = nullptr;