Hopefully fixed BeforeEdit, needs a refactor though

This commit is contained in:
Krzosa Karol
2024-06-29 10:49:07 +02:00
parent 7e68e09b22
commit c8ad9222fd
3 changed files with 50 additions and 31 deletions

View File

@@ -199,29 +199,6 @@ For(arr.reverse_iter()) {
defer{ arr.unordered_remove(it); };
}
//
// When double looping and deleting
//
Array<Cursor *> deleted_cursors = {scratch};
ForItem(cursor, window->cursors) {
For(deleted_cursors) if (it == &cursor) goto end_of_cursor_loop;
For(window->cursors) {
if (&it == &cursor) break;
bool a = cursor.range.max >= it.range.min && cursor.range.max <= it.range.max;
bool b = cursor.range.min >= it.range.min && cursor.range.min <= it.range.max;
if (a || b) {
deleted_cursors.add(&it);
cursor.range.max = Max(cursor.range.max, it.range.max);
cursor.range.min = Min(cursor.range.min, it.range.min);
break;
}
}
end_of_cursor_loop:;
}
For(deleted_cursors) window->cursors.ordered_remove(*it);
*/
@@ -258,6 +235,21 @@ struct Slice {
// @copy_paste array slice
bool contains(T item) {
for (int64_t i = 0; i < len; i += 1) {
if (data[i] == item) return true;
}
return false;
}
T get_or_default(int64_t i, T default_value = {}) {
T result = default_value;
if (i >= 0 && i < len) {
result = data[i];
}
return result;
}
T pop() {
Assert(len > 0);
return data[--len];
@@ -531,6 +523,13 @@ struct Array {
// @copy_paste array slice
bool contains(T item) {
for (int64_t i = 0; i < len; i += 1) {
if (data[i] == item) return true;
}
return false;
}
T get_or_default(int64_t i, T default_value = {}) {
T result = default_value;
if (i >= 0 && i < len) {

View File

@@ -250,16 +250,17 @@ void BeforeEdit(Window *window) {
Scratch scratch;
// Merge cursors that overlap, this needs to be handled before any edits to
// make sure overlapping edits won't happen.
// @optimize: could probably reverse the inner loop and simply unordered remove
// @optimize @refactor: this is retarded, I hit so many array removal bugs here, without allocation please
Array<Cursor *> deleted_cursors = {scratch};
ForItem(cursor, window->cursors) {
For(deleted_cursors) if (it == &cursor) goto end_of_cursor_loop;
if (deleted_cursors.contains(&cursor)) goto end_of_cursor_loop;
For(window->cursors) {
if (&it == &cursor) break;
if (&it == &cursor) continue;
bool a = cursor.range.max >= it.range.min && cursor.range.max <= it.range.max;
bool b = cursor.range.min >= it.range.min && cursor.range.min <= it.range.max;
if (a || b) {
if ((a || b) && !deleted_cursors.contains(&it)) {
deleted_cursors.add(&it);
cursor.range.max = Max(cursor.range.max, it.range.max);
cursor.range.min = Min(cursor.range.min, it.range.min);
@@ -269,7 +270,14 @@ void BeforeEdit(Window *window) {
end_of_cursor_loop:;
}
For(deleted_cursors) window->cursors.ordered_remove(*it);
Array<Cursor> new_cursors = {window->cursors.allocator};
For(window->cursors) {
if (deleted_cursors.contains(&it) == false) {
new_cursors.add(it);
}
}
window->cursors.dealloc();
window->cursors = new_cursors;
}
void AfterEdit(Window *window, Array<Edit> edits) {

View File

@@ -5,6 +5,7 @@
// @todo: add history (undo, redo)
// @todo: add clipboard history?
// @todo: mouse double click
#include "rect2.cpp"
#include "buffer.cpp"
#include "layout.cpp"
@@ -75,6 +76,7 @@ int main() {
}
}
window.cursors.allocator = GetSystemAllocator();
window.cursors.add({});
AfterEdit(&window, {});
@@ -164,9 +166,8 @@ int main() {
front = MoveDown(focused_window->buffer, front);
cursors_to_add.add({front, front});
}
For(cursors_to_add) {
focused_window->cursors.add(it);
}
For(cursors_to_add) focused_window->cursors.add(it);
BeforeEdit(focused_window); // Merge cursors
} else if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyDown(KEY_LEFT_ALT)) { // Default in VSCode seems to be Shift + Alt + down
BeforeEdit(focused_window);
Array<Edit> edits = {FrameArena};
@@ -203,6 +204,7 @@ int main() {
cursors_to_add.add({front, front});
}
For(cursors_to_add) focused_window->cursors.add(it);
BeforeEdit(focused_window); // Merge cursors
} else if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyDown(KEY_LEFT_ALT)) { // Default in VSCode seems to be Shift + Alt + up
BeforeEdit(focused_window);
Array<Edit> edits = {FrameArena};
@@ -238,6 +240,7 @@ int main() {
if (Seek(to_seek, needle, &found_index, SeekFlag_IgnoreCase)) {
found_index += cursor.range.max;
focused_window->cursors.add(MakeCursor(found_index + needle.len, found_index));
BeforeEdit(focused_window); // Merge cursors
}
}
@@ -359,6 +362,14 @@ int main() {
AfterEdit(focused_window, edits);
}
if (IsKeyPressed(KEY_TAB) || IsKeyPressedRepeat(KEY_TAB)) {
BeforeEdit(focused_window);
Array<Edit> edits = {FrameArena};
For(focused_window->cursors) AddEdit(&edits, it.range, " ");
ApplyEdits(&focused_window->buffer, edits);
AfterEdit(focused_window, edits);
}
if (IsKeyPressed(KEY_ENTER) || IsKeyPressedRepeat(KEY_ENTER)) {
if (IsKeyDown(KEY_LEFT_CONTROL)) {
For(focused_window->cursors) {
@@ -446,6 +457,7 @@ int main() {
window.cursors.clear();
}
window.cursors.add({col->pos, col->pos});
BeforeEdit(&window); // Merge cursors
window.mouse_selecting = true;
}