Make menu and item rect accept expressions as static values

This commit is contained in:
Jan
2021-11-26 17:43:27 +01:00
parent 2a4768e5b0
commit fb70d9538a
5 changed files with 184 additions and 31 deletions
@@ -10,6 +10,7 @@
#include "Generic/GenericKeywordPropertySequence.h"
#include "Generic/GenericMenuEventHandlerSetPropertySequence.h"
#include "Generic/GenericStringPropertySequence.h"
#include "Parsing/Menu/Matcher/MenuExpressionMatchers.h"
#include "Parsing/Menu/Matcher/MenuMatcherFactory.h"
using namespace menu;
@@ -142,24 +143,21 @@ namespace menu::item_scope_sequences
class SequenceRect final : public MenuFileParser::sequence_t
{
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;
static constexpr auto CAPTURE_ALIGN_HORIZONTAL = 1;
static constexpr auto CAPTURE_ALIGN_VERTICAL = 2;
public:
SequenceRect()
{
const MenuMatcherFactory create(this);
AddLabeledMatchers(MenuExpressionMatchers().Expression(this), MenuExpressionMatchers::LABEL_EXPRESSION);
AddMatchers({
create.KeywordIgnoreCase("rect"),
create.Numeric().Capture(CAPTURE_X),
create.Numeric().Capture(CAPTURE_Y),
create.Numeric().Capture(CAPTURE_W),
create.Numeric().Capture(CAPTURE_H),
create.NumericExpression(), // x
create.NumericExpression(), // y
create.NumericExpression(), // w
create.NumericExpression(), // h
create.Optional(create.And({
create.Integer().Capture(CAPTURE_ALIGN_HORIZONTAL),
create.Integer().Capture(CAPTURE_ALIGN_VERTICAL)
@@ -172,12 +170,16 @@ namespace menu::item_scope_sequences
{
assert(state->m_current_item);
const auto x = MenuMatcherFactory::TokenNumericExpressionValue(result);
const auto y = MenuMatcherFactory::TokenNumericExpressionValue(result);
const auto w = MenuMatcherFactory::TokenNumericExpressionValue(result);
const auto h = MenuMatcherFactory::TokenNumericExpressionValue(result);
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)),
x,
y,
w,
h,
0, 0
};