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();
|
ProfileFunction();
|
||||||
|
Array<Caret> &carets = *_carets;
|
||||||
Scratch scratch;
|
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) {
|
||||||
|
|||||||
@@ -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]);
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ struct View {
|
|||||||
Int char_spacing;
|
Int char_spacing;
|
||||||
|
|
||||||
bool mouse_selecting;
|
bool mouse_selecting;
|
||||||
|
Range selection_anchor;
|
||||||
|
|
||||||
Vec2I scroll;
|
Vec2I scroll;
|
||||||
Buffer *buffer;
|
Buffer *buffer;
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
@@ -132,9 +128,6 @@ void DrawView(View &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);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user