From 336766125f25b94dd9fc19aeea35c8b43acbeea0 Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Fri, 29 Jul 2011 21:10:05 +0000 Subject: Renamed various user interface classes, somewhat improved inventory window. --- src/client/inventorywindow.cc | 313 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 313 insertions(+) create mode 100644 src/client/inventorywindow.cc (limited to 'src/client/inventorywindow.cc') diff --git a/src/client/inventorywindow.cc b/src/client/inventorywindow.cc new file mode 100644 index 0000000..6698565 --- /dev/null +++ b/src/client/inventorywindow.cc @@ -0,0 +1,313 @@ +/* + client/inventorywindow.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/inventorywindow.h" +#include "ui/label.h" +#include "ui/listitem.h" +#include "ui/paint.h" +#include "ui/ui.h" + +#include + +namespace client { + +InventoryWindow::InventoryWindow(ui::Widget *parent) : ui::Window(parent) +{ + inventorywindow_infotimestamp = 0; + inventorywindow_inventorytimestamp = 0; + inventorywindow_inforecord = 0; + inventorywindow_amount = 0; + + inventorywindow_titlelabel = new ui::Label(this); + inventorywindow_titlelabel->set_label("title"); + inventorywindow_titlelabel->set_background(false); + inventorywindow_titlelabel->set_border(false); + inventorywindow_titlelabel->set_font(ui::root()->font_large()); + inventorywindow_titlelabel->set_alignment(ui::AlignCenter); + inventorywindow_titlelabel->set_text("INVENTORY"); + + inventorywindow_modelview = new ui::ModelView(this); + inventorywindow_modelview->set_label("modelview"); + inventorywindow_modelview->set_background(false); + inventorywindow_modelview->set_border(false); + + inventorywindow_modeltitlelabel = new ui::Label(inventorywindow_modelview); + inventorywindow_modeltitlelabel->set_background(false); + inventorywindow_modeltitlelabel->set_border(false); + //inventorywindow_modeltitlelabel->set_font(ui::root()->font_large()); + inventorywindow_modeltitlelabel->set_alignment(ui::AlignCenter); + + inventorywindow_modelnamelabel = new ui::Label(inventorywindow_modelview); + inventorywindow_modelnamelabel->set_background(false); + inventorywindow_modelnamelabel->set_border(false); + //inventorywindow_modelnamelabel->set_font(ui::root()->font_large()); + inventorywindow_modelnamelabel->set_alignment(ui::AlignCenter); + + inventorywindow_listview = new ui::ListView(this); + inventorywindow_listview->set_label("listview"); + inventorywindow_listview->set_background(false); + inventorywindow_listview->set_border(true); + + inventorywindow_inventorytext = new ui::PlainText(this); + inventorywindow_inventorytext->set_label("inventorytext"); + inventorywindow_inventorytext->set_background(false); + inventorywindow_inventorytext->set_border(false); + inventorywindow_inventorytext->set_font(ui::root()->font_small()); + + inventorywindow_scrollpane = new ui::ScrollPane(this, inventorywindow_infotext); + inventorywindow_scrollpane->set_background(false); + inventorywindow_scrollpane->set_border(false); + inventorywindow_scrollpane->set_alignment(ui::AlignTop); + + inventorywindow_shipbutton = new ui::IconButton(this, "bitmaps/icons/button_ship"); + + hide(); +} + +InventoryWindow::~InventoryWindow() +{ +} + +void InventoryWindow::toggle() +{ + if (visible()) + hide(); + else + show(); +} +void InventoryWindow::update_inventory() +{ + inventorywindow_listview->clear(); + inventorywindow_inventorytimestamp = 0; + inventorywindow_infotimestamp = 0; + + if (!core::localcontrol() || !core::localcontrol()->inventory()) { + return; + } + + const core::Item *selecteditem = (inventorywindow_listview->selected() ? inventorywindow_listview->selected()->item() : 0); + + for (core::Inventory::Items::const_iterator it = core::localcontrol()->inventory()->items().begin(); it != core::localcontrol()->inventory()->items().end(); it++) { + core::Item *item = (*it); + + if (!item->info()) { + continue; + } + + // this makes sure inventory info gets requested from the server + core::game()->request_info(item->info()->id()); + + if (item->info()->timestamp() > inventorywindow_infotimestamp) { + inventorywindow_infotimestamp = item->info()->timestamp(); + } + + if (item->amount() != 0) { + ui::ListItem *listitem = 0; + + std::ostringstream str; + str << item->info()->name().c_str(); + if (item->amount() > 0) { + str << " (" << item->amount() << ")"; + } + + listitem = new ui::ListItem(inventorywindow_listview, str.str().c_str()); + listitem->set_height(listitem->font()->height() * 2.0f); + listitem->set_item(item); + listitem->set_info(item->info()); + + std::string sortkey(item->info()->type()->label()); + sortkey += '.'; + sortkey += item->info()->label(); + listitem->set_sortkey(sortkey); + + // preserve previous selection during update + if (item == selecteditem) { + inventorywindow_listview->select(listitem); + } + } + } + + // request ship info + if (core::localcontrol()->info()) { + core::game()->request_info(core::localcontrol()->info()->id()); + if (core::localcontrol()->info()->timestamp() > inventorywindow_infotimestamp) + inventorywindow_infotimestamp = core::localcontrol()->info()->timestamp(); + } + + inventorywindow_inventorytimestamp = core::localcontrol()->inventory()->timestamp(); + + if (inventorywindow_listview->selected()) { + set_info(inventorywindow_listview->selected()->info(), inventorywindow_listview->selected()->item()->amount()); + } else if (inventorywindow_inforecord != core::localcontrol()->info()) { + set_info(0, 0); + } + + inventorywindow_listview->sort(); + inventorywindow_listview->event_resize(); +} + +bool InventoryWindow::verify() const +{ + if (!core::localcontrol() || !core::localcontrol()->inventory()) { + return true; + } + + if (inventorywindow_inventorytimestamp != core::localcontrol()->inventory()->timestamp()) { + return false; + } + + for (core::Inventory::Items::const_iterator it = core::localcontrol()->inventory()->items().begin(); it != core::localcontrol()->inventory()->items().end(); it++) { + core::Item *item = (*it); + + if (!item->info()) { + continue; + } + if (item->info()->timestamp() > inventorywindow_infotimestamp) { + return false; + } + } + return true; +} + +void InventoryWindow::resize() +{ + //const float smallmargin = ui::UI::elementsize.height(); + const float padding = ui::root()->font_large()->height(); + const float icon_size = 24.0f; // small icons + + // resize label + inventorywindow_titlelabel->set_size(width() - padding * 2.0f, inventorywindow_titlelabel->font()->height()); + inventorywindow_titlelabel->set_location(padding, padding); + + // resize inventory listview + inventorywindow_listview->set_size(ui::UI::elementsize.width(), height() -icon_size - padding * 8.0f); + inventorywindow_listview->set_location(padding, padding * 6.0f); + + inventorywindow_inventorytext->set_size(ui::UI::elementsize.width(), padding * 2.0f); + inventorywindow_inventorytext->set_location(inventorywindow_listview->left(), padding * 3.0f); + + inventorywindow_shipbutton->set_size(icon_size, icon_size); + inventorywindow_shipbutton->set_location(inventorywindow_inventorytext->left(), height() - icon_size - padding); + + // resize modelview + inventorywindow_modelview->set_size( width() - inventorywindow_listview->right() - padding * 2.0f ,ui::UI::elementsize.width()); + inventorywindow_modelview->set_location(inventorywindow_listview->right() + padding, padding * 3.0f); + + // modelview title label + inventorywindow_modelnamelabel->set_location(0, 0); + inventorywindow_modelnamelabel->set_size(inventorywindow_modelview->width(), inventorywindow_modelnamelabel->font()->height()); + + // modelview name label + inventorywindow_modeltitlelabel->set_size(inventorywindow_modelview->width(), inventorywindow_modeltitlelabel->font()->height()); + inventorywindow_modeltitlelabel->set_location(0, inventorywindow_modelview->height() - inventorywindow_modeltitlelabel->height()); + + // resize infotext + inventorywindow_scrollpane->set_size(inventorywindow_modelview->width(), height() - inventorywindow_modelview->bottom() - 2.0f * padding); + inventorywindow_scrollpane->set_location(inventorywindow_modelview->left(), inventorywindow_modelview->bottom() + padding); +} + +void InventoryWindow::draw() +{ + if (!verify()) { + update_inventory(); + } + + if (inventorywindow_inforecord && (inventorywindow_inforecord->timestamp() > inventorywindow_infotimestamp)) { + set_info(inventorywindow_inforecord, inventorywindow_amount); + } + + std::stringstream str; + str << "Credits: " << std::setw(12) << core::localplayer()->credits(); + + if (core::localcontrol() && core::localcontrol()->inventory()) { + core::Inventory *inventory = core::localcontrol()->inventory(); + + std::stringstream cargostr; + cargostr << inventory->capacity_used() << " of " << inventory->capacity(); + + str << '\n' << "Cargo: " << aux::pad_left(cargostr.str(),12); + } + inventorywindow_inventorytext->set_text(str.str()); + + Window::draw(); +} + +void InventoryWindow::show() +{ + inventorywindow_listview->deselect(); + set_info(core::localcontrol() ? core::localcontrol()->info() : 0, 0); + inventorywindow_modeltitlelabel->set_text("Ship Info"); + Window::show(); +} + +void InventoryWindow::set_info(const core::Info *info, const int amount) +{ + inventorywindow_inforecord = info; + inventorywindow_infotext.clear(); + inventorywindow_amount = amount; + + if (!info) { + inventorywindow_modelview->set_modelname(0); + inventorywindow_modeltitlelabel->set_text(""); + inventorywindow_modelnamelabel->set_text(""); + } else { + + core::game()->request_info(info->id()); + inventorywindow_modelview->set_modelname(info->modelname()); + inventorywindow_modelnamelabel->set_text(info->name()); + + for (core::Info::Text::const_iterator it = inventorywindow_inforecord->text().begin(); it != inventorywindow_inforecord->text().end(); it++) { + inventorywindow_infotext.push_back((*it)); + } + if (info->timestamp() > inventorywindow_infotimestamp) { + inventorywindow_infotimestamp = info->timestamp(); + } + } + +} + +bool InventoryWindow::on_emit(Widget *sender, const Event event, void *data) +{ + if (event == ui::Widget::EventButtonClicked) { + + if (sender == inventorywindow_shipbutton) { + inventorywindow_listview->deselect(); + set_info(core::localcontrol() ? core::localcontrol()->info() : 0, 0); + inventorywindow_modeltitlelabel->set_text("Ship Info"); + } + return true; + + } else if (event == ui::Widget::EventListViewChanged) { + + if (sender == inventorywindow_listview) { + inventorywindow_modeltitlelabel->set_text("Cargo Info"); + set_info(inventorywindow_listview->selected() ? inventorywindow_listview->selected()->info() : 0, inventorywindow_listview->selected()->item()->amount()); + } + return true; + } + + return Window::on_emit(sender, event, data); +} + +bool InventoryWindow::on_keypress(const int key, const unsigned int modifier) +{ + switch (key) { + + case SDLK_ESCAPE: + this->hide(); + return true; + break; + + default: + break; + } + + return Window::on_keypress(key, modifier); +} + + +} // namespace client -- cgit v1.2.3