Skip to content

Commit

Permalink
Add module.addEnumSetting
Browse files Browse the repository at this point in the history
  • Loading branch information
Imrglop committed Aug 25, 2024
1 parent f43dd4d commit 5f4d0c6
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 1 deletion.
2 changes: 2 additions & 0 deletions src/client/feature/setting/script/JsSetting.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,6 @@ class JsSetting : public Setting {
}

ValueType jsVal = BoolValue(false);

std::optional<EnumData> scriptEnumData;
};
43 changes: 43 additions & 0 deletions src/client/script/class/impl/JsModuleClass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<JsSetting>(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<JsModuleClass*>(callbackState);
auto mod = Get(arguments[0]);

auto setClass = thi->owner->getClass<JsSettingClass>();
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*/);
}
3 changes: 3 additions & 0 deletions src/client/script/class/impl/JsModuleClass.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ class JsModuleClass : public JsWrapperClass<JsModule> {
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";

Expand Down Expand Up @@ -82,5 +84,6 @@ class JsModuleClass : public JsWrapperClass<JsModule> {
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);
};
};
2 changes: 1 addition & 1 deletion src/util/ChakraUtil.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 5f4d0c6

Please sign in to comment.