From 82a0ef77916be46ae75cf0d6b1c1959c5ce01515 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Tue, 31 Oct 2023 22:05:29 +0100 Subject: [PATCH] First git-enabled package manager dialog --- src/lay/lay/laySaltManagerDialog.cc | 77 ++++++++++++++++++++++++++--- src/lay/lay/laySaltManagerDialog.h | 4 ++ src/tl/tl/tlGit.cc | 2 +- 3 files changed, 74 insertions(+), 9 deletions(-) diff --git a/src/lay/lay/laySaltManagerDialog.cc b/src/lay/lay/laySaltManagerDialog.cc index de2531de8..b034f93e8 100644 --- a/src/lay/lay/laySaltManagerDialog.cc +++ b/src/lay/lay/laySaltManagerDialog.cc @@ -299,7 +299,9 @@ SaltManagerDialog::SaltManagerDialog (QWidget *parent, lay::Salt *salt, const st : QDialog (parent), m_salt_mine_url (salt_mine_url), dm_update_models (this, &SaltManagerDialog::update_models), m_current_tab (-1), - mp_downloaded_target (0) + mp_downloaded_target (0), + dm_mine_update_selected_changed (this, &SaltManagerDialog::do_mine_update_selected_changed), + dm_mine_new_selected_changed (this, &SaltManagerDialog::do_mine_new_selected_changed) { Ui::SaltManagerDialog::setupUi (this); mp_properties_dialog = new lay::SaltGrainPropertiesDialog (this); @@ -1104,8 +1106,12 @@ SaltManagerDialog::current_grains () void SaltManagerDialog::mine_update_selected_changed () { -BEGIN_PROTECTED + dm_mine_update_selected_changed (); +} +void +SaltManagerDialog::do_mine_update_selected_changed () +{ SaltModel *model = dynamic_cast (salt_mine_view_update->model ()); tl_assert (model != 0); @@ -1118,15 +1124,17 @@ BEGIN_PROTECTED details_update_frame->setEnabled (g != 0); get_remote_grain_info (g, details_update_text); - -END_PROTECTED } void SaltManagerDialog::mine_new_selected_changed () { -BEGIN_PROTECTED + dm_mine_new_selected_changed (); +} +void +SaltManagerDialog::do_mine_new_selected_changed () +{ SaltModel *model = dynamic_cast (salt_mine_view_new->model ()); tl_assert (model != 0); @@ -1139,8 +1147,6 @@ BEGIN_PROTECTED details_new_frame->setEnabled (g != 0); get_remote_grain_info (g, details_new_text); - -END_PROTECTED } namespace @@ -1159,6 +1165,55 @@ public: } }; +class FetchGrainInfoProgressAdaptor + : public tl::ProgressAdaptor +{ +public: + FetchGrainInfoProgressAdaptor (SaltGrainDetailsTextWidget *details, const std::string &name, const QString &html) + : mp_details (details), m_name (name), m_html (html) + { + mp_details->setHtml (m_html.arg (QString ())); + m_counter = 0; + } + + virtual void yield (tl::Progress *progress) + { + QCoreApplication::processEvents (QEventLoop::ExcludeUserInputEvents | QEventLoop::WaitForMoreEvents, 100); + + ++m_counter; + std::string all_dots = ".........."; + m_counter = m_counter % all_dots.size (); + std::string dots = std::string (all_dots, 0, m_counter); + mp_details->setHtml (m_html.arg (tl::to_qstring (tl::sprintf (tl::to_string (tr ("Downloading %.0f%% %s")), progress->value (), dots)))); + } + + virtual void trigger (tl::Progress * /*progress*/) + { + // .. nothing yet .. + } + + void error () + { + mp_details->setHtml (m_html.arg (QString ())); + } + + void success () + { + mp_details->setHtml (m_html.arg (QString ())); + } + + bool is_aborted () const + { + return false; + } + +private: + lay::SaltGrainDetailsTextWidget *mp_details; + std::string m_name; + QString m_html; + unsigned int m_counter; +}; + } void @@ -1169,6 +1224,8 @@ SaltManagerDialog::get_remote_grain_info (lay::SaltGrain *g, SaltGrainDetailsTex return; } + tl_assert (m_downloaded_grain.get () == 0); + m_downloaded_grain.reset (0); if (m_downloaded_grain_reader.get ()) { // NOTE: don't delete the reader in the slot it triggered @@ -1192,13 +1249,16 @@ SaltManagerDialog::get_remote_grain_info (lay::SaltGrain *g, SaltGrainDetailsTex "" "

Fetching Package Definition ...

" "

URL: %1

" + "

%2

" "
" "" "" ) .arg (tl::to_qstring (g->url ())); - details->setHtml (html); + details->setHtml (html.arg (QString ())); + + FetchGrainInfoProgressAdaptor pa (details, g->name (), html); std::string url = g->url (); @@ -1263,6 +1323,7 @@ SaltManagerDialog::data_ready () m_salt_mine_grain.reset (0); } catch (tl::Exception &ex) { + m_downloaded_grain.reset (0); show_error (ex); } } diff --git a/src/lay/lay/laySaltManagerDialog.h b/src/lay/lay/laySaltManagerDialog.h index a16662cd9..db3851801 100644 --- a/src/lay/lay/laySaltManagerDialog.h +++ b/src/lay/lay/laySaltManagerDialog.h @@ -188,6 +188,8 @@ private: std::unique_ptr m_downloaded_grain, m_salt_mine_grain; SaltGrainDetailsTextWidget *mp_downloaded_target; std::unique_ptr m_salt_mine_reader; + tl::DeferredMethod dm_mine_update_selected_changed; + tl::DeferredMethod dm_mine_new_selected_changed; SaltGrain *current_grain (); std::vector current_grains (); @@ -199,6 +201,8 @@ private: void show_error (tl::Exception &ex); void salt_mine_download_started (); void salt_mine_download_finished (); + void do_mine_update_selected_changed (); + void do_mine_new_selected_changed (); }; } diff --git a/src/tl/tl/tlGit.cc b/src/tl/tl/tlGit.cc index 2c8ee8b6a..95470580f 100644 --- a/src/tl/tl/tlGit.cc +++ b/src/tl/tl/tlGit.cc @@ -270,7 +270,7 @@ GitObject::read (const std::string &org_url, const std::string &org_filter, cons } } - // @@@ use callback, timeout? + // TODO: use callback, timeout? tl::RelativeProgress progress (tl::to_string (tr ("Download progress")), 10000, 1 /*yield always*/); // build checkout options