-
Notifications
You must be signed in to change notification settings - Fork 2.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #4917 from leoetlino/config
New configuration namespace
- Loading branch information
Showing
10 changed files
with
876 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,140 @@ | ||
// Copyright 2016 Dolphin Emulator Project | ||
// Licensed under GPLv2+ | ||
// Refer to the license.txt file included. | ||
|
||
#include <algorithm> | ||
#include <list> | ||
#include <map> | ||
|
||
#include "Common/Assert.h" | ||
#include "Common/Config/Config.h" | ||
|
||
namespace Config | ||
{ | ||
static Layers s_layers; | ||
static std::list<ConfigChangedCallback> s_callbacks; | ||
|
||
void InvokeConfigChangedCallbacks(); | ||
|
||
Section* GetOrCreateSection(System system, const std::string& section_name) | ||
{ | ||
return s_layers[LayerType::Meta]->GetOrCreateSection(system, section_name); | ||
} | ||
|
||
Layers* GetLayers() | ||
{ | ||
return &s_layers; | ||
} | ||
|
||
void AddLayer(std::unique_ptr<Layer> layer) | ||
{ | ||
s_layers[layer->GetLayer()] = std::move(layer); | ||
InvokeConfigChangedCallbacks(); | ||
} | ||
|
||
void AddLayer(std::unique_ptr<ConfigLayerLoader> loader) | ||
{ | ||
AddLayer(std::make_unique<Layer>(std::move(loader))); | ||
} | ||
|
||
void AddLoadLayer(std::unique_ptr<Layer> layer) | ||
{ | ||
layer->Load(); | ||
AddLayer(std::move(layer)); | ||
} | ||
|
||
void AddLoadLayer(std::unique_ptr<ConfigLayerLoader> loader) | ||
{ | ||
AddLoadLayer(std::make_unique<Layer>(std::move(loader))); | ||
} | ||
|
||
Layer* GetLayer(LayerType layer) | ||
{ | ||
if (!LayerExists(layer)) | ||
return nullptr; | ||
return s_layers[layer].get(); | ||
} | ||
|
||
void RemoveLayer(LayerType layer) | ||
{ | ||
s_layers.erase(layer); | ||
InvokeConfigChangedCallbacks(); | ||
} | ||
bool LayerExists(LayerType layer) | ||
{ | ||
return s_layers.find(layer) != s_layers.end(); | ||
} | ||
|
||
void AddConfigChangedCallback(ConfigChangedCallback func) | ||
{ | ||
s_callbacks.emplace_back(func); | ||
} | ||
|
||
void InvokeConfigChangedCallbacks() | ||
{ | ||
for (const auto& callback : s_callbacks) | ||
callback(); | ||
} | ||
|
||
// Explicit load and save of layers | ||
void Load() | ||
{ | ||
for (auto& layer : s_layers) | ||
layer.second->Load(); | ||
} | ||
|
||
void Save() | ||
{ | ||
for (auto& layer : s_layers) | ||
layer.second->Save(); | ||
} | ||
|
||
void Init() | ||
{ | ||
// This layer always has to exist | ||
s_layers[LayerType::Meta] = std::make_unique<RecursiveLayer>(); | ||
} | ||
|
||
void Shutdown() | ||
{ | ||
s_layers.clear(); | ||
s_callbacks.clear(); | ||
} | ||
|
||
static const std::map<System, std::string> system_to_name = { | ||
{System::Main, "Dolphin"}, {System::GCPad, "GCPad"}, {System::WiiPad, "Wiimote"}, | ||
{System::GCKeyboard, "GCKeyboard"}, {System::GFX, "Graphics"}, {System::Logger, "Logger"}, | ||
{System::Debugger, "Debugger"}, {System::UI, "UI"}, | ||
}; | ||
|
||
const std::string& GetSystemName(System system) | ||
{ | ||
return system_to_name.at(system); | ||
} | ||
|
||
System GetSystemFromName(const std::string& name) | ||
{ | ||
const auto system = std::find_if(system_to_name.begin(), system_to_name.end(), | ||
[&name](const auto& entry) { return entry.second == name; }); | ||
if (system != system_to_name.end()) | ||
return system->first; | ||
|
||
_assert_msg_(COMMON, false, "Programming error! Couldn't convert '%s' to system!", name.c_str()); | ||
return System::Main; | ||
} | ||
|
||
const std::string& GetLayerName(LayerType layer) | ||
{ | ||
static const std::map<LayerType, std::string> layer_to_name = { | ||
{LayerType::Base, "Base"}, | ||
{LayerType::GlobalGame, "Global GameINI"}, | ||
{LayerType::LocalGame, "Local GameINI"}, | ||
{LayerType::Netplay, "Netplay"}, | ||
{LayerType::Movie, "Movie"}, | ||
{LayerType::CommandLine, "Command Line"}, | ||
{LayerType::CurrentRun, "Current Run"}, | ||
{LayerType::Meta, "Top"}, | ||
}; | ||
return layer_to_name.at(layer); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
// Copyright 2016 Dolphin Emulator Project | ||
// Licensed under GPLv2+ | ||
// Refer to the license.txt file included. | ||
|
||
#pragma once | ||
|
||
#include <functional> | ||
#include <map> | ||
#include <memory> | ||
#include <string> | ||
|
||
#include "Common/Config/Enums.h" | ||
#include "Common/Config/Layer.h" | ||
#include "Common/Config/Section.h" | ||
|
||
namespace Config | ||
{ | ||
using Layers = std::map<LayerType, std::unique_ptr<Layer>>; | ||
using ConfigChangedCallback = std::function<void()>; | ||
|
||
// Common function used for getting configuration | ||
Section* GetOrCreateSection(System system, const std::string& section_name); | ||
|
||
// Layer management | ||
Layers* GetLayers(); | ||
void AddLayer(std::unique_ptr<Layer> layer); | ||
void AddLayer(std::unique_ptr<ConfigLayerLoader> loader); | ||
void AddLoadLayer(std::unique_ptr<Layer> layer); | ||
void AddLoadLayer(std::unique_ptr<ConfigLayerLoader> loader); | ||
Layer* GetLayer(LayerType layer); | ||
void RemoveLayer(LayerType layer); | ||
bool LayerExists(LayerType layer); | ||
|
||
void AddConfigChangedCallback(ConfigChangedCallback func); | ||
void InvokeConfigChangedCallbacks(); | ||
|
||
// Explicit load and save of layers | ||
void Load(); | ||
void Save(); | ||
|
||
// Often used functions for getting or setting configuration on the base layer for the main system | ||
template <typename T> | ||
T Get(const std::string& section_name, const std::string& key, const T& default_value) | ||
{ | ||
auto base_layer = GetLayer(Config::LayerType::Base); | ||
return base_layer->GetOrCreateSection(Config::System::Main, section_name) | ||
->Get(key, default_value); | ||
} | ||
|
||
template <typename T> | ||
void Set(const std::string& section_name, const std::string& key, const T& value) | ||
{ | ||
auto base_layer = GetLayer(Config::LayerType::Base); | ||
base_layer->GetOrCreateSection(Config::System::Main, section_name)->Set(key, value); | ||
} | ||
|
||
void Init(); | ||
void Shutdown(); | ||
|
||
const std::string& GetSystemName(System system); | ||
System GetSystemFromName(const std::string& system); | ||
const std::string& GetLayerName(LayerType layer); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
// Copyright 2017 Dolphin Emulator Project | ||
// Licensed under GPLv2+ | ||
// Refer to the license.txt file included. | ||
|
||
#pragma once | ||
|
||
namespace Config | ||
{ | ||
enum class LayerType | ||
{ | ||
Base, | ||
GlobalGame, | ||
LocalGame, | ||
Movie, | ||
Netplay, | ||
CommandLine, | ||
CurrentRun, | ||
Meta, | ||
}; | ||
|
||
enum class System | ||
{ | ||
Main, | ||
GCPad, | ||
WiiPad, | ||
GCKeyboard, | ||
GFX, | ||
Logger, | ||
Debugger, | ||
UI, | ||
}; | ||
} |
Oops, something went wrong.