Fix merge carets with mouse

This commit is contained in:
Krzosa Karol
2024-07-21 18:12:43 +02:00
parent 915620da34
commit 4c9366d495
6 changed files with 52 additions and 26 deletions

View File

@@ -1,15 +1,16 @@
void MergeCarets(Array<Caret> *carets) { void MergeCarets(Array<Caret> *_carets, Range *mouse_selection_anchor = NULL) {
ProfileFunction(); ProfileFunction();
Scratch scratch; Array<Caret> &carets = *_carets;
Scratch scratch;
// Merge carets that overlap, this needs to be handled before any edits to // Merge carets that overlap, this needs to be handled before any edits to
// make sure overlapping edits won't happen. // make sure overlapping edits won't happen.
// @optimize @refactor: this is retarded, I hit so many array removal bugs here, without allocation please // @optimize @refactor: this is retarded, I hit so many array removal bugs here, without allocation please
Array<Caret *> deleted_carets = {scratch}; Array<Caret *> deleted_carets = {scratch};
ForItem(caret, *carets) { ForItem(caret, carets) {
if (Contains(deleted_carets, &caret)) goto end_of_caret_loop; if (Contains(deleted_carets, &caret)) goto end_of_caret_loop;
For(*carets) { For(carets) {
if (&it == &caret) continue; if (&it == &caret) continue;
bool a = caret.range.max >= it.range.min && caret.range.max <= it.range.max; bool a = caret.range.max >= it.range.min && caret.range.max <= it.range.max;
bool b = caret.range.min >= it.range.min && caret.range.min <= it.range.max; bool b = caret.range.min >= it.range.min && caret.range.min <= it.range.max;
@@ -17,21 +18,22 @@ void MergeCarets(Array<Caret> *carets) {
Add(&deleted_carets, &it); Add(&deleted_carets, &it);
caret.range.max = Max(caret.range.max, it.range.max); caret.range.max = Max(caret.range.max, it.range.max);
caret.range.min = Min(caret.range.min, it.range.min); caret.range.min = Min(caret.range.min, it.range.min);
if (mouse_selection_anchor) *mouse_selection_anchor = caret.range;
break; break;
} }
} }
end_of_caret_loop:; end_of_caret_loop:;
} }
Array<Caret> new_carets = {carets->allocator}; Array<Caret> new_carets = {carets.allocator};
For(*carets) { For(carets) {
if (Contains(deleted_carets, &it) == false) { if (Contains(deleted_carets, &it) == false) {
Add(&new_carets, it); Add(&new_carets, it);
} }
} }
Assert(new_carets.len <= carets->len); Assert(new_carets.len <= carets.len);
Dealloc(carets); Dealloc(&carets);
*carets = new_carets; carets = new_carets;
} }
void MergeSort(int64_t Count, Edit *First, Edit *Temp) { void MergeSort(int64_t Count, Edit *First, Edit *Temp) {

View File

@@ -38,6 +38,23 @@ inline bool CtrlAltPress(int key) {
return result; return result;
} }
bool IsDoubleClick() {
static double last_click_time;
if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) {
double time = GetTime();
double diff = time - last_click_time;
last_click_time = time;
// @todo: don't do this manually, use windows
if (diff >= 0.05 && diff <= 0.25) {
last_click_time = 0;
return true;
}
} else if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) {
last_click_time = 0;
}
return false;
}
Int MoveOnWhitespaceBoundaryForward(Buffer &buffer, Int pos) { Int MoveOnWhitespaceBoundaryForward(Buffer &buffer, Int pos) {
pos = Clamp(pos, (Int)0, buffer.len); pos = Clamp(pos, (Int)0, buffer.len);
bool standing_on_whitespace = IsWhitespace(buffer.str[pos]); bool standing_on_whitespace = IsWhitespace(buffer.str[pos]);

View File

@@ -26,18 +26,17 @@
#include "view_draw.cpp" #include "view_draw.cpp"
/* /*
- Shify + Alt + Down - make a cursor below
- Ctrl + Z, Ctrl + C - Undo redo history - Ctrl + Z, Ctrl + C - Undo redo history
- Ctrl + D - create new cursor at next occurence of word - Ctrl + D - create new cursor at next occurence of word
- Ctrl + X, Ctrl + C, Ctrl + V - Copy paste - Ctrl + X, Ctrl + C, Ctrl + V - Copy paste
- Ctrl + Alt + Down - duplicate line down
- Shify + Alt + Down - make a cursor below
- Mouse anchor point and double click - Mouse anchor point and double click
- Scrollbars - Scrollbars
- Line numbers - Line numbers
- file info bar at bottom (line, column, line endings)
- Colored strings - Colored strings
- file dock on left side - file dock on left side
- file info bar at bottom
- multiple windows - multiple windows
- multiple views per window - multiple views per window
- Font cache - Font cache
@@ -78,11 +77,11 @@ int main(void) {
view.char_spacing = GetCharSpacing(font, font_size, font_spacing); view.char_spacing = GetCharSpacing(font, font_size, font_spacing);
Add(&view.carets, {0, 0}); Add(&view.carets, {0, 0});
view.buffer = CreateBuffer(Perm); view.buffer = CreateBuffer(Perm);
LoadUnicode(view.buffer); // LoadUnicode(view.buffer);
// LoadBigTextAndBigLine(view.buffer); // LoadBigTextAndBigLine(view.buffer);
// LoadBigLine(view.buffer); // LoadBigLine(view.buffer);
// LoadBigText(view.buffer); // LoadBigText(view.buffer);
// LoadTextA(view.buffer); LoadTextA(view.buffer);
// LoadLine(view.buffer); // LoadLine(view.buffer);
} }

View File

@@ -5,7 +5,8 @@ struct View {
Int line_spacing; Int line_spacing;
Int char_spacing; Int char_spacing;
bool mouse_selecting; bool mouse_selecting;
Range selection_anchor;
Vec2I scroll; Vec2I scroll;
Buffer *buffer; Buffer *buffer;

View File

@@ -295,6 +295,14 @@ void HandleKeybindings(View *_view) {
view.carets.len = 0; view.carets.len = 0;
} }
Add(&view.carets, MakeCaret(p, p)); Add(&view.carets, MakeCaret(p, p));
view.selection_anchor = GetLast(view.carets)->range;
if (IsDoubleClick()) {
// Cursor *c = window.cursors.last();
// c->range = EncloseWord(window.buffer, col->pos);
// window.selection_anchor_point = c->range;
}
MergeCarets(&view.carets);
} else if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) { } else if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) {
view.mouse_selecting = true; view.mouse_selecting = true;
} }
@@ -303,8 +311,14 @@ void HandleKeybindings(View *_view) {
if (view.mouse_selecting) { if (view.mouse_selecting) {
if (!IsMouseButtonDown(MOUSE_BUTTON_LEFT)) view.mouse_selecting = false; if (!IsMouseButtonDown(MOUSE_BUTTON_LEFT)) view.mouse_selecting = false;
Caret &caret = *GetLast(view.carets); Caret &caret = *GetLast(view.carets);
caret = ChangeFront(caret, p); if (view.selection_anchor.min > p) {
MergeCarets(&view.carets); caret = MakeCaret(p, view.selection_anchor.max);
} else if (view.selection_anchor.max < p) {
caret = MakeCaret(p, view.selection_anchor.min);
} else {
caret = MakeCaret(view.selection_anchor.max, view.selection_anchor.min);
}
MergeCarets(&view.carets, &view.selection_anchor);
} }
} }

View File

@@ -112,14 +112,10 @@ void DrawSelection(const View &view, Caret &it) {
} }
void DrawView(View &view) { void DrawView(View &view) {
// Line highlight
Buffer &buf = *view.buffer; Buffer &buf = *view.buffer;
For(view.carets) { For(view.carets) {
Int front = GetFront(it); Int front = GetFront(it);
XY fxy = PosToXY(buf, front); XY fxy = PosToXY(buf, front);
Int back = GetBack(it);
XY bxy = PosToXY(buf, back);
if (GetSize(it.range)) { if (GetSize(it.range)) {
DrawSelection(view, it); DrawSelection(view, it);
} else { } else {
@@ -130,11 +126,8 @@ void DrawView(View &view) {
DrawVisibleText(view); DrawVisibleText(view);
For(view.carets) { For(view.carets) {
Int front = GetFront(it); Int front = GetFront(it);
XY fxy = PosToXY(buf, front); XY fxy = PosToXY(buf, front);
Int back = GetBack(it);
XY bxy = PosToXY(buf, back);
bool main_caret = &it == &view.carets.data[0]; bool main_caret = &it == &view.carets.data[0];
DrawCaret(view, fxy, 0.3f, main_caret ? ColorMainCaret : ColorSubCaret); DrawCaret(view, fxy, 0.3f, main_caret ? ColorMainCaret : ColorSubCaret);
} }