diff options
Diffstat (limited to 'src/Body.cpp')
-rw-r--r-- | src/Body.cpp | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/src/Body.cpp b/src/Body.cpp index 06907c8..f224d06 100644 --- a/src/Body.cpp +++ b/src/Body.cpp @@ -132,6 +132,11 @@ namespace QuickMedia { if(items.empty()) return false; + if(!selected_line_top_visible) { + page_scroll += 32.0f; + return true; + } + int new_selected_item = selected_item; int num_items = (int)items.size(); @@ -160,6 +165,11 @@ namespace QuickMedia { if(items.empty()) return false; + if(!selected_line_bottom_visible) { + page_scroll -= 32.0f; + return true; + } + int new_selected_item = selected_item; int num_items = (int)items.size(); @@ -328,6 +338,8 @@ namespace QuickMedia { num_visible_items = 0; last_item_fully_visible = true; last_fully_visible_item = -1; + selected_line_top_visible = true; + selected_line_bottom_visible = true; int num_items = items.size(); if(num_items == 0 || size.y <= 0.0f) { @@ -381,9 +393,22 @@ namespace QuickMedia { } float selected_item_height = get_item_height(items[selected_item].get(), size.x) + spacing_y; - if(page_scroll > size.y - selected_item_height) { + bool selected_item_fits_on_screen = selected_item_height <= size.y; + selected_line_top_visible = pos.y - start_y + page_scroll >= 0.0f; + selected_line_bottom_visible = pos.y - start_y + page_scroll + selected_item_height <= size.y; + + if(pos.y - start_y + page_scroll >= size.y) + page_scroll -= 32.0f; + else if(pos.y - start_y + page_scroll + selected_item_height <= 0.0f) + page_scroll += 32.0f; + + selected_line_top_visible |= selected_item_fits_on_screen; + selected_line_bottom_visible |= selected_item_fits_on_screen; + if(page_scroll > size.y - selected_item_height && selected_item_fits_on_screen) { + //fprintf(stderr, "top!\n"); page_scroll = size.y - selected_item_height; - } else if(page_scroll < 0.0f) { + } else if(page_scroll < 0.0f && selected_line_top_visible && selected_item_fits_on_screen) { + //fprintf(stderr, "bottom!\n"); page_scroll = 0.0f; } |