From 43c2b6c0736e3e1e4b7da99b0f6d793dd7a89482 Mon Sep 17 00:00:00 2001 From: Sam Anthony Date: Mon, 28 Apr 2025 13:14:24 -0400 Subject: filter compressors --- widget.c | 39 +++++++++++++++++++++++++++++++-------- widget.h | 2 +- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/widget.c b/widget.c index 83ea5ae..b970174 100644 --- a/widget.c +++ b/widget.c @@ -16,6 +16,7 @@ static const mu_Color RED = {255, 0, 0, 255}; static const char *sc_selected_name(w_Select_Compressor *select); static int select_compressor_active(mu_Context *ctx, w_Select_Compressor *select); +static void sc_filter(w_Select_Compressor *select); static void update_active(mu_Context *ctx, mu_Id id, mu_Rect r, int *active); @@ -192,14 +193,11 @@ w_select_compressor(mu_Context *ctx, w_Select_Compressor *select) { static const char * sc_selected_name(w_Select_Compressor *select) { static const char *none = ""; - int i; - if (select->idx < 0 || select->idx >= select->nfiltered) { + if (select->idx < 0 || select->idx >= select->n) { return none; } - - i = select->filtered[select->idx]; - return select->names[i]; + return select->names[select->idx]; } static int @@ -220,7 +218,7 @@ select_compressor_active(mu_Context *ctx, w_Select_Compressor *select) { filter_changed |= mu_textbox(ctx, select->model_filter, sizeof(select->model_filter)); filter_changed &= MU_RES_SUBMIT; if (filter_changed) { - /* TODO: filter. */ + sc_filter(select); } res = 0; @@ -236,11 +234,36 @@ select_compressor_active(mu_Context *ctx, w_Select_Compressor *select) { } } - /* TODO */ - return res; } +static void +sc_filter(w_Select_Compressor *select) { + const char *brand, *series, *model; + int i; + const Compressor *comp; + + brand = select->brand_filter; + series = select->series_filter; + model = select->model_filter; + + /* TODO: parallelize */ + select->nfiltered = 0; + for (i = 0; i < select->n; i++) { + comp = &select->comps[i]; + + if (strspn(comp->brand, brand) != strlen(brand)) { + continue; + } else if (strspn(comp->series, series) != strlen(series)) { + continue; + } else if (strspn(comp->model, model) != strlen(model)) { + continue; + } + + select->filtered[select->nfiltered++] = i; + } +} + void w_init_number(w_Number num) { num[0] = '\0'; diff --git a/widget.h b/widget.h index 905e44e..1351ba1 100644 --- a/widget.h +++ b/widget.h @@ -48,7 +48,7 @@ typedef struct { int *filtered; /* indices of compressors accepted by the filter. */ int nfiltered; /* len(filtered) */ - int idx; /* index of selected in filtered. */ + int idx; /* index of selected in comps. */ int oldidx; /* index of previously selected. */ int active; -- cgit v1.2.3