134 lines
2.7 KiB
Odin
134 lines
2.7 KiB
Odin
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
|
|
}
|