Remove both copies of the 15-fold copies of the JSI_IGUIObject::getProperty and setProperty setting case handlers following the FromJSVal / ToJSVal template specializations implemented in
* JSI_GUIColor in9be8a560a9
* bool ineec179a9a8
* CGUISeries and CGUIList in26ae9d430a
* primitives in636c719110
* EAlign and EVAlign in0834d07462
* ClientArea inb9f3c8557b
* CColor in415939b59b
* CGUISpriteInstance0a7d0ecdde
* CPos ind6b93b3be6
The removed JS_ReportError calls were redundant. This was SVN commit r22574.
This commit is contained in:
parent
d6b93b3be6
commit
82f1d2718b
@ -27,6 +27,24 @@
|
|||||||
#include "ps/Profile.h"
|
#include "ps/Profile.h"
|
||||||
#include "scriptinterface/ScriptInterface.h"
|
#include "scriptinterface/ScriptInterface.h"
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
void SGUISetting::Init(IGUIObject& pObject, const CStr& Name)
|
||||||
|
{
|
||||||
|
m_pSetting = new T();
|
||||||
|
|
||||||
|
m_FromJSVal = [Name, &pObject](JSContext* cx, JS::HandleValue v) {
|
||||||
|
T value;
|
||||||
|
if (!ScriptInterface::FromJSVal<T>(cx, v, value))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
GUI<T>::SetSetting(&pObject, Name, value);
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
m_ToJSVal = [Name, this](JSContext* cx, JS::MutableHandleValue v) {
|
||||||
|
ScriptInterface::ToJSVal<T>(cx, v, *static_cast<T*>(m_pSetting));
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
IGUIObject::IGUIObject()
|
IGUIObject::IGUIObject()
|
||||||
: m_pGUI(NULL), m_pParent(NULL), m_MouseHovering(false), m_LastClickTime()
|
: m_pGUI(NULL), m_pParent(NULL), m_MouseHovering(false), m_LastClickTime()
|
||||||
@ -151,7 +169,7 @@ void IGUIObject::AddSetting(const EGUISettingType& Type, const CStr& Name)
|
|||||||
{
|
{
|
||||||
#define TYPE(type) \
|
#define TYPE(type) \
|
||||||
case GUIST_##type: \
|
case GUIST_##type: \
|
||||||
m_Settings[Name].m_pSetting = new type(); \
|
m_Settings[Name].Init<type>(*this, Name);\
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Construct the setting.
|
// Construct the setting.
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
#include "lib/input.h" // just for IN_PASS
|
#include "lib/input.h" // just for IN_PASS
|
||||||
#include "ps/XML/Xeromyces.h"
|
#include "ps/XML/Xeromyces.h"
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
@ -68,8 +69,25 @@ struct SGUISetting
|
|||||||
{
|
{
|
||||||
SGUISetting() : m_pSetting(NULL) {}
|
SGUISetting() : m_pSetting(NULL) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stores the instance of the setting type holding the setting data. Can be set from XML and JS.
|
||||||
|
*/
|
||||||
void *m_pSetting;
|
void *m_pSetting;
|
||||||
|
|
||||||
EGUISettingType m_Type;
|
EGUISettingType m_Type;
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
void Init(IGUIObject& pObject, const CStr& Name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses the given JS::Value using ScriptInterface::FromJSVal and assigns it to the setting data.
|
||||||
|
*/
|
||||||
|
std::function<bool(JSContext* cx, JS::HandleValue v)> m_FromJSVal;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts the setting data to a JS::Value using ScriptInterface::ToJSVal.
|
||||||
|
*/
|
||||||
|
std::function<void(JSContext* cx, JS::MutableHandleValue v)> m_ToJSVal;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -114,147 +114,14 @@ bool JSI_IGUIObject::getProperty(JSContext* cx, JS::HandleObject obj, JS::Handle
|
|||||||
ScriptInterface::ToJSVal(cx, vp, e->GetName());
|
ScriptInterface::ToJSVal(cx, vp, e->GetName());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else if (e->SettingExists(propName))
|
||||||
{
|
{
|
||||||
// Retrieve the setting's type (and make sure it actually exists)
|
e->m_Settings[propName].m_ToJSVal(cx, vp);
|
||||||
EGUISettingType Type;
|
|
||||||
if (e->GetSettingType(propName, Type) != PSRETURN_OK)
|
|
||||||
{
|
|
||||||
JS_ReportError(cx, "Invalid GUIObject property '%s'", propName.c_str());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// (All the cases are in {...} to avoid scoping problems)
|
|
||||||
switch (Type)
|
|
||||||
{
|
|
||||||
case GUIST_bool:
|
|
||||||
{
|
|
||||||
bool value;
|
|
||||||
GUI<bool>::GetSetting(e, propName, value);
|
|
||||||
ScriptInterface::ToJSVal(cx, vp, value);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case GUIST_int:
|
|
||||||
{
|
|
||||||
i32 value;
|
|
||||||
GUI<i32>::GetSetting(e, propName, value);
|
|
||||||
ScriptInterface::ToJSVal(cx, vp, value);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case GUIST_uint:
|
|
||||||
{
|
|
||||||
u32 value;
|
|
||||||
GUI<u32>::GetSetting(e, propName, value);
|
|
||||||
ScriptInterface::ToJSVal(cx, vp, value);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case GUIST_float:
|
|
||||||
{
|
|
||||||
float value;
|
|
||||||
GUI<float>::GetSetting(e, propName, value);
|
|
||||||
ScriptInterface::ToJSVal(cx, vp, value);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case GUIST_CGUIColor:
|
|
||||||
{
|
|
||||||
CGUIColor value;
|
|
||||||
GUI<CGUIColor>::GetSetting(e, propName, value);
|
|
||||||
ScriptInterface::ToJSVal(cx, vp, value);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case GUIST_CPos:
|
|
||||||
{
|
|
||||||
CPos value;
|
|
||||||
GUI<CPos>::GetSetting(e, propName, value);
|
|
||||||
ScriptInterface::ToJSVal(cx, vp, value);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case GUIST_CClientArea:
|
|
||||||
{
|
|
||||||
CClientArea value;
|
|
||||||
GUI<CClientArea>::GetSetting(e, propName, value);
|
|
||||||
ScriptInterface::ToJSVal(cx, vp, value);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case GUIST_CGUIString:
|
|
||||||
{
|
|
||||||
CGUIString value;
|
|
||||||
GUI<CGUIString>::GetSetting(e, propName, value);
|
|
||||||
ScriptInterface::ToJSVal(cx, vp, value);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case GUIST_CStr:
|
|
||||||
{
|
|
||||||
CStr value;
|
|
||||||
GUI<CStr>::GetSetting(e, propName, value);
|
|
||||||
ScriptInterface::ToJSVal(cx, vp, value);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case GUIST_CStrW:
|
|
||||||
{
|
|
||||||
CStrW value;
|
|
||||||
GUI<CStrW>::GetSetting(e, propName, value);
|
|
||||||
ScriptInterface::ToJSVal(cx, vp, value);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case GUIST_CGUISpriteInstance:
|
|
||||||
{
|
|
||||||
CGUISpriteInstance* value;
|
|
||||||
GUI<CGUISpriteInstance>::GetSettingPointer(e, propName, value);
|
|
||||||
ScriptInterface::ToJSVal(cx, vp, *value);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case GUIST_EAlign:
|
|
||||||
{
|
|
||||||
EAlign value;
|
|
||||||
GUI<EAlign>::GetSetting(e, propName, value);
|
|
||||||
ScriptInterface::ToJSVal(cx, vp, value);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case GUIST_EVAlign:
|
|
||||||
{
|
|
||||||
EVAlign value;
|
|
||||||
GUI<EVAlign>::GetSetting(e, propName, value);
|
|
||||||
ScriptInterface::ToJSVal(cx, vp, value);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case GUIST_CGUIList:
|
|
||||||
{
|
|
||||||
CGUIList value;
|
|
||||||
GUI<CGUIList>::GetSetting(e, propName, value);
|
|
||||||
ScriptInterface::ToJSVal(cx, vp, value);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case GUIST_CGUISeries:
|
|
||||||
{
|
|
||||||
CGUISeries value;
|
|
||||||
GUI<CGUISeries>::GetSetting(e, propName, value);
|
|
||||||
ScriptInterface::ToJSVal(cx, vp, value);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
JS_ReportError(cx, "Setting '%s' uses an unimplemented type", propName.c_str());
|
|
||||||
DEBUG_WARN_ERR(ERR::LOGIC);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JS_ReportError(cx, "Property '%s' does not exist!", propName.c_str());
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool JSI_IGUIObject::setProperty(JSContext* cx, JS::HandleObject obj, JS::HandleId id, bool UNUSED(strict), JS::MutableHandleValue vp)
|
bool JSI_IGUIObject::setProperty(JSContext* cx, JS::HandleObject obj, JS::HandleId id, bool UNUSED(strict), JS::MutableHandleValue vp)
|
||||||
@ -300,186 +167,11 @@ bool JSI_IGUIObject::setProperty(JSContext* cx, JS::HandleObject obj, JS::Handle
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Retrieve the setting's type (and make sure it actually exists)
|
if (e->SettingExists(propName))
|
||||||
EGUISettingType Type;
|
return e->m_Settings[propName].m_FromJSVal(cx, vp);
|
||||||
if (e->GetSettingType(propName, Type) != PSRETURN_OK)
|
|
||||||
{
|
|
||||||
JS_ReportError(cx, "Invalid setting '%s'", propName.c_str());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (Type)
|
JS_ReportError(cx, "Property '%s' does not exist!", propName.c_str());
|
||||||
{
|
return false;
|
||||||
case GUIST_CStr:
|
|
||||||
{
|
|
||||||
CStr value;
|
|
||||||
if (!ScriptInterface::FromJSVal(cx, vp, value))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
GUI<CStr>::SetSetting(e, propName, value);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case GUIST_CStrW:
|
|
||||||
{
|
|
||||||
CStrW value;
|
|
||||||
if (!ScriptInterface::FromJSVal(cx, vp, value))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
GUI<CStrW>::SetSetting(e, propName, value);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case GUIST_CGUISpriteInstance:
|
|
||||||
{
|
|
||||||
CGUISpriteInstance value;
|
|
||||||
if (!ScriptInterface::FromJSVal(cx, vp, value))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
GUI<CGUISpriteInstance>::SetSetting(e, propName, value);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case GUIST_CGUIString:
|
|
||||||
{
|
|
||||||
CGUIString value;
|
|
||||||
if (!ScriptInterface::FromJSVal(cx, vp, value))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
GUI<CGUIString>::SetSetting(e, propName, value);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case GUIST_EAlign:
|
|
||||||
{
|
|
||||||
EAlign a;
|
|
||||||
if (!ScriptInterface::FromJSVal(cx, vp, a))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
GUI<EAlign>::SetSetting(e, propName, a);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case GUIST_EVAlign:
|
|
||||||
{
|
|
||||||
EVAlign a;
|
|
||||||
if (!ScriptInterface::FromJSVal(cx, vp, a))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
GUI<EVAlign>::SetSetting(e, propName, a);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case GUIST_int:
|
|
||||||
{
|
|
||||||
i32 value;
|
|
||||||
if (ScriptInterface::FromJSVal(cx, vp, value))
|
|
||||||
GUI<i32>::SetSetting(e, propName, value);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
JS_ReportError(cx, "Cannot convert value to i32");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case GUIST_uint:
|
|
||||||
{
|
|
||||||
u32 value;
|
|
||||||
if (ScriptInterface::FromJSVal(cx, vp, value))
|
|
||||||
GUI<u32>::SetSetting(e, propName, value);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
JS_ReportError(cx, "Cannot convert value to u32");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case GUIST_float:
|
|
||||||
{
|
|
||||||
float value;
|
|
||||||
if (ScriptInterface::FromJSVal(cx, vp, value))
|
|
||||||
GUI<float>::SetSetting(e, propName, value);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
JS_ReportError(cx, "Cannot convert value to float");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case GUIST_bool:
|
|
||||||
{
|
|
||||||
bool value;
|
|
||||||
if (!ScriptInterface::FromJSVal(cx, vp, value))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
GUI<bool>::SetSetting(e, propName, value);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case GUIST_CClientArea:
|
|
||||||
{
|
|
||||||
CClientArea value;
|
|
||||||
if (!ScriptInterface::FromJSVal(cx, vp, value))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
GUI<CClientArea>::SetSetting(e, propName, value);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case GUIST_CPos:
|
|
||||||
{
|
|
||||||
CPos value;
|
|
||||||
if (!ScriptInterface::FromJSVal(cx, vp, value))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
GUI<CPos>::SetSetting(e, propName, value);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case GUIST_CGUIColor:
|
|
||||||
{
|
|
||||||
CGUIColor value;
|
|
||||||
if (!ScriptInterface::FromJSVal(cx, vp, value))
|
|
||||||
return false;
|
|
||||||
GUI<CGUIColor>::SetSetting(e, propName, value);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case GUIST_CGUIList:
|
|
||||||
{
|
|
||||||
CGUIList list;
|
|
||||||
if (ScriptInterface::FromJSVal(cx, vp, list))
|
|
||||||
GUI<CGUIList>::SetSetting(e, propName, list);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
JS_ReportError(cx, "Failed to get list '%s'", propName.c_str());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case GUIST_CGUISeries:
|
|
||||||
{
|
|
||||||
CGUISeries series;
|
|
||||||
if (ScriptInterface::FromJSVal(cx, vp, series))
|
|
||||||
GUI<CGUISeries>::SetSetting(e, propName, series);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
JS_ReportError(cx, "Invalid value for chart series '%s'", propName.c_str());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
JS_ReportError(cx, "Setting '%s' uses an unimplemented type", propName.c_str());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return !JS_IsExceptionPending(cx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void JSI_IGUIObject::init(ScriptInterface& scriptInterface)
|
void JSI_IGUIObject::init(ScriptInterface& scriptInterface)
|
||||||
|
Loading…
Reference in New Issue
Block a user