FindInBuffer, improve find

This commit is contained in:
Krzosa Karol
2024-07-25 13:50:04 +02:00
parent 2d60e795c0
commit 469cf3dd24
3 changed files with 43 additions and 48 deletions

View File

@@ -1,3 +1,4 @@
// mouse_selection_anchor is special case for mouse handling !
void MergeCarets(Buffer &buffer, Array<Caret> *_carets, Range *mouse_selection_anchor = NULL) { void MergeCarets(Buffer &buffer, Array<Caret> *_carets, Range *mouse_selection_anchor = NULL) {
ProfileFunction(); ProfileFunction();
Array<Caret> &carets = *_carets; Array<Caret> &carets = *_carets;

View File

@@ -217,6 +217,30 @@ void ReloadFont(Int font_size) {
FontCharSpacing = GetCharSpacing(MainFont, FontSize, FontSpacing); FontCharSpacing = GetCharSpacing(MainFont, FontSize, FontSpacing);
} }
Caret FindInBuffer(Buffer *buffer, String16 needle, Caret caret, bool find_next = false) {
Int pos = caret.range.min;
String16 medium = GetString(*buffer, {pos, INT64_MAX});
Caret result = {};
Int index = 0;
if (Seek(medium, needle, &index)) {
result = MakeCaret(pos + index + needle.len, pos + index);
} else {
medium = GetString(*buffer);
if (Seek(medium, needle, &index)) {
result = MakeCaret(index + needle.len, index);
}
}
if (find_next && AreEqual(result, caret)) {
caret.range.min = Clamp(*buffer, caret.range.min + 1);
caret.range.max = Clamp(*buffer, caret.range.max + 1);
result = FindInBuffer(buffer, needle, caret, false);
}
return result;
}
void HandleGlobalCommands() { void HandleGlobalCommands() {
if (CtrlPress(KEY_P)) { if (CtrlPress(KEY_P)) {
Window *command_window = GetWindow(CommandWindowID); Window *command_window = GetWindow(CommandWindowID);

View File

@@ -264,18 +264,10 @@ void HandleActiveWindowBindings(Window *window, bool *update_scroll) {
} }
if (CtrlPress(KEY_D)) { if (CtrlPress(KEY_D)) {
Range range = view.carets[0].range; String16 string = GetString(*buffer, view.carets[0].range);
String16 string = GetString(*buffer, range); Caret caret = FindInBuffer(buffer, string, view.carets[0], true);
String16 string_buffer = GetString(*buffer, {range.max, INT64_MAX}); Insert(&view.carets, caret, 0);
Int index = 0; MergeCarets(*buffer, &view.carets);
if (Seek(string_buffer, string, &index)) {
Insert(&view.carets, MakeCaret(range.max + index, range.max + index + string.len), 0);
} else {
String16 string_buffer = GetString(*buffer);
if (Seek(string_buffer, string, &index)) {
Insert(&view.carets, MakeCaret(index, index + string.len), 0);
}
}
} }
if (CtrlShiftPress(KEY_Z)) { if (CtrlShiftPress(KEY_Z)) {
@@ -357,44 +349,22 @@ void HandleActiveWindowBindings(Window *window, bool *update_scroll) {
if (Press(KEY_F3)) { if (Press(KEY_F3)) {
Buffer *search_buffer = GetBuffer("*search*"); Buffer *search_buffer = GetBuffer("*search*");
String16 search_string = GetString(*search_buffer); String16 search_string = GetString(*search_buffer);
view.carets[0] = FindInBuffer(buffer, search_string, view.carets[0], true);
view.carets.len = 1;
}
Caret caret = view.carets[0]; if (window->id.id == SearchWindowID.id) {
Int pos = caret.range.min + 1; Window *seek_window = GetWindow(GetLastActiveWindow());
View *seek_view = GetView(seek_window->active_view);
String16 medium = GetString(*buffer, {pos, INT64_MAX}); Buffer *seek_buffer = GetBuffer(seek_view->buffer_id);
Int index = 0; String16 needle = GetString(*buffer);
if (Seek(medium, search_string, &index)) { if (search) {
view.carets[0] = MakeCaret(pos + index + search_string.len, pos + index); seek_view->carets[0] = FindInBuffer(seek_buffer, needle, seek_view->carets[0]);
} else { seek_view->carets.len = 1;
medium = GetString(*buffer);
if (Seek(medium, search_string, &index)) {
view.carets[0] = MakeCaret(index + search_string.len, index);
}
} }
} if (Press(KEY_ENTER)) {
seek_view->carets[0] = FindInBuffer(seek_buffer, needle, seek_view->carets[0], true);
if (Press(KEY_ENTER)) { seek_view->carets.len = 1;
search = true;
}
if (window->id.id == SearchWindowID.id && search) {
Window *seek_window = GetWindow(GetLastActiveWindow());
View *seek_view = GetView(seek_window->active_view);
Buffer *seek_buffer = GetBuffer(seek_view->buffer_id);
Caret caret = seek_view->carets[0];
Int pos = caret.range.min;
// @todo: copy paste
String16 needle = GetString(*buffer);
String16 medium = GetString(*seek_buffer, {pos, INT64_MAX});
Int index = 0;
if (Seek(medium, needle, &index)) {
seek_view->carets[0] = MakeCaret(pos + index + needle.len, pos + index);
} else {
medium = GetString(*seek_buffer);
if (Seek(medium, needle, &index)) {
seek_view->carets[0] = MakeCaret(index + needle.len, index);
}
} }
} }