Console update
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user