1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2026-01-09 16:31:18 +00:00

update offer player side, next frame update view

This commit is contained in:
Kuyondo 2025-04-28 17:02:17 +08:00 committed by Kuyondo
parent 0247082e19
commit a6cf359820
9 changed files with 96 additions and 61 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -86,7 +86,7 @@ namespace MWGui
, mLastYSize(0)
, mPreview(std::make_unique<MWRender::InventoryPreview>(parent, resourceSystem, MWMechanics::getPlayer()))
, mTrading(false)
, mUpdateTimer(0.f)
, mUpdateNextFrame(false)
{
mPreviewTexture
= std::make_unique<osgMyGUI::OSGTexture>(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

View file

@ -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<MWRender::InventoryPreview> mPreview;
bool mTrading;
float mUpdateTimer;
bool mUpdateNextFrame;
void toggleMaximized();

View file

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

View file

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