Performance - not drawing selection outside of line range, add select all matches
This commit is contained in:
@@ -18,6 +18,11 @@ inline bool Alt() {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline bool AltPress(int key) {
|
||||||
|
bool result = Press(key) && Alt();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
inline bool CtrlPress(int key) {
|
inline bool CtrlPress(int key) {
|
||||||
bool result = Press(key) && Ctrl();
|
bool result = Press(key) && Ctrl();
|
||||||
return result;
|
return result;
|
||||||
@@ -241,6 +246,21 @@ Caret FindInBuffer(Buffer *buffer, String16 needle, Caret caret, bool find_next
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Array<Range> FindAllInBuffer(Allocator allocator, Buffer *buffer, String16 needle) {
|
||||||
|
Array<Range> result = {allocator};
|
||||||
|
String16 string_buffer = GetString(*buffer);
|
||||||
|
for (Int pos = 0;;) {
|
||||||
|
Int index = 0;
|
||||||
|
String16 medium = Skip(string_buffer, pos);
|
||||||
|
if (!Seek(medium, needle, &index)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Add(&result, Rng(pos + index, pos + index + needle.len));
|
||||||
|
pos += needle.len;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
void HandleGlobalCommands() {
|
void HandleGlobalCommands() {
|
||||||
if (CtrlPress(KEY_P)) {
|
if (CtrlPress(KEY_P)) {
|
||||||
Window *command_window = GetWindow(CommandWindowID);
|
Window *command_window = GetWindow(CommandWindowID);
|
||||||
|
|||||||
@@ -263,13 +263,6 @@ void HandleActiveWindowBindings(Window *window, bool *update_scroll) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CtrlPress(KEY_D)) {
|
|
||||||
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)) {
|
if (CtrlShiftPress(KEY_Z)) {
|
||||||
RedoEdit(buffer, &view.carets);
|
RedoEdit(buffer, &view.carets);
|
||||||
} else if (CtrlPress(KEY_Z)) {
|
} else if (CtrlPress(KEY_Z)) {
|
||||||
@@ -346,11 +339,24 @@ void HandleActiveWindowBindings(Window *window, bool *update_scroll) {
|
|||||||
search = true;
|
search = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (CtrlPress(KEY_D)) {
|
||||||
|
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 (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 = FindInBuffer(buffer, search_string, view.carets[0], true);
|
||||||
view.carets.len = 1;
|
if (Ctrl()) {
|
||||||
|
Insert(&view.carets, caret, 0);
|
||||||
|
MergeCarets(*buffer, &view.carets);
|
||||||
|
} else {
|
||||||
|
view.carets.len = 1;
|
||||||
|
view.carets[0] = caret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (window->id.id == SearchWindowID.id) {
|
if (window->id.id == SearchWindowID.id) {
|
||||||
@@ -362,9 +368,20 @@ void HandleActiveWindowBindings(Window *window, bool *update_scroll) {
|
|||||||
seek_view->carets[0] = FindInBuffer(seek_buffer, needle, seek_view->carets[0]);
|
seek_view->carets[0] = FindInBuffer(seek_buffer, needle, seek_view->carets[0]);
|
||||||
seek_view->carets.len = 1;
|
seek_view->carets.len = 1;
|
||||||
}
|
}
|
||||||
if (Press(KEY_ENTER)) {
|
if (AltPress(KEY_ENTER)) {
|
||||||
seek_view->carets[0] = FindInBuffer(seek_buffer, needle, seek_view->carets[0], true);
|
Scratch scratch;
|
||||||
seek_view->carets.len = 1;
|
Array<Range> finds = FindAllInBuffer(scratch, seek_buffer, needle);
|
||||||
|
For(finds) Add(&seek_view->carets, MakeCaret(it.max, it.min));
|
||||||
|
MergeCarets(*buffer, &view.carets);
|
||||||
|
} else if (Press(KEY_ENTER)) {
|
||||||
|
Caret caret = FindInBuffer(seek_buffer, needle, seek_view->carets[0], true);
|
||||||
|
if (Ctrl()) {
|
||||||
|
Insert(&seek_view->carets, caret, 0);
|
||||||
|
MergeCarets(*buffer, &view.carets);
|
||||||
|
} else {
|
||||||
|
seek_view->carets.len = 1;
|
||||||
|
seek_view->carets[0] = caret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -92,6 +92,7 @@ void DrawCaret(Window &window, XY xy, float size, Color color) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void DrawLineHighlight(Window &window, XY fxy, Color color) {
|
void DrawLineHighlight(Window &window, XY fxy, Color color) {
|
||||||
|
ProfileFunction();
|
||||||
View &view = *GetActiveView(&window);
|
View &view = *GetActiveView(&window);
|
||||||
Vec2I w = XYToWorldPos(view, XYLine(fxy.line));
|
Vec2I w = XYToWorldPos(view, XYLine(fxy.line));
|
||||||
w -= view.scroll;
|
w -= view.scroll;
|
||||||
@@ -110,16 +111,18 @@ void DrawSelection(Window &window, Caret &it) {
|
|||||||
Int front = GetFront(it);
|
Int front = GetFront(it);
|
||||||
Int back = GetBack(it);
|
Int back = GetBack(it);
|
||||||
if (front != back) {
|
if (front != back) {
|
||||||
XY bxy = PosToXY(*buffer, back);
|
Rect2I visible = GetVisibleCells(window);
|
||||||
XY min = PosToXY(*buffer, it.range.min);
|
XY min = PosToXY(*buffer, it.range.min);
|
||||||
XY max = PosToXY(*buffer, it.range.max);
|
XY max = PosToXY(*buffer, it.range.max);
|
||||||
|
if (visible.min.y > max.line) return;
|
||||||
|
if (visible.max.y < min.line) return;
|
||||||
|
|
||||||
Color color = ColorSelection;
|
XY bxy = PosToXY(*buffer, back);
|
||||||
Rect2I vlines = GetVisibleCells(window);
|
Color color = ColorSelection;
|
||||||
for (Int line = vlines.min.y; line <= vlines.max.y && line >= 0 && line < buffer->line_starts.len; line += 1) {
|
for (Int line = visible.min.y; line <= visible.max.y && line >= 0 && line < buffer->line_starts.len; line += 1) {
|
||||||
String16 line_string = GetLineString(*buffer, line);
|
String16 line_string = GetLineString(*buffer, line);
|
||||||
|
|
||||||
for (Int col = vlines.min.x; col < vlines.max.x && col >= 0 && col < line_string.len; col += 1) {
|
for (Int col = visible.min.x; col < visible.max.x && col >= 0 && col < line_string.len; col += 1) {
|
||||||
bool a = line > min.line && line < max.line;
|
bool a = line > min.line && line < max.line;
|
||||||
bool b = min.line != max.line && (line == min.line && col >= min.col);
|
bool b = min.line != max.line && (line == min.line && col >= min.col);
|
||||||
bool c = min.line != max.line && (line == max.line && col < max.col);
|
bool c = min.line != max.line && (line == max.line && col < max.col);
|
||||||
@@ -150,8 +153,10 @@ void DrawWindow(Window &window) {
|
|||||||
View &view = *GetActiveView(&window);
|
View &view = *GetActiveView(&window);
|
||||||
Buffer *buffer = GetBuffer(view.buffer_id);
|
Buffer *buffer = GetBuffer(view.buffer_id);
|
||||||
DrawRectangleRec(ToRectangle(window.total_rect), ColorBackground);
|
DrawRectangleRec(ToRectangle(window.total_rect), ColorBackground);
|
||||||
|
bool is_active = IsActive(&window) || window.id.id == GetLastActiveWindow().id;
|
||||||
|
|
||||||
BeginScissorMode((int)window.document_rect.min.x, (int)window.document_rect.min.y, (int)window.document_rect.max.x - (int)window.document_rect.min.x, (int)window.document_rect.max.y - (int)window.document_rect.min.y);
|
BeginScissorMode((int)window.document_rect.min.x, (int)window.document_rect.min.y, (int)window.document_rect.max.x - (int)window.document_rect.min.x, (int)window.document_rect.max.y - (int)window.document_rect.min.y);
|
||||||
|
BeginProfileScope("draw_caret_selection");
|
||||||
For(view.carets) {
|
For(view.carets) {
|
||||||
Int front = GetFront(it);
|
Int front = GetFront(it);
|
||||||
XY fxy = PosToXY(*buffer, front);
|
XY fxy = PosToXY(*buffer, front);
|
||||||
@@ -161,15 +166,21 @@ void DrawWindow(Window &window) {
|
|||||||
DrawLineHighlight(window, fxy, ColorLineHighlight);
|
DrawLineHighlight(window, fxy, ColorLineHighlight);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
EndProfileScope();
|
||||||
|
|
||||||
DrawVisibleText(window);
|
DrawVisibleText(window);
|
||||||
|
|
||||||
|
BeginProfileScope("draw_carets");
|
||||||
|
Rect2I visible = GetVisibleCells(window);
|
||||||
For(view.carets) {
|
For(view.carets) {
|
||||||
Int front = GetFront(it);
|
Int front = GetFront(it);
|
||||||
XY fxy = PosToXY(*buffer, front);
|
XY fxy = PosToXY(*buffer, front);
|
||||||
bool main_caret = &it == &view.carets.data[0];
|
if (fxy.col >= visible.min.x && fxy.col < visible.min.x && fxy.line >= visible.min.y && fxy.line <= visible.max.y) {
|
||||||
DrawCaret(window, fxy, 0.3f, main_caret ? ColorMainCaret : ColorSubCaret);
|
bool main_caret = &it == &view.carets.data[0];
|
||||||
|
DrawCaret(window, fxy, 0.3f, main_caret ? ColorMainCaret : ColorSubCaret);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
EndProfileScope();
|
||||||
EndScissorMode();
|
EndScissorMode();
|
||||||
|
|
||||||
// Draw scrollbar
|
// Draw scrollbar
|
||||||
@@ -182,7 +193,7 @@ void DrawWindow(Window &window) {
|
|||||||
Rect2 rect = Shrink(scroller.rect, 2);
|
Rect2 rect = Shrink(scroller.rect, 2);
|
||||||
Color color = ColorScrollbarScroller;
|
Color color = ColorScrollbarScroller;
|
||||||
if (!window.mouse_selecting && (window.mouse_selecting_scrollbar || mouse_in_scrollbar)) {
|
if (!window.mouse_selecting && (window.mouse_selecting_scrollbar || mouse_in_scrollbar)) {
|
||||||
if (IsActive(&window)) color = ColorScrollbarScrollerSelected;
|
if (is_active) color = ColorScrollbarScrollerSelected;
|
||||||
}
|
}
|
||||||
DrawRectangleRec(ToRectangle(rect), color);
|
DrawRectangleRec(ToRectangle(rect), color);
|
||||||
}
|
}
|
||||||
@@ -212,7 +223,7 @@ void DrawWindow(Window &window) {
|
|||||||
EndScissorMode();
|
EndScissorMode();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!IsActive(&window)) {
|
if (!is_active) {
|
||||||
DrawRectangleRec(ToRectangle(window.total_rect), {0, 0, 0, 30});
|
DrawRectangleRec(ToRectangle(window.total_rect), {0, 0, 0, 30});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user