mirror of
https://gitea.wildfiregames.com/0ad/0ad.git
synced 2026-07-13 18:13:31 +00:00
Move static GUI<>::SetSetting operating on IGUIObject to a member IGUIObject::SetSetting.
Remove PSERROR codes from SetSetting (let std::map throw an out_of_range if a caller wants to Set a setting that doesn't exist without having checked with SettingExists, equal to GetSetting from92b6cdfeab). That also simplifies std::function SetSettingWrap construct from0a7d0ecddeto void IGUIObject::SettingChanged. Don't trigger debug_warn or exceptions in GUITooltip::ShowTooltip if the XML author specified wrong tooltip input, and dodge another dynamic_cast. Rename existing IGUIObject::SetSetting to IGUIObject::SetSettingFromString and comment that it is purposed for parsing XML files. Remove SetSetting default value, so that authors are made aware explicitly of the need to decide the function broadcasting a message, refsd87057b1c0,719f2d7967, ... Change const bool& SkipMessage to const bool SendMessage, so that a positive value relates to a positive action. Clean AddSettings whitespace and integer types. Differential Revision: https://code.wildfiregames.com/D2231 Tested on: gcc 9.1.0, clang 8.0.1, Jenkins Comments By: Philip on IRC on 2010-07-24 on GUIUtil being ugly, in case that one counts This was SVN commit r22796.
This commit is contained in:
+56
-17
@@ -43,10 +43,10 @@ IGUIObject::IGUIObject(CGUI& pGUI)
|
||||
AddSetting<CStr>("tooltip_style");
|
||||
|
||||
// Setup important defaults
|
||||
GUI<bool>::SetSetting(this, "hidden", false);
|
||||
GUI<bool>::SetSetting(this, "ghost", false);
|
||||
GUI<bool>::SetSetting(this, "enabled", true);
|
||||
GUI<bool>::SetSetting(this, "absolute", true);
|
||||
SetSetting<bool>("hidden", false, true);
|
||||
SetSetting<bool>("ghost", false, true);
|
||||
SetSetting<bool>("enabled", true, true);
|
||||
SetSetting<bool>("absolute", true, true);
|
||||
}
|
||||
|
||||
IGUIObject::~IGUIObject()
|
||||
@@ -145,6 +145,46 @@ const T& IGUIObject::GetSetting(const CStr& Setting) const
|
||||
return static_cast<CGUISetting<T>* >(m_Settings.at(Setting))->m_pSetting;
|
||||
}
|
||||
|
||||
bool IGUIObject::SetSettingFromString(const CStr& Setting, const CStrW& Value, const bool SendMessage)
|
||||
{
|
||||
return m_Settings[Setting]->FromString(Value, SendMessage);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void IGUIObject::SetSetting(const CStr& Setting, T& Value, const bool SendMessage)
|
||||
{
|
||||
static_cast<CGUISetting<T>* >(m_Settings[Setting])->m_pSetting = std::move(Value);
|
||||
SettingChanged(Setting, SendMessage);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void IGUIObject::SetSetting(const CStr& Setting, const T& Value, const bool SendMessage)
|
||||
{
|
||||
static_cast<CGUISetting<T>* >(m_Settings[Setting])->m_pSetting = Value;
|
||||
SettingChanged(Setting, SendMessage);
|
||||
}
|
||||
|
||||
void IGUIObject::SettingChanged(const CStr& Setting, const bool SendMessage)
|
||||
{
|
||||
if (Setting == "size")
|
||||
{
|
||||
// If setting was "size", we need to re-cache itself and all children
|
||||
RecurseObject(nullptr, &IGUIObject::UpdateCachedSize);
|
||||
}
|
||||
else if (Setting == "hidden")
|
||||
{
|
||||
// Hiding an object requires us to reset it and all children
|
||||
if (GetSetting<bool>(Setting))
|
||||
RecurseObject(nullptr, &IGUIObject::ResetStates);
|
||||
}
|
||||
|
||||
if (SendMessage)
|
||||
{
|
||||
SGUIMessage msg(GUIM_SETTINGS_UPDATED, Setting);
|
||||
HandleMessage(msg);
|
||||
}
|
||||
}
|
||||
|
||||
bool IGUIObject::IsMouseOver() const
|
||||
{
|
||||
return m_CachedActualSize.PointInside(m_pGUI.GetMousePos());
|
||||
@@ -176,17 +216,6 @@ void IGUIObject::UpdateMouseOver(IGUIObject* const& pMouseOver)
|
||||
}
|
||||
}
|
||||
|
||||
PSRETURN IGUIObject::SetSetting(const CStr& Setting, const CStrW& Value, const bool& SkipMessage)
|
||||
{
|
||||
if (!SettingExists(Setting))
|
||||
return PSRETURN_GUI_InvalidSetting;
|
||||
|
||||
if (!m_Settings[Setting]->FromString(Value, SkipMessage))
|
||||
return PSRETURN_GUI_UnableToParse;
|
||||
|
||||
return PSRETURN_OK;
|
||||
}
|
||||
|
||||
void IGUIObject::ChooseMouseOverAndClosest(IGUIObject*& pObject)
|
||||
{
|
||||
if (!IsMouseOver())
|
||||
@@ -271,7 +300,7 @@ void IGUIObject::LoadStyle(const CStr& StyleName)
|
||||
for (const std::pair<CStr, CStrW>& p : m_pGUI.GetStyle(StyleName).m_SettingsDefaults)
|
||||
{
|
||||
if (SettingExists(p.first))
|
||||
SetSetting(p.first, p.second);
|
||||
SetSettingFromString(p.first, p.second, true);
|
||||
else if (StyleName != "default")
|
||||
LOGWARNING("GUI object has no setting \"%s\", but the style \"%s\" defines it", p.first, StyleName.c_str());
|
||||
}
|
||||
@@ -483,11 +512,21 @@ void IGUIObject::TraceMember(JSTracer* trc)
|
||||
}
|
||||
|
||||
// Instantiate templated functions:
|
||||
// These functions avoid copies by working with a reference and move semantics.
|
||||
#define TYPE(T) \
|
||||
template void IGUIObject::AddSetting<T>(const CStr& Name); \
|
||||
template T& IGUIObject::GetSetting<T>(const CStr& Setting); \
|
||||
template const T& IGUIObject::GetSetting<T>(const CStr& Setting) const; \
|
||||
template void IGUIObject::SetSetting<T>(const CStr& Setting, T& Value, const bool SendMessage); \
|
||||
|
||||
#include "gui/GUItypes.h"
|
||||
|
||||
#undef TYPE
|
||||
|
||||
// Copying functions - discouraged except for primitives.
|
||||
#define TYPE(T) \
|
||||
template void IGUIObject::SetSetting<T>(const CStr& Setting, const T& Value, const bool SendMessage); \
|
||||
|
||||
#define GUITYPE_IGNORE_NONCOPYABLE
|
||||
#include "gui/GUItypes.h"
|
||||
#undef GUITYPE_IGNORE_NONCOPYABLE
|
||||
#undef TYPE
|
||||
|
||||
Reference in New Issue
Block a user