diff --git a/src/core/PieceTable.cc b/src/core/PieceTable.cc index cfce928..c230879 100644 --- a/src/core/PieceTable.cc +++ b/src/core/PieceTable.cc @@ -345,10 +345,10 @@ void PieceTable::insertion_test(Cursor & c) m_append_buffer[m_append_buffer_index++] = 'z'; Change * change = &m_changes_buffer[m_changes_buffer_index++]; - change->prior_link[0][0] = c.iterator.piece->prev; - change->prior_link[0][1] = c.iterator.piece; - change->prior_link[1][0] = c.iterator.piece; - change->prior_link[1][1] = c.iterator.piece->next; + change->links[0][0][0] = c.iterator.piece->prev; + change->links[0][0][1] = c.iterator.piece; + change->links[0][1][0] = c.iterator.piece; + change->links[0][1][1] = c.iterator.piece->next; if (c.iterator.valid()) { @@ -369,49 +369,56 @@ void PieceTable::insertion_test(Cursor & c) piece->next = piece3; piece3->prev = piece; - change->new_link[0][0] = c.iterator.piece->prev; - change->new_link[0][1] = piece2; - change->new_link[1][0] = piece3; - change->new_link[1][1] = c.iterator.piece->next; + change->links[1][0][0] = c.iterator.piece->prev; + change->links[1][0][1] = piece2; + change->links[1][1][0] = piece3; + change->links[1][1][1] = c.iterator.piece->next; } else { if (c.iterator.piece->length == 0u) { piece->flags = c.iterator.piece->flags; - change->new_link[0][0] = c.iterator.piece->prev; - change->new_link[0][1] = piece; - change->new_link[1][0] = piece; - change->new_link[1][1] = c.iterator.piece->next; + change->links[1][0][0] = c.iterator.piece->prev; + change->links[1][0][1] = piece; + change->links[1][1][0] = piece; + change->links[1][1][1] = c.iterator.piece->next; } else { - change->new_link[0][0] = c.iterator.piece->prev; - change->new_link[0][1] = piece; - change->new_link[1][0] = piece; - change->new_link[1][1] = c.iterator.piece; + change->links[1][0][0] = c.iterator.piece->prev; + change->links[1][0][1] = piece; + change->links[1][1][0] = piece; + change->links[1][1][1] = c.iterator.piece; } } } else { - change->new_link[0][0] = start_piece; - change->new_link[0][1] = piece; - change->new_link[1][0] = piece; - change->new_link[1][1] = end_piece; + change->links[1][0][0] = start_piece; + change->links[1][0][1] = piece; + change->links[1][1][0] = piece; + change->links[1][1][1] = end_piece; } - apply_change(change, 0u); + apply_change(change, 1u); c.warp_to_inserted_piece(piece); } -void PieceTable::apply_change(Change * change, uint8_t reverse) +void PieceTable::undo() { - uint8_t i1 = reverse; - uint8_t i2 = reverse ^ 1u; - change->new_link[i1][i1]->next = change->new_link[i1][i2]; - change->new_link[i1][i2]->prev = change->new_link[i1][i1]; - change->new_link[i2][i1]->next = change->new_link[i2][i2]; - change->new_link[i2][i2]->prev = change->new_link[i2][i1]; + if (m_changes_buffer_index > 0u) + { + m_changes_buffer_index--; + apply_change(&m_changes_buffer[m_changes_buffer_index], 0u); + } +} + +void PieceTable::apply_change(Change * change, uint8_t forward) +{ + change->links[forward][0][0]->next = change->links[forward][0][1]; + change->links[forward][0][1]->prev = change->links[forward][0][0]; + change->links[forward][1][0]->next = change->links[forward][1][1]; + change->links[forward][1][1]->prev = change->links[forward][1][0]; } diff --git a/src/core/PieceTable.h b/src/core/PieceTable.h index e9cdde2..9c9494c 100644 --- a/src/core/PieceTable.h +++ b/src/core/PieceTable.h @@ -134,8 +134,7 @@ public: struct Change { - Piece * prior_link[2][2]; - Piece * new_link[2][2]; + Piece * links[2][2][2]; bool insert; }; @@ -164,7 +163,9 @@ public: void insertion_test(Cursor & c); - void apply_change(Change * change, uint8_t reverse); + void undo(); + + void apply_change(Change * change, uint8_t forward); protected: const uint8_t * m_file_buffer; diff --git a/src/gui/Window.cc b/src/gui/Window.cc index 1c04338..25adc7f 100644 --- a/src/gui/Window.cc +++ b/src/gui/Window.cc @@ -270,6 +270,10 @@ void Window::handle_key(uint32_t scancode, uint32_t mod) case SDL_SCANCODE_P: insertion_test(); break; + case SDL_SCANCODE_U: + m_buffer->piece_table->undo(); + redraw(); + break; } }