Rework mouse bindings

This commit is contained in:
Krzosa Karol
2024-08-09 08:08:24 +02:00
parent 91ba202562
commit 3fb0c131f1
5 changed files with 67 additions and 65 deletions

View File

@@ -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;
}
}

View File

@@ -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();
}
}

View File

@@ -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

View File

@@ -116,7 +116,7 @@ Rect2I GetVisibleCells(Window *window);
void AfterEdit(View *view, Array<Edit> 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);

View File

@@ -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();