diff --git a/src/core/Buffer.cc b/src/core/Buffer.cc index 32bcf77..9ad941b 100644 --- a/src/core/Buffer.cc +++ b/src/core/Buffer.cc @@ -8,7 +8,7 @@ Buffer::Buffer() { m_file_buffer = nullptr; m_file_buffer_size = 0u; - m_piece_table = std::make_shared(nullptr, 0u); + piece_table = std::make_shared(nullptr, 0u); } Buffer::~Buffer() @@ -48,16 +48,12 @@ bool Buffer::load_from_file(const char * filename) TextLoader text_loader; text_loader.load_buffer(m_file_buffer, file_size); - for (auto it = text_loader.begin(); it != text_loader.end(); it++) - { - m_lines.push_back(std::make_shared(it->first, it->second)); - } - m_piece_table = std::make_shared(m_file_buffer, m_file_buffer_size); + piece_table = std::make_shared(m_file_buffer, m_file_buffer_size); for (auto it = text_loader.begin(); it != text_loader.end(); it++) { /* TODO: correctly calculate n_chars based on current file encoding. */ - m_piece_table->append_initial_line_piece(it->first, it->second, it->second); + piece_table->append_initial_line_piece(it->first, it->second, it->second); } return true; diff --git a/src/core/Buffer.h b/src/core/Buffer.h index 8d3921c..970ca6c 100644 --- a/src/core/Buffer.h +++ b/src/core/Buffer.h @@ -3,35 +3,20 @@ #include #include -#include "Text.h" #include "PieceTable.h" class Buffer { public: + std::shared_ptr piece_table; + Buffer(); ~Buffer(); bool load_from_file(const char * filename); - typedef std::shared_ptr LineType; - typedef std::list LinesType; - - auto begin() { return m_lines.begin(); } - auto end() { return m_lines.end(); } - auto cbegin() const { return m_lines.cbegin(); } - auto cend() const { return m_lines.cend(); } - auto rbegin() { return m_lines.rbegin(); } - auto rend() { return m_lines.rend(); } - auto crbegin() const { return m_lines.crbegin(); } - auto crend() const { return m_lines.crend(); } - - int get_num_lines() { return m_lines.size(); } - protected: - LinesType m_lines; uint8_t * m_file_buffer; unsigned long m_file_buffer_size; - std::shared_ptr m_piece_table; void free_file_buffer(); }; diff --git a/src/gui/Window.cc b/src/gui/Window.cc index 47a1e1c..330beef 100644 --- a/src/gui/Window.cc +++ b/src/gui/Window.cc @@ -113,7 +113,7 @@ bool Window::create(std::shared_ptr buffer) m_programs.text->set_color(1.0, 1.0, 1.0, 1.0); m_buffer = buffer; - m_line = 0; + m_start_piece = m_buffer->piece_table->start_descriptor->next; resize(); @@ -223,18 +223,18 @@ void Window::handle_event(SDL_Event & event) void Window::scroll_down() { - if (m_line < m_buffer->get_num_lines() - 1) + if (m_start_piece->next != m_buffer->piece_table->end_descriptor) { - m_line++; + m_start_piece = m_start_piece->next; redraw(); } } void Window::scroll_up() { - if (m_line > 0) + if (m_start_piece->prev != m_buffer->piece_table->start_descriptor) { - m_line--; + m_start_piece = m_start_piece->prev; redraw(); } } @@ -257,17 +257,14 @@ void Window::redraw() int advance = m_font.get_advance(); int line_height = m_font.get_line_height(); int y = m_height - line_height; - int line_number = 0; - for (auto line = m_buffer->cbegin(); line != m_buffer->cend(); line++) + for (PieceTable::PieceDescriptor * pd = m_start_piece; + pd != m_buffer->piece_table->end_descriptor; + pd = pd->next) { - if (line_number++ < m_line) - { - continue; - } int x = 0; - for (int i = 0, len = (*line)->size(); i < len; i++) + for (int i = 0, len = pd->length; i < len; i++) { - uint8_t c = (**line)[i]; + uint8_t c = pd->start[i]; auto g = m_font.get_glyph(c); m_programs.text->set_position(x, y); g->render(); diff --git a/src/gui/Window.h b/src/gui/Window.h index 48ea124..de0d100 100644 --- a/src/gui/Window.h +++ b/src/gui/Window.h @@ -32,7 +32,7 @@ protected: std::shared_ptr m_buffer; - int m_line; + PieceTable::PieceDescriptor * m_start_piece; }; #endif