Turned AddonManager into a Currenton
authorIngo Ruhnke <grumbel@gmail.com>
Sun, 17 Aug 2014 21:52:12 +0000 (23:52 +0200)
committerIngo Ruhnke <grumbel@gmail.com>
Sun, 17 Aug 2014 21:52:12 +0000 (23:52 +0200)
There is currently a bit of a dependency problem between InputManager,
AddonManager and Config reading that prevents reading of config on
startup.

src/addon/addon_manager.cpp
src/addon/addon_manager.hpp
src/supertux/gameconfig.cpp
src/supertux/gameconfig.hpp
src/supertux/main.cpp
src/supertux/menu/addon_menu.cpp

index c614ddf..70877b5 100644 (file)
@@ -61,13 +61,6 @@ size_t my_curl_physfs_write(void *ptr, size_t size, size_t nmemb, void *f_p)
 }
 #endif
 
-AddonManager&
-AddonManager::get_instance()
-{
-  static AddonManager instance;
-  return instance;
-}
-
 AddonManager::AddonManager() :
   addons(),
   ignored_addon_filenames()
index 3cebc8c..22a2db1 100644 (file)
@@ -20,6 +20,7 @@
 #include <string>
 #include <vector>
 
+#include "util/currenton.hpp"
 #include "util/reader_fwd.hpp"
 #include "util/writer_fwd.hpp"
 
@@ -28,9 +29,12 @@ class Addon;
 /**
  * Checks for, installs and removes Add-ons
  */
-class AddonManager
+class AddonManager : public Currenton<AddonManager>
 {
 public:
+  AddonManager();
+  ~AddonManager();
+
   /**
    * returns a list of installed Add-ons
    */
@@ -77,11 +81,6 @@ public:
   void load_addons();
 
   /**
-   * Returns the shared AddonManager instance
-   */
-  static AddonManager& get_instance();
-
-  /**
    * Write AddonManager configuration to Lisp
    */
   void write(Writer& writer);
@@ -91,12 +90,9 @@ public:
    */
   void read(const Reader& lisp);
 
-protected:
+private:
   std::vector<Addon*> addons;
   std::vector<std::string> ignored_addon_filenames;
-
-  AddonManager();
-  ~AddonManager();
 };
 
 #endif
index f7fa917..8df30bb 100644 (file)
@@ -39,7 +39,7 @@ Config::Config() :
   sound_enabled(true),
   music_enabled(true),
   console_enabled(false),
-  random_seed(0),          // set by time(), by default (unless in config)
+  random_seed(0), // set by time(), by default (unless in config)
   start_level(),
   enable_script_debugger(false),
   start_demo(),
@@ -59,7 +59,9 @@ Config::load()
 
   const lisp::Lisp* config_lisp = root->get_lisp("supertux-config");
   if(!config_lisp)
+  {
     throw std::runtime_error("File is not a supertux-config file");
+  }
 
   config_lisp->get("profile", profile);
   config_lisp->get("show_fps", show_fps);
@@ -68,7 +70,8 @@ Config::load()
   config_lisp->get("random_seed", random_seed);
 
   const lisp::Lisp* config_video_lisp = config_lisp->get_lisp("video");
-  if(config_video_lisp) {
+  if(config_video_lisp)
+  {
     config_video_lisp->get("fullscreen", use_fullscreen);
     std::string video_string;
     config_video_lisp->get("video", video_string);
@@ -95,13 +98,15 @@ Config::load()
   }
 
   const lisp::Lisp* config_control_lisp = config_lisp->get_lisp("control");
-  if(config_control_lisp && InputManager::current()) {
+  if(config_control_lisp && InputManager::current())
+  {
     InputManager::current()->read(*config_control_lisp);
   }
 
   const lisp::Lisp* config_addons_lisp = config_lisp->get_lisp("addons");
-  if(config_addons_lisp) {
-    AddonManager::get_instance().read(*config_addons_lisp);
+  if(config_addons_lisp && AddonManager::current())
+  {
+    AddonManager::current()->read(*config_addons_lisp);
   }
 }
 
@@ -141,15 +146,19 @@ Config::save()
   writer.write("music_enabled", music_enabled);
   writer.end_list("audio");
 
-  if(InputManager::current()) {
+  if (InputManager::current())
+  {
     writer.start_list("control");
     InputManager::current()->write(writer);
     writer.end_list("control");
   }
 
-  writer.start_list("addons");
-  AddonManager::get_instance().write(writer);
-  writer.end_list("addons");
+  if (AddonManager::current())
+  {
+    writer.start_list("addons");
+    AddonManager::current()->write(writer);
+    writer.end_list("addons");
+  }
 
   writer.end_list("supertux-config");
 }
index c26e5a5..ee032d4 100644 (file)
@@ -31,10 +31,10 @@ public:
 
   int profile;
 
-  // the width/height to be used to display the game in fullscreen
+  /** the width/height to be used to display the game in fullscreen */
   Size fullscreen_size;
 
-  // refresh rate for use in fullscreen, 0 for auto
+  /** refresh rate for use in fullscreen, 0 for auto */
   int fullscreen_refresh_rate;
 
   /** the width/height of the window managers window */
@@ -53,7 +53,8 @@ public:
   bool music_enabled;
   bool console_enabled;
 
-  int random_seed;            // initial random seed.  0 ==> set from time()
+  /** initial random seed.  0 ==> set from time() */
+  int random_seed;
 
   /** this variable is set if supertux should start in a specific level */
   std::string start_level;
@@ -61,7 +62,10 @@ public:
   std::string start_demo;
   std::string record_demo;
 
-  std::string locale; /**< force SuperTux language to this locale, e.g. "de". A file "data/locale/xx.po" must exist for this to work. An empty string means autodetect. */
+  /** force SuperTux language to this locale, e.g. "de". A file
+      "data/locale/xx.po" must exist for this to work. An empty string
+      means autodetect. */
+  std::string locale; 
 };
 
 #endif
index b1e7563..5fc1db1 100644 (file)
@@ -309,7 +309,8 @@ Main::launch_game()
   Resources resources;
 
   timelog("addons");
-  AddonManager::get_instance().load_addons();
+  AddonManager addon_manager;
+  addon_manager.load_addons();
 
   timelog(0);
 
index a32d783..8ec3f4b 100644 (file)
@@ -46,7 +46,7 @@ AddonMenu::refresh()
 {
   clear();
 
-  AddonManager& adm = AddonManager::get_instance();
+  AddonManager& adm = *AddonManager::current();
 
   // refresh list of addons
   m_addons = adm.get_addons();
@@ -134,7 +134,7 @@ AddonMenu::menu_action(MenuItem* item)
   {
     try
     {
-      AddonManager::get_instance().check_online();
+      AddonManager::current()->check_online();
       refresh();
       set_active_item(index);
     }
@@ -153,7 +153,7 @@ AddonMenu::menu_action(MenuItem* item)
       {
         try
         {
-          AddonManager::get_instance().install(&addon);
+          AddonManager::current()->install(&addon);
         }
         catch (std::exception& e)
         {
@@ -165,7 +165,7 @@ AddonMenu::menu_action(MenuItem* item)
       {
         try
         {
-          AddonManager::get_instance().enable(&addon);
+          AddonManager::current()->enable(&addon);
         }
         catch (std::exception& e)
         {
@@ -177,7 +177,7 @@ AddonMenu::menu_action(MenuItem* item)
       {
         try
         {
-          AddonManager::get_instance().disable(&addon);
+          AddonManager::current()->disable(&addon);
         }
         catch (std::exception& e)
         {