diff --git a/src/ObjLoading/Parsing/Menu/Domain/CommonMenuDef.h b/src/ObjLoading/Parsing/Menu/Domain/CommonMenuDef.h index b8a5bbb2..b368783f 100644 --- a/src/ObjLoading/Parsing/Menu/Domain/CommonMenuDef.h +++ b/src/ObjLoading/Parsing/Menu/Domain/CommonMenuDef.h @@ -4,6 +4,7 @@ #include #include "CommonItemDef.h" +#include "CommonMenuTypes.h" namespace menu { @@ -11,9 +12,35 @@ namespace menu { public: std::string m_name; + CommonRect m_rect; + int m_style; + int m_border; + double m_border_size; + CommonColor m_back_color; + CommonColor m_fore_color; + CommonColor m_border_color; + CommonColor m_focus_color; + std::string m_background; + int m_owner_draw; + int m_owner_draw_flags; + std::string m_sound_loop; + double m_fade_clamp; + int m_fade_cycle; + double m_fade_amount; + double m_fade_in_amount; + double m_blur_radius; + std::string m_allowed_binding; + bool m_full_screen; bool m_screen_space; bool m_decoration; + bool m_out_of_bounds_click; + bool m_popup; + bool m_legacy_split_screen_scale; + bool m_hidden_during_scope; + bool m_hidden_during_flashbang; + bool m_hidden_during_ui; + bool m_text_only_focus; std::vector> m_items; }; diff --git a/src/ObjLoading/Parsing/Menu/Domain/CommonMenuTypes.h b/src/ObjLoading/Parsing/Menu/Domain/CommonMenuTypes.h index 907f0c1a..5bb42f23 100644 --- a/src/ObjLoading/Parsing/Menu/Domain/CommonMenuTypes.h +++ b/src/ObjLoading/Parsing/Menu/Domain/CommonMenuTypes.h @@ -13,4 +13,14 @@ namespace menu }; double array[4]; }; + + struct CommonRect + { + double x; + double y; + double w; + double h; + int horizontalAlign; + int verticalAlign; + }; } diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/MenuPropertySequences.cpp b/src/ObjLoading/Parsing/Menu/Sequence/Properties/MenuPropertySequences.cpp index 2f2c92b0..ce9d867e 100644 --- a/src/ObjLoading/Parsing/Menu/Sequence/Properties/MenuPropertySequences.cpp +++ b/src/ObjLoading/Parsing/Menu/Sequence/Properties/MenuPropertySequences.cpp @@ -1,26 +1,42 @@ #include "MenuPropertySequences.h" #include "GenericBoolPropertySequence.h" +#include "GenericColorPropertySequence.h" +#include "GenericFloatingPointPropertySequence.h" +#include "GenericIntPropertySequence.h" #include "GenericKeywordPropertySequence.h" #include "GenericStringPropertySequence.h" #include "Parsing/Menu/MenuMatcherFactory.h" +#include "Parsing/Menu/Domain/CommonMenuTypes.h" using namespace menu; namespace menu::menu_properties { - class SequenceFullScreen final : public MenuFileParser::sequence_t + class SequenceRect final : public MenuFileParser::sequence_t { - static constexpr auto CAPTURE_VALUE = 1; + static constexpr auto CAPTURE_X = 1; + static constexpr auto CAPTURE_Y = 2; + static constexpr auto CAPTURE_W = 3; + static constexpr auto CAPTURE_H = 4; + static constexpr auto CAPTURE_ALIGN_HORIZONTAL = 5; + static constexpr auto CAPTURE_ALIGN_VERTICAL = 6; public: - SequenceFullScreen() + SequenceRect() { const MenuMatcherFactory create(this); AddMatchers({ - create.KeywordIgnoreCase("fullscreen"), - create.Numeric().Capture(CAPTURE_VALUE) + create.KeywordIgnoreCase("rect"), + create.Numeric().Capture(CAPTURE_X), + create.Numeric().Capture(CAPTURE_Y), + create.Numeric().Capture(CAPTURE_W), + create.Numeric().Capture(CAPTURE_H), + create.Optional(create.And({ + create.Integer().Capture(CAPTURE_ALIGN_HORIZONTAL), + create.Integer().Capture(CAPTURE_ALIGN_VERTICAL) + })) }); } @@ -29,8 +45,22 @@ namespace menu::menu_properties { assert(state->m_current_menu); - const auto value = MenuMatcherFactory::TokenNumericIntValue(result.NextCapture(CAPTURE_VALUE)); - state->m_current_menu->m_full_screen = value > 0; + CommonRect rect + { + MenuMatcherFactory::TokenNumericFloatingPointValue(result.NextCapture(CAPTURE_X)), + MenuMatcherFactory::TokenNumericFloatingPointValue(result.NextCapture(CAPTURE_Y)), + MenuMatcherFactory::TokenNumericFloatingPointValue(result.NextCapture(CAPTURE_W)), + MenuMatcherFactory::TokenNumericFloatingPointValue(result.NextCapture(CAPTURE_H)), + 0, 0 + }; + + if (result.HasNextCapture(CAPTURE_ALIGN_HORIZONTAL) && result.HasNextCapture(CAPTURE_ALIGN_VERTICAL)) + { + rect.horizontalAlign = result.NextCapture(CAPTURE_ALIGN_HORIZONTAL).IntegerValue(); + rect.verticalAlign = result.NextCapture(CAPTURE_ALIGN_VERTICAL).IntegerValue(); + } + + state->m_current_menu->m_rect = rect; } }; } @@ -60,4 +90,101 @@ void MenuPropertySequences::AddSequences(FeatureLevel featureLevel) { state->m_current_menu->m_decoration = true; })); + AddSequence(std::make_unique()); + AddSequence(std::make_unique("style", [](const MenuFileParserState* state, const int value) + { + state->m_current_menu->m_style = value; + })); + AddSequence(std::make_unique("border", [](const MenuFileParserState* state, const int value) + { + state->m_current_menu->m_border = value; + })); + AddSequence(std::make_unique("borderSize", [](const MenuFileParserState* state, const double value) + { + state->m_current_menu->m_border_size = value; + })); + AddSequence(std::make_unique("backcolor", [](const MenuFileParserState* state, const CommonColor value) + { + state->m_current_menu->m_back_color = value; + })); + AddSequence(std::make_unique("forecolor", [](const MenuFileParserState* state, const CommonColor value) + { + state->m_current_menu->m_fore_color = value; + })); + AddSequence(std::make_unique("bordercolor", [](const MenuFileParserState* state, const CommonColor value) + { + state->m_current_menu->m_border_color = value; + })); + AddSequence(std::make_unique("focuscolor", [](const MenuFileParserState* state, const CommonColor value) + { + state->m_current_menu->m_focus_color = value; + })); + AddSequence(std::make_unique("background", [](const MenuFileParserState* state, const std::string& value) + { + state->m_current_menu->m_background = value; + })); + AddSequence(std::make_unique("ownerdraw", [](const MenuFileParserState* state, const int value) + { + state->m_current_menu->m_owner_draw = value; + })); + AddSequence(std::make_unique("ownerdrawFlag", [](const MenuFileParserState* state, const int value) + { + state->m_current_menu->m_owner_draw_flags |= value; + })); + AddSequence(std::make_unique("outOfBoundsClick", [](const MenuFileParserState* state) + { + state->m_current_menu->m_out_of_bounds_click = true; + })); + AddSequence(std::make_unique("soundLoop", [](const MenuFileParserState* state, const std::string& value) + { + state->m_current_menu->m_sound_loop = value; + })); + AddSequence(std::make_unique("popup", [](const MenuFileParserState* state) + { + state->m_current_menu->m_popup = true; + })); + AddSequence(std::make_unique("fadeClamp", [](const MenuFileParserState* state, const double value) + { + state->m_current_menu->m_fade_clamp = value; + })); + AddSequence(std::make_unique("fadeCycle", [](const MenuFileParserState* state, const int value) + { + state->m_current_menu->m_fade_cycle = value; + })); + AddSequence(std::make_unique("fadeAmount", [](const MenuFileParserState* state, const double value) + { + state->m_current_menu->m_fade_amount = value; + })); + AddSequence(std::make_unique("fadeInAmount", [](const MenuFileParserState* state, const double value) + { + state->m_current_menu->m_fade_in_amount = value; + })); + AddSequence(std::make_unique("blurWorld", [](const MenuFileParserState* state, const double value) + { + state->m_current_menu->m_blur_radius = value; + })); + AddSequence(std::make_unique("legacySplitScreenScale", [](const MenuFileParserState* state) + { + state->m_current_menu->m_legacy_split_screen_scale = true; + })); + AddSequence(std::make_unique("hiddenDuringScope", [](const MenuFileParserState* state) + { + state->m_current_menu->m_hidden_during_scope = true; + })); + AddSequence(std::make_unique("hiddenDuringFlashbang", [](const MenuFileParserState* state) + { + state->m_current_menu->m_hidden_during_flashbang = true; + })); + AddSequence(std::make_unique("hiddenDuringUI", [](const MenuFileParserState* state) + { + state->m_current_menu->m_hidden_during_ui = true; + })); + AddSequence(std::make_unique("allowedBinding", [](const MenuFileParserState* state, const std::string& value) + { + state->m_current_menu->m_allowed_binding = value; + })); + AddSequence(std::make_unique("textOnlyFocus", [](const MenuFileParserState* state) + { + state->m_current_menu->m_text_only_focus = true; + })); }