Text editor: improve window focus

This commit is contained in:
Krzosa Karol
2024-06-07 09:24:29 +02:00
parent bda88b5e9d
commit 6ac3f01ebf

View File

@@ -9,9 +9,6 @@ import "raylib";
import "std_types";
import "libc";
MainCursor: Selection;
MouseScrolling: bool;
Selection :: struct {
a: int;
b: int;
@@ -26,6 +23,7 @@ Window :: struct {
buffer: *Buffer;
cursor: Selection;
scroll: Vector2;
mouse_scrolling: bool;
rect: Rect2P;
}
@@ -61,6 +59,15 @@ UpdateAndDrawWindow :: proc(w: *Window, font: Font, font_size: float) {
buffer_end_vpos := CalculateVisualPos(w.buffer, w.buffer.len - 1);
buffer_end_wpos := CalculateWorldPosUnscrolled(buffer_end_vpos);
if CheckCollisionPointRec(GetMousePosition(), Rect2PToRectangle(w.rect)) {
if w != FocusedWindow {
SetMouseCursor(MOUSE_CURSOR_POINTING_HAND);
}
if IsMouseButtonPressed(MOUSE_BUTTON_LEFT) {
FocusedWindow = w;
}
}
if w == FocusedWindow {
if IsKeyPressed(KEY_LEFT) || IsKeyPressedRepeat(KEY_LEFT) {
@@ -289,16 +296,13 @@ UpdateAndDrawWindow :: proc(w: *Window, font: Font, font_size: float) {
if (w.scroll.x < 0) w.scroll.x = 0;
if (w.scroll.y < 0) w.scroll.y = 0;
if (w.scroll.y > buffer_end_wpos.y) w.scroll.y = buffer_end_wpos.y;
}
//
// Mouse
//
mouse_p := GetMousePosition();
if CheckCollisionPointRec(mouse_p, Rect2PToRectangle(w.rect)) {
FocusedWindow = w;
if CheckCollisionPointRec(mouse_p, Rect2PToRectangle(text_window_rect)) && !MouseScrolling {
if CheckCollisionPointRec(mouse_p, Rect2PToRectangle(text_window_rect)) && !w.mouse_scrolling {
if IsMouseButtonPressed(MOUSE_BUTTON_LEFT) {
p := Vector2Add(mouse_p, w.scroll);
p = Vector2Subtract(p, text_window_rect.min);
@@ -320,16 +324,17 @@ UpdateAndDrawWindow :: proc(w: *Window, font: Font, font_size: float) {
SetMouseCursor(MOUSE_CURSOR_DEFAULT);
if IsMouseButtonPressed(MOUSE_BUTTON_LEFT) {
MouseScrolling = true;
w.mouse_scrolling = true;
}
}
}
if MouseScrolling {
if w.mouse_scrolling {
mouse_scroll_marker_normalized := (mouse_p.y - w.rect.min.y) / GetRectY(bar);
w.scroll.y = mouse_scroll_marker_normalized * buffer_end_wpos.y;
if IsMouseButtonReleased(MOUSE_BUTTON_LEFT) MouseScrolling = false;
if IsMouseButtonReleased(MOUSE_BUTTON_LEFT) w.mouse_scrolling = false;
}
}
buffer_pixel_size := GetRectSize(text_window_rect);