//////////////////////////////////////////////////////////////////////////////// // Copyright (C) 2018 Leo Tenenbaum // This file is part of GraphColoring. // // GraphColoring 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. // // GraphColoring 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 GraphColoring. If not, see . //////////////////////////////////////////////////////////////////////////////// #include "graphcoloring.hpp" #include "utils/windows.hpp" #include "utils/filesystem.hpp" #include namespace graphcoloring { namespace filesystem = utils::filesystem; const std::string GraphColoring::TITLE = "Graph Coloring"; GraphColoring::GraphColoring() : state(State::MAIN_MENU) { window = new gui::Window("Graph Coloring", 800, 600); CheckSaves(); window->OnActivate([this] (){ SwitchToMainMenu(); }); } GraphColoring::~GraphColoring() { DeleteAll(); delete window; } void GraphColoring::CheckSaves() { if (filesystem::directory_exists("saves")) { // Check for version mismatch pugi::xml_document saves_document; saves_document.load_file(LevelSelect::LEVEL_LISTING_PATH); pugi::xml_document assets_document; assets_document.load_file("assets/levels/level-list.xml"); std::string saves_version( saves_document.child("category-listing") .attribute("version").value()); std::string assets_version( assets_document.child("category-listing") .attribute("version").value()); if (saves_version != assets_version) { // Copy new level list. filesystem::remove_file(LevelSelect::LEVEL_LISTING_PATH); filesystem::copy_file( "assets/levels/level-list.xml", LevelSelect::LEVEL_LISTING_PATH); } return; } // Create saves directory filesystem::create_directory("saves"); filesystem::copy_file( "assets/levels/level-list.xml", LevelSelect::LEVEL_LISTING_PATH); pugi::xml_document document; document.load_file(LevelSelect::LEVEL_LISTING_PATH); for (pugi::xml_node category : document.child("category-listing").children("category")) { std::stringstream filename; filename << "saves/" << category.attribute("id").value(); filesystem::create_directory(filename.str()); } } void GraphColoring::DeleteAll() { mainMenu = nullptr; levelSelect = nullptr; level = nullptr; window->RemoveAllCallbacks(); } void GraphColoring::SwitchToMainMenu() { DeleteAll(); mainMenu = std::make_unique(window, [this] (){ SwitchToLevelSelect(); }); window->SetKeyupCallback([this] (gui::Window*){ // Press Escape to quit window->Quit(); }, GDK_KEY_Escape); } void GraphColoring::SwitchToLevelSelect() { DeleteAll(); auto callback = [this](std::string category_id,std::string level_id) { SwitchToLevel(category_id, level_id); }; levelSelect = std::make_unique(window, callback); window->SetKeyupCallback([this] (gui::Window*){ // Press Escape to go back to menu SwitchToMainMenu(); }, GDK_KEY_Escape); } void GraphColoring::SwitchToLevel(std::string category_id, std::string level_id) { DeleteAll(); level = std::make_unique(window, category_id, level_id); window->SetKeyupCallback([this] (gui::Window*) { // Press Escape to go back to level selection level->Save(); SwitchToLevelSelect(); }, GDK_KEY_Escape); window->SetKeyupCallback([this] (gui::Window*) { // Press Control-N to go to the next level if (!window->IsControlDown()) return; level->Save(); std::pair next_level = level->NextLevel(); if (next_level.first.empty()) // No next level SwitchToLevelSelect(); else SwitchToLevel(next_level.first, next_level.second); }, GDK_KEY_n); } void GraphColoring::Start() { window->Mainloop(); } } // namespace graphcoloring