package main import rl "libraries/raylib" import "core:fmt" import "core:strings" import "core:mem" import "base:runtime" WINDOW_WIDTH :: 1280 WINDOW_HEIGHT :: 720 WINDOW_FRAMERATE :: 30 WINDOW_CAPTION :: "Transformation Visualizer" v2 :: [2]f32 rect2 :: rl.Rectangle UiElementType :: enum { Input, Button, } UiElementData :: union { UiButtonData, } UiButtonData :: struct { label: cstring, } UiElement :: struct { area: rect2, type: UiElementType, data: UiElementData, } UiState :: struct { origin, position: v2, same_line: bool, style: UiStyle, elements: [dynamic]UiElement, } UiStyle :: struct { margin, padding: f32, } ui_button :: proc(state: ^UiState, size: v2, data: UiButtonData) { element := UiElement{area = {**state.position, **size}, type = .Button, data = data} if state.same_line { state.position.x += size.x + state.style.padding state.same_line = false } else { state.position.y += size.y + state.style.padding } append(&state.elements, element) } ui_same_line :: proc(state: ^UiState) { state.same_line = true } ui_start :: proc(state: ^UiState) { clear(&state.elements) state.position = state.origin + state.style.margin } ui_end :: proc(state: UiState) -> []UiElement { return state.elements[:] } ui_init :: proc(state: ^UiState, style: UiStyle, origin: v2, allocator: mem.Allocator) { state^ = { origin = origin, position = origin, style = style, elements = make(type_of(state.elements), 0, 512, allocator) } } init :: proc() { rl.SetTraceLogLevel(.WARNING) rl.SetConfigFlags({.WINDOW_RESIZABLE, .VSYNC_HINT}) rl.InitWindow(WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_CAPTION) rl.SetTargetFPS(WINDOW_FRAMERATE) } update :: proc() { ui_style := UiStyle{margin = 4.0, padding = 4.0} ui_state: UiState ui_init(&ui_state, ui_style, {0, 0}, context.temp_allocator) ui_start(&ui_state) ui_button_size := v2{192.0, 32.0} ui_same_line(&ui_state) ui_button(&ui_state, ui_button_size, {label = "Hi"}) ui_same_line(&ui_state) ui_button(&ui_state, ui_button_size, {label = "Hi"}) ui_same_line(&ui_state) ui_button(&ui_state, ui_button_size, {label = "Hi"}) ui_elements := ui_end(ui_state) rl.BeginDrawing() defer rl.EndDrawing() rl.ClearBackground(rl.BLACK) for element in ui_elements { fmt.println(element) switch element.type { case .Button: data := element.data.(UiButtonData) rl.GuiButton(element.area, data.label) case .Input: } } fmt.println() free_all(context.temp_allocator) } parent_window_size_changed :: proc(w, h: int) { rl.SetWindowSize(i32(w), i32(h)) } shutdown :: proc() { rl.CloseWindow() } should_run :: proc() -> bool { when ODIN_OS != .JS { if rl.WindowShouldClose() { return false } } return true }