Refactor active windows

This commit is contained in:
Krzosa Karol
2024-07-24 13:48:56 +02:00
parent 8b8229f73a
commit c9aed019d5
6 changed files with 49 additions and 56 deletions

View File

@@ -219,16 +219,12 @@ void ReloadFont(Int font_size) {
void HandleGlobalCommands() {
Window *command_window = GetWindow(CommandWindowID);
if (!IsActive(command_window)) {
command_window->visible = false;
}
if (CtrlPress(KEY_P)) {
if (command_window->visible) {
SetActiveWindow(GetLastActiveWindow());
} else {
SetActiveWindow(command_window->id);
}
command_window->visible = !command_window->visible;
}
if (CtrlPress(KEY_MINUS)) {

View File

@@ -310,7 +310,7 @@ void HandleActiveWindowBindings(Window *window) {
if (window->fuzzy_search && search) {
Scratch scratch;
String16 first_line_string = GetLineStringWithoutNL(*buffer, 0);
String16 first_line_string = GetLineString(*buffer, 0);
Array<FuzzyPair> ratings = FuzzySearchLines(scratch, buffer, 1, buffer->line_starts.len, first_line_string);
Buffer *temp_buffer = CreateTempBuffer(scratch, buffer->cap);
@@ -340,13 +340,6 @@ void HandleActiveWindowBindings(Window *window) {
Command_Replace(&view, L"\n");
Command_SelectRange(&view, {});
} else {
if (window->id.id == CommandWindowID.id) {
Window *command_window = GetWindow(CommandWindowID);
command_window->visible = !command_window->visible;
ActiveWindow = GetLastActiveWindow();
}
{
Window *window = GetWindow(GetLastActiveWindow());
View *view = GetView(window->active_view);
@@ -475,12 +468,11 @@ void HandleActiveWindowBindings(Window *window) {
void HandleWindowBindings(Window *window) {
ProfileFunction();
View &view = *GetActiveView(window);
Buffer *buffer = GetBuffer(view.buffer_id);
View &view = *GetActiveView(window);
Buffer *buffer = GetBuffer(view.buffer_id);
bool is_active = IsActive(window);
if (IsActive(window)) {
HandleActiveWindowBindings(window);
}
if (is_active) HandleActiveWindowBindings(window);
// Clip scroll
{
@@ -498,21 +490,27 @@ void HandleWindowBindings(Window *window) {
void ChangeActiveWindowAndScroll(Array<Int> &order) {
For(order) {
Window *window = &Windows[it];
View *view = GetActiveView(window);
Vec2 mouse = GetMousePosition();
bool mouse_in_window = CheckCollisionPointRec(mouse, ToRectangle(window->total_rect));
if (window->invisible_when_inactive) {
if (IsActive(window)) window->visible = true;
else window->visible = false;
}
if (!window->visible) continue;
View *view = GetActiveView(window);
Vec2 mouse = GetMousePosition();
bool mouse_in_window = CheckCollisionPointRec(mouse, ToRectangle(window->total_rect));
if (mouse_in_window) {
if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) {
SetActiveWindow(window->id);
}
if (LastFrameIDWhenSwitchedActiveWindow != FrameID) {
if (LastFrameIDWhenScrolled != FrameID) {
if (IsKeyDown(KEY_F1)) {
view->scroll.x -= (Int)(GetMouseWheelMove() * 48);
} else {
view->scroll.y -= (Int)(GetMouseWheelMove() * 48);
}
LastFrameIDWhenSwitchedActiveWindow = FrameID;
LastFrameIDWhenScrolled = FrameID;
}
}
}

View File

@@ -50,23 +50,20 @@ View *CreateView(BufferID buffer_id) {
return w;
}
inline bool IsSpecial(WindowID window) {
bool result = window.id == CommandWindowID.id || window.id == InfoBarWindowID.id;
return result;
}
WindowID GetLastActiveWindow() {
For(IterateInReverse(&WindowSwitchHistory)) {
if (!IsSpecial(it)) return it;
return it;
}
return NullWindowID;
}
void SetActiveWindow(WindowID window) {
if (window.id != ActiveWindow.id && LastFrameIDWhenSwitchedActiveWindow != FrameID) {
Add(&WindowSwitchHistory, window);
ActiveWindow = window;
LastFrameIDWhenSwitchedActiveWindow = FrameID;
Window *w = GetWindow(window);
if (!w->dont_save_in_active_window_history) Add(&WindowSwitchHistory, window);
}
}

View File

@@ -32,13 +32,8 @@
/*
- Save file (utf16->utf8)
- reuse buffers!!
- resize windows
- Change font size
- command window
- maybe use lua and have there be lua commands that you choose with cursor
- open "asd/asd/asd/asd"
- list "directory" and since it returns strings we can fill up the command buffer with files to open
- list files and open
- file dock on left side
- We can actually combine this with command window and lua, it's just going to be a buffer of
- open "asd/asd/asd/asd"
@@ -96,7 +91,7 @@ int main(void) {
LoadTextA(b);
AddView(w, v->id);
}
ActiveWindow.id = 1;
SetActiveWindow({1});
{
Window *w = CreateWindow();
@@ -113,25 +108,28 @@ int main(void) {
AddView(w, v->id);
}
{
Window *w = CreateWindow();
w->draw_scrollbar = false;
w->draw_line_numbers = false;
Buffer *b = CreateBuffer(sys_allocator, "*infobar*");
b->no_history = true;
View *v = CreateView(b->id);
Window *w = CreateWindow();
w->draw_scrollbar = false;
w->draw_line_numbers = false;
w->dont_save_in_active_window_history = true;
Buffer *b = CreateBuffer(sys_allocator, "*infobar*");
b->no_history = true;
View *v = CreateView(b->id);
AddView(w, v->id);
InfoBarWindowID = w->id;
}
{
Window *w = CreateWindow();
w->draw_scrollbar = false;
w->draw_line_numbers = false;
w->visible = false;
w->fuzzy_search = true;
w->execute_line = true;
Buffer *b = CreateBuffer(sys_allocator, "*commands*");
View *v = CreateView(b->id);
Window *w = CreateWindow();
w->draw_scrollbar = false;
w->draw_line_numbers = false;
w->visible = false;
w->fuzzy_search = true;
w->execute_line = true;
w->invisible_when_inactive = true;
w->dont_save_in_active_window_history = true;
Buffer *b = CreateBuffer(sys_allocator, "*commands*");
View *v = CreateView(b->id);
ReplaceText(b, GetEndAsRange(*b), L"\n");
ReplaceText(b, GetEndAsRange(*b), L"open \"C:/Work/text_editor/src/text_editor/text_editor.cpp\"\n");
ReplaceText(b, GetEndAsRange(*b), L"open \"C:/Work/text_editor/src/text_editor/text_editor.h\"\n");
@@ -203,8 +201,10 @@ int main(void) {
ReplaceInfobarData();
For(IterateInReverse(&order)) {
Window &window = Windows[it];
HandleWindowBindings(&window);
DrawWindow(window);
if (window.visible) {
HandleWindowBindings(&window);
DrawWindow(window);
}
}
SetMouseCursor();
EndDrawing();

View File

@@ -68,6 +68,8 @@ struct Window {
bool fuzzy_search : 1;
bool execute_line : 1;
bool invisible_when_inactive : 1;
bool dont_save_in_active_window_history : 1;
};
};
@@ -103,7 +105,7 @@ Int FontLineSpacing;
Int FontCharSpacing;
Int FrameID;
Int LastFrameIDWhenScrolled;
Int LastFrameIDWhenScrolled = -1;
Int LastFrameIDWhenSwitchedActiveWindow;
Array<WindowID> WindowSwitchHistory; // @todo: probably better as a circular buffer

View File

@@ -17,8 +17,8 @@ void SetMouseCursor() {
Array<Int> GetWindowZOrder(Allocator allocator) {
Array<Int> order = {allocator};
For(Windows) if (it.z == 2 && it.visible) Add(&order, GetIndex(Windows, it));
For(Windows) if (it.z == 1 && it.visible) Add(&order, GetIndex(Windows, it));
For(Windows) if (it.z == 0 && it.visible) Add(&order, GetIndex(Windows, it));
For(Windows) if (it.z == 2) Add(&order, GetIndex(Windows, it));
For(Windows) if (it.z == 1) Add(&order, GetIndex(Windows, it));
For(Windows) if (it.z == 0) Add(&order, GetIndex(Windows, it));
return order;
}