29#include "moc_qgslayermetadataresultsmodel.cpp"
31using namespace Qt::StringLiterals;
33QgsLayerMetadataResultsModel::QgsLayerMetadataResultsModel(
const QgsMetadataSearchContext &searchContext, QObject *parent )
34 : QAbstractTableModel( parent )
35 , mSearchContext( searchContext )
37 qRegisterMetaType<QgsLayerMetadataSearchResults>(
"QgsLayerMetadataSearchResults" );
38 qRegisterMetaType<QgsLayerMetadataProviderResult>(
"QgsLayerMetadataProviderResult" );
41QgsLayerMetadataResultsModel::~QgsLayerMetadataResultsModel()
46int QgsLayerMetadataResultsModel::rowCount(
const QModelIndex &parent )
const
48 return parent.isValid() ? 0 : mResult.metadata().count();
51int QgsLayerMetadataResultsModel::columnCount(
const QModelIndex &parent )
const
53 return parent.isValid() ? 0 : 5;
56QVariant QgsLayerMetadataResultsModel::data(
const QModelIndex &index,
int role )
const
58 if ( index.isValid() && index.row() < mResult.metadata().count() )
62 case Qt::ItemDataRole::DisplayRole:
64 switch ( index.column() )
66 case Sections::Identifier:
67 return mResult.metadata().at( index.row() ).identifier();
69 return mResult.metadata().at( index.row() ).title();
70 case Sections::Abstract:
71 return mResult.metadata().at( index.row() ).abstract();
72 case Sections::DataProviderName:
74 const QString providerName { mResult.metadata().at( index.row() ).dataProviderName() };
78 case Sections::GeometryType:
80 const QList<QgsLayerMetadataProviderResult> metadata = mResult.metadata();
81 const QgsLayerMetadataProviderResult &md { metadata.at( index.row() ) };
83 return tr(
"Raster" );
91 case Qt::ItemDataRole::ToolTipRole:
93 const QgsLayerMetadataFormatter formatter { mResult.metadata().at( index.row() ) };
94 return tr( R
"HTML(<html><body><!-- metadata headers ---><h3>Identification</h3>%1</body></html>)HTML" ).arg( formatter.identificationSectionHtml() );
97 case Qt::ItemDataRole::DecorationRole:
99 if ( index.column() == 0 )
101 const QList<QgsLayerMetadataProviderResult> metadata = mResult.metadata();
102 const QgsLayerMetadataProviderResult &md { metadata.at( index.row() ) };
109 case static_cast<int>( CustomRole::Metadata ):
111 return QVariant::fromValue( mResult.metadata().at( index.row() ) );
121QVariant QgsLayerMetadataResultsModel::headerData(
int section, Qt::Orientation orientation,
int role )
const
123 if ( orientation == Qt::Orientation::Horizontal && section < columnCount( createIndex( -1, -1 ) ) )
125 if ( role == Qt::ItemDataRole::DisplayRole )
129 case Sections::Identifier:
130 return tr(
"Identifier" );
131 case Sections::Title:
132 return tr(
"Title" );
133 case Sections::Abstract:
134 return tr(
"Abstract" );
135 case Sections::DataProviderName:
136 return tr(
"Provider" );
137 case Sections::GeometryType:
138 return tr(
"Layer Type" );
143 return QAbstractTableModel::headerData( section, orientation, role );
146void QgsLayerMetadataResultsModel::reload()
151 mResult = QgsLayerMetadataSearchResults();
153 for ( QgsAbstractLayerMetadataProvider *mdProvider : std::as_const( providers ) )
155 const QList<QgsLayerMetadataProviderResult> results { mdProvider->search( mSearchContext ).metadata() };
156 for (
const QgsLayerMetadataProviderResult &metadata : std::as_const( results ) )
158 mResult.addMetadata( metadata );
164void QgsLayerMetadataResultsModel::reloadAsync()
169 mResult = QgsLayerMetadataSearchResults();
171 mFeedback->setProgress( 0 );
173 for ( QgsAbstractLayerMetadataProvider *mdProvider : std::as_const( providers ) )
175 auto fetcher = std::make_unique<QgsMetadataResultsFetcher>( mdProvider, mSearchContext, mFeedback.get() );
176 auto thread = std::make_unique<QThread>();
177 fetcher->moveToThread( thread.get() );
179 connect( fetcher.get(), &QgsMetadataResultsFetcher::resultsReady,
this, [
this](
const QgsLayerMetadataSearchResults &results ) { resultsReady( results ); } );
180 connect( thread.get(), &QThread::started, fetcher.get(), &QgsMetadataResultsFetcher::fetchMetadata );
181 mWorkerThreads.push_back( std::move( thread ) );
182 mWorkers.push_back( std::move( fetcher ) );
183 mWorkerThreads.back()->start();
190 beginInsertRows( QModelIndex(), mResult.metadata().count(), mResult.metadata().count() + results.
metadata().count() - 1 );
191 const QList<QgsLayerMetadataProviderResult> metadata { results.
metadata() };
192 for (
const QgsLayerMetadataProviderResult &result : std::as_const( metadata ) )
194 mResult.addMetadata( result );
199void QgsLayerMetadataResultsModel::cancel()
206 for (
const auto &workerThread : std::as_const( mWorkerThreads ) )
208 workerThread->quit();
209 workerThread->wait();
213 mWorkerThreads.clear();
215 mFeedback = std::make_unique<QgsFeedback>();
223 : mLayerMetadataProvider( metadataProvider )
224 , mSearchContext( searchContext )
225 , mFeedback( feedback )
228void QgsMetadataResultsFetcher::fetchMetadata()
230 emit resultsReady( mLayerMetadataProvider->search( mSearchContext, QString(),
QgsRectangle(), mFeedback ) );
static QgsLayerMetadataProviderRegistry * layerMetadataProviderRegistry()
Returns registry of available layer metadata provider implementations.
static QgsApplication * instance()
Returns the singleton instance of the QgsApplication.
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
Base class for feedback objects to be used for cancellation of something running in a worker thread.
void progressChanged(double progress)
Emitted when the feedback object reports a progress change.
static QIcon iconForGeometryType(Qgis::GeometryType typeGroup)
Returns the icon for a vector layer whose geometry typeGroup is provided.
static QgsProviderRegistry * instance(const QString &pluginPath=QString())
Means of accessing canonical single instance.
QgsProviderMetadata * providerMetadata(const QString &providerKey) const
Returns metadata of the provider or nullptr if not found.
A rectangle specified with double values.
static Q_INVOKABLE QString geometryDisplayString(Qgis::GeometryType type)
Returns a display string for a geometry type.