add a piece table insertion test
This commit is contained in:
parent
bc4c5b5c98
commit
c2c0d6f042
@ -10,6 +10,7 @@ PieceTable::PieceTable(const uint8_t * file_buffer, unsigned long file_buffer_si
|
||||
end_piece->prev = start_piece;
|
||||
m_piece_index = 2u;
|
||||
tabstop = 4u;
|
||||
m_append_buffer_index = 0u;
|
||||
}
|
||||
|
||||
void PieceTable::append_initial_line_piece(uint8_t * start, uint32_t length, bool eol)
|
||||
@ -240,6 +241,14 @@ bool PieceTable::Cursor::go_right(int n)
|
||||
return true;
|
||||
}
|
||||
|
||||
void PieceTable::Cursor::warp_to_inserted_piece(Piece * piece)
|
||||
{
|
||||
iterator.piece = piece;
|
||||
iterator.offset = 0u;
|
||||
iterator.go_end_of_piece();
|
||||
calculate_column();
|
||||
}
|
||||
|
||||
bool PieceTable::Cursor::is_start_of_line()
|
||||
{
|
||||
return iterator.valid() &&
|
||||
@ -323,3 +332,66 @@ void PieceTable::Cursor::forward_to_column(uint32_t c)
|
||||
diff = new_diff;
|
||||
}
|
||||
}
|
||||
|
||||
void PieceTable::insertion_test(Cursor & c)
|
||||
{
|
||||
Piece * piece = add_piece();
|
||||
piece->start = &m_append_buffer[m_append_buffer_index];
|
||||
piece->length = 3u;
|
||||
piece->flags = 0u;
|
||||
m_append_buffer[m_append_buffer_index++] = 'x';
|
||||
m_append_buffer[m_append_buffer_index++] = 'y';
|
||||
m_append_buffer[m_append_buffer_index++] = 'z';
|
||||
if (c.iterator.valid())
|
||||
{
|
||||
if (c.iterator.offset > 0u)
|
||||
{
|
||||
Piece * piece2 = add_piece();
|
||||
piece2->start = c.iterator.piece->start;
|
||||
piece2->length = c.iterator.offset;
|
||||
piece2->flags = 0u;
|
||||
|
||||
Piece * piece3 = add_piece();
|
||||
piece3->start = c.iterator.piece->start + c.iterator.offset;
|
||||
piece3->length = c.iterator.piece->length - c.iterator.offset;
|
||||
piece3->flags = c.iterator.piece->flags;
|
||||
|
||||
c.iterator.piece->prev->next = piece2;
|
||||
piece2->prev = c.iterator.piece->prev;
|
||||
piece2->next = piece;
|
||||
piece->prev = piece2;
|
||||
|
||||
piece->next = piece3;
|
||||
piece3->prev = piece;
|
||||
piece3->next = c.iterator.piece->next;
|
||||
piece3->next->prev = piece3;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (c.iterator.piece->length == 0u)
|
||||
{
|
||||
piece->flags = c.iterator.piece->flags;
|
||||
c.iterator.piece->prev->next = piece;
|
||||
c.iterator.piece->next->prev = piece;
|
||||
piece->prev = c.iterator.piece->prev;
|
||||
piece->next = c.iterator.piece->next;
|
||||
}
|
||||
else
|
||||
{
|
||||
c.iterator.piece->prev->next = piece;
|
||||
piece->prev = c.iterator.piece->prev;
|
||||
c.iterator.piece->prev = piece;
|
||||
piece->next = c.iterator.piece;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
start_piece->next = piece;
|
||||
piece->prev = start_piece;
|
||||
end_piece->prev = piece;
|
||||
piece->next = end_piece;
|
||||
}
|
||||
|
||||
c.warp_to_inserted_piece(piece);
|
||||
}
|
||||
|
@ -120,6 +120,7 @@ public:
|
||||
{
|
||||
return (c.line == line) && (c.column == column);
|
||||
}
|
||||
void warp_to_inserted_piece(Piece * piece);
|
||||
|
||||
protected:
|
||||
bool is_start_of_line();
|
||||
@ -154,6 +155,8 @@ public:
|
||||
|
||||
std::shared_ptr<Cursor> add_cursor();
|
||||
|
||||
void insertion_test(Cursor & c);
|
||||
|
||||
protected:
|
||||
const uint8_t * m_file_buffer;
|
||||
unsigned long m_file_buffer_size;
|
||||
@ -163,6 +166,7 @@ protected:
|
||||
uint32_t m_piece_index;
|
||||
|
||||
PagedBuffer<uint8_t> m_append_buffer;
|
||||
uint32_t m_append_buffer_index;
|
||||
PagedBuffer<Piece> m_pieces;
|
||||
|
||||
std::list<std::shared_ptr<Cursor>> m_cursors;
|
||||
|
@ -268,6 +268,9 @@ void Window::handle_key(uint32_t scancode, uint32_t mod)
|
||||
case SDL_SCANCODE_L:
|
||||
cursor_move(CURSOR_RIGHT);
|
||||
break;
|
||||
case SDL_SCANCODE_P:
|
||||
insertion_test();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -521,3 +524,9 @@ void Window::draw_status_bar()
|
||||
x += m_font.get_advance();
|
||||
}
|
||||
}
|
||||
|
||||
void Window::insertion_test()
|
||||
{
|
||||
m_buffer->piece_table->insertion_test(*m_cursor);
|
||||
redraw();
|
||||
}
|
||||
|
@ -42,6 +42,7 @@ protected:
|
||||
void update_cursor_row(int cursor_row);
|
||||
void draw_rect(int x, int y, int width, int height, float r, float g, float b, float a);
|
||||
void draw_status_bar();
|
||||
void insertion_test();
|
||||
|
||||
SDL_Window * m_window;
|
||||
bool m_exit_requested;
|
||||
|
Loading…
x
Reference in New Issue
Block a user