/* client/inventorylistview.cc This file is part of the Osirion project and is distributed under the terms and conditions of the GNU General Public License version 2 */ #include "core/application.h" #include "client/inventorylistview.h" #include "ui/listitem.h" #include "ui/paint.h" #include "ui/ui.h" #include namespace client { InventoryListView::InventoryListView(ui::Widget *parent) : ui::ListView (parent) { listview_inventory = 0; listview_infotype = 0; listview_timestamp = 0; listview_infotimestamp = 0; listview_showempty = false; listview_timestamp = 0; listview_infotimestamp = 0; listview_inventory = 0; } InventoryListView::~InventoryListView() { } void InventoryListView::set_inventory(core::Inventory *inventory, core::InfoType *infotype) { const core::Item *selecteditem = (selected() ? selected()->item() : 0); ListView::clear(); deselect(); listview_timestamp = 0; listview_infotimestamp = 0; listview_inventory = inventory; listview_infotype = infotype; if (!listview_inventory || !listview_infotype) { return; } listview_timestamp = inventory->timestamp(); for (core::Inventory::Items::const_iterator it = inventory->items().begin(); it != inventory->items().end(); it++) { core::Item *item = (*it); if (item->info()) { // this makes sure inventory info gets requested from the server core::game()->request_info(item->info()->id()); if (item->info()->timestamp() > listview_infotimestamp) { listview_infotimestamp = item->info()->timestamp(); } if ((item->info()->type() == infotype) && (listview_showempty || (item->amount() != 0))) { ui::ListItem *listitem = 0; std::string sortkey; std::ostringstream str; if (inventory == core::localcontrol()->inventory()) { // special rules for own ship inventory // retreive price from the trader const core::Item *trader_item = 0; if (!item->unrestricted()) { trader_item = (core::localplayer()->view() && core::localplayer()->view()->inventory() ? core::localplayer()->view()->inventory()->find(item->info()) : 0); if (!trader_item) { // not sold here str << "^N"; } } str << item->info()->name(); std::ostringstream str_amount; str_amount << item->amount(); str << '\n' << aux::pad_right(str_amount.str(), 10); if (item->unrestricted()) { // unrestricted items can be sold anywhere std::ostringstream std_price; std_price << item->price() << " credits"; str << aux::pad_left(std_price.str(), 12); } else if (trader_item) { std::ostringstream std_price; std_price << trader_item->price() << " credits"; str << aux::pad_left(std_price.str(), 12); } if (trader_item || item->unrestricted()) { sortkey.assign("+"); } else { sortkey.assign("-"); } } else { if (item->amount() == 0) { str << "^N"; } str << item->info()->name(); if (item->amount() > 0) { std::ostringstream str_amount; str_amount << item->amount(); str << '\n' << aux::pad_right(str_amount.str(), 10); std::ostringstream std_price; std_price << item->price() << " credits"; str << aux::pad_left(std_price.str(), 12); } else { std::ostringstream std_price; std_price << item->price() << " credits"; str << '\n' << aux::pad_left(std_price.str(), 22); } if (item->amount() == 0) { sortkey.assign("-"); } else { sortkey.assign("+"); } } sortkey.append(item->info()->label()); listitem = new ui::ListItem(this, str.str().c_str()); listitem->set_font(ui::root()->font_tiny()); listitem->set_height(listitem->font()->height() * 3.0f); listitem->set_item(item); listitem->set_info(item->info()); listitem->set_sortkey(sortkey); //if (item->amount() == 0) { // listitem->disable(); //} // preserve previous selection during update if (item == selecteditem) { ui::ListView::select(listitem); } } } } sort(); event_resize(); emit(EventListViewChanged); } bool InventoryListView::verify() const { if (!listview_inventory || !listview_infotype) { return true; } if (listview_timestamp != listview_inventory->timestamp()) { return false; } for (core::Inventory::Items::const_iterator it = listview_inventory->items().begin(); it != listview_inventory->items().end(); it++) { core::Item *item = (*it); if (item->info() && (item->info()->timestamp() > listview_infotimestamp)) { return false; } } return true; } void InventoryListView::draw() { if (!verify()) { set_inventory(listview_inventory, listview_infotype); } ListView::draw(); } } // namespace client