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) {
|
void MergeCarets(Buffer &buffer, Array<Caret> *_carets, Range *mouse_selection_anchor = NULL) {
|
||||||
ProfileFunction();
|
ProfileFunction();
|
||||||
Array<Caret> &carets = *_carets;
|
Array<Caret> &carets = *_carets;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
Caret caret = view.carets[0];
|
view.carets.len = 1;
|
||||||
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 (Press(KEY_ENTER)) {
|
if (window->id.id == SearchWindowID.id) {
|
||||||
search = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (window->id.id == SearchWindowID.id && search) {
|
|
||||||
Window *seek_window = GetWindow(GetLastActiveWindow());
|
Window *seek_window = GetWindow(GetLastActiveWindow());
|
||||||
View *seek_view = GetView(seek_window->active_view);
|
View *seek_view = GetView(seek_window->active_view);
|
||||||
Buffer *seek_buffer = GetBuffer(seek_view->buffer_id);
|
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 needle = GetString(*buffer);
|
||||||
String16 medium = GetString(*seek_buffer, {pos, INT64_MAX});
|
if (search) {
|
||||||
Int index = 0;
|
seek_view->carets[0] = FindInBuffer(seek_buffer, needle, seek_view->carets[0]);
|
||||||
if (Seek(medium, needle, &index)) {
|
seek_view->carets.len = 1;
|
||||||
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