void inventory_selector::make_item_list(const indexed_invslice &slice, const item_category *def_cat) { for( const auto &scit : slice ) { // That entry represents the item stack const itemstack_or_category item_entry(scit); const item_category *category = def_cat; if (category == NULL) { category = item_entry.category; } // Entry that represents the category header const itemstack_or_category cat_entry(category); itemstack_vector::iterator cat_iter = std::find(items.begin(), items.end(), cat_entry); if (cat_iter == items.end()) { // Category is not yet contained in the list, add it to the end items.push_back(cat_entry); cat_iter = items.end(); } else { // Category is already contained, skip all the items that belong to the // category to insert the current item behind them (but before the next category) do { ++cat_iter; } while(cat_iter != items.end() && cat_iter->it != NULL); } items.insert(cat_iter, item_entry); } }
void inventory_selector::prepare_paging(itemstack_vector &items) { const item_category *prev_category = NULL; for (size_t a = 0; a < items.size(); a++) { const itemstack_or_category &cur_entry = items[a]; if (cur_entry.category != NULL) { prev_category = cur_entry.category; } if (cur_entry.it == NULL && a % items_per_page == items_per_page - 1) { // last entry on a page is a category, insert empty entry // to move category header to next page items.insert(items.begin() + a, itemstack_or_category()); continue; } if (cur_entry.it != NULL && a > 0 && a % items_per_page == 0) { // first entry on a page and is not a category, insert previous category items.insert(items.begin() + a, itemstack_or_category(prev_category)); continue; } } }