odin_editor/src/panels/panels.odin

97 lines
2.9 KiB
Plaintext

package panels
import "base:runtime"
import "core:mem"
import "core:fmt"
import "core:strings"
import "core:log"
import "vendor:sdl2"
import ts "../tree_sitter"
import "../core"
import "../util"
import "../ui"
register_default_leader_actions :: proc(input_map: ^core.InputActions) {
core.register_key_action(input_map, .Q, proc(state: ^core.State, user_data: rawptr) {
core.reset_input_map(state)
}, "close this help");
core.register_key_action(input_map, .R, proc(state: ^core.State, user_data: rawptr) {
open_grep_panel(state)
}, "Grep Workspace")
}
register_default_panel_actions :: proc(input_map: ^core.InputActions) {
core.register_key_action(input_map, .H, proc(state: ^core.State, user_data: rawptr) {
if current_panel, ok := state.current_panel.?; ok {
if prev, ok := util.get_prev(&state.panels, current_panel).?; ok {
state.current_panel = prev
}
}
core.reset_input_map(state)
}, "focus panel to the left");
core.register_key_action(input_map, .L, proc(state: ^core.State, user_data: rawptr) {
if current_panel, ok := state.current_panel.?; ok {
if next, ok := util.get_next(&state.panels, current_panel).?; ok {
state.current_panel = next
}
}
core.reset_input_map(state)
}, "focus panel to the right");
core.register_key_action(input_map, .Q, proc(state: ^core.State, user_data: rawptr) {
if current_panel, ok := state.current_panel.?; ok {
close(state, current_panel)
}
}, "close panel")
}
open :: proc(state: ^core.State, panel: core.Panel, make_active: bool = true) -> (panel_id: int, ok: bool) {
if panel_id, panel, ok := util.append_static_list(&state.panels, panel); ok && make_active {
panel.id = panel_id
state.current_panel = panel_id
arena_bytes, err := make([]u8, 1024*1024*8)
if err != nil {
log.errorf("failed to allocate memory for panel: '%v'", err)
util.delete(&state.panels, panel_id)
return
}
mem.arena_init(&panel.arena, arena_bytes)
panel.allocator = mem.arena_allocator(&panel.arena)
panel->create(state)
core.reset_input_map(state)
return panel_id, true
}
return -1, false
}
close :: proc(state: ^core.State, panel_id: int) {
if panel, ok := util.get(&state.panels, panel_id).?; ok {
if panel.drop != nil {
panel->drop(state)
}
mem.free(raw_data(panel.arena.data))
util.delete(&state.panels, panel_id)
// TODO: keep track of the last active panel instead of focusing back to the first one
if first_active, ok := util.get_first_active_index(&state.panels).?; ok {
state.current_panel = first_active
}
core.reset_input_map(state)
}
}