Console update

This commit is contained in:
krzosa
2025-05-02 22:20:09 +02:00
parent 4871494c50
commit 93c1ba606a
8 changed files with 207 additions and 121 deletions

View File

@@ -90,7 +90,7 @@ void Command_ListBuffers() {
String result = Merge(scratch, strings, "\n"); String result = Merge(scratch, strings, "\n");
String16 string16 = ToString16(scratch, result); String16 string16 = ToString16(scratch, result);
String buffer_name = GetUniqueBufferName(GetDir(main.buffer), "+list_buffers-"); String buffer_name = GetUniqueBufferName(GetDir(main.buffer), "buffer_list");
View *new_view = WindowOpenBufferView(main.window, buffer_name); View *new_view = WindowOpenBufferView(main.window, buffer_name);
Buffer *new_buffer = GetBuffer(new_view->active_buffer); Buffer *new_buffer = GetBuffer(new_view->active_buffer);
new_buffer->gc = true; new_buffer->gc = true;
@@ -133,29 +133,49 @@ void Command_ReplaceWithoutMovingCarets(View *view, Range range, String16 string
AdjustCarets(edits, &caret_copy); AdjustCarets(edits, &caret_copy);
} }
// @todo: revamp interface since it scrolls ALL VIEWS??? or maybe not??
void Command_Append(View *view, String16 string, bool scroll_to_end_if_cursor_on_last_line) { void Command_Append(View *view, String16 string, bool scroll_to_end_if_cursor_on_last_line) {
Scratch scratch;
Buffer *buffer = GetBuffer(view->active_buffer); Buffer *buffer = GetBuffer(view->active_buffer);
bool scroll_to_end = false; struct ViewInfo {
if (scroll_to_end_if_cursor_on_last_line) { View *view;
Int line = PosToLine(buffer, GetFront(view->carets[0])); Array<Caret> carets;
if (line == buffer->line_starts.len - 1) scroll_to_end = true; bool scroll_to_end;
};
Array<ViewInfo> view_info = {scratch};
For (Views) {
View *it_view = GetView(it);
if (it_view->active_buffer != buffer->id) {
continue;
} }
Array<Caret> caret_copy = {}; ViewInfo vi = {it_view};
if (!scroll_to_end) caret_copy = Copy(GetSystemAllocator(), view->carets); if (scroll_to_end_if_cursor_on_last_line) {
defer { Int line = PosToLine(buffer, GetFront(it_view->carets[0]));
if (!scroll_to_end) { if (line == buffer->line_starts.len - 1) {
Dealloc(&view->carets); vi.scroll_to_end = true;
view->carets = caret_copy; }
}
if (!vi.scroll_to_end) {
vi.carets = Copy(GetSystemAllocator(), it_view->carets);
}
Add(&view_info, vi);
} }
};
Command_SelectRangeOneCursor(view, GetEndAsRange(buffer)); Command_SelectRangeOneCursor(view, GetEndAsRange(buffer));
Command_Replace(view, string); Command_Replace(view, string);
if (scroll_to_end) { For (view_info) {
view->carets[0] = MakeCaret(GetEndAsRange(buffer).min); if (it.scroll_to_end) {
it.view->carets[0] = MakeCaret(GetEndAsRange(buffer).min);
} else {
Dealloc(&it.view->carets);
it.view->carets = it.carets;
}
} }
} }

View File

@@ -47,17 +47,64 @@ void Command_GetCFiles(void) {
BSet main = GetActiveMainSet(); BSet main = GetActiveMainSet();
Scratch scratch; Scratch scratch;
String buffer_name = GetUniqueBufferName(GetDir(main.buffer), "+ls-"); String buffer_name = GetUniqueBufferName(GetDir(main.buffer), "getcfiles");
Buffer *buffer = CreateBuffer(GetSystemAllocator(), buffer_name, 4096 * 4); Buffer *buffer = CreateBuffer(GetSystemAllocator(), buffer_name, 4096 * 4);
ListFilesRecursive(buffer, Command_GetDir()); ListFilesRecursive(buffer, Command_GetDir());
WindowOpenBufferView(main.window, buffer_name); WindowOpenBufferView(main.window, buffer_name);
} }
void UpdateScroll(Window *window, bool update_caret_scrolling) {
ProfileFunction();
BSet set = GetBSet(window);
// Scrolling with caret
if (update_caret_scrolling) {
Caret c = set.view->carets[0];
Int front = GetFront(c);
XY xy = PosToXY(set.buffer, front);
Rect2I visible = GetVisibleCells(window);
Vec2I visible_cells = GetSize(visible);
Vec2I visible_size = visible_cells * Vec2I{FontCharSpacing, FontLineSpacing};
Vec2I rect_size = GetSize(window->document_rect);
if (xy.line >= visible.max.y - 2) {
Int set_view_at_line = xy.line - (visible_cells.y - 1);
Int cut_off_y = Max((Int)0, visible_size.y - rect_size.y);
set.view->scroll.y = (set_view_at_line * FontLineSpacing) + cut_off_y;
}
if (xy.line < visible.min.y + 1) {
set.view->scroll.y = xy.line * FontLineSpacing;
}
if (xy.col >= visible.max.x - 1) {
Int set_view_at_line = xy.col - (visible_cells.x - 1);
Int cut_off_x = Max((Int)0, visible_size.x - rect_size.x);
set.view->scroll.x = (set_view_at_line * FontCharSpacing) + cut_off_x;
}
if (xy.col <= visible.min.x) {
set.view->scroll.x = xy.col * FontCharSpacing;
}
}
// Clip scroll
{
Int last_line = LastLine(set.buffer);
set.view->scroll.y = Clamp(set.view->scroll.y, (Int)0, Max((Int)0, (last_line - 1) * FontLineSpacing));
// @note:
// GetCharCountOfLongestLine is a bottleneck, there is probably an algorithm for
// calculating this value incrementally but do we even need X scrollbar or x clipping?
set.view->scroll.x = ClampBottom(set.view->scroll.x, (Int)0);
}
}
static bool update_scroll_memes;
void OnCommand(Event event) { void OnCommand(Event event) {
ProfileFunction(); ProfileFunction();
WindowID start_command_active_window = ActiveWindow;
// //
// Window cursor setting // Window cursor setting
// //
@@ -288,6 +335,12 @@ void OnCommand(Event event) {
} }
} }
if (CtrlPress(SDLK_GRAVE)) {
if (ActiveWindow != NullWindowID) {
ActiveWindow = NullWindowID;
// GetView(NullViewID);
}
}
if (CtrlPress(SDLK_P)) { if (CtrlPress(SDLK_P)) {
Command_ListBuffers(); Command_ListBuffers();
} }
@@ -330,6 +383,9 @@ void OnCommand(Event event) {
void CallOnCommand(Event * event); void CallOnCommand(Event * event);
CallOnCommand(&event); CallOnCommand(&event);
if (event.kind == EVENT_DROP_FILE) { if (event.kind == EVENT_DROP_FILE) {
WindowOpenBufferView(active.window, event.text); WindowOpenBufferView(active.window, event.text);
} }
@@ -562,51 +618,3 @@ void OnCommand(Event event) {
MergeCarets(active.buffer, &active.view->carets); MergeCarets(active.buffer, &active.view->carets);
IF_DEBUG(AssertRanges(active.view->carets)); IF_DEBUG(AssertRanges(active.view->carets));
} }
void UpdateScroll(Window *window, bool update_caret_scrolling) {
ProfileFunction();
BSet set = GetBSet(window);
// Scrolling with caret
if (update_caret_scrolling) {
Caret c = set.view->carets[0];
Int front = GetFront(c);
XY xy = PosToXY(set.buffer, front);
Rect2I visible = GetVisibleCells(window);
Vec2I visible_cells = GetSize(visible);
Vec2I visible_size = visible_cells * Vec2I{FontCharSpacing, FontLineSpacing};
Vec2I rect_size = GetSize(window->document_rect);
if (xy.line >= visible.max.y - 2) {
Int set_view_at_line = xy.line - (visible_cells.y - 1);
Int cut_off_y = Max((Int)0, visible_size.y - rect_size.y);
set.view->scroll.y = (set_view_at_line * FontLineSpacing) + cut_off_y;
}
if (xy.line < visible.min.y + 1) {
set.view->scroll.y = xy.line * FontLineSpacing;
}
if (xy.col >= visible.max.x - 1) {
Int set_view_at_line = xy.col - (visible_cells.x - 1);
Int cut_off_x = Max((Int)0, visible_size.x - rect_size.x);
set.view->scroll.x = (set_view_at_line * FontCharSpacing) + cut_off_x;
}
if (xy.col <= visible.min.x) {
set.view->scroll.x = xy.col * FontCharSpacing;
}
}
// Clip scroll
{
Int last_line = LastLine(set.buffer);
set.view->scroll.y = Clamp(set.view->scroll.y, (Int)0, Max((Int)0, (last_line - 1) * FontLineSpacing));
// @note:
// GetCharCountOfLongestLine is a bottleneck, there is probably an algorithm for
// calculating this value incrementally but do we even need X scrollbar or x clipping?
set.view->scroll.x = ClampBottom(set.view->scroll.x, (Int)0);
}
}

View File

@@ -18,7 +18,7 @@ void Command_ExecInNewBuffer(BSet set, String cmd, String working_dir) {
CheckpointBeforeGoto(set.window); CheckpointBeforeGoto(set.window);
Scratch scratch; Scratch scratch;
String buffer_name = GetUniqueBufferName(working_dir, "+cmd-"); String buffer_name = GetUniqueBufferName(working_dir, "shell_command");
View *view = WindowOpenBufferView(set.window, buffer_name); View *view = WindowOpenBufferView(set.window, buffer_name);
Buffer *buffer = GetBuffer(view->active_buffer); Buffer *buffer = GetBuffer(view->active_buffer);
@@ -38,28 +38,28 @@ View *Command_ExecHidden(String buffer_name, String cmd, String working_dir) {
return view; return view;
} }
BSet Command_BeginConsoleJump() { void Command_BeginConsoleJump(BSet *set) {
BSet main = GetActiveMainSet(); CheckpointBeforeGoto(set->window);
CheckpointBeforeGoto(main.window); set->buffer = GetBuffer(NullBufferID);
main.buffer = GetBuffer(NullBufferID); set->view = WindowOpenBufferView(set->window, set->buffer->name);
main.view = WindowOpenBufferView(main.window, main.buffer->name);
return main;
} }
void Command_EndConsoleJump(BSet main) { void Command_EndConsoleJump(BSet set) {
Int pos = XYToPos(main.buffer, {0, main.buffer->line_starts.len - 1}); Int pos = XYToPos(set.buffer, {0, set.buffer->line_starts.len - 1});
main.view->carets[0] = MakeCaret(pos); set.view->carets[0] = MakeCaret(pos);
UpdateScroll(main.window, true); UpdateScroll(set.window, true);
ActiveWindow = main.window->id;
} }
void Command_Exec(String cmd, String working_dir) { BSet Command_Exec(String cmd, String working_dir) {
BSet set = Command_BeginConsoleJump(); BSet set = GetActiveMainSet();
Command_BeginConsoleJump(&set);
Exec(set.view->id, true, cmd, working_dir); Exec(set.view->id, true, cmd, working_dir);
Command_EndConsoleJump(set); Command_EndConsoleJump(set);
ActiveWindow = set.window->id;
return set;
} }
void Command_Open(String path) { BSet Command_Open(String path) {
Scratch scratch; Scratch scratch;
lua_getglobal(LuaState, "ApplyRules"); lua_getglobal(LuaState, "ApplyRules");
@@ -68,7 +68,7 @@ void Command_Open(String path) {
const char *error_message = lua_tostring(LuaState, -1); const char *error_message = lua_tostring(LuaState, -1);
ReportWarningf("Failed the call to ApplyRules! %s", error_message); ReportWarningf("Failed the call to ApplyRules! %s", error_message);
lua_pop(LuaState, 1); lua_pop(LuaState, 1);
return; return {};
} }
BSet main = GetActiveMainSet(); BSet main = GetActiveMainSet();
@@ -81,12 +81,13 @@ void Command_Open(String path) {
Int col = strtoll(col_string.data, NULL, 10); Int col = strtoll(col_string.data, NULL, 10);
if (IsDir(file_path)) { if (IsDir(file_path)) {
BSet set = Command_BeginConsoleJump(); Command_BeginConsoleJump(&main);
Command_Appendf(set.view, "%.*s..\n", FmtString(file_path)); Command_Appendf(main.view, "%.*s/..\n", FmtString(file_path));
for (FileIter it = IterateFiles(scratch, file_path); IsValid(it); Advance(&it)) { for (FileIter it = IterateFiles(scratch, file_path); IsValid(it); Advance(&it)) {
Command_Appendf(set.view, "%.*s\n", FmtString(it.absolute_path)); Command_Appendf(main.view, "%.*s\n", FmtString(it.absolute_path));
} }
Command_EndConsoleJump(set); Command_EndConsoleJump(main);
ActiveWindow = main.window->id;
} else { } else {
CheckpointBeforeGoto(main.window); CheckpointBeforeGoto(main.window);
View *view = WindowOpenBufferView(main.window, file_path); View *view = WindowOpenBufferView(main.window, file_path);
@@ -110,6 +111,8 @@ void Command_Open(String path) {
} else { } else {
ReportWarningf("Failed to match any of ApplyRules results!"); ReportWarningf("Failed to match any of ApplyRules results!");
} }
return main;
} }
void Command_Open(String16 path) { void Command_Open(String16 path) {
@@ -174,19 +177,19 @@ int Lua_Cmd(lua_State *L) {
String destination = lua_tostring(L, -1); String destination = lua_tostring(L, -1);
lua_pop(L, 1); lua_pop(L, 1);
BSet active = GetActiveMainSet();
BSet set = {}; BSet set = {};
if (destination == "next") { if (destination == "console") {
Window *next_window = GetNextLayoutWindow(active.window); set = GetConsoleSet();
set = GetBSet(next_window);
} else if (destination == "3") {
Window *next_window = GetLayoutWindow(2);
if (!next_window) next_window = active.window;
set = GetBSet(next_window);
} else { } else {
set = active; set = GetActiveMainSet();
}
Command_BeginConsoleJump(&set);
Exec(set.view->id, true, cmd, working_dir);
Command_EndConsoleJump(set);
if (destination != "console") {
ActiveWindow = set.window->id;
} }
Command_ExecInNewBuffer(set, cmd, working_dir);
return 0; return 0;
} }
@@ -245,9 +248,8 @@ int Lua_Open(lua_State *L) {
} }
int Lua_SetProjectFile(lua_State *L) { int Lua_SetProjectFile(lua_State *L) {
String name = luaL_checkstring(L, 1); BSet set = GetActiveMainSet();
lua_pop(L, 1); LuaProjectBuffer = set.buffer;
LuaProjectBuffer = BufferOpenFile(name);
LuaProjectBuffer->user_change_id = -1; LuaProjectBuffer->user_change_id = -1;
return 0; return 0;
} }
@@ -272,7 +274,6 @@ int Lua_GetBufferList(lua_State *L) {
int i = 1; int i = 1;
For(Buffers) { For(Buffers) {
if (StartsWith(it.o->name, "+titlebar")) continue;
lua_pushinteger(L, i++); lua_pushinteger(L, i++);
lua_pushlstring(L, it.o->name.data, it.o->name.len); lua_pushlstring(L, it.o->name.data, it.o->name.len);
lua_settable(L, -3); /* 3rd element from the stack top */ lua_settable(L, -3); /* 3rd element from the stack top */

View File

@@ -8,11 +8,15 @@ Array<WindowID> Windows;
BufferID NullBufferID; // +buffer BufferID NullBufferID; // +buffer
ViewID NullViewID; ViewID NullViewID;
WindowID NullWindowID;
Int NullWindowSize = 5;
WindowID DebugWindowID; // +debug WindowID DebugWindowID; // +debug
BufferID DebugBufferID; BufferID DebugBufferID;
WindowID ActiveWindow; WindowID ActiveWindow;
WindowID ActiveWindowCounterID;
Int ActiveWindowCounter;
WindowID ScrollbarSelected = {-1}; WindowID ScrollbarSelected = {-1};
WindowID DocumentSelected = {-1}; WindowID DocumentSelected = {-1};
@@ -22,6 +26,7 @@ Buffer *LuaProjectBuffer;
Buffer *LuaConfigBuffer; Buffer *LuaConfigBuffer;
Buffer *GCInfoBuffer; Buffer *GCInfoBuffer;
Buffer *EventBuffer; Buffer *EventBuffer;
Buffer *ScratchBuffer;
RandomSeed UniqueBufferNameSeed = {}; RandomSeed UniqueBufferNameSeed = {};
String GetUniqueBufferName(String working_dir, String prepend_name) { String GetUniqueBufferName(String working_dir, String prepend_name) {
@@ -44,7 +49,9 @@ void InitScratchBuffer() {
GCInfoBuffer = CreateBuffer(sys_allocator, GetUniqueBufferName(WorkingDir, "gc")); GCInfoBuffer = CreateBuffer(sys_allocator, GetUniqueBufferName(WorkingDir, "gc"));
EventBuffer = CreateBuffer(sys_allocator, GetUniqueBufferName(WorkingDir, "events")); EventBuffer = CreateBuffer(sys_allocator, GetUniqueBufferName(WorkingDir, "events"));
ScratchBuffer = CreateBuffer(sys_allocator, GetUniqueBufferName(WorkingDir, "scratch"));
EventBuffer->no_history = true; EventBuffer->no_history = true;
GCInfoBuffer->no_history = true;
} }
inline bool IsDocumentSelectionValid() { inline bool IsDocumentSelectionValid() {
@@ -231,6 +238,14 @@ BSet GetActiveMainSet() {
return GetBSet(window); return GetBSet(window);
} }
BSet GetConsoleSet() {
BSet result = {};
result.window = GetWindow(NullWindowID);
result.view = GetView(NullViewID);
result.buffer = GetBuffer(NullBufferID);
return result;
}
BSet GetActiveTitleSet() { BSet GetActiveTitleSet() {
Window *window = GetWindow(ActiveWindow); Window *window = GetWindow(ActiveWindow);
if (!window->is_title_bar) window = GetWindow(window->title_bar_window); if (!window->is_title_bar) window = GetWindow(window->title_bar_window);
@@ -338,13 +353,7 @@ Buffer *BufferOpenFile(String path) {
if (!FileExists(path)) { if (!FileExists(path)) {
buffer = CreateBuffer(sys_allocator, path); buffer = CreateBuffer(sys_allocator, path);
} else if (IsDir(path)) { } else if (IsDir(path)) {
String buffer_name = GetUniqueBufferName(path, "+dir-"); Assert(!"Invalid codepath");
buffer = CreateBuffer(sys_allocator, buffer_name, 4096 * 2);
RawAppendf(buffer, "..\n");
for (FileIter it = IterateFiles(scratch, path); IsValid(it); Advance(&it)) {
RawAppendf(buffer, "%.*s\n", FmtString(it.filename));
}
} else { } else {
String string = ReadFile(scratch, path); String string = ReadFile(scratch, path);
buffer = CreateBuffer(sys_allocator, path, string.len * 4 + 4096); buffer = CreateBuffer(sys_allocator, path, string.len * 4 + 4096);

View File

@@ -67,6 +67,7 @@ void FillEventWithBasicData(Event *event) {
SDL_GetWindowSize(SDLWindow, &xwindow, &ywindow); SDL_GetWindowSize(SDLWindow, &xwindow, &ywindow);
event->xwindow = xwindow; event->xwindow = xwindow;
event->ywindow = ywindow; event->ywindow = ywindow;
event->text = "";
} }
Event TranslateSDLEvent(SDL_Event *input_event) { Event TranslateSDLEvent(SDL_Event *input_event) {
@@ -220,11 +221,14 @@ Array<Event> GetEventsForFrame(Allocator allocator) {
} }
void Windows_SetupVCVarsall(mco_coro *co) { void Windows_SetupVCVarsall(mco_coro *co) {
View *view = NULL;
{
Scratch scratch; Scratch scratch;
String working_dir = Command_GetDir(); String working_dir = Command_GetDir();
String buffer_name = GetUniqueBufferName(working_dir, "+cmd-"); String buffer_name = GetUniqueBufferName(working_dir, "+cmd-");
String cmd = Format(scratch, "\"%.*s\" && set", FmtString(StyleVCVarsall)); String cmd = Format(scratch, "\"%.*s\" && set", FmtString(StyleVCVarsall));
View *view = Command_ExecHidden(buffer_name, cmd, working_dir); view = Command_ExecHidden(buffer_name, cmd, working_dir);
}
for (;;) { for (;;) {
if (!ProcessIsActive(view->id)) { if (!ProcessIsActive(view->id)) {
break; break;
@@ -232,6 +236,7 @@ void Windows_SetupVCVarsall(mco_coro *co) {
Yield(co); Yield(co);
} }
Scratch scratch;
Buffer *buffer = GetBuffer(view->active_buffer); Buffer *buffer = GetBuffer(view->active_buffer);
String16 string16 = GetString(buffer); String16 string16 = GetString(buffer);
String string = ToString(scratch, string16); String string = ToString(scratch, string16);

View File

@@ -82,7 +82,7 @@ float DPIScale = 1.0f;
Rect2I GetVisibleCells(Window *window); Rect2I GetVisibleCells(Window *window);
void AfterEdit(View *view, Array<Edit> edits); void AfterEdit(View *view, Array<Edit> edits);
Scroller ComputeScrollerRect(Window *window); Scroller ComputeScrollerRect(Window *window);
void Command_Open(String path); BSet Command_Open(String path);
void Command_Open(String16 path); void Command_Open(String16 path);
void UpdateScroll(Window *window, bool update_caret_scrolling); void UpdateScroll(Window *window, bool update_caret_scrolling);

View File

@@ -1,5 +1,8 @@
!!As little lua code as possible, but lua code should be powerful just in case of quick edits !!As little lua code as possible, but lua code should be powerful just in case of quick edits
- maybe we could allow user to change window titles which would make them special in some way. A:/text_editor/+test_buffer:1:1:ADE | - maybe we could allow user to change window titles which would make them special in some way. A:/text_editor/+test_buffer:1:1:ADE |
- Windows, Buffers, Views should not be in a dynamic list it risks memory errors. Should be instead in a Double linked list, any freeing should happen at GC stage
- Fix B: not opening
- Scroll the console properly
-------------- --------------
buffer = make_buffer() buffer = make_buffer()
@@ -7,6 +10,7 @@ buffer.append(list_files("src/basic"))
activate_buffer activate_buffer
-------------- --------------
- shift down on last line should move the cursor to end of line!!! same for up
- maybe most of the bindings should be in lua, but actual code in C - maybe most of the bindings should be in lua, but actual code in C
- LoadWord, EncloseWord configurable? - LoadWord, EncloseWord configurable?
- dump text editor state to file, restore state - dump text editor state to file, restore state

View File

@@ -109,7 +109,7 @@ Int GetTitleBarSize(Window *window) {
void AddColumnWindow() { void AddColumnWindow() {
Window *window = CreateWindow(); Window *window = CreateWindow();
window->is_column = true; window->is_column = true;
View *view = OpenBufferView("+scratch"); View *view = OpenBufferView(ScratchBuffer->name);
window->active_view = view->id; window->active_view = view->id;
CreateTitlebar(window->id); CreateTitlebar(window->id);
CreateSearchBar(window->id); CreateSearchBar(window->id);
@@ -127,7 +127,7 @@ Int GetWindowIndex(WindowID window_id) {
void AddRowWindow() { void AddRowWindow() {
Window *active_window = GetActiveWindow(); Window *active_window = GetActiveWindow();
Window *window = CreateWindow(); Window *window = CreateWindow();
View *view = OpenBufferView("+scratch"); View *view = OpenBufferView(ScratchBuffer->name);
window->active_view = view->id; window->active_view = view->id;
CreateTitlebar(window->id); CreateTitlebar(window->id);
CreateSearchBar(window->id); CreateSearchBar(window->id);
@@ -215,6 +215,18 @@ void InitWindows() {
{ {
Window *window = CreateWindow(); Window *window = CreateWindow();
window->active_view = NullViewID;
Assert(NullWindowID.id == 0);
// @todo - Windows, Buffers, Views should not be in a dynamic list it risks memory errors. Should be instead in a Double linked list, any freeing should happen at GC stage
WindowID id = window->id;
CreateTitlebar(id);
CreateSearchBar(id);
}
{
Window *window = CreateWindow();
// @todo - Windows, Buffers, Views should not be in a dynamic list it risks memory errors. Should be instead in a Double linked list, any freeing should happen at GC stage
WindowID window_id = window->id; WindowID window_id = window->id;
window->is_column = true; window->is_column = true;
Buffer *buffer = CreateBuffer(sys_allocator, GetUniqueBufferName(WorkingDir, "test_buffer")); Buffer *buffer = CreateBuffer(sys_allocator, GetUniqueBufferName(WorkingDir, "test_buffer"));
@@ -223,10 +235,14 @@ void InitWindows() {
window->active_view = view->id; window->active_view = view->id;
CreateTitlebar(window_id); CreateTitlebar(window_id);
CreateSearchBar(window->id); CreateSearchBar(window->id);
ActiveWindow = ActiveWindowCounterID = window_id;
} }
{ {
Window *window = CreateWindow(); Window *window = CreateWindow();
// @todo - Windows, Buffers, Views should not be in a dynamic list it risks memory errors. Should be instead in a Double linked list, any freeing should happen at GC stage
WindowID window_id = window->id; WindowID window_id = window->id;
DebugWindowID = window->id; DebugWindowID = window->id;
window->draw_line_numbers = false; window->draw_line_numbers = false;
@@ -249,20 +265,43 @@ void InitWindows() {
SetVisibility(window_id, false); SetVisibility(window_id, false);
} }
ActiveWindow = {0};
} }
void void LayoutWindows(int16_t wx, int16_t wy) {
LayoutWindows(int16_t wx, int16_t wy) {
float ScrollBarSize = (10.f * DPIScale); float ScrollBarSize = (10.f * DPIScale);
Rect2I screen_rect = RectI0Size(wx, wy); Rect2I screen_rect = RectI0Size(wx, wy);
float line_numbers_size = (float)FontCharSpacing * 10; float line_numbers_size = (float)FontCharSpacing * 10;
float sizex = (float)GetSize(screen_rect).x; float sizex = (float)GetSize(screen_rect).x;
{
Window *window = GetWindow(NullWindowID);
if (ActiveWindow == window->id) {
NullWindowSize = 20;
} else {
NullWindowSize = 5;
}
Rect2I rect = CutBottom(&screen_rect, FontLineSpacing*NullWindowSize);
Window *title_bar_window = GetWindow(window->title_bar_window);
title_bar_window->total_rect = CutBottom(&window->total_rect, GetTitleBarSize(title_bar_window));
title_bar_window->document_rect = title_bar_window->total_rect;
Rect2I save_rect = window->document_rect;
CutLeft(&save_rect, GetSize(save_rect).x/2);
Window *search_bar_window = GetWindow(window->search_bar_window);
search_bar_window->total_rect = CutTop(&save_rect, GetTitleBarSize(search_bar_window));
search_bar_window->document_rect = search_bar_window->total_rect;
window->document_rect = window->total_rect;
if (window->draw_scrollbar) window->scrollbar_rect = CutRight(&window->document_rect, (Int)ScrollBarSize);
if (window->draw_line_numbers) window->line_numbers_rect = CutLeft(&window->document_rect, (Int)line_numbers_size);
window->total_rect = rect;
}
Scratch scratch; Scratch scratch;
Array<VisualColumn> columns = GetVisualColumns(scratch); Array<VisualColumn> columns = GetVisualColumns(scratch);
float delta_column = 1.0f / (float)columns.len; float delta_column = 1.0f / (float)columns.len;
ForItem(col, columns) { ForItem(col, columns) {
Int add = 0; Int add = 0;