#include "dice_container.h" #include #include #include #include #include "elements.h" #include "style.h" #include "dice.h" static void HandleRollSetButtonInteraction(Clay_ElementId element, Clay_PointerData pointer, intptr_t data) { if (pointer.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { Dice_RollActiveSet(); } } static void HandleClearSetButtonInteraction(Clay_ElementId element, Clay_PointerData pointer, intptr_t data) { if (pointer.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { Dice_ClearActiveSet(); } } static void HandleAddDieButtonInteraction(Clay_ElementId element, Clay_PointerData pointer, intptr_t die) { if (pointer.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { Dice_AddToActiveSet((enum Dice_Die)die); } } static inline void AddDieButton(enum Dice_Die die) { CLAY(CLAY_IDI("AddDieButton", die), { .layout = { .sizing = { CLAY_SIZING_FIXED(100), CLAY_SIZING_FIXED(100) }, .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, }, .image = { GetDiceImage(die) } }) { Clay_OnHover(&HandleAddDieButtonInteraction, die); CLAY_TEXT(Dice_ToString(die), CLAY_TEXT_CONFIG({ .textColor = TextColors(0), .H(2), .textAlignment = CLAY_TEXT_ALIGN_CENTER })); } } static inline void DiceSelectorContainer() { CLAY(CLAY_ID("DiceSelector"), { .PANEL(0), .layout = { .sizing = { CLAY_SIZING_FIT(), CLAY_SIZING_GROW() }, .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, }, }) { CLAY(CLAY_ID("DiceSelectorInner"), { .layout = { .layoutDirection = CLAY_TOP_TO_BOTTOM, .childGap = paragraphGap, .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, .sizing = { CLAY_SIZING_FIT(), CLAY_SIZING_FIT() }, .padding = panelPadding, }, .clip = { true, true, Clay_GetScrollOffset(), }, }) { AddDieButton(D4); AddDieButton(D6); AddDieButton(D8); AddDieButton(D10); AddDieButton(D12); AddDieButton(D20); AddDieButton(D100); AddDieButton(COIN); } } } static void HandleRemoveDieButtonInteraction(Clay_ElementId element, Clay_PointerData pointer, intptr_t index) { if (pointer.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) { Dice_RemoveFromActiveSet(index); } } static inline void RemoveDieButton(enum Dice_Die die, int index) { CLAY(CLAY_IDI("RemoveDieButton", index), { .layout = { .sizing = { CLAY_SIZING_FIXED(200), CLAY_SIZING_FIXED(200) }, .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, }, .image = { GetDiceImage(die) }, }) { size_t result_length; struct Dice_ResultType const *result = Dice_GetLastResult(&result_length); Clay_String string = { .chars = result[index].string, .length = result[index].string_len, .isStaticallyAllocated = true }; Clay_OnHover(&HandleRemoveDieButtonInteraction, index); CLAY_TEXT(string, CLAY_TEXT_CONFIG({ .H(1), .textColor = TextColors(0), .textAlignment = CLAY_TEXT_ALIGN_CENTER, })); } } static inline void ActiveDiceContainer() { CLAY(CLAY_ID("ActiveDice"), { .layout = { .layoutDirection = CLAY_TOP_TO_BOTTOM, .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() }, }, .PANEL(0), }) { CLAY(CLAY_ID("ActiveDiceInner"), { .layout = { .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_GROW() }, .layoutDirection = CLAY_LEFT_TO_RIGHT, .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, .childGap = 16, .padding = { 100, 100, 0, 0 }, }, .clip = { true, true, { Clay_GetScrollOffset().x, 0 }, }, }) { size_t dice_count = 0; enum Dice_Die const *dice = Dice_GetActiveSet(&dice_count); for (size_t i = 0; i < dice_count; ++i) { RemoveDieButton(dice[i], i); } } CLAY(CLAY_ID("ActiveDiceControls"), { .layout = { .layoutDirection = CLAY_LEFT_TO_RIGHT, .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, .childGap = 20, .padding = { 0, 0, 0, 10 }, }, }) { TextButton(CLAY_STRING("Roll"), proceedButton, &HandleRollSetButtonInteraction, 0); CLAY_TEXT(Dice_GetLastResultTotal()->clay_string, CLAY_TEXT_CONFIG({ .H(3), .textColor = TextColors(0), })); TextButton(CLAY_STRING("Clear"), warningButton, &HandleClearSetButtonInteraction, 0); } } } void DiceContainer() { CLAY(CLAY_ID("DiceContainer"), { .layout = { .layoutDirection = CLAY_LEFT_TO_RIGHT, .sizing = { CLAY_SIZING_GROW(), CLAY_SIZING_PERCENT(0.4) }, .childGap = containerGap }, }) { DiceSelectorContainer(); ActiveDiceContainer(); } }