SDL_Rect menu::get_item_rect_internal(size_t item) const { //unsigned int first_item_on_screen = get_position(); unsigned int first_item_on_screen = get_position() / item_height_; unsigned int leftovers = get_position() - (first_item_on_screen * item_height_); if (item < first_item_on_screen || size_t(item) >= first_item_on_screen + max_items_onscreen() + 2) { return empty_rect; } const std::map<int,SDL_Rect>::const_iterator i = itemRects_.find(item); if(i != itemRects_.end()) return i->second; SDL_Rect const &loc = inner_location(); int y = loc.y + heading_height(); if (item != first_item_on_screen) { const SDL_Rect& prev = get_item_rect_internal(item-1); y = prev.y + prev.h; } else { // KP: sub-item scrolling y -= leftovers; } SDL_Rect res = { loc.x, y, loc.w, get_item_height(item) }; SDL_Rect const &screen_area = ::screen_area(); if(res.x > screen_area.w) { return empty_rect; } else if(res.x + res.w > screen_area.w) { res.w = screen_area.w - res.x; } if(res.y > screen_area.h) { return empty_rect; } else if(res.y + res.h > screen_area.h) { res.h = screen_area.h - res.y; } //only insert into the cache if the menu's co-ordinates have //been initialized if (loc.x > 0 && loc.y > 0) itemRects_.insert(std::pair<int,SDL_Rect>(item,res)); return res; }
SDL_Rect menu::get_item_rect(int item) const { return get_item_rect_internal(item_pos_[item]); }