Handle condition stack on event handler closing parenthesis

This commit is contained in:
Jan 2021-11-06 19:30:36 +01:00
parent 54d7f75af6
commit 81203e523e
4 changed files with 35 additions and 7 deletions

View File

@ -2,9 +2,9 @@
using namespace menu; using namespace menu;
MenuFileParserState::EventHandlerConditionState::EventHandlerConditionState(std::unique_ptr<CommonEventHandlerCondition> condition) MenuFileParserState::EventHandlerConditionState::EventHandlerConditionState(CommonEventHandlerCondition* condition)
: m_in_condition_elements(true), : 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_function(nullptr),
m_current_menu(nullptr), m_current_menu(nullptr),
m_current_item(nullptr), m_current_item(nullptr),
m_current_event_handler_set(nullptr) m_current_event_handler_set(nullptr),
m_current_nested_event_handler_set(nullptr)
{ {
} }

View File

@ -20,9 +20,9 @@ namespace menu
{ {
public: public:
bool m_in_condition_elements; bool m_in_condition_elements;
std::unique_ptr<CommonEventHandlerCondition> m_condition; CommonEventHandlerCondition* m_condition;
explicit EventHandlerConditionState(std::unique_ptr<CommonEventHandlerCondition> condition); explicit EventHandlerConditionState(CommonEventHandlerCondition* condition);
}; };
const FeatureLevel m_feature_level; const FeatureLevel m_feature_level;
@ -41,7 +41,8 @@ namespace menu
CommonEventHandlerSet* m_current_event_handler_set; CommonEventHandlerSet* m_current_event_handler_set;
std::ostringstream m_current_script; std::ostringstream m_current_script;
std::stack<EventHandlerConditionState> m_current_condition; std::stack<EventHandlerConditionState> m_condition_stack;
CommonEventHandlerSet* m_current_nested_event_handler_set;
explicit MenuFileParserState(FeatureLevel featureLevel); explicit MenuFileParserState(FeatureLevel featureLevel);
}; };

View File

@ -3,6 +3,7 @@
#include <sstream> #include <sstream>
#include "Generic/GenericStringPropertySequence.h" #include "Generic/GenericStringPropertySequence.h"
#include "Parsing/Menu/Domain/EventHandler/CommonEventHandlerScript.h"
#include "Parsing/Menu/Matcher/MenuMatcherFactory.h" #include "Parsing/Menu/Matcher/MenuMatcherFactory.h"
using namespace menu; using namespace menu;
@ -26,7 +27,31 @@ namespace menu::event_handler_set_scope_sequences
protected: protected:
void ProcessMatch(MenuFileParserState* state, SequenceResult<SimpleParserValue>& result) const override void ProcessMatch(MenuFileParserState* state, SequenceResult<SimpleParserValue>& 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<CommonEventHandlerScript>(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;
}
} }
}; };
} }

View File

@ -23,6 +23,7 @@ void GenericMenuEventHandlerSetPropertySequence::ProcessMatch(MenuFileParserStat
{ {
auto newEventHandlerSet = std::make_unique<CommonEventHandlerSet>(); auto newEventHandlerSet = std::make_unique<CommonEventHandlerSet>();
state->m_current_event_handler_set = newEventHandlerSet.get(); state->m_current_event_handler_set = newEventHandlerSet.get();
state->m_current_nested_event_handler_set = newEventHandlerSet.get();
m_set_callback(state, std::move(newEventHandlerSet)); m_set_callback(state, std::move(newEventHandlerSet));
} }
} }