diff --git a/program.odin b/program.odin index 53371dc..03782d8 100644 --- a/program.odin +++ b/program.odin @@ -32,8 +32,14 @@ UiElementData_Dropdown :: struct { } UiButtonType :: enum { - Button, - Dropdown, + AddIdentity, + AddTranslation, + AddScale, + AddRotation, + AddTranslationMatrixConfirm, + AddScaleMatrixConfirm, + AddRotationMatrixConfirm, + ExitDialog, } UiElementData_Button :: struct { @@ -207,7 +213,7 @@ program_update :: proc() { case .Message: case .Dialog: - ui_overlay_elements = program_build_dialog_ui(&program.ui_overlay_context) + ui_overlay_elements = program_build_dialog_ui(&program.ui_overlay_context, program.dialog_type) if rl.IsKeyDown(.ENTER) { vals := program.dialog_data.input_values switch program.dialog_type { @@ -229,7 +235,14 @@ program_update :: proc() { draw_grid(grid.area, {32.0, 32.0}, rl.GRAY) program.ui_element_focus = program_render_ui_and_handle_focus(&program.ui_context, program.ui_element_focus, program.font_style, ui_elements) - program.ui_overlay_element_focus = program_render_ui_and_handle_focus(&program.ui_overlay_context, program.ui_overlay_element_focus, program.font_style, ui_overlay_elements) + if len(ui_overlay_elements) > 0 { + rl.DrawRectangle(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, {0, 0, 0, 192}) + program.ui_overlay_element_focus = program_render_ui_and_handle_focus( + &program.ui_overlay_context, + program.ui_overlay_element_focus, + program.font_style, + ui_overlay_elements) + } } program_add_identity_matrix :: proc() { @@ -269,20 +282,35 @@ program_add_rotation_matrix :: proc(angle: f32) { } } -program_build_dialog_ui :: proc(ctx: ^ui.Context) -> []ui.Element { +program_build_dialog_ui :: proc(ctx: ^ui.Context, dialog_type: ProgramDialogType) -> []ui.Element { size := v2{WINDOW_WIDTH, WINDOW_HEIGHT} container_margin := size * 0.33 element_margin: f32 = 4.0 dialog_data := &program.dialog_data + + dialog_type_to_button_type := [ProgramDialogType]UiButtonType { + .CreateTranslationMatrix = .AddTranslationMatrixConfirm, + .CreateScaleMatrix = .AddScaleMatrixConfirm, + .CreateRotationMatrix = .AddRotationMatrixConfirm, + } + button_type := dialog_type_to_button_type[program.dialog_type] + ui.start(ctx, V2_ZERO, {WINDOW_WIDTH, WINDOW_HEIGHT}) ui.container_begin(ui.dimensions_auto(), {margin = container_margin, padding = 8.0}) ui.element(.Label, {}, {label = program_dialog_messages[program.dialog_type], color = ui.col(rl.WHITE), margin = element_margin}) ui_labeled_input_float_element("X", 4.0, &dialog_data.input_values[0], &dialog_data.input_value_strings[0]) ui_labeled_input_float_element("Y", 4.0, &dialog_data.input_values[1], &dialog_data.input_value_strings[1]) ui_labeled_input_float_element("Z", 4.0, &dialog_data.input_values[2], &dialog_data.input_value_strings[2]) - ui.element(.Button, ui.dimensions_pixels({96.0, 32.0}), {label = "Add", margin = element_margin}) + + button_data: ^UiElementData_Button + button_data = new(UiElementData_Button, context.temp_allocator) + button_data^ = {type = button_type} + ui.element(.Button, ui.dimensions_pixels({96.0, 32.0}), {label = "Add", margin = element_margin}, button_data) + + button_data = new(UiElementData_Button, context.temp_allocator) + button_data^ = {type = .ExitDialog} ui.same_line() - ui.element(.Button, ui.dimensions_pixels({96.0, 32.0}), {label = "Cancel", margin = element_margin}) + ui.element(.Button, ui.dimensions_pixels({96.0, 32.0}), {label = "Cancel", margin = element_margin}, button_data) ui.container_end() return ui.end() } @@ -332,18 +360,31 @@ program_build_workspace_ui :: proc(ctx: ^ui.Context) -> (elements: []ui.Element, top_bar_dropdown_config := ui.ElementConfiguration {margin = top_bar_element_margin} { button_config := top_bar_button_config - button_config.label = "+" - ui.element(.Button, top_bar_button_dimensions, button_config) - button_config.label = "-" - ui.same_line() - ui.element(.Button, top_bar_button_dimensions, button_config) + button_dimensions := top_bar_button_dimensions + button_data: ^UiElementData_Button + button_data = new(UiElementData_Button, context.temp_allocator) + button_config.label = "I" + button_data^ = {type = .AddIdentity} + ui.element(.Button, button_dimensions, button_config, button_data) + + button_data = new(UiElementData_Button, context.temp_allocator) + button_config.label = "T" + button_data^ = {type = .AddTranslation} ui.same_line() - matrix_dropdown_config := top_bar_dropdown_config - matrix_dropdown_config.label = enum_to_raygui_options_string_hotkey(MatrixTypes, &matrix_add_hotkeys, context.temp_allocator) - matrix_dropdown_data := new(UiElementData_Dropdown, context.temp_allocator) - matrix_dropdown_data^ = {value = cast(^i32)&program.matrix_create_dropdown_value} - ui.element(.Dropdown, top_bar_dropdown_dimensions, matrix_dropdown_config, matrix_dropdown_data) + ui.element(.Button, button_dimensions, button_config, button_data) + + button_data = new(UiElementData_Button, context.temp_allocator) + button_config.label = "S" + button_data^ = {type = .AddScale} + ui.same_line() + ui.element(.Button, button_dimensions, button_config, button_data) + + button_data = new(UiElementData_Button, context.temp_allocator) + button_config.label = "R" + button_data^ = {type = .AddRotation} + ui.same_line() + ui.element(.Button, button_dimensions, button_config, button_data) } ui.container_end() @@ -413,7 +454,31 @@ program_render_ui_and_handle_focus :: proc(ctx: ^ui.Context, focus_element_id: u rl.GuiGroupBox(area, element.label) } case .Button: - rl.GuiButton(area, element.label) + if (rl.GuiButton(area, element.label)) { + if element.data == nil { + break + } + data := cast(^UiElementData_Button)element.data + switch data.type { + case .AddIdentity: program_add_identity_matrix() + case .AddTranslation: program_show_dialog(&program, .CreateTranslationMatrix) + case .AddScale: program_show_dialog(&program, .CreateScaleMatrix) + case .AddRotation: program_show_dialog(&program, .CreateRotationMatrix) + case .AddTranslationMatrixConfirm: + inputs := program.dialog_data.input_values + program_add_translation_matrix(inputs[0], inputs[1], inputs[2]) + program.state = .Normal + case .AddScaleMatrixConfirm: + inputs := program.dialog_data.input_values + program_add_scalar_matrix(inputs[0], inputs[1], inputs[2]) + program.state = .Normal + case .AddRotationMatrixConfirm: + program_add_rotation_matrix(program.dialog_data.input_values[0]) + program.state = .Normal + case .ExitDialog: + program.state = .Normal + } + } case .Slider: data := cast(^UiElementData_Slider)element.data rl.GuiSlider(area, element.label, "", data.value, data.min, data.max)