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

View File

@@ -38,6 +38,23 @@ inline bool CtrlAltPress(int key) {
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) {
pos = Clamp(pos, (Int)0, buffer.len);
bool standing_on_whitespace = IsWhitespace(buffer.str[pos]);

View File

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

View File

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

View File

@@ -295,6 +295,14 @@ void HandleKeybindings(View *_view) {
view.carets.len = 0;
}
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)) {
view.mouse_selecting = true;
}
@@ -303,8 +311,14 @@ void HandleKeybindings(View *_view) {
if (view.mouse_selecting) {
if (!IsMouseButtonDown(MOUSE_BUTTON_LEFT)) view.mouse_selecting = false;
Caret &caret = *GetLast(view.carets);
caret = ChangeFront(caret, p);
MergeCarets(&view.carets);
if (view.selection_anchor.min > p) {
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) {
// Line highlight
Buffer &buf = *view.buffer;
For(view.carets) {
Int front = GetFront(it);
XY fxy = PosToXY(buf, front);
Int back = GetBack(it);
XY bxy = PosToXY(buf, back);
if (GetSize(it.range)) {
DrawSelection(view, it);
} else {
@@ -130,11 +126,8 @@ void DrawView(View &view) {
DrawVisibleText(view);
For(view.carets) {
Int front = GetFront(it);
XY fxy = PosToXY(buf, front);
Int back = GetBack(it);
XY bxy = PosToXY(buf, back);
Int front = GetFront(it);
XY fxy = PosToXY(buf, front);
bool main_caret = &it == &view.carets.data[0];
DrawCaret(view, fxy, 0.3f, main_caret ? ColorMainCaret : ColorSubCaret);
}