Added settings registry and settings menu

This commit is contained in:
WerWolv
2021-01-11 20:31:40 +01:00
parent 8807d6c6f3
commit d68b931013
10 changed files with 197 additions and 1 deletions

View File

@@ -12,6 +12,7 @@ endif()
add_library(libimhex STATIC
source/helpers/event.cpp
source/helpers/utils.cpp
source/helpers/content_registry.cpp
source/providers/provider.cpp

View File

@@ -0,0 +1,38 @@
#pragma once
#include <hex.hpp>
#include <functional>
#include <map>
#include <string>
#include <string_view>
#include <vector>
#include <nlohmann/json.hpp>
namespace hex {
class ContentRegistry {
public:
ContentRegistry() = delete;
struct Settings {
Settings() = delete;
struct Entry {
std::string name;
std::function<bool(nlohmann::json&)> callback;
};
static void load();
static void store();
static void add(std::string_view category, std::string_view name, s64 defaultValue, const std::function<bool(nlohmann::json&)> &callback);
static void add(std::string_view category, std::string_view name, std::string_view defaultValue, const std::function<bool(nlohmann::json&)> &callback);
static std::map<std::string, std::vector<Entry>>& getEntries();
static nlohmann::json& getSettingsData();
};
};
}

View File

@@ -19,7 +19,9 @@ namespace hex {
AppendPatternLanguageCode,
ProjectFileStore,
ProjectFileLoad
ProjectFileLoad,
SettingsChanged
};
struct EventHandler {

View File

@@ -1,10 +1,14 @@
#pragma once
#include <any>
#include <functional>
#include <vector>
#include <helpers/event.hpp>
#include <helpers/content_registry.hpp>
#include <imgui.h>
#include <nlohmann/json.hpp>
namespace hex { class SharedData; }
@@ -31,18 +35,34 @@ namespace hex {
friend void hex::plugin::internal::initializePlugin(SharedData &sharedData);
friend class Window;
template<typename T>
T& getVariable(std::string variableName) {
return std::any_cast<T&>((*this->sharedVariables)[variableName]);
}
template<typename T>
void setVariable(std::string variableName, T value) {
(*this->sharedVariables)[variableName] = value;
}
private:
void initializeData() {
static std::vector<EventHandler> eventHandlersStorage;
static std::vector<std::function<void()>> deferredCallsStorage;
static prv::Provider *currentProviderStorage;
static std::map<std::string, std::vector<ContentRegistry::Settings::Entry>> settingsEntriesStorage;
static std::map<std::string, std::any> sharedVariablesStorage;
static ImVec2 windowPosStorage, windowSizeStorage;
static nlohmann::json settingsJsonStorage;
this->imguiContext = ImGui::GetCurrentContext();
this->eventHandlers = &eventHandlersStorage;
this->deferredCalls = &deferredCallsStorage;
this->currentProvider = &currentProviderStorage;
this->settingsEntries = &settingsEntriesStorage;
this->sharedVariables = &sharedVariablesStorage;
this->settingsJson = &settingsJsonStorage;
this->windowPos = &windowPosStorage;
this->windowSize = &windowSizeStorage;
@@ -53,6 +73,9 @@ namespace hex {
this->eventHandlers = other.eventHandlers;
this->deferredCalls = other.deferredCalls;
this->currentProvider = other.currentProvider;
this->settingsEntries = other.settingsEntries;
this->sharedVariables = other.sharedVariables;
this->settingsJson = other.settingsJson;
this->windowPos = other.windowPos;
this->windowSize = other.windowSize;
@@ -63,9 +86,14 @@ namespace hex {
std::vector<EventHandler> *eventHandlers;
std::vector<std::function<void()>> *deferredCalls;
prv::Provider **currentProvider;
std::map<std::string, std::vector<ContentRegistry::Settings::Entry>> *settingsEntries;
nlohmann::json *settingsJson;
ImVec2 *windowPos;
ImVec2 *windowSize;
private:
std::map<std::string, std::any> *sharedVariables;
};
}

View File

@@ -0,0 +1,50 @@
#include <helpers/content_registry.hpp>
#include <helpers/shared_data.hpp>
#include <filesystem>
#include <fstream>
namespace hex {
/* Settings */
void ContentRegistry::Settings::load() {
std::ifstream settingsFile(std::filesystem::path(mainArgv[0]).parent_path() / "settings.json");
if (settingsFile.good())
settingsFile >> getSettingsData();
}
void ContentRegistry::Settings::store() {
std::ofstream settingsFile(std::filesystem::path(mainArgv[0]).parent_path() / "settings.json", std::ios::trunc);
settingsFile << getSettingsData();
}
void ContentRegistry::Settings::add(std::string_view category, std::string_view name, s64 defaultValue, const std::function<bool(nlohmann::json&)> &callback) {
ContentRegistry::Settings::getEntries()[category.data()].emplace_back(Entry{ name.data(), callback });
auto &json = (*SharedData::get().settingsJson);
if (!json.contains(category.data()))
json[category.data()] = nlohmann::json::object();
if (!json[category.data()].contains(name.data()))
json[category.data()][name.data()] = defaultValue;
}
void ContentRegistry::Settings::add(std::string_view category, std::string_view name, std::string_view defaultValue, const std::function<bool(nlohmann::json&)> &callback) {
ContentRegistry::Settings::getEntries()[category.data()].emplace_back(Entry{ name.data(), callback });
(*SharedData::get().settingsJson)[category.data()] = nlohmann::json::object();
(*SharedData::get().settingsJson)[category.data()][name.data()] = defaultValue;
}
std::map<std::string, std::vector<ContentRegistry::Settings::Entry>>& ContentRegistry::Settings::getEntries() {
return *SharedData::get().settingsEntries;
}
nlohmann::json& ContentRegistry::Settings::getSettingsData() {
return *SharedData::get().settingsJson;
}
}