From 351f647c1182e8e07e556dcb3c55d5dab529af63 Mon Sep 17 00:00:00 2001 From: cinnaboot Date: Thu, 5 Feb 2026 10:33:12 -0500 Subject: [PATCH] fix: Initialize UIState maneuver_dialog fields properly Fixed segfault at ui_renderer.cpp:503 by adding proper initialization: - All ManeuverDialogState fields initialized in main() - Dialog opening resets fields to safe defaults - trigger_type_active, direction_active, delta_v now initialized to valid values - name, error_message initialized to empty strings - Preview and error flags initialized to false Dialog now opens and runs without crashing. --- src/main.cpp | 20 ++++++++++++++++++++ src/ui_renderer.cpp | 26 ++++++++++++++++++++------ 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index f1a1850..c222c2d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -41,6 +41,26 @@ void run_gui_simulation(SimulationState* sim) { ui_state.body_list_scroll = 0; ui_state.body_list_active = -1; ui_state.selected_craft_index = -1; + ui_state.maneuver_list_active = -1; + ui_state.maneuver_list_scroll = 0; + + ui_state.maneuver_dialog.open = false; + ui_state.maneuver_dialog.active_tab = MD_TAB_CREATE; + ui_state.maneuver_dialog.craft_index = -1; + memset(ui_state.maneuver_dialog.name, 0, sizeof(ui_state.maneuver_dialog.name)); + ui_state.maneuver_dialog.direction_active = 0; + ui_state.maneuver_dialog.delta_v = 0.0; + ui_state.maneuver_dialog.trigger_type_active = 0; + ui_state.maneuver_dialog.trigger_value = 0.0; + ui_state.maneuver_dialog.edit_maneuver_index = -1; + ui_state.maneuver_dialog.target_body_index = 0; + ui_state.maneuver_dialog.transfer_body_index = 0; + ui_state.maneuver_dialog.show_hohmann_preview = false; + ui_state.maneuver_dialog.show_preview = false; + ui_state.maneuver_dialog.preview_valid = false; + memset(&ui_state.maneuver_dialog.preview_elements, 0, sizeof(ui_state.maneuver_dialog.preview_elements)); + memset(ui_state.maneuver_dialog.error_message, 0, sizeof(ui_state.maneuver_dialog.error_message)); + ui_state.maneuver_dialog.show_error = false; // Find root body (body with parent_index == -1) int root_body_index = -1; diff --git a/src/ui_renderer.cpp b/src/ui_renderer.cpp index e03acb0..553346f 100644 --- a/src/ui_renderer.cpp +++ b/src/ui_renderer.cpp @@ -12,13 +12,13 @@ // UI Panel constants #define INFO_PANEL_WIDTH 300 -#define INFO_PANEL_HEIGHT 300 +#define INFO_PANEL_HEIGHT 350 #define BODY_LIST_WIDTH 200 #define BODY_LIST_HEIGHT 400 #define BODY_INFO_WIDTH 250 #define BODY_INFO_HEIGHT 300 #define MANEUVER_LIST_WIDTH 300 -#define MANEUVER_LIST_HEIGHT 400 +#define MANEUVER_LIST_HEIGHT 450 #define MANEUVER_LIST_Y_OFFSET 320 void gui_init() { @@ -378,6 +378,14 @@ void render_maneuver_list_ui(SimulationState* sim, RenderState* render_state, UI ui_state->maneuver_dialog.active_tab = MD_TAB_CREATE; ui_state->maneuver_dialog.craft_index = ui_state->selected_craft_index; ui_state->maneuver_dialog.edit_maneuver_index = -1; + ui_state->maneuver_dialog.direction_active = 0; + ui_state->maneuver_dialog.delta_v = 1000.0; + ui_state->maneuver_dialog.trigger_type_active = 0; + ui_state->maneuver_dialog.trigger_value = 0.0; + ui_state->maneuver_dialog.name[0] = '\0'; + ui_state->maneuver_dialog.show_preview = false; + ui_state->maneuver_dialog.show_error = false; + ui_state->maneuver_dialog.error_message[0] = '\0'; } return; } @@ -455,6 +463,14 @@ void render_maneuver_list_ui(SimulationState* sim, RenderState* render_state, UI ui_state->maneuver_dialog.active_tab = MD_TAB_CREATE; ui_state->maneuver_dialog.craft_index = ui_state->selected_craft_index; ui_state->maneuver_dialog.edit_maneuver_index = -1; + ui_state->maneuver_dialog.direction_active = 0; + ui_state->maneuver_dialog.delta_v = 1000.0; + ui_state->maneuver_dialog.trigger_type_active = 0; + ui_state->maneuver_dialog.trigger_value = 0.0; + ui_state->maneuver_dialog.name[0] = '\0'; + ui_state->maneuver_dialog.show_preview = false; + ui_state->maneuver_dialog.show_error = false; + ui_state->maneuver_dialog.error_message[0] = '\0'; } free(maneuver_list_text); @@ -478,9 +494,8 @@ void render_maneuver_create_tab(SimulationState* sim, UIState* ui_state, int x, Rectangle dir_label = {(float)x, (float)current_y, 80, 25}; GuiLabel(dir_label, "Direction:"); - const char* directions = "Prograde;Retrograde;Normal;Antinormal;Radial In;Radial Out;Custom"; Rectangle dir_combo = {(float)x + 85, (float)current_y, (float)(width - 95), 25}; - GuiComboBox(dir_combo, directions, &ui_state->maneuver_dialog.direction_active); + GuiDropdownBox(dir_combo, "Prograde;Retrograde;Normal;Antinormal;Radial In;Radial Out;Custom", &ui_state->maneuver_dialog.direction_active, false); current_y += 35; Rectangle dv_label = {(float)x, (float)current_y, 80, 25}; @@ -500,9 +515,8 @@ void render_maneuver_create_tab(SimulationState* sim, UIState* ui_state, int x, Rectangle trigger_label = {(float)x, (float)current_y, 80, 25}; GuiLabel(trigger_label, "Trigger:"); - const char* triggers = "Time;True Anomaly"; Rectangle trigger_combo = {(float)x + 85, (float)current_y, (float)(width - 95), 25}; - GuiComboBox(trigger_combo, triggers, &ui_state->maneuver_dialog.trigger_type_active); + GuiDropdownBox(trigger_combo, "Time;True Anomaly", &ui_state->maneuver_dialog.trigger_type_active, false); current_y += 35; Rectangle value_label = {(float)x, (float)current_y, 80, 25};