diff --git a/data/gui/addons_loading.stkgui b/data/gui/addons_loading.stkgui
index 73e05330f..351029160 100644
--- a/data/gui/addons_loading.stkgui
+++ b/data/gui/addons_loading.stkgui
@@ -18,15 +18,21 @@
-
+
-
diff --git a/data/gui/package-uninstall.png b/data/gui/package-uninstall.png
new file mode 100644
index 000000000..e65ecd919
Binary files /dev/null and b/data/gui/package-uninstall.png differ
diff --git a/src/guiengine/widgets/ribbon_widget.cpp b/src/guiengine/widgets/ribbon_widget.cpp
index facb229d7..eee870b72 100644
--- a/src/guiengine/widgets/ribbon_widget.cpp
+++ b/src/guiengine/widgets/ribbon_widget.cpp
@@ -419,6 +419,24 @@ void RibbonWidget::clearAllChildren()
// ----------------------------------------------------------------------------
+void RibbonWidget::removeChildNamed(const char* name)
+{
+ // This method should only be called BEFORE a widget is added
+ assert(m_element == NULL);
+
+ Widget* child;
+ for_in (child, m_children)
+ {
+ if (child->m_properties[PROP_ID] == name)
+ {
+ m_children.erase(child);
+ return;
+ }
+ }
+}
+
+// ----------------------------------------------------------------------------
+
void RibbonWidget::select(std::string item, const int mousePlayerID)
{
const int subbuttons_amount = m_children.size();
diff --git a/src/guiengine/widgets/ribbon_widget.hpp b/src/guiengine/widgets/ribbon_widget.hpp
index 4551b3134..d08712652 100644
--- a/src/guiengine/widgets/ribbon_widget.hpp
+++ b/src/guiengine/widgets/ribbon_widget.hpp
@@ -180,6 +180,12 @@ namespace GUIEngine
*/
void clearAllChildren();
+ /**
+ * \brief clear one child from this ribbon
+ * \pre this must be called before RibbonWidget::add, while the widget is not yet displayed
+ */
+ void removeChildNamed(const char* name);
+
PtrVector& getRibbonChildren() { return m_children; }
};
diff --git a/src/states_screens/dialogs/addons_loading.cpp b/src/states_screens/dialogs/addons_loading.cpp
index 4faa7668f..d813487f9 100644
--- a/src/states_screens/dialogs/addons_loading.cpp
+++ b/src/states_screens/dialogs/addons_loading.cpp
@@ -52,19 +52,12 @@ AddonsLoading::AddonsLoading(const float w, const float h,
m_icon = getWidget ("icon" );
m_progress = getWidget("progress");
- m_install_button = getWidget ("install" );
- m_back_button = getWidget ("cancel" );
+ m_install_button = getWidget ("install" );
+ m_back_button = getWidget ("back" );
if(m_progress)
m_progress->setVisible(false);
- if(m_addon.isInstalled())
- {
- if(m_addon.needsUpdate())
- getWidget("install")->setLabel(_("Update"));
- else
- getWidget("install")->setLabel(_("Uninstall"));
- } // if isInstalled
} // AddonsLoading
// ----------------------------------------------------------------------------
@@ -84,8 +77,23 @@ void AddonsLoading::beforeAddingWidgets()
/* Init the icon here to be able to load a single image*/
m_icon = getWidget ("icon" );
m_progress = getWidget("progress");
- m_back_button = getWidget ("cancel" );
+ m_back_button = getWidget ("back" );
+
+ RibbonWidget* r = getWidget("actions");
+
+ if (m_addon.isInstalled())
+ {
+ if (m_addon.needsUpdate())
+ getWidget ("install")->setText( _("Update") );
+ else
+ r->removeChildNamed("install");
+ }
+ else
+ {
+ r->removeChildNamed("uninstall");
+ }
+
getWidget("name")->setText(m_addon.getName().c_str(), false);
getWidget("description")
->setText(m_addon.getDescription().c_str());
@@ -159,6 +167,8 @@ void AddonsLoading::beforeAddingWidgets()
getWidget("size")->setText(size, false);
} // AddonsLoading
+// ----------------------------------------------------------------------------
+
void AddonsLoading::init()
{
GUIEngine::LabelWidget* flags = getWidget("flags");
@@ -180,7 +190,7 @@ void AddonsLoading::escapePressed()
GUIEngine::EventPropagation
AddonsLoading::processEvent(const std::string& event_source)
{
- if(event_source == "cancel")
+ if(event_source == "back")
{
// Cancel a download only if we are installing/upgrading one
// (and not uninstalling an installed one):
@@ -207,13 +217,17 @@ GUIEngine::EventPropagation
m_progress->setVisible(true);
// Change the 'back' button into a 'cancel' button.
m_back_button->setText(_("Cancel"));
- m_install_button->setVisible(false);
+
+ RibbonWidget* r = getWidget("actions");
+ r->setVisible(false);
+
startDownload();
}
- else // uninstall
- {
- doInstall();
- }
+ return GUIEngine::EVENT_BLOCK;
+ }
+ else if (event_source == "uninstall")
+ {
+ doUninstall();
return GUIEngine::EVENT_BLOCK;
}
return GUIEngine::EVENT_LET;
@@ -275,36 +289,62 @@ void AddonsLoading::doInstall()
delete m_download_request;
m_download_request = NULL;
bool error=false;
- if(!m_addon.isInstalled() || m_addon.needsUpdate())
+
+ assert(!m_addon.isInstalled() || m_addon.needsUpdate());
+ error = !addons_manager->install(m_addon);
+ if(error)
{
- error = !addons_manager->install(m_addon);
- if(error)
- {
- core::stringw msg = StringUtils::insertValues(
- _("Problems installing the addon '%s'."),
- core::stringw(m_addon.getName().c_str()));
- m_back_button->setText(msg.c_str());
- }
- }
- else
- {
- error = !addons_manager->uninstall(m_addon);
- if(error)
- {
- printf("[addons]Directory '%s' can not be removed.\n",
- m_addon.getDataDir().c_str());
- printf("[addons]Please remove this directory manually.\n");
- core::stringw msg = StringUtils::insertValues(
- _("Problems removing the addon '%s'."),
- core::stringw(m_addon.getName().c_str()));
- m_back_button->setText(msg.c_str());
- }
+ core::stringw msg = StringUtils::insertValues(
+ _("Problems installing the addon '%s'."),
+ core::stringw(m_addon.getName().c_str()));
+ m_back_button->setText(msg.c_str());
}
if(error)
{
m_progress->setVisible(false);
- m_install_button->setVisible(true);
+
+ RibbonWidget* r = getWidget("actions");
+ r->setVisible(true);
+
+ m_install_button->setText(_("Try again"));
+ }
+ else
+ {
+ // The list of the addon screen needs to be updated to correctly
+ // display the newly (un)installed addon.
+ AddonsScreen::getInstance()->loadList();
+ dismiss();
+ }
+} // doInstall
+
+// ----------------------------------------------------------------------------
+
+void AddonsLoading::doUninstall()
+{
+ delete m_download_request;
+ m_download_request = NULL;
+ bool error=false;
+
+ error = !addons_manager->uninstall(m_addon);
+ if(error)
+ {
+ printf("[addons]Directory '%s' can not be removed.\n",
+ m_addon.getDataDir().c_str());
+ printf("[addons]Please remove this directory manually.\n");
+ core::stringw msg = StringUtils::insertValues(
+ _("Problems removing the addon '%s'."),
+ core::stringw(m_addon.getName().c_str()));
+ m_back_button->setText(msg.c_str());
+ }
+
+ if(error)
+ {
+ m_progress->setVisible(false);
+
+ RibbonWidget* r = getWidget("actions");
+ r->setVisible(true);
+
m_install_button->setText(_("Try again"));
}
else
diff --git a/src/states_screens/dialogs/addons_loading.hpp b/src/states_screens/dialogs/addons_loading.hpp
index 7b90d65a6..8fbad2c83 100644
--- a/src/states_screens/dialogs/addons_loading.hpp
+++ b/src/states_screens/dialogs/addons_loading.hpp
@@ -36,8 +36,8 @@ class AddonsLoading : public GUIEngine::ModalDialog
private:
GUIEngine::LabelWidget *m_state;
GUIEngine::ProgressBarWidget *m_progress;
- GUIEngine::ButtonWidget *m_back_button;
- GUIEngine::ButtonWidget *m_install_button;
+ GUIEngine::IconButtonWidget *m_back_button;
+ GUIEngine::IconButtonWidget *m_install_button;
GUIEngine::IconButtonWidget *m_icon;
@@ -45,7 +45,8 @@ private:
Addon m_addon;
void startDownload();
void doInstall();
-
+ void doUninstall();
+
/** True if the icon is being displayed. */
bool m_icon_shown;