From c1d4ea53140acb01e69849617147477df0d2b9e0 Mon Sep 17 00:00:00 2001 From: VanGorkum Date: Thu, 28 Dec 2023 19:26:24 +0100 Subject: [PATCH] Introduced highlighted options menu similar to Portal Switch version --- src/menu/menu_builder.c | 42 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/src/menu/menu_builder.c b/src/menu/menu_builder.c index ce3ef72..5cacfe7 100644 --- a/src/menu/menu_builder.c +++ b/src/menu/menu_builder.c @@ -11,6 +11,13 @@ #include "../build/assets/materials/ui.h" #include "../build/src/audio/clips.h" +#include + +#define MENU_WIDTH 252 +#define TEXTHEIGHT 12 +#define PADDING_X 2 +#define TABWIDTH 232 + void textMenuItemInit(struct MenuBuilderElement* element) { char* message = element->params->params.text.message; @@ -34,7 +41,20 @@ void textMenuItemRebuildText(struct MenuBuilderElement* element) { void textMenuItemRender(struct MenuBuilderElement* element, int selection, int materialIndex, struct PrerenderedTextBatch* textBatch, struct RenderState* renderState) { if (textBatch) { - prerenderedBatchAdd(textBatch, element->data, selection == element->selectionIndex ? &gSelectionGray : &gColorWhite); + prerenderedBatchAdd(textBatch, element->data, selection == element->selectionIndex ? &gColorBlack : &gColorWhite); + bool isTextPositionedOnFarLeft = (element->params->x < (int)(MENU_WIDTH / 2)) ? true : false; + + if ((selection == element->selectionIndex) && isTextPositionedOnFarLeft){ + gDPPipeSync(renderState->dl++); + gDPSetEnvColor(renderState->dl++, gSelectionOrange.r, gSelectionOrange.g, gSelectionOrange.b, gSelectionOrange.a); + gDPFillRectangle( + renderState->dl++, + element->params->x - PADDING_X, + element->params->y, + element->params->x + TABWIDTH + PADDING_X, + element->params->y + TEXTHEIGHT + ); + } } } @@ -78,14 +98,30 @@ void checkboxMenuItemRebuildText(struct MenuBuilderElement* element) { ); } -void checkboxMenuItemRender(struct MenuBuilderElement* element, int selection, int materialIndex, struct PrerenderedTextBatch* textBatch, struct RenderState* renderState) { +void checkboxMenuItemRender(struct MenuBuilderElement* element, + int selection, + int materialIndex, + struct PrerenderedTextBatch* textBatch, + struct RenderState* renderState) { struct MenuCheckbox* checkbox = (struct MenuCheckbox*)element->data; if (materialIndex == SOLID_ENV_INDEX) { gSPDisplayList(renderState->dl++, checkbox->outline); renderState->dl = menuCheckboxRender(checkbox, renderState->dl); } else if (textBatch) { - prerenderedBatchAdd(textBatch, checkbox->prerenderedText, selection == element->selectionIndex ? &gSelectionGray : &gColorWhite); + prerenderedBatchAdd(textBatch, checkbox->prerenderedText, selection == element->selectionIndex ? &gColorBlack : &gColorWhite); + + if (selection == element->selectionIndex) { + gDPPipeSync(renderState->dl++); + gDPSetEnvColor(renderState->dl++, gSelectionOrange.r, gSelectionOrange.g, gSelectionOrange.b, gSelectionOrange.a); + gDPFillRectangle( + renderState->dl++, + element->params->x + CHECKBOX_SIZE + 4, + element->params->y, + element->params->x + MENU_WIDTH - CHECKBOX_SIZE - 4, + element->params->y + CHECKBOX_SIZE + ); + } } }