From d1f644fd6c2c318591c44f118a6204f703b494e8 Mon Sep 17 00:00:00 2001 From: spl3g Date: Fri, 21 Nov 2025 14:40:37 +0300 Subject: Add labels --- src/defines.h | 3 +++ src/main.c | 21 +++++++++++++------- src/ui.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++----------- 3 files changed, 69 insertions(+), 18 deletions(-) diff --git a/src/defines.h b/src/defines.h index 3d4bc31..98ba6d6 100644 --- a/src/defines.h +++ b/src/defines.h @@ -13,5 +13,8 @@ static const int FONT_ID = 0; #define DEFAULT_DIMENSIONS_HEIGHT 720 #define DEFAULT_DIMENSIONS_WIDTH 1280 +#define DEFAULT_FONT_SIZE 12 + +#define USE_LABELS #endif // DEFINES_H_ diff --git a/src/main.c b/src/main.c index b922d3e..c356cac 100644 --- a/src/main.c +++ b/src/main.c @@ -41,10 +41,10 @@ typedef struct { typedef struct { Arena frame_arena; PointerState pointer; + sclay_font_t fonts[1]; KeyState *keys; size_t keys_amount; - KnobSettings knob_settings; snd_pcm_t *sound_device; @@ -171,7 +171,7 @@ void HandleClayErrors(Clay_ErrorData errorData) { printf("%s", errorData.errorText.chars); } -int init_ui() { +int init_ui(AppState *state) { sg_setup(&(sg_desc){ .environment = sglue_environment(), .logger.func = slog_func, @@ -181,7 +181,13 @@ int init_ui() { }); sclay_setup(); - sclay_add_font("resources/Roboto-Regular.ttf"); + int font = sclay_add_font("resources/Roboto-Regular.ttf"); + if (font == FONS_INVALID) { + printf("Could not load font"); + return 1; + } + state->fonts[0] = font; + sclay_set_custom_element_cb(handle_custom); size_t totalMemorySize = Clay_MinMemorySize(); @@ -191,7 +197,8 @@ int init_ui() { }; Clay_Initialize(clayMemory, (Clay_Dimensions) { (float) sapp_width(), (float) sapp_height() }, (Clay_ErrorHandler) { HandleClayErrors, 0}); - Clay_SetMeasureTextFunction(sclay_measure_text, NULL); + Clay_SetMeasureTextFunction(sclay_measure_text, state->fonts); + Clay_SetDebugModeEnabled(true); return 0; } @@ -219,7 +226,7 @@ static void init(void *app_state) { state->keys = keys; state->keys_amount = sizeof(keys)/sizeof(keys[0]); - if (init_ui() != 0) { + if (init_ui(state) != 0) { printf("Couldn't initialize UI"); sapp_quit(); } @@ -262,7 +269,7 @@ void fill_ui_data(UIData *ui_data, AppState *state) { ui_data->keys_amount = state->keys_amount; ui_data->knob_settings = &state->knob_settings; - ui_data->scale = dimensions.width / DEFAULT_DIMENSIONS_WIDTH; + ui_data->scale = dimensions.width / DEFAULT_DIMENSIONS_WIDTH; } static void frame(void *app_state) { @@ -287,7 +294,7 @@ static void frame(void *app_state) { sgl_matrix_mode_modelview(); sgl_load_identity(); - sclay_render(render_commands, NULL); + sclay_render(render_commands, state->fonts); sgl_draw(); sg_end_pass(); diff --git a/src/ui.c b/src/ui.c index e797251..4a75863 100644 --- a/src/ui.c +++ b/src/ui.c @@ -1,5 +1,22 @@ #include "ui.h" +#ifdef USE_LABELS +#define CLAY_ADD_LABEL(label, scale, component) \ + CLAY(CLAY_ID(label"_label_container"), { \ + .layout = { \ + .layoutDirection = CLAY_TOP_TO_BOTTOM, \ + .childAlignment = { CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER }, \ + .childGap = 2 * scale, \ + }, \ + }) { \ + component; \ + CLAY_TEXT(CLAY_STRING(label), CLAY_TEXT_CONFIG({ .fontSize = DEFAULT_FONT_SIZE * scale, .textColor = COLOR_FG })); \ + } +#else +#define CLAY_ADD_LABEL(label, scale, component) \ + component; +#endif + bool point_is_inside_circle(Clay_Vector2 point, Clay_BoundingBox circle) { float center_x = circle.x + circle.width / 2; float center_y = circle.y + circle.height / 2; @@ -312,9 +329,6 @@ void draw_screen(UIData *ui_data) { .custom = { .customData = wave, }, - /* .clip = { */ - /* .horizontal = true, */ - /* }, */ }); } } @@ -327,10 +341,13 @@ void draw_panel(UIData *ui_data) { .childAlignment = {CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER}, }, }) { - CLAY(CLAY_ID("volume_knob_container")) { - draw_knob(CLAY_ID("volume_knob"), ui_data, &ui_data->knob_settings->volume, CLAY_SIZING_FIXED(85 * ui_data->scale), CLAY_SIZING_FIXED(45 * ui_data->scale)); - } - + CLAY_ADD_LABEL("Volume", + ui_data->scale, + draw_knob(CLAY_ID("volume_knob"), + ui_data, + &ui_data->knob_settings->volume, + CLAY_SIZING_FIXED(85 * ui_data->scale), + CLAY_SIZING_FIXED(45 * ui_data->scale))); draw_screen(ui_data); CLAY(CLAY_ID("envelope_knobs_container"), { @@ -344,16 +361,40 @@ void draw_panel(UIData *ui_data) { .childGap = 5, }, }) { - draw_knob(CLAY_ID("attack_knob"), ui_data, &ui_data->knob_settings->attack, CLAY_SIZING_FIXED(40 * ui_data->scale), CLAY_SIZING_FIXED(21 * ui_data->scale)); - draw_knob(CLAY_ID("decay_knob"), ui_data, &ui_data->knob_settings->decay, CLAY_SIZING_FIXED(40 * ui_data->scale), CLAY_SIZING_FIXED(21 * ui_data->scale)); + CLAY_ADD_LABEL("Attack", + ui_data->scale, + draw_knob(CLAY_ID("attack_knob"), + ui_data, + &ui_data->knob_settings->attack, + CLAY_SIZING_FIXED(40 * ui_data->scale), + CLAY_SIZING_FIXED(21 * ui_data->scale))); + CLAY_ADD_LABEL("Decay", + ui_data->scale, + draw_knob(CLAY_ID("decay_knob"), + ui_data, + &ui_data->knob_settings->decay, + CLAY_SIZING_FIXED(40 * ui_data->scale), + CLAY_SIZING_FIXED(21 * ui_data->scale))); } CLAY(CLAY_ID("envelope_knobs_lower"), { .layout = { .childGap = 5, }, }) { - draw_knob(CLAY_ID("sustain_knob"), ui_data, &ui_data->knob_settings->sustain, CLAY_SIZING_FIXED(40 * ui_data->scale), CLAY_SIZING_FIXED(21 * ui_data->scale)); - draw_knob(CLAY_ID("release_knob"), ui_data, &ui_data->knob_settings->release, CLAY_SIZING_FIXED(40 * ui_data->scale), CLAY_SIZING_FIXED(21 * ui_data->scale)); + CLAY_ADD_LABEL("Sustain", + ui_data->scale, + draw_knob(CLAY_ID("sustain_knob"), + ui_data, + &ui_data->knob_settings->sustain, + CLAY_SIZING_FIXED(40 * ui_data->scale), + CLAY_SIZING_FIXED(21 * ui_data->scale))); + CLAY_ADD_LABEL("Release", + ui_data->scale, + draw_knob(CLAY_ID("release_knob"), + ui_data, + &ui_data->knob_settings->release, + CLAY_SIZING_FIXED(40 * ui_data->scale), + CLAY_SIZING_FIXED(21 * ui_data->scale))); } } }; -- cgit v1.2.3