ConfigManager :D

This commit is contained in:
zetaPRIME 2017-01-17 23:35:39 -05:00
parent 50f61e7587
commit 64fa28689f
7 changed files with 169 additions and 6 deletions

View File

@ -3,11 +3,16 @@
#include <3ds.h> #include <3ds.h>
#include "starlight/GFXManager.h" #include "starlight/GFXManager.h"
#include "starlight/ConfigManager.h"
#include "starlight/ThemeManager.h" #include "starlight/ThemeManager.h"
#include "starlight/InputManager.h" #include "starlight/InputManager.h"
#include "starlight/gfx/RenderCore.h" #include "starlight/gfx/RenderCore.h"
using std::string;
using starlight::GFXManager; using starlight::GFXManager;
using starlight::ConfigManager;
using starlight::Config;
using starlight::ThemeManager; using starlight::ThemeManager;
using starlight::InputManager; using starlight::InputManager;
using starlight::gfx::RenderCore; using starlight::gfx::RenderCore;
@ -29,6 +34,18 @@ bool Application::Quit() {
return _currentApp->_appQuit; return _currentApp->_appQuit;
} }
Config& Application::GetConfig(const string& path) {
const string& appId = (_currentApp != nullptr) ? _currentApp->appId : "null";
string np(path.length() + appId.length() + 4 + 1, ' ');
np.clear();
np.append("app/"); np.append(appId); np.append("/"); np.append(path);
return ConfigManager::Get(np);
}
string Application::AppName() {
return (_currentApp != nullptr) ? _currentApp->appId : "null";
}
////////////////////// //////////////////////
// INSTANCE MEMBERS // // INSTANCE MEMBERS //
////////////////////// //////////////////////
@ -47,6 +64,7 @@ void Application::Run() {
void Application::_init() { void Application::_init() {
srand(time(NULL)); srand(time(NULL));
romfsInit(); romfsInit();
ConfigManager::Init();
RenderCore::Open(); RenderCore::Open();
touchScreen = std::make_shared<TouchScreenCanvas>(); touchScreen = std::make_shared<TouchScreenCanvas>();
@ -59,6 +77,7 @@ void Application::_end() {
End(); End();
RenderCore::Close(); RenderCore::Close();
ConfigManager::End();
} }
void Application::_mainLoop() { void Application::_mainLoop() {

View File

@ -11,6 +11,8 @@
#include "starlight/ui/TouchScreenCanvas.h" #include "starlight/ui/TouchScreenCanvas.h"
#include "starlight/ui/TopScreenCanvas.h" #include "starlight/ui/TopScreenCanvas.h"
#include "starlight/ConfigManager.h"
namespace starlight { namespace starlight {
class Application { class Application {
//////////////////// ////////////////////
@ -21,6 +23,8 @@ namespace starlight {
public: public:
static bool Quit(); static bool Quit();
static Config& GetConfig(const std::string& path);
static std::string AppName();
////////////////////// //////////////////////
// INSTANCE MEMBERS // // INSTANCE MEMBERS //
@ -53,4 +57,3 @@ namespace starlight {
virtual void End() { } virtual void End() { }
}; };
} }

View File

@ -0,0 +1,93 @@
#include "ConfigManager.h"
#include <fstream>
#include <cstring>
#include <unistd.h>
#include <sys/stat.h>
#include "starlight/_incLib/json.hpp"
#include "starlight/Application.h"
using std::string;
using std::ifstream;
using std::ofstream;
using starlight::Application;
using starlight::Config;
using starlight::ConfigManager;
// helper stuff
namespace {
void ensureDirectory(const char* path, bool hidden = false) {
struct stat st;
if (stat(path, &st) != 0) {
mkdir(path, 0);
if (hidden) {
// NYI; no idea how to do this, actually :(
}
}
}
void ensureDirectory(const string& path, bool hidden = false) { ensureDirectory(path.c_str(), hidden); }
}
////////////
// Config //
////////////
Config::Config(const string& path) : path(path) {
static const constexpr char* cpfx = "sdmc:/.starlight/config/";
constexpr std::size_t cpfx_s = std::strlen(cpfx);
// reserve string size
fsPath = string(path.length() + cpfx_s + 5, ' '); fsPath.clear();
// and build
fsPath.append(cpfx); fsPath.append(path); fsPath.append(".json");
// init json
this->json = std::make_shared<nlohmann::json>();
Reload();
}
Config::~Config() { }
void Config::Reload() {
ifstream load(fsPath);
if (load.good()) load >> *json;
}
void Config::Save() {
ofstream save(fsPath);
if (save.good()) save << *json;
}
///////////////////
// ConfigManager //
///////////////////
std::unordered_map<std::string, std::shared_ptr<Config>> ConfigManager::cfg;
void ConfigManager::Init() {
ensureDirectory("sdmc:/.starlight/");
ensureDirectory("sdmc:/.starlight/config/");
ensureDirectory("sdmc:/.starlight/config/app/");
ensureDirectory("sdmc:/.starlight/config/app/" + Application::AppName());
}
void ConfigManager::End() {
for (auto it : cfg) {
auto& c = *it.second.get();
if (c.autoSave) c.Save();
}
// actualy, don't clear in case something uses a static get
// in the future, perhaps discard contents
}
Config& ConfigManager::Get(const string& path) {
auto const& itr = cfg.find(path);
if (itr == cfg.end()) {
return *cfg.insert(std::make_pair(path, std::make_shared<Config>(path))).first->second;
} else return *itr->second;
}

View File

@ -0,0 +1,41 @@
#pragma once
#include "starlight/_global.h"
#include <memory>
#include <unordered_map>
#include "starlight/_incLib/json_fwd.hpp"
//#include "starlight/gfx/DrawContext.h"
namespace starlight {
class Config {
private:
std::string fsPath;
std::shared_ptr<nlohmann::json> json;
public:
const std::string path;
bool autoSave = false;
Config(const std::string& path);
~Config();
void Reload();
void Save();
nlohmann::json& Json() { return *json; }
};
class ConfigManager {
private:
static std::unordered_map<std::string, std::shared_ptr<Config>> cfg;
public:
ConfigManager() = delete;
static void Init();
static void End();
static Config& Get(const std::string& path);
};
}

View File

@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
function abort { function abort {
echo Make failed echo Make or send failed
exit exit
} }
cd libstarlight cd libstarlight

View File

@ -2,7 +2,10 @@
#include <3ds.h> #include <3ds.h>
#include "starlight/_incLib/json.hpp"
#include "starlight/InputManager.h" #include "starlight/InputManager.h"
#include "starlight/ConfigManager.h"
#include "starlight/ThemeManager.h" #include "starlight/ThemeManager.h"
#include "starlight/GFXManager.h" #include "starlight/GFXManager.h"
#include "starlight/gfx/RenderCore.h" #include "starlight/gfx/RenderCore.h"
@ -16,8 +19,9 @@ using starlight::Vector2;
using starlight::VRect; using starlight::VRect;
using starlight::Color; using starlight::Color;
using starlight::InputManager; using starlight::InputManager;
using starlight::GFXManager; using starlight::ConfigManager;
using starlight::ThemeManager; using starlight::ThemeManager;
using starlight::GFXManager;
using starlight::gfx::RenderCore; using starlight::gfx::RenderCore;
using starlight::Application; using starlight::Application;
@ -67,6 +71,11 @@ void Core::Init() {
clearColor = Color(0.0f, 0.5f, 0.5f); clearColor = Color(0.0f, 0.5f, 0.5f);
// test config
auto& cc = Application::GetConfig("test");
cc.Json()["panini"] = "yes please!";
cc.Save();
// //
} }
@ -77,4 +86,3 @@ void Core::End() {
void Core::Update() { void Core::Update() {
if (InputManager::Held(KEY_Y) || InputManager::Pressed(KEY_START)) Application::Quit(); if (InputManager::Held(KEY_Y) || InputManager::Pressed(KEY_START)) Application::Quit();
} }

View File

@ -6,7 +6,7 @@ using starlight::Application;
class Core : public Application { class Core : public Application {
public: public:
Core() : Application("starlauncher") { } Core() : Application("testbed") { }
~Core() override = default; ~Core() override = default;
void Init() override; void Init() override;
@ -14,4 +14,3 @@ public:
void Update() override; void Update() override;
}; };