add gui.confirm(...)

This commit is contained in:
MihailRis 2025-01-02 16:53:28 +03:00
parent e2f6c263e7
commit 7fce735ca1
6 changed files with 76 additions and 5 deletions

View File

@ -61,3 +61,21 @@ gui.escape_markup(
```
Escapes markup in text.
```lua
gui.confirm(
-- message (does not translate automatically, use gui.str(...))
message: str,
-- function called upon confirmation
on_confirm: function() -> nil,
-- function called upon denial/cancellation
[optional] on_deny: function() -> nil,
-- text for the confirmation button (default: "Yes")
-- use an empty string for the default value if you want to specify no_text.
[optional] yes_text: str,
-- text for the denial button (default: "No")
[optional] no_text: str,
)
```
Requests confirmation from the user for an action. **Does not** stop code execution.

View File

@ -58,3 +58,21 @@ gui.escape_markup(
```
Экранирует разметку в тексте.
```lua
gui.confirm(
-- сообщение (не переводится автоматически, используйте gui.str(...))
message: str,
-- функция, вызываемая при подтвержении
on_confirm: function() -> nil,
-- функция, вызываемая при отказе/отмене
[опционально] on_deny: function() -> nil,
-- текст кнопки подтвержения (по-умолчанию: "Да")
-- используйте пустую строку для значения по-умолчанию, если нужно указать no_text.
[опционально] yes_text: str,
-- текст кнопки отказа (по-умолчанию: "Нет")
[опционально] no_text: str,
)
```
Запрашивает у пользователя подтверждение действия. **Не** останавливает выполнение кода.

View File

@ -50,11 +50,13 @@ void guiutil::alert(
}
void guiutil::confirm(
const std::shared_ptr<gui::Menu>& menu,
const std::wstring& text,
const runnable& on_confirm,
std::wstring yestext,
std::wstring notext) {
const std::shared_ptr<gui::Menu>& menu,
const std::wstring& text,
const runnable& on_confirm,
const runnable& on_deny,
std::wstring yestext,
std::wstring notext
) {
if (yestext.empty()) yestext = langs::get(L"Yes");
if (notext.empty()) notext = langs::get(L"No");
@ -71,6 +73,8 @@ void guiutil::confirm(
}));
subpanel->add(std::make_shared<Button>(notext, glm::vec4(8.f), [=](GUI*){
if (on_deny)
on_deny();
menu->back();
}));

View File

@ -22,6 +22,7 @@ namespace guiutil {
const std::shared_ptr<gui::Menu>& menu,
const std::wstring& text,
const runnable& on_confirm=nullptr,
const runnable& on_deny=nullptr,
std::wstring yestext=L"",
std::wstring notext=L"");

View File

@ -122,6 +122,7 @@ static void show_convert_request(
engine.getGUI()->getMenu(),
langs::get(message),
on_confirm,
nullptr,
L"",
langs::get(L"Cancel")
);

View File

@ -759,6 +759,34 @@ static int l_gui_escape_markup(lua::State* L) {
return lua::pushstring(L, text);
}
static int l_gui_confirm(lua::State* L) {
auto question = lua::require_wstring(L, 1);
lua::pushvalue(L, 2);
auto onconfirm = lua::create_runnable(L);
runnable ondeny = nullptr;
if (lua::gettop(L) > 2) {
lua::pushvalue(L, 3);
ondeny = lua::create_runnable(L);
}
std::wstring yestext = L"";
if (lua::gettop(L) > 3) {
yestext = lua::require_wstring(L, 4);
}
std::wstring notext = L"";
if (lua::gettop(L) > 4) {
notext = lua::require_wstring(L, 5);
}
guiutil::confirm(
engine->getGUI()->getMenu(),
question,
onconfirm,
ondeny,
yestext,
notext
);
return 0;
}
const luaL_Reg guilib[] = {
{"get_viewport", lua::wrap<l_gui_getviewport>},
{"getattr", lua::wrap<l_gui_getattr>},
@ -768,6 +796,7 @@ const luaL_Reg guilib[] = {
{"get_locales_info", lua::wrap<l_gui_get_locales_info>},
{"clear_markup", lua::wrap<l_gui_clear_markup>},
{"escape_markup", lua::wrap<l_gui_escape_markup>},
{"confirm", lua::wrap<l_gui_confirm>},
{"__reindex", lua::wrap<l_gui_reindex>},
{NULL, NULL}
};