aboutsummaryrefslogtreecommitdiff
path: root/src/Body.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Body.cpp')
-rw-r--r--src/Body.cpp60
1 files changed, 59 insertions, 1 deletions
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) {