Move folder

This commit is contained in:
2026-04-13 10:32:46 +01:00
parent c683754d49
commit 037f884050
107 changed files with 292 additions and 155 deletions
Regular → Executable
+13 -58
View File
@@ -2,72 +2,27 @@
void Editor::ensure_cursor() {
if (this->cursor < this->scroll) {
this->cursor.row = this->scroll.row;
this->cursor.col = this->scroll.col;
this->cursor = this->scroll;
this->cursor_preffered = UINT32_MAX;
return;
}
uint32_t numlen =
EXTRA_META + static_cast<int>(std::log10(this->root->line_count + 1));
uint32_t render_width = this->size.col - numlen;
uint32_t visual_rows = 0;
uint32_t line_index = this->scroll.row;
bool first_visual_line = true;
LineIterator *it = begin_l_iter(this->root, line_index);
if (!it)
return;
Coord last_visible = this->scroll;
while (true) {
if (visual_rows >= this->size.row)
break;
uint32_t line_len;
char *line = next_line(it, &line_len);
if (!line)
break;
if (line_len > 0 && line[line_len - 1] == '\n')
line_len--;
uint32_t offset = first_visual_line ? this->scroll.col : 0;
first_visual_line = false;
while (offset < line_len || (line_len == 0 && offset == 0)) {
Coord current = {line_index, offset};
last_visible = current;
visual_rows++;
if (visual_rows >= this->size.row)
break;
uint32_t col = 0;
uint32_t advance = 0;
uint32_t left = line_len - offset;
while (left > 0 && col < render_width) {
uint32_t g =
grapheme_next_character_break_utf8(line + offset + advance, left);
int w = display_width(line + offset + advance, g);
if (col + w > render_width)
break;
advance += g;
left -= g;
col += w;
}
if (line_index == this->cursor.row) {
if (this->cursor.col >= offset &&
this->cursor.col <= offset + advance) {
free(it->buffer);
free(it);
return;
}
}
if (advance == 0)
break;
offset += advance;
if (line_len == 0)
break;
}
line_index++;
uint32_t render_height = 0;
VisualIterator vis(root, scroll, render_width);
std::pair<Coord, Coord> vline;
Coord last_visible = scroll;
while ((vline = vis.next()).first.row != UINT32_MAX &&
render_height < this->size.row) {
render_height++;
last_visible = vline.first;
if (cursor >= vline.first && cursor < vline.second)
return;
}
this->cursor.row = last_visible.row;
this->cursor.col = last_visible.col;
cursor = last_visible;
cursor_preffered = UINT32_MAX;
this->cursor_preffered = UINT32_MAX;
free(it->buffer);
free(it);
}
void Editor::ensure_scroll() {