diff --git a/apps/openmw/mwbase/windowmanager.hpp b/apps/openmw/mwbase/windowmanager.hpp index 8385e85b5f..273294bd12 100644 --- a/apps/openmw/mwbase/windowmanager.hpp +++ b/apps/openmw/mwbase/windowmanager.hpp @@ -112,7 +112,7 @@ namespace MWBase WindowManager() {} - virtual ~WindowManager() {} + virtual ~WindowManager() = default; /// @note This method will block until the video finishes playing /// (and will continually update the window while doing so) @@ -385,6 +385,8 @@ namespace MWBase /// Same as viewer->getCamera()->getCullMask(), provided for consistency. virtual uint32_t getCullMask() = 0; + virtual void inventoryUpdated(const MWWorld::Ptr& ptr) const = 0; + /// Return the window that should receive controller events virtual MWGui::WindowBase* getActiveControllerWindow() = 0; /// Return the available height for menus accounting for visible controller overlays diff --git a/apps/openmw/mwgui/companionwindow.cpp b/apps/openmw/mwgui/companionwindow.cpp index a206be01be..456a0a427f 100644 --- a/apps/openmw/mwgui/companionwindow.cpp +++ b/apps/openmw/mwgui/companionwindow.cpp @@ -154,8 +154,6 @@ namespace MWGui mItemView->resetScrollBars(); setTitle(actor.getClass().getName(actor)); - - mPtr.getClass().getContainerStore(mPtr).setContListener(this); } void CompanionWindow::onFrame(float dt) @@ -230,14 +228,10 @@ namespace MWGui mSortModel = nullptr; } - void CompanionWindow::itemAdded(const MWWorld::ConstPtr& item, int count) + void CompanionWindow::onInventoryUpdate(const MWWorld::Ptr& ptr) { - mUpdateNextFrame = true; - } - - void CompanionWindow::itemRemoved(const MWWorld::ConstPtr& item, int count) - { - mUpdateNextFrame = true; + if (ptr == mPtr) + mUpdateNextFrame = true; } void CompanionWindow::onOpen() diff --git a/apps/openmw/mwgui/companionwindow.hpp b/apps/openmw/mwgui/companionwindow.hpp index 33e003b99c..183ea20f6c 100644 --- a/apps/openmw/mwgui/companionwindow.hpp +++ b/apps/openmw/mwgui/companionwindow.hpp @@ -4,8 +4,6 @@ #include "referenceinterface.hpp" #include "windowbase.hpp" -#include "../mwworld/containerstore.hpp" - #include namespace MWGui @@ -22,7 +20,7 @@ namespace MWGui class CompanionItemModel; class ItemTransfer; - class CompanionWindow : public WindowBase, public ReferenceInterface, public MWWorld::ContainerStoreListener + class CompanionWindow : public WindowBase, public ReferenceInterface { public: explicit CompanionWindow(DragAndDrop& dragAndDrop, ItemTransfer& itemTransfer, MessageBoxManager* manager); @@ -35,8 +33,7 @@ namespace MWGui void onFrame(float dt) override; void clear() override { resetReference(); } - void itemAdded(const MWWorld::ConstPtr& item, int count) override; - void itemRemoved(const MWWorld::ConstPtr& item, int count) override; + void onInventoryUpdate(const MWWorld::Ptr& ptr) override; std::string_view getWindowIdForLua() const override { return "Companion"; } diff --git a/apps/openmw/mwgui/container.cpp b/apps/openmw/mwgui/container.cpp index bb8ccc5536..3ba4b52cd5 100644 --- a/apps/openmw/mwgui/container.cpp +++ b/apps/openmw/mwgui/container.cpp @@ -190,8 +190,6 @@ namespace MWGui MWBase::Environment::get().getWindowManager()->setKeyFocusWidget(mCloseButton); setTitle(container.getClass().getName(container)); - - mPtr.getClass().getContainerStore(mPtr).setContListener(this); } void ContainerWindow::resetReference() @@ -410,13 +408,9 @@ namespace MWGui } } - void ContainerWindow::itemAdded(const MWWorld::ConstPtr& item, int count) + void ContainerWindow::onInventoryUpdate(const MWWorld::Ptr& ptr) { - mUpdateNextFrame = true; - } - - void ContainerWindow::itemRemoved(const MWWorld::ConstPtr& item, int count) - { - mUpdateNextFrame = true; + if (ptr == mPtr) + mUpdateNextFrame = true; } } diff --git a/apps/openmw/mwgui/container.hpp b/apps/openmw/mwgui/container.hpp index f32bc7ba89..7f30e02065 100644 --- a/apps/openmw/mwgui/container.hpp +++ b/apps/openmw/mwgui/container.hpp @@ -7,8 +7,6 @@ #include -#include "../mwworld/containerstore.hpp" - namespace MyGUI { class Gui; @@ -22,7 +20,7 @@ namespace MWGui class SortFilterItemModel; class ItemTransfer; - class ContainerWindow : public WindowBase, public ReferenceInterface, public MWWorld::ContainerStoreListener + class ContainerWindow : public WindowBase, public ReferenceInterface { public: explicit ContainerWindow(DragAndDrop& dragAndDrop, ItemTransfer& itemTransfer); @@ -43,8 +41,7 @@ namespace MWGui void treatNextOpenAsLoot() { mTreatNextOpenAsLoot = true; } - void itemAdded(const MWWorld::ConstPtr& item, int count) override; - void itemRemoved(const MWWorld::ConstPtr& item, int count) override; + void onInventoryUpdate(const MWWorld::Ptr& ptr) override; std::string_view getWindowIdForLua() const override { return "Container"; } diff --git a/apps/openmw/mwgui/inventorywindow.cpp b/apps/openmw/mwgui/inventorywindow.cpp index 6b9deffbf9..e5f480d1e0 100644 --- a/apps/openmw/mwgui/inventorywindow.cpp +++ b/apps/openmw/mwgui/inventorywindow.cpp @@ -172,8 +172,6 @@ namespace MWGui auto tradeModel = std::make_unique(std::make_unique(mPtr), MWWorld::Ptr()); mTradeModel = tradeModel.get(); - mPtr.getClass().getInventoryStore(mPtr).setContListener(this); - if (mSortModel) // reuse existing SortModel when possible to keep previous category/filter settings mSortModel->setSourceModel(std::move(tradeModel)); else @@ -932,14 +930,10 @@ namespace MWGui mPreview->rebuild(); } - void InventoryWindow::itemAdded(const MWWorld::ConstPtr& item, int count) + void InventoryWindow::onInventoryUpdate(const MWWorld::Ptr& ptr) { - mUpdateNextFrame = true; - } - - void InventoryWindow::itemRemoved(const MWWorld::ConstPtr& item, int count) - { - mUpdateNextFrame = true; + if (ptr == mPtr) + mUpdateNextFrame = true; } MyGUI::IntSize InventoryWindow::getPreviewViewportSize() const diff --git a/apps/openmw/mwgui/inventorywindow.hpp b/apps/openmw/mwgui/inventorywindow.hpp index 5442b3271f..1235a496a5 100644 --- a/apps/openmw/mwgui/inventorywindow.hpp +++ b/apps/openmw/mwgui/inventorywindow.hpp @@ -5,7 +5,6 @@ #include "windowpinnablebase.hpp" #include "../mwrender/characterpreview.hpp" -#include "../mwworld/containerstore.hpp" #include "../mwworld/ptr.hpp" #include @@ -34,7 +33,7 @@ namespace MWGui class ItemModel; class ItemTransfer; - class InventoryWindow : public WindowPinnableBase, public MWWorld::ContainerStoreListener + class InventoryWindow : public WindowPinnableBase { public: explicit InventoryWindow(DragAndDrop& dragAndDrop, ItemTransfer& itemTransfer, osg::Group* parent, @@ -69,8 +68,7 @@ namespace MWGui void setGuiMode(GuiMode mode); - void itemAdded(const MWWorld::ConstPtr& item, int count) override; - void itemRemoved(const MWWorld::ConstPtr& item, int count) override; + void onInventoryUpdate(const MWWorld::Ptr& ptr) override; /// Cycle to previous/next weapon void cycle(bool next); diff --git a/apps/openmw/mwgui/tradewindow.cpp b/apps/openmw/mwgui/tradewindow.cpp index 00d8f37fc8..93d5abb29f 100644 --- a/apps/openmw/mwgui/tradewindow.cpp +++ b/apps/openmw/mwgui/tradewindow.cpp @@ -231,9 +231,6 @@ namespace MWGui // Cycle to the buy window if it's not active. if (Settings::gui().mControllerMenus && !mActiveControllerWindow) MWBase::Environment::get().getWindowManager()->cycleActiveControllerWindow(true); - - for (const auto& source : itemSources) - source.getClass().getContainerStore(source).setContListener(this); } void TradeWindow::onFrame(float dt) @@ -773,13 +770,9 @@ namespace MWGui mItemView->update(); } - void TradeWindow::itemAdded(const MWWorld::ConstPtr& item, int count) + void TradeWindow::onInventoryUpdate(const MWWorld::Ptr& ptr) { - mUpdateNextFrame = true; - } - - void TradeWindow::itemRemoved(const MWWorld::ConstPtr& item, int count) - { - mUpdateNextFrame = true; + if (mTradeModel && mTradeModel->usesContainer(ptr)) + mUpdateNextFrame = true; } } diff --git a/apps/openmw/mwgui/tradewindow.hpp b/apps/openmw/mwgui/tradewindow.hpp index ab7b965cd8..3322f4c17e 100644 --- a/apps/openmw/mwgui/tradewindow.hpp +++ b/apps/openmw/mwgui/tradewindow.hpp @@ -4,8 +4,6 @@ #include "referenceinterface.hpp" #include "windowbase.hpp" -#include "../mwworld/containerstore.hpp" - namespace Gui { class NumericEditBox; @@ -22,7 +20,7 @@ namespace MWGui class SortFilterItemModel; class TradeItemModel; - class TradeWindow : public WindowBase, public ReferenceInterface, public MWWorld::ContainerStoreListener + class TradeWindow : public WindowBase, public ReferenceInterface { public: TradeWindow(); @@ -41,8 +39,7 @@ namespace MWGui void updateItemView(); - void itemAdded(const MWWorld::ConstPtr& item, int count) override; - void itemRemoved(const MWWorld::ConstPtr& item, int count) override; + void onInventoryUpdate(const MWWorld::Ptr& ptr) override; typedef MyGUI::delegates::MultiDelegate<> EventHandle_TradeDone; EventHandle_TradeDone eventTradeDone; diff --git a/apps/openmw/mwgui/windowbase.hpp b/apps/openmw/mwgui/windowbase.hpp index 0ba05aeb79..feb1d12e1a 100644 --- a/apps/openmw/mwgui/windowbase.hpp +++ b/apps/openmw/mwgui/windowbase.hpp @@ -73,7 +73,9 @@ namespace MWGui virtual void onDeleteCustomData(const MWWorld::Ptr& ptr) {} - virtual std::string_view getWindowIdForLua() const { return ""; } + virtual void onInventoryUpdate(const MWWorld::Ptr& ptr) {} + + virtual std::string_view getWindowIdForLua() const { return {}; } void setDisabledByLua(bool disabled) { mDisabledByLua = disabled; } static void clampWindowCoordinates(MyGUI::Window* window); diff --git a/apps/openmw/mwgui/windowmanagerimp.cpp b/apps/openmw/mwgui/windowmanagerimp.cpp index ffc0705b03..f8ca2c651a 100644 --- a/apps/openmw/mwgui/windowmanagerimp.cpp +++ b/apps/openmw/mwgui/windowmanagerimp.cpp @@ -2697,4 +2697,10 @@ namespace MWGui else mInventoryTabsOverlay->setVisible(false); } + + void WindowManager::inventoryUpdated(const MWWorld::Ptr& ptr) const + { + for (const auto& window : mWindows) + window->onInventoryUpdate(ptr); + } } diff --git a/apps/openmw/mwgui/windowmanagerimp.hpp b/apps/openmw/mwgui/windowmanagerimp.hpp index 03f0ea5572..5ef0d74131 100644 --- a/apps/openmw/mwgui/windowmanagerimp.hpp +++ b/apps/openmw/mwgui/windowmanagerimp.hpp @@ -616,6 +616,8 @@ namespace MWGui void setActiveMap(const MWWorld::Cell& cell); ///< set the indices of the map texture that should be used + void inventoryUpdated(const MWWorld::Ptr& ptr) const override; + Files::ConfigurationManager& mCfgMgr; }; } diff --git a/apps/openmw/mwworld/containerstore.cpp b/apps/openmw/mwworld/containerstore.cpp index 5a7c5b5333..50b4cf0dc1 100644 --- a/apps/openmw/mwworld/containerstore.cpp +++ b/apps/openmw/mwworld/containerstore.cpp @@ -13,6 +13,7 @@ #include #include "../mwbase/environment.hpp" +#include "../mwbase/windowmanager.hpp" #include "../mwbase/world.hpp" #include "../mwmechanics/levelledlist.hpp" @@ -341,9 +342,9 @@ MWWorld::ContainerStoreIterator MWWorld::ContainerStore::add( item.getCellRef().setFactionRank(-2); const ESM::RefId& script = item.getClass().getScript(item); + const Ptr& contPtr = getPtr(); if (!script.empty()) { - const Ptr& contPtr = getPtr(); if (contPtr == player) { // Items in player's inventory have cell set to 0, so their scripts will never be removed @@ -370,6 +371,7 @@ MWWorld::ContainerStoreIterator MWWorld::ContainerStore::add( // we should not fire event for InventoryStore yet - it has some custom logic if (mListener && typeid(*this) == typeid(ContainerStore)) mListener->itemAdded(item, count); + MWBase::Environment::get().getWindowManager()->inventoryUpdated(contPtr); return it; } @@ -582,6 +584,7 @@ int MWWorld::ContainerStore::remove(const Ptr& item, int count, bool equipReplac // we should not fire event for InventoryStore yet - it has some custom logic if (mListener && typeid(*this) == typeid(ContainerStore)) mListener->itemRemoved(item, count - toRemove); + MWBase::Environment::get().getWindowManager()->inventoryUpdated(getPtr()); // number of removed items return count - toRemove; diff --git a/apps/openmw/mwworld/inventorystore.cpp b/apps/openmw/mwworld/inventorystore.cpp index eb39d42bbb..8d72c0bec1 100644 --- a/apps/openmw/mwworld/inventorystore.cpp +++ b/apps/openmw/mwworld/inventorystore.cpp @@ -6,6 +6,7 @@ #include #include "../mwbase/environment.hpp" +#include "../mwbase/windowmanager.hpp" #include "../mwmechanics/actorutil.hpp" #include "../mwmechanics/npcstats.hpp" @@ -144,6 +145,7 @@ MWWorld::ContainerStoreIterator MWWorld::InventoryStore::add( if (mListener) mListener->itemAdded(*retVal, count); + MWBase::Environment::get().getWindowManager()->inventoryUpdated(actor); return retVal; } @@ -603,6 +605,7 @@ int MWWorld::InventoryStore::remove(const Ptr& item, int count, bool equipReplac if (mListener) mListener->itemRemoved(item, retCount); + MWBase::Environment::get().getWindowManager()->inventoryUpdated(actor); return retCount; }