diff --git a/src/text_editor/commands.cpp b/src/text_editor/commands.cpp index 0883cb5..9b54ab4 100644 --- a/src/text_editor/commands.cpp +++ b/src/text_editor/commands.cpp @@ -122,6 +122,47 @@ Int ScreenSpaceToBufferPosErrorOutOfBounds(Window *window, View *view, Buffer *b return result; } +void MouseExecWord(Event event) { + 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 = ScreenSpaceToBufferPosErrorOutOfBounds(window, view, buffer, mouse); + if (p != -1) { + Range enclose = EncloseExecWord(buffer, p); + if (InBounds(view->carets[0].range, p)) { + enclose = view->carets[0].range; + } + String16 string = GetString(*buffer, enclose); + Command_EvalLua(view, string); + } + } +} + +void MouseLoadWord(Event event) { + 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 = ScreenSpaceToBufferPosErrorOutOfBounds(window, view, buffer, mouse); + if (p != -1) { + Range enclose = EncloseLoadWord(buffer, p); + if (InBounds(view->carets[0].range, p)) enclose = view->carets[0].range; + String16 string = GetString(*buffer, enclose); + + view->carets.len = 1; + view->carets[0] = MakeCaret(p); + Open(string); + } + } +} + bool GlobalCommand(Event event) { ProfileFunction(); bool run_window_command = true; @@ -247,9 +288,9 @@ bool GlobalCommand(Event event) { } if (event.ctrl && Mouse(RIGHT)) { - GoBackToLastCrumb(); + MouseExecWord(event); } else if (event.alt && Mouse(RIGHT)) { - // ToggleConsole(); + GoBackToLastCrumb(); } // @todo: maybe move some of this stuff to window command ??? @@ -257,43 +298,8 @@ 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)) { - 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 = ScreenSpaceToBufferPosErrorOutOfBounds(window, view, buffer, mouse); - if (p != -1) { - Range enclose = EncloseExecWord(buffer, p); - if (InBounds(view->carets[0].range, p)) { - enclose = view->carets[0].range; - } - String16 string = GetString(*buffer, enclose); - Command_EvalLua(view, string); - } - } - } else if (event.ctrl && Mouse(LEFT)) { - 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 = ScreenSpaceToBufferPosErrorOutOfBounds(window, view, buffer, mouse); - if (p != -1) { - Range enclose = EncloseLoadWord(buffer, p); - if (InBounds(view->carets[0].range, p)) enclose = view->carets[0].range; - String16 string = GetString(*buffer, enclose); - - view->carets.len = 1; - view->carets[0] = MakeCaret(p); - Open(string); - } - } - } else if (Mouse(LEFT)) { + MouseLoadWord(event); + } else if (Mouse(LEFT)) { // CTRL SHIFT Vec2I mouse = MouseVec2I(); { Assert(ScrollbarSelected.id == -1); @@ -307,7 +313,10 @@ bool GlobalCommand(Event event) { Buffer *buffer = GetBuffer(view->active_buffer); DocumentSelected = window->id; - Int p = ScreenSpaceToBufferPos(window, view, buffer, mouse); + Int p = ScreenSpaceToBufferPos(window, view, buffer, mouse); + if (event.ctrl) Insert(&view->carets, MakeCaret(p, p), 0); + if (!event.ctrl && !event.shift) view->carets.len = 1; + Caret &caret = view->carets[0]; if (event.shift) { if (p <= caret.range.min) { @@ -318,14 +327,13 @@ bool GlobalCommand(Event event) { caret.ifront = 1; } } else if (event.clicks >= 2 && InBounds({caret.range.min - 1, caret.range.max + 1}, p)) { - view->carets.len = 1; - Range range = EncloseWord(buffer, p); + Range range = EncloseWord(buffer, p); if (event.clicks >= 3) range = EncloseLoadWord(buffer, p); caret = MakeCaret(range.max, range.min); } else { - view->carets.len = 1; - caret = MakeCaret(p); + caret = MakeCaret(p); } + MergeCarets(view); DocumentRangeAnchor = caret.range; } } diff --git a/src/text_editor/commands_window.cpp b/src/text_editor/commands_window.cpp index 136dd67..51e5f61 100644 --- a/src/text_editor/commands_window.cpp +++ b/src/text_editor/commands_window.cpp @@ -495,7 +495,7 @@ void Command_SelectEntireBuffer(View *view) { // // mouse_selection_anchor is special case for mouse handling ! -void MergeCarets(View *view, Range *mouse_selection_anchor) { +void MergeCarets(View *view) { ProfileFunction(); Buffer *buffer = GetBuffer(view->active_buffer); @@ -515,7 +515,6 @@ void MergeCarets(View *view, Range *mouse_selection_anchor) { if (AreOverlapping(*last, it)) { last->range.max = Max(last->range.max, it.range.max); - if (mouse_selection_anchor) *mouse_selection_anchor = last->range; } else { Add(&view->carets, it); } @@ -889,13 +888,6 @@ void WindowCommand(Event event, Window *window, View *view) { } 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); - } else if (Alt(SDLK_Q)) { Caret caret = view->carets[0]; Range range = caret.range; if (GetSize(caret.range) == 0) { @@ -904,20 +896,18 @@ void WindowCommand(Event event, Window *window, View *view) { String16 string = GetString(*buffer, range); Command_EvalLua(view, string); + } else if (Alt(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)) { - GoBackToLastCrumb(); } else if (Alt(SDLK_W)) { - // ToggleConsole(); - } - - if (Mouse(MIDDLE)) { - Vec2I mouse = MouseVec2I(); - Int p = ScreenSpaceToBufferPos(window, view, buffer, mouse); - Insert(&view->carets, MakeCaret(p, p), 0); - - // @todo: hold - create a rectangle selection with multiple cursors on each line + GoBackToLastCrumb(); } } diff --git a/src/text_editor/notes_bindings b/src/text_editor/notes_bindings new file mode 100644 index 0000000..5da01e3 --- /dev/null +++ b/src/text_editor/notes_bindings @@ -0,0 +1,4 @@ +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 diff --git a/src/text_editor/text_editor.h b/src/text_editor/text_editor.h index 5c8903c..aa1c0a4 100644 --- a/src/text_editor/text_editor.h +++ b/src/text_editor/text_editor.h @@ -116,7 +116,7 @@ Rect2I GetVisibleCells(Window *window); void AfterEdit(View *view, Array edits); Scroller ComputeScrollerRect(Window *window); void Command_EvalLua(View *view, String16 string); -void MergeCarets(View *view, Range *mouse_selection_anchor = NULL); +void MergeCarets(View *view); void Open(String path); void Open(String16 path); void UpdateScroll(Window *window, bool update_caret_scrolling); diff --git a/src/text_editor/window_draw.cpp b/src/text_editor/window_draw.cpp index d63eddf..e368e64 100644 --- a/src/text_editor/window_draw.cpp +++ b/src/text_editor/window_draw.cpp @@ -185,7 +185,7 @@ void DrawWindow(Window *window, Event &event) { // Underline word under mouse cursor if (event.ctrl || event.alt) { - auto enclose_proc = event.ctrl ? EncloseLoadWord : EncloseExecWord; + auto enclose_proc = event.ctrl ? EncloseExecWord : EncloseLoadWord; Caret caret = view->carets[0]; Vec2I mouse = MouseVec2I();