From f876b68bd0a6f9be568a383d9550c2b594e476ca Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Wed, 7 Sep 2016 22:31:24 -0400 Subject: [PATCH] Add cursor movements to move to SOL and EOL. --- src/core/PieceTable.cc | 15 +++++++++++++-- src/core/PieceTable.h | 4 ++-- src/gui/Window.cc | 22 ++++++++++++++++++++++ src/gui/Window.h | 2 ++ 4 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/core/PieceTable.cc b/src/core/PieceTable.cc index f74c697..9f44107 100644 --- a/src/core/PieceTable.cc +++ b/src/core/PieceTable.cc @@ -122,28 +122,39 @@ PieceTable::Cursor::Cursor(PieceTable * pt) : iterator(pt) init_column(); } -void PieceTable::Cursor::go_start_of_line() +bool PieceTable::Cursor::go_start_of_line() { + bool rv = false; while (iterator.valid() && (!iterator.piece->prev->eol()) && (iterator.piece->prev != iterator.piece_table->start_piece)) { iterator.go_prev_piece(); + rv = true; } + if (iterator.offset != 0u) + rv = true; iterator.offset = 0u; init_column(); + return rv; } -void PieceTable::Cursor::go_end_of_line() +bool PieceTable::Cursor::go_end_of_line() { + bool rv = false; while (iterator.valid() && (!iterator.piece->eol()) && (iterator.piece->next != iterator.piece_table->end_piece)) { iterator.go_next_piece(); + rv = true; } + uint32_t current_column = column; iterator.go_end_of_piece(); calculate_column(); + if (column != current_column) + rv = true; + return rv; } bool PieceTable::Cursor::go_up(int n, uint32_t desired_column) diff --git a/src/core/PieceTable.h b/src/core/PieceTable.h index 9b7c092..d84d93d 100644 --- a/src/core/PieceTable.h +++ b/src/core/PieceTable.h @@ -110,8 +110,8 @@ public: Cursor(PieceTable * pt); - void go_start_of_line(); - void go_end_of_line(); + bool go_start_of_line(); + bool go_end_of_line(); bool go_up(int n, uint32_t desired_column); bool go_down(int n, uint32_t desired_column); bool go_left(int n); diff --git a/src/gui/Window.cc b/src/gui/Window.cc index 5f33853..85da226 100644 --- a/src/gui/Window.cc +++ b/src/gui/Window.cc @@ -234,6 +234,12 @@ void Window::handle_key(uint32_t scancode, uint32_t mod) case SDL_SCANCODE_ESCAPE: m_exit_requested = true; break; + case SDL_SCANCODE_0: + cursor_move(CURSOR_SOL); + break; + case SDL_SCANCODE_9: + cursor_move(CURSOR_EOL); + break; case SDL_SCANCODE_H: cursor_move(CURSOR_LEFT); break; @@ -269,6 +275,12 @@ void Window::cursor_move(int which) case CURSOR_DOWN: success = m_cursor->go_down(1, m_cursor->column); break; + case CURSOR_SOL: + success = m_cursor->go_start_of_line(); + break; + case CURSOR_EOL: + success = m_cursor->go_end_of_line(); + break; } if (success) { @@ -293,6 +305,16 @@ void Window::cursor_move(int which) row_offset = c.column / m_columns - current_row_offset + 1 + m_cursor->column / m_columns; } break; + case CURSOR_SOL: + row_offset = -current_row_offset; + break; + case CURSOR_EOL: + { + PieceTable::Cursor c = *m_cursor; + c.go_end_of_line(); + row_offset = c.column / m_columns - current_row_offset; + } + break; } update_cursor_row(m_cursor_row + row_offset); redraw(); diff --git a/src/gui/Window.h b/src/gui/Window.h index b7c6c31..c502e0f 100644 --- a/src/gui/Window.h +++ b/src/gui/Window.h @@ -22,6 +22,8 @@ protected: CURSOR_RIGHT, CURSOR_UP, CURSOR_DOWN, + CURSOR_SOL, + CURSOR_EOL, }; void resize();