#include "container.hpp" #include "window_manager.hpp" #include "widgets.hpp" #include "itemwidget.hpp" #include "../mwbase/environment.hpp" #include "../mwworld/manualref.hpp" #include "../mwworld/world.hpp" #include "../mwworld/containerstore.hpp" #include "../mwworld/class.hpp" #include "../mwclass/container.hpp" #include "../mwinput/inputmanager.hpp" #include #include #include #include #include #include using namespace MWGui; using namespace Widgets; ContainerBase::ContainerBase(WindowManager& parWindowManager,DragAndDrop* dragAndDrop,std::string guiFile) : WindowBase(guiFile, parWindowManager), mDragAndDrop(dragAndDrop), mContainer() { getWidget(mContainerWidget, "Items"); getWidget(mItemView, "ItemView"); mContainerWidget->eventMouseButtonClick += MyGUI::newDelegate(this, &ContainerBase::onContainerClicked); static_cast(mMainWidget)->eventWindowChangeCoord += MyGUI::newDelegate(this, &ContainerBase::onWindowResize); } ContainerBase::~ContainerBase() { } void ContainerBase::onSelectedItem(MyGUI::Widget* _sender) { if(!mDragAndDrop->mIsOnDragAndDrop) { mDragAndDrop->mIsOnDragAndDrop = true; _sender->detachFromWidget(); _sender->attachToWidget(mDragAndDrop->mDragAndDropWidget); ItemWidget* item = static_cast(_sender); int count = 0; MWWorld::ContainerStore& containerStore = MWWorld::Class::get(mContainer).getContainerStore(mContainer); for (MWWorld::ContainerStoreIterator iter (containerStore.begin()); iter!=containerStore.end(); ++iter) { count++; if(count == item->mPos) { mDragAndDrop->mStore.add(*iter); iter->getRefData().setCount(0); break; } } //containerStore. //std::cout << mContainerWidget->getParent()->getParent()->getName(); _sender->setUserString("drag","on"); mDragAndDrop->mDraggedWidget = _sender; mDragAndDrop->mContainerWindow = const_cast(this); drawItems(); std::cout << "selected!"; } } void ContainerBase::onContainerClicked(MyGUI::Widget* _sender) { std::cout << "container clicked"; if(mDragAndDrop->mIsOnDragAndDrop) //drop widget here { ItemWidget* item = static_cast(mDragAndDrop->mDraggedWidget); std::cout << item->mPos << (*mDragAndDrop->mStore.begin()).getTypeName(); if(item->mPtr.getContainerStore() == 0) std::cout << "nocontainer!"; MWWorld::ContainerStore& containerStore = MWWorld::Class::get(mContainer).getContainerStore(mContainer); containerStore.add(*mDragAndDrop->mStore.begin()); mDragAndDrop->mStore.clear(); mDragAndDrop->mIsOnDragAndDrop = false; mDragAndDrop->mDraggedWidget->detachFromWidget(); mDragAndDrop->mDraggedWidget->attachToWidget(mContainerWidget); mDragAndDrop->mDraggedWidget = 0; mDragAndDrop->mContainerWindow = 0; drawItems(); } } void ContainerBase::onWindowResize(MyGUI::Window* window) { } void ContainerBase::setName(std::string contName) { setText("_Main", contName); adjustWindowCaption(); } void ContainerBase::open(MWWorld::Ptr container) { mContainer = container; setName(MWWorld::Class::get(container).getName(container)); drawItems(); setVisible(true); } void ContainerBase::drawItems() { while (mContainerWidget->getChildCount()) { MyGUI::Gui::getInstance().destroyWidget(mContainerWidget->getChildAt(0)); } MWWorld::ContainerStore& containerStore = MWWorld::Class::get(mContainer).getContainerStore(mContainer); int x = 4; int y = 4; int count = 0; int index = 0; for (MWWorld::ContainerStoreIterator iter (containerStore.begin()); iter!=containerStore.end(); ++iter) { index++; if(iter->getRefData().getCount() > 0) { count++; std::string path = std::string("icons\\"); path+=MWWorld::Class::get(*iter).getInventoryIcon(*iter); ItemWidget* image = mContainerWidget->createWidget("ImageBox", MyGUI::IntCoord(x, y, 32, 32), MyGUI::Align::Default); MyGUI::TextBox* text = image->createWidget("SandBrightText", MyGUI::IntCoord(x, y, 18, 18), MyGUI::Align::Default, std::string("Label")); image->eventMouseButtonClick += MyGUI::newDelegate(this,&ContainerBase::onSelectedItem); image->mPos = index; image->mPtr = *iter; x += 36; if(count % 20 == 0) { y += 36; x = 4; count = 0; } if(iter->getRefData().getCount() > 1) text->setCaption(boost::lexical_cast(iter->getRefData().getCount())); int pos = path.rfind("."); path.erase(pos); path.append(".dds"); image->setImageTexture(path); } } } void ContainerBase::Update() { if(mDragAndDrop->mIsOnDragAndDrop) { if(mDragAndDrop->mDraggedWidget) mDragAndDrop->mDraggedWidget->setPosition(MyGUI::InputManager::getInstance().getMousePosition()); else mDragAndDrop->mIsOnDragAndDrop = false; //If this happens, there is a bug. } } // ------------------------------------------------------------------------------------------------ ContainerWindow::ContainerWindow(WindowManager& parWindowManager,DragAndDrop* dragAndDrop) : ContainerBase(parWindowManager, dragAndDrop, "openmw_container_window_layout.xml") { getWidget(mTakeButton, "TakeButton"); getWidget(mCloseButton, "CloseButton"); mCloseButton->eventMouseButtonClick += MyGUI::newDelegate(this, &ContainerWindow::onCloseButtonClicked); mTakeButton->eventMouseButtonClick += MyGUI::newDelegate(this, &ContainerWindow::onTakeAllButtonClicked); setText("CloseButton", MWBase::Environment::get().getWorld()->getStore().gameSettings.search("sClose")->str); setText("TakeButton", MWBase::Environment::get().getWorld()->getStore().gameSettings.search("sTakeAll")->str); // adjust buttons size to fit text int closeButtonWidth = mCloseButton->getTextSize().width+24; int takeButtonWidth = mTakeButton->getTextSize().width+24; mCloseButton->setCoord(600-20-closeButtonWidth, mCloseButton->getCoord().top, closeButtonWidth, mCloseButton->getCoord().height); mTakeButton->setCoord(600-20-closeButtonWidth-takeButtonWidth-8, mTakeButton->getCoord().top, takeButtonWidth, mTakeButton->getCoord().height); int w = MyGUI::RenderManager::getInstance().getViewSize().width; int h = MyGUI::RenderManager::getInstance().getViewSize().height; setCoord(w-600,h-300,600,300); } ContainerWindow::~ContainerWindow() { } void ContainerWindow::onCloseButtonClicked(MyGUI::Widget* _sender) { if(!mDragAndDrop->mIsOnDragAndDrop) { MWBase::Environment::get().getWindowManager()->setGuiMode(GM_Game); setVisible(false); } } void ContainerWindow::onTakeAllButtonClicked(MyGUI::Widget* _sender) { if(!mDragAndDrop->mIsOnDragAndDrop) { /// \todo MWBase::Environment::get().getWindowManager()->setGuiMode(GM_Game); setVisible(false); } }