#ifndef BUFFERPANE_H #define BUFFERPANE_H #include "Buffer.h" #include "Pane.h" #include "Font.h" #include "GL.h" #include #include "Window.h" class BufferPane : public Pane { public: BufferPane(Window * window, std::shared_ptr buffer); void resize(int width, int height) override; void draw(); void handle_key(uint32_t keyval); protected: enum class CursorMovement : uint8_t { LEFT, RIGHT, UP, DOWN, SOL, EOL, }; int effective_scroll_offset() { return std::min(m_scroll_offset, (m_rows - 1) / 2); } int draw_buffer_line(int screen_row, const Buffer::Iterator & start_of_line); int character_width(uint32_t character); void draw_buffer_character(int screen_column, int screen_row, uint32_t character); void draw_cursor(int x, int y, bool insert_mode); int rows_in_line(const Buffer::Iterator & start_of_line); int rows_in_line_with_iterator_offset(const Buffer::Iterator & start_of_line, const Buffer::Iterator & reference, int * iterator_row_offset); int screen_rows_below_line(const Buffer::Iterator & line); int screen_rows_above_line(const Buffer::Iterator & line, std::list> & backward_lines); int update_cursor_row(std::list> & backward_lines); void walk_line(const Buffer::Iterator & start_of_line, std::function callback); int determine_new_cursor_screen_row(); int col_x(int col) { return col * m_window->font()->get_advance(); } int row_y(int row) { return m_height - (row + 1) * m_window->font()->get_line_height(); } void cursor_move(CursorMovement which); void forward_to_column(int column, bool allow_eol); size_t display_line() const { return m_iterator->line() + 1u; } size_t display_column() const; void draw_status_bar(); Window * m_window; std::shared_ptr m_buffer; int m_rows; int m_columns; int m_scroll_offset; int m_cursor_screen_row; int m_cursor_virtual_column; std::shared_ptr m_iterator; std::list> m_screen_lines; int m_target_column; }; #endif