diff --git a/docs/apis/GuiAPI/FormBuilder.md b/docs/apis/GuiAPI/FormBuilder.md index 58b09d0..c337d89 100644 --- a/docs/apis/GuiAPI/FormBuilder.md +++ b/docs/apis/GuiAPI/FormBuilder.md @@ -93,7 +93,7 @@ are called when there is player interaction, without fighting. For a player object `pl`, using the function: -`pl.sendForm(fm,callback.forUpdating)` +`pl.sendForm(fm,callback[,forUpdating])` - Parameters: - fm : `SimpleForm` @@ -176,7 +176,7 @@ For a specific form object `fm`, the following functions are available: #### Add a Row of Input Boxes to the Form -`fm.addInput(title[,placeholder,default])` +`fm.addInput(title[,placeholder,default,tooltip])` - Parameters: @@ -185,25 +185,29 @@ For a specific form object `fm`, the following functions are available: - placeholder : `String` (Optional parameter) The default prompt in the input box. - default : `String` - (Optional parameter) the default input in the input box. + (Optional parameter) The default input in the input box. + - tooltip : `String` + (Optional parameter, added in 0.12.0) The text of tooltip - Return value: The processed form object (for other operations in the chain). - Return value type: `CustomForm` #### Add a Row of Switch Options to the Form -`fm.addSwitch(title[,default])` +`fm.addSwitch(title[,default,tooltip])` - Parameters: - title : `String` Description text for a switch option. - default : `Boolean` (Optional parameter) Default state of the switch on/off. + - tooltip : `String` + (Optional parameter, added in 0.12.0) The text of tooltip - Return value: The processed form object (for other operations in the chain). - Return value type: `CustomForm` #### Add a Drop-Down Menu to the Form -`fm.addDropdown(title,items[,default])` +`fm.addDropdown(title,items[,default,tooltip])` - Parameters: @@ -216,12 +220,15 @@ For a specific form object `fm`, the following functions are available: - default : `Integer` (Optional parameter) The number of the list item selected by default in the drop-down menu. The sequence number starts from 0. The default is 0, that is, the first item in the list is selected by default. + + - tooltip : `String` + (Optional parameter, added in 0.12.0) The text of tooltip - Return value: The processed form object (for other operations in the chain). - Return value type: `CustomForm` #### Add a Row of Cursor Sliders to the Form -`fm.addSlider(title,min,max[,step,default])` +`fm.addSlider(title,min,max[,step,default,tooltip])` - Parameters: - title : `String` @@ -236,12 +243,14 @@ For a specific form object `fm`, the following functions are available: (Optional parameter) The default initial grid number of the cursor slider, the value must be between the minimum and maximum grid number. Defaults to 0, i.e. the slider is at the beginning of the slider row. + - tooltip : `String` + (Optional parameter, added in 0.12.0) The text of tooltip - Return value: The processed form object (for other operations in the chain). - Return value type: `CustomForm` #### Add a Row of Step Sliders to the Form -`fm.addStepSlider(title,items[,default])` +`fm.addStepSlider(title,items[,default,tooltip])` - Parameters: - title : `String` @@ -253,6 +262,9 @@ For a specific form object `fm`, the following functions are available: - default : `Integer` (Optional parameter) Default initial options for step slider. Serial numbers start from 0. Defaults to 0, i.e. the slider is at the beginning of the slider row. + + - tooltip : `String` + (Optional parameter, added in 0.12.0) The text of tooltip - Return value: The processed form object (for other operations in the chain). - Return value type: `CustomForm` diff --git a/docs/apis/GuiAPI/FormBuilder.zh.md b/docs/apis/GuiAPI/FormBuilder.zh.md index 6fdb38e..a45b148 100644 --- a/docs/apis/GuiAPI/FormBuilder.zh.md +++ b/docs/apis/GuiAPI/FormBuilder.zh.md @@ -176,7 +176,7 @@ reason可能会是`null`. #### 向表单内增加一行输入框 -`fm.addInput(title[,placeholder,default])` +`fm.addInput(title[,placeholder,default,tooltip])` - 参数: @@ -186,24 +186,28 @@ reason可能会是`null`. (可选参数)输入框内的提示字符 - default : `String` (可选参数)输入框中默认存在的内容 + - tooltip : `String` + (可选参数,在0.12.0中加入)提示文本 - 返回值:处理完毕的表单对象(便于连锁进行其他操作) - 返回值类型:`CustomForm` #### 向表单内增加一行开关选项 -`fm.addSwitch(title[,default])` +`fm.addSwitch(title[,default,tooltip])` - 参数: - title : `String` 开关选项描述文本 - default : `Boolean` (可选参数)开关的默认状态 开 / 关 + - tooltip : `String` + (可选参数,在0.12.0中加入)提示文本 - 返回值:处理完毕的表单对象(便于连锁进行其他操作) - 返回值类型:`CustomForm` #### 向表单内增加一行下拉菜单 -`fm.addDropdown(title,items[,default])` +`fm.addDropdown(title,items[,default,tooltip])` - 参数: @@ -216,12 +220,15 @@ reason可能会是`null`. - default : `Integer` (可选参数)下拉菜单默认选中的列表项序号。 序号从0开始编号。默认为0,即默认选中列表的第一项 + + - tooltip : `String` + (可选参数,在0.12.0中加入)提示文本 - 返回值:处理完毕的表单对象(便于连锁进行其他操作) - 返回值类型:`CustomForm` #### 向表单内增加一行游标滑块 -`fm.addSlider(title,min,max[,step,default])` +`fm.addSlider(title,min,max[,step,default,tooltip])` - 参数: - title : `String` @@ -235,12 +242,14 @@ reason可能会是`null`. - default : `Integer` (可选参数)游标滑块默认初始格数,数值必须在最小和最大格数之间。 默认为0,即滑块位于滑块行的开头 + - tooltip : `String` + (可选参数,在0.12.0中加入)提示文本 - 返回值:处理完毕的表单对象(便于连锁进行其他操作) - 返回值类型:`CustomForm` #### 向表单内增加一行步进滑块 -`fm.addStepSlider(title,items[,default])` +`fm.addStepSlider(title,items[,default,tooltip])` - 参数: - title : `String` @@ -252,6 +261,9 @@ reason可能会是`null`. - default : `Integer` (可选参数)步进滑块默认初始选项。序号从0开始编号 默认为0,即滑块位于滑块行的开头 + + - tooltip : `String` + (可选参数,在0.12.0中加入)提示文本 - 返回值:处理完毕的表单对象(便于连锁进行其他操作) - 返回值类型:`CustomForm` diff --git a/src/legacy/api/DataAPI.cpp b/src/legacy/api/DataAPI.cpp index a355a8e..cd0b100 100644 --- a/src/legacy/api/DataAPI.cpp +++ b/src/legacy/api/DataAPI.cpp @@ -531,8 +531,7 @@ Local MoneyClass::set(const Arguments& args) { CHECK_ARG_TYPE(args[1], ValueKind::kNumber); try { - return Boolean::newBoolean( - EconomySystem::setMoney(args[0].asString().toString(), args[1].asNumber().toInt64()) + return Boolean::newBoolean(EconomySystem::setMoney(args[0].asString().toString(), args[1].asNumber().toInt64()) ); } catch (const std::invalid_argument& e) { lse::LegacyScriptEngine::getInstance().getSelf().getLogger().error("Bad argument in MoneySet!"); @@ -570,8 +569,7 @@ Local MoneyClass::add(const Arguments& args) { CHECK_ARG_TYPE(args[1], ValueKind::kNumber); try { - return Boolean::newBoolean( - EconomySystem::addMoney(args[0].asString().toString(), args[1].asNumber().toInt64()) + return Boolean::newBoolean(EconomySystem::addMoney(args[0].asString().toString(), args[1].asNumber().toInt64()) ); } catch (const std::invalid_argument& e) { lse::LegacyScriptEngine::getInstance().getSelf().getLogger().error("Bad argument in MoneyAdd!"); @@ -615,14 +613,12 @@ Local MoneyClass::trans(const Arguments& args) { try { string note = ""; if (args.size() >= 4 && args[3].getKind() == ValueKind::kString) note = args[3].asString().toString(); - return Boolean::newBoolean( - EconomySystem::transMoney( - args[0].asString().toString(), - args[1].asString().toString(), - args[2].asNumber().toInt64(), - note - ) - ); + return Boolean::newBoolean(EconomySystem::transMoney( + args[0].asString().toString(), + args[1].asString().toString(), + args[2].asNumber().toInt64(), + note + )); } catch (const std::invalid_argument& e) { lse::LegacyScriptEngine::getInstance().getSelf().getLogger().error("Bad argument in MoneyTrans!"); ll::error_utils::printException(e, lse::LegacyScriptEngine::getInstance().getSelf().getLogger()); @@ -887,7 +883,7 @@ Local DataClass::toMD5(const Arguments& args) { LOG_WRONG_ARG_TYPE(__FUNCTION__); return Local(); } - return String::newString(Crypto::Hash::hash(Crypto::Hash::HashType::Md5, data)); + return String::newString(Crypto::Hash::hash(Crypto::Hash::HashType::Md5, data.data(), data.size())); } CATCH("Fail in ToMD5!"); } @@ -905,7 +901,7 @@ Local DataClass::toSHA1(const Arguments& args) { LOG_WRONG_ARG_TYPE(__FUNCTION__); return Local(); } - return String::newString(Crypto::Hash::hash(Crypto::Hash::HashType::Md5, data)); + return String::newString(Crypto::Hash::hash(Crypto::Hash::HashType::Md5, data.data(), data.size())); } CATCH("Fail in ToSHA1!"); } diff --git a/src/legacy/api/GuiAPI.cpp b/src/legacy/api/GuiAPI.cpp index 531fbd0..8b3a663 100644 --- a/src/legacy/api/GuiAPI.cpp +++ b/src/legacy/api/GuiAPI.cpp @@ -154,7 +154,7 @@ Local SimpleFormClass::addDivider(const Arguments& args) { //////////////////// Custom Form //////////////////// -CustomFormClass::CustomFormClass() : ScriptClass(ScriptClass::ConstructFromCpp{}), form("") {} +CustomFormClass::CustomFormClass() : ScriptClass(ScriptClass::ConstructFromCpp{}), form() {} // 生成函数 Local CustomFormClass::newForm() { @@ -162,7 +162,7 @@ Local CustomFormClass::newForm() { return newp->getScriptObject(); } -lse::form::CustomFormWrapper* CustomFormClass::extract(Local v) { +lse::form::RawCustomForm* CustomFormClass::extract(Local v) { if (EngineScope::currentEngine()->isInstanceOf(v)) return EngineScope::currentEngine()->getNativeInstance(v)->get(); else return nullptr; @@ -170,10 +170,10 @@ lse::form::CustomFormWrapper* CustomFormClass::extract(Local v) { // 成员函数 void CustomFormClass::sendForm( - lse::form::CustomFormWrapper* form, - Player* player, - script::Local& callback, - bool update + lse::form::RawCustomForm* form, + Player* player, + script::Local& callback, + bool update ) { script::Global callbackFunc{callback}; auto cb = [engine{EngineScope::currentEngine()}, @@ -186,7 +186,9 @@ void CustomFormClass::sendForm( EngineScope scope(engine); Local result; if (data) { - result = JsonToValue(*data); + auto dataJson = nlohmann::ordered_json::parse(*data); + result = JsonToValue(dataJson); + if (result.isNull()) result = Array::newArray(); } auto reasonVal = reason.has_value() ? Number::newNumber((uchar)reason.value()) : Local(); try { @@ -194,8 +196,8 @@ void CustomFormClass::sendForm( } CATCH_IN_CALLBACK("sendForm") }; - if (update) form->sendUpdate(*player, std::move(cb)); - else form->sendTo(*player, std::move(cb)); + if (update) form->sendRawUpdate(*player, std::move(cb)); + else form->sendRawTo(*player, std::move(cb)); } Local CustomFormClass::setTitle(const Arguments& args) { @@ -257,12 +259,14 @@ Local CustomFormClass::addInput(const Arguments& args) { CHECK_ARG_TYPE(args[0], ValueKind::kString) if (args.size() >= 2) CHECK_ARG_TYPE(args[1], ValueKind::kString); if (args.size() >= 3) CHECK_ARG_TYPE(args[2], ValueKind::kString); + if (args.size() >= 4) CHECK_ARG_TYPE(args[3], ValueKind::kString); try { std::string placeholder = args.size() >= 2 ? args[1].asString().toString() : ""; std::string def = args.size() >= 3 ? args[2].asString().toString() : ""; + std::string tooltip = args.size() >= 4 ? args[3].asString().toString() : ""; - form.appendInput(args[0].asString().toString(), placeholder, def); + form.appendInput("", args[0].asString().toString(), placeholder, def, tooltip); return this->getScriptObject(); } CATCH("Fail in addInput!") @@ -277,12 +281,14 @@ Local CustomFormClass::addSwitch(const Arguments& args) { return Local(); } } + if (args.size() >= 3) CHECK_ARG_TYPE(args[2], ValueKind::kString); try { bool def = args.size() >= 2 ? args[1].isBoolean() ? args[1].asBoolean().value() : args[1].asNumber().toInt32() : false; + std::string tooltip = args.size() >= 3 ? args[2].asString().toString() : ""; - form.appendToggle(args[0].asString().toString(), def); + form.appendToggle("", args[0].asString().toString(), def, tooltip); return this->getScriptObject(); } CATCH("Fail in addSwitch!") @@ -293,6 +299,7 @@ Local CustomFormClass::addDropdown(const Arguments& args) { CHECK_ARG_TYPE(args[0], ValueKind::kString) CHECK_ARG_TYPE(args[1], ValueKind::kArray); if (args.size() >= 3) CHECK_ARG_TYPE(args[2], ValueKind::kNumber); + if (args.size() >= 4) CHECK_ARG_TYPE(args[3], ValueKind::kString); try { auto optionsArr = args[1].asArray(); @@ -302,9 +309,10 @@ Local CustomFormClass::addDropdown(const Arguments& args) { options.emplace_back(optionsArr.get(i).asString().toString()); } - int def = args.size() >= 3 ? args[2].asNumber().toInt32() : 0; + int def = args.size() >= 3 ? args[2].asNumber().toInt32() : 0; + std::string tooltip = args.size() >= 4 ? args[3].asString().toString() : ""; - form.appendDropdown(args[0].asString().toString(), options, def); + form.appendDropdown("", args[0].asString().toString(), options, def, tooltip); return this->getScriptObject(); } CATCH("Fail in addDropdown!") @@ -317,6 +325,7 @@ Local CustomFormClass::addSlider(const Arguments& args) { CHECK_ARG_TYPE(args[2], ValueKind::kNumber); if (args.size() >= 4) CHECK_ARG_TYPE(args[3], ValueKind::kNumber); if (args.size() >= 5) CHECK_ARG_TYPE(args[4], ValueKind::kNumber); + if (args.size() >= 6) CHECK_ARG_TYPE(args[5], ValueKind::kString); try { int minValue = args[1].asNumber().toInt32(); @@ -326,15 +335,9 @@ Local CustomFormClass::addSlider(const Arguments& args) { int step = args.size() >= 4 ? args[3].asNumber().toInt32() : 1; int defValue = args.size() >= 5 ? args[4].asNumber().toInt32() : minValue; if (defValue < minValue || defValue > maxValue) defValue = minValue; + std::string tooltip = args.size() >= 6 ? args[5].asString().toString() : ""; - form.appendSlider( - - args[0].asString().toString(), - minValue, - maxValue, - step, - defValue - ); + form.appendSlider("", args[0].asString().toString(), minValue, maxValue, step, defValue, tooltip); return this->getScriptObject(); } CATCH("Fail in addSlider!") @@ -345,6 +348,7 @@ Local CustomFormClass::addStepSlider(const Arguments& args) { CHECK_ARG_TYPE(args[0], ValueKind::kString) CHECK_ARG_TYPE(args[1], ValueKind::kArray); if (args.size() >= 3) CHECK_ARG_TYPE(args[2], ValueKind::kNumber); + if (args.size() >= 4) CHECK_ARG_TYPE(args[3], ValueKind::kString); try { auto stepsArr = args[1].asArray(); @@ -352,9 +356,10 @@ Local CustomFormClass::addStepSlider(const Arguments& args) { steps.reserve(stepsArr.size()); for (size_t i = 0; i < stepsArr.size(); ++i) steps.push_back(stepsArr.get(i).asString().toString()); - int defIndex = args.size() >= 3 ? args[2].asNumber().toInt32() : 0; + int defIndex = args.size() >= 3 ? args[2].asNumber().toInt32() : 0; + std::string tooltip = args.size() >= 4 ? args[3].asString().toString() : ""; - form.appendStepSlider(args[0].asString().toString(), steps, defIndex); + form.appendStepSlider("", args[0].asString().toString(), steps, defIndex, tooltip); return this->getScriptObject(); } CATCH("Fail in addStepSlider!") diff --git a/src/legacy/api/GuiAPI.h b/src/legacy/api/GuiAPI.h index 6f828e6..f95ddbc 100644 --- a/src/legacy/api/GuiAPI.h +++ b/src/legacy/api/GuiAPI.h @@ -1,7 +1,7 @@ #pragma once #include "api/APIHelp.h" #include "ll/api/form/SimpleForm.h" -#include "lse/api/helper/CustomFormWrapper.h" +#include "lse/api/helper/RawCustomForm.h" //////////////////// Classes //////////////////// @@ -30,17 +30,17 @@ extern ClassDefine SimpleFormClassBuilder; class CustomFormClass : public ScriptClass { private: - lse::form::CustomFormWrapper form; + lse::form::RawCustomForm form; public: CustomFormClass(); - lse::form::CustomFormWrapper* get() { return &form; } + lse::form::RawCustomForm* get() { return &form; } static Local newForm(); - static lse::form::CustomFormWrapper* extract(Local v); + static lse::form::RawCustomForm* extract(Local v); static void - sendForm(lse::form::CustomFormWrapper* form, Player* player, script::Local& callback, bool update = true); + sendForm(lse::form::RawCustomForm* form, Player* player, script::Local& callback, bool update = true); Local setTitle(const Arguments& args); Local addHeader(const Arguments& args); diff --git a/src/legacy/api/PlayerAPI.cpp b/src/legacy/api/PlayerAPI.cpp index 7812f22..5a066a1 100644 --- a/src/legacy/api/PlayerAPI.cpp +++ b/src/legacy/api/PlayerAPI.cpp @@ -2083,9 +2083,7 @@ Local PlayerClass::transServer(const Arguments& args) { Player* player = get(); if (!player) return Local(); - TransferPacket packet; - packet.mServerAddress = args[0].asString().toString(); - packet.mServerPort = args[1].asNumber().toInt32(); + TransferPacket packet(args[0].asString().toString(), args[1].asNumber().toInt32()); player->sendNetworkPacket(packet); return Boolean::newBoolean(true); } @@ -2552,17 +2550,22 @@ Local PlayerClass::sendCustomForm(const Arguments& args) { [id{player->getOrCreateUniqueID()}, engine{EngineScope::currentEngine()}, callback{script::Global(args[1].asFunction())}, - formData](Player& player, std::optional const& result, ll::form::FormCancelReason reason) { + formData](Player& player, std::optional const& data, ll::form::FormCancelReason reason) { if ((ll::getGamingStatus() != ll::GamingStatus::Running)) return; if (!EngineManager::isValid(engine)) return; - auto newResult = lse::form::CustomFormWrapper::convertResult(result, formData); EngineScope scope(engine); try { + Local result; + if (data) { + auto dataJson = nlohmann::ordered_json::parse(*data); + result = JsonToValue(dataJson); + if (result.isNull()) result = Array::newArray(); + } callback.get().call( {}, PlayerClass::newPlayer(&player), - newResult ? JsonToValue(*newResult) : Local(), + result, reason.has_value() ? Number::newNumber((uchar)reason.value()) : Local() ); } diff --git a/src/lse/api/helper/CustomFormWrapper.cpp b/src/lse/api/helper/CustomFormWrapper.cpp deleted file mode 100644 index 7346827..0000000 --- a/src/lse/api/helper/CustomFormWrapper.cpp +++ /dev/null @@ -1,61 +0,0 @@ -#include "CustomFormWrapper.h" - -#include "nlohmann/json.hpp" -#include "nlohmann/json_fwd.hpp" - -namespace lse::form { - -std::set const CustomFormWrapper::COMMON_ELEMENT_TYPENAMES{"header", "label", "divider"}; - -CustomFormResult -CustomFormWrapper::convertResult(std::optional const& result, std::vector const& resultIndices) { - if (!result) return {}; - auto data = nlohmann::ordered_json::parse(*result); - if (!data.is_null() && !data.is_array()) return {}; - - size_t count = resultIndices.size(); - if (data.size() == 0) return nlohmann::ordered_json::array({}); - if (data.size() == count) { - return data; - } - - auto views = resultIndices | std::views::transform([&](int index) { - if (index < 0) return nlohmann::ordered_json(); - return data[index]; - }); - return std::vector(views.begin(), views.end()); -} - -CustomFormResult -CustomFormWrapper::convertResult(std::optional const& result, nlohmann::ordered_json const& formData) { - if (!result) return {}; - auto formType = formData.find("type"); - auto content = formData.find("content"); - if (content == formData.end() || formType == formData.end() || *formType != "custom_form") { - return nlohmann::ordered_json::parse(*result); - } - std::vector resultIndices{}; - resultIndices.reserve(content->size()); - int index = 0; - for (auto& element : *content) { - auto elementType = element.find("type"); - if (elementType == element.end()) return {}; - if (COMMON_ELEMENT_TYPENAMES.contains(*elementType)) resultIndices.emplace_back(-1); - else resultIndices.emplace_back(index++); - } - return convertResult(result, resultIndices); -} - -ll::form::Form::RawFormCallback -CustomFormWrapper::convertCallback(Callback&& callback, std::vector resultIndices) { - ll::form::Form::RawFormCallback oriCallback{}; - if (callback) - oriCallback = [resultIndices = std::move(resultIndices), - callback = std::move(callback - )](Player& player, std::optional const& data, ll::form::FormCancelReason reason) { - callback(player, convertResult(data, resultIndices), reason); - }; - return oriCallback; -} - -} // namespace lse::form \ No newline at end of file diff --git a/src/lse/api/helper/CustomFormWrapper.h b/src/lse/api/helper/CustomFormWrapper.h deleted file mode 100644 index e3542a4..0000000 --- a/src/lse/api/helper/CustomFormWrapper.h +++ /dev/null @@ -1,107 +0,0 @@ -#pragma once - -#include "ll/api/form/CustomForm.h" -#include "ll/api/form/FormBase.h" -#include "nlohmann/json_fwd.hpp" - -namespace lse::form { - -using CustomFormResult = std::optional; - -class CustomFormWrapper { - static std::set const COMMON_ELEMENT_TYPENAMES; - - ll::form::CustomForm form; - std::vector resultIndices{}; - size_t resultIndex = 0; - -public: - using Callback = std::function; - - [[nodiscard]] CustomFormWrapper() : form() {}; - - [[nodiscard]] explicit CustomFormWrapper(std::string const& title) : form(title) {}; - - ~CustomFormWrapper() = default; - - inline CustomFormWrapper& setTitle(std::string const& title) { - form.setTitle(title); - return *this; - }; - - inline CustomFormWrapper& setSubmitButton(std::string const& text) { - form.setSubmitButton(text); - return *this; - }; - - inline CustomFormWrapper& appendHeader(std::string const& text) { - form.appendHeader(text); - resultIndices.emplace_back(-1); - return *this; - }; - - inline CustomFormWrapper& appendLabel(std::string const& text) { - form.appendLabel(text); - resultIndices.emplace_back(-1); - return *this; - }; - - inline CustomFormWrapper& appendDivider() { - form.appendDivider(); - resultIndices.emplace_back(-1); - return *this; - }; - - inline CustomFormWrapper& - appendInput(std::string const& text, std::string const& placeholder = {}, std::string const& defaultVal = {}) { - form.appendInput(std::to_string(resultIndex), text, placeholder, defaultVal); - resultIndices.emplace_back(resultIndex++); - return *this; - }; - - inline CustomFormWrapper& appendToggle(std::string const& text, bool defaultVal = false) { - form.appendToggle(std::to_string(resultIndex), text, defaultVal); - resultIndices.emplace_back(resultIndex++); - return *this; - }; - - inline CustomFormWrapper& - appendDropdown(std::string const& text, std::vector const& options, size_t defaultVal = 0) { - form.appendDropdown(std::to_string(resultIndex), text, options, defaultVal); - resultIndices.emplace_back(resultIndex++); - return *this; - }; - - inline CustomFormWrapper& - appendSlider(std::string const& text, double min, double max, double step = 0.0, double defaultVal = 0.0) { - form.appendSlider(std::to_string(resultIndex), text, min, max, step, defaultVal); - resultIndices.emplace_back(resultIndex++); - return *this; - }; - - inline CustomFormWrapper& - appendStepSlider(std::string const& text, std::vector const& steps, size_t defaultVal = 0) { - form.appendStepSlider(std::to_string(resultIndex), text, steps, defaultVal); - resultIndices.emplace_back(resultIndex++); - return *this; - }; - - static CustomFormResult - convertResult(std::optional const& result, std::vector const& resultIndices); - - static CustomFormResult - convertResult(std::optional const& result, nlohmann::ordered_json const& formData); - - static ll::form::Form::RawFormCallback convertCallback(Callback&& callback, std::vector resultIndices); - - inline CustomFormWrapper& sendTo(Player& player, Callback&& callback = {}) { - ll::form::Form::sendRawTo(player, form.getFormData(), convertCallback(std::move(callback), resultIndices)); - return *this; - }; - - inline CustomFormWrapper& sendUpdate(Player& player, Callback&& callback = {}) { - ll::form::Form::sendRawUpdate(player, form.getFormData(), convertCallback(std::move(callback), resultIndices)); - return *this; - }; -}; -} // namespace lse::form \ No newline at end of file diff --git a/src/lse/api/helper/RawCustomForm.h b/src/lse/api/helper/RawCustomForm.h new file mode 100644 index 0000000..ea36fa1 --- /dev/null +++ b/src/lse/api/helper/RawCustomForm.h @@ -0,0 +1,27 @@ +#pragma once + +#include "ll/api/form/CustomForm.h" +#include "ll/api/form/FormBase.h" + +#include + +namespace lse::form { + +using CustomFormResult = std::optional; + +class RawCustomForm : public ::ll::form::CustomForm { + +public: + using RawCallback = ll::form::Form::RawFormCallback; + + inline RawCustomForm& sendRawTo(Player& player, RawCallback&& callback = {}) { + ll::form::Form::sendRawTo(player, getFormData(), std::move(callback)); + return *this; + }; + + inline RawCustomForm& sendRawUpdate(Player& player, RawCallback&& callback = {}) { + ll::form::Form::sendRawUpdate(player, getFormData(), std::move(callback)); + return *this; + }; +}; +} // namespace lse::form \ No newline at end of file