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:
commit
0902ea33c9
14 changed files with 41 additions and 59 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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"; }
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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"; }
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue