Bring back status bar with new design, fixing bugs
This commit is contained in:
@@ -323,10 +323,6 @@ function MatchGotoBuild(s, meta)
|
||||
end
|
||||
|
||||
function MatchExec(s, meta)
|
||||
if meta ~= "exec" then
|
||||
return nil
|
||||
end
|
||||
|
||||
if s:match(".exe$") or s:match(".bat$") or s:match(".sh$") then
|
||||
return {kind = "exec_console", cmd = s, working_dir = GetMainDir()}
|
||||
end
|
||||
|
||||
@@ -13,7 +13,6 @@ Needs to change:
|
||||
- How to design Command view?
|
||||
- How to design popup view (input field)?
|
||||
- How to design search view? or search and replace view?
|
||||
- Window management, splitting, GC
|
||||
|
||||
Things I like:
|
||||
- Basic editing
|
||||
|
||||
@@ -642,7 +642,7 @@ void SaveBuffer(Buffer *buffer) {
|
||||
}
|
||||
}
|
||||
void Command_Save() {
|
||||
BSet set = GetActiveMainSet();
|
||||
BSet set = GetLastActiveLayoutSet();
|
||||
SaveBuffer(set.buffer);
|
||||
}
|
||||
int Lua_Save(lua_State *L) {
|
||||
@@ -889,7 +889,7 @@ void ReopenBuffer(Buffer *buffer) {
|
||||
}
|
||||
|
||||
void Command_Reopen() {
|
||||
BSet set = GetActiveMainSet();
|
||||
BSet set = GetLastActiveLayoutSet();
|
||||
ReopenBuffer(set.buffer);
|
||||
ActiveWindow = set.window->id;
|
||||
}
|
||||
@@ -917,7 +917,7 @@ void New(Window *window, String name = "") {
|
||||
}
|
||||
|
||||
void Command_New(String name = "") {
|
||||
BSet main = GetActiveMainSet();
|
||||
BSet main = GetLastActiveLayoutSet();
|
||||
New(main.window, name);
|
||||
}
|
||||
|
||||
@@ -950,7 +950,7 @@ void NewDir(Window *window, String name = "") {
|
||||
int Lua_NewDir(lua_State *L) {
|
||||
String name = lua_tostring(L, 1);
|
||||
lua_pop(L, 1);
|
||||
BSet main = GetActiveMainSet();
|
||||
BSet main = GetLastActiveLayoutSet();
|
||||
NewDir(main.window, name);
|
||||
return 0;
|
||||
}
|
||||
@@ -996,7 +996,7 @@ void ListFilesRecursive(Buffer *buffer, String dir) {
|
||||
}
|
||||
|
||||
void Command_ListCode(String dir = WorkDir) {
|
||||
BSet main = GetActiveMainSet();
|
||||
BSet main = GetLastActiveLayoutSet();
|
||||
JumpGarbageBuffer(&main);
|
||||
ListFilesRecursive(main.buffer, dir);
|
||||
main.view->fuzzy_search = true;
|
||||
@@ -1021,7 +1021,7 @@ View *Command_ExecHidden(String buffer_name, String cmd, String working_dir) {
|
||||
}
|
||||
|
||||
BSet Command_Exec(String cmd, String working_dir, bool set_active = true) {
|
||||
BSet set = GetActiveMainSet();
|
||||
BSet set = GetLastActiveLayoutSet();
|
||||
if (set_active) ActiveWindow = set.window->id;
|
||||
JumpGarbageBuffer(&set);
|
||||
Exec(set.view->id, true, cmd, working_dir);
|
||||
@@ -1080,7 +1080,7 @@ BSet Command_Open(Window *window, String path, String meta, bool set_active = tr
|
||||
}
|
||||
|
||||
BSet Command_Open(String path, String meta) {
|
||||
BSet main = GetActiveMainSet();
|
||||
BSet main = GetLastActiveLayoutSet();
|
||||
main = Command_Open(main.window, path, meta);
|
||||
return main;
|
||||
}
|
||||
@@ -1119,7 +1119,7 @@ int Lua_Cmd(lua_State *L) {
|
||||
String kind = lua_tostring(L, -1);
|
||||
lua_pop(L, 1);
|
||||
|
||||
BSet main = GetActiveMainSet();
|
||||
BSet main = GetLastActiveLayoutSet();
|
||||
if (kind == "console") {
|
||||
BSet set = GetConsoleSet();
|
||||
Command_SelectRangeOneCursor(set.view, MakeRange(set.buffer->len));
|
||||
@@ -1141,7 +1141,7 @@ int Lua_Cmd(lua_State *L) {
|
||||
}
|
||||
|
||||
void Command_ListBuffers() {
|
||||
BSet main = GetActiveMainSet();
|
||||
BSet main = GetLastActiveLayoutSet();
|
||||
ActiveWindow = main.window->id;
|
||||
JumpGarbageBuffer(&main);
|
||||
For(Buffers) {
|
||||
@@ -1158,7 +1158,7 @@ int Lua_ListBuffers(lua_State *L) {
|
||||
}
|
||||
|
||||
void Command_ListViews() {
|
||||
BSet main = GetActiveMainSet();
|
||||
BSet main = GetLastActiveLayoutSet();
|
||||
ActiveWindow = main.window->id;
|
||||
JumpGarbageBuffer(&main);
|
||||
For(Views) {
|
||||
@@ -1200,7 +1200,7 @@ void SetProjectFile(Buffer *buffer) {
|
||||
}
|
||||
|
||||
int Lua_SetProjectFile(lua_State *L) {
|
||||
BSet set = GetActiveMainSet();
|
||||
BSet set = GetLastActiveLayoutSet();
|
||||
SetProjectFile(set.buffer);
|
||||
return 0;
|
||||
}
|
||||
@@ -1208,7 +1208,7 @@ int Lua_SetProjectFile(lua_State *L) {
|
||||
int Lua_SetWorkDir(lua_State *L) {
|
||||
String dir = lua_tostring(L, -1);
|
||||
if (dir.len == 0) {
|
||||
BSet set = GetActiveMainSet();
|
||||
BSet set = GetLastActiveLayoutSet();
|
||||
WorkDir = ChopLastSlash(set.buffer->name);
|
||||
} else {
|
||||
WorkDir = dir;
|
||||
@@ -1217,7 +1217,7 @@ int Lua_SetWorkDir(lua_State *L) {
|
||||
}
|
||||
|
||||
int Lua_ListCommands(lua_State *L) {
|
||||
BSet main = GetActiveMainSet();
|
||||
BSet main = GetLastActiveLayoutSet();
|
||||
Command_BeginJump(&main);
|
||||
for (int i = 0; LuaFunctions[i].name != NULL; i += 1) {
|
||||
Command_Appendf(main.view, "%20s() ", LuaFunctions[i].name);
|
||||
|
||||
@@ -266,7 +266,7 @@ void OnCommand(Event event) {
|
||||
}
|
||||
|
||||
if (CtrlPress(SDLK_W)) {
|
||||
BSet main = GetActiveMainSet();
|
||||
BSet main = GetLastActiveLayoutSet();
|
||||
main.window->kill = true;
|
||||
}
|
||||
|
||||
@@ -308,7 +308,7 @@ void OnCommand(Event event) {
|
||||
}
|
||||
}
|
||||
|
||||
BSet main = GetActiveMainSet();
|
||||
BSet main = GetLastActiveLayoutSet();
|
||||
BSet active = GetActiveSet();
|
||||
Int buffer_change_id = active.buffer->change_id;
|
||||
|
||||
@@ -529,6 +529,11 @@ void OnCommand(Event event) {
|
||||
}
|
||||
}
|
||||
|
||||
if (CtrlPress(SDLK_F)) {
|
||||
Window *window = GetWindow(SearchBarWindowID);
|
||||
window->visible = !window->visible;
|
||||
}
|
||||
|
||||
// if (CtrlPress(SDLK_N)) {
|
||||
// Command_New();
|
||||
// }
|
||||
|
||||
@@ -324,10 +324,6 @@ function MatchGotoBuild(s, meta)
|
||||
end
|
||||
|
||||
function MatchExec(s, meta)
|
||||
if meta ~= "exec" then
|
||||
return nil
|
||||
end
|
||||
|
||||
if s:match(".exe$") or s:match(".bat$") or s:match(".sh$") then
|
||||
return {kind = "exec_console", cmd = s, working_dir = GetMainDir()}
|
||||
end
|
||||
|
||||
@@ -24,7 +24,7 @@ int Lua_Print(lua_State *L) {
|
||||
}
|
||||
|
||||
int Lua_Kill(lua_State *L) {
|
||||
BSet main = GetActiveMainSet();
|
||||
BSet main = GetLastActiveLayoutSet();
|
||||
KillProcess(main.view);
|
||||
return 0;
|
||||
}
|
||||
@@ -52,7 +52,7 @@ int Lua_BufferExists(lua_State *L) {
|
||||
|
||||
int Lua_GetSelection(lua_State *L) {
|
||||
Scratch scratch;
|
||||
BSet main = GetActiveMainSet();
|
||||
BSet main = GetLastActiveLayoutSet();
|
||||
String16 string16 = GetString(main.buffer, main.view->carets[0].range);
|
||||
String string = ToString(scratch, string16);
|
||||
lua_pushlstring(L, string.data, string.len);
|
||||
@@ -61,7 +61,7 @@ int Lua_GetSelection(lua_State *L) {
|
||||
|
||||
int Lua_GetEntireBuffer(lua_State *L) {
|
||||
Scratch scratch;
|
||||
BSet main = GetActiveMainSet();
|
||||
BSet main = GetLastActiveLayoutSet();
|
||||
String16 string16 = GetString(main.buffer);
|
||||
String string = ToString(scratch, string16);
|
||||
lua_pushlstring(L, string.data, string.len);
|
||||
@@ -76,13 +76,13 @@ int Lua_GetClipboard(lua_State *L) {
|
||||
}
|
||||
|
||||
int Lua_GetFilename(lua_State *L) {
|
||||
BSet main = GetActiveMainSet();
|
||||
BSet main = GetLastActiveLayoutSet();
|
||||
lua_pushlstring(L, main.buffer->name.data, main.buffer->name.len);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int Lua_GetLine(lua_State *L) {
|
||||
BSet main = GetActiveMainSet();
|
||||
BSet main = GetLastActiveLayoutSet();
|
||||
Caret caret = main.view->carets[0];
|
||||
Int front = GetFront(caret);
|
||||
Int line = PosToLine(main.buffer, front);
|
||||
@@ -117,7 +117,7 @@ int Lua_GetMainDir(lua_State *L) {
|
||||
}
|
||||
|
||||
int Lua_KillWindow(lua_State *L) {
|
||||
BSet set = GetActiveMainSet();
|
||||
BSet set = GetLastActiveLayoutSet();
|
||||
set.window->kill = true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -15,9 +15,13 @@ WindowID DebugWindowID;
|
||||
ViewID DebugViewID;
|
||||
BufferID DebugBufferID;
|
||||
|
||||
WindowID BarWindowID;
|
||||
WindowID StatusBarWindowID;
|
||||
WindowID SearchBarWindowID;
|
||||
ViewID SearchViewID;
|
||||
BufferID SearchBufferID;
|
||||
|
||||
WindowID ActiveWindow;
|
||||
WindowID LastActiveLayoutWindowID;
|
||||
WindowID ScrollbarSelected = {-1};
|
||||
WindowID DocumentSelected = {-1};
|
||||
WindowID ResizerSelected = {-1};
|
||||
@@ -151,40 +155,13 @@ Window *CreateWind() {
|
||||
w->layout = true;
|
||||
w->draw_scrollbar = StyleDrawScrollbar;
|
||||
w->draw_line_numbers = StyleDrawLineNumbers;
|
||||
w->draw_line_highlight = true;
|
||||
w->id = AllocWindowID(w);
|
||||
w->weight = 1.0;
|
||||
Add(&Windows, w);
|
||||
return w;
|
||||
}
|
||||
|
||||
void DestroyWindow(Window *window) {
|
||||
// Allocator allocator = GetSystemAllocator();
|
||||
// window->kill = true;
|
||||
// Window *split = window;
|
||||
// if (split && split->parent) {
|
||||
// Assert(split->kind == WindowSplitKind_Window);
|
||||
|
||||
// WindowSplit *p = split->parent;
|
||||
// WindowSplit *pp = p->parent;
|
||||
// WindowSplit *other = p->left == split ? p->right : p->left;
|
||||
|
||||
// if (pp) {
|
||||
// if (pp->left == p) {
|
||||
// pp->left = other;
|
||||
// } else {
|
||||
// pp->right = other;
|
||||
// }
|
||||
// other->parent = pp;
|
||||
// }
|
||||
|
||||
// Dealloc(allocator, p);
|
||||
// Dealloc(allocator, split);
|
||||
// }
|
||||
|
||||
|
||||
// Dealloc(allocator, window);
|
||||
}
|
||||
|
||||
View *CreateView(BufferID active_buffer) {
|
||||
Allocator al = GetSystemAllocator();
|
||||
View *view = AllocType(al, View);
|
||||
@@ -265,21 +242,13 @@ BSet GetBSet(WindowID window_id) {
|
||||
return result;
|
||||
}
|
||||
|
||||
BSet GetMainSet(Window *window) {
|
||||
BSet result = GetBSet(window);
|
||||
return result;
|
||||
}
|
||||
|
||||
BSet GetActiveSet() {
|
||||
Window *window = GetWindow(ActiveWindow);
|
||||
return GetBSet(window);
|
||||
}
|
||||
|
||||
BSet GetActiveMainSet() {
|
||||
Window *window = GetWindow(ActiveWindow);
|
||||
// if (window->is_title_bar) window = GetWindow(window->title_bar_window);
|
||||
// if (window->is_search_bar) window = GetWindow(window->search_bar_window);
|
||||
return GetBSet(window);
|
||||
BSet GetLastActiveLayoutSet() {
|
||||
return GetBSet(LastActiveLayoutWindowID);
|
||||
}
|
||||
|
||||
BSet GetConsoleSet() {
|
||||
@@ -291,7 +260,7 @@ BSet GetConsoleSet() {
|
||||
}
|
||||
|
||||
String Command_GetFilename() {
|
||||
BSet set = GetActiveMainSet();
|
||||
BSet set = GetLastActiveLayoutSet();
|
||||
return set.buffer->name;
|
||||
}
|
||||
|
||||
@@ -301,7 +270,7 @@ String GetDir(Buffer *buffer) {
|
||||
}
|
||||
|
||||
String Command_GetMainDir() {
|
||||
BSet set = GetActiveMainSet();
|
||||
BSet set = GetLastActiveLayoutSet();
|
||||
String name = ChopLastSlash(set.buffer->name);
|
||||
return name;
|
||||
}
|
||||
@@ -437,6 +406,14 @@ bool BufferIsReferenced(BufferID buffer_id) {
|
||||
|
||||
void GarbageCollect() {
|
||||
Allocator sys_allocator = GetSystemAllocator();
|
||||
|
||||
if (ActiveWindow.id != LastActiveLayoutWindowID.id) {
|
||||
Window *window = GetWindow(ActiveWindow);
|
||||
if (window->layout) {
|
||||
LastActiveLayoutWindowID = ActiveWindow;
|
||||
}
|
||||
}
|
||||
|
||||
For(Buffers) {
|
||||
if (it->file_mod_time) {
|
||||
int64_t new_file_mod_time = GetFileModTime(it->name);
|
||||
@@ -484,8 +461,8 @@ void GarbageCollect() {
|
||||
IterRemove(Windows) {
|
||||
IterRemovePrepare(Windows);
|
||||
if (it->kill) {
|
||||
DestroyWindow(it);
|
||||
remove_item = true;
|
||||
}
|
||||
Dealloc(sys_allocator, it);
|
||||
remove_item = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -249,8 +249,9 @@ void Update(Event event) {
|
||||
UpdateProcesses();
|
||||
CoUpdate(&event);
|
||||
ReloadLuaConfigs();
|
||||
CallLuaOnUpdate(&event);
|
||||
StatusBarUpdate();
|
||||
UpdateDebugBuffer();
|
||||
CallLuaOnUpdate(&event);
|
||||
GarbageCollect();
|
||||
|
||||
For(IterateInReverse(&order)) {
|
||||
|
||||
@@ -16,14 +16,6 @@ struct View {
|
||||
String16 prev_search_line;
|
||||
};
|
||||
|
||||
enum WindowKind {
|
||||
WindowKind_None,
|
||||
WindowKind_Root,
|
||||
WindowKind_Leaf,
|
||||
WindowKind_SplitHori,
|
||||
WindowKind_SplitVerti,
|
||||
};
|
||||
|
||||
struct Window {
|
||||
WindowID id;
|
||||
ViewID active_view;
|
||||
@@ -34,15 +26,17 @@ struct Window {
|
||||
Rect2I line_numbers_rect;
|
||||
Rect2I resizer_rect;
|
||||
|
||||
Font *font;
|
||||
Font *font;
|
||||
double mouse_scroller_offset;
|
||||
int z;
|
||||
double weight;
|
||||
Int offset_resizer;
|
||||
Int status_bar_last_buffer_change_id;
|
||||
|
||||
struct {
|
||||
bool draw_scrollbar : 1;
|
||||
bool draw_line_numbers : 1;
|
||||
bool draw_darker : 1;
|
||||
bool draw_line_highlight : 1;
|
||||
bool visible : 1;
|
||||
bool layout : 1;
|
||||
bool kill : 1;
|
||||
|
||||
@@ -5,7 +5,7 @@ void UpdateDebugBuffer() {
|
||||
View *view = GetView(window->active_view);
|
||||
if (view->active_buffer.id == buffer->id.id) return;
|
||||
|
||||
BSet main = GetActiveMainSet();
|
||||
BSet main = GetLastActiveLayoutSet();
|
||||
|
||||
Scratch scratch;
|
||||
String s = Format(scratch, "wid: %d\nvid: %d\nbid: %d\nframe: %lld\n", (int)main.window->id.id, (int)main.view->id.id, (int)main.buffer->id.id, (long long)FrameID);
|
||||
@@ -40,3 +40,74 @@ void UpdateDebugBuffer() {
|
||||
RawAppendf(buffer, "int changed_on_disk = %d\n", main.buffer->changed_on_disk);
|
||||
RawAppendf(buffer, "int garbage = %d\n", main.buffer->garbage);
|
||||
}
|
||||
|
||||
void StatusBarUpdate() {
|
||||
Window *status_bar_window = GetWindow(StatusBarWindowID, NULL);
|
||||
if (status_bar_window == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
Scratch scratch;
|
||||
BSet main = GetLastActiveLayoutSet();
|
||||
BSet title = GetBSet(status_bar_window);
|
||||
title.view->scroll.y = 0;
|
||||
|
||||
String16 buffer_string = GetString(title.buffer);
|
||||
Range replace_range = {0, title.buffer->len};
|
||||
bool found_separator = Seek(buffer_string, u" |", &replace_range.max);
|
||||
|
||||
// Parse the title and line
|
||||
if (title.window->id == ActiveWindow) {
|
||||
if (title.buffer->change_id == title.window->status_bar_last_buffer_change_id) {
|
||||
return;
|
||||
}
|
||||
String16 buffer_name = GetString(title.buffer, replace_range);
|
||||
buffer_name = Skip(buffer_name, 1);
|
||||
buffer_name = Trim(buffer_name);
|
||||
|
||||
Int column = ChopNumber(&buffer_name);
|
||||
if (column == -1) return;
|
||||
|
||||
Int line = ChopNumber(&buffer_name);
|
||||
if (line == -1) {
|
||||
line = column;
|
||||
column = 0;
|
||||
}
|
||||
|
||||
Int buffer_pos = XYToPos(main.buffer, {column, line});
|
||||
Caret &caret = main.view->carets[0];
|
||||
if (GetFront(caret) != buffer_pos) {
|
||||
caret = MakeCaret(buffer_pos);
|
||||
}
|
||||
title.window->status_bar_last_buffer_change_id = title.buffer->change_id;
|
||||
return;
|
||||
}
|
||||
|
||||
Caret caret = main.view->carets[0];
|
||||
XY xy = PosToXY(main.buffer, GetFront(caret));
|
||||
|
||||
// add separator at the end of buffer
|
||||
if (!found_separator) {
|
||||
Command_SelectRangeOneCursor(title.view, GetBufferEndAsRange(title.buffer));
|
||||
Array<Edit> edits = Command_ReplaceEx(scratch, title.view, u" |");
|
||||
}
|
||||
|
||||
|
||||
// replace data up to separator with filename and stuff
|
||||
const char *reopen = main.buffer->changed_on_disk ? " Reopen()" : "";
|
||||
String s = Format(scratch, "# %S:%lld:%lld%s", main.buffer->name, (long long)xy.line + 1ll, (long long)xy.col + 1ll, reopen);
|
||||
For (ActiveProcesses) {
|
||||
if (it.view_id == main.view->id.id) {
|
||||
s = Format(scratch, "%S %lld Kill()", s, (long long)it.id);
|
||||
}
|
||||
}
|
||||
|
||||
String16 string = ToString16(scratch, s);
|
||||
String16 string_to_replace = GetString(title.buffer, replace_range);
|
||||
if (string_to_replace != string) {
|
||||
Command_SelectRangeOneCursor(title.view, replace_range);
|
||||
Array<Edit> edits = Command_ReplaceEx(scratch, title.view, string);
|
||||
}
|
||||
|
||||
Command_SelectRangeOneCursor(title.view, MakeRange(0));
|
||||
}
|
||||
@@ -40,18 +40,37 @@ void InitWindows() {
|
||||
}
|
||||
}
|
||||
|
||||
// BAR at the bottom
|
||||
// SEARCH BAR
|
||||
{
|
||||
Window *window = CreateWind();
|
||||
BarWindowID = window->id;
|
||||
SearchBarWindowID = window->id;
|
||||
Buffer *buffer = CreateBuffer(SysAllocator, "search_bar");
|
||||
SearchBufferID = buffer->id;
|
||||
View *view = CreateView(buffer->id);
|
||||
SearchViewID = view->id;
|
||||
window->active_view = view->id;
|
||||
window->draw_line_numbers = false;
|
||||
window->draw_scrollbar = false;
|
||||
window->draw_darker = true;
|
||||
window->draw_line_highlight = false;
|
||||
window->layout = false;
|
||||
window->visible = false;
|
||||
}
|
||||
|
||||
// STATUS BAR at the bottom
|
||||
{
|
||||
Window *window = CreateWind();
|
||||
StatusBarWindowID = window->id;
|
||||
Buffer *buffer = CreateBuffer(SysAllocator, "status_bar");
|
||||
View *view = CreateView(buffer->id);
|
||||
window->active_view = view->id;
|
||||
buffer->no_history = true;
|
||||
window->font = &SecondaryFont;
|
||||
window->draw_line_numbers = false;
|
||||
window->draw_scrollbar = false;
|
||||
window->draw_line_highlight = false;
|
||||
window->draw_darker = true;
|
||||
window->layout = false;
|
||||
Buffer *buffer = CreateBuffer(SysAllocator, "bar");
|
||||
buffer->no_history = true;
|
||||
View *view = CreateView(buffer->id);
|
||||
window->active_view = view->id;
|
||||
}
|
||||
|
||||
// DEBUG WINDOW
|
||||
@@ -101,11 +120,20 @@ void LayoutWindows(int16_t wx, int16_t wy) {
|
||||
|
||||
// bar at the bottom
|
||||
{
|
||||
Window *n = GetWindow(BarWindowID);
|
||||
Window *n = GetWindow(StatusBarWindowID);
|
||||
Int barsize = GetTitleBarSize(n);
|
||||
n->document_rect = n->total_rect = CutBottom(&screen_rect, barsize);
|
||||
}
|
||||
|
||||
// search bar
|
||||
{
|
||||
Window *n = GetWindow(SearchBarWindowID);
|
||||
if (n->visible) {
|
||||
Int barsize = GetTitleBarSize(n);
|
||||
n->document_rect = n->total_rect = CutBottom(&screen_rect, barsize);
|
||||
}
|
||||
}
|
||||
|
||||
// floating debug window
|
||||
{
|
||||
Window *n = GetWindow(DebugWindowID);
|
||||
@@ -119,26 +147,26 @@ void LayoutWindows(int16_t wx, int16_t wy) {
|
||||
}
|
||||
|
||||
// Column layout
|
||||
if (1) {
|
||||
Int c = 0;
|
||||
double size = WindowCalcEvenResizerValue(wx, &c);
|
||||
if (c == 0) {
|
||||
return;
|
||||
Int c = 0;
|
||||
double size = WindowCalcEvenResizerValue(wx, &c);
|
||||
if (c == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
int i = 0;
|
||||
ForItem(n, Windows) {
|
||||
if (!n->layout) {
|
||||
continue;
|
||||
}
|
||||
|
||||
int i = 0;
|
||||
ForItem(n, Windows) {
|
||||
if (!n->layout) {
|
||||
continue;
|
||||
}
|
||||
|
||||
n->total_rect = n->document_rect = CutLeft(&screen_rect, (Int)(size * n->weight));
|
||||
if (i != (c - 1)) {
|
||||
Int resizer_size = (Int)(PrimaryFont.char_spacing*0.5f);
|
||||
n->resizer_rect = CutRight(&n->document_rect, resizer_size);
|
||||
}
|
||||
CalcNiceties(n);
|
||||
i += 1;
|
||||
n->total_rect = n->document_rect = CutLeft(&screen_rect, (Int)(size * n->weight));
|
||||
if (i != (c - 1)) {
|
||||
Int resizer_size = (Int)(PrimaryFont.char_spacing*0.5f);
|
||||
n->resizer_rect = CutRight(&n->document_rect, resizer_size);
|
||||
} else {
|
||||
n->resizer_rect = {};
|
||||
}
|
||||
CalcNiceties(n);
|
||||
i += 1;
|
||||
}
|
||||
}
|
||||
@@ -46,7 +46,7 @@ void DrawVisibleText(Window *window, Color tint) {
|
||||
Rect2I visible = GetVisibleCells(window);
|
||||
for (Int line_index = visible.min.y; line_index < visible.max.y && line_index >= 0 && line_index < buffer->line_starts.len; line_index += 1) {
|
||||
String16 line_string = GetLineString(buffer, line_index);
|
||||
Vec2I pos = Vec2I{visible.min.x, line_index} * (Int)window->font->line_spacing - view->scroll + window->document_rect.min;
|
||||
Vec2I pos = Vec2I{visible.min.x, line_index} * Vec2I{(Int)window->font->char_spacing, (Int)window->font->line_spacing} - view->scroll + window->document_rect.min;
|
||||
|
||||
float text_offset_x = 0;
|
||||
for (Int col_index = visible.min.x; col_index < visible.max.x && col_index >= 0 && col_index < line_string.len; col_index += 1) {
|
||||
@@ -106,6 +106,7 @@ void DrawWindow(Window *window, Event &event) {
|
||||
SetScissor(screen_rect);
|
||||
|
||||
bool is_active = window->id == ActiveWindow;
|
||||
bool active_layed_out_doc = window->id == LastActiveLayoutWindowID;
|
||||
|
||||
Color color_whitespace_during_selection = ColorWhitespaceDuringSelection;
|
||||
Color color_background = ColorBackground;
|
||||
@@ -115,7 +116,24 @@ void DrawWindow(Window *window, Event &event) {
|
||||
Color color_sub_caret = ColorSubCaret;
|
||||
Color color_text_line_numbers = ColorTextLineNumbers;
|
||||
Color color_text = ColorText;
|
||||
|
||||
if (window->draw_darker) {
|
||||
if (is_active) {
|
||||
color_background = ColorTitleBarActiveBackground;
|
||||
} else {
|
||||
color_background = ColorTitleBarBackground;
|
||||
}
|
||||
color_selection = ColorTitleBarSelection;
|
||||
color_text = ColorTitleBarText;
|
||||
color_line_highlight = ColorTitleBarBackground;
|
||||
}
|
||||
|
||||
|
||||
DrawRect(window->total_rect, color_background);
|
||||
if (window->draw_darker) {
|
||||
Rect2I rect = window->total_rect;
|
||||
DrawRect(CutTop(&rect, 1), ColorResizerOutline);
|
||||
}
|
||||
|
||||
Rect2I combined_document_line_number = window->document_rect;
|
||||
if (window->draw_line_numbers) combined_document_line_number.min.x = window->line_numbers_rect.min.x;
|
||||
@@ -170,6 +188,18 @@ void DrawWindow(Window *window, Event &event) {
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (window->draw_line_highlight) {
|
||||
//
|
||||
// Draw highlight
|
||||
Int front = GetFront(it);
|
||||
XY fxy = PosToXY(buffer, front);
|
||||
Vec2I pos = XYToWorldPos(window, XYLine(fxy.line));
|
||||
Vec2I scrolled_pos = pos - view->scroll + window->document_rect.min;
|
||||
Rect2 rect = {
|
||||
{(float)window->total_rect.min.x, (float)scrolled_pos.y},
|
||||
{(float)window->total_rect.max.x, (float)scrolled_pos.y + (float)window->font->line_spacing}
|
||||
};
|
||||
DrawRect(rect, color_line_highlight);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -202,16 +232,19 @@ void DrawWindow(Window *window, Event &event) {
|
||||
EndProfileScope();
|
||||
DrawVisibleText(window, color_text);
|
||||
|
||||
BeginProfileScope(draw_carets);
|
||||
For(view->carets) {
|
||||
Int front = GetFront(it);
|
||||
XY fxy = PosToXY(buffer, front);
|
||||
if (fxy.col >= visible.min.x && fxy.col < visible.max.x && fxy.line >= visible.min.y && fxy.line <= visible.max.y) {
|
||||
bool main_caret = &it == &view->carets.data[0];
|
||||
DrawCaret(window, fxy, 0.3f, main_caret ? color_main_caret : color_sub_caret);
|
||||
// Draw caret "|" markings
|
||||
if (is_active) {
|
||||
BeginProfileScope(draw_carets);
|
||||
For(view->carets) {
|
||||
Int front = GetFront(it);
|
||||
XY fxy = PosToXY(buffer, front);
|
||||
if (fxy.col >= visible.min.x && fxy.col < visible.max.x && fxy.line >= visible.min.y && fxy.line <= visible.max.y) {
|
||||
bool main_caret = &it == &view->carets.data[0];
|
||||
DrawCaret(window, fxy, 0.3f, main_caret ? color_main_caret : color_sub_caret);
|
||||
}
|
||||
}
|
||||
EndProfileScope();
|
||||
}
|
||||
EndProfileScope();
|
||||
|
||||
// Draw line numbers
|
||||
if (window->draw_line_numbers) {
|
||||
@@ -245,15 +278,18 @@ void DrawWindow(Window *window, Event &event) {
|
||||
DrawRect(rect, color);
|
||||
}
|
||||
|
||||
if (window->z == 1) {
|
||||
// color the floating object to make it stand out
|
||||
if (window->z >= 1) {
|
||||
SetScissor(window->total_rect);
|
||||
DrawRect(window->total_rect, {255, 255, 255, 25});
|
||||
}
|
||||
|
||||
// darken the inactive windows
|
||||
if (!is_active) {
|
||||
SetScissor(screen_rect);
|
||||
DrawRect(window->total_rect, ColorInactiveWindow);
|
||||
}
|
||||
|
||||
|
||||
SetScissor(screen_rect);
|
||||
DrawRect(window->total_rect, ColorInactiveWindow);
|
||||
// Draw resizer rect
|
||||
{
|
||||
Rect2I rect = window->resizer_rect;
|
||||
|
||||
Reference in New Issue
Block a user