From 4d5e3dc0ea982cced173ed4705336cf33718114b Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sat, 8 Oct 2016 16:59:11 -0400 Subject: [PATCH] continued insertion testing, not sure i like this method --- src/core/PieceTable.cc | 29 +++++++++++++++++++++++++++++ src/core/PieceTable.h | 1 + src/gui/Window.cc | 7 +++++++ 3 files changed, 37 insertions(+) diff --git a/src/core/PieceTable.cc b/src/core/PieceTable.cc index eaee9ae..5df8a58 100644 --- a/src/core/PieceTable.cc +++ b/src/core/PieceTable.cc @@ -382,11 +382,40 @@ void PieceTable::begin_insert(const Cursor & cursor, bool before) change->links[1][1][1] = piece->next; apply_change(change, 1u); + + m_insert_before_piece = new_piece_1; } + + m_inserting_piece = nullptr; } void PieceTable::insert_code_point(uint32_t code_point) { + if (m_inserting_piece == nullptr) + { + m_inserting_piece = add_piece(); + m_inserting_piece->start = &m_append_buffer[m_append_buffer_index]; + m_inserting_piece->length = 0u; + m_inserting_piece->flags = 0u; + m_inserting_piece->prev = m_insert_before_piece; + m_inserting_piece->next = m_insert_before_piece->next; + + Change * change = add_change(); + change->links[0][0][0] = m_insert_before_piece; + change->links[0][0][1] = m_insert_before_piece->next; + change->links[0][1][0] = nullptr; + change->links[0][1][1] = nullptr; + change->links[1][0][0] = m_insert_before_piece; + change->links[1][0][1] = m_inserting_piece; + change->links[1][1][0] = m_inserting_piece; + change->links[1][1][1] = m_insert_before_piece->next; + + 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() diff --git a/src/core/PieceTable.h b/src/core/PieceTable.h index af385da..936c512 100644 --- a/src/core/PieceTable.h +++ b/src/core/PieceTable.h @@ -188,6 +188,7 @@ protected: PagedBuffer m_changes; uint32_t m_changes_index; Piece * m_insert_before_piece; + Piece * m_inserting_piece; std::list> m_cursors; }; diff --git a/src/gui/Window.cc b/src/gui/Window.cc index 5996d6b..dce0f1b 100644 --- a/src/gui/Window.cc +++ b/src/gui/Window.cc @@ -277,6 +277,13 @@ void Window::handle_key(uint32_t scancode, uint32_t mod) case SDL_SCANCODE_I: m_buffer->piece_table->begin_insert(*m_cursor, true); break; + case SDL_SCANCODE_O: + m_buffer->piece_table->insert_code_point('*'); + redraw(); + break; + case SDL_SCANCODE_A: + m_buffer->piece_table->begin_insert(*m_cursor, false); + break; } }