Scrolling the main cursor properly

This commit is contained in:
Krzosa Karol
2024-06-25 09:38:43 +02:00
parent 03644c0561
commit ceb9985242
2 changed files with 85 additions and 25 deletions

View File

@@ -154,6 +154,16 @@ String GetString(const Buffer &buffer, Range range = {0, INT64_MAX}) {
return result; return result;
} }
bool AreEqual(Range a, Range b) {
bool result = a.min == b.min && a.max == b.max;
return result;
}
bool AreEqual(Cursor a, Cursor b) {
bool result = AreEqual(a.range, b.range) && a.ifront == b.ifront;
return result;
}
void MergeSort(int64_t Count, Edit *First, Edit *Temp) { void MergeSort(int64_t Count, Edit *First, Edit *Temp) {
// SortKey = range.min // SortKey = range.min
if (Count == 1) { if (Count == 1) {
@@ -230,10 +240,10 @@ void ApplyEdits(Buffer *buffer, Array<Edit> edits) {
ForItem(it2, edits) { ForItem(it2, edits) {
if (&it1 == &it2) continue; if (&it1 == &it2) continue;
bool a2_inside = it2.range.min >= it1.range.min && it2.range.min <= it1.range.max; bool a2_inside = it2.range.min >= it1.range.min && it2.range.min < it1.range.max;
Assert(!a2_inside); Assert(!a2_inside);
bool b2_inside = it2.range.max >= it1.range.min && it2.range.max <= it1.range.max; bool b2_inside = it2.range.max > it1.range.min && it2.range.max <= it1.range.max;
Assert(!b2_inside); Assert(!b2_inside);
} }
} }

View File

@@ -21,6 +21,7 @@ struct Window {
float right_scroll_bar_pixel_size; float right_scroll_bar_pixel_size;
float bottom_scroll_bar_pixel_size; float bottom_scroll_bar_pixel_size;
Cursor main_cursor_begin_frame;
Array<Cursor> cursors; Array<Cursor> cursors;
Buffer buffer; Buffer buffer;
}; };
@@ -187,15 +188,15 @@ int main() {
} }
window.cursors.add({}); window.cursors.add({});
for (int i = 1; i < 2; i += 1) {
Line line = GetLine(window.buffer, i);
window.cursors.add({line.range.min, line.range.min});
}
windows.add(window); windows.add(window);
} }
Vec2 camera_offset_world_to_render_units = {}; Vec2 camera_offset_world_to_render_units = {};
while (!WindowShouldClose()) { while (!WindowShouldClose()) {
For(windows) {
Assert(it.cursors.len);
it.main_cursor_begin_frame = it.cursors[0];
}
{ {
Window *focused_window = &windows[0]; Window *focused_window = &windows[0];
@@ -210,6 +211,10 @@ int main() {
focused_window->scroll.y -= mouse_wheel; focused_window->scroll.y -= mouse_wheel;
focused_window->scroll.y = ClampBottom(focused_window->scroll.y, 0.f); focused_window->scroll.y = ClampBottom(focused_window->scroll.y, 0.f);
if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_A)) {
focused_window->cursors.clear();
focused_window->cursors.add(MakeCursor(0, focused_window->buffer.len));
}
if (IsKeyPressed(KEY_LEFT) || IsKeyPressedRepeat(KEY_LEFT)) { if (IsKeyPressed(KEY_LEFT) || IsKeyPressedRepeat(KEY_LEFT)) {
For(focused_window->cursors) { For(focused_window->cursors) {
if (IsKeyDown(KEY_LEFT_CONTROL)) { if (IsKeyDown(KEY_LEFT_CONTROL)) {
@@ -327,6 +332,7 @@ int main() {
} }
} }
} }
BeforeEdit(focused_window);
if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_C)) { if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_C)) {
Array<String> strings = {FrameArena}; Array<String> strings = {FrameArena};
@@ -348,20 +354,22 @@ int main() {
ApplyEdits(&focused_window->buffer, edits); ApplyEdits(&focused_window->buffer, edits);
AfterEdit(focused_window, edits); AfterEdit(focused_window, edits);
} }
if (IsKeyDown(KEY_LEFT_CONTROL) && (IsKeyPressed(KEY_X) || IsKeyPressedRepeat(KEY_X))) { if (IsKeyDown(KEY_LEFT_CONTROL) && (IsKeyPressed(KEY_X) || IsKeyPressedRepeat(KEY_X))) {
// First, if there is no selection - select the entire line
For(focused_window->cursors) {
if (GetRangeSize(it.range) == 0) {
Line line = FindLine(focused_window->buffer, it.range.min);
it.range = {line.range.min, line.range.max + 1};
}
}
BeforeEdit(focused_window); BeforeEdit(focused_window);
Array<Edit> edits = {FrameArena}; Array<Edit> edits = {FrameArena};
Array<String> strings = {FrameArena}; Array<String> strings = {FrameArena};
For(focused_window->cursors) { For(focused_window->cursors) {
Range range = {}; AddEdit(&edits, it.range, "");
if (GetRangeSize(it.range)) { String string = GetString(focused_window->buffer, it.range);
range = it.range;
} else {
Line line = FindLine(focused_window->buffer, it.range.min);
range = {line.range.min, line.range.max + 1};
}
AddEdit(&edits, range, "");
String string = GetString(focused_window->buffer, range);
strings.add(string); strings.add(string);
} }
String to_save = Merge(FrameArena, strings, "\n"); String to_save = Merge(FrameArena, strings, "\n");
@@ -370,6 +378,24 @@ int main() {
AfterEdit(focused_window, edits); AfterEdit(focused_window, edits);
} }
if (IsKeyPressed(KEY_ENTER)) {
if (IsKeyDown(KEY_LEFT_CONTROL)) {
} else {
}
}
if (IsKeyPressed(KEY_HOME) || IsKeyPressedRepeat(KEY_HOME)) {
if (IsKeyDown(KEY_LEFT_SHIFT)) {
} else {
}
}
if (IsKeyPressed(KEY_END) || IsKeyPressedRepeat(KEY_END)) {
if (IsKeyDown(KEY_LEFT_SHIFT)) {
} else {
}
}
// @todo: scrolling // @todo: scrolling
if (IsKeyPressed(KEY_DELETE) || IsKeyPressedRepeat(KEY_DELETE)) { if (IsKeyPressed(KEY_DELETE) || IsKeyPressedRepeat(KEY_DELETE)) {
if (IsKeyDown(KEY_LEFT_SHIFT)) { if (IsKeyDown(KEY_LEFT_SHIFT)) {
@@ -377,16 +403,17 @@ int main() {
} }
if (IsKeyPressed(KEY_BACKSPACE) || IsKeyPressedRepeat(KEY_BACKSPACE)) { if (IsKeyPressed(KEY_BACKSPACE) || IsKeyPressedRepeat(KEY_BACKSPACE)) {
if (IsKeyDown(KEY_LEFT_SHIFT)) { if (IsKeyDown(KEY_LEFT_SHIFT)) {
} else {
BeforeEdit(focused_window);
Array<Edit> edits = {FrameArena};
String string = {};
For(focused_window->cursors) {
int64_t pos = MoveLeft(focused_window->buffer, it.range.min);
AddEdit(&edits, {pos, it.range.min}, string);
}
ApplyEdits(&focused_window->buffer, edits);
AfterEdit(focused_window, edits);
} }
BeforeEdit(focused_window);
Array<Edit> edits = {FrameArena};
String string = {};
For(focused_window->cursors) {
int64_t pos = MoveLeft(focused_window->buffer, it.range.min);
AddEdit(&edits, {pos, it.range.min}, string);
}
ApplyEdits(&focused_window->buffer, edits);
AfterEdit(focused_window, edits);
} }
// Handle user input // Handle user input
@@ -463,7 +490,7 @@ int main() {
Array<CellRow> rows = {FrameArena}; Array<CellRow> rows = {FrameArena};
{ {
// Figure out which lines to draw // Figure out which lines to draw
Vec2 s = GetSize(window_rect_in_render_units); Vec2 s = GetSize(window_text_rect_in_render_units);
float line_offset = font_size; float line_offset = font_size;
float _line_min_y = (window.scroll.y) / line_offset; float _line_min_y = (window.scroll.y) / line_offset;
float _line_max_y = (s.y + window.scroll.y) / line_offset; float _line_max_y = (s.y + window.scroll.y) / line_offset;
@@ -528,6 +555,29 @@ int main() {
if (row.cells.len) rows.add(row); if (row.cells.len) rows.add(row);
} }
} }
Assert(rows.len);
// @todo: x axis
// @tood: moving using mouse
// Update the scroll based on first cursor
if (!AreEqual(window.main_cursor_begin_frame, window.cursors[0])) {
Vec2 rect_in_render_units = GetSize(window_text_rect_in_render_units_clamped_to_screen);
float visible_cells_in_render_units = font_size * (float)rows.len;
float cut_off_in_render_units = visible_cells_in_render_units - rect_in_render_units.y;
Cursor cursor = window.cursors[0];
int64_t front = GetFront(cursor);
Line line = FindLine(window.buffer, front);
int64_t min_line = rows[0].line;
int64_t max_line = rows[rows.len - 1].line;
if (line.number < min_line) {
window.scroll.y = line.number * font_size;
} else if (line.number >= max_line) {
int64_t diff = line.number - max_line;
window.scroll.y = (min_line + diff) * font_size + cut_off_in_render_units;
}
}
// Draw debug markers // Draw debug markers
if (0) { if (0) {