X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fsupertux%2Fmenu%2Fcontrib_menu.cpp;h=34895b73dae9f11e7f4b91f0170f7fbae4fa2052;hb=33c9a30be6a351fe21a3eb702a7fa90acd43a741;hp=39c8c817adba6dda02a0d0782479677f3a77939d;hpb=0924c75572328541fb06c1febcda8b70641fb774;p=supertux.git diff --git a/src/supertux/menu/contrib_menu.cpp b/src/supertux/menu/contrib_menu.cpp index 39c8c817a..34895b73d 100644 --- a/src/supertux/menu/contrib_menu.cpp +++ b/src/supertux/menu/contrib_menu.cpp @@ -16,12 +16,28 @@ #include "supertux/menu/contrib_menu.hpp" +#include + +#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& level_worlds, - std::vector& contrib_worlds) +ContribMenu::ContribMenu() : + m_contrib_world_menu(), + m_contrib_worlds() { + /** Generating contrib levels list by making use of Level Subset */ + std::vector 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,13 +50,13 @@ ContribMenu::ContribMenu(const std::vector& 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) { - log_warning << "Couldn't parse levelset info for '" << *it << "': " << e.what() << std::endl; + log_info << "Couldn't parse levelset info for '" << *it << "': " << e.what() << std::endl; } } @@ -48,4 +64,33 @@ ContribMenu::ContribMenu(const std::vector& level_worlds, add_back(_("Back")); } +ContribMenu::~ContribMenu() +{ + for(std::vector::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 */