From f6a07804546cb0ee0e1a243929dbe7ec25214c9e Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sun, 9 May 2021 15:59:09 +0200 Subject: Redesign login, refactor keyboard movement --- src/Body.cpp | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) (limited to 'src/Body.cpp') diff --git a/src/Body.cpp b/src/Body.cpp index be9d1fd..98f08e8 100644 --- a/src/Body.cpp +++ b/src/Body.cpp @@ -399,7 +399,41 @@ namespace QuickMedia { } } - bool Body::on_event(const sf::RenderWindow &window, const sf::Event &event) { + bool Body::on_event(const sf::RenderWindow &window, const sf::Event &event, bool keyboard_navigation) { + if(keyboard_navigation && event.type == sf::Event::KeyPressed) { + if(event.key.code == sf::Keyboard::Up || (event.key.control && event.key.code == sf::Keyboard::K)) { + bool top_reached = select_previous_item(); + if(!top_reached && on_top_reached) + on_top_reached(); + return true; + } else if(event.key.code == sf::Keyboard::Down || (event.key.control && event.key.code == sf::Keyboard::J)) { + bool bottom_reached = select_next_item(); + if(!bottom_reached && on_bottom_reached) + on_bottom_reached(); + return true; + } else if(event.key.code == sf::Keyboard::Home) { + select_first_item(); + if(on_top_reached) + on_top_reached(); + return true; + } else if(event.key.code == sf::Keyboard::End) { + select_last_item(); + if(on_bottom_reached) + on_bottom_reached(); + return true; + } else if(event.key.code == sf::Keyboard::PageUp) { + bool top_reached = select_previous_page(); + if(!top_reached && on_top_reached) + on_top_reached(); + return true; + } else if(event.key.code == sf::Keyboard::PageDown) { + bool bottom_reached = select_next_page(); + if(!bottom_reached && on_bottom_reached) + on_bottom_reached(); + return true; + } + } + if(event.type == sf::Event::Resized) clamp_selected_item_to_body_count = 1; @@ -488,9 +522,33 @@ namespace QuickMedia { if(mouse_scroll_accel.y > 0.1 && first_fully_visible_item != -1) { selected_item = first_fully_visible_item; clamp_selection(); + // TODO: Cache this + if(on_top_reached) { + int first_visible_item = -1; + for(int i = 0; i <= selected_item; ++i) { + if(items[i]->visible) { + first_visible_item = i; + break; + } + } + if(first_visible_item == first_fully_visible_item) + on_top_reached(); + } } else if(mouse_scroll_accel.y < -0.1 && last_fully_visible_item != -1) { selected_item = last_fully_visible_item; clamp_selection(); + // TODO: Cache this + if(on_bottom_reached) { + int last_visible_item = -1; + for(int i = items.size() - 1; i >= selected_item; --i) { + if(items[i]->visible) { + last_visible_item = i; + break; + } + } + if(last_visible_item == last_fully_visible_item) + on_bottom_reached(); + } } if(!mouse_left_pressed) { -- cgit v1.2.3