Improve mouse scrolling

This commit is contained in:
Krzosa Karol
2024-06-29 08:55:16 +02:00
parent 0d3cb029d8
commit ba711b7f14
3 changed files with 57 additions and 30 deletions

View File

@@ -489,15 +489,23 @@ Line GetLineByIndex(Buffer &buffer, int64_t line) {
Line FindLine(Buffer &buffer, int64_t pos) { Line FindLine(Buffer &buffer, int64_t pos) {
Line result = {}; Line result = {};
For(buffer.lines) { For(buffer.lines) {
bool found_last = (pos == it.min && pos == it.max); // @end_of_buffer if (pos >= it.min && pos < it.max) {
bool found = pos >= it.min && pos < it.max;
if (found || found_last) {
result = {buffer.lines.get_index(it), it, it.max}; result = {buffer.lines.get_index(it), it, it.max};
if (it.max > it.min && GetChar(buffer, it.max - 1) == '\n') result.max_without_new_line -= 1; if (it.max > it.min && GetChar(buffer, it.max - 1) == '\n') result.max_without_new_line -= 1;
break; return result;
} }
} }
if (pos == buffer.len) { // @end of buffer
auto &it = buffer.lines[buffer.lines.len - 1];
Assert(it.max == buffer.len);
result = {buffer.lines.get_index(it), it, it.max};
if (it.max > it.min && GetChar(buffer, it.max - 1) == '\n') result.max_without_new_line -= 1;
return result;
}
return result; return result;
} }

View File

@@ -166,9 +166,14 @@ Vector2 MeasureString(Font font, String text, float fontSize, float spacing) {
return textSize; return textSize;
} }
LayoutRow *GetLayoutRow(Window &window, float ypos_window_buffer_world_units) { int64_t YPosWorldToLineNumber(Window &window, float ypos_window_buffer_world_units) {
float line_spacing = window.font_size; float line_spacing = window.font_size;
int64_t line = (int64_t)floorf(ypos_window_buffer_world_units / line_spacing); int64_t line = (int64_t)floorf(ypos_window_buffer_world_units / line_spacing);
return line;
}
LayoutRow *GetLayoutRow(Window &window, float ypos_window_buffer_world_units) {
int64_t line = YPosWorldToLineNumber(window, ypos_window_buffer_world_units);
if (line >= 0 && line < window.layout.rows.len) { if (line >= 0 && line < window.layout.rows.len) {
return window.layout.rows.data + line; return window.layout.rows.data + line;
} }

View File

@@ -65,7 +65,7 @@ int main() {
// Array<Edit> edits = {FrameArena}; // Array<Edit> edits = {FrameArena};
// AddEdit(&edits, GetEnd(window.buffer), Format(FrameArena, "line number: 1")); // AddEdit(&edits, GetEnd(window.buffer), Format(FrameArena, "line number: 1"));
// ApplyEdits(&window.buffer, edits); // ApplyEdits(&window.buffer, edits);
for (int i = 0; i < 5; i += 1) { for (int i = 0; i < 50; i += 1) {
Array<Edit> edits = {FrameArena}; Array<Edit> edits = {FrameArena};
AddEdit(&edits, GetEnd(window.buffer), Format(FrameArena, "line number: %d\n", i)); AddEdit(&edits, GetEnd(window.buffer), Format(FrameArena, "line number: %d\n", i));
ApplyEdits(&window.buffer, edits); ApplyEdits(&window.buffer, edits);
@@ -373,37 +373,51 @@ int main() {
Array<LayoutColumn> visible_columns = CalculateVisibleColumns(&FrameArena, window); Array<LayoutColumn> visible_columns = CalculateVisibleColumns(&FrameArena, window);
// Mouse selection // Mouse selection
// @todo: multicursor // @todo: multicursor
// @todo: selecting while not hovering over glyph shapes SetMouseCursor(MOUSE_CURSOR_DEFAULT);
{ if (IsMouseButtonDown(MOUSE_BUTTON_LEFT)) {
SetMouseCursor(MOUSE_CURSOR_DEFAULT);
Vec2 mouse = GetMousePosition(); Vec2 mouse = GetMousePosition();
Vec2 mouse_lookup = Vector2Add(mouse, window.scroll); Vec2 mouse_lookup = Vector2Add(mouse, window.scroll);
Tuple<LayoutRow *, LayoutColumn *> rowcol = GetRowCol(window, mouse_lookup); LayoutRow *row = GetLayoutRow(window, mouse_lookup.y);
if (rowcol.b) { if (row == NULL) {
Rect2 col_rect = rowcol.b->rect - window.scroll; if (mouse.y < 0) {
Rectangle col_rectangle = ToRectangle(col_rect); row = window.layout.rows.first();
if (CheckCollisionPointRec(mouse, col_rectangle)) { } else {
if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) { row = window.layout.rows.last();
window.cursors.clear();
window.cursors.add({rowcol.b->pos, rowcol.b->pos});
window.mouse_selecting = true;
}
if (!window.mouse_selecting) {
SetMouseCursor(MOUSE_CURSOR_IBEAM);
}
} }
}
Assert(row);
if (window.mouse_selecting) { LayoutColumn *col = GetLayoutColumn(row, mouse_lookup.x);
SetMouseCursor(MOUSE_CURSOR_RESIZE_ALL); if (col == NULL) {
if (!IsMouseButtonDown(MOUSE_BUTTON_LEFT)) { if (mouse.x < 0) {
window.mouse_selecting = false; col = row->columns.first();
} } else {
Cursor *cursor = window.cursors.last(); col = row->columns.last();
cursor[0] = ChangeFront(*cursor, rowcol.b->pos);
} }
} }
Assert(col);
Rect2 col_rect = col->rect - window.scroll;
Rectangle col_rectangle = ToRectangle(col_rect);
if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) {
window.cursors.clear();
window.cursors.add({col->pos, col->pos});
window.mouse_selecting = true;
}
if (!window.mouse_selecting) {
SetMouseCursor(MOUSE_CURSOR_IBEAM);
}
if (window.mouse_selecting) {
SetMouseCursor(MOUSE_CURSOR_RESIZE_ALL);
if (!IsMouseButtonDown(MOUSE_BUTTON_LEFT)) {
window.mouse_selecting = false;
}
Cursor *cursor = window.cursors.last();
cursor[0] = ChangeFront(*cursor, col->pos);
}
} }
// Update the scroll based on first cursor // Update the scroll based on first cursor