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;