00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "gui/storagewindow.h"
00023 #include "gui/inventorywindow.h"
00024 #include "gui/item_amount.h"
00025 #include "gui/itemcontainer.h"
00026 #include "gui/viewport.h"
00027
00028 #include "gui/widgets/button.h"
00029 #include "gui/widgets/label.h"
00030 #include "gui/widgets/layout.h"
00031 #include "gui/widgets/progressbar.h"
00032 #include "gui/widgets/scrollarea.h"
00033
00034 #include "inventory.h"
00035 #include "item.h"
00036 #include "localplayer.h"
00037 #include "units.h"
00038
00039 #include "net/net.h"
00040 #include "net/ea/inventoryhandler.h"
00041
00042 #include "resources/iteminfo.h"
00043
00044 #include "utils/gettext.h"
00045 #include "utils/strprintf.h"
00046
00047 #include <guichan/font.hpp>
00048 #include <guichan/mouseinput.hpp>
00049
00050 #include <string>
00051
00052 StorageWindow::StorageWindow(int invSize):
00053 Window(_("Storage")),
00054 mMaxSlots(invSize),
00055 mItemDesc(false)
00056 {
00057 setWindowName("Storage");
00058 setResizable(true);
00059 setCloseButton(true);
00060
00061
00062 setDefaultSize(375, 300, ImageRect::CENTER);
00063
00064 mStoreButton = new Button(_("Store"), "store", this);
00065 mRetrieveButton = new Button(_("Retrieve"), "retrieve", this);
00066
00067 mItems = new ItemContainer(player_node->getStorage(), true);
00068 mItems->addSelectionListener(this);
00069
00070 gcn::ScrollArea *invenScroll = new ScrollArea(mItems);
00071 invenScroll->setHorizontalScrollPolicy(gcn::ScrollArea::SHOW_NEVER);
00072
00073 mUsedSlots = player_node->getStorage()->getNumberOfSlotsUsed();
00074
00075 mSlotsLabel = new Label(_("Slots: "));
00076
00077 mSlotsBar = new ProgressBar(1.0f, 100, 20, 225, 200, 25);
00078 mSlotsBar->setText(strprintf("%d/%d", mUsedSlots, mMaxSlots));
00079 mSlotsBar->setProgress((float) mUsedSlots / mMaxSlots);
00080
00081 setMinHeight(130);
00082 setMinWidth(200);
00083
00084 place(0, 0, mSlotsLabel).setPadding(3);
00085 place(1, 0, mSlotsBar, 3);
00086 place(0, 1, invenScroll, 4, 4);
00087 place(2, 5, mStoreButton);
00088 place(3, 5, mRetrieveButton);
00089
00090 Layout &layout = getLayout();
00091 layout.setRowHeight(0, mStoreButton->getHeight());
00092
00093 loadWindowState();
00094 }
00095
00096 StorageWindow::~StorageWindow()
00097 {
00098 }
00099
00100 void StorageWindow::logic()
00101 {
00102 if (!isVisible())
00103 return;
00104
00105 Window::logic();
00106
00107 const int usedSlots = player_node->getStorage()->getNumberOfSlotsUsed();
00108
00109 if (mUsedSlots != usedSlots)
00110 {
00111 mUsedSlots = usedSlots;
00112
00113 mSlotsBar->setProgress((float) mUsedSlots / mMaxSlots);
00114
00115 mSlotsBar->setText(strprintf("%d/%d", mUsedSlots, mMaxSlots));
00116 }
00117 }
00118
00119 void StorageWindow::action(const gcn::ActionEvent &event)
00120 {
00121 if (event.getId() == "store")
00122 {
00123 if (!inventoryWindow->isVisible()) return;
00124
00125 Item *item = inventoryWindow->getSelectedItem();
00126
00127 if (!item)
00128 return;
00129
00130 if (item->getQuantity() == 1)
00131 {
00132 addStore(item, 1);
00133 }
00134 else
00135 {
00136
00137 new ItemAmountWindow(ItemAmountWindow::StoreAdd, this, item);
00138 }
00139 }
00140 else if (event.getId() == "retrieve")
00141 {
00142 Item *item = mItems->getSelectedItem();
00143
00144 if (!item)
00145 return;
00146
00147 if (item->getQuantity() == 1)
00148 {
00149 removeStore(item, 1);
00150 }
00151 else
00152 {
00153
00154 new ItemAmountWindow(ItemAmountWindow::StoreRemove, this, item);
00155 }
00156 }
00157 }
00158
00159 void StorageWindow::mouseClicked(gcn::MouseEvent &event)
00160 {
00161 Window::mouseClicked(event);
00162
00163 if (event.getButton() == gcn::MouseEvent::RIGHT)
00164 {
00165 Item *item = mItems->getSelectedItem();
00166
00167 if (!item)
00168 {
00169 mRetrieveButton->setEnabled(false);
00170 return;
00171 }
00172
00173 mRetrieveButton->setEnabled(true);
00174
00175
00176
00177
00178 const int mx = event.getX() + getX();
00179 const int my = event.getY() + getY();
00180 viewport->showPopup(mx, my, item);
00181 }
00182 }
00183
00184 Item *StorageWindow::getSelectedItem() const
00185 {
00186 return mItems->getSelectedItem();
00187 }
00188
00189 void StorageWindow::addStore(Item *item, int amount)
00190 {
00191 Net::getInventoryHandler()->moveItem(Net::InventoryHandler::INVENTORY,
00192 item->getInvIndex(), amount,
00193 Net::InventoryHandler::STORAGE);
00194 }
00195
00196 void StorageWindow::removeStore(Item *item, int amount)
00197 {
00198 Net::getInventoryHandler()->moveItem(Net::InventoryHandler::STORAGE,
00199 item->getInvIndex(), amount,
00200 Net::InventoryHandler::INVENTORY);
00201 }
00202
00203 void StorageWindow::close()
00204 {
00205 Net::getInventoryHandler()->closeStorage();
00206 }