fix menu bar spacing, add temporary buffers list

plugins
Patrick Cleavelin 2023-12-29 15:54:46 -06:00
parent 96112c6019
commit 845ed4beab
3 changed files with 49 additions and 64 deletions

View File

@ -8,4 +8,6 @@ Mode :: enum {
State :: struct { State :: struct {
mode: Mode, mode: Mode,
should_close: bool, should_close: bool,
buffers: [dynamic]FileBuffer,
current_buffer: int,
} }

View File

@ -77,76 +77,59 @@ do_insert_mode :: proc(state: ^State, buffer: ^FileBuffer) {
} }
} }
switch_to_buffer :: proc(state: ^State, item: ^ui.MenuBarItem) {
for buffer, index in state.buffers {
if strings.compare(buffer.file_path, item.text) == 0 {
state.current_buffer = index;
break;
}
}
}
main :: proc() { main :: proc() {
state: State;
for arg in os.args[1:] {
buffer, err := core.new_file_buffer(context.allocator, arg);
if err.type != .None {
fmt.println("Failed to create file buffer:", err);
continue;
}
runtime.append(&state.buffers, buffer);
}
buffer_items := make([dynamic]ui.MenuBarItem, 0, len(state.buffers));
for buffer, index in state.buffers {
item := ui.MenuBarItem {
text = buffer.file_path,
on_click = switch_to_buffer,
};
runtime.append(&buffer_items, item);
}
raylib.InitWindow(640, 480, "odin_editor - [back to basics]"); raylib.InitWindow(640, 480, "odin_editor - [back to basics]");
raylib.SetWindowState({ .WINDOW_RESIZABLE, .VSYNC_HINT }); raylib.SetWindowState({ .WINDOW_RESIZABLE, .VSYNC_HINT });
raylib.SetTargetFPS(60); raylib.SetTargetFPS(60);
raylib.SetExitKey(.KEY_NULL); raylib.SetExitKey(.KEY_NULL);
font := raylib.LoadFont("../c_editor/Mx437_ToshibaSat_8x16.ttf"); font := raylib.LoadFont("../c_editor/Mx437_ToshibaSat_8x16.ttf");
state: State; menu_bar_state := ui.MenuBarState{
buffer, err := core.new_file_buffer(context.allocator, os.args[1]);
if err.type != .None {
fmt.println("Failed to create file buffer:", err);
os.exit(1);
}
menu_bar_data := ui.MenuBarState {
items = []ui.MenuBarItem { items = []ui.MenuBarItem {
ui.MenuBarItem { ui.MenuBarItem {
text = "File", text = "Buffers",
sub_items = []ui.MenuBarItem { sub_items = buffer_items[:],
ui.MenuBarItem {
text = "Open..."
},
ui.MenuBarItem {
text = "Recents",
sub_items = []ui.MenuBarItem {
ui.MenuBarItem {
text = "Editor Project",
sub_items = []ui.MenuBarItem {
ui.MenuBarItem {
text = "ui.odin"
},
ui.MenuBarItem {
text = "theme.odin"
} }
},
},
ui.MenuBarItem {
text = "proposals.rs"
},
ui.MenuBarItem {
text = "database.rs"
} }
},
},
ui.MenuBarItem {
text = "Quit",
on_click = proc(state: ^State) { state.should_close = true; },
}
},
on_click = nil
},
ui.MenuBarItem {
text = "Help",
sub_items = []ui.MenuBarItem {
ui.MenuBarItem {
text = "Docs"
},
ui.MenuBarItem {
text = "About"
}
},
on_click = nil
},
},
}; };
for !raylib.WindowShouldClose() && !state.should_close { for !raylib.WindowShouldClose() && !state.should_close {
screen_width := raylib.GetScreenWidth(); screen_width := raylib.GetScreenWidth();
screen_height := raylib.GetScreenHeight(); screen_height := raylib.GetScreenHeight();
mouse_pos := raylib.GetMousePosition(); mouse_pos := raylib.GetMousePosition();
buffer := &state.buffers[state.current_buffer];
buffer.glyph_buffer_height = math.min(256, int((screen_height - 32 - core.source_font_height) / core.source_font_height)); buffer.glyph_buffer_height = math.min(256, int((screen_height - 32 - core.source_font_height) / core.source_font_height));
{ {
@ -154,8 +137,8 @@ main :: proc() {
defer raylib.EndDrawing(); defer raylib.EndDrawing();
raylib.ClearBackground(theme.get_palette_raylib_color(.Background)); raylib.ClearBackground(theme.get_palette_raylib_color(.Background));
core.draw_file_buffer(&state, &buffer, 32, core.source_font_height, font); core.draw_file_buffer(&state, buffer, 32, core.source_font_height, font);
ui.draw_menu_bar(&menu_bar_data, 0, 0, screen_width, screen_height, font, core.source_font_height); ui.draw_menu_bar(&menu_bar_state, 0, 0, screen_width, screen_height, font, core.source_font_height);
raylib.DrawRectangle(0, screen_height - core.source_font_height, screen_width, core.source_font_height, theme.get_palette_raylib_color(.Background2)); raylib.DrawRectangle(0, screen_height - core.source_font_height, screen_width, core.source_font_height, theme.get_palette_raylib_color(.Background2));
@ -181,11 +164,11 @@ main :: proc() {
switch state.mode { switch state.mode {
case .Normal: case .Normal:
do_normal_mode(&state, &buffer); do_normal_mode(&state, buffer);
case .Insert: case .Insert:
do_insert_mode(&state, &buffer); do_insert_mode(&state, buffer);
} }
ui.test_menu_bar(&state, &menu_bar_data, 0,0, mouse_pos, raylib.IsMouseButtonReleased(.LEFT), font, core.source_font_height); ui.test_menu_bar(&state, &menu_bar_state, 0,0, mouse_pos, raylib.IsMouseButtonReleased(.LEFT), font, core.source_font_height);
} }
} }

View File

@ -6,7 +6,7 @@ import "vendor:raylib"
import "../core" import "../core"
import "../theme" import "../theme"
MenuBarItemOnClick :: proc(state: ^core.State); MenuBarItemOnClick :: proc(state: ^core.State, item: ^MenuBarItem);
text_padding :: 4; text_padding :: 4;
@ -75,7 +75,7 @@ draw_menu_bar :: proc(data: ^MenuBarState, x, y: i32, parent_width, parent_heigh
item_text := raylib.TextFormat("%s", item.text); item_text := raylib.TextFormat("%s", item.text);
item_width := raylib.MeasureTextEx(font, item_text, f32(font_height), 0).x; item_width := raylib.MeasureTextEx(font, item_text, f32(font_height), 0).x;
item_x := x + (i32(item_width) + text_padding*2) * i32(index*8); item_x := x + (i32(item_width) + text_padding*2) * i32(index);
draw_menu_bar_item(item, item_x, y, i32(item_width + text_padding*2), i32(font_height), font, font_height); draw_menu_bar_item(item, item_x, y, i32(item_width + text_padding*2), i32(font_height), font, font_height);
} }
} }
@ -85,7 +85,7 @@ test_menu_item :: proc(state: ^core.State, item: ^MenuBarItem, rect: raylib.Rect
item.selected = true; item.selected = true;
if item.on_click != nil && mouse_has_clicked { if item.on_click != nil && mouse_has_clicked {
item.on_click(state); item.on_click(state, item);
} }
} else if item.selected { } else if item.selected {
largest_sub_item: int largest_sub_item: int
@ -138,7 +138,7 @@ test_menu_bar :: proc(state: ^core.State, menu_bar: ^MenuBarState, x, y: i32, mo
item_width := raylib.MeasureTextEx(font, item_text, f32(font_height), 0).x; item_width := raylib.MeasureTextEx(font, item_text, f32(font_height), 0).x;
item_rec := raylib.Rectangle { item_rec := raylib.Rectangle {
x = f32(x) + (item_width + f32(text_padding*2)) * f32(index*8), x = f32(x) + (item_width + f32(text_padding*2)) * f32(index),
y = f32(y), y = f32(y),
width = f32(item_width + text_padding*2), width = f32(item_width + text_padding*2),
height = f32(font_height), height = f32(font_height),