From 5af2e6da61187cb74ed1ff8d8e217105def17306 Mon Sep 17 00:00:00 2001 From: Jan Date: Sat, 6 Nov 2021 17:47:18 +0100 Subject: [PATCH] Add menu scopes to state before closing them --- .../Parsing/Menu/Domain/CommonMenuDef.h | 6 +++++ .../Parsing/Menu/MenuFileParserState.cpp | 6 ++++- .../Parsing/Menu/MenuFileParserState.h | 12 ++++------ .../Menu/Sequence/FunctionScopeSequences.cpp | 3 +-- ...ricMenuEventHandlerSetPropertySequence.cpp | 8 +++++-- .../Menu/Sequence/GlobalScopeSequences.cpp | 8 +++++-- .../Menu/Sequence/ItemScopeSequences.cpp | 1 - .../Menu/Sequence/MenuScopeSequences.cpp | 24 ++++++++++++++++--- 8 files changed, 50 insertions(+), 18 deletions(-) diff --git a/src/ObjLoading/Parsing/Menu/Domain/CommonMenuDef.h b/src/ObjLoading/Parsing/Menu/Domain/CommonMenuDef.h index e73adb46..e956a823 100644 --- a/src/ObjLoading/Parsing/Menu/Domain/CommonMenuDef.h +++ b/src/ObjLoading/Parsing/Menu/Domain/CommonMenuDef.h @@ -5,6 +5,7 @@ #include "CommonItemDef.h" #include "CommonMenuTypes.h" +#include "EventHandler/CommonEventHandlerSet.h" #include "Expression/ICommonExpression.h" namespace menu @@ -38,6 +39,11 @@ namespace menu std::unique_ptr m_rect_h_exp; std::unique_ptr m_open_sound_exp; std::unique_ptr m_close_sound_exp; + std::unique_ptr m_on_open; + std::unique_ptr m_on_close; + std::unique_ptr m_on_request_close; + std::unique_ptr m_on_esc; + std::map> m_key_handler; bool m_full_screen; bool m_screen_space; diff --git a/src/ObjLoading/Parsing/Menu/MenuFileParserState.cpp b/src/ObjLoading/Parsing/Menu/MenuFileParserState.cpp index 966c2cb9..628c7c1a 100644 --- a/src/ObjLoading/Parsing/Menu/MenuFileParserState.cpp +++ b/src/ObjLoading/Parsing/Menu/MenuFileParserState.cpp @@ -10,6 +10,10 @@ MenuFileParserState::EventHandlerConditionState::EventHandlerConditionState(std: MenuFileParserState::MenuFileParserState(const FeatureLevel featureLevel) : m_feature_level(featureLevel), - m_in_global_scope(false) + m_in_global_scope(false), + m_current_function(nullptr), + m_current_menu(nullptr), + m_current_item(nullptr), + m_current_event_handler_set(nullptr) { } diff --git a/src/ObjLoading/Parsing/Menu/MenuFileParserState.h b/src/ObjLoading/Parsing/Menu/MenuFileParserState.h index f8f3c1b5..c130e225 100644 --- a/src/ObjLoading/Parsing/Menu/MenuFileParserState.h +++ b/src/ObjLoading/Parsing/Menu/MenuFileParserState.h @@ -1,6 +1,5 @@ #pragma once -#include #include #include #include @@ -36,12 +35,11 @@ namespace menu std::map m_menus_by_name; bool m_in_global_scope; - std::unique_ptr m_current_function; - std::unique_ptr m_current_menu; - std::unique_ptr m_current_item; - std::unique_ptr m_current_event_handler_set; - - std::function value)> m_event_handler_set_callback; + CommonFunctionDef* m_current_function; + CommonMenuDef* m_current_menu; + CommonItemDef* m_current_item; + CommonEventHandlerSet* m_current_event_handler_set; + std::ostringstream m_current_script; std::stack m_current_condition; diff --git a/src/ObjLoading/Parsing/Menu/Sequence/FunctionScopeSequences.cpp b/src/ObjLoading/Parsing/Menu/Sequence/FunctionScopeSequences.cpp index 914683ac..c1180a2b 100644 --- a/src/ObjLoading/Parsing/Menu/Sequence/FunctionScopeSequences.cpp +++ b/src/ObjLoading/Parsing/Menu/Sequence/FunctionScopeSequences.cpp @@ -29,8 +29,7 @@ namespace menu::function_scope_sequences const auto existingFunction = state->m_functions_by_name.find(state->m_current_function->m_name); if (existingFunction == state->m_functions_by_name.end()) { - state->m_functions_by_name.emplace(std::make_pair(state->m_current_function->m_name, state->m_current_function.get())); - state->m_functions.emplace_back(std::move(state->m_current_function)); + state->m_functions_by_name.emplace(std::make_pair(state->m_current_function->m_name, state->m_current_function)); state->m_current_function = nullptr; } else diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericMenuEventHandlerSetPropertySequence.cpp b/src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericMenuEventHandlerSetPropertySequence.cpp index 11f65a5f..61c93094 100644 --- a/src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericMenuEventHandlerSetPropertySequence.cpp +++ b/src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericMenuEventHandlerSetPropertySequence.cpp @@ -19,6 +19,10 @@ GenericMenuEventHandlerSetPropertySequence::GenericMenuEventHandlerSetPropertySe void GenericMenuEventHandlerSetPropertySequence::ProcessMatch(MenuFileParserState* state, SequenceResult& result) const { - state->m_current_event_handler_set = std::make_unique(); - state->m_event_handler_set_callback = m_set_callback; + if (m_set_callback) + { + auto newEventHandlerSet = std::make_unique(); + state->m_current_event_handler_set = newEventHandlerSet.get(); + m_set_callback(state, std::move(newEventHandlerSet)); + } } diff --git a/src/ObjLoading/Parsing/Menu/Sequence/GlobalScopeSequences.cpp b/src/ObjLoading/Parsing/Menu/Sequence/GlobalScopeSequences.cpp index 7953e671..66b6f491 100644 --- a/src/ObjLoading/Parsing/Menu/Sequence/GlobalScopeSequences.cpp +++ b/src/ObjLoading/Parsing/Menu/Sequence/GlobalScopeSequences.cpp @@ -42,7 +42,9 @@ namespace menu::global_scope_sequences protected: void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override { - state->m_current_function = std::make_unique(); + auto newFunction = std::make_unique(); + state->m_current_function = newFunction.get(); + state->m_functions.emplace_back(std::move(newFunction)); } }; @@ -62,7 +64,9 @@ namespace menu::global_scope_sequences protected: void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override { - state->m_current_menu = std::make_unique(); + auto newMenu = std::make_unique(); + state->m_current_menu = newMenu.get(); + state->m_menus.emplace_back(std::move(newMenu)); } }; diff --git a/src/ObjLoading/Parsing/Menu/Sequence/ItemScopeSequences.cpp b/src/ObjLoading/Parsing/Menu/Sequence/ItemScopeSequences.cpp index 2485b339..89fbb05e 100644 --- a/src/ObjLoading/Parsing/Menu/Sequence/ItemScopeSequences.cpp +++ b/src/ObjLoading/Parsing/Menu/Sequence/ItemScopeSequences.cpp @@ -29,7 +29,6 @@ namespace menu::item_scope_sequences protected: void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override { - state->m_current_menu->m_items.emplace_back(std::move(state->m_current_item)); state->m_current_item = nullptr; } }; diff --git a/src/ObjLoading/Parsing/Menu/Sequence/MenuScopeSequences.cpp b/src/ObjLoading/Parsing/Menu/Sequence/MenuScopeSequences.cpp index d1538b53..63f1ca21 100644 --- a/src/ObjLoading/Parsing/Menu/Sequence/MenuScopeSequences.cpp +++ b/src/ObjLoading/Parsing/Menu/Sequence/MenuScopeSequences.cpp @@ -8,6 +8,7 @@ #include "Generic/GenericFloatingPointPropertySequence.h" #include "Generic/GenericIntPropertySequence.h" #include "Generic/GenericKeywordPropertySequence.h" +#include "Generic/GenericMenuEventHandlerSetPropertySequence.h" #include "Generic/GenericStringPropertySequence.h" #include "Parsing/Menu/Matcher/MenuMatcherFactory.h" #include "Parsing/Menu/Domain/CommonMenuTypes.h" @@ -40,8 +41,7 @@ namespace menu::menu_scope_sequences const auto existingMenu = state->m_menus_by_name.find(state->m_current_menu->m_name); if (existingMenu == state->m_menus_by_name.end()) { - state->m_menus_by_name.emplace(std::make_pair(state->m_current_menu->m_name, state->m_current_menu.get())); - state->m_menus.emplace_back(std::move(state->m_current_menu)); + state->m_menus_by_name.emplace(std::make_pair(state->m_current_menu->m_name, state->m_current_menu)); state->m_current_menu = nullptr; } else @@ -71,7 +71,9 @@ namespace menu::menu_scope_sequences protected: void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override { - state->m_current_item = std::make_unique(); + auto newItemDef = std::make_unique(); + state->m_current_item = newItemDef.get(); + state->m_current_menu->m_items.emplace_back(std::move(newItemDef)); } }; @@ -271,4 +273,20 @@ void MenuScopeSequences::AddSequences(FeatureLevel featureLevel) { state->m_current_menu->m_rect_h_exp = std::move(value); })); + AddSequence(std::make_unique("onOpen", [](const MenuFileParserState* state, std::unique_ptr value) + { + state->m_current_menu->m_on_open = std::move(value); + })); + AddSequence(std::make_unique("onClose", [](const MenuFileParserState* state, std::unique_ptr value) + { + state->m_current_menu->m_on_close = std::move(value); + })); + AddSequence(std::make_unique("onRequestClose", [](const MenuFileParserState* state, std::unique_ptr value) + { + state->m_current_menu->m_on_request_close = std::move(value); + })); + AddSequence(std::make_unique("onESC", [](const MenuFileParserState* state, std::unique_ptr value) + { + state->m_current_menu->m_on_esc = std::move(value); + })); }