Renamed namespaces to all lowercase
[supertux.git] / src / supertux / menu / contrib_menu.cpp
index 39c8c81..5b6ee41 100644 (file)
 
 #include "supertux/menu/contrib_menu.hpp"
 
+#include <physfs.h>
+
+#include "gui/menu_manager.hpp"
+#include "supertux/menu/contrib_world_menu.hpp"
+#include "supertux/title_screen.hpp"
 #include "supertux/world.hpp"
 #include "util/gettext.hpp"
 
-ContribMenu::ContribMenu(const std::vector<std::string>& level_worlds,
-                         std::vector<World*>& contrib_worlds)
+ContribMenu::ContribMenu() :
+  m_contrib_world_menu(),
+  m_contrib_worlds()
 {
+  /** Generating contrib levels list by making use of Level Subset  */
+  std::vector<std::string> level_worlds;
+  char** files = PHYSFS_enumerateFiles("levels/");
+  for(const char* const* filename = files; *filename != 0; ++filename) {
+    std::string filepath = std::string("levels/") + *filename;
+    if(PHYSFS_isDirectory(filepath.c_str()))
+      level_worlds.push_back(filepath);
+  }
+  PHYSFS_freeList(files);
+
   add_label(_("Contrib Levels"));
   add_hl();
 
@@ -34,8 +50,8 @@ ContribMenu::ContribMenu(const std::vector<std::string>& level_worlds,
       world->load(*it + "/info");
       if (!world->hide_from_contribs) 
       {
-        add_entry(i++, world->title);
-        contrib_worlds.push_back(world.release());
+        add_entry(i++, world->get_title());
+        m_contrib_worlds.push_back(world.release());
       }
     }
     catch(std::exception& e)
@@ -48,4 +64,33 @@ ContribMenu::ContribMenu(const std::vector<std::string>& level_worlds,
   add_back(_("Back"));
 }
 
+ContribMenu::~ContribMenu()
+{
+  for(std::vector<World*>::iterator i = m_contrib_worlds.begin(); i != m_contrib_worlds.end(); ++i)
+  {
+    delete *i;
+  }
+  m_contrib_worlds.clear();
+}
+
+void
+ContribMenu::check_menu()
+{
+  int index = check();
+  if (index != -1)
+  {
+    World* world = m_contrib_worlds[index];
+    
+    if (!world->is_levelset) 
+    {
+      TitleScreen::start_game(world);
+    }
+    else 
+    {
+      m_contrib_world_menu.reset(new ContribWorldMenu(*world));
+      MenuManager::push_current(m_contrib_world_menu.get());
+    }
+  }
+}
+
 /* EOF */