From b48cffd88070ca5615d6ce854892a63b203dfe51 Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Thu, 4 Jul 2024 16:21:02 +0200 Subject: [PATCH] Page up page down --- src/text_editor/buffer.cpp | 8 ++--- src/text_editor/main.cpp | 69 ++++++++++++++++++++++++++------------ 2 files changed, 51 insertions(+), 26 deletions(-) diff --git a/src/text_editor/buffer.cpp b/src/text_editor/buffer.cpp index 6f78f85..ba7cbcd 100644 --- a/src/text_editor/buffer.cpp +++ b/src/text_editor/buffer.cpp @@ -609,15 +609,15 @@ int64_t MoveLeft(Buffer &buffer, int64_t pos) { return pos; } -int64_t MoveDown(Buffer &buffer, int64_t pos) { +int64_t MoveDown(Buffer &buffer, int64_t pos, int64_t count = 1) { LineAndColumn info = FindLineAndColumn(buffer, pos); - int64_t new_pos = FindPos(buffer, info.line.number + 1, info.column); + int64_t new_pos = FindPos(buffer, info.line.number + count, info.column); return new_pos; } -int64_t MoveUp(Buffer &buffer, int64_t pos) { +int64_t MoveUp(Buffer &buffer, int64_t pos, int64_t count = 1) { LineAndColumn info = FindLineAndColumn(buffer, pos); - int64_t new_pos = FindPos(buffer, info.line.number - 1, info.column); + int64_t new_pos = FindPos(buffer, info.line.number - count, info.column); return new_pos; } diff --git a/src/text_editor/main.cpp b/src/text_editor/main.cpp index 83ca16b..a255b33 100644 --- a/src/text_editor/main.cpp +++ b/src/text_editor/main.cpp @@ -4,7 +4,6 @@ #include "raymath.h" #include "profiler.cpp" -// @todo: highlight all occurences of selected word // @todo: search for word // @todo: context menu // @todo: toy around with acme ideas @@ -66,6 +65,7 @@ int main() { BeginProfiler(); InitScratch(); InitWindow(800, 600, "Hello"); + SetExitKey(KEY_F1); // @todo: dpi SetWindowState(FLAG_WINDOW_RESIZABLE); SetTargetFPS(60); @@ -79,7 +79,7 @@ int main() { InitArena(&PermArena); float font_size = 14; float font_spacing = 1; - Font font = LoadFontEx("C:/Windows/Fonts/consola.ttf", (int)font_size, NULL, 250); + Font font = LoadFontEx("C:/Windows/Fonts/times.ttf", (int)font_size, NULL, 250); Array windows = {}; { @@ -119,7 +119,7 @@ int main() { } frame += 1; - Dbg("%lld", (long long)frame); + // Dbg("%lld", (long long)frame); UpdateEventRecording(); @@ -137,6 +137,10 @@ int main() { focused_window->cursors.add(MakeCursor(0, focused_window->buffer.len)); } + if (IsKeyPressed(KEY_ESCAPE)) { + focused_window->cursors.len = 1; + } + if (IsKeyPressed(KEY_LEFT) || IsKeyPressedRepeat(KEY_LEFT)) { For(focused_window->cursors) { if (IsKeyDown(KEY_LEFT_CONTROL)) { @@ -189,6 +193,7 @@ int main() { } } + // @todo: proper handling of getting out of selection if (IsKeyPressed(KEY_DOWN) || IsKeyPressedRepeat(KEY_DOWN)) { if (IsKeyDown(KEY_LEFT_SHIFT) && IsKeyDown(KEY_LEFT_ALT)) { // Default in VSCode seems to be Ctrl + Alt + down Array cursors_to_add = {FrameArena}; @@ -226,6 +231,7 @@ int main() { } } + // @todo: proper handling of getting out of selection if (IsKeyPressed(KEY_UP) || IsKeyPressedRepeat(KEY_UP)) { if (IsKeyDown(KEY_LEFT_SHIFT) && IsKeyDown(KEY_LEFT_ALT)) { // Default in VSCode seems to be Ctrl + Alt + up Array cursors_to_add = {FrameArena}; @@ -299,18 +305,6 @@ int main() { it.range.min = it.range.max = line.max_without_new_line; } } - - if (IsKeyPressed(KEY_PAGE_UP) || IsKeyPressedRepeat(KEY_PAGE_UP)) { - if (IsKeyDown(KEY_LEFT_SHIFT)) { - } else { - } - } - - if (IsKeyPressed(KEY_PAGE_DOWN) || IsKeyPressedRepeat(KEY_PAGE_DOWN)) { - if (IsKeyDown(KEY_LEFT_SHIFT)) { - } else { - } - } } if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_C)) { @@ -429,7 +423,7 @@ int main() { AfterEdit(focused_window, edits); } - { + if (0) { Cursor cursor = focused_window->cursors[0]; if (GetRangeSize(cursor.range)) { String seek = GetString(focused_window->buffer, cursor.range); @@ -446,11 +440,13 @@ int main() { // colored.text_color = RED; // focused_window->colored_strings.add(colored); - ColoredString colored = {}; - colored.range = range; - colored.use_highlight_background_color = true; - colored.highlight_background_color = {0, 0, 0, 25}; - focused_window->colored_strings.add(colored); + if (!AreEqual(range, cursor.range)) { + ColoredString colored = {}; + colored.range = range; + colored.use_highlight_background_color = true; + colored.highlight_background_color = {0, 0, 0, 25}; + focused_window->colored_strings.add(colored); + } base_index += index + seek.len; s = s.skip(index + seek.len); @@ -472,6 +468,35 @@ int main() { Rect2 line_number_rect = CutLeft(&window.rect, MeasureString(window.font, "1234", window.font_size, window.font_spacing).x); if (!window.not_regen_layout) RegenLayout(&window); + bool is_focused = true; + if (is_focused) { + int64_t num = GetRangeSize(window.layout.visible_line_range); + + if (IsKeyPressed(KEY_PAGE_UP) || IsKeyPressedRepeat(KEY_PAGE_UP)) { + For(window.cursors) { + int64_t front = GetFront(it); + int64_t new_pos = MoveUp(window.buffer, front, num); + if (IsKeyDown(KEY_LEFT_SHIFT)) { + it = ChangeFront(it, new_pos); + } else { + it.range.min = it.range.max = new_pos; + } + } + } + + if (IsKeyPressed(KEY_PAGE_DOWN) || IsKeyPressedRepeat(KEY_PAGE_DOWN)) { + For(window.cursors) { + int64_t front = GetFront(it); + int64_t new_pos = MoveDown(window.buffer, front, num); + if (IsKeyDown(KEY_LEFT_SHIFT)) { + it = ChangeFront(it, new_pos); + } else { + it.range.min = it.range.max = new_pos; + } + } + } + } + // Draw and layout window overlay Vec2 mouse = GetMousePosition(); { @@ -625,7 +650,7 @@ int main() { float visible_size_y = font_size * (float)visible_lines; Vec2 rect_size = GetSize(window.rect); - float cut_off_y = visible_size_y - rect_size.y; + float cut_off_y = Max((float)0, visible_size_y - rect_size.y); int64_t front = GetFront(window.cursors[0]); Line line = FindLine(window.buffer, front);