Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions data/gui/screens/addons_screen.stkgui
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
<stkgui>
<div x="1%" y="0" width="98%" layout="horizontal-row" height="9%">
<icon-button id="back" height="100%" icon_align="left" icon="gui/icons/back.png"/>
<spacer proportion="0.1" height="1"/>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stick to using integers for GUI proportions. You can change the value for other elements if needed to achieve desired relative proportions.

<icon-button id="download_all" height="100%" icon="gui/icons/package-update.png" icon_align="left"/>
<spacer proportion="1" height="1"/>
<icon-button id="reload" y="5%" height="90%" icon_align="right" icon="gui/icons/restart.png"/>
</div>
Expand Down
32 changes: 32 additions & 0 deletions src/states_screens/addons_screen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -427,6 +428,24 @@ void AddonsScreen::eventCallback(GUIEngine::Widget* widget,
StateManager::get()->escapePressed();
}

else if (name == "download_all") {
GUIEngine::ListWidget *list =
getWidget<GUIEngine::ListWidget>("list_addons");
int item_count = list->getItemCount();
irr::gui::CGUISTKListBox *listbox =
list->getIrrlichtElement<irr::gui::CGUISTKListBox>();
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)
Expand Down Expand Up @@ -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)
{
Expand Down
7 changes: 7 additions & 0 deletions src/states_screens/addons_screen.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
#include "guiengine/widgets/list_widget.hpp"
#include "guiengine/widgets/text_box_widget.hpp"

#include <list>

/* used for the installed/unsinstalled icons*/
namespace irr { namespace gui { class STKModifiedSpriteBank; } }

Expand Down Expand Up @@ -59,6 +61,9 @@ class AddonsScreen : public GUIEngine::Screen,
/** Icon for 'loading' */
int m_icon_loading;

std::list<std::string> m_addon_queue;
AddonsLoading * m_addons_loading;

irr::gui::STKModifiedSpriteBank
*m_icon_bank;

Expand All @@ -73,6 +78,8 @@ class AddonsScreen : public GUIEngine::Screen,

bool m_sort_desc;

bool m_cancelled;

/** List of date filters **/
std::vector<DateFilter> m_date_filters;

Expand Down
3 changes: 3 additions & 0 deletions src/states_screens/dialogs/addons_loading.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -371,6 +372,8 @@ void AddonsLoading::stopDownload()
{
m_download_request->cancel();
m_download_request = nullptr;
if (m_cancelled)
*m_cancelled = true;
}
} // startDownload

Expand Down
1 change: 1 addition & 0 deletions src/states_screens/dialogs/addons_loading.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ class AddonsLoading : public GUIEngine::ModalDialog
std::shared_ptr<Online::HTTPRequest> m_download_request;

public:
bool * m_cancelled;
AddonsLoading(const std::string &addon_name);

~AddonsLoading();
Expand Down