Create empty inserting piece when entering insert mode
This commit is contained in:
parent
827f4efdd9
commit
fe64622762
@ -426,15 +426,21 @@ void PieceTable::begin_insert(const Cursor & cursor, bool before)
|
|||||||
{
|
{
|
||||||
offset += cursor.iterator.num_bytes_in_code_point();
|
offset += cursor.iterator.num_bytes_in_code_point();
|
||||||
}
|
}
|
||||||
|
Change * change = add_change();
|
||||||
|
m_inserting_piece = add_piece();
|
||||||
|
m_inserting_piece->start = &m_append_buffer[m_append_buffer_index];
|
||||||
|
m_inserting_piece->length = 0u;
|
||||||
if (offset == 0u)
|
if (offset == 0u)
|
||||||
{
|
{
|
||||||
/* Insert happens at piece boundary between piece->prev and piece. */
|
/* Insert happens at piece boundary between piece->prev and piece. */
|
||||||
m_insert_before_piece = piece->prev;
|
change->before = piece->prev;
|
||||||
|
change->after = piece;
|
||||||
}
|
}
|
||||||
else if (offset >= piece->length)
|
else if (offset >= piece->length)
|
||||||
{
|
{
|
||||||
/* Insert happens at piece boundary between piece and piece->next. */
|
/* Insert happens at piece boundary between piece and piece->next. */
|
||||||
m_insert_before_piece = piece;
|
change->before = piece;
|
||||||
|
change->after = piece->next;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -453,50 +459,42 @@ void PieceTable::begin_insert(const Cursor & cursor, bool before)
|
|||||||
new_piece_2->prev = new_piece_1;
|
new_piece_2->prev = new_piece_1;
|
||||||
new_piece_2->next = piece->next;
|
new_piece_2->next = piece->next;
|
||||||
|
|
||||||
Change * change = add_change();
|
Change * change2 = add_change();
|
||||||
change->before = piece->prev;
|
change2->before = piece->prev;
|
||||||
change->after = piece->next;
|
change2->after = piece->next;
|
||||||
change->chains[0][0] = piece;
|
change2->chains[0][0] = piece;
|
||||||
change->chains[0][1] = nullptr;
|
change2->chains[0][1] = nullptr;
|
||||||
change->chains[1][0] = new_piece_1;
|
change2->chains[1][0] = new_piece_1;
|
||||||
change->chains[1][1] = new_piece_2;
|
change2->chains[1][1] = new_piece_2;
|
||||||
|
|
||||||
apply_change(change, 1u);
|
apply_change(change2, 1u);
|
||||||
|
|
||||||
m_insert_before_piece = new_piece_1;
|
change->before = new_piece_1;
|
||||||
|
change->after = new_piece_2;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_inserting_piece = nullptr;
|
change->chains[0][0] = nullptr;
|
||||||
|
change->chains[0][1] = nullptr;
|
||||||
|
change->chains[1][0] = m_inserting_piece;
|
||||||
|
change->chains[1][1] = nullptr;
|
||||||
|
|
||||||
|
apply_change(change, 1u);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PieceTable::insert_code_point(uint32_t code_point)
|
void PieceTable::insert_code_point(uint32_t code_point)
|
||||||
{
|
{
|
||||||
if (m_inserting_piece == nullptr)
|
if (in_insert_mode())
|
||||||
{
|
{
|
||||||
m_inserting_piece = add_piece();
|
/* TODO: worry about append buffer page boundaries */
|
||||||
m_inserting_piece->start = &m_append_buffer[m_append_buffer_index];
|
uint8_t bytes = Encoding::encode(code_point, encoding, &m_append_buffer[m_append_buffer_index]);
|
||||||
m_inserting_piece->length = 0u;
|
m_inserting_piece->length += bytes;
|
||||||
m_inserting_piece->prev = m_insert_before_piece;
|
m_append_buffer_index += bytes;
|
||||||
m_inserting_piece->next = m_insert_before_piece->next;
|
|
||||||
|
|
||||||
Change * change = add_change();
|
|
||||||
change->before = m_insert_before_piece;
|
|
||||||
change->after = m_insert_before_piece->next;
|
|
||||||
change->chains[0][0] = nullptr;
|
|
||||||
change->chains[0][1] = nullptr;
|
|
||||||
change->chains[1][0] = m_inserting_piece;
|
|
||||||
change->chains[1][1] = nullptr;
|
|
||||||
|
|
||||||
apply_change(change, 1u);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t bytes = Encoding::encode(code_point, encoding, &m_append_buffer[m_append_buffer_index]);
|
|
||||||
m_inserting_piece->length += bytes;
|
|
||||||
m_append_buffer_index += bytes;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PieceTable::end_insert()
|
void PieceTable::end_insert()
|
||||||
{
|
{
|
||||||
|
m_inserting_piece = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PieceTable::insertion_test(Cursor & c)
|
void PieceTable::insertion_test(Cursor & c)
|
||||||
|
@ -172,6 +172,8 @@ public:
|
|||||||
|
|
||||||
void undo();
|
void undo();
|
||||||
|
|
||||||
|
bool in_insert_mode() { return m_inserting_piece != nullptr; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Piece * add_piece()
|
Piece * add_piece()
|
||||||
{
|
{
|
||||||
@ -199,7 +201,6 @@ protected:
|
|||||||
uint32_t m_piece_index;
|
uint32_t m_piece_index;
|
||||||
PagedBuffer<Change> m_changes;
|
PagedBuffer<Change> m_changes;
|
||||||
uint32_t m_changes_index;
|
uint32_t m_changes_index;
|
||||||
Piece * m_insert_before_piece;
|
|
||||||
Piece * m_inserting_piece;
|
Piece * m_inserting_piece;
|
||||||
|
|
||||||
std::list<std::shared_ptr<Cursor>> m_cursors;
|
std::list<std::shared_ptr<Cursor>> m_cursors;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user