GTextEditor: Support splitting lines at the cursor with the Return key.

This commit is contained in:
Andreas Kling 2019-03-07 16:49:04 +01:00
parent a64b71fb3d
commit 43d56b6f3a
3 changed files with 30 additions and 6 deletions

View file

@ -252,12 +252,22 @@ public:
void resize(ssize_t new_size)
{
ASSERT(new_size >= size());
if (!new_size)
if (new_size == size())
return;
ensure_capacity(new_size);
for (ssize_t i = size(); i < new_size; ++i)
new (m_impl->slot(i)) T;
if (!new_size) {
clear();
return;
}
if (new_size > size()) {
ensure_capacity(new_size);
for (ssize_t i = size(); i < new_size; ++i)
new (m_impl->slot(i)) T;
} else {
for (int i = new_size; i < size(); ++i)
m_impl->at(i).~T();
}
m_impl->m_size = new_size;
}

View file

@ -240,10 +240,17 @@ void GTextEditor::insert_at_cursor(char ch)
if (at_tail || at_head) {
m_lines.insert(m_cursor.line() + (at_tail ? 1 : 0), make<Line>());
update_scrollbar_ranges();
set_cursor(m_cursor.line() + 1, 0);
update();
set_cursor(m_cursor.line() + 1, 0);
return;
}
auto new_line = make<Line>();
new_line->append(current_line().characters() + m_cursor.column(), current_line().length() - m_cursor.column());
current_line().truncate(m_cursor.column());
m_lines.insert(m_cursor.line() + 1, move(new_line));
update_scrollbar_ranges();
update();
set_cursor(m_cursor.line() + 1, 0);
return;
}
current_line().insert(m_cursor.column(), ch);
@ -414,3 +421,9 @@ void GTextEditor::Line::remove(int index)
m_text.remove(index);
}
}
void GTextEditor::Line::truncate(int length)
{
m_text.resize(length + 1);
m_text.last() = 0;
}

View file

@ -73,6 +73,7 @@ private:
void insert(int index, char);
void remove(int index);
void append(const char*, int);
void truncate(int length);
private:
// NOTE: This vector is null terminated.