Make curl a required dependency, compilation fails without it
[supertux.git] / src / supertux / menu / addon_menu.cpp
index 704d1d2..7099296 100644 (file)
@@ -24,6 +24,8 @@
 #include "addon/addon_manager.hpp"
 #include "gui/menu.hpp"
 #include "gui/menu_item.hpp"
+#include "gui/menu_manager.hpp"
+#include "supertux/menu/download_dialog.hpp"
 #include "util/gettext.hpp"
 
 namespace {
@@ -91,14 +93,6 @@ AddonMenu::refresh()
   m_installed_addons = m_addon_manager.get_installed_addons();
   m_repository_addons = m_addon_manager.get_repository_addons();
 
-#ifdef GRUMBEL
-  std::sort(m_addons.begin(), m_addons.end(),
-            [](const Addon& lhs, const Addon& rhs)
-            {
-              return lhs.title < lhs.title;
-            });
-#endif
-
   rebuild_menu();
 }
 
@@ -110,7 +104,11 @@ AddonMenu::rebuild_menu()
   add_hl();
 
 
-  if (!m_installed_addons.empty())
+  if (m_installed_addons.empty())
+  {
+    add_inactive(MNID_NOTHING_NEW, _("No Addons installed"));
+  }
+  else
   {
     int idx = 0;
     for (const auto& addon_id : m_installed_addons)
@@ -120,20 +118,12 @@ AddonMenu::rebuild_menu()
       add_toggle(MAKE_INSTALLED_MENU_ID(idx), text, addon.is_enabled());
       idx += 1;
     }
-
-    add_hl();
   }
 
-  if (!m_addon_manager.has_online_support())
-  {
-    add_inactive(MNID_CHECK_ONLINE, std::string(_("Check Online (disabled)")));
-  }
-  else
-  {
-    add_entry(MNID_CHECK_ONLINE, std::string(_("Check Online")));
-  }
+  add_hl();
 
   {
+    bool have_new_stuff = false;
     int idx = 0;
     for (const auto& addon_id : m_repository_addons)
     {
@@ -154,20 +144,35 @@ AddonMenu::rebuild_menu()
                     << installed_addon.get_version() << "' vs '" << addon.get_version() << "'"
                     << std::endl;
           std::string text = generate_menu_item_text(addon);
-          add_entry(MAKE_REPOSITORY_MENU_ID(idx), "Install " + text + " *NEW*");
-          idx += 1;
+          add_entry(MAKE_REPOSITORY_MENU_ID(idx), str(boost::format( _("Install %s *NEW*") ) % text));
+          have_new_stuff = true;
         }
       }
       catch(const std::exception& err)
       {
         // addon is not installed
         std::string text = generate_menu_item_text(addon);
-        add_entry(MAKE_REPOSITORY_MENU_ID(idx), "Install " + text);
-        idx += 1;
+        add_entry(MAKE_REPOSITORY_MENU_ID(idx), str(boost::format( _("Install %s") ) % text));
+        have_new_stuff = true;
       }
+      idx += 1;
+    }
+
+    if (!have_new_stuff && m_addon_manager.has_been_updated())
+    {
+      add_inactive(MNID_NOTHING_NEW, _("No new Addons found"));
     }
   }
 
+  if (!m_addon_manager.has_online_support())
+  {
+    add_inactive(MNID_CHECK_ONLINE, std::string(_("Check Online (disabled)")));
+  }
+  else
+  {
+    add_entry(MNID_CHECK_ONLINE, std::string(_("Check Online")));
+  }
+
   add_hl();
   add_back(_("Back"));
 }
@@ -179,8 +184,18 @@ AddonMenu::menu_action(MenuItem* item)
   {
     try
     {
-      m_addon_manager.check_online();
-      refresh();
+      TransferStatusPtr status = m_addon_manager.request_check_online();
+      status->then(
+        [this](bool success)
+        {
+          if (success)
+          {
+            refresh();
+          }
+        });
+      std::unique_ptr<DownloadDialog> dialog(new DownloadDialog(status));
+      dialog->set_title("Downloading Add-On Repository Index");
+      MenuManager::instance().set_dialog(std::move(dialog));
     }
     catch (std::exception& e)
     {
@@ -213,22 +228,35 @@ AddonMenu::menu_action(MenuItem* item)
       if (0 <= idx && idx < static_cast<int>(m_repository_addons.size()))
       {
         const Addon& addon = m_addon_manager.get_repository_addon(m_repository_addons[idx]);
-        try
-        {
-          m_addon_manager.install_addon(addon.get_id());
-          m_addon_manager.enable_addon(addon.get_id());
-        }
-        catch(const std::exception& err)
-        {
-          log_warning << "Enabling addon failed: " << err.what() << std::endl;
-        }
-        refresh();
+        auto addon_id = addon.get_id();
+        TransferStatusPtr status = m_addon_manager.request_install_addon(addon_id);
+
+        status->then(
+          [this, addon_id](bool success)
+          {
+            if (success)
+            {
+              try
+              {
+                m_addon_manager.enable_addon(addon_id);
+              }
+              catch(const std::exception& err)
+              {
+                log_warning << "Enabling addon failed: " << err.what() << std::endl;
+              }
+              refresh();
+            }
+          });
+
+        std::unique_ptr<DownloadDialog> dialog(new DownloadDialog(status));
+        dialog->set_title("Downloading " + generate_menu_item_text(addon));
+        MenuManager::instance().set_dialog(std::move(dialog));
       }
     }
   }
   else
   {
-       log_warning << "Unknown menu item clicked: " << item->id << std::endl;
+    log_warning << "Unknown menu item clicked: " << item->id << std::endl;
   }
 }