Changeset View
Changeset View
Standalone View
Standalone View
source/gui/CGUISetting.h
/* Copyright (C) 2019 Wildfire Games. | /* Copyright (C) 2021 Wildfire Games. | ||||
* This file is part of 0 A.D. | * This file is part of 0 A.D. | ||||
* | * | ||||
* 0 A.D. is free software: you can redistribute it and/or modify | * 0 A.D. is free software: you can redistribute it and/or modify | ||||
* it under the terms of the GNU General Public License as published by | * it under the terms of the GNU General Public License as published by | ||||
* the Free Software Foundation, either version 2 of the License, or | * the Free Software Foundation, either version 2 of the License, or | ||||
* (at your option) any later version. | * (at your option) any later version. | ||||
* | * | ||||
* 0 A.D. is distributed in the hope that it will be useful, | * 0 A.D. is distributed in the hope that it will be useful, | ||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
* GNU General Public License for more details. | * GNU General Public License for more details. | ||||
* | * | ||||
* You should have received a copy of the GNU General Public License | * You should have received a copy of the GNU General Public License | ||||
* along with 0 A.D. If not, see <http://www.gnu.org/licenses/>. | * along with 0 A.D. If not, see <http://www.gnu.org/licenses/>. | ||||
*/ | */ | ||||
#ifndef INCLUDED_CGUISETTINGS | #ifndef INCLUDED_CGUISETTINGS | ||||
#define INCLUDED_CGUISETTINGS | #define INCLUDED_CGUISETTINGS | ||||
#include "gui/ObjectBases/IGUIObject.h" | #include "gui/ObjectBases/IGUIObject.h" | ||||
class IGUIObject; | |||||
class ScriptRequest; | |||||
/** | /** | ||||
* This setting interface allows GUI objects to call setting function functions without having to know the setting type. | * This setting interface allows GUI objects to call setting function functions without having to know the setting type. | ||||
* This is fact is used for setting the value from a JS value or XML value (string) and when deleting the setting, | * This is fact is used for setting the value from a JS value or XML value (string) and when deleting the setting, | ||||
* when the type of the setting value is not known in advance. | * when the type of the setting value is not known in advance. | ||||
*/ | */ | ||||
class IGUISetting | class IGUISetting | ||||
{ | { | ||||
public: | public: | ||||
NONCOPYABLE(IGUISetting); | NONCOPYABLE(IGUISetting); | ||||
IGUISetting(const CStr& name, IGUIObject* owner); | |||||
IGUISetting() = default; | |||||
virtual ~IGUISetting() = default; | |||||
/** | /** | ||||
* Parses the given string and assigns to the setting value. Used for parsing XML attributes. | * Parses the given string and assigns to the setting value. Used for parsing XML attributes. | ||||
*/ | */ | ||||
virtual bool FromString(const CStrW& Value, const bool SendMessage) = 0; | bool FromString(const CStrW& value, const bool sendMessage); | ||||
/** | /** | ||||
* Parses the given JS::Value using ScriptInterface::FromJSVal and assigns it to the setting data. | * Parses the given JS::Value using ScriptInterface::FromJSVal and assigns it to the setting data. | ||||
*/ | */ | ||||
virtual bool FromJSVal(const ScriptRequest& rq, JS::HandleValue Value, const bool SendMessage) = 0; | bool FromJSVal(const ScriptRequest& rq, JS::HandleValue value, const bool sendMessage); | ||||
/** | /** | ||||
* Converts the setting data to a JS::Value using ScriptInterface::ToJSVal. | * Converts the setting data to a JS::Value using ScriptInterface::ToJSVal. | ||||
*/ | */ | ||||
virtual void ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue Value) = 0; | virtual void ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue value) = 0; | ||||
}; | |||||
template<typename T> | protected: | ||||
class CGUISetting : public IGUISetting | IGUISetting(IGUISetting&& o); | ||||
{ | virtual ~IGUISetting() = default; | ||||
public: | |||||
NONCOPYABLE(CGUISetting); | |||||
CGUISetting(IGUIObject& pObject, const CStr& Name, T& Value); | virtual bool DoFromString(const CStrW& value) = 0; | ||||
virtual bool DoFromJSVal(const ScriptRequest& rq, JS::HandleValue value) = 0; | |||||
/** | /** | ||||
* Parses the given string and assigns to the setting value. Used for parsing XML attributes. | * Triggers the IGUIObject logic when a setting changes. | ||||
* This must be called by derived classes when something externally visible changes. | |||||
*/ | */ | ||||
bool FromString(const CStrW& Value, const bool SendMessage) override; | void OnSettingChange(const CStr& setting, bool sendMessage); | ||||
/** | /** | ||||
* Parses the given JS::Value using ScriptInterface::FromJSVal and assigns it to the setting data. | * Return the name of the setting, from JS. | ||||
*/ | */ | ||||
bool FromJSVal(const ScriptRequest& rq, JS::HandleValue Value, const bool SendMessage) override; | virtual CStr GetName() const = 0; | ||||
/** | /** | ||||
* Converts the setting data to a JS::Value using ScriptInterface::ToJSVal. | * The object that stores this setting. | ||||
*/ | */ | ||||
void ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue Value) override; | IGUIObject& m_pObject; | ||||
}; | |||||
/** | /** | ||||
* These members are public because they are either unmodifiable or free to be modified. | * Wraps a T. Makes sure the appropriate setting functions are called when modifying T, | ||||
* In particular it avoids the need for setter templates specialized depending on copiability. | * and likewise makes sure that JS/xml settings affect T appropriately, | ||||
* while being as transparent as possible to use from C++ code. | |||||
*/ | */ | ||||
template<typename T> | |||||
class CGUISimpleSetting : public IGUISetting | |||||
{ | |||||
public: | |||||
template<typename... Args> | |||||
CGUISimpleSetting(IGUIObject* pObject, const CStr& Name, Args&&... args) | |||||
: IGUISetting(Name, pObject), m_Name(Name), m_Setting(args...) | |||||
{} | |||||
NONCOPYABLE(CGUISimpleSetting); | |||||
MOVABLE(CGUISimpleSetting); | |||||
/** | operator T&() { return m_Setting; } | ||||
* The object that stores this setting. | operator const T&() const { return m_Setting; } | ||||
*/ | |||||
IGUIObject& m_pObject; | T* operator->() { return &m_Setting; } | ||||
const T* operator->() const { return &m_Setting; } | |||||
/** | /** | ||||
* Property name identifying the setting. | * Explicit getter for when that's more convenient than a cast. | ||||
*/ | */ | ||||
const CStr m_Name; | T& Get() { return m_Setting; } | ||||
const T& Get() const { return m_Setting; } | |||||
/** | /** | ||||
* Holds a reference to the value of the setting. | * 'Uglified' operator=, so that SendMessage is explicit. | ||||
* The setting value is stored in the member class to optimize for draw calls of that class. | |||||
*/ | */ | ||||
T& m_pSetting; | void Set(T value, bool sendMessage) | ||||
{ | |||||
m_Setting = std::move(value); | |||||
OnSettingChange(m_Name, sendMessage); | |||||
} | |||||
protected: | |||||
virtual CStr GetName() const override | |||||
{ | |||||
return m_Name; | |||||
} | |||||
virtual bool DoFromString(const CStrW& value) override; | |||||
virtual bool DoFromJSVal(const ScriptRequest& rq, JS::HandleValue value) override; | |||||
virtual void ToJSVal(const ScriptRequest& rq, JS::MutableHandleValue value) override; | |||||
const CStr m_Name; | |||||
T m_Setting; | |||||
}; | }; | ||||
#endif // INCLUDED_CGUISETTINGS | #endif // INCLUDED_CGUISETTINGS |
Wildfire Games · Phabricator