From 4564e7bbc230bd0c82f62318b2f7bf437ed8e910 Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Fri, 9 Aug 2024 09:00:04 +0200 Subject: [PATCH] Even never mouse design --- src/text_editor/commands.cpp | 29 +++++++++++++++++++-- src/text_editor/commands_clipboard.cpp | 36 ++++++++++++++++---------- src/text_editor/commands_window.cpp | 9 +++---- src/text_editor/notes_bindings | 15 ++++++++++- src/text_editor/text_editor.cpp | 2 +- src/text_editor/window_draw.cpp | 4 +-- 6 files changed, 70 insertions(+), 25 deletions(-) diff --git a/src/text_editor/commands.cpp b/src/text_editor/commands.cpp index 9b54ab4..00777cd 100644 --- a/src/text_editor/commands.cpp +++ b/src/text_editor/commands.cpp @@ -287,10 +287,36 @@ bool GlobalCommand(Event event) { } } - if (event.ctrl && Mouse(RIGHT)) { + if (event.ctrl && event.shift && Mouse(RIGHT)) { MouseExecWord(event); + } else if (event.ctrl && Mouse(RIGHT)) { + MouseLoadWord(event); } else if (event.alt && Mouse(RIGHT)) { GoBackToLastCrumb(); + } else if (Mouse(RIGHT)) { + Vec2I mouse = MouseVec2I(); + Window *window = GetActiveWindow(); + bool mouse_in_document = CheckCollisionPointRec(mouse, window->document_rect); + if (mouse_in_document) { + View *view = GetView(window->active_view); + Buffer *buffer = GetBuffer(view->active_buffer); + + Int p = ScreenSpaceToBufferPos(window, view, buffer, mouse); + Int saved_front = 0; + + IterRemove(view->carets) { + IterRemovePrepare(view->carets); + if (InBounds(it.range, p)) { + String16 string = GetString(*buffer, it.range); + string = Copy(GetSystemAllocator(), string); + MakeSureToUseSystemAllocator_SaveInClipboard(string); + + remove_item = true; + saved_front = GetFront(it); + } + } + if (view->carets.len == 0) Add(&view->carets, MakeCaret(saved_front)); + } } // @todo: maybe move some of this stuff to window command ??? @@ -298,7 +324,6 @@ bool GlobalCommand(Event event) { // - maybe just do the check if active window is matching the DocumentSelected window // - if scrollbar selected then don't invoke window command if (event.alt && Mouse(LEFT)) { - MouseLoadWord(event); } else if (Mouse(LEFT)) { // CTRL SHIFT Vec2I mouse = MouseVec2I(); { diff --git a/src/text_editor/commands_clipboard.cpp b/src/text_editor/commands_clipboard.cpp index cb24f14..364840a 100644 --- a/src/text_editor/commands_clipboard.cpp +++ b/src/text_editor/commands_clipboard.cpp @@ -1,14 +1,13 @@ String16 SavedClipboardString; -Array SavedClipboardCursors; +Array SavedClipboardCarets; -void Command_Copy(View *view) { +void MakeSureToUseSystemAllocator_SaveInClipboard(String16 string, Array caret_strings = {}) { Allocator sys_allocator = GetSystemAllocator(); - Buffer *buffer = GetBuffer(view->active_buffer); - SavedClipboardCursors.allocator = sys_allocator; - if (SavedClipboardCursors.data) { - For(SavedClipboardCursors) Dealloc(sys_allocator, &it.data); - SavedClipboardCursors.len = 0; + if (SavedClipboardCarets.data) { + For(SavedClipboardCarets) Dealloc(sys_allocator, &it.data); + Dealloc(sys_allocator, &SavedClipboardCarets.data); + SavedClipboardCarets.len = {}; } if (SavedClipboardString.data) { @@ -16,6 +15,17 @@ void Command_Copy(View *view) { SavedClipboardString = {}; } + SavedClipboardString = string; + SavedClipboardCarets = caret_strings; + + Scratch scratch; + SDL_SetClipboardText(ToString(scratch, SavedClipboardString).data); +} + +void Command_Copy(View *view) { + Allocator sys_allocator = GetSystemAllocator(); + Buffer *buffer = GetBuffer(view->active_buffer); + // First, if there is no selection - select the entire line For(view->carets) { if (GetSize(it.range) == 0) { @@ -25,16 +35,16 @@ void Command_Copy(View *view) { } } + Array caret_strings = {sys_allocator}; For(view->carets) { String16 string = GetString(*buffer, it.range); String16 copy = Copy(sys_allocator, string); - Add(&SavedClipboardCursors, copy); + Add(&SavedClipboardCarets, copy); } // @todo: maybe only add new line if there is no new line at the end, experiment with it - SavedClipboardString = Merge(sys_allocator, SavedClipboardCursors, L"\n"); - Scratch scratch; - SDL_SetClipboardText(ToString(scratch, SavedClipboardString).data); + String16 final_string = Merge(sys_allocator, SavedClipboardCarets, L"\n"); + MakeSureToUseSystemAllocator_SaveInClipboard(final_string, caret_strings); } void Command_Paste(View *view) { @@ -50,7 +60,7 @@ void Command_Paste(View *view) { String16 string = {string16_buffer, len}; // Regular paste - if (string != SavedClipboardString || SavedClipboardCursors.len != view->carets.len) { + if (string != SavedClipboardString || SavedClipboardCarets.len != view->carets.len) { Array edits = BeginEdit(scratch, buffer, view->carets); MergeCarets(view); For(view->carets) AddEdit(&edits, it.range, string); @@ -62,7 +72,7 @@ void Command_Paste(View *view) { Array edits = BeginEdit(scratch, buffer, view->carets); MergeCarets(view); for (int64_t i = 0; i < view->carets.len; i += 1) { - String16 string = SavedClipboardCursors[i]; + String16 string = SavedClipboardCarets[i]; Caret &it = view->carets[i]; AddEdit(&edits, it.range, string); } diff --git a/src/text_editor/commands_window.cpp b/src/text_editor/commands_window.cpp index 51e5f61..23cbce5 100644 --- a/src/text_editor/commands_window.cpp +++ b/src/text_editor/commands_window.cpp @@ -887,7 +887,7 @@ void WindowCommand(Event event, Window *window, View *view) { SetActiveWindow(titlebar->id); } - if (Ctrl(SDLK_Q)) { + if (CtrlShift(SDLK_Q)) { Caret caret = view->carets[0]; Range range = caret.range; if (GetSize(caret.range) == 0) { @@ -896,17 +896,14 @@ void WindowCommand(Event event, Window *window, View *view) { String16 string = GetString(*buffer, range); Command_EvalLua(view, string); - } else if (Alt(SDLK_Q)) { + } else if (Ctrl(SDLK_Q)) { Caret caret = view->carets[0]; Range range = caret.range; if (GetSize(caret.range) == 0) range = EncloseLoadWord(buffer, GetFront(caret)); String16 string = GetString(*buffer, range); Open(string); - } - - if (Ctrl(SDLK_W)) { - } else if (Alt(SDLK_W)) { + } else if (Alt(SDLK_Q)) { GoBackToLastCrumb(); } } diff --git a/src/text_editor/notes_bindings b/src/text_editor/notes_bindings index 5da01e3..dd634c3 100644 --- a/src/text_editor/notes_bindings +++ b/src/text_editor/notes_bindings @@ -1,4 +1,17 @@ left_mouse :: ctrl add cursor, selections work, alt load word right_mouse :: ctrl exec word,alt go back ctrl+q exec alt+q load - alt+w go back \ No newline at end of file + alt+w go back + + +ctrl mleft - add cursor +ctrl shift mleft - add cursor + set selection +alt mleft - +alt ctrl mleft - +alt shift mleft - +alt mright - go back +mright - @todo: destroy pointed at selection and copy +ctrl mright - load word +shift mright - +ctrl shift mright - exec word +mmiddle - diff --git a/src/text_editor/text_editor.cpp b/src/text_editor/text_editor.cpp index 0e9aa05..d9a142e 100644 --- a/src/text_editor/text_editor.cpp +++ b/src/text_editor/text_editor.cpp @@ -35,8 +35,8 @@ int FullScreenPositionX, FullScreenPositionY; #include "management.cpp" #include "window.cpp" #include "process.cpp" -#include "commands.cpp" #include "commands_clipboard.cpp" +#include "commands.cpp" #include "commands_window.cpp" #include "title_bar.cpp" diff --git a/src/text_editor/window_draw.cpp b/src/text_editor/window_draw.cpp index e368e64..180bea7 100644 --- a/src/text_editor/window_draw.cpp +++ b/src/text_editor/window_draw.cpp @@ -184,8 +184,8 @@ void DrawWindow(Window *window, Event &event) { } // Underline word under mouse cursor - if (event.ctrl || event.alt) { - auto enclose_proc = event.ctrl ? EncloseExecWord : EncloseLoadWord; + if (event.ctrl) { + auto enclose_proc = event.shift ? EncloseExecWord : EncloseLoadWord; Caret caret = view->carets[0]; Vec2I mouse = MouseVec2I();