replace buffer in panel
parent
f6a3f99c45
commit
ba312efe1a
|
@ -148,18 +148,42 @@ new_buffer_virtual :: proc(state: ^State) -> (id: int, buffer: ^FileBuffer, ok:
|
||||||
return util.append(&state.buffers, new_virtual_file_buffer(context.allocator))
|
return util.append(&state.buffers, new_virtual_file_buffer(context.allocator))
|
||||||
}
|
}
|
||||||
|
|
||||||
new_buffer_file :: proc(state: ^State, file_path: string) -> (id: int, buffer: ^FileBuffer, ok: bool) {
|
new_buffer_file :: proc(state: ^State, file_path: string, line: int = 0, col: int = 0) -> (id: int, buffer: ^FileBuffer, ok: bool) {
|
||||||
new_buffer, err := new_file_buffer(context.allocator, file_path, state.directory)
|
new_buffer, err := make_file_buffer(context.allocator, file_path, state.directory)
|
||||||
if err.type != .None {
|
if err.type != .None {
|
||||||
ok = false
|
ok = false
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
move_cursor_to_location(&new_buffer, line, col)
|
||||||
|
|
||||||
return util.append(&state.buffers, new_buffer)
|
return util.append(&state.buffers, new_buffer)
|
||||||
}
|
}
|
||||||
|
|
||||||
new_buffer :: proc{new_buffer_file, new_buffer_virtual}
|
new_buffer :: proc{new_buffer_file, new_buffer_virtual}
|
||||||
|
|
||||||
|
open_buffer_file :: proc(state: ^State, file_path: string, line: int = 0, col: int = 0) {
|
||||||
|
next_id := 0
|
||||||
|
for {
|
||||||
|
if panel, ok := util.get(&state.panels, next_id).?; ok {
|
||||||
|
if type, ok := &panel.type.(FileBufferPanel); ok {
|
||||||
|
buffer_id, _, ok := new_buffer_file(state, file_path, line, col)
|
||||||
|
if ok {
|
||||||
|
type.buffer_id = buffer_id
|
||||||
|
state.current_panel = panel.id
|
||||||
|
}
|
||||||
|
|
||||||
|
break
|
||||||
|
} else {
|
||||||
|
next_id := util.get_next(&state.panels, next_id)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
get_buffer :: proc(state: ^State, buffer_id: int) -> Maybe(^FileBuffer) {
|
get_buffer :: proc(state: ^State, buffer_id: int) -> Maybe(^FileBuffer) {
|
||||||
return util.get(&state.buffers, buffer_id)
|
return util.get(&state.buffers, buffer_id)
|
||||||
}
|
}
|
||||||
|
|
|
@ -752,7 +752,7 @@ new_virtual_file_buffer :: proc(allocator := context.allocator) -> FileBuffer {
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
new_file_buffer :: proc(allocator: mem.Allocator, file_path: string, base_dir: string = "") -> (FileBuffer, Error) {
|
make_file_buffer :: proc(allocator: mem.Allocator, file_path: string, base_dir: string = "") -> (FileBuffer, Error) {
|
||||||
context.allocator = allocator;
|
context.allocator = allocator;
|
||||||
|
|
||||||
fmt.eprintln("attempting to open", file_path);
|
fmt.eprintln("attempting to open", file_path);
|
||||||
|
@ -996,7 +996,7 @@ update_file_buffer_scroll :: proc(buffer: ^FileBuffer, cursor: Maybe(^Cursor) =
|
||||||
cursor = &buffer.history.cursor;
|
cursor = &buffer.history.cursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
if buffer.glyphs.height < 5 {
|
if buffer.glyphs.height <= 5 {
|
||||||
buffer.top_line = cursor.?.line
|
buffer.top_line = cursor.?.line
|
||||||
} else if cursor.?.line > (buffer.top_line + buffer.glyphs.height - 5) {
|
} else if cursor.?.line > (buffer.top_line + buffer.glyphs.height - 5) {
|
||||||
buffer.top_line = math.max(cursor.?.line - buffer.glyphs.height + 5, 0);
|
buffer.top_line = math.max(cursor.?.line - buffer.glyphs.height + 5, 0);
|
||||||
|
|
|
@ -65,11 +65,7 @@ make_file_buffer_panel :: proc(file_path: string, line: int = 0, col: int = 0) -
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if buffer_id, buffer, ok := core.new_buffer(state, panel_state.file_path); ok {
|
if buffer_id, buffer, ok := core.new_buffer(state, panel_state.file_path); ok {
|
||||||
buffer.history.cursor.line = panel_state.line
|
core.move_cursor_to_location(buffer, panel_state.line, panel_state.col)
|
||||||
buffer.history.cursor.col = panel_state.col
|
|
||||||
buffer.top_line = buffer.history.cursor.line
|
|
||||||
core.update_file_buffer_index_from_cursor(buffer)
|
|
||||||
|
|
||||||
panel_state.buffer_id = buffer_id
|
panel_state.buffer_id = buffer_id
|
||||||
} else {
|
} else {
|
||||||
log.error("failed to create buffer")
|
log.error("failed to create buffer")
|
||||||
|
|
|
@ -87,13 +87,8 @@ make_grep_panel :: proc() -> core.Panel {
|
||||||
if panel_state.query_results != nil {
|
if panel_state.query_results != nil {
|
||||||
selected_result := &panel_state.query_results[panel_state.selected_result]
|
selected_result := &panel_state.query_results[panel_state.selected_result]
|
||||||
|
|
||||||
if panel_id, ok := open(state, make_file_buffer_panel(selected_result.file_path, selected_result.line, selected_result.col)); ok {
|
core.open_buffer_file(state, selected_result.file_path, selected_result.line, selected_result.col)
|
||||||
close(state, this_panel.id)
|
close(state, this_panel.id)
|
||||||
|
|
||||||
state.current_panel = panel_id
|
|
||||||
} else {
|
|
||||||
log.error("failed to open file buffer in new panel")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, "Open File");
|
}, "Open File");
|
||||||
|
|
|
@ -298,7 +298,7 @@ extern "C" fn grep_buffer(
|
||||||
#[unsafe(no_mangle)]
|
#[unsafe(no_mangle)]
|
||||||
extern "C" fn free_grep_results(results: GrepResults) {
|
extern "C" fn free_grep_results(results: GrepResults) {
|
||||||
unsafe {
|
unsafe {
|
||||||
let mut array = std::slice::from_raw_parts_mut(
|
let array = std::slice::from_raw_parts_mut(
|
||||||
results.results as *mut GrepResult,
|
results.results as *mut GrepResult,
|
||||||
results.len as usize,
|
results.len as usize,
|
||||||
);
|
);
|
||||||
|
|
Loading…
Reference in New Issue