ExtensionBrowser: Delay fetching of json data from server

The fetching is postponed until the extension manager is shown.

This also adds a spinner which is shown during the fetching of the data.

Change-Id: Id24ae772bcdfdf885ecfd5341d9a8d02f398c1a0
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Alessandro Portale
2024-06-26 16:02:16 +02:00
parent a81e4fb277
commit 6ffe1a8061
2 changed files with 19 additions and 4 deletions

View File

@@ -22,6 +22,7 @@
#include <extensionsystem/pluginview.h> #include <extensionsystem/pluginview.h>
#include <extensionsystem/pluginmanager.h> #include <extensionsystem/pluginmanager.h>
#include <solutions/spinner/spinner.h>
#include <solutions/tasking/networkquery.h> #include <solutions/tasking/networkquery.h>
#include <solutions/tasking/tasktree.h> #include <solutions/tasking/tasktree.h>
#include <solutions/tasking/tasktreerunner.h> #include <solutions/tasking/tasktreerunner.h>
@@ -249,6 +250,7 @@ public:
class ExtensionsBrowserPrivate class ExtensionsBrowserPrivate
{ {
public: public:
bool dataFetched = false;
ExtensionsModel *model; ExtensionsModel *model;
QLineEdit *searchBox; QLineEdit *searchBox;
QListView *extensionsView; QListView *extensionsView;
@@ -256,6 +258,7 @@ public:
QSortFilterProxyModel *filterProxyModel; QSortFilterProxyModel *filterProxyModel;
int columnsCount = 2; int columnsCount = 2;
Tasking::TaskTreeRunner taskTreeRunner; Tasking::TaskTreeRunner taskTreeRunner;
SpinnerSolution::Spinner *m_spinner;
}; };
ExtensionsBrowser::ExtensionsBrowser(QWidget *parent) ExtensionsBrowser::ExtensionsBrowser(QWidget *parent)
@@ -311,6 +314,8 @@ ExtensionsBrowser::ExtensionsBrowser(QWidget *parent)
WelcomePageHelpers::setBackgroundColor(d->extensionsView->viewport(), WelcomePageHelpers::setBackgroundColor(d->extensionsView->viewport(),
Theme::Token_Background_Default); Theme::Token_Background_Default);
d->m_spinner = new SpinnerSolution::Spinner(SpinnerSolution::SpinnerSize::Large, this);
auto updateModel = [this] { auto updateModel = [this] {
d->filterProxyModel->sort(0); d->filterProxyModel->sort(0);
@@ -324,8 +329,6 @@ ExtensionsBrowser::ExtensionsBrowser(QWidget *parent)
}; };
connect(PluginManager::instance(), &PluginManager::pluginsChanged, this, updateModel); connect(PluginManager::instance(), &PluginManager::pluginsChanged, this, updateModel);
connect(PluginManager::instance(), &PluginManager::initializationDone,
this, &ExtensionsBrowser::fetchExtensions);
connect(d->searchBox, &QLineEdit::textChanged, connect(d->searchBox, &QLineEdit::textChanged,
d->filterProxyModel, &QSortFilterProxyModel::setFilterWildcard); d->filterProxyModel, &QSortFilterProxyModel::setFilterWildcard);
} }
@@ -362,6 +365,15 @@ int ExtensionsBrowser::extraListViewWidth() const
+ 1; // Needed + 1; // Needed
} }
void ExtensionsBrowser::showEvent(QShowEvent *event)
{
if (!d->dataFetched) {
d->dataFetched = true;
fetchExtensions();
}
QWidget::showEvent(event);
}
void ExtensionsBrowser::fetchExtensions() void ExtensionsBrowser::fetchExtensions()
{ {
#ifdef WITH_TESTS #ifdef WITH_TESTS
@@ -372,7 +384,7 @@ void ExtensionsBrowser::fetchExtensions()
using namespace Tasking; using namespace Tasking;
const auto onQuerySetup = [](NetworkQuery &query) { const auto onQuerySetup = [this](NetworkQuery &query) {
const QString host = "https://qc-extensions.qt.io"; const QString host = "https://qc-extensions.qt.io";
const QString url = "%1/api/v1/search?request="; const QString url = "%1/api/v1/search?request=";
const QString requestTemplate const QString requestTemplate
@@ -382,10 +394,10 @@ void ExtensionsBrowser::fetchExtensions()
.arg(QSysInfo::productType()) .arg(QSysInfo::productType())
.arg(QSysInfo::productVersion()) .arg(QSysInfo::productVersion())
.arg(QSysInfo::currentCpuArchitecture()); .arg(QSysInfo::currentCpuArchitecture());
query.setRequest(QNetworkRequest(QUrl::fromUserInput(request))); query.setRequest(QNetworkRequest(QUrl::fromUserInput(request)));
query.setNetworkAccessManager(NetworkAccessManager::instance()); query.setNetworkAccessManager(NetworkAccessManager::instance());
qCDebug(browserLog).noquote() << "Sending request:" << request; qCDebug(browserLog).noquote() << "Sending request:" << request;
d->m_spinner->show();
}; };
const auto onQueryDone = [this](const NetworkQuery &query, DoneWith result) { const auto onQueryDone = [this](const NetworkQuery &query, DoneWith result) {
const QByteArray response = query.reply()->readAll(); const QByteArray response = query.reply()->readAll();
@@ -396,6 +408,7 @@ void ExtensionsBrowser::fetchExtensions()
qCDebug(browserLog).noquote() << response; qCDebug(browserLog).noquote() << response;
d->model->setExtensionsJson({}); d->model->setExtensionsJson({});
} }
d->m_spinner->hide();
}; };
Group group { Group group {

View File

@@ -28,6 +28,8 @@ public:
int extraListViewWidth() const; // Space for scrollbar, etc. int extraListViewWidth() const; // Space for scrollbar, etc.
void showEvent(QShowEvent *event) override;
signals: signals:
void itemSelected(const QModelIndex &current, const QModelIndex &previous); void itemSelected(const QModelIndex &current, const QModelIndex &previous);