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); }; 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 // @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() { T pop() {
Assert(len > 0); Assert(len > 0);
return data[--len]; return data[--len];
@@ -531,6 +523,13 @@ struct Array {
// @copy_paste array 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 get_or_default(int64_t i, T default_value = {}) {
T result = default_value; T result = default_value;
if (i >= 0 && i < len) { if (i >= 0 && i < len) {

View File

@@ -250,16 +250,17 @@ void BeforeEdit(Window *window) {
Scratch scratch; Scratch scratch;
// Merge cursors that overlap, this needs to be handled before any edits to // Merge cursors that overlap, this needs to be handled before any edits to
// make sure overlapping edits won't happen. // 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}; Array<Cursor *> deleted_cursors = {scratch};
ForItem(cursor, window->cursors) { 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) { 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 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; 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); deleted_cursors.add(&it);
cursor.range.max = Max(cursor.range.max, it.range.max); cursor.range.max = Max(cursor.range.max, it.range.max);
cursor.range.min = Min(cursor.range.min, it.range.min); cursor.range.min = Min(cursor.range.min, it.range.min);
@@ -269,7 +270,14 @@ void BeforeEdit(Window *window) {
end_of_cursor_loop:; 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) { void AfterEdit(Window *window, Array<Edit> edits) {

View File

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