From 2874c5ebea0fb52e7871169ddcf2c20531f45bc2 Mon Sep 17 00:00:00 2001 From: cinnaboot Date: Thu, 5 Feb 2026 10:49:17 -0500 Subject: [PATCH] feat: Add auto-generated maneuver names with edit capability MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added automatic name generation for new maneuvers: - generate_maneuver_name() creates sensible names (e.g., 'Prograde #1', 'Retrograde @ ν=3.14 #2') - Names based on burn direction, trigger type, and burn number - User can still manually edit names if desired - Validation now allows empty names (for auto-generation) - Integrates with existing create_maneuver_from_dialog() workflow Users can create maneuvers faster with auto-generated names, or override with custom names. --- src/ui_renderer.cpp | 32 ++++++++++++++++++++++++-------- src/ui_renderer.h | 1 + 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/ui_renderer.cpp b/src/ui_renderer.cpp index 553346f..1078f96 100644 --- a/src/ui_renderer.cpp +++ b/src/ui_renderer.cpp @@ -699,14 +699,6 @@ bool validate_maneuver_inputs(SimulationState* sim, UIState* ui_state) { return false; } - if (strlen(ui_state->maneuver_dialog.name) == 0) { - snprintf(ui_state->maneuver_dialog.error_message, - sizeof(ui_state->maneuver_dialog.error_message), - "Maneuver name is required"); - ui_state->maneuver_dialog.show_error = true; - return false; - } - for (int i = 0; i < sim->maneuver_count; i++) { if (strcmp(sim->maneuvers[i].name, ui_state->maneuver_dialog.name) == 0) { if (ui_state->maneuver_dialog.edit_maneuver_index >= 0 && @@ -778,11 +770,35 @@ bool validate_maneuver_inputs(SimulationState* sim, UIState* ui_state) { return true; } +void generate_maneuver_name(SimulationState* sim, UIState* ui_state) { + if (strlen(ui_state->maneuver_dialog.name) > 0) { + return; + } + + int burn_num = 0; + for (int i = 0; i < sim->maneuver_count; i++) { + if (sim->maneuvers[i].craft_index == ui_state->maneuver_dialog.craft_index) { + burn_num++; + } + } + + const char* direction_name = get_burn_direction_name((BurnDirection)ui_state->maneuver_dialog.direction_active); + + if (ui_state->maneuver_dialog.trigger_type_active == 0) { + snprintf(ui_state->maneuver_dialog.name, 64, "%s #%d", direction_name, burn_num); + } else { + snprintf(ui_state->maneuver_dialog.name, 64, "%s @ ν=%.2f #%d", + direction_name, ui_state->maneuver_dialog.trigger_value, burn_num); + } +} + void create_maneuver_from_dialog(SimulationState* sim, UIState* ui_state) { if (!validate_maneuver_inputs(sim, ui_state)) { return; } + generate_maneuver_name(sim, ui_state); + Maneuver maneuver = create_maneuver( ui_state->maneuver_dialog.name, ui_state->maneuver_dialog.craft_index, diff --git a/src/ui_renderer.h b/src/ui_renderer.h index 674d0f3..6ab0948 100644 --- a/src/ui_renderer.h +++ b/src/ui_renderer.h @@ -61,6 +61,7 @@ void render_maneuver_create_tab(SimulationState* sim, UIState* ui_state, int x, void update_orbital_preview(SimulationState* sim, UIState* ui_state); void render_orbital_preview(SimulationState* sim, UIState* ui_state, Rectangle bounds); bool validate_maneuver_inputs(SimulationState* sim, UIState* ui_state); +void generate_maneuver_name(SimulationState* sim, UIState* ui_state); void create_maneuver_from_dialog(SimulationState* sim, UIState* ui_state); void update_maneuver_from_dialog(SimulationState* sim, UIState* ui_state);