Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/inventorywindow.cc')
-rw-r--r--src/client/inventorywindow.cc313
1 files changed, 313 insertions, 0 deletions
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 <iomanip>
+
+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