Started modeling an interface. Early MicroUI backend.
This commit is contained in:
150
microui/microui.odin
Normal file
150
microui/microui.odin
Normal file
@@ -0,0 +1,150 @@
|
||||
package microui_wrapper
|
||||
|
||||
import "core:log"
|
||||
|
||||
import mu "vendor:microui"
|
||||
|
||||
Context :: mu.Context
|
||||
|
||||
@(private) set_clipboard :: proc(userdata: rawptr, text: string) -> bool {
|
||||
return false
|
||||
}
|
||||
@(private) get_clipboard :: proc(userdata: rawptr) -> (string, bool) {
|
||||
return {}, false
|
||||
}
|
||||
|
||||
@(private) text_width :: proc(font: mu.Font, text: string) -> i32 {
|
||||
// log.warnf("TODO: SS - Implement %v.", #procedure)
|
||||
return 0 // TEMP: SS
|
||||
}
|
||||
@(private) text_height :: proc(font: mu.Font) -> i32 {
|
||||
// log.warnf("TODO: SS - Implement %v.", #procedure)
|
||||
return 0 // TEMP: SS
|
||||
}
|
||||
|
||||
Command :: mu.Command
|
||||
Command_Jump :: mu.Command_Jump // Internal. Should not be used externally.
|
||||
Command_Clip :: mu.Command_Clip
|
||||
Command_Icon :: mu.Command_Icon
|
||||
Command_Rect :: mu.Command_Rect
|
||||
Command_Text :: mu.Command_Text
|
||||
Rect :: mu.Rect
|
||||
|
||||
Input :: struct {
|
||||
mouse_x, mouse_y: u16,
|
||||
mouse_buttons_pressed: mu.Mouse_Set,
|
||||
mouse_buttons_released: mu.Mouse_Set,
|
||||
}
|
||||
|
||||
init :: proc(ctx: ^Context) -> bool {
|
||||
assert(ctx != nil)
|
||||
|
||||
clipboard_user_data: rawptr = nil // TEMP: SS
|
||||
mu.init(ctx, set_clipboard, get_clipboard, clipboard_user_data)
|
||||
ctx.text_width = text_width
|
||||
ctx.text_height = text_height
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
begin :: proc(ctx: ^Context, input: Input) {
|
||||
assert(ctx != nil)
|
||||
|
||||
{ // Apply input.
|
||||
mx := i32(input.mouse_x)
|
||||
my := i32(input.mouse_y)
|
||||
mu.input_mouse_move(ctx, mx, my)
|
||||
|
||||
for b in input.mouse_buttons_pressed {
|
||||
mu.input_mouse_down(ctx, mx, my, b)
|
||||
}
|
||||
for b in input.mouse_buttons_released {
|
||||
mu.input_mouse_up(ctx, mx, my, b)
|
||||
}
|
||||
}
|
||||
|
||||
// Now, begin.
|
||||
mu.begin(ctx)
|
||||
|
||||
{ // TEMP: SS - Just trying it out.
|
||||
// if mu.begin_window(
|
||||
// ctx,
|
||||
// "Test",
|
||||
// mu.Rect {
|
||||
// x = 0, y = 20,
|
||||
// w = 256, h = 256,
|
||||
// },
|
||||
// opt = {}
|
||||
// ) {
|
||||
// mu.label(ctx, "First:")
|
||||
// if mu.button(ctx, "Button1") == {.SUBMIT} {
|
||||
// log.infof("Button1 pressed")
|
||||
// }
|
||||
|
||||
// mu.label(ctx, "Second:");
|
||||
// if mu.button(ctx, "Button2") == {.SUBMIT} {
|
||||
// mu.open_popup(ctx, "My Popup");
|
||||
// }
|
||||
|
||||
// if (mu.begin_popup(ctx, "My Popup")) {
|
||||
// mu.label(ctx, "Hello world!")
|
||||
|
||||
// if mu.button(ctx, "Button3") == {.SUBMIT} {
|
||||
// log.infof("Button3 pressed")
|
||||
// }
|
||||
|
||||
// mu.end_popup(ctx)
|
||||
// }
|
||||
|
||||
|
||||
// mu.end_window(ctx)
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
end :: proc(ctx: ^Context) {
|
||||
assert(ctx != nil)
|
||||
mu.end(ctx)
|
||||
}
|
||||
|
||||
|
||||
begin_window :: proc(ctx: ^Context, title: string, rect: mu.Rect) -> bool {
|
||||
assert(ctx != nil)
|
||||
|
||||
opt := mu.Options {
|
||||
// .NO_CLOSE, // TEMP: SS - Some weird bug is happening. Windows are closing randomly, but this helps..
|
||||
}
|
||||
|
||||
return mu.begin_window(
|
||||
ctx,
|
||||
title,
|
||||
rect,
|
||||
opt,
|
||||
)
|
||||
}
|
||||
|
||||
end_window :: proc(ctx: ^Context) {
|
||||
assert(ctx != nil)
|
||||
|
||||
mu.end_window(ctx)
|
||||
}
|
||||
|
||||
button :: proc(ctx: ^Context, title: string) -> bool {
|
||||
return mu.button(ctx, title) == {.SUBMIT}
|
||||
}
|
||||
|
||||
pop_draw_command :: proc(ctx: ^Context, last_cmd: ^mu.Command) -> ^mu.Command {
|
||||
cmd: ^mu.Command = last_cmd
|
||||
if !mu.next_command(ctx, &cmd) {
|
||||
return nil
|
||||
}
|
||||
|
||||
assert(cmd != nil)
|
||||
return cmd
|
||||
}
|
||||
|
||||
shutdown :: proc(ctx: ^Context) {
|
||||
assert(ctx != nil)
|
||||
|
||||
ctx^ = {}
|
||||
}
|
||||
Reference in New Issue
Block a user