From fe20d05e13f6e73b080c4a9ea8961e4bed45a4be Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Tue, 6 Aug 2024 18:36:58 +0200 Subject: [PATCH] Add friendly remainders, better console experience --- src/basic/basic.h | 2 +- src/text_editor/buffer.cpp | 10 +++++----- src/text_editor/buffer_history.cpp | 11 +++++------ src/text_editor/buffer_multi_cursor.cpp | 4 ++-- src/text_editor/buffer_test_load.cpp | 12 ++++++------ src/text_editor/commands.cpp | 12 ++++++++++-- src/text_editor/commands_window.cpp | 8 ++++---- src/text_editor/lua_api.cpp | 3 ++- src/text_editor/management.cpp | 6 +++--- src/text_editor/text_editor.h | 6 ++++-- src/text_editor/title_bar.cpp | 14 +++++++------- 11 files changed, 49 insertions(+), 39 deletions(-) diff --git a/src/basic/basic.h b/src/basic/basic.h index aa99b6f..25e9bcc 100644 --- a/src/basic/basic.h +++ b/src/basic/basic.h @@ -490,7 +490,7 @@ void Insert(Array *arr, T item, int64_t index) { template Array Copy(Allocator alo, Array array) { Array result = {alo}; - result.reserve(array.cap); + Reserve(&result, array.cap); memcpy(result.data, array.data, sizeof(T) * array.len); result.len = array.len; return result; diff --git a/src/text_editor/buffer.cpp b/src/text_editor/buffer.cpp index 70f53f8..aa42530 100644 --- a/src/text_editor/buffer.cpp +++ b/src/text_editor/buffer.cpp @@ -78,7 +78,7 @@ void ValidateLineStarts(Buffer *buffer) { } } -void ReplaceText(Buffer *buffer, Range range, String16 string) { +void IKnowWhatImDoing_ReplaceText(Buffer *buffer, Range range, String16 string) { ProfileFunction(); Assert(range.max >= range.min); Assert(range.max >= 0 && range.max <= buffer->len); @@ -110,13 +110,13 @@ void ReplaceText(Buffer *buffer, Range range, String16 string) { #endif } -void Append(Buffer *buffer, String16 string) { - ReplaceText(buffer, GetEndAsRange(*buffer), string); +void IKnowWhatImDoing_Append(Buffer *buffer, String16 string) { + IKnowWhatImDoing_ReplaceText(buffer, GetEndAsRange(*buffer), string); } -void Appendf(Buffer *buffer, const char *fmt, ...) { +void IKnowWhatImDoing_Appendf(Buffer *buffer, const char *fmt, ...) { Scratch scratch; STRING_FORMAT(scratch, fmt, string); String16 string16 = ToString16(scratch, string); - ReplaceText(buffer, GetEndAsRange(*buffer), string16); + IKnowWhatImDoing_ReplaceText(buffer, GetEndAsRange(*buffer), string16); } diff --git a/src/text_editor/buffer_history.cpp b/src/text_editor/buffer_history.cpp index a76f20d..29dd493 100644 --- a/src/text_editor/buffer_history.cpp +++ b/src/text_editor/buffer_history.cpp @@ -48,7 +48,7 @@ void RedoEdit(Buffer *buffer, Array *carets) { SaveHistoryBeforeMergeCursor(buffer, &buffer->undo_stack, *carets); SaveHistoryBeforeApplyEdits(buffer, &buffer->undo_stack, entry.edits); - _ApplyEdits(buffer, entry.edits); + IKnowWhatImDoing__ApplyEditsMultiCursor(buffer, entry.edits); Dealloc(carets); *carets = entry.carets; @@ -67,7 +67,7 @@ void UndoEdit(Buffer *buffer, Array *carets) { SaveHistoryBeforeMergeCursor(buffer, &buffer->redo_stack, *carets); SaveHistoryBeforeApplyEdits(buffer, &buffer->redo_stack, entry.edits); - _ApplyEdits(buffer, entry.edits); + IKnowWhatImDoing__ApplyEditsMultiCursor(buffer, entry.edits); Dealloc(carets); *carets = entry.carets; @@ -77,12 +77,12 @@ void UndoEdit(Buffer *buffer, Array *carets) { Dealloc(&entry.edits); } -void ApplyEdits(Buffer *buffer, Array &edits) { +void IKnowWhatImDoing_ApplyEdits(Buffer *buffer, Array &edits) { ProfileFunction(); Assert(buffer->edit_phase == 1); buffer->edit_phase += 1; SaveHistoryBeforeApplyEdits(buffer, &buffer->undo_stack, edits); - _ApplyEdits(buffer, edits); + IKnowWhatImDoing__ApplyEditsMultiCursor(buffer, edits); } void ClearRedoStack(Buffer *buffer) { @@ -97,7 +97,6 @@ void ClearRedoStack(Buffer *buffer) { // @note: !! // We can invoke this before caret altering commands to save caret history // and then call some editing command to edit which is not going to save carets -// @todo: this needs to be actually tested though!!! Array BeginEdit(Allocator allocator, Buffer *buffer, Array &carets) { Assert(buffer->edit_phase == 0 || buffer->edit_phase == 1); if (buffer->edit_phase == 0) { @@ -117,7 +116,7 @@ void PreBeginEdit_SaveCaretHistory(Buffer *buffer, Array &carets) { bool KILL_SELECTION = true; void EndEdit(Buffer *buffer, Array *edits, Array *carets, bool kill_selection = true) { ProfileFunction(); - ApplyEdits(buffer, *edits); + IKnowWhatImDoing_ApplyEdits(buffer, *edits); Assert(buffer->edit_phase == 2); buffer->edit_phase -= 2; diff --git a/src/text_editor/buffer_multi_cursor.cpp b/src/text_editor/buffer_multi_cursor.cpp index 0c39642..d5bcfc8 100644 --- a/src/text_editor/buffer_multi_cursor.cpp +++ b/src/text_editor/buffer_multi_cursor.cpp @@ -108,7 +108,7 @@ void MergeSort(int64_t Count, Edit *First, Edit *Temp) { } } -void _ApplyEdits(Buffer *buffer, Array edits) { +void IKnowWhatImDoing__ApplyEditsMultiCursor(Buffer *buffer, Array edits) { ProfileFunction(); #if BUFFER_DEBUG Assert(buffer->line_starts.len); @@ -154,7 +154,7 @@ void _ApplyEdits(Buffer *buffer, Array edits) { it.range.min += offset; it.range.max += offset; offset += it.string.len - GetSize(it.range); - ReplaceText(buffer, it.range, it.string); + IKnowWhatImDoing_ReplaceText(buffer, it.range, it.string); } } diff --git a/src/text_editor/buffer_test_load.cpp b/src/text_editor/buffer_test_load.cpp index 0bbd1ef..64f751d 100644 --- a/src/text_editor/buffer_test_load.cpp +++ b/src/text_editor/buffer_test_load.cpp @@ -1,12 +1,12 @@ void LoadBigText(Buffer *buffer, int size = 5000000) { for (int i = 0; i < size; i += 1) { - ReplaceText(buffer, GetEndAsRange(*buffer), L"Line number and another meme or something of the sort which is here or there frankly somewhere\n"); + IKnowWhatImDoing_ReplaceText(buffer, GetEndAsRange(*buffer), L"Line number and another meme or something of the sort which is here or there frankly somewhere\n"); } } void LoadBigLine(Buffer *buffer, int size = 5000000) { for (int i = 0; i < size; i += 1) { - ReplaceText(buffer, GetEndAsRange(*buffer), L"Line number and another meme or something of the sort which is here or there frankly somewhere"); + IKnowWhatImDoing_ReplaceText(buffer, GetEndAsRange(*buffer), L"Line number and another meme or something of the sort which is here or there frankly somewhere"); } } @@ -20,14 +20,14 @@ void LoadTextA(Buffer *buffer) { for (int i = 0; i < 1000; i += 1) { String s = Format(scratch, "line1: %d line2: %d line3: %d line4: %d line5: %d line6: %d line1: %d line2: %d line3: %d line4: %d line5: %d line6: %d\r\n", i, i, i, i, i, i, i, i, i, i, i, i); String16 s16 = ToString16(scratch, s); - ReplaceText(buffer, GetEndAsRange(*buffer), s16); + IKnowWhatImDoing_ReplaceText(buffer, GetEndAsRange(*buffer), s16); } } void LoadLine(Buffer *buffer) { Scratch scratch; String s = "Line number and so on óźćż"; - ReplaceText(buffer, {}, ToString16(scratch, s)); + IKnowWhatImDoing_ReplaceText(buffer, {}, ToString16(scratch, s)); } void LoadUnicode(Buffer *buffer) { @@ -137,7 +137,7 @@ Bopomofo )==="; Scratch scratch; - ReplaceText(buffer, {}, ToString16(scratch, text)); + IKnowWhatImDoing_ReplaceText(buffer, {}, ToString16(scratch, text)); text = R"===( @@ -153,5 +153,5 @@ CJK Unified Ideographs 一 丁 丂 七 丄 丅 丆 万 丈 三 上 下 丌 不 与 丏 丐 丑 丒 专 且 丕 世 丗 丘 丙 业 丛 东 丝 丞 丟 丠 両 丢 丣 两 严 並 丧 丨 丩 个 丫 丬 中 丮 丯 丰 丱 串 丳 临 丵 丶 丷 丸 丹 为 主 丼 丽 举 丿 乀 乁 乂 乃 乄 久 乆 乇 么 义 乊 之 乌 乍 乎 乏 乐 乑 乒 乓 乔 乕 乖 乗 乘 乙 乚 乛 乜 九 乞 也 习 乡 乢 乣 乤 乥 书 乧 乨 乩 乪 乫 乬 乭 乮 乯 买 乱 乲 乳 乴 乵 乶 乷 乸 乹 乺 乻 乼 乽 乾 乿 ... Hangul Syllables 가 각 갂 갃 간 갅 갆 갇 갈 갉 갊 갋 갌 갍 갎 갏 감 갑 값 갓 갔 강 갖 갗 갘 같 갚 갛 개 객 갞 갟 갠 갡 갢 갣 갤 갥 갦 갧 갨 갩 갪 갫 갬 갭 갮 갯 갰 갱 갲 갳 갴 갵 갶 갷 갸 갹 갺 갻 갼 갽 갾 갿 걀 걁 걂 걃 걄 걅 걆 걇 걈 걉 걊 걋 걌 걍 걎 걏 걐 걑 걒 걓 걔 걕 걖 걗 걘 걙 걚 걛 걜 걝 걞 걟 걠 걡 걢 걣 걤 걥 걦 걧 걨 걩 걪 걫 걬 걭 걮 걯 거 걱 걲 걳 건 걵 걶 걷 걸 걹 걺 걻 걼 걽 걾 걿 ...)==="; - ReplaceText(buffer, GetEndAsRange(*buffer), ToString16(scratch, text)); + IKnowWhatImDoing_ReplaceText(buffer, GetEndAsRange(*buffer), ToString16(scratch, text)); } \ No newline at end of file diff --git a/src/text_editor/commands.cpp b/src/text_editor/commands.cpp index 7cf667b..7e2bd50 100644 --- a/src/text_editor/commands.cpp +++ b/src/text_editor/commands.cpp @@ -465,13 +465,21 @@ void AppendToConsole(String16 string) { View *view = FindView(buffer->id); Assert(view); + Array caret_copy = Copy(GetSystemAllocator(), view->carets); + defer { + Dealloc(&view->carets); + view->carets = caret_copy; + }; + bool scroll_to_end = false; if (view) { Int line = PosToLine(*buffer, GetFront(view->carets[0])); if (line == buffer->line_starts.len - 1) scroll_to_end = true; } - ReplaceText(buffer, GetEndAsRange(*buffer), string); - ReplaceText(buffer, GetEndAsRange(*buffer), L"\n"); + + Command_SelectRangeOneCursor(view, GetEndAsRange(*buffer)); + Command_Replace(view, string); + Command_Replace(view, L"\n"); if (scroll_to_end) { view->carets[0] = MakeCaret(GetEndAsRange(*buffer).min); diff --git a/src/text_editor/commands_window.cpp b/src/text_editor/commands_window.cpp index be095c5..ace8dac 100644 --- a/src/text_editor/commands_window.cpp +++ b/src/text_editor/commands_window.cpp @@ -791,13 +791,13 @@ void WindowCommand(Event event, Window *window, View *view) { Array ratings = FuzzySearchLines(scratch, buffer, 1, buffer->line_starts.len, first_line_string); Buffer *temp_buffer = CreateTempBuffer(scratch, buffer->cap); - ReplaceText(temp_buffer, GetEndAsRange(*temp_buffer), first_line_string); - ReplaceText(temp_buffer, GetEndAsRange(*temp_buffer), L"\n"); + IKnowWhatImDoing_ReplaceText(temp_buffer, GetEndAsRange(*temp_buffer), first_line_string); + IKnowWhatImDoing_ReplaceText(temp_buffer, GetEndAsRange(*temp_buffer), L"\n"); For(ratings) { String16 s = GetLineStringWithoutNL(*buffer, it.index); if (s.len == 0) continue; - ReplaceText(temp_buffer, GetEndAsRange(*temp_buffer), s); - ReplaceText(temp_buffer, GetEndAsRange(*temp_buffer), L"\n"); + IKnowWhatImDoing_ReplaceText(temp_buffer, GetEndAsRange(*temp_buffer), s); + IKnowWhatImDoing_ReplaceText(temp_buffer, GetEndAsRange(*temp_buffer), L"\n"); } Caret caret = view->carets[0]; diff --git a/src/text_editor/lua_api.cpp b/src/text_editor/lua_api.cpp index 8fe2e77..03c6f28 100644 --- a/src/text_editor/lua_api.cpp +++ b/src/text_editor/lua_api.cpp @@ -259,7 +259,8 @@ void ReloadLuaConfig() { Buffer *lua_buffer = BufferOpenFile(lua_config_path); if (lua_buffer->len == 0) { - ReplaceText(lua_buffer, {}, ToString16(scratch, BaseLuaConfig)); + String16 string16 = ToString16(scratch, BaseLuaConfig); + IKnowWhatImDoing_ReplaceText(lua_buffer, {}, string16); } // if we loaded from file this should force to read diff --git a/src/text_editor/management.cpp b/src/text_editor/management.cpp index 67804b0..c5e3d32 100644 --- a/src/text_editor/management.cpp +++ b/src/text_editor/management.cpp @@ -209,9 +209,9 @@ Buffer *BufferOpenFile(String path) { int i = 1; for (FileIter it = IterateFiles(scratch, path); IsValid(it); Advance(&it)) { - Appendf(buffer, "%.*s", FmtString(it.filename)); - if ((i % 8) == 0) Append(buffer, L"\n"); - else Append(buffer, L" "); + IKnowWhatImDoing_Appendf(buffer, "%.*s", FmtString(it.filename)); + if ((i % 8) == 0) IKnowWhatImDoing_Append(buffer, L"\n"); + else IKnowWhatImDoing_Append(buffer, L" "); i += 1; } } else { diff --git a/src/text_editor/text_editor.h b/src/text_editor/text_editor.h index 49c632a..2b68bd2 100644 --- a/src/text_editor/text_editor.h +++ b/src/text_editor/text_editor.h @@ -117,11 +117,13 @@ void AfterEdit(View *view, Array edits); Scroller ComputeScrollerRect(Window *window); void Command_EvalLua(View *view, String16 string); void MergeCarets(View *view, Range *mouse_selection_anchor = NULL); -void Command_SelectEntireBuffer(View *view); -void Command_Replace(View *view, String16 string); void Open(String path); void Open(String16 path); void UpdateScroll(Window *window, bool update_caret_scrolling); +void Command_SelectEntireBuffer(View *view); +void Command_Replace(View *view, String16 string); +void Command_SelectRangeOneCursor(View *view, Range range); + void ReportErrorf(const char *fmt, ...); void ReportWarningf(const char *fmt, ...); \ No newline at end of file diff --git a/src/text_editor/title_bar.cpp b/src/text_editor/title_bar.cpp index 006fb8b..1133905 100644 --- a/src/text_editor/title_bar.cpp +++ b/src/text_editor/title_bar.cpp @@ -37,16 +37,16 @@ void ReplaceDebugData() { Scratch scratch; String s = Format(scratch, "wid: %d\nvid: %d\nbid: %d\nframe: %lld\n", (int)last_window->id.id, (int)last_view->id.id, (int)last_buffer->id.id, (long long)FrameID); String16 string = ToString16(scratch, s); - ReplaceText(buffer, GetRange(*buffer), string); + IKnowWhatImDoing_ReplaceText(buffer, GetRange(*buffer), string); float xmouse, ymouse; SDL_GetMouseState(&xmouse, &ymouse); - Appendf(buffer, "mouse: [%f, %f]\n", xmouse, ymouse); - Appendf(buffer, "window count: %d view count: %d buffer count: %d\n", (int)Windows.len, (int)Views.len, (int)Buffers.len); - Appendf(buffer, "C:/Work/text_editor/src/text_editor/text_editor.cpp\n"); - Appendf(buffer, "working dir: %.*s\n", FmtString(WorkingDir)); - Appendf(buffer, "exe dir: %.*s\n", FmtString(ExeDir)); - Appendf(buffer, "config dir: %.*s\n", FmtString(ConfigDir)); + IKnowWhatImDoing_Appendf(buffer, "mouse: [%f, %f]\n", xmouse, ymouse); + IKnowWhatImDoing_Appendf(buffer, "window count: %d view count: %d buffer count: %d\n", (int)Windows.len, (int)Views.len, (int)Buffers.len); + IKnowWhatImDoing_Appendf(buffer, "C:/Work/text_editor/src/text_editor/text_editor.cpp\n"); + IKnowWhatImDoing_Appendf(buffer, "working dir: %.*s\n", FmtString(WorkingDir)); + IKnowWhatImDoing_Appendf(buffer, "exe dir: %.*s\n", FmtString(ExeDir)); + IKnowWhatImDoing_Appendf(buffer, "config dir: %.*s\n", FmtString(ConfigDir)); // String view_list = DebugViewList(scratch); // Append(buffer, ToString16(scratch, view_list));