From 81203e523e5f2d80bbfac14f725deb10eca3b0ba Mon Sep 17 00:00:00 2001 From: Jan Date: Sat, 6 Nov 2021 19:30:36 +0100 Subject: [PATCH] Handle condition stack on event handler closing parenthesis --- .../Parsing/Menu/MenuFileParserState.cpp | 7 ++--- .../Parsing/Menu/MenuFileParserState.h | 7 ++--- .../EventHandlerSetScopeSequences.cpp | 27 ++++++++++++++++++- ...ricMenuEventHandlerSetPropertySequence.cpp | 1 + 4 files changed, 35 insertions(+), 7 deletions(-) diff --git a/src/ObjLoading/Parsing/Menu/MenuFileParserState.cpp b/src/ObjLoading/Parsing/Menu/MenuFileParserState.cpp index 628c7c1a..23147cb5 100644 --- a/src/ObjLoading/Parsing/Menu/MenuFileParserState.cpp +++ b/src/ObjLoading/Parsing/Menu/MenuFileParserState.cpp @@ -2,9 +2,9 @@ using namespace menu; -MenuFileParserState::EventHandlerConditionState::EventHandlerConditionState(std::unique_ptr condition) +MenuFileParserState::EventHandlerConditionState::EventHandlerConditionState(CommonEventHandlerCondition* condition) : m_in_condition_elements(true), - m_condition(std::move(condition)) + m_condition(condition) { } @@ -14,6 +14,7 @@ MenuFileParserState::MenuFileParserState(const FeatureLevel featureLevel) m_current_function(nullptr), m_current_menu(nullptr), m_current_item(nullptr), - m_current_event_handler_set(nullptr) + m_current_event_handler_set(nullptr), + m_current_nested_event_handler_set(nullptr) { } diff --git a/src/ObjLoading/Parsing/Menu/MenuFileParserState.h b/src/ObjLoading/Parsing/Menu/MenuFileParserState.h index c130e225..ac239a88 100644 --- a/src/ObjLoading/Parsing/Menu/MenuFileParserState.h +++ b/src/ObjLoading/Parsing/Menu/MenuFileParserState.h @@ -20,9 +20,9 @@ namespace menu { public: bool m_in_condition_elements; - std::unique_ptr m_condition; + CommonEventHandlerCondition* m_condition; - explicit EventHandlerConditionState(std::unique_ptr condition); + explicit EventHandlerConditionState(CommonEventHandlerCondition* condition); }; const FeatureLevel m_feature_level; @@ -41,7 +41,8 @@ namespace menu CommonEventHandlerSet* m_current_event_handler_set; std::ostringstream m_current_script; - std::stack m_current_condition; + std::stack m_condition_stack; + CommonEventHandlerSet* m_current_nested_event_handler_set; explicit MenuFileParserState(FeatureLevel featureLevel); }; diff --git a/src/ObjLoading/Parsing/Menu/Sequence/EventHandlerSetScopeSequences.cpp b/src/ObjLoading/Parsing/Menu/Sequence/EventHandlerSetScopeSequences.cpp index 6cf5aa11..9cc64303 100644 --- a/src/ObjLoading/Parsing/Menu/Sequence/EventHandlerSetScopeSequences.cpp +++ b/src/ObjLoading/Parsing/Menu/Sequence/EventHandlerSetScopeSequences.cpp @@ -3,6 +3,7 @@ #include #include "Generic/GenericStringPropertySequence.h" +#include "Parsing/Menu/Domain/EventHandler/CommonEventHandlerScript.h" #include "Parsing/Menu/Matcher/MenuMatcherFactory.h" using namespace menu; @@ -26,7 +27,31 @@ namespace menu::event_handler_set_scope_sequences protected: void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override { - state->m_current_event_handler_set = nullptr; + auto remainingScript = state->m_current_script.str(); + if (!remainingScript.empty()) + state->m_current_nested_event_handler_set->m_elements.emplace_back(std::make_unique(std::move(remainingScript))); + state->m_current_script.clear(); + + if (!state->m_condition_stack.empty()) + { + state->m_condition_stack.pop(); + + if(!state->m_condition_stack.empty()) + { + const auto& newConditionState = state->m_condition_stack.top(); + if (newConditionState.m_in_condition_elements) + state->m_current_nested_event_handler_set = newConditionState.m_condition->m_condition_elements.get(); + else + state->m_current_nested_event_handler_set = newConditionState.m_condition->m_else_elements.get(); + } + else + state->m_current_nested_event_handler_set = state->m_current_event_handler_set; + } + else + { + state->m_current_event_handler_set = nullptr; + state->m_current_nested_event_handler_set = nullptr; + } } }; } diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericMenuEventHandlerSetPropertySequence.cpp b/src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericMenuEventHandlerSetPropertySequence.cpp index 61c93094..35a4905f 100644 --- a/src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericMenuEventHandlerSetPropertySequence.cpp +++ b/src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericMenuEventHandlerSetPropertySequence.cpp @@ -23,6 +23,7 @@ void GenericMenuEventHandlerSetPropertySequence::ProcessMatch(MenuFileParserStat { auto newEventHandlerSet = std::make_unique(); state->m_current_event_handler_set = newEventHandlerSet.get(); + state->m_current_nested_event_handler_set = newEventHandlerSet.get(); m_set_callback(state, std::move(newEventHandlerSet)); } }