diff --git a/src/gui/BufferPane.cc b/src/gui/BufferPane.cc index 7c647b6..78339fe 100644 --- a/src/gui/BufferPane.cc +++ b/src/gui/BufferPane.cc @@ -608,9 +608,29 @@ void BufferPane::enter_insert_mode(Window::EnterInsertModeMode which) m_window->request_redraw(); } -void BufferPane::scroll_window_up() +int BufferPane::calculate_lines_to_scroll(Window::ScrollMode scroll_mode) { - const int lines_to_scroll = 3; + switch (scroll_mode) + { + case Window::ScrollMode::ONE_LINE: + return 1; + break; + case Window::ScrollMode::WHEEL: + return 3; + break; + case Window::ScrollMode::HALF_SCREEN: + return m_rows / 2; + break; + case Window::ScrollMode::WHOLE_SCREEN: + return m_rows - 1; + break; + } + return 0; +} + +void BufferPane::scroll_window_up(Window::ScrollMode scroll_mode) +{ + int lines_to_scroll = calculate_lines_to_scroll(scroll_mode); int so = effective_scroll_offset(); int lines_to_move_cursor = (so + lines_to_scroll) - (m_rows - m_cursor_screen_row - 1); while (lines_to_move_cursor-- > 0) @@ -621,9 +641,9 @@ void BufferPane::scroll_window_up() m_window->request_redraw(); } -void BufferPane::scroll_window_down() +void BufferPane::scroll_window_down(Window::ScrollMode scroll_mode) { - const int lines_to_scroll = 3; + int lines_to_scroll = calculate_lines_to_scroll(scroll_mode); int so = effective_scroll_offset(); int lines_to_move_cursor = (so + lines_to_scroll) - m_cursor_screen_row; while (lines_to_move_cursor-- > 0) diff --git a/src/gui/BufferPane.h b/src/gui/BufferPane.h index 6eb92c1..b2c3f3b 100644 --- a/src/gui/BufferPane.h +++ b/src/gui/BufferPane.h @@ -21,8 +21,8 @@ public: void kill_character_at_cursor(); void write_file(); bool insert_mode() const { return m_buffer->insert_mode(); } - void scroll_window_up(); - void scroll_window_down(); + void scroll_window_up(Window::ScrollMode scroll_mode); + void scroll_window_down(Window::ScrollMode scroll_mode); protected: int effective_scroll_offset() @@ -56,6 +56,7 @@ protected: size_t display_line() const { return m_iterator->line() + 1u; } size_t display_column() const; void draw_status_bar(); + int calculate_lines_to_scroll(Window::ScrollMode scroll_mode); Window * m_window; std::shared_ptr m_buffer; diff --git a/src/gui/Window.cc b/src/gui/Window.cc index cf58e7e..2afd635 100644 --- a/src/gui/Window.cc +++ b/src/gui/Window.cc @@ -220,11 +220,11 @@ void Window::handle_event(SDL_Event & event) case SDL_MOUSEWHEEL: if (event.wheel.y > 0) { - m_buffer_pane->scroll_window_up(); + m_buffer_pane->scroll_window_up(ScrollMode::WHEEL); } else { - m_buffer_pane->scroll_window_down(); + m_buffer_pane->scroll_window_down(ScrollMode::WHEEL); } break; } @@ -297,9 +297,27 @@ void Window::handle_keyval(uint32_t keyval) case 'x': m_buffer_pane->kill_character_at_cursor(); break; + case Keymod::CTRL + 'b': + m_buffer_pane->scroll_window_up(ScrollMode::WHOLE_SCREEN); + break; + case Keymod::CTRL + 'd': + m_buffer_pane->scroll_window_down(ScrollMode::HALF_SCREEN); + break; + case Keymod::CTRL + 'e': + m_buffer_pane->scroll_window_down(ScrollMode::ONE_LINE); + break; + case Keymod::CTRL + 'f': + m_buffer_pane->scroll_window_down(ScrollMode::WHOLE_SCREEN); + break; + case Keymod::CTRL + 'u': + m_buffer_pane->scroll_window_up(ScrollMode::HALF_SCREEN); + break; case Keymod::CTRL + 'w': m_buffer_pane->write_file(); break; + case Keymod::CTRL + 'y': + m_buffer_pane->scroll_window_up(ScrollMode::ONE_LINE); + break; case Keymod::CTRL + 'q': m_exit_requested = true; break; diff --git a/src/gui/Window.h b/src/gui/Window.h index cee712f..f080d83 100644 --- a/src/gui/Window.h +++ b/src/gui/Window.h @@ -39,6 +39,14 @@ public: SCREEN_ROW_DOWN, }; + enum class ScrollMode : uint8_t + { + ONE_LINE, + WHEEL, + HALF_SCREEN, + WHOLE_SCREEN, + }; + enum class EnterInsertModeMode : uint8_t { START_OF_CHAR,