diff --git a/src/plugins/vcpkg/vcpkgsearch.cpp b/src/plugins/vcpkg/vcpkgsearch.cpp index d5e300893f4..d0d1db5ae29 100644 --- a/src/plugins/vcpkg/vcpkgsearch.cpp +++ b/src/plugins/vcpkg/vcpkgsearch.cpp @@ -7,7 +7,12 @@ #include "vcpkgsettings.h" #include "vcpkgtr.h" +#include +#include +#include + #include +#include #include #include #include @@ -37,6 +42,7 @@ private: void listPackages(const QString &filter); void showPackageDetails(const QString &packageName); void updateStatus(); + void updatePackages(); VcpkgManifests m_allPackages; VcpkgManifest m_selectedPackage; @@ -52,6 +58,8 @@ private: QLabel *m_vcpkgHomepage; InfoLabel *m_infoLabel; QDialogButtonBox *m_buttonBox; + SpinnerSolution::Spinner *m_spinner; + Tasking::TaskTreeRunner m_taskTreeRunner; }; VcpkgPackageSearchDialog::VcpkgPackageSearchDialog(const VcpkgManifest &preexistingPackages, @@ -112,10 +120,10 @@ VcpkgPackageSearchDialog::VcpkgPackageSearchDialog(const VcpkgManifest &preexist }.attachTo(this); // clang-format on - m_allPackages = vcpkgManifests(settings().vcpkgRoot()); + m_spinner = new SpinnerSolution::Spinner(SpinnerSolution::SpinnerSize::Large, this); - listPackages({}); updateStatus(); + updatePackages(); connect(m_packagesFilter, &FancyLineEdit::filterChanged, this, &VcpkgPackageSearchDialog::listPackages); @@ -177,6 +185,38 @@ void VcpkgPackageSearchDialog::updateStatus() || isProjectDependency)); } +void VcpkgPackageSearchDialog::updatePackages() +{ + using ResultType = VcpkgManifests; + + const auto parseManifests = [=](QPromise &promise, const FilePath &srcPath) { + promise.addResult(vcpkgManifests(srcPath)); + }; + + using namespace Tasking; + Group group { + onGroupSetup([this]() { + m_spinner->show(); + }), + AsyncTask{ + [parseManifests](Async &task) { + task.setConcurrentCallData(parseManifests, + settings().vcpkgRoot()); + }, + [this](const Async &task) { + m_allPackages = task.result(); + } + }, + onGroupDone([this]() { + m_spinner->hide(); + listPackages({}); + updateStatus(); + }), + }; + + m_taskTreeRunner.start(group); +} + VcpkgManifest parseVcpkgManifest(const QByteArray &vcpkgManifestJsonData, bool *ok) { // https://learn.microsoft.com/en-us/vcpkg/reference/vcpkg-json