diff --git a/program.odin b/program.odin index 76433be..6f8b27e 100644 --- a/program.odin +++ b/program.odin @@ -36,6 +36,12 @@ ProgramState :: enum { Message, } +MouseState :: enum { + Hover, + DraggingGrid, + HoverMatrices, +} + ProgramMessageType :: enum { ChangeMatrixTypeClearData, } @@ -65,6 +71,7 @@ Program :: struct { matrix_count: int, matrix_scroll: f32, matrix_scroll_speed: f32, + mouse_state: MouseState, grid: Grid, font_style: FontStyle, state: ProgramState, @@ -99,24 +106,69 @@ program_init :: proc(allocator := context.allocator) { } program.grid = { area = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT}, - inner_area = {-1, -1, 2, 2}, + inner_area = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT}, zoom = 1.0, } ui.init(&program.ui_context, 4000, allocator) } +world_to_grid_matrix :: proc(grid: Grid) -> mat3 { + return matrix3_translate2(-rect_get_tl(grid.inner_area)) +} + +grid_to_world_matrix :: proc(grid: Grid) -> mat3 { + return {} +} + program_update :: proc() { if rl.IsKeyPressed(.ENTER) { matrix_pool_get_mat3() } - ui_elements := program_build_ui() + + ui_elements, matrix_container := program_build_ui() + + mouse := rl.GetMousePosition() + switch program.mouse_state { + case .Hover: + if rl.IsMouseButtonPressed(.LEFT) { + program.mouse_state = .DraggingGrid + } else if rect_has_point(rect2(matrix_container.area), mouse) { + program.mouse_state = .HoverMatrices + } + case .DraggingGrid: + program.grid.inner_area = rect_translate(program.grid.inner_area, rl.GetMouseDelta()) + if !rl.IsMouseButtonDown(.LEFT) { + program.mouse_state = .Hover + } + case .HoverMatrices: + program.matrix_scroll = max(0, program.matrix_scroll - rl.GetMouseWheelMove() * program.matrix_scroll_speed) + if !rect_has_point(rect2(matrix_container.area), mouse) { + program.mouse_state = .Hover + } + } + if rl.IsKeyPressed(.TAB) { ui.focus_next_element(&program.ui_context) } + + grid := program.grid + grid_inner_position := rect_get_tl(grid.inner_area) + draw_grid(grid.area, {50.0, 50.0}, rl.GRAY) + program_render_ui(&program.ui_context, ui_elements) } -program_build_ui :: proc() -> []ui.Element { +draw_grid :: proc(area: rect2, line_interval: v2, color: rl.Color) { + br := rect_get_br(area) + for x := area.x; x < br.x; x += line_interval.x { + rl.DrawLineV({x, area.y}, {x, br.y}, color) + } + for y := area.y; y < br.y; y += line_interval.y { + rl.DrawLineV({area.x, y}, {br.x, y}, color) + } +} + +program_build_ui :: proc() -> (elements: []ui.Element, matrix_container: ^ui.Element) { ui.start(&program.ui_context, {0, 0}, {WINDOW_WIDTH, WINDOW_HEIGHT}) top_bar_container_config := ui.ElementConfiguration {margin = V2_ONE * 4.0} top_bar_container := ui.container_begin({ui.Size_Percentage(1.0), ui.Size_Pixels(48.0)}, top_bar_container_config) @@ -136,7 +188,7 @@ program_build_ui :: proc() -> []ui.Element { side_bar_container_config := ui.ElementConfiguration {margin = V2_ONE * 4.0} side_bar_container_data := new(UiElementData_Container, context.temp_allocator) side_bar_container_data^ = {type = .Scroll, scroll = program.matrix_scroll} - matrix_container := ui.container_begin({ui.Size_Percentage(0.2), ui.Size_PercentageRemainder(1.0)}, side_bar_container_config, side_bar_container_data) + matrix_container = ui.container_begin({ui.Size_Percentage(0.2), ui.Size_PercentageRemainder(1.0)}, side_bar_container_config, side_bar_container_data) for i in 0.. []ui.Element { ui_mat3(mat, value_strings, container_dimensions, container_config) } ui.container_end() - elements := ui.end() - - mouse := rl.GetMousePosition() - if rect_has_point(rect2(matrix_container.area), mouse) { - program.matrix_scroll = max(0, program.matrix_scroll - rl.GetMouseWheelMove() * program.matrix_scroll_speed) - } - - return elements + elements = ui.end() + return } ui_mat3 :: proc(mat: []f32, value_strings: []InputFloatField, dimensions: ui.Dimensions, config: ui.ElementConfiguration, allocator := context.temp_allocator) {