Improve command window

This commit is contained in:
Krzosa Karol
2024-08-02 12:49:03 +02:00
parent 95dc31be91
commit 48dc808dcb
8 changed files with 80 additions and 40 deletions

View File

@@ -369,6 +369,8 @@ void GenerateConfig() {
colors.add({"Selection" , "GruvboxLight1"}); colors.add({"Selection" , "GruvboxLight1"});
colors.add({"WhitespaceDuringSelection", "GruvboxLight4"}); colors.add({"WhitespaceDuringSelection", "GruvboxLight4"});
colors.add({"FuzzySearchLineHighlight", "GruvboxLight4"});
colors.add({"ScrollbarBackground" , "GruvboxLight2"}); colors.add({"ScrollbarBackground" , "GruvboxLight2"});
colors.add({"ScrollbarScroller" , "GruvboxLight1"}); colors.add({"ScrollbarScroller" , "GruvboxLight1"});
colors.add({"ScrollbarScrollerSelected", "GruvboxLight0Hard"}); colors.add({"ScrollbarScrollerSelected", "GruvboxLight0Hard"});

View File

@@ -299,15 +299,19 @@ void DrawRect(Rect2I rect, Color color) {
PushQuad2D(RenderArena, &Vertices, ToRect2(rect), MainFont.white_texture_bounding_box, color); PushQuad2D(RenderArena, &Vertices, ToRect2(rect), MainFont.white_texture_bounding_box, color);
} }
void DrawRectOutline(Rect2 rect, Color color, float thickness = 2) {
Rect2 a = CutLeft(&rect, thickness);
Rect2 b = CutRight(&rect, thickness);
Rect2 c = CutTop(&rect, thickness);
Rect2 d = CutBottom(&rect, thickness);
PushQuad2D(RenderArena, &Vertices, a, MainFont.white_texture_bounding_box, color);
PushQuad2D(RenderArena, &Vertices, b, MainFont.white_texture_bounding_box, color);
PushQuad2D(RenderArena, &Vertices, c, MainFont.white_texture_bounding_box, color);
PushQuad2D(RenderArena, &Vertices, d, MainFont.white_texture_bounding_box, color);
}
void DrawRectOutline(Rect2I rect, Color color, Int thickness = 2) { void DrawRectOutline(Rect2I rect, Color color, Int thickness = 2) {
Rect2I a = CutLeft(&rect, thickness); DrawRectOutline(ToRect2(rect), color, (float)thickness);
Rect2I b = CutRight(&rect, thickness);
Rect2I c = CutTop(&rect, thickness);
Rect2I d = CutBottom(&rect, thickness);
PushQuad2D(RenderArena, &Vertices, ToRect2(a), MainFont.white_texture_bounding_box, color);
PushQuad2D(RenderArena, &Vertices, ToRect2(b), MainFont.white_texture_bounding_box, color);
PushQuad2D(RenderArena, &Vertices, ToRect2(c), MainFont.white_texture_bounding_box, color);
PushQuad2D(RenderArena, &Vertices, ToRect2(d), MainFont.white_texture_bounding_box, color);
} }
Int GetCharSpacing(Font *font, int codepoint = '_') { Int GetCharSpacing(Font *font, int codepoint = '_') {

View File

@@ -276,7 +276,7 @@ bool GlobalCommand(Event event) {
static SDL_Cursor *SDL_MouseCursor; static SDL_Cursor *SDL_MouseCursor;
if (SDL_MouseCursor) SDL_DestroyCursor(SDL_MouseCursor); if (SDL_MouseCursor) SDL_DestroyCursor(SDL_MouseCursor);
if (window->mouse_selecting || mouse_in_document) { if (window->mouse_selecting || mouse_in_total) {
SDL_MouseCursor = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_TEXT); SDL_MouseCursor = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_TEXT);
SDL_SetCursor(SDL_MouseCursor); SDL_SetCursor(SDL_MouseCursor);
} else if (mouse_in_scrollbar || window->mouse_selecting_scrollbar) { } else if (mouse_in_scrollbar || window->mouse_selecting_scrollbar) {

View File

@@ -583,6 +583,7 @@ void WindowCommand(Event event, Window *window, View *view) {
} }
} }
// @todo: consider making this view command
if (window->fuzzy_search && search) { if (window->fuzzy_search && search) {
Scratch scratch; Scratch scratch;
String16 first_line_string = GetLineStringWithoutNL(*buffer, 0); String16 first_line_string = GetLineStringWithoutNL(*buffer, 0);
@@ -604,19 +605,19 @@ void WindowCommand(Event event, Window *window, View *view) {
view->carets[0] = caret; view->carets[0] = caret;
} }
// if (Ctrl(SDLK_Q) || Mouse(MIDDLE)) { if (window->fuzzy_search) {
// // @todo: Consider applying this to all cursors
// if (GetSize(view->carets[0].range) == 0) {
// Command_EvalLuaLine(view);
// } else {
// String16 string = GetString(*buffer, view->carets[0].range);
// Command_EvalLua(view, string);
// }
// }
if (window->execute_line) {
if (Press(SDLK_RETURN)) { if (Press(SDLK_RETURN)) {
Command_EvalLuaLine(view); Scratch scratch;
Buffer *buffer = GetBuffer(view->active_buffer);
Int line = PosToLine(*buffer, GetFront(view->carets[0]));
if (line == 0) line = 1;
String16 string = GetLineStringWithoutNL(*buffer, line);
EvalString(scratch, string);
// Clear text
Command_SelectRangeOneCursor(view, GetLineRangeWithoutNL(*buffer, 0));
Command_Replace(view, {});
} }
} else if (window->id.id == SearchWindowID.id) { } else if (window->id.id == SearchWindowID.id) {
} else { } else {

View File

@@ -44,6 +44,7 @@ Color ColorMainCaret = GruvboxDark0Hard;
Color ColorSubCaret = GruvboxGray245; Color ColorSubCaret = GruvboxGray245;
Color ColorSelection = GruvboxLight1; Color ColorSelection = GruvboxLight1;
Color ColorWhitespaceDuringSelection = GruvboxLight4; Color ColorWhitespaceDuringSelection = GruvboxLight4;
Color ColorFuzzySearchLineHighlight = GruvboxLight4;
Color ColorScrollbarBackground = GruvboxLight2; Color ColorScrollbarBackground = GruvboxLight2;
Color ColorScrollbarScroller = GruvboxLight1; Color ColorScrollbarScroller = GruvboxLight1;
Color ColorScrollbarScrollerSelected = GruvboxLight0Hard; Color ColorScrollbarScrollerSelected = GruvboxLight0Hard;
@@ -98,6 +99,7 @@ Color.MainCaret = GruvboxDark0Hard
Color.SubCaret = GruvboxGray245 Color.SubCaret = GruvboxGray245
Color.Selection = GruvboxLight1 Color.Selection = GruvboxLight1
Color.WhitespaceDuringSelection = GruvboxLight4 Color.WhitespaceDuringSelection = GruvboxLight4
Color.FuzzySearchLineHighlight = GruvboxLight4
Color.ScrollbarBackground = GruvboxLight2 Color.ScrollbarBackground = GruvboxLight2
Color.ScrollbarScroller = GruvboxLight1 Color.ScrollbarScroller = GruvboxLight1
Color.ScrollbarScrollerSelected = GruvboxLight0Hard Color.ScrollbarScrollerSelected = GruvboxLight0Hard
@@ -237,6 +239,7 @@ void ReloadColors() {
ColorSubCaret = GetColor("SubCaret", ColorSubCaret); ColorSubCaret = GetColor("SubCaret", ColorSubCaret);
ColorSelection = GetColor("Selection", ColorSelection); ColorSelection = GetColor("Selection", ColorSelection);
ColorWhitespaceDuringSelection = GetColor("WhitespaceDuringSelection", ColorWhitespaceDuringSelection); ColorWhitespaceDuringSelection = GetColor("WhitespaceDuringSelection", ColorWhitespaceDuringSelection);
ColorFuzzySearchLineHighlight = GetColor("FuzzySearchLineHighlight", ColorFuzzySearchLineHighlight);
ColorScrollbarBackground = GetColor("ScrollbarBackground", ColorScrollbarBackground); ColorScrollbarBackground = GetColor("ScrollbarBackground", ColorScrollbarBackground);
ColorScrollbarScroller = GetColor("ScrollbarScroller", ColorScrollbarScroller); ColorScrollbarScroller = GetColor("ScrollbarScroller", ColorScrollbarScroller);
ColorScrollbarScrollerSelected = GetColor("ScrollbarScrollerSelected", ColorScrollbarScrollerSelected); ColorScrollbarScrollerSelected = GetColor("ScrollbarScrollerSelected", ColorScrollbarScrollerSelected);

View File

@@ -33,7 +33,6 @@
- open selected string or auto enclosed word when right clicking or middle (this needs to be also handled on keyboard level) - open selected string or auto enclosed word when right clicking or middle (this needs to be also handled on keyboard level)
- page up and down should also scroll and leave you in exactly same scroll - page up and down should also scroll and leave you in exactly same scroll
- word completion - word completion

View File

@@ -123,11 +123,10 @@ void InitWindows(View *null_view) {
Window *window = CreateWindow(); Window *window = CreateWindow();
window->absolute_position = true; window->absolute_position = true;
window->dont_save_in_active_window_history = true; window->dont_save_in_active_window_history = true;
window->deactivate_on_escape = true;
Buffer *buffer = CreateBuffer(sys_allocator, "*console*"); Buffer *buffer = CreateBuffer(sys_allocator, "*console*");
buffer->no_history = true; // buffer->no_history = true;
View *view = CreateView(buffer->id); View *view = CreateView(buffer->id);
SetActiveView(window, view->id); SetActiveView(window, view->id);
CreateInfobar(window); CreateInfobar(window);
SetVisibility(window, false); SetVisibility(window, false);
@@ -147,6 +146,7 @@ void InitWindows(View *null_view) {
buffer->no_history = true; buffer->no_history = true;
View *view = CreateView(buffer->id); View *view = CreateView(buffer->id);
window->active_view = view->id; window->active_view = view->id;
window->z = 2;
SetActiveView(window, view->id); SetActiveView(window, view->id);
DebugWindowID = window->id; DebugWindowID = window->id;
} }
@@ -157,7 +157,6 @@ void InitWindows(View *null_view) {
w->draw_line_numbers = false; w->draw_line_numbers = false;
w->visible = false; w->visible = false;
w->fuzzy_search = true; w->fuzzy_search = true;
w->execute_line = true;
w->invisible_when_inactive = true; w->invisible_when_inactive = true;
w->absolute_position = true; w->absolute_position = true;
w->dont_save_in_active_window_history = true; w->dont_save_in_active_window_history = true;
@@ -165,6 +164,11 @@ void InitWindows(View *null_view) {
Buffer *b = CreateBuffer(sys_allocator, "*commands*"); Buffer *b = CreateBuffer(sys_allocator, "*commands*");
View *v = CreateView(b->id); View *v = CreateView(b->id);
SetActiveView(w, v->id); SetActiveView(w, v->id);
w->z = 1;
Window *titlebar = CreateInfobar(w);
titlebar->z = 1;
SetVisibility(w, false);
CommandWindowID = w->id; CommandWindowID = w->id;
Command_EvalLua(v, L"list_buffers()"); Command_EvalLua(v, L"list_buffers()");
@@ -195,6 +199,7 @@ void InitWindows(View *null_view) {
w->invisible_when_inactive = true; w->invisible_when_inactive = true;
w->absolute_position = true; w->absolute_position = true;
w->deactivate_on_escape = true; w->deactivate_on_escape = true;
w->z = 2;
Buffer *b = CreateBuffer(sys_allocator, "*popup*"); Buffer *b = CreateBuffer(sys_allocator, "*popup*");
b->no_history = true; b->no_history = true;
View *v = CreateView(b->id); View *v = CreateView(b->id);
@@ -203,7 +208,7 @@ void InitWindows(View *null_view) {
PopupWindowID = w->id; PopupWindowID = w->id;
} }
SetActiveWindow({1}); SetActiveWindow({0});
} }
void LayoutWindows() { void LayoutWindows() {
@@ -273,23 +278,29 @@ void LayoutWindows() {
Rect2 b = CutBottom(&a, 0.4f * size.y); Rect2 b = CutBottom(&a, 0.4f * size.y);
Rect2 c = Shrink(b, 20); Rect2 c = Shrink(b, 20);
window->z = 2;
window->total_rect = ToRect2I(c); window->total_rect = ToRect2I(c);
window->document_rect = window->total_rect; window->document_rect = window->total_rect;
} }
{ {
Window *window = GetWindow(CommandWindowID); Window *window = GetWindow(CommandWindowID);
Rect2 screen_rect = GetScreenRectF(); if (window->visible) {
Vec2 size = GetSize(screen_rect); Rect2 screen_rect = GetScreenRectF();
CutTop(&screen_rect, size.y * 0.05f); Vec2 size = GetSize(screen_rect);
CutLeft(&screen_rect, size.x * 0.2f); CutTop(&screen_rect, size.y * 0.05f);
CutRight(&screen_rect, size.x * 0.2f); CutLeft(&screen_rect, size.x * 0.2f);
Rect2 r = CutTop(&screen_rect, FontLineSpacing * 30.f); CutRight(&screen_rect, size.x * 0.2f);
Rect2 r = CutTop(&screen_rect, FontLineSpacing * 30.f);
window->z = 1; window->total_rect = ToRect2I(r);
window->total_rect = ToRect2I(r); window->document_rect = window->total_rect;
window->document_rect = window->total_rect;
Window *title_bar_window = GetWindow(window->title_bar_window);
if (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;
}
}
} }
{ {
@@ -301,7 +312,6 @@ void LayoutWindows() {
Rect2 b = CutBottom(&a, 0.15f * size.y); Rect2 b = CutBottom(&a, 0.15f * size.y);
Rect2 c = Shrink(b, 20); Rect2 c = Shrink(b, 20);
window->z = 2;
window->total_rect = ToRect2I(c); window->total_rect = ToRect2I(c);
window->document_rect = window->total_rect; window->document_rect = window->total_rect;
} }

View File

@@ -166,6 +166,22 @@ void DrawWindow(Window *window) {
DrawRect(rect, color_line_highlight); DrawRect(rect, color_line_highlight);
} }
} }
if (window->fuzzy_search) {
Caret it = view->carets[0];
Int front = GetFront(it);
XY fxy = PosToXY(*buffer, front);
if (fxy.line == 0) fxy.line += 1;
Vec2I w = XYToWorldPos(view, XYLine(fxy.line));
w -= view->scroll;
w += window->document_rect.min;
Rect2 rect = {
{(float)window->total_rect.min.x, (float)w.y},
{(float)window->total_rect.max.x, (float)w.y + (float)FontLineSpacing}
};
DrawRectOutline(rect, ColorFuzzySearchLineHighlight);
}
EndProfileScope(); EndProfileScope();
DrawVisibleText(window, color_text); DrawVisibleText(window, color_text);
@@ -216,6 +232,11 @@ void DrawWindow(Window *window) {
DrawRect(rect, color); DrawRect(rect, color);
} }
if (window->z == 1) {
SetScissor(window->total_rect);
DrawRect(window->total_rect, {255, 255, 255, 25});
}
if (!is_active) { if (!is_active) {
SetScissor(GetScreenRectF()); SetScissor(GetScreenRectF());
DrawRect(window->total_rect, ColorInactiveWindow); DrawRect(window->total_rect, ColorInactiveWindow);