mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-04-19 15:52:53 +00:00
Make sure you can specify event handlers more than once to be able to append script data
This commit is contained in:
parent
d900b9cccd
commit
8a3bbf948b
@ -21,9 +21,11 @@ void GenericMenuEventHandlerSetPropertySequence::ProcessMatch(MenuFileParserStat
|
|||||||
{
|
{
|
||||||
if (m_set_callback)
|
if (m_set_callback)
|
||||||
{
|
{
|
||||||
auto newEventHandlerSet = std::make_unique<CommonEventHandlerSet>();
|
auto& eventHandlerPtr = m_set_callback(state, result.NextCapture(CAPTURE_FIRST_TOKEN).GetPos());
|
||||||
state->m_current_event_handler_set = newEventHandlerSet.get();
|
if(!eventHandlerPtr)
|
||||||
state->m_current_nested_event_handler_set = newEventHandlerSet.get();
|
eventHandlerPtr = std::make_unique<CommonEventHandlerSet>();
|
||||||
m_set_callback(state, result.NextCapture(CAPTURE_FIRST_TOKEN).GetPos(), std::move(newEventHandlerSet));
|
|
||||||
|
state->m_current_event_handler_set = eventHandlerPtr.get();
|
||||||
|
state->m_current_nested_event_handler_set = eventHandlerPtr.get();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,7 @@ namespace menu
|
|||||||
class GenericMenuEventHandlerSetPropertySequence final : public MenuFileParser::sequence_t
|
class GenericMenuEventHandlerSetPropertySequence final : public MenuFileParser::sequence_t
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
using callback_t = std::function<void(MenuFileParserState* state, const TokenPos& pos, std::unique_ptr<CommonEventHandlerSet> value)>;
|
using callback_t = std::function<std::unique_ptr<CommonEventHandlerSet>& (MenuFileParserState* state, const TokenPos& pos)>;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static constexpr auto CAPTURE_FIRST_TOKEN = 1;
|
static constexpr auto CAPTURE_FIRST_TOKEN = 1;
|
||||||
|
@ -681,37 +681,37 @@ void ItemScopeSequences::AddSequences(FeatureLevel featureLevel, bool permissive
|
|||||||
{
|
{
|
||||||
state->m_current_item->m_background = value;
|
state->m_current_item->m_background = value;
|
||||||
}));
|
}));
|
||||||
AddSequence(std::make_unique<GenericMenuEventHandlerSetPropertySequence>("onFocus", [](const MenuFileParserState* state, const TokenPos&, std::unique_ptr<CommonEventHandlerSet> value)
|
AddSequence(std::make_unique<GenericMenuEventHandlerSetPropertySequence>("onFocus", [](const MenuFileParserState* state, const TokenPos&) -> std::unique_ptr<CommonEventHandlerSet>&
|
||||||
{
|
{
|
||||||
state->m_current_item->m_on_focus = std::move(value);
|
return state->m_current_item->m_on_focus;
|
||||||
}));
|
}));
|
||||||
AddSequence(std::make_unique<GenericMenuEventHandlerSetPropertySequence>("leaveFocus", [](const MenuFileParserState* state, const TokenPos&, std::unique_ptr<CommonEventHandlerSet> value)
|
AddSequence(std::make_unique<GenericMenuEventHandlerSetPropertySequence>("leaveFocus", [](const MenuFileParserState* state, const TokenPos&) -> std::unique_ptr<CommonEventHandlerSet>&
|
||||||
{
|
{
|
||||||
state->m_current_item->m_on_leave_focus = std::move(value);
|
return state->m_current_item->m_on_leave_focus;
|
||||||
}));
|
}));
|
||||||
AddSequence(std::make_unique<GenericMenuEventHandlerSetPropertySequence>("mouseEnter", [](const MenuFileParserState* state, const TokenPos&, std::unique_ptr<CommonEventHandlerSet> value)
|
AddSequence(std::make_unique<GenericMenuEventHandlerSetPropertySequence>("mouseEnter", [](const MenuFileParserState* state, const TokenPos&) -> std::unique_ptr<CommonEventHandlerSet>&
|
||||||
{
|
{
|
||||||
state->m_current_item->m_on_mouse_enter = std::move(value);
|
return state->m_current_item->m_on_mouse_enter;
|
||||||
}));
|
}));
|
||||||
AddSequence(std::make_unique<GenericMenuEventHandlerSetPropertySequence>("mouseExit", [](const MenuFileParserState* state, const TokenPos&, std::unique_ptr<CommonEventHandlerSet> value)
|
AddSequence(std::make_unique<GenericMenuEventHandlerSetPropertySequence>("mouseExit", [](const MenuFileParserState* state, const TokenPos&) -> std::unique_ptr<CommonEventHandlerSet>&
|
||||||
{
|
{
|
||||||
state->m_current_item->m_on_mouse_exit = std::move(value);
|
return state->m_current_item->m_on_mouse_exit;
|
||||||
}));
|
}));
|
||||||
AddSequence(std::make_unique<GenericMenuEventHandlerSetPropertySequence>("mouseEnterText", [](const MenuFileParserState* state, const TokenPos&, std::unique_ptr<CommonEventHandlerSet> value)
|
AddSequence(std::make_unique<GenericMenuEventHandlerSetPropertySequence>("mouseEnterText", [](const MenuFileParserState* state, const TokenPos&) -> std::unique_ptr<CommonEventHandlerSet>&
|
||||||
{
|
{
|
||||||
state->m_current_item->m_on_mouse_enter_text = std::move(value);
|
return state->m_current_item->m_on_mouse_enter_text;
|
||||||
}));
|
}));
|
||||||
AddSequence(std::make_unique<GenericMenuEventHandlerSetPropertySequence>("mouseExitText", [](const MenuFileParserState* state, const TokenPos&, std::unique_ptr<CommonEventHandlerSet> value)
|
AddSequence(std::make_unique<GenericMenuEventHandlerSetPropertySequence>("mouseExitText", [](const MenuFileParserState* state, const TokenPos&) -> std::unique_ptr<CommonEventHandlerSet>&
|
||||||
{
|
{
|
||||||
state->m_current_item->m_on_mouse_exit_text = std::move(value);
|
return state->m_current_item->m_on_mouse_exit_text;
|
||||||
}));
|
}));
|
||||||
AddSequence(std::make_unique<GenericMenuEventHandlerSetPropertySequence>("action", [](const MenuFileParserState* state, const TokenPos&, std::unique_ptr<CommonEventHandlerSet> value)
|
AddSequence(std::make_unique<GenericMenuEventHandlerSetPropertySequence>("action", [](const MenuFileParserState* state, const TokenPos&) -> std::unique_ptr<CommonEventHandlerSet>&
|
||||||
{
|
{
|
||||||
state->m_current_item->m_on_action = std::move(value);
|
return state->m_current_item->m_on_action;
|
||||||
}));
|
}));
|
||||||
AddSequence(std::make_unique<GenericMenuEventHandlerSetPropertySequence>("accept", [](const MenuFileParserState* state, const TokenPos&, std::unique_ptr<CommonEventHandlerSet> value)
|
AddSequence(std::make_unique<GenericMenuEventHandlerSetPropertySequence>("accept", [](const MenuFileParserState* state, const TokenPos&) -> std::unique_ptr<CommonEventHandlerSet>&
|
||||||
{
|
{
|
||||||
state->m_current_item->m_on_accept = std::move(value);
|
return state->m_current_item->m_on_accept;
|
||||||
}));
|
}));
|
||||||
// special
|
// special
|
||||||
AddSequence(std::make_unique<GenericStringPropertySequence>("dvar", [](const MenuFileParserState* state, const TokenPos&, const std::string& value)
|
AddSequence(std::make_unique<GenericStringPropertySequence>("dvar", [](const MenuFileParserState* state, const TokenPos&, const std::string& value)
|
||||||
@ -891,10 +891,10 @@ void ItemScopeSequences::AddSequences(FeatureLevel featureLevel, bool permissive
|
|||||||
ItemScopeOperations::EnsureHasListboxFeatures(*state->m_current_item, pos);
|
ItemScopeOperations::EnsureHasListboxFeatures(*state->m_current_item, pos);
|
||||||
state->m_current_item->m_list_box_features->m_element_style = value;
|
state->m_current_item->m_list_box_features->m_element_style = value;
|
||||||
}));
|
}));
|
||||||
AddSequence(std::make_unique<GenericMenuEventHandlerSetPropertySequence>("doubleclick", [](const MenuFileParserState* state, const TokenPos& pos, std::unique_ptr<CommonEventHandlerSet> value)
|
AddSequence(std::make_unique<GenericMenuEventHandlerSetPropertySequence>("doubleclick", [](const MenuFileParserState* state, const TokenPos& pos) -> std::unique_ptr<CommonEventHandlerSet>&
|
||||||
{
|
{
|
||||||
ItemScopeOperations::EnsureHasListboxFeatures(*state->m_current_item, pos);
|
ItemScopeOperations::EnsureHasListboxFeatures(*state->m_current_item, pos);
|
||||||
state->m_current_item->m_list_box_features->m_on_double_click = std::move(value);
|
return state->m_current_item->m_list_box_features->m_on_double_click;
|
||||||
}));
|
}));
|
||||||
AddSequence(std::make_unique<GenericColorPropertySequence>("selectBorder", [](const MenuFileParserState* state, const TokenPos& pos, const CommonColor value)
|
AddSequence(std::make_unique<GenericColorPropertySequence>("selectBorder", [](const MenuFileParserState* state, const TokenPos& pos, const CommonColor value)
|
||||||
{
|
{
|
||||||
|
@ -258,21 +258,21 @@ void MenuScopeSequences::AddSequences(FeatureLevel featureLevel, bool permissive
|
|||||||
{
|
{
|
||||||
state->m_current_menu->m_visible_expression = std::move(value);
|
state->m_current_menu->m_visible_expression = std::move(value);
|
||||||
}));
|
}));
|
||||||
AddSequence(std::make_unique<GenericMenuEventHandlerSetPropertySequence>("onOpen", [](const MenuFileParserState* state, const TokenPos&, std::unique_ptr<CommonEventHandlerSet> value)
|
AddSequence(std::make_unique<GenericMenuEventHandlerSetPropertySequence>("onOpen", [](const MenuFileParserState* state, const TokenPos&) -> std::unique_ptr<CommonEventHandlerSet>&
|
||||||
{
|
{
|
||||||
state->m_current_menu->m_on_open = std::move(value);
|
return state->m_current_menu->m_on_open;
|
||||||
}));
|
}));
|
||||||
AddSequence(std::make_unique<GenericMenuEventHandlerSetPropertySequence>("onClose", [](const MenuFileParserState* state, const TokenPos&, std::unique_ptr<CommonEventHandlerSet> value)
|
AddSequence(std::make_unique<GenericMenuEventHandlerSetPropertySequence>("onClose", [](const MenuFileParserState* state, const TokenPos&) -> std::unique_ptr<CommonEventHandlerSet>&
|
||||||
{
|
{
|
||||||
state->m_current_menu->m_on_close = std::move(value);
|
return state->m_current_menu->m_on_close;
|
||||||
}));
|
}));
|
||||||
AddSequence(std::make_unique<GenericMenuEventHandlerSetPropertySequence>("onRequestClose", [](const MenuFileParserState* state, const TokenPos&, std::unique_ptr<CommonEventHandlerSet> value)
|
AddSequence(std::make_unique<GenericMenuEventHandlerSetPropertySequence>("onRequestClose", [](const MenuFileParserState* state, const TokenPos&) -> std::unique_ptr<CommonEventHandlerSet>&
|
||||||
{
|
{
|
||||||
state->m_current_menu->m_on_request_close = std::move(value);
|
return state->m_current_menu->m_on_request_close;
|
||||||
}));
|
}));
|
||||||
AddSequence(std::make_unique<GenericMenuEventHandlerSetPropertySequence>("onESC", [](const MenuFileParserState* state, const TokenPos&, std::unique_ptr<CommonEventHandlerSet> value)
|
AddSequence(std::make_unique<GenericMenuEventHandlerSetPropertySequence>("onESC", [](const MenuFileParserState* state, const TokenPos&) -> std::unique_ptr<CommonEventHandlerSet>&
|
||||||
{
|
{
|
||||||
state->m_current_menu->m_on_esc = std::move(value);
|
return state->m_current_menu->m_on_esc;
|
||||||
}));
|
}));
|
||||||
AddSequence(std::make_unique<GenericIntPropertySequence>("border", [](const MenuFileParserState* state, const TokenPos&, const int value)
|
AddSequence(std::make_unique<GenericIntPropertySequence>("border", [](const MenuFileParserState* state, const TokenPos&, const int value)
|
||||||
{
|
{
|
||||||
|
@ -299,4 +299,83 @@ namespace test::game::iw4::menu::parsing::it
|
|||||||
REQUIRE(menu->itemCount == 0);
|
REQUIRE(menu->itemCount == 0);
|
||||||
REQUIRE(menu->items == nullptr);
|
REQUIRE(menu->items == nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("MenuParsingIW4IT: Can specify event handler multiple times", "[parsing][converting][menu][it]")
|
||||||
|
{
|
||||||
|
MenuParsingItHelper helper;
|
||||||
|
|
||||||
|
helper.AddFile(R"testmenu(
|
||||||
|
{
|
||||||
|
menuDef
|
||||||
|
{
|
||||||
|
name "Blab"
|
||||||
|
onOpen
|
||||||
|
{
|
||||||
|
focusFirst;
|
||||||
|
}
|
||||||
|
onOpen
|
||||||
|
{
|
||||||
|
play "fart_sound";
|
||||||
|
}
|
||||||
|
onOpen
|
||||||
|
{
|
||||||
|
exec "wait 1; set r_fullbright 1";
|
||||||
|
}
|
||||||
|
|
||||||
|
itemDef
|
||||||
|
{
|
||||||
|
action
|
||||||
|
{
|
||||||
|
play "lmfao";
|
||||||
|
}
|
||||||
|
action
|
||||||
|
{
|
||||||
|
play "lol";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)testmenu");
|
||||||
|
|
||||||
|
const auto result = helper.RunIntegrationTest();
|
||||||
|
REQUIRE(result);
|
||||||
|
|
||||||
|
const auto* menuList = helper.GetMenuListAsset();
|
||||||
|
const auto* menu = helper.GetMenuAsset("Blab");
|
||||||
|
|
||||||
|
REQUIRE(menuList->menuCount == 1);
|
||||||
|
REQUIRE(menuList->menus);
|
||||||
|
|
||||||
|
REQUIRE(menuList->menus[0] == menu);
|
||||||
|
|
||||||
|
REQUIRE(menu->window.name == "Blab"s);
|
||||||
|
|
||||||
|
REQUIRE(menu->onOpen != nullptr);
|
||||||
|
REQUIRE(menu->onOpen->eventHandlerCount == 3);
|
||||||
|
REQUIRE(menu->onOpen->eventHandlers[0]->eventType == EventType::EVENT_UNCONDITIONAL);
|
||||||
|
REQUIRE(menu->onOpen->eventHandlers[0]->eventData.unconditionalScript != nullptr);
|
||||||
|
REQUIRE(menu->onOpen->eventHandlers[0]->eventData.unconditionalScript == R"("focusFirst" ; )"s);
|
||||||
|
REQUIRE(menu->onOpen->eventHandlers[1]->eventType == EventType::EVENT_UNCONDITIONAL);
|
||||||
|
REQUIRE(menu->onOpen->eventHandlers[1]->eventData.unconditionalScript != nullptr);
|
||||||
|
REQUIRE(menu->onOpen->eventHandlers[1]->eventData.unconditionalScript == R"("play" "fart_sound" ; )"s);
|
||||||
|
REQUIRE(menu->onOpen->eventHandlers[2]->eventType == EventType::EVENT_UNCONDITIONAL);
|
||||||
|
REQUIRE(menu->onOpen->eventHandlers[2]->eventData.unconditionalScript != nullptr);
|
||||||
|
REQUIRE(menu->onOpen->eventHandlers[2]->eventData.unconditionalScript == R"("exec" "wait 1; set r_fullbright 1" ; )"s);
|
||||||
|
|
||||||
|
|
||||||
|
REQUIRE(menu->itemCount == 1);
|
||||||
|
REQUIRE(menu->items != nullptr);
|
||||||
|
|
||||||
|
const auto* item = menu->items[0];
|
||||||
|
REQUIRE(item != nullptr);
|
||||||
|
|
||||||
|
REQUIRE(item->action != nullptr);
|
||||||
|
REQUIRE(item->action->eventHandlerCount == 2);
|
||||||
|
REQUIRE(item->action->eventHandlers[0]->eventType == EventType::EVENT_UNCONDITIONAL);
|
||||||
|
REQUIRE(item->action->eventHandlers[0]->eventData.unconditionalScript != nullptr);
|
||||||
|
REQUIRE(item->action->eventHandlers[0]->eventData.unconditionalScript == R"("play" "lmfao" ; )"s);
|
||||||
|
REQUIRE(item->action->eventHandlers[1]->eventType == EventType::EVENT_UNCONDITIONAL);
|
||||||
|
REQUIRE(item->action->eventHandlers[1]->eventData.unconditionalScript != nullptr);
|
||||||
|
REQUIRE(item->action->eventHandlers[1]->eventData.unconditionalScript == R"("play" "lol" ; )"s);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user