diff --git a/data/gui/screens/addons_screen.stkgui b/data/gui/screens/addons_screen.stkgui index 0e5cab6dda8..a500f61d394 100644 --- a/data/gui/screens/addons_screen.stkgui +++ b/data/gui/screens/addons_screen.stkgui @@ -2,6 +2,8 @@
+ +
diff --git a/src/states_screens/addons_screen.cpp b/src/states_screens/addons_screen.cpp index 6ed51e55edb..cf5db7f11e9 100644 --- a/src/states_screens/addons_screen.cpp +++ b/src/states_screens/addons_screen.cpp @@ -44,6 +44,7 @@ using namespace Online; AddonsScreen::AddonsScreen() : Screen("addons_screen.stkgui") { m_selected_index = -1; + m_addons_loading = NULL; // Add date filters. // I18N: Time filters for add-ons @@ -427,6 +428,24 @@ void AddonsScreen::eventCallback(GUIEngine::Widget* widget, StateManager::get()->escapePressed(); } + else if (name == "download_all") { + GUIEngine::ListWidget *list = + getWidget("list_addons"); + int item_count = list->getItemCount(); + irr::gui::CGUISTKListBox *listbox = + list->getIrrlichtElement(); + m_cancelled = false; + + for (int i = 0; i < item_count; i++) { + std::string id = listbox->getItem(i).m_internal_name; + Addon *addon = addons_manager->getAddon(id); + + if (addon != NULL && (!addon->isInstalled() || addon->needsUpdate())) { + m_addon_queue.push_back(id); + } + } + } + else if (name == "reload") { if (!m_reloading) @@ -503,6 +522,19 @@ void AddonsScreen::onUpdate(float dt) { #ifndef SERVER_ONLY NewsManager::get()->joinDownloadThreadIfExit(); + if (m_cancelled) + { + m_addon_queue.clear(); + } + + if (m_addon_queue.size() > 0 && !m_addons_loading) + { + m_addons_loading = new AddonsLoading(m_addon_queue.front()); + m_addon_queue.pop_front(); + m_addons_loading->tryInstall(); + m_addons_loading->m_cancelled = &m_cancelled; + m_addons_loading = NULL; + } if (m_reloading) { diff --git a/src/states_screens/addons_screen.hpp b/src/states_screens/addons_screen.hpp index c61657bcc7a..8a20069f576 100644 --- a/src/states_screens/addons_screen.hpp +++ b/src/states_screens/addons_screen.hpp @@ -23,6 +23,8 @@ #include "guiengine/widgets/list_widget.hpp" #include "guiengine/widgets/text_box_widget.hpp" +#include + /* used for the installed/unsinstalled icons*/ namespace irr { namespace gui { class STKModifiedSpriteBank; } } @@ -59,6 +61,9 @@ class AddonsScreen : public GUIEngine::Screen, /** Icon for 'loading' */ int m_icon_loading; + std::list m_addon_queue; + AddonsLoading * m_addons_loading; + irr::gui::STKModifiedSpriteBank *m_icon_bank; @@ -73,6 +78,8 @@ class AddonsScreen : public GUIEngine::Screen, bool m_sort_desc; + bool m_cancelled; + /** List of date filters **/ std::vector m_date_filters; diff --git a/src/states_screens/dialogs/addons_loading.cpp b/src/states_screens/dialogs/addons_loading.cpp index 5361018750b..e005a05c226 100644 --- a/src/states_screens/dialogs/addons_loading.cpp +++ b/src/states_screens/dialogs/addons_loading.cpp @@ -62,6 +62,7 @@ AddonsLoading::AddonsLoading(const std::string &id) , m_addon(*(addons_manager->getAddon(id)) ) #endif { + m_cancelled = NULL; m_message_shown = false; m_icon_shown = false; #ifdef SERVER_ONLY @@ -371,6 +372,8 @@ void AddonsLoading::stopDownload() { m_download_request->cancel(); m_download_request = nullptr; + if (m_cancelled) + *m_cancelled = true; } } // startDownload diff --git a/src/states_screens/dialogs/addons_loading.hpp b/src/states_screens/dialogs/addons_loading.hpp index 9d6ad773aa6..db81c8b4e81 100644 --- a/src/states_screens/dialogs/addons_loading.hpp +++ b/src/states_screens/dialogs/addons_loading.hpp @@ -60,6 +60,7 @@ class AddonsLoading : public GUIEngine::ModalDialog std::shared_ptr m_download_request; public: + bool * m_cancelled; AddonsLoading(const std::string &addon_name); ~AddonsLoading();