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({"WhitespaceDuringSelection", "GruvboxLight4"});
colors.add({"FuzzySearchLineHighlight", "GruvboxLight4"});
colors.add({"ScrollbarBackground" , "GruvboxLight2"});
colors.add({"ScrollbarScroller" , "GruvboxLight1"});
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);
}
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) {
Rect2I a = CutLeft(&rect, 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);
DrawRectOutline(ToRect2(rect), color, (float)thickness);
}
Int GetCharSpacing(Font *font, int codepoint = '_') {

View File

@@ -276,7 +276,7 @@ bool GlobalCommand(Event event) {
static SDL_Cursor *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_SetCursor(SDL_MouseCursor);
} 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) {
Scratch scratch;
String16 first_line_string = GetLineStringWithoutNL(*buffer, 0);
@@ -604,19 +605,19 @@ void WindowCommand(Event event, Window *window, View *view) {
view->carets[0] = caret;
}
// if (Ctrl(SDLK_Q) || Mouse(MIDDLE)) {
// // @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 (window->fuzzy_search) {
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 {

View File

@@ -44,6 +44,7 @@ Color ColorMainCaret = GruvboxDark0Hard;
Color ColorSubCaret = GruvboxGray245;
Color ColorSelection = GruvboxLight1;
Color ColorWhitespaceDuringSelection = GruvboxLight4;
Color ColorFuzzySearchLineHighlight = GruvboxLight4;
Color ColorScrollbarBackground = GruvboxLight2;
Color ColorScrollbarScroller = GruvboxLight1;
Color ColorScrollbarScrollerSelected = GruvboxLight0Hard;
@@ -98,6 +99,7 @@ Color.MainCaret = GruvboxDark0Hard
Color.SubCaret = GruvboxGray245
Color.Selection = GruvboxLight1
Color.WhitespaceDuringSelection = GruvboxLight4
Color.FuzzySearchLineHighlight = GruvboxLight4
Color.ScrollbarBackground = GruvboxLight2
Color.ScrollbarScroller = GruvboxLight1
Color.ScrollbarScrollerSelected = GruvboxLight0Hard
@@ -237,6 +239,7 @@ void ReloadColors() {
ColorSubCaret = GetColor("SubCaret", ColorSubCaret);
ColorSelection = GetColor("Selection", ColorSelection);
ColorWhitespaceDuringSelection = GetColor("WhitespaceDuringSelection", ColorWhitespaceDuringSelection);
ColorFuzzySearchLineHighlight = GetColor("FuzzySearchLineHighlight", ColorFuzzySearchLineHighlight);
ColorScrollbarBackground = GetColor("ScrollbarBackground", ColorScrollbarBackground);
ColorScrollbarScroller = GetColor("ScrollbarScroller", ColorScrollbarScroller);
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)
- page up and down should also scroll and leave you in exactly same scroll
- word completion

View File

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

View File

@@ -166,6 +166,22 @@ void DrawWindow(Window *window) {
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();
DrawVisibleText(window, color_text);
@@ -216,6 +232,11 @@ void DrawWindow(Window *window) {
DrawRect(rect, color);
}
if (window->z == 1) {
SetScissor(window->total_rect);
DrawRect(window->total_rect, {255, 255, 255, 25});
}
if (!is_active) {
SetScissor(GetScreenRectF());
DrawRect(window->total_rect, ColorInactiveWindow);