Dialogs
This commit is contained in:
parent
bf4560fdbd
commit
7d1ebdee0b
1 changed files with 82 additions and 17 deletions
101
program.odin
101
program.odin
|
|
@ -32,8 +32,14 @@ UiElementData_Dropdown :: struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
UiButtonType :: enum {
|
UiButtonType :: enum {
|
||||||
Button,
|
AddIdentity,
|
||||||
Dropdown,
|
AddTranslation,
|
||||||
|
AddScale,
|
||||||
|
AddRotation,
|
||||||
|
AddTranslationMatrixConfirm,
|
||||||
|
AddScaleMatrixConfirm,
|
||||||
|
AddRotationMatrixConfirm,
|
||||||
|
ExitDialog,
|
||||||
}
|
}
|
||||||
|
|
||||||
UiElementData_Button :: struct {
|
UiElementData_Button :: struct {
|
||||||
|
|
@ -207,7 +213,7 @@ program_update :: proc() {
|
||||||
case .Message:
|
case .Message:
|
||||||
|
|
||||||
case .Dialog:
|
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) {
|
if rl.IsKeyDown(.ENTER) {
|
||||||
vals := program.dialog_data.input_values
|
vals := program.dialog_data.input_values
|
||||||
switch program.dialog_type {
|
switch program.dialog_type {
|
||||||
|
|
@ -229,7 +235,14 @@ program_update :: proc() {
|
||||||
draw_grid(grid.area, {32.0, 32.0}, rl.GRAY)
|
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_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() {
|
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}
|
size := v2{WINDOW_WIDTH, WINDOW_HEIGHT}
|
||||||
container_margin := size * 0.33
|
container_margin := size * 0.33
|
||||||
element_margin: f32 = 4.0
|
element_margin: f32 = 4.0
|
||||||
dialog_data := &program.dialog_data
|
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.start(ctx, V2_ZERO, {WINDOW_WIDTH, WINDOW_HEIGHT})
|
||||||
ui.container_begin(ui.dimensions_auto(), {margin = container_margin, padding = 8.0})
|
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.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("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("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_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.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()
|
ui.container_end()
|
||||||
return ui.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}
|
top_bar_dropdown_config := ui.ElementConfiguration {margin = top_bar_element_margin}
|
||||||
{
|
{
|
||||||
button_config := top_bar_button_config
|
button_config := top_bar_button_config
|
||||||
button_config.label = "+"
|
button_dimensions := top_bar_button_dimensions
|
||||||
ui.element(.Button, top_bar_button_dimensions, button_config)
|
button_data: ^UiElementData_Button
|
||||||
button_config.label = "-"
|
|
||||||
ui.same_line()
|
|
||||||
ui.element(.Button, top_bar_button_dimensions, button_config)
|
|
||||||
|
|
||||||
|
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()
|
ui.same_line()
|
||||||
matrix_dropdown_config := top_bar_dropdown_config
|
ui.element(.Button, button_dimensions, button_config, button_data)
|
||||||
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)
|
button_data = new(UiElementData_Button, context.temp_allocator)
|
||||||
matrix_dropdown_data^ = {value = cast(^i32)&program.matrix_create_dropdown_value}
|
button_config.label = "S"
|
||||||
ui.element(.Dropdown, top_bar_dropdown_dimensions, matrix_dropdown_config, matrix_dropdown_data)
|
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()
|
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)
|
rl.GuiGroupBox(area, element.label)
|
||||||
}
|
}
|
||||||
case .Button:
|
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:
|
case .Slider:
|
||||||
data := cast(^UiElementData_Slider)element.data
|
data := cast(^UiElementData_Slider)element.data
|
||||||
rl.GuiSlider(area, element.label, "", data.value, data.min, data.max)
|
rl.GuiSlider(area, element.label, "", data.value, data.min, data.max)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue