also update draganddrop and trade items

This commit is contained in:
Kindi 2025-04-23 17:22:01 +08:00
parent bdf025a532
commit 4b94b6f678
8 changed files with 74 additions and 10 deletions

View File

@ -11,7 +11,6 @@
#include "controllers.hpp" #include "controllers.hpp"
#include "inventorywindow.hpp" #include "inventorywindow.hpp"
#include "itemview.hpp" #include "itemview.hpp"
#include "itemwidget.hpp"
#include "sortfilteritemmodel.hpp" #include "sortfilteritemmodel.hpp"
namespace MWGui namespace MWGui
@ -72,19 +71,18 @@ namespace MWGui
mSourceSortModel->addDragItem(mItem.mBase, count); mSourceSortModel->addDragItem(mItem.mBase, count);
} }
ItemWidget* baseWidget = MyGUI::Gui::getInstance().createWidget<ItemWidget>( mDraggedWidget = MyGUI::Gui::getInstance().createWidget<ItemWidget>(
"MW_ItemIcon", 0, 0, 42, 42, MyGUI::Align::Default, "DragAndDrop"); "MW_ItemIcon", 0, 0, 42, 42, MyGUI::Align::Default, "DragAndDrop");
Controllers::ControllerFollowMouse* controller Controllers::ControllerFollowMouse* controller
= MyGUI::ControllerManager::getInstance() = MyGUI::ControllerManager::getInstance()
.createItem(Controllers::ControllerFollowMouse::getClassTypeName()) .createItem(Controllers::ControllerFollowMouse::getClassTypeName())
->castType<Controllers::ControllerFollowMouse>(); ->castType<Controllers::ControllerFollowMouse>();
MyGUI::ControllerManager::getInstance().addItem(baseWidget, controller); MyGUI::ControllerManager::getInstance().addItem(mDraggedWidget, controller);
mDraggedWidget = baseWidget; mDraggedWidget->setItem(mItem.mBase);
baseWidget->setItem(mItem.mBase); mDraggedWidget->setNeedMouseFocus(false);
baseWidget->setNeedMouseFocus(false); mDraggedWidget->setCount(count);
baseWidget->setCount(count);
sourceView->update(); sourceView->update();
@ -126,6 +124,22 @@ namespace MWGui
mSourceView->update(); mSourceView->update();
} }
void DragAndDrop::update()
{
if (mIsOnDragAndDrop)
{
int count = mItem.mBase.getCellRef().getCount();
if (count < mDraggedCount)
{
mItem.mCount = count;
mDraggedCount = count;
mDraggedWidget->setCount(mDraggedCount);
mSourceSortModel->clearDragItems();
mSourceSortModel->addDragItem(mItem.mBase, mDraggedCount);
}
}
}
void DragAndDrop::onFrame() void DragAndDrop::onFrame()
{ {
if (mIsOnDragAndDrop && mItem.mBase.getCellRef().getCount() == 0) if (mIsOnDragAndDrop && mItem.mBase.getCellRef().getCount() == 0)

View File

@ -2,6 +2,7 @@
#define OPENMW_MWGUI_DRAGANDDROP_H #define OPENMW_MWGUI_DRAGANDDROP_H
#include "itemmodel.hpp" #include "itemmodel.hpp"
#include "itemwidget.hpp"
namespace MyGUI namespace MyGUI
{ {
@ -18,7 +19,7 @@ namespace MWGui
{ {
public: public:
bool mIsOnDragAndDrop; bool mIsOnDragAndDrop;
MyGUI::Widget* mDraggedWidget; ItemWidget* mDraggedWidget;
ItemModel* mSourceModel; ItemModel* mSourceModel;
ItemView* mSourceView; ItemView* mSourceView;
SortFilterItemModel* mSourceSortModel; SortFilterItemModel* mSourceSortModel;
@ -30,6 +31,7 @@ namespace MWGui
void startDrag( void startDrag(
int index, SortFilterItemModel* sortModel, ItemModel* sourceModel, ItemView* sourceView, int count); int index, SortFilterItemModel* sortModel, ItemModel* sourceModel, ItemView* sourceView, int count);
void drop(ItemModel* targetModel, ItemView* targetView); void drop(ItemModel* targetModel, ItemView* targetView);
void update();
void onFrame(); void onFrame();
void finish(); void finish();

View File

@ -850,6 +850,21 @@ namespace MWGui
mPreview->rebuild(); mPreview->rebuild();
} }
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();
}
MyGUI::IntSize InventoryWindow::getPreviewViewportSize() const MyGUI::IntSize InventoryWindow::getPreviewViewportSize() const
{ {
const MyGUI::IntSize previewWindowSize = mAvatarImage->getSize(); const MyGUI::IntSize previewWindowSize = mAvatarImage->getSize();

View File

@ -64,7 +64,7 @@ namespace MWGui
void setGuiMode(GuiMode mode); void setGuiMode(GuiMode mode);
void itemAdded(const MWWorld::ConstPtr& item, int count) override { updateItemView(); } void itemAdded(const MWWorld::ConstPtr& item, int count) override { updateItemView(); }
void itemRemoved(const MWWorld::ConstPtr& item, int count) override { updateItemView(); } void itemRemoved(const MWWorld::ConstPtr& item, int count) override;
/// Cycle to previous/next weapon /// Cycle to previous/next weapon
void cycle(bool next); void cycle(bool next);

View File

@ -113,6 +113,25 @@ namespace MWGui
encumbrance = std::max(0.f, encumbrance); encumbrance = std::max(0.f, encumbrance);
} }
void TradeItemModel::updateBorrowed()
{
auto update = [](std::vector<ItemStack>& list) {
for (auto it = list.begin(); it != list.end();)
{
int actualCount = it->mBase.getCellRef().getCount();
if (actualCount < it->mCount)
it->mCount = actualCount;
if (it->mCount == 0)
it = list.erase(it);
else
++it;
}
};
update(mBorrowedFromUs);
update(mBorrowedToUs);
}
void TradeItemModel::abort() void TradeItemModel::abort()
{ {
mBorrowedFromUs.clear(); mBorrowedFromUs.clear();

View File

@ -31,6 +31,9 @@ namespace MWGui
void returnItemBorrowedFromUs(ModelIndex itemIndex, ItemModel* source, size_t count); void returnItemBorrowedFromUs(ModelIndex itemIndex, ItemModel* source, size_t count);
/// Update borrowed items in this model
void updateBorrowed();
/// Permanently transfers items that were borrowed to us from another model to this model /// Permanently transfers items that were borrowed to us from another model to this model
void transferItems(); void transferItems();
/// Aborts trade /// Aborts trade

View File

@ -651,4 +651,13 @@ namespace MWGui
{ {
mItemView->update(); mItemView->update();
} }
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();
}
} }

View File

@ -44,10 +44,12 @@ namespace MWGui
void onDeleteCustomData(const MWWorld::Ptr& ptr) override; void onDeleteCustomData(const MWWorld::Ptr& ptr) override;
TradeItemModel* getTradeModel() { return mTradeModel; };
void updateItemView(); void updateItemView();
void itemAdded(const MWWorld::ConstPtr& item, int count) override { updateItemView(); } void itemAdded(const MWWorld::ConstPtr& item, int count) override { updateItemView(); }
void itemRemoved(const MWWorld::ConstPtr& item, int count) override { updateItemView(); } void itemRemoved(const MWWorld::ConstPtr& item, int count) override;
typedef MyGUI::delegates::MultiDelegate<> EventHandle_TradeDone; typedef MyGUI::delegates::MultiDelegate<> EventHandle_TradeDone;
EventHandle_TradeDone eventTradeDone; EventHandle_TradeDone eventTradeDone;