diff --git a/src/client/feature/setting/script/JsSetting.h b/src/client/feature/setting/script/JsSetting.h index 4c49e77c..205e440e 100644 --- a/src/client/feature/setting/script/JsSetting.h +++ b/src/client/feature/setting/script/JsSetting.h @@ -10,4 +10,6 @@ class JsSetting : public Setting { } ValueType jsVal = BoolValue(false); + + std::optional scriptEnumData; }; \ No newline at end of file diff --git a/src/client/script/class/impl/JsModuleClass.cpp b/src/client/script/class/impl/JsModuleClass.cpp index 149e1b6f..a9149b93 100644 --- a/src/client/script/class/impl/JsModuleClass.cpp +++ b/src/client/script/class/impl/JsModuleClass.cpp @@ -265,3 +265,46 @@ JsValueRef JsModuleClass::moduleAddColorSetting(JsValueRef callee, bool isConstr return setClass->construct(set.get(), false /*do not destroy the setting once it goes out of scope, as module manager will handle that*/); } + +JsValueRef JsModuleClass::moduleAddEnumSetting(JsValueRef callee, bool isConstructor, JsValueRef* arguments, unsigned short argCount, void* callbackState) { + if (!Chakra::VerifyArgCount(argCount, 4)) return JS_INVALID_REFERENCE; + if (!Chakra::VerifyParameters({ {arguments[1], JsString}, { arguments[2], JsString}, {arguments[3], JsString}, {arguments[4], JsObject} })) return JS_INVALID_REFERENCE; + + JsValueRef options = arguments[4]; + JsValueRef values = Chakra::GetProperty(options, L"values"); + int defaultValue = Chakra::GetIntProperty(options, L"default_value"); + + if (!values) { + Chakra::ThrowError(L"Invalid enum data"); + return JS_INVALID_REFERENCE; + } + + auto name = Chakra::GetString(arguments[1]); + auto disp = Chakra::GetString(arguments[2]); + auto desc = Chakra::GetString(arguments[3]); + + auto set = std::make_shared(util::WStrToStr(name), disp, desc); + + *set->value = EnumValue(defaultValue); + + set->scriptEnumData = EnumData{}; + set->enumData = &*set->scriptEnumData; + + for (int i = 0; i < Chakra::GetIntProperty(values, L"length"); i++) { + JsValueRef obj = JS_INVALID_REFERENCE; + JS::JsGetIndexedProperty(values, Chakra::MakeInt(i), &obj); + auto entryName = Chakra::GetStringProperty(obj, L"name"); + auto entryDesc = Chakra::GetStringProperty(obj, L"desc"); + if (obj != JS_INVALID_REFERENCE) { + set->enumData->addEntry(EnumEntry{ i, entryName, entryDesc }); + } + } + + auto thi = reinterpret_cast(callbackState); + auto mod = Get(arguments[0]); + + auto setClass = thi->owner->getClass(); + mod->settings->addSetting(set); + + return setClass->construct(set.get(), false /*do not destroy the setting once it goes out of scope, as module manager will handle that*/); +} \ No newline at end of file diff --git a/src/client/script/class/impl/JsModuleClass.h b/src/client/script/class/impl/JsModuleClass.h index 109cb93c..ab851669 100644 --- a/src/client/script/class/impl/JsModuleClass.h +++ b/src/client/script/class/impl/JsModuleClass.h @@ -50,6 +50,8 @@ class JsModuleClass : public JsWrapperClass { JsValueRef* arguments, unsigned short argCount, void* callbackState); static JsValueRef CALLBACK moduleAddColorSetting(JsValueRef callee, bool isConstructor, JsValueRef* arguments, unsigned short argCount, void* callbackState); + static JsValueRef CALLBACK moduleAddEnumSetting(JsValueRef callee, bool isConstructor, + JsValueRef* arguments, unsigned short argCount, void* callbackState); public: inline static const wchar_t* class_name = L"Module"; @@ -82,5 +84,6 @@ class JsModuleClass : public JsWrapperClass { Chakra::DefineFunc(prototype, moduleAddKeySetting, XW("addKeySetting"), this); Chakra::DefineFunc(prototype, moduleAddTextSetting, XW("addTextSetting"), this); Chakra::DefineFunc(prototype, moduleAddColorSetting, XW("addColorSetting"), this); + Chakra::DefineFunc(prototype, moduleAddEnumSetting, XW("addEnumSetting"), this); }; }; \ No newline at end of file diff --git a/src/util/ChakraUtil.cpp b/src/util/ChakraUtil.cpp index e632dd91..6609f619 100644 --- a/src/util/ChakraUtil.cpp +++ b/src/util/ChakraUtil.cpp @@ -215,7 +215,7 @@ int Chakra::GetIntProperty(JsValueRef ref, std::wstring name) { JsValueRef val; JS::JsGetProperty(ref, nameId, &val); - int b; + int b = 0; JS::JsNumberToInt(val, &b); Release(val); return b;