From a6cf35982005eea1cdc1c6b2c0bac364cedda95a Mon Sep 17 00:00:00 2001 From: Kuyondo <2538602-Kuyondo@users.noreply.gitlab.com> Date: Mon, 28 Apr 2025 17:02:17 +0800 Subject: [PATCH] update offer player side, next frame update view --- apps/openmw/mwgui/companionwindow.cpp | 17 +++++++++-- apps/openmw/mwgui/companionwindow.hpp | 7 ++--- apps/openmw/mwgui/container.cpp | 21 +++++++++++-- apps/openmw/mwgui/container.hpp | 9 +++--- apps/openmw/mwgui/draganddrop.cpp | 13 +++++--- apps/openmw/mwgui/inventorywindow.cpp | 44 ++++++++++++--------------- apps/openmw/mwgui/inventorywindow.hpp | 4 +-- apps/openmw/mwgui/tradewindow.cpp | 24 ++++++++++----- apps/openmw/mwgui/tradewindow.hpp | 18 ++++++----- 9 files changed, 96 insertions(+), 61 deletions(-) diff --git a/apps/openmw/mwgui/companionwindow.cpp b/apps/openmw/mwgui/companionwindow.cpp index 731403f3a3..bdcb8abc9b 100644 --- a/apps/openmw/mwgui/companionwindow.cpp +++ b/apps/openmw/mwgui/companionwindow.cpp @@ -43,6 +43,7 @@ namespace MWGui , mSortModel(nullptr) , mModel(nullptr) , mSelectedItem(-1) + , mUpdateNextFrame(false) , mDragAndDrop(dragAndDrop) , mMessageBoxManager(manager) { @@ -141,7 +142,13 @@ namespace MWGui void CompanionWindow::onFrame(float dt) { checkReferenceAvailable(); - updateEncumbranceBar(); + + if (mUpdateNextFrame) + { + updateEncumbranceBar(); + mItemView->update(); + mUpdateNextFrame = false; + } } void CompanionWindow::updateEncumbranceBar() @@ -204,9 +211,13 @@ namespace MWGui mSortModel = nullptr; } - void CompanionWindow::updateItemView() + void CompanionWindow::itemAdded(const MWWorld::ConstPtr& item, int count) { - mItemView->update(); + mUpdateNextFrame = true; } + void CompanionWindow::itemRemoved(const MWWorld::ConstPtr& item, int count) + { + mUpdateNextFrame = true; + } } diff --git a/apps/openmw/mwgui/companionwindow.hpp b/apps/openmw/mwgui/companionwindow.hpp index 6f8452997f..5a4b5880ff 100644 --- a/apps/openmw/mwgui/companionwindow.hpp +++ b/apps/openmw/mwgui/companionwindow.hpp @@ -32,10 +32,8 @@ namespace MWGui void onFrame(float dt) override; void clear() override { resetReference(); } - void updateItemView(); - - void itemAdded(const MWWorld::ConstPtr& item, int count) override { updateItemView(); } - void itemRemoved(const MWWorld::ConstPtr& item, int count) override { updateItemView(); } + void itemAdded(const MWWorld::ConstPtr& item, int count) override; + void itemRemoved(const MWWorld::ConstPtr& item, int count) override; std::string_view getWindowIdForLua() const override { return "Companion"; } @@ -44,6 +42,7 @@ namespace MWGui SortFilterItemModel* mSortModel; CompanionItemModel* mModel; int mSelectedItem; + bool mUpdateNextFrame; DragAndDrop* mDragAndDrop; diff --git a/apps/openmw/mwgui/container.cpp b/apps/openmw/mwgui/container.cpp index bb0f90ddc9..6e768f6e1e 100644 --- a/apps/openmw/mwgui/container.cpp +++ b/apps/openmw/mwgui/container.cpp @@ -38,6 +38,7 @@ namespace MWGui , mSortModel(nullptr) , mModel(nullptr) , mSelectedItem(-1) + , mUpdateNextFrame(false) , mTreatNextOpenAsLoot(false) { getWidget(mDisposeCorpseButton, "DisposeCorpseButton"); @@ -323,8 +324,24 @@ namespace MWGui MWBase::Environment::get().getWindowManager()->removeGuiMode(GM_Container); } - void ContainerWindow::updateItemView() + void ContainerWindow::onFrame(float dt) { - mItemView->update(); + checkReferenceAvailable(); + + if (mUpdateNextFrame) + { + mItemView->update(); + mUpdateNextFrame = false; + } + } + + void ContainerWindow::itemAdded(const MWWorld::ConstPtr& item, int count) + { + mUpdateNextFrame = true; + } + + void ContainerWindow::itemRemoved(const MWWorld::ConstPtr& item, int count) + { + mUpdateNextFrame = true; } } diff --git a/apps/openmw/mwgui/container.hpp b/apps/openmw/mwgui/container.hpp index 4898a0eb1c..a7702ebbfe 100644 --- a/apps/openmw/mwgui/container.hpp +++ b/apps/openmw/mwgui/container.hpp @@ -32,7 +32,7 @@ namespace MWGui void onClose() override; void clear() override { resetReference(); } - void onFrame(float dt) override { checkReferenceAvailable(); } + void onFrame(float dt) override; void resetReference() override; @@ -40,10 +40,8 @@ namespace MWGui void treatNextOpenAsLoot() { mTreatNextOpenAsLoot = true; } - void updateItemView(); - - void itemAdded(const MWWorld::ConstPtr& item, int count) override { updateItemView(); } - void itemRemoved(const MWWorld::ConstPtr& item, int count) override { updateItemView(); } + void itemAdded(const MWWorld::ConstPtr& item, int count) override; + void itemRemoved(const MWWorld::ConstPtr& item, int count) override; std::string_view getWindowIdForLua() const override { return "Container"; } @@ -54,6 +52,7 @@ namespace MWGui SortFilterItemModel* mSortModel; ItemModel* mModel; int mSelectedItem; + bool mUpdateNextFrame; bool mTreatNextOpenAsLoot; MyGUI::Button* mDisposeCorpseButton; MyGUI::Button* mTakeButton; diff --git a/apps/openmw/mwgui/draganddrop.cpp b/apps/openmw/mwgui/draganddrop.cpp index 17ce5360c0..52b0939238 100644 --- a/apps/openmw/mwgui/draganddrop.cpp +++ b/apps/openmw/mwgui/draganddrop.cpp @@ -84,13 +84,12 @@ namespace MWGui mDraggedWidget->setNeedMouseFocus(false); mDraggedWidget->setCount(count); - sourceView->update(); - MWBase::Environment::get().getWindowManager()->setDragDrop(true); mIsOnDragAndDrop = true; - MWBase::Environment::get().getWindowManager()->getInventoryWindow()->updateItemView(); + // Update item view after completing drag-and-drop setup + mSourceView->update(); } void DragAndDrop::drop(ItemModel* targetModel, ItemView* targetView) @@ -153,8 +152,12 @@ namespace MWGui // since mSourceView doesn't get updated in drag() MWBase::Environment::get().getWindowManager()->getInventoryWindow()->updateItemView(); - MyGUI::Gui::getInstance().destroyWidget(mDraggedWidget); - mDraggedWidget = nullptr; + if (mDraggedWidget) + { + MyGUI::Gui::getInstance().destroyWidget(mDraggedWidget); + mDraggedWidget = nullptr; + } + MWBase::Environment::get().getWindowManager()->setDragDrop(false); } diff --git a/apps/openmw/mwgui/inventorywindow.cpp b/apps/openmw/mwgui/inventorywindow.cpp index 656f1a3db4..43163e175d 100644 --- a/apps/openmw/mwgui/inventorywindow.cpp +++ b/apps/openmw/mwgui/inventorywindow.cpp @@ -86,7 +86,7 @@ namespace MWGui , mLastYSize(0) , mPreview(std::make_unique(parent, resourceSystem, MWMechanics::getPlayer())) , mTrading(false) - , mUpdateTimer(0.f) + , mUpdateNextFrame(false) { mPreviewTexture = std::make_unique(mPreview->getTexture(), mPreview->getTextureStateSet()); @@ -683,22 +683,21 @@ namespace MWGui void InventoryWindow::onFrame(float dt) { - updateEncumbranceBar(); - - if (mPinned) + if (mUpdateNextFrame) { - mUpdateTimer += dt; - if (0.1f < mUpdateTimer) + if (mTrading) { - mUpdateTimer = 0; - - // Update pinned inventory in-game - if (!MWBase::Environment::get().getWindowManager()->isGuiMode()) - { - mItemView->update(); - notifyContentChanged(); - } + mTradeModel->updateBorrowed(); + MWBase::Environment::get().getWindowManager()->getTradeWindow()->mTradeModel->updateBorrowed(); + MWBase::Environment::get().getWindowManager()->getTradeWindow()->updateItemView(); + MWBase::Environment::get().getWindowManager()->getTradeWindow()->updateOffer(); } + + updateEncumbranceBar(); + mDragAndDrop->update(); + mItemView->update(); + notifyContentChanged(); + mUpdateNextFrame = false; } } @@ -850,19 +849,14 @@ namespace MWGui mPreview->rebuild(); } + void InventoryWindow::itemAdded(const MWWorld::ConstPtr& item, int count) + { + mUpdateNextFrame = true; + } + void InventoryWindow::itemRemoved(const MWWorld::ConstPtr& item, int count) { - if (mDragAndDrop->mIsOnDragAndDrop && mDragAndDrop->mItem.mBase == item) - mDragAndDrop->update(); - - if (mTrading) - { - mTradeModel->updateBorrowed(); - MWBase::Environment::get().getWindowManager()->getTradeWindow()->getTradeModel()->updateBorrowed(); - MWBase::Environment::get().getWindowManager()->getTradeWindow()->updateItemView(); - } - - updateItemView(); + mUpdateNextFrame = true; } MyGUI::IntSize InventoryWindow::getPreviewViewportSize() const diff --git a/apps/openmw/mwgui/inventorywindow.hpp b/apps/openmw/mwgui/inventorywindow.hpp index 079e629673..7f0d64dce0 100644 --- a/apps/openmw/mwgui/inventorywindow.hpp +++ b/apps/openmw/mwgui/inventorywindow.hpp @@ -63,7 +63,7 @@ namespace MWGui void setGuiMode(GuiMode mode); - void itemAdded(const MWWorld::ConstPtr& item, int count) override { updateItemView(); } + void itemAdded(const MWWorld::ConstPtr& item, int count) override; void itemRemoved(const MWWorld::ConstPtr& item, int count) override; /// Cycle to previous/next weapon @@ -111,7 +111,7 @@ namespace MWGui std::unique_ptr mPreview; bool mTrading; - float mUpdateTimer; + bool mUpdateNextFrame; void toggleMaximized(); diff --git a/apps/openmw/mwgui/tradewindow.cpp b/apps/openmw/mwgui/tradewindow.cpp index cf882d96cf..ea124f0a97 100644 --- a/apps/openmw/mwgui/tradewindow.cpp +++ b/apps/openmw/mwgui/tradewindow.cpp @@ -123,6 +123,7 @@ namespace MWGui , mItemToSell(-1) , mCurrentBalance(0) , mCurrentMerchantOffer(0) + , mUpdateNextFrame(false) { getWidget(mFilterAll, "AllButton"); getWidget(mFilterWeapon, "WeaponButton"); @@ -209,6 +210,16 @@ namespace MWGui void TradeWindow::onFrame(float dt) { checkReferenceAvailable(); + + if (isVisible() && mUpdateNextFrame) + { + mTradeModel->updateBorrowed(); + MWBase::Environment::get().getWindowManager()->getInventoryWindow()->getTradeModel()->updateBorrowed(); + MWBase::Environment::get().getWindowManager()->getInventoryWindow()->updateItemView(); + mItemView->update(); + updateOffer(); + mUpdateNextFrame = false; + } } void TradeWindow::onNameFilterChanged(MyGUI::EditBox* _sender) @@ -652,14 +663,13 @@ namespace MWGui mItemView->update(); } + void TradeWindow::itemAdded(const MWWorld::ConstPtr& item, int count) + { + mUpdateNextFrame = true; + } + void TradeWindow::itemRemoved(const MWWorld::ConstPtr& item, int count) { - mTradeModel->updateBorrowed(); - MWBase::Environment::get().getWindowManager()->getInventoryWindow()->getTradeModel()->updateBorrowed(); - - MWBase::Environment::get().getWindowManager()->getInventoryWindow()->updateItemView(); - updateItemView(); - - updateOffer(); + mUpdateNextFrame = true; } } diff --git a/apps/openmw/mwgui/tradewindow.hpp b/apps/openmw/mwgui/tradewindow.hpp index 748d7ce7d5..b0581d0d38 100644 --- a/apps/openmw/mwgui/tradewindow.hpp +++ b/apps/openmw/mwgui/tradewindow.hpp @@ -33,22 +33,15 @@ namespace MWGui void onFrame(float dt) override; void clear() override { resetReference(); } - void borrowItem(int index, size_t count); - void returnItem(int index, size_t count); - - int getMerchantServices(); - bool exit() override; void resetReference() override; void onDeleteCustomData(const MWWorld::Ptr& ptr) override; - TradeItemModel* getTradeModel() { return mTradeModel; } - void updateItemView(); - void itemAdded(const MWWorld::ConstPtr& item, int count) override { updateItemView(); } + void itemAdded(const MWWorld::ConstPtr& item, int count) override; void itemRemoved(const MWWorld::ConstPtr& item, int count) override; typedef MyGUI::delegates::MultiDelegate<> EventHandle_TradeDone; @@ -57,6 +50,8 @@ namespace MWGui std::string_view getWindowIdForLua() const override { return "Trade"; } private: + friend class InventoryWindow; + ItemView* mItemView; SortFilterItemModel* mSortModel; TradeItemModel* mTradeModel; @@ -90,6 +85,8 @@ namespace MWGui int mCurrentBalance; int mCurrentMerchantOffer; + bool mUpdateNextFrame; + void sellToNpc( const MWWorld::Ptr& item, int count, bool boughtItem); ///< only used for adjusting the gold balance void buyFromNpc( @@ -100,6 +97,11 @@ namespace MWGui void onItemSelected(int index); void sellItem(MyGUI::Widget* sender, int count); + void borrowItem(int index, size_t count); + void returnItem(int index, size_t count); + + int getMerchantServices(); + void onFilterChanged(MyGUI::Widget* _sender); void onNameFilterChanged(MyGUI::EditBox* _sender); void onOfferButtonClicked(MyGUI::Widget* _sender);