Added AddonDialog and connected it into the whole non-blocking update stuff
authorIngo Ruhnke <grumbel@gmail.com>
Tue, 26 Aug 2014 04:59:30 +0000 (06:59 +0200)
committerIngo Ruhnke <grumbel@gmail.com>
Tue, 26 Aug 2014 22:57:44 +0000 (00:57 +0200)
src/addon/addon_manager.cpp
src/addon/addon_manager.hpp
src/addon/downloader.cpp
src/gui/dialog.hpp
src/gui/menu_manager.cpp
src/supertux/menu/addon_dialog.cpp [new file with mode: 0644]
src/supertux/menu/addon_dialog.hpp [new file with mode: 0644]
src/supertux/menu/addon_menu.cpp

index 8665093..62e8a7c 100644 (file)
@@ -571,4 +571,16 @@ AddonManager::update()
   }
 }
 
+void
+AddonManager::abort_install()
+{
+  log_info << "addon install aborted" << std::endl;
+
+  m_downloader.abort(m_transfer_status->id);
+
+  m_install_request = {};
+  m_install_status = {};
+  m_transfer_status = {};
+}
+
 /* EOF */
index c5e65f8..a58f38c 100644 (file)
@@ -97,6 +97,7 @@ public:
   Addon& get_installed_addon(const AddonId& addon);
 
   InstallStatusPtr request_install_addon(const AddonId& addon_id);
+  void abort_install();
   void install_addon(const AddonId& addon_id);
   void uninstall_addon(const AddonId& addon_id);
 
index f1378bf..f40a141 100644 (file)
@@ -130,7 +130,7 @@ public:
 
   size_t on_data(void* ptr, size_t size, size_t nmemb)
   {
-    return 0;
+    return size * nmemb;;
   }
 
   void on_progress(curl_off_t dltotal, curl_off_t dlnow,
@@ -244,7 +244,9 @@ Downloader::update()
   CURLMcode ret;
   int running_handles;
   while((ret = curl_multi_perform(m_multi_handle, &running_handles)) == CURLM_CALL_MULTI_PERFORM)
-  {}
+  {
+    log_debug << "updating" << std::endl;
+  }
 
   // check if any downloads got finished
   int msgs_in_queue;
index 7366141..bb379c1 100644 (file)
@@ -53,6 +53,7 @@ public:
   void event(const SDL_Event& event);
   void process_input(const Controller& controller);
   void draw(DrawingContext& context);
+  virtual void update() {}
 
 private:
   void on_button_click(int button) const;
index 1bd6330..b493ba6 100644 (file)
@@ -199,6 +199,7 @@ MenuManager::draw(DrawingContext& context)
   {
     if (m_dialog)
     {
+      m_dialog->update();
       m_dialog->draw(context);
     }
     else if (current_menu())
diff --git a/src/supertux/menu/addon_dialog.cpp b/src/supertux/menu/addon_dialog.cpp
new file mode 100644 (file)
index 0000000..bf0e005
--- /dev/null
@@ -0,0 +1,60 @@
+//  SuperTux
+//  Copyright (C) 2014 Ingo Ruhnke <grumbel@gmail.com>
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 3 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+#include "supertux/menu/addon_dialog.hpp"
+
+#include <sstream>
+
+#include "gui/menu_manager.hpp"
+#include "util/gettext.hpp"
+
+AddonDialog::AddonDialog(AddonManager::InstallStatusPtr status) :
+  m_status(status)
+{
+  add_button(_("Abort Download"), [this]{
+      on_abort();
+    });
+
+  update_text();
+}
+
+void
+AddonDialog::update()
+{
+  AddonManager::current()->update();
+
+  if (m_status->done)
+  {
+    MenuManager::instance().set_dialog({});
+  }
+}
+
+void
+AddonDialog::update_text()
+{
+  std::ostringstream out;
+  out << "Downloading in Progress:\n"
+      << m_status->now << "/" << m_status->total;
+  set_text(out.str());
+}
+
+void
+AddonDialog::on_abort()
+{
+  AddonManager::current()->abort_install();
+}
+
+/* EOF */
diff --git a/src/supertux/menu/addon_dialog.hpp b/src/supertux/menu/addon_dialog.hpp
new file mode 100644 (file)
index 0000000..a450876
--- /dev/null
@@ -0,0 +1,44 @@
+//  SuperTux
+//  Copyright (C) 2014 Ingo Ruhnke <grumbel@gmail.com>
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 3 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+#ifndef HEADER_SUPERTUX_SUPERTUX_MENU_ADDON_DIALOG_HPP
+#define HEADER_SUPERTUX_SUPERTUX_MENU_ADDON_DIALOG_HPP
+
+#include "addon/addon_manager.hpp"
+#include "gui/dialog.hpp"
+
+class AddonDialog : public Dialog
+{
+private:
+  AddonManager::InstallStatusPtr m_status;
+
+public:
+  AddonDialog(AddonManager::InstallStatusPtr status);
+
+  void update() override;
+
+private:
+  void on_abort();
+  void update_text();
+
+private:
+  AddonDialog(const AddonDialog&) = delete;
+  AddonDialog& operator=(const AddonDialog&) = delete;
+};
+
+#endif
+
+/* EOF */
index 91636f2..fa76a49 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/addon_dialog.hpp"
 #include "util/gettext.hpp"
 
 namespace {
@@ -224,6 +226,12 @@ 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]);
+
+        AddonManager::InstallStatusPtr status = m_addon_manager.request_install_addon(addon.get_id());
+
+        std::unique_ptr<AddonDialog> dialog(new AddonDialog(status));
+        MenuManager::instance().set_dialog(std::move(dialog));
+#ifdef GRUMBEL
         try
         {
           m_addon_manager.install_addon(addon.get_id());
@@ -234,6 +242,7 @@ AddonMenu::menu_action(MenuItem* item)
           log_warning << "Enabling addon failed: " << err.what() << std::endl;
         }
         refresh();
+#endif
       }
     }
   }