diff --git a/gui.c b/gui.c index 5b00977..f94320b 100644 --- a/gui.c +++ b/gui.c @@ -2,6 +2,7 @@ #include #include #include +#include #include #include #include @@ -94,21 +95,29 @@ static void gui_update(void) } } if (mu_button(ctx, "Reset")) { + Action action = { .type = ACTION_RESET_TRANSPORT }; + g_engine->dispatch(action); current_beat = 0; } if (mu_button(ctx, "Quit")) { + Action action = { .type = ACTION_QUIT }; + g_engine->dispatch(action); running = 0; } /* BPM slider */ mu_layout_row(ctx, 2, (int[]) { 60, -1 }, 0); mu_label(ctx, "BPM:"); - mu_slider_ex(ctx, &bpm, 20.0f, 300.0f, 0, "%.0f", 0); + mu_slider_ex(ctx, &bpm, 20.0f, 300.0f, 0, "%.0f", MU_OPT_ALIGNCENTER); /* loop length */ mu_layout_row(ctx, 2, (int[]) { 60, -1 }, 0); mu_label(ctx, "Length:"); - mu_slider_ex(ctx, (float*)&loop_length, 1.0f, 64.0f, 0, "%.0f", 0); + { + float loop_length_f = (float)loop_length; + mu_slider_ex(ctx, &loop_length_f, 1.0f, 64.0f, 0, "%.0f", 0); + loop_length = (int)loop_length_f; + } /* beat indicator */ mu_layout_row(ctx, 1, (int[]) { -1 }, 0); @@ -123,7 +132,8 @@ static void gui_update(void) { float progress = (loop_length > 0) ? (float)current_beat / (float)loop_length : 0.0f; mu_Rect r = mu_layout_next(ctx); - mu_draw_control_frame(ctx, mu_get_id(ctx, &progress, sizeof(progress)), r, MU_COLOR_BASE, 0); + mu_Id prog_id = mu_get_id(ctx, &progress, sizeof(progress)); + mu_draw_control_frame(ctx, prog_id, r, MU_COLOR_BASE, 0); if (progress > 0.0f) { mu_Rect fill = r; fill.w = (int)(r.w * progress); @@ -162,6 +172,8 @@ static void gui_update(void) mu_label(ctx, "Level:"); if (mu_button(ctx, zoom_labels[zoom_level])) { zoom_level = (zoom_level + 1) % 3; + zoom_focus_scene = 0; + zoom_focus_channel = 0; } mu_layout_row(ctx, 2, (int[]) { 60, -1 }, 0); @@ -169,9 +181,7 @@ static void gui_update(void) { char buf[32]; snprintf(buf, sizeof(buf), "%d", zoom_focus_scene + 1); - if (mu_button(ctx, buf)) { - /* click to reset? no action needed */ - } + mu_label(ctx, buf); } mu_layout_row(ctx, 2, (int[]) { 60, -1 }, 0); @@ -179,9 +189,7 @@ static void gui_update(void) { char buf[32]; snprintf(buf, sizeof(buf), "%d", zoom_focus_channel + 1); - if (mu_button(ctx, buf)) { - /* click to reset? no action needed */ - } + mu_label(ctx, buf); } /* Navigation hint */ @@ -204,7 +212,12 @@ static void gui_update(void) mu_layout_row(ctx, 1, (int[]) { -1 }, 0); if (mu_button(ctx, "Add Plugin")) { if (plugin_uri_input_len > 0) { - carla_add_plugin(&g_engine->carla_host, selected_channel, plugin_uri_input, PLUGIN_TYPE_INTERNAL); + Action action = { .type = ACTION_RACK_ADD_PLUGIN }; + action.data.rack_add_plugin.channel = selected_channel; + strncpy(action.data.rack_add_plugin.uri, plugin_uri_input, sizeof(action.data.rack_add_plugin.uri) - 1); + action.data.rack_add_plugin.uri[sizeof(action.data.rack_add_plugin.uri) - 1] = '\0'; + action.data.rack_add_plugin.type = PLUGIN_TYPE_INTERNAL; + g_engine->dispatch(action); plugin_uri_input_len = 0; plugin_uri_input[0] = '\0'; } @@ -257,7 +270,12 @@ int gui_main(Engine *engine) } else if (ch == '\n' || ch == '\r') { /* Submit plugin URI */ if (plugin_uri_input_len > 0) { - carla_add_plugin(&g_engine->carla_host, selected_channel, plugin_uri_input, PLUGIN_TYPE_INTERNAL); + Action action = { .type = ACTION_RACK_ADD_PLUGIN }; + action.data.rack_add_plugin.channel = selected_channel; + strncpy(action.data.rack_add_plugin.uri, plugin_uri_input, sizeof(action.data.rack_add_plugin.uri) - 1); + action.data.rack_add_plugin.uri[sizeof(action.data.rack_add_plugin.uri) - 1] = '\0'; + action.data.rack_add_plugin.type = PLUGIN_TYPE_INTERNAL; + g_engine->dispatch(action); plugin_uri_input_len = 0; plugin_uri_input[0] = '\0'; } @@ -323,7 +341,8 @@ int gui_main(Engine *engine) } /* update engine state */ - AppState state = dispatcher_get_state(); + AppState state; + dispatcher_get_state(&state); current_beat = state.bar_position * 4 + state.beat_position; /* render GUI */