From 2aa0eb2a8ca2b6aeafc62138cf6b083f342fb926 Mon Sep 17 00:00:00 2001 From: Jan Date: Mon, 1 Nov 2021 12:28:40 +0100 Subject: [PATCH] Add generic property matchers for menus --- .../Parsing/Menu/Domain/CommonMenuDef.h | 4 +- .../Parsing/Menu/Domain/CommonMenuTypes.h | 16 +++++++ .../Properties/FunctionPropertySequences.cpp | 30 ++---------- .../GenericBoolPropertySequence.cpp | 27 +++++++++++ .../Properties/GenericBoolPropertySequence.h | 26 ++++++++++ .../GenericColorPropertySequence.cpp | 35 ++++++++++++++ .../Properties/GenericColorPropertySequence.h | 30 ++++++++++++ .../GenericFloatingPointPropertySequence.cpp | 27 +++++++++++ .../GenericFloatingPointPropertySequence.h | 26 ++++++++++ .../Properties/GenericIntPropertySequence.cpp | 27 +++++++++++ .../Properties/GenericIntPropertySequence.h | 26 ++++++++++ .../GenericKeywordPropertySequence.cpp | 25 ++++++++++ .../GenericKeywordPropertySequence.h | 24 ++++++++++ .../GenericStringPropertySequence.cpp | 27 +++++++++++ .../GenericStringPropertySequence.h | 26 ++++++++++ .../Properties/ItemPropertySequences.cpp | 30 ++---------- .../Properties/MenuPropertySequences.cpp | 48 ++++++++----------- 17 files changed, 375 insertions(+), 79 deletions(-) create mode 100644 src/ObjLoading/Parsing/Menu/Domain/CommonMenuTypes.h create mode 100644 src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericBoolPropertySequence.cpp create mode 100644 src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericBoolPropertySequence.h create mode 100644 src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericColorPropertySequence.cpp create mode 100644 src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericColorPropertySequence.h create mode 100644 src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericFloatingPointPropertySequence.cpp create mode 100644 src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericFloatingPointPropertySequence.h create mode 100644 src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericIntPropertySequence.cpp create mode 100644 src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericIntPropertySequence.h create mode 100644 src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericKeywordPropertySequence.cpp create mode 100644 src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericKeywordPropertySequence.h create mode 100644 src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericStringPropertySequence.cpp create mode 100644 src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericStringPropertySequence.h diff --git a/src/ObjLoading/Parsing/Menu/Domain/CommonMenuDef.h b/src/ObjLoading/Parsing/Menu/Domain/CommonMenuDef.h index 089f6eba..b8a5bbb2 100644 --- a/src/ObjLoading/Parsing/Menu/Domain/CommonMenuDef.h +++ b/src/ObjLoading/Parsing/Menu/Domain/CommonMenuDef.h @@ -11,7 +11,9 @@ namespace menu { public: std::string m_name; - bool m_fullscreen; + bool m_full_screen; + bool m_screen_space; + bool m_decoration; std::vector> m_items; }; diff --git a/src/ObjLoading/Parsing/Menu/Domain/CommonMenuTypes.h b/src/ObjLoading/Parsing/Menu/Domain/CommonMenuTypes.h new file mode 100644 index 00000000..907f0c1a --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Domain/CommonMenuTypes.h @@ -0,0 +1,16 @@ +#pragma once + +namespace menu +{ + union CommonColor + { + struct + { + double r; + double g; + double b; + double a; + }; + double array[4]; + }; +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/FunctionPropertySequences.cpp b/src/ObjLoading/Parsing/Menu/Sequence/Properties/FunctionPropertySequences.cpp index 6da0a9ce..446fc4b0 100644 --- a/src/ObjLoading/Parsing/Menu/Sequence/Properties/FunctionPropertySequences.cpp +++ b/src/ObjLoading/Parsing/Menu/Sequence/Properties/FunctionPropertySequences.cpp @@ -1,35 +1,12 @@ #include "FunctionPropertySequences.h" +#include "GenericStringPropertySequence.h" #include "Parsing/Menu/MenuMatcherFactory.h" using namespace menu; namespace menu::function_properties { - class SequenceName final : public MenuFileParser::sequence_t - { - static constexpr auto CAPTURE_NAME = 1; - - public: - SequenceName() - { - const MenuMatcherFactory create(this); - - AddMatchers({ - create.KeywordIgnoreCase("name"), - create.Text().Capture(CAPTURE_NAME) - }); - } - - protected: - void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override - { - assert(state->m_current_function); - - const auto nameValue = MenuMatcherFactory::TokenTextValue(result.NextCapture(CAPTURE_NAME)); - state->m_current_function->m_name = nameValue; - } - }; } using namespace function_properties; @@ -41,5 +18,8 @@ FunctionPropertySequences::FunctionPropertySequences(std::vector()); + AddSequence(std::make_unique("name", [](const MenuFileParserState* state, const std::string& value) + { + state->m_current_function->m_name = value; + })); } diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericBoolPropertySequence.cpp b/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericBoolPropertySequence.cpp new file mode 100644 index 00000000..fae65ef0 --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericBoolPropertySequence.cpp @@ -0,0 +1,27 @@ +#include "GenericBoolPropertySequence.h" + +#include + +#include "Parsing/Menu/MenuMatcherFactory.h" + +using namespace menu; + +GenericBoolPropertySequence::GenericBoolPropertySequence(std::string keywordName, callback_t setCallback) + : m_set_callback(std::move(setCallback)) +{ + const MenuMatcherFactory create(this); + + AddMatchers({ + create.KeywordIgnoreCase(std::move(keywordName)), + create.Integer().Capture(CAPTURE_VALUE) + }); +} + +void GenericBoolPropertySequence::ProcessMatch(MenuFileParserState* state, SequenceResult& result) const +{ + if (m_set_callback) + { + const auto value = result.NextCapture(CAPTURE_VALUE).IntegerValue(); + m_set_callback(state, value > 0); + } +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericBoolPropertySequence.h b/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericBoolPropertySequence.h new file mode 100644 index 00000000..15607091 --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericBoolPropertySequence.h @@ -0,0 +1,26 @@ +#pragma once + +#include +#include + +#include "Parsing/Menu/MenuFileParser.h" + +namespace menu +{ + class GenericBoolPropertySequence final : public MenuFileParser::sequence_t + { + public: + using callback_t = std::function; + + private: + static constexpr auto CAPTURE_VALUE = 1; + + const callback_t m_set_callback; + + protected: + void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override; + + public: + GenericBoolPropertySequence(std::string keywordName, callback_t setCallback); + }; +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericColorPropertySequence.cpp b/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericColorPropertySequence.cpp new file mode 100644 index 00000000..acc74630 --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericColorPropertySequence.cpp @@ -0,0 +1,35 @@ +#include "GenericColorPropertySequence.h" + +#include + +#include "Parsing/Menu/MenuMatcherFactory.h" + +using namespace menu; + +GenericColorPropertySequence::GenericColorPropertySequence(std::string keywordName, callback_t setCallback) + : m_set_callback(std::move(setCallback)) +{ + const MenuMatcherFactory create(this); + + AddMatchers({ + create.KeywordIgnoreCase(std::move(keywordName)), + create.Numeric().Capture(CAPTURE_R), + create.Numeric().Capture(CAPTURE_G), + create.Numeric().Capture(CAPTURE_B), + create.Numeric().Capture(CAPTURE_A) + }); +} + +void GenericColorPropertySequence::ProcessMatch(MenuFileParserState* state, SequenceResult& result) const +{ + if (m_set_callback) + { + CommonColor color{}; + color.r = MenuMatcherFactory::TokenNumericFloatingPointValue(result.NextCapture(CAPTURE_R)); + color.g = MenuMatcherFactory::TokenNumericFloatingPointValue(result.NextCapture(CAPTURE_G)); + color.b = MenuMatcherFactory::TokenNumericFloatingPointValue(result.NextCapture(CAPTURE_B)); + color.a = MenuMatcherFactory::TokenNumericFloatingPointValue(result.NextCapture(CAPTURE_A)); + + m_set_callback(state, color); + } +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericColorPropertySequence.h b/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericColorPropertySequence.h new file mode 100644 index 00000000..202dde23 --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericColorPropertySequence.h @@ -0,0 +1,30 @@ +#pragma once + +#include +#include + +#include "Parsing/Menu/MenuFileParser.h" +#include "Parsing/Menu/Domain/CommonMenuTypes.h" + +namespace menu +{ + class GenericColorPropertySequence final : public MenuFileParser::sequence_t + { + public: + using callback_t = std::function; + + private: + static constexpr auto CAPTURE_R = 1; + static constexpr auto CAPTURE_G = 2; + static constexpr auto CAPTURE_B = 3; + static constexpr auto CAPTURE_A = 4; + + const callback_t m_set_callback; + + protected: + void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override; + + public: + GenericColorPropertySequence(std::string keywordName, callback_t setCallback); + }; +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericFloatingPointPropertySequence.cpp b/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericFloatingPointPropertySequence.cpp new file mode 100644 index 00000000..53876a49 --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericFloatingPointPropertySequence.cpp @@ -0,0 +1,27 @@ +#include "GenericFloatingPointPropertySequence.h" + +#include + +#include "Parsing/Menu/MenuMatcherFactory.h" + +using namespace menu; + +GenericFloatingPointPropertySequence::GenericFloatingPointPropertySequence(std::string keywordName, callback_t setCallback) + : m_set_callback(std::move(setCallback)) +{ + const MenuMatcherFactory create(this); + + AddMatchers({ + create.KeywordIgnoreCase(std::move(keywordName)), + create.Numeric().Capture(CAPTURE_VALUE) + }); +} + +void GenericFloatingPointPropertySequence::ProcessMatch(MenuFileParserState* state, SequenceResult& result) const +{ + if (m_set_callback) + { + const auto value = MenuMatcherFactory::TokenNumericFloatingPointValue(result.NextCapture(CAPTURE_VALUE)); + m_set_callback(state, value); + } +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericFloatingPointPropertySequence.h b/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericFloatingPointPropertySequence.h new file mode 100644 index 00000000..4df83d56 --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericFloatingPointPropertySequence.h @@ -0,0 +1,26 @@ +#pragma once + +#include +#include + +#include "Parsing/Menu/MenuFileParser.h" + +namespace menu +{ + class GenericFloatingPointPropertySequence final : public MenuFileParser::sequence_t + { + public: + using callback_t = std::function; + + private: + static constexpr auto CAPTURE_VALUE = 1; + + const callback_t m_set_callback; + + protected: + void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override; + + public: + GenericFloatingPointPropertySequence(std::string keywordName, callback_t setCallback); + }; +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericIntPropertySequence.cpp b/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericIntPropertySequence.cpp new file mode 100644 index 00000000..02470ac4 --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericIntPropertySequence.cpp @@ -0,0 +1,27 @@ +#include "GenericIntPropertySequence.h" + +#include + +#include "Parsing/Menu/MenuMatcherFactory.h" + +using namespace menu; + +GenericIntPropertySequence::GenericIntPropertySequence(std::string keywordName, callback_t setCallback) + : m_set_callback(std::move(setCallback)) +{ + const MenuMatcherFactory create(this); + + AddMatchers({ + create.KeywordIgnoreCase(std::move(keywordName)), + create.Integer().Capture(CAPTURE_VALUE) + }); +} + +void GenericIntPropertySequence::ProcessMatch(MenuFileParserState* state, SequenceResult& result) const +{ + if (m_set_callback) + { + const auto value = result.NextCapture(CAPTURE_VALUE).IntegerValue(); + m_set_callback(state, value); + } +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericIntPropertySequence.h b/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericIntPropertySequence.h new file mode 100644 index 00000000..02f5b393 --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericIntPropertySequence.h @@ -0,0 +1,26 @@ +#pragma once + +#include +#include + +#include "Parsing/Menu/MenuFileParser.h" + +namespace menu +{ + class GenericIntPropertySequence final : public MenuFileParser::sequence_t + { + public: + using callback_t = std::function; + + private: + static constexpr auto CAPTURE_VALUE = 1; + + const callback_t m_set_callback; + + protected: + void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override; + + public: + GenericIntPropertySequence(std::string keywordName, callback_t setCallback); + }; +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericKeywordPropertySequence.cpp b/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericKeywordPropertySequence.cpp new file mode 100644 index 00000000..feaf56ef --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericKeywordPropertySequence.cpp @@ -0,0 +1,25 @@ +#include "GenericKeywordPropertySequence.h" + +#include + +#include "Parsing/Menu/MenuMatcherFactory.h" + +using namespace menu; + +GenericKeywordPropertySequence::GenericKeywordPropertySequence(std::string keywordName, callback_t setCallback) + : m_set_callback(std::move(setCallback)) +{ + const MenuMatcherFactory create(this); + + AddMatchers({ + create.KeywordIgnoreCase(std::move(keywordName)), + }); +} + +void GenericKeywordPropertySequence::ProcessMatch(MenuFileParserState* state, SequenceResult& result) const +{ + if(m_set_callback) + { + m_set_callback(state); + } +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericKeywordPropertySequence.h b/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericKeywordPropertySequence.h new file mode 100644 index 00000000..daa3d0b7 --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericKeywordPropertySequence.h @@ -0,0 +1,24 @@ +#pragma once + +#include +#include + +#include "Parsing/Menu/MenuFileParser.h" + +namespace menu +{ + class GenericKeywordPropertySequence final : public MenuFileParser::sequence_t + { + public: + using callback_t = std::function; + + private: + const callback_t m_set_callback; + + protected: + void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override; + + public: + GenericKeywordPropertySequence(std::string keywordName, callback_t setCallback); + }; +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericStringPropertySequence.cpp b/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericStringPropertySequence.cpp new file mode 100644 index 00000000..611fbc5e --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericStringPropertySequence.cpp @@ -0,0 +1,27 @@ +#include "GenericStringPropertySequence.h" + +#include + +#include "Parsing/Menu/MenuMatcherFactory.h" + +using namespace menu; + +GenericStringPropertySequence::GenericStringPropertySequence(std::string keywordName, callback_t setCallback) + : m_set_callback(std::move(setCallback)) +{ + const MenuMatcherFactory create(this); + + AddMatchers({ + create.KeywordIgnoreCase(std::move(keywordName)), + create.Text().Capture(CAPTURE_VALUE) + }); +} + +void GenericStringPropertySequence::ProcessMatch(MenuFileParserState* state, SequenceResult& result) const +{ + if (m_set_callback) + { + const auto& value = MenuMatcherFactory::TokenTextValue(result.NextCapture(CAPTURE_VALUE)); + m_set_callback(state, value); + } +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericStringPropertySequence.h b/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericStringPropertySequence.h new file mode 100644 index 00000000..2c72f453 --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericStringPropertySequence.h @@ -0,0 +1,26 @@ +#pragma once + +#include +#include + +#include "Parsing/Menu/MenuFileParser.h" + +namespace menu +{ + class GenericStringPropertySequence final : public MenuFileParser::sequence_t + { + public: + using callback_t = std::function; + + private: + static constexpr auto CAPTURE_VALUE = 1; + + const callback_t m_set_callback; + + protected: + void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override; + + public: + GenericStringPropertySequence(std::string keywordName, callback_t setCallback); + }; +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/ItemPropertySequences.cpp b/src/ObjLoading/Parsing/Menu/Sequence/Properties/ItemPropertySequences.cpp index be1be6e4..550e5da2 100644 --- a/src/ObjLoading/Parsing/Menu/Sequence/Properties/ItemPropertySequences.cpp +++ b/src/ObjLoading/Parsing/Menu/Sequence/Properties/ItemPropertySequences.cpp @@ -1,35 +1,12 @@ #include "ItemPropertySequences.h" +#include "GenericStringPropertySequence.h" #include "Parsing/Menu/MenuMatcherFactory.h" using namespace menu; namespace menu::item_properties { - class SequenceName final : public MenuFileParser::sequence_t - { - static constexpr auto CAPTURE_NAME = 1; - - public: - SequenceName() - { - const MenuMatcherFactory create(this); - - AddMatchers({ - create.KeywordIgnoreCase("name"), - create.Text().Capture(CAPTURE_NAME) - }); - } - - protected: - void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override - { - assert(state->m_current_item); - - const auto nameValue = MenuMatcherFactory::TokenTextValue(result.NextCapture(CAPTURE_NAME)); - state->m_current_item->m_name = nameValue; - } - }; } using namespace item_properties; @@ -41,5 +18,8 @@ ItemPropertySequences::ItemPropertySequences(std::vector()); + AddSequence(std::make_unique("name", [](const MenuFileParserState* state, const std::string& value) + { + state->m_current_item->m_name = value; + })); } diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/MenuPropertySequences.cpp b/src/ObjLoading/Parsing/Menu/Sequence/Properties/MenuPropertySequences.cpp index c736b234..2f2c92b0 100644 --- a/src/ObjLoading/Parsing/Menu/Sequence/Properties/MenuPropertySequences.cpp +++ b/src/ObjLoading/Parsing/Menu/Sequence/Properties/MenuPropertySequences.cpp @@ -1,36 +1,14 @@ #include "MenuPropertySequences.h" +#include "GenericBoolPropertySequence.h" +#include "GenericKeywordPropertySequence.h" +#include "GenericStringPropertySequence.h" #include "Parsing/Menu/MenuMatcherFactory.h" using namespace menu; namespace menu::menu_properties { - class SequenceName final : public MenuFileParser::sequence_t - { - static constexpr auto CAPTURE_NAME = 1; - - public: - SequenceName() - { - const MenuMatcherFactory create(this); - - AddMatchers({ - create.KeywordIgnoreCase("name"), - create.Text().Capture(CAPTURE_NAME) - }); - } - - protected: - void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override - { - assert(state->m_current_menu); - - const auto nameValue = MenuMatcherFactory::TokenTextValue(result.NextCapture(CAPTURE_NAME)); - state->m_current_menu->m_name = nameValue; - } - }; - class SequenceFullScreen final : public MenuFileParser::sequence_t { static constexpr auto CAPTURE_VALUE = 1; @@ -52,7 +30,7 @@ namespace menu::menu_properties assert(state->m_current_menu); const auto value = MenuMatcherFactory::TokenNumericIntValue(result.NextCapture(CAPTURE_VALUE)); - state->m_current_menu->m_fullscreen = value > 0; + state->m_current_menu->m_full_screen = value > 0; } }; } @@ -66,6 +44,20 @@ MenuPropertySequences::MenuPropertySequences(std::vector()); - AddSequence(std::make_unique()); + AddSequence(std::make_unique("name", [](const MenuFileParserState* state, const std::string& value) + { + state->m_current_menu->m_name = value; + })); + AddSequence(std::make_unique("fullScreen", [](const MenuFileParserState* state, const bool value) + { + state->m_current_menu->m_full_screen = value; + })); + AddSequence(std::make_unique("screenSpace", [](const MenuFileParserState* state) + { + state->m_current_menu->m_screen_space = true; + })); + AddSequence(std::make_unique("decoration", [](const MenuFileParserState* state) + { + state->m_current_menu->m_decoration = true; + })); }