You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lunarium_OLD/src/run_modes/editor/project.cpp

180 lines
5.1 KiB
C++

/******************************************************************************
* File - project.cpp
* Author - Joey Pollack
* Date - 2021/11/09 (y/m/d)
* Mod Date - 2021/11/09 (y/m/d)
* Description - Manage data for a game project
******************************************************************************/
#include "project.h"
#include <editor/editor.h>
#include <utils/logger.h>
#include "contents/content_manager.h"
#include <nlohmann/json.hpp>
#include <fstream>
namespace lunarium { namespace editor
{
Project::Project()
: mIsLoaded(false)
{
}
OpRes Project::GenerateProject(std::string name, std::filesystem::path location)
{
if (mIsLoaded)
{
return OpRes::Fail("A project is already loaded. Unload the current project to generate a new one.");
}
mName = name;
mLocation = location;
mLocation /= std::filesystem::path(mName).stem();
if (!std::filesystem::exists(mLocation))
{
std::filesystem::create_directory(mLocation);
}
if (std::filesystem::exists(mLocation / mName))
{
return OpRes::Fail("A project with that name (%s) already exists in this location: %s", mName.c_str(), mLocation.string().c_str());
}
std::filesystem::path proj_doc = mLocation;
proj_doc /= std::filesystem::path(mName);
nlohmann::json j;
auto& p = j["Project"];
p["Name"] = mName;
std::ofstream ofs = std::ofstream(proj_doc.c_str());
if (!ofs.is_open())
{
return OpRes::Fail("Failed to create project file");
}
ofs << std::setw(4) << j;
ofs.close();
std::filesystem::create_directory(mLocation / std::filesystem::path("engine"));
std::filesystem::create_directory(mLocation / std::filesystem::path("contents"));
std::filesystem::create_directory(mLocation / std::filesystem::path("contents/assets"));
std::filesystem::create_directory(mLocation / std::filesystem::path("contents/trash"));
mpContentManager = &ContentManager::GetInstance();
if (Failed(mpContentManager->Load(this).LogIfFailed(Editor::LogCat)))
{
return OpRes::Fail("Could not load project in content manager");
}
mIsLoaded = true;
return OpRes::OK();
}
bool Project::IsLoaded() const
{
return mIsLoaded;
}
OpRes Project::LoadProject(std::filesystem::path location)
{
if (!std::filesystem::exists(location))
{
return OpRes::Fail("Project file does not exist");
}
mLocation = location.parent_path();
mName = location.filename().string();
if (Failed(ContentManager::GetInstance().Load(this).LogIfFailed(Editor::LogCat)))
{
return OpRes::Fail("Could not load project: %s", location.string().c_str());
}
mIsLoaded = true;
return OpRes::OK();
}
void Project::UnloadCurrentProject()
{
mName = "";
mLocation = "";
mIsLoaded = false;
}
void Project::SaveProject()
{
ContentManager::GetInstance().Save().LogIfFailed(Editor::LogCat);
}
const std::string& Project::GetName() const
{
return mName;
}
std::filesystem::path Project::GetRootDirectory() const
{
return mLocation;
}
std::filesystem::path Project::GetContentDirectory() const
{
return mLocation / "contents";
}
std::filesystem::path Project::GetAssetDirectory() const
{
return GetContentDirectory() / "assets";
}
std::filesystem::path Project::GetTrashDirectory() const
{
return GetContentDirectory() / "trash";
}
std::filesystem::path Project::MakeRelativeToRoot(std::filesystem::path abs_path, bool include_root) const
{
return MakeRelativeTo(abs_path, mLocation, include_root);
}
std::filesystem::path Project::MakeRelativeToAssets(std::filesystem::path abs_path, bool include_root) const
{
return MakeRelativeTo(abs_path, GetAssetDirectory(), include_root);
}
std::filesystem::path Project::MakeRelativeTo(std::filesystem::path abs_path, std::filesystem::path rel_to, bool include_root) const
{
// Validate the passed in path
if (!abs_path.is_absolute())
{
if (abs_path.filename() == std::filesystem::path(*rel_to.begin()))
{
// This path is already relative to the project root
return abs_path;
}
Logger::Warn(Editor::LogCat, "Relative path passed into Project::MakeRelativeToRoot: %s", abs_path.string().c_str());
return "";
}
std::filesystem::path new_path;
if (include_root) new_path = rel_to.filename();
for (auto iter = abs_path.begin(); iter != abs_path.end(); iter++)
{
if (rel_to.string().find((*iter).string()) == std::string::npos)
{
new_path /= (*iter);
}
}
return new_path;
}
}}