Fix merge carets with mouse
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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]);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user