FindInBuffer, improve find
This commit is contained in:
@@ -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) {
|
||||
ProfileFunction();
|
||||
Array<Caret> &carets = *_carets;
|
||||
|
||||
@@ -217,6 +217,30 @@ void ReloadFont(Int font_size) {
|
||||
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() {
|
||||
if (CtrlPress(KEY_P)) {
|
||||
Window *command_window = GetWindow(CommandWindowID);
|
||||
|
||||
@@ -264,18 +264,10 @@ void HandleActiveWindowBindings(Window *window, bool *update_scroll) {
|
||||
}
|
||||
|
||||
if (CtrlPress(KEY_D)) {
|
||||
Range range = view.carets[0].range;
|
||||
String16 string = GetString(*buffer, range);
|
||||
String16 string_buffer = GetString(*buffer, {range.max, INT64_MAX});
|
||||
Int index = 0;
|
||||
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);
|
||||
}
|
||||
}
|
||||
String16 string = GetString(*buffer, view.carets[0].range);
|
||||
Caret caret = FindInBuffer(buffer, string, view.carets[0], true);
|
||||
Insert(&view.carets, caret, 0);
|
||||
MergeCarets(*buffer, &view.carets);
|
||||
}
|
||||
|
||||
if (CtrlShiftPress(KEY_Z)) {
|
||||
@@ -357,44 +349,22 @@ void HandleActiveWindowBindings(Window *window, bool *update_scroll) {
|
||||
if (Press(KEY_F3)) {
|
||||
Buffer *search_buffer = GetBuffer("*search*");
|
||||
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];
|
||||
Int pos = caret.range.min + 1;
|
||||
|
||||
String16 medium = GetString(*buffer, {pos, INT64_MAX});
|
||||
Int index = 0;
|
||||
if (Seek(medium, search_string, &index)) {
|
||||
view.carets[0] = MakeCaret(pos + index + search_string.len, pos + index);
|
||||
} else {
|
||||
medium = GetString(*buffer);
|
||||
if (Seek(medium, search_string, &index)) {
|
||||
view.carets[0] = MakeCaret(index + search_string.len, index);
|
||||
}
|
||||
if (window->id.id == SearchWindowID.id) {
|
||||
Window *seek_window = GetWindow(GetLastActiveWindow());
|
||||
View *seek_view = GetView(seek_window->active_view);
|
||||
Buffer *seek_buffer = GetBuffer(seek_view->buffer_id);
|
||||
String16 needle = GetString(*buffer);
|
||||
if (search) {
|
||||
seek_view->carets[0] = FindInBuffer(seek_buffer, needle, seek_view->carets[0]);
|
||||
seek_view->carets.len = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (Press(KEY_ENTER)) {
|
||||
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);
|
||||
}
|
||||
if (Press(KEY_ENTER)) {
|
||||
seek_view->carets[0] = FindInBuffer(seek_buffer, needle, seek_view->carets[0], true);
|
||||
seek_view->carets.len = 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user