1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2026-01-24 04:30:59 +00:00

Merge branch 'trueflame' into 'master'

Don't use container listeners to effect UI updates

Closes #8820

See merge request OpenMW/openmw!5068
This commit is contained in:
Alexei Kotov 2026-01-16 09:48:51 +03:00
commit 0902ea33c9
14 changed files with 41 additions and 59 deletions

View file

@ -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

View file

@ -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()

View file

@ -4,8 +4,6 @@
#include "referenceinterface.hpp"
#include "windowbase.hpp"
#include "../mwworld/containerstore.hpp"
#include <components/misc/notnullptr.hpp>
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"; }

View file

@ -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;
}
}

View file

@ -7,8 +7,6 @@
#include <components/misc/notnullptr.hpp>
#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"; }

View file

@ -172,8 +172,6 @@ namespace MWGui
auto tradeModel = std::make_unique<TradeItemModel>(std::make_unique<InventoryItemModel>(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

View file

@ -5,7 +5,6 @@
#include "windowpinnablebase.hpp"
#include "../mwrender/characterpreview.hpp"
#include "../mwworld/containerstore.hpp"
#include "../mwworld/ptr.hpp"
#include <components/misc/notnullptr.hpp>
@ -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);

View file

@ -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;
}
}

View file

@ -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;

View file

@ -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);

View file

@ -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);
}
}

View file

@ -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;
};
}

View file

@ -13,6 +13,7 @@
#include <components/sceneutil/positionattitudetransform.hpp>
#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;

View file

@ -6,6 +6,7 @@
#include <components/esm3/inventorystate.hpp>
#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;
}