From 4c2fa6ab15c64c4d94c08d7bcf36036a3059262a Mon Sep 17 00:00:00 2001 From: Patrick Cleavelin Date: Sat, 6 Jan 2024 16:11:29 -0600 Subject: [PATCH] get drawing api started --- plugins/buffer_search/plugin.odin | 25 +++++++++++++++++++++++++ src/core/core.odin | 2 +- src/main.odin | 18 +++++++++++++++++- src/plugin/plugin.odin | 6 +++++- src/ui/buffer_list_window.odin | 2 +- src/ui/grep_window.odin | 2 +- 6 files changed, 50 insertions(+), 5 deletions(-) diff --git a/plugins/buffer_search/plugin.odin b/plugins/buffer_search/plugin.odin index c5e6e65..ddc1170 100644 --- a/plugins/buffer_search/plugin.odin +++ b/plugins/buffer_search/plugin.odin @@ -31,4 +31,29 @@ open_buffer_window :: proc "c" (plugin: Plugin) { context = runtime.default_context(); fmt.println("Look you tried opening a window from a plugin!"); + + window := plugin.create_window(proc "c" (plugin: Plugin, input_map: rawptr) { + plugin.register_input(input_map, .K, proc "c" (plugin: Plugin) { + context = runtime.default_context(); + + fmt.println("haha, moving up does nothing"); + }, "move selection up"); + plugin.register_input(input_map, .J, proc "c" (plugin: Plugin) { + context = runtime.default_context(); + + fmt.println("haha, moving down does nothing"); + }, "move selection down"); + }, draw_buffer_window); +} + +draw_buffer_window :: proc "c" (plugin: Plugin, window: rawptr) { + context = runtime.default_context(); + + plugin.draw_rect( + 0, + 0, + 64, + 64, + 0x000000ff, + ); } diff --git a/src/core/core.odin b/src/core/core.odin index cf0491f..38f6b98 100644 --- a/src/core/core.odin +++ b/src/core/core.odin @@ -11,7 +11,7 @@ Mode :: enum { Insert, } -WindowDrawProc :: proc(win: ^Window, state: ^State); +WindowDrawProc :: proc "c" (plugin: plugin.Plugin, win: rawptr); WindowFreeProc :: proc(win: ^Window, state: ^State); WindowGetBufferProc :: proc(win: ^Window) -> ^FileBuffer; Window :: struct { diff --git a/src/main.odin b/src/main.odin index c611d5d..dc3fdd3 100644 --- a/src/main.odin +++ b/src/main.odin @@ -290,6 +290,22 @@ main :: proc() { core.register_key_action(to_be_edited_map, key, input_action, description); } }, + create_window = proc "c" (register_group: plugin.InputGroupProc, draw_proc: plugin.WindowDrawProc) -> rawptr { + context = state.ctx; + window := new(core.Window); + window^ = core.Window { + input_map = core.new_input_map(), + draw = draw_proc, + }; + + register_group(state.plugin_vtable, transmute(rawptr)&window.input_map); + + state.window = window; + state.current_input_map = &window.input_map; + + return window; + }, + draw_rect = raylib.DrawRectangle, iter = plugin.Iterator { get_current_buffer_iterator = proc "c" () -> plugin.BufferIter { context = state.ctx; @@ -676,7 +692,7 @@ main :: proc() { theme.get_palette_raylib_color(.Background1)); if state.window != nil && state.window.draw != nil { - state.window->draw(&state); + state.window.draw(state.plugin_vtable, state.window); } if state.current_input_map != &state.input_map { diff --git a/src/plugin/plugin.odin b/src/plugin/plugin.odin index 19ab51f..5ee9be5 100644 --- a/src/plugin/plugin.odin +++ b/src/plugin/plugin.odin @@ -3,6 +3,7 @@ package plugin; import "core:intrinsics" import "core:dynlib" import "core:fmt" +import "vendor:raylib" OnInitializeProc :: proc "c" (plugin: Plugin); OnExitProc :: proc "c" (/* probably needs some state eventually */); @@ -185,6 +186,7 @@ OnColorBufferProc :: proc "c" (plugin: Plugin, buffer: rawptr); InputGroupProc :: proc "c" (plugin: Plugin, input_map: rawptr); InputActionProc :: proc "c" (plugin: Plugin); WindowInputProc :: proc "c" (plugin: Plugin, window: rawptr); +WindowDrawProc :: proc "c" (plugin: Plugin, window: rawptr); Plugin :: struct { state: rawptr, iter: Iterator, @@ -195,7 +197,9 @@ Plugin :: struct { register_input_group: proc "c" (input_map: rawptr, key: Key, register_group: InputGroupProc), register_input: proc "c" (input_map: rawptr, key: Key, input_action: InputActionProc, description: cstring), - create_window: proc "c" (register_group: InputGroupProc) -> rawptr, + create_window: proc "c" (register_group: InputGroupProc, draw_proc: WindowDrawProc) -> rawptr, + + draw_rect: type_of(raylib.DrawRectangle), } load_proc_address :: proc(lib_path: string, library: dynlib.Library, symbol: string, $ProcType: typeid) -> ProcType diff --git a/src/ui/buffer_list_window.odin b/src/ui/buffer_list_window.odin index 346c0fb..a3c7aaa 100644 --- a/src/ui/buffer_list_window.odin +++ b/src/ui/buffer_list_window.odin @@ -51,7 +51,7 @@ create_buffer_list_window :: proc() -> ^BufferListWindow { list_window^ = BufferListWindow { window = core.Window { input_map = input_map, - draw = draw_buffer_list_window, + //draw = draw_buffer_list_window, }, }; diff --git a/src/ui/grep_window.odin b/src/ui/grep_window.odin index 3f5c016..1063ed8 100644 --- a/src/ui/grep_window.odin +++ b/src/ui/grep_window.odin @@ -160,7 +160,7 @@ create_grep_window :: proc() -> ^GrepWindow { grep_window^ = GrepWindow { window = core.Window { input_map = input_map, - draw = draw_grep_window, + //draw = draw_grep_window, get_buffer = grep_window_get_buffer, free = free_grep_window, },