#include "itemwidget.hpp" #include #include #include #include "../mwworld/class.hpp" namespace MWGui { ItemWidget::ItemWidget() : mItem(NULL) { } void ItemWidget::registerComponents() { MyGUI::FactoryManager::getInstance().registerFactory("Widget"); } void ItemWidget::initialiseOverride() { assignWidget(mItem, "Item"); if (mItem) mItem->setNeedMouseFocus(false); assignWidget(mFrame, "Frame"); if (mFrame) mFrame->setNeedMouseFocus(false); Base::initialiseOverride(); } void ItemWidget::setIcon(const std::string &icon) { // HACK HACK HACK: Don't setImageTexture if it hasn't changed. // There is a leak in MyGUI for each setImageTexture on the same widget. // http://www.ogre3d.org/addonforums/viewtopic.php?f=17&t=30251 if (mCurrentItemTexture == icon) return; mCurrentItemTexture = icon; if (mItem) mItem->setImageTexture(icon); } void ItemWidget::setFrame(const std::string &frame, const MyGUI::IntCoord &coord) { // HACK HACK HACK: Don't setImageTexture if it hasn't changed. // There is a leak in MyGUI for each setImageTexture on the same widget. // http://www.ogre3d.org/addonforums/viewtopic.php?f=17&t=30251 if (mCurrentFrameTexture == frame) return; mCurrentFrameTexture = frame; if (mFrame) { mFrame->setImageTexture(frame); mFrame->setImageTile(MyGUI::IntSize(coord.width, coord.height)); // Why is this needed? MyGUI bug? mFrame->setImageCoord(coord); } } void ItemWidget::setIcon(const MWWorld::Ptr &ptr) { setIcon(Misc::ResourceHelpers::correctIconPath(ptr.getClass().getInventoryIcon(ptr))); } void ItemWidget::setItem(const MWWorld::Ptr &ptr, ItemState state) { if (!mItem) return; if (ptr.isEmpty()) { if (mFrame) { // HACK HACK HACK: Don't setImageTexture if it hasn't changed. // There is a leak in MyGUI for each setImageTexture on the same widget. // http://www.ogre3d.org/addonforums/viewtopic.php?f=17&t=30251 if (!mCurrentFrameTexture.empty()) { mFrame->setImageTexture(""); mCurrentFrameTexture = ""; } } if (!mCurrentItemTexture.empty()) { mCurrentItemTexture = ""; mItem->setImageTexture(""); } return; } bool isMagic = !ptr.getClass().getEnchantment(ptr).empty(); std::string backgroundTex = "textures\\menu_icon"; if (isMagic) backgroundTex += "_magic"; if (state == None) { if (!isMagic) backgroundTex = ""; } else if (state == Equip) { backgroundTex += "_equip"; } else if (state == Barter) backgroundTex += "_barter"; if (backgroundTex != "") backgroundTex += ".dds"; if (state == Barter && !isMagic) setFrame(backgroundTex, MyGUI::IntCoord(2,2,42,42)); else setFrame(backgroundTex, MyGUI::IntCoord(0,0,42,42)); setIcon(ptr); } }