implemented most of selection backspace
This commit is contained in:
@@ -20,7 +20,9 @@
|
|||||||
],
|
],
|
||||||
"folders": [
|
"folders": [
|
||||||
{
|
{
|
||||||
"path": "."
|
"path": ".",
|
||||||
}
|
"folder_exclude_patterns": ["*bin*"],
|
||||||
|
"binary_file_patterns": ["*.bin"]
|
||||||
|
},
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,6 +45,11 @@ Selection :: struct {
|
|||||||
end: Position,
|
end: Position,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Range :: struct {
|
||||||
|
start: int,
|
||||||
|
end: int,
|
||||||
|
}
|
||||||
|
|
||||||
window_width := 800
|
window_width := 800
|
||||||
window_height := 600
|
window_height := 600
|
||||||
font_size: f32 = 20.0
|
font_size: f32 = 20.0
|
||||||
@@ -81,13 +86,22 @@ main :: proc() {
|
|||||||
for c := r.GetCharPressed(); c != rune(0); c = r.GetCharPressed() {
|
for c := r.GetCharPressed(); c != rune(0); c = r.GetCharPressed() {
|
||||||
chars, _ := utf8.encode_rune(c)
|
chars, _ := utf8.encode_rune(c)
|
||||||
char := chars[0]
|
char := chars[0]
|
||||||
|
// TODO: selection
|
||||||
|
if selection.active {
|
||||||
|
|
||||||
|
} else {
|
||||||
inject_at(&lines[cursor.line], cursor.char, char)
|
inject_at(&lines[cursor.line], cursor.char, char)
|
||||||
cursor.char += 1
|
cursor.char += 1
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
move_cursor()
|
move_cursor()
|
||||||
|
|
||||||
if repeatable_key_pressed(.ENTER) {
|
if repeatable_key_pressed(.ENTER) {
|
||||||
|
// TODO: selection
|
||||||
|
if selection.active {
|
||||||
|
|
||||||
|
} else {
|
||||||
new_line_cap := len(current_line()) - cursor.char
|
new_line_cap := len(current_line()) - cursor.char
|
||||||
bs := make([dynamic]u8, 0, len(current_line()) == 0 ? 1 : new_line_cap * 2)
|
bs := make([dynamic]u8, 0, len(current_line()) == 0 ? 1 : new_line_cap * 2)
|
||||||
if cursor.char < len(current_line()) {
|
if cursor.char < len(current_line()) {
|
||||||
@@ -100,6 +114,7 @@ main :: proc() {
|
|||||||
cursor.line += 1
|
cursor.line += 1
|
||||||
cursor.char = 0
|
cursor.char = 0
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if r.IsKeyDown(.LEFT_SUPER) && r.IsKeyPressed(.S) {
|
if r.IsKeyDown(.LEFT_SUPER) && r.IsKeyPressed(.S) {
|
||||||
builder := strings.builder_make()
|
builder := strings.builder_make()
|
||||||
@@ -114,6 +129,34 @@ main :: proc() {
|
|||||||
|
|
||||||
skip_backspace: if repeatable_key_pressed(.BACKSPACE) {
|
skip_backspace: if repeatable_key_pressed(.BACKSPACE) {
|
||||||
if cursor.line == 0 && cursor.char == 0 do break skip_backspace
|
if cursor.line == 0 && cursor.char == 0 do break skip_backspace
|
||||||
|
// TODO: selection
|
||||||
|
if selection.active {
|
||||||
|
earliest := selection_earliest()
|
||||||
|
latest := selection_latest()
|
||||||
|
earliest_line := &lines[earliest.line]
|
||||||
|
earliest_selection := get_selection_for_line(earliest_line[:], earliest.line)
|
||||||
|
remove_range(earliest_line, earliest_selection.start, earliest_selection.end)
|
||||||
|
if latest.line != earliest.line {
|
||||||
|
latest_line := &lines[latest.line]
|
||||||
|
latest_selection := get_selection_for_line(latest_line[:], latest.line)
|
||||||
|
append(earliest_line, string(latest_line[latest_selection.end:len(latest_line)]))
|
||||||
|
defer delete(latest_line^)
|
||||||
|
ordered_remove(&lines, latest.line)
|
||||||
|
cursor.line -= 1
|
||||||
|
for i := earliest.line + 1; i < latest.line; i += 1 {
|
||||||
|
line_to_remove := lines[i]
|
||||||
|
defer delete(line_to_remove)
|
||||||
|
ordered_remove(&lines, i)
|
||||||
|
// NOTE(grant): Should we do this here?
|
||||||
|
if i < cursor.line {
|
||||||
|
cursor.line -= 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
cursor.char -= earliest_selection.end - earliest_selection.start
|
||||||
|
}
|
||||||
|
selection.active = false
|
||||||
|
} else {
|
||||||
if cursor.char == 0 {
|
if cursor.char == 0 {
|
||||||
// join lines
|
// join lines
|
||||||
old_len := len(lines[cursor.line - 1])
|
old_len := len(lines[cursor.line - 1])
|
||||||
@@ -141,6 +184,7 @@ main :: proc() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
cursor_padding := 3
|
cursor_padding := 3
|
||||||
// move viewport up
|
// move viewport up
|
||||||
@@ -257,24 +301,10 @@ render_line_with_selection :: proc(line: []u8, line_index: int, font: r.Font) {
|
|||||||
earliest := selection_earliest()
|
earliest := selection_earliest()
|
||||||
latest := selection_latest()
|
latest := selection_latest()
|
||||||
|
|
||||||
selection_begin: int
|
selection_range := get_selection_for_line(line, line_index)
|
||||||
selection_end: int
|
|
||||||
if line_index == earliest.line && line_index == latest.line {
|
|
||||||
selection_begin = min(selection.start.char, selection.end.char)
|
|
||||||
selection_end = max(selection.start.char, selection.end.char)
|
|
||||||
} else if line_index == earliest.line {
|
|
||||||
selection_begin = earliest.char
|
|
||||||
selection_end = len(line)
|
|
||||||
} else if line_index == latest.line {
|
|
||||||
selection_begin = 0
|
|
||||||
selection_end = latest.char
|
|
||||||
} else if earliest.line < line_index && line_index < latest.line {
|
|
||||||
selection_begin = 0
|
|
||||||
selection_end = len(line)
|
|
||||||
}
|
|
||||||
|
|
||||||
prefix := line[:selection_begin]
|
prefix := line[:selection_range.start]
|
||||||
suffix := line[selection_end:] if selection_end < len(line) else []u8{}
|
suffix := line[selection_range.end:] if selection_range.end < len(line) else []u8{}
|
||||||
// need to copy these into separate buffers for zero value
|
// need to copy these into separate buffers for zero value
|
||||||
x: f32 = 0.0
|
x: f32 = 0.0
|
||||||
if len(prefix) != 0 {
|
if len(prefix) != 0 {
|
||||||
@@ -286,10 +316,10 @@ render_line_with_selection :: proc(line: []u8, line_index: int, font: r.Font) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
selected_str: string
|
selected_str: string
|
||||||
if selection_end < len(line) {
|
if selection_range.end < len(line) {
|
||||||
selected_str = string(line[selection_begin:selection_end])
|
selected_str = string(line[selection_range.start:selection_range.end])
|
||||||
} else {
|
} else {
|
||||||
selected_str = string(line[selection_begin:])
|
selected_str = string(line[selection_range.start:])
|
||||||
}
|
}
|
||||||
cstr :=
|
cstr :=
|
||||||
strings.clone_to_cstring(selected_str, context.temp_allocator) if len(suffix) != 0 else strings.unsafe_string_to_cstring(selected_str)
|
strings.clone_to_cstring(selected_str, context.temp_allocator) if len(suffix) != 0 else strings.unsafe_string_to_cstring(selected_str)
|
||||||
@@ -436,3 +466,24 @@ selection_latest :: proc() -> Position {
|
|||||||
|
|
||||||
return latest
|
return latest
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get_selection_for_line :: proc(line: []u8, line_index: int) -> Range {
|
||||||
|
earliest := selection_earliest()
|
||||||
|
latest := selection_latest()
|
||||||
|
selection_begin: int
|
||||||
|
selection_end: int
|
||||||
|
if line_index == earliest.line && line_index == latest.line {
|
||||||
|
selection_begin = min(selection.start.char, selection.end.char)
|
||||||
|
selection_end = max(selection.start.char, selection.end.char)
|
||||||
|
} else if line_index == earliest.line {
|
||||||
|
selection_begin = earliest.char
|
||||||
|
selection_end = len(line)
|
||||||
|
} else if line_index == latest.line {
|
||||||
|
selection_begin = 0
|
||||||
|
selection_end = latest.char
|
||||||
|
} else if earliest.line < line_index && line_index < latest.line {
|
||||||
|
selection_begin = 0
|
||||||
|
selection_end = len(line)
|
||||||
|
}
|
||||||
|
return Range{start = selection_begin, end = selection_end}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user