Add friendly remainders, better console experience

This commit is contained in:
Krzosa Karol
2024-08-06 18:36:58 +02:00
parent b036e48cee
commit fe20d05e13
11 changed files with 49 additions and 39 deletions

View File

@@ -490,7 +490,7 @@ void Insert(Array<T> *arr, T item, int64_t index) {
template <class T> template <class T>
Array<T> Copy(Allocator alo, Array<T> array) { Array<T> Copy(Allocator alo, Array<T> array) {
Array<T> result = {alo}; Array<T> result = {alo};
result.reserve(array.cap); Reserve(&result, array.cap);
memcpy(result.data, array.data, sizeof(T) * array.len); memcpy(result.data, array.data, sizeof(T) * array.len);
result.len = array.len; result.len = array.len;
return result; return result;

View File

@@ -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(); ProfileFunction();
Assert(range.max >= range.min); Assert(range.max >= range.min);
Assert(range.max >= 0 && range.max <= buffer->len); Assert(range.max >= 0 && range.max <= buffer->len);
@@ -110,13 +110,13 @@ void ReplaceText(Buffer *buffer, Range range, String16 string) {
#endif #endif
} }
void Append(Buffer *buffer, String16 string) { void IKnowWhatImDoing_Append(Buffer *buffer, String16 string) {
ReplaceText(buffer, GetEndAsRange(*buffer), string); IKnowWhatImDoing_ReplaceText(buffer, GetEndAsRange(*buffer), string);
} }
void Appendf(Buffer *buffer, const char *fmt, ...) { void IKnowWhatImDoing_Appendf(Buffer *buffer, const char *fmt, ...) {
Scratch scratch; Scratch scratch;
STRING_FORMAT(scratch, fmt, string); STRING_FORMAT(scratch, fmt, string);
String16 string16 = ToString16(scratch, string); String16 string16 = ToString16(scratch, string);
ReplaceText(buffer, GetEndAsRange(*buffer), string16); IKnowWhatImDoing_ReplaceText(buffer, GetEndAsRange(*buffer), string16);
} }

View File

@@ -48,7 +48,7 @@ void RedoEdit(Buffer *buffer, Array<Caret> *carets) {
SaveHistoryBeforeMergeCursor(buffer, &buffer->undo_stack, *carets); SaveHistoryBeforeMergeCursor(buffer, &buffer->undo_stack, *carets);
SaveHistoryBeforeApplyEdits(buffer, &buffer->undo_stack, entry.edits); SaveHistoryBeforeApplyEdits(buffer, &buffer->undo_stack, entry.edits);
_ApplyEdits(buffer, entry.edits); IKnowWhatImDoing__ApplyEditsMultiCursor(buffer, entry.edits);
Dealloc(carets); Dealloc(carets);
*carets = entry.carets; *carets = entry.carets;
@@ -67,7 +67,7 @@ void UndoEdit(Buffer *buffer, Array<Caret> *carets) {
SaveHistoryBeforeMergeCursor(buffer, &buffer->redo_stack, *carets); SaveHistoryBeforeMergeCursor(buffer, &buffer->redo_stack, *carets);
SaveHistoryBeforeApplyEdits(buffer, &buffer->redo_stack, entry.edits); SaveHistoryBeforeApplyEdits(buffer, &buffer->redo_stack, entry.edits);
_ApplyEdits(buffer, entry.edits); IKnowWhatImDoing__ApplyEditsMultiCursor(buffer, entry.edits);
Dealloc(carets); Dealloc(carets);
*carets = entry.carets; *carets = entry.carets;
@@ -77,12 +77,12 @@ void UndoEdit(Buffer *buffer, Array<Caret> *carets) {
Dealloc(&entry.edits); Dealloc(&entry.edits);
} }
void ApplyEdits(Buffer *buffer, Array<Edit> &edits) { void IKnowWhatImDoing_ApplyEdits(Buffer *buffer, Array<Edit> &edits) {
ProfileFunction(); ProfileFunction();
Assert(buffer->edit_phase == 1); Assert(buffer->edit_phase == 1);
buffer->edit_phase += 1; buffer->edit_phase += 1;
SaveHistoryBeforeApplyEdits(buffer, &buffer->undo_stack, edits); SaveHistoryBeforeApplyEdits(buffer, &buffer->undo_stack, edits);
_ApplyEdits(buffer, edits); IKnowWhatImDoing__ApplyEditsMultiCursor(buffer, edits);
} }
void ClearRedoStack(Buffer *buffer) { void ClearRedoStack(Buffer *buffer) {
@@ -97,7 +97,6 @@ void ClearRedoStack(Buffer *buffer) {
// @note: !! // @note: !!
// We can invoke this before caret altering commands to save caret history // 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 // and then call some editing command to edit which is not going to save carets
// @todo: this needs to be actually tested though!!!
Array<Edit> BeginEdit(Allocator allocator, Buffer *buffer, Array<Caret> &carets) { Array<Edit> BeginEdit(Allocator allocator, Buffer *buffer, Array<Caret> &carets) {
Assert(buffer->edit_phase == 0 || buffer->edit_phase == 1); Assert(buffer->edit_phase == 0 || buffer->edit_phase == 1);
if (buffer->edit_phase == 0) { if (buffer->edit_phase == 0) {
@@ -117,7 +116,7 @@ void PreBeginEdit_SaveCaretHistory(Buffer *buffer, Array<Caret> &carets) {
bool KILL_SELECTION = true; bool KILL_SELECTION = true;
void EndEdit(Buffer *buffer, Array<Edit> *edits, Array<Caret> *carets, bool kill_selection = true) { void EndEdit(Buffer *buffer, Array<Edit> *edits, Array<Caret> *carets, bool kill_selection = true) {
ProfileFunction(); ProfileFunction();
ApplyEdits(buffer, *edits); IKnowWhatImDoing_ApplyEdits(buffer, *edits);
Assert(buffer->edit_phase == 2); Assert(buffer->edit_phase == 2);
buffer->edit_phase -= 2; buffer->edit_phase -= 2;

View File

@@ -108,7 +108,7 @@ void MergeSort(int64_t Count, Edit *First, Edit *Temp) {
} }
} }
void _ApplyEdits(Buffer *buffer, Array<Edit> edits) { void IKnowWhatImDoing__ApplyEditsMultiCursor(Buffer *buffer, Array<Edit> edits) {
ProfileFunction(); ProfileFunction();
#if BUFFER_DEBUG #if BUFFER_DEBUG
Assert(buffer->line_starts.len); Assert(buffer->line_starts.len);
@@ -154,7 +154,7 @@ void _ApplyEdits(Buffer *buffer, Array<Edit> edits) {
it.range.min += offset; it.range.min += offset;
it.range.max += offset; it.range.max += offset;
offset += it.string.len - GetSize(it.range); offset += it.string.len - GetSize(it.range);
ReplaceText(buffer, it.range, it.string); IKnowWhatImDoing_ReplaceText(buffer, it.range, it.string);
} }
} }

View File

@@ -1,12 +1,12 @@
void LoadBigText(Buffer *buffer, int size = 5000000) { void LoadBigText(Buffer *buffer, int size = 5000000) {
for (int i = 0; i < size; i += 1) { 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) { void LoadBigLine(Buffer *buffer, int size = 5000000) {
for (int i = 0; i < size; i += 1) { 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) { 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); 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); String16 s16 = ToString16(scratch, s);
ReplaceText(buffer, GetEndAsRange(*buffer), s16); IKnowWhatImDoing_ReplaceText(buffer, GetEndAsRange(*buffer), s16);
} }
} }
void LoadLine(Buffer *buffer) { void LoadLine(Buffer *buffer) {
Scratch scratch; Scratch scratch;
String s = "Line number and so on óźćż"; String s = "Line number and so on óźćż";
ReplaceText(buffer, {}, ToString16(scratch, s)); IKnowWhatImDoing_ReplaceText(buffer, {}, ToString16(scratch, s));
} }
void LoadUnicode(Buffer *buffer) { void LoadUnicode(Buffer *buffer) {
@@ -137,7 +137,7 @@ Bopomofo
)==="; )===";
Scratch scratch; Scratch scratch;
ReplaceText(buffer, {}, ToString16(scratch, text)); IKnowWhatImDoing_ReplaceText(buffer, {}, ToString16(scratch, text));
text = R"===( text = R"===(
@@ -153,5 +153,5 @@ CJK Unified Ideographs
丿 乿 ... 丿 乿 ...
Hangul Syllables Hangul Syllables
갿 걿 ...)==="; 갿 걿 ...)===";
ReplaceText(buffer, GetEndAsRange(*buffer), ToString16(scratch, text)); IKnowWhatImDoing_ReplaceText(buffer, GetEndAsRange(*buffer), ToString16(scratch, text));
} }

View File

@@ -465,13 +465,21 @@ void AppendToConsole(String16 string) {
View *view = FindView(buffer->id); View *view = FindView(buffer->id);
Assert(view); Assert(view);
Array<Caret> caret_copy = Copy(GetSystemAllocator(), view->carets);
defer {
Dealloc(&view->carets);
view->carets = caret_copy;
};
bool scroll_to_end = false; bool scroll_to_end = false;
if (view) { if (view) {
Int line = PosToLine(*buffer, GetFront(view->carets[0])); Int line = PosToLine(*buffer, GetFront(view->carets[0]));
if (line == buffer->line_starts.len - 1) scroll_to_end = true; 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) { if (scroll_to_end) {
view->carets[0] = MakeCaret(GetEndAsRange(*buffer).min); view->carets[0] = MakeCaret(GetEndAsRange(*buffer).min);

View File

@@ -791,13 +791,13 @@ void WindowCommand(Event event, Window *window, View *view) {
Array<FuzzyPair> ratings = FuzzySearchLines(scratch, buffer, 1, buffer->line_starts.len, first_line_string); Array<FuzzyPair> ratings = FuzzySearchLines(scratch, buffer, 1, buffer->line_starts.len, first_line_string);
Buffer *temp_buffer = CreateTempBuffer(scratch, buffer->cap); Buffer *temp_buffer = CreateTempBuffer(scratch, buffer->cap);
ReplaceText(temp_buffer, GetEndAsRange(*temp_buffer), first_line_string); IKnowWhatImDoing_ReplaceText(temp_buffer, GetEndAsRange(*temp_buffer), first_line_string);
ReplaceText(temp_buffer, GetEndAsRange(*temp_buffer), L"\n"); IKnowWhatImDoing_ReplaceText(temp_buffer, GetEndAsRange(*temp_buffer), L"\n");
For(ratings) { For(ratings) {
String16 s = GetLineStringWithoutNL(*buffer, it.index); String16 s = GetLineStringWithoutNL(*buffer, it.index);
if (s.len == 0) continue; if (s.len == 0) continue;
ReplaceText(temp_buffer, GetEndAsRange(*temp_buffer), s); IKnowWhatImDoing_ReplaceText(temp_buffer, GetEndAsRange(*temp_buffer), s);
ReplaceText(temp_buffer, GetEndAsRange(*temp_buffer), L"\n"); IKnowWhatImDoing_ReplaceText(temp_buffer, GetEndAsRange(*temp_buffer), L"\n");
} }
Caret caret = view->carets[0]; Caret caret = view->carets[0];

View File

@@ -259,7 +259,8 @@ void ReloadLuaConfig() {
Buffer *lua_buffer = BufferOpenFile(lua_config_path); Buffer *lua_buffer = BufferOpenFile(lua_config_path);
if (lua_buffer->len == 0) { 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 // if we loaded from file this should force to read

View File

@@ -209,9 +209,9 @@ Buffer *BufferOpenFile(String path) {
int i = 1; int i = 1;
for (FileIter it = IterateFiles(scratch, path); IsValid(it); Advance(&it)) { for (FileIter it = IterateFiles(scratch, path); IsValid(it); Advance(&it)) {
Appendf(buffer, "%.*s", FmtString(it.filename)); IKnowWhatImDoing_Appendf(buffer, "%.*s", FmtString(it.filename));
if ((i % 8) == 0) Append(buffer, L"\n"); if ((i % 8) == 0) IKnowWhatImDoing_Append(buffer, L"\n");
else Append(buffer, L" "); else IKnowWhatImDoing_Append(buffer, L" ");
i += 1; i += 1;
} }
} else { } else {

View File

@@ -117,11 +117,13 @@ void AfterEdit(View *view, Array<Edit> edits);
Scroller ComputeScrollerRect(Window *window); Scroller ComputeScrollerRect(Window *window);
void Command_EvalLua(View *view, String16 string); void Command_EvalLua(View *view, String16 string);
void MergeCarets(View *view, Range *mouse_selection_anchor = NULL); 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(String path);
void Open(String16 path); void Open(String16 path);
void UpdateScroll(Window *window, bool update_caret_scrolling); 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 ReportErrorf(const char *fmt, ...);
void ReportWarningf(const char *fmt, ...); void ReportWarningf(const char *fmt, ...);

View File

@@ -37,16 +37,16 @@ void ReplaceDebugData() {
Scratch scratch; 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); 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); String16 string = ToString16(scratch, s);
ReplaceText(buffer, GetRange(*buffer), string); IKnowWhatImDoing_ReplaceText(buffer, GetRange(*buffer), string);
float xmouse, ymouse; float xmouse, ymouse;
SDL_GetMouseState(&xmouse, &ymouse); SDL_GetMouseState(&xmouse, &ymouse);
Appendf(buffer, "mouse: [%f, %f]\n", xmouse, ymouse); IKnowWhatImDoing_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); IKnowWhatImDoing_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"); IKnowWhatImDoing_Appendf(buffer, "C:/Work/text_editor/src/text_editor/text_editor.cpp\n");
Appendf(buffer, "working dir: %.*s\n", FmtString(WorkingDir)); IKnowWhatImDoing_Appendf(buffer, "working dir: %.*s\n", FmtString(WorkingDir));
Appendf(buffer, "exe dir: %.*s\n", FmtString(ExeDir)); IKnowWhatImDoing_Appendf(buffer, "exe dir: %.*s\n", FmtString(ExeDir));
Appendf(buffer, "config dir: %.*s\n", FmtString(ConfigDir)); IKnowWhatImDoing_Appendf(buffer, "config dir: %.*s\n", FmtString(ConfigDir));
// String view_list = DebugViewList(scratch); // String view_list = DebugViewList(scratch);
// Append(buffer, ToString16(scratch, view_list)); // Append(buffer, ToString16(scratch, view_list));