Rework mouse bindings
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
4
src/text_editor/notes_bindings
Normal file
4
src/text_editor/notes_bindings
Normal 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
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user