mirror of
https://github.com/OpenMW/openmw.git
synced 2025-02-04 07:15:34 +00:00
Merge branch 'resurrection_window' into 'master'
Close windows using Ptrs that are about to be deleted Closes #4203 See merge request OpenMW/openmw!1020
This commit is contained in:
commit
5e45e2ca5d
19 changed files with 60 additions and 0 deletions
|
@ -4,6 +4,7 @@
|
|||
Bug #3737: Scripts from The Underground 2 .esp do not play (all patched versions)
|
||||
Bug #3846: Strings starting with "-" fail to compile if not enclosed in quotes
|
||||
Bug #3905: Great House Dagoth issues
|
||||
Bug #4203: Resurrecting an actor should close the loot GUI
|
||||
Bug #5100: Persuasion doesn't always clamp the resulting disposition
|
||||
Bug #5120: Scripted object spawning updates physics system
|
||||
Bug #5379: Wandering NPCs falling through cantons
|
||||
|
|
|
@ -353,6 +353,8 @@ namespace MWBase
|
|||
virtual MWWorld::Ptr getWatchedActor() const = 0;
|
||||
|
||||
virtual const std::string& getVersionDescription() const = 0;
|
||||
|
||||
virtual void onDeleteCustomData(const MWWorld::Ptr& ptr) = 0;
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -830,6 +830,7 @@ namespace MWClass
|
|||
}
|
||||
|
||||
MWBase::Environment::get().getWorld()->removeContainerScripts(ptr);
|
||||
MWBase::Environment::get().getWindowManager()->onDeleteCustomData(ptr);
|
||||
ptr.getRefData().setCustomData(nullptr);
|
||||
|
||||
// Reset to original position
|
||||
|
|
|
@ -1384,6 +1384,7 @@ namespace MWClass
|
|||
}
|
||||
|
||||
MWBase::Environment::get().getWorld()->removeContainerScripts(ptr);
|
||||
MWBase::Environment::get().getWindowManager()->onDeleteCustomData(ptr);
|
||||
ptr.getRefData().setCustomData(nullptr);
|
||||
|
||||
// Reset to original position
|
||||
|
|
|
@ -302,4 +302,9 @@ namespace MWGui
|
|||
return mModel->onTakeItem(item.mBase, count);
|
||||
}
|
||||
|
||||
void ContainerWindow::onDeleteCustomData(const MWWorld::Ptr& ptr)
|
||||
{
|
||||
if(mModel && mModel->usesContainer(ptr))
|
||||
MWBase::Environment::get().getWindowManager()->removeGuiMode(GM_Container);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -35,6 +35,8 @@ namespace MWGui
|
|||
|
||||
void resetReference() override;
|
||||
|
||||
void onDeleteCustomData(const MWWorld::Ptr& ptr) override;
|
||||
|
||||
private:
|
||||
DragAndDrop* mDragAndDrop;
|
||||
|
||||
|
|
|
@ -249,4 +249,14 @@ bool ContainerItemModel::onTakeItem(const MWWorld::Ptr &item, int count)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool ContainerItemModel::usesContainer(const MWWorld::Ptr& container)
|
||||
{
|
||||
for(const auto& source : mItemSources)
|
||||
{
|
||||
if(source.first == container)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -36,6 +36,8 @@ namespace MWGui
|
|||
|
||||
void update() override;
|
||||
|
||||
bool usesContainer(const MWWorld::Ptr& container) override;
|
||||
|
||||
private:
|
||||
std::vector<std::pair<MWWorld::Ptr, MWWorld::ResolutionHandle>> mItemSources;
|
||||
std::vector<MWWorld::Ptr> mWorldItems;
|
||||
|
|
|
@ -57,6 +57,7 @@ namespace MWGui
|
|||
void update() override {}
|
||||
size_t getItemCount() override { return 0; }
|
||||
ItemStack getItem (ModelIndex index) override { throw std::runtime_error("getItem not implemented"); }
|
||||
bool usesContainer(const MWWorld::Ptr&) override { return false; }
|
||||
|
||||
private:
|
||||
// Where to drop the item
|
||||
|
|
|
@ -131,4 +131,9 @@ bool InventoryItemModel::onTakeItem(const MWWorld::Ptr &item, int count)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool InventoryItemModel::usesContainer(const MWWorld::Ptr& container)
|
||||
{
|
||||
return mActor == container;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -25,6 +25,8 @@ namespace MWGui
|
|||
|
||||
void update() override;
|
||||
|
||||
bool usesContainer(const MWWorld::Ptr& container) override;
|
||||
|
||||
protected:
|
||||
MWWorld::Ptr mActor;
|
||||
private:
|
||||
|
|
|
@ -162,4 +162,9 @@ namespace MWGui
|
|||
{
|
||||
return mSourceModel->onTakeItem(item, count);
|
||||
}
|
||||
|
||||
bool ProxyItemModel::usesContainer(const MWWorld::Ptr& container)
|
||||
{
|
||||
return mSourceModel->usesContainer(container);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -75,6 +75,8 @@ namespace MWGui
|
|||
virtual bool onDropItem(const MWWorld::Ptr &item, int count);
|
||||
virtual bool onTakeItem(const MWWorld::Ptr &item, int count);
|
||||
|
||||
virtual bool usesContainer(const MWWorld::Ptr& container) = 0;
|
||||
|
||||
private:
|
||||
ItemModel(const ItemModel&);
|
||||
ItemModel& operator=(const ItemModel&);
|
||||
|
@ -103,6 +105,8 @@ namespace MWGui
|
|||
|
||||
ModelIndex mapToSource (ModelIndex index);
|
||||
ModelIndex mapFromSource (ModelIndex index);
|
||||
|
||||
bool usesContainer(const MWWorld::Ptr& container) override;
|
||||
protected:
|
||||
ItemModel* mSourceModel;
|
||||
};
|
||||
|
|
|
@ -523,4 +523,10 @@ namespace MWGui
|
|||
return;
|
||||
resetReference();
|
||||
}
|
||||
|
||||
void TradeWindow::onDeleteCustomData(const MWWorld::Ptr& ptr)
|
||||
{
|
||||
if(mTradeModel && mTradeModel->usesContainer(ptr))
|
||||
MWBase::Environment::get().getWindowManager()->removeGuiMode(GM_Barter);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -42,6 +42,8 @@ namespace MWGui
|
|||
|
||||
void resetReference() override;
|
||||
|
||||
void onDeleteCustomData(const MWWorld::Ptr& ptr) override;
|
||||
|
||||
typedef MyGUI::delegates::CMultiDelegate0 EventHandle_TradeDone;
|
||||
EventHandle_TradeDone eventTradeDone;
|
||||
|
||||
|
|
|
@ -47,6 +47,8 @@ namespace MWGui
|
|||
/// Called when GUI viewport changes size
|
||||
virtual void onResChange(int width, int height) {}
|
||||
|
||||
virtual void onDeleteCustomData(const MWWorld::Ptr& ptr) {}
|
||||
|
||||
protected:
|
||||
virtual void onTitleDoubleClicked();
|
||||
|
||||
|
|
|
@ -2220,4 +2220,10 @@ namespace MWGui
|
|||
messageBox(v.mMessage, v.mShowInDialogueMode);
|
||||
scheduledMessageBoxes->clear();
|
||||
}
|
||||
|
||||
void WindowManager::onDeleteCustomData(const MWWorld::Ptr& ptr)
|
||||
{
|
||||
for(auto* window : mWindows)
|
||||
window->onDeleteCustomData(ptr);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -388,6 +388,8 @@ namespace MWGui
|
|||
|
||||
const std::string& getVersionDescription() const override;
|
||||
|
||||
void onDeleteCustomData(const MWWorld::Ptr& ptr) override;
|
||||
|
||||
private:
|
||||
unsigned int mOldUpdateMask; unsigned int mOldCullMask;
|
||||
|
||||
|
|
|
@ -1205,6 +1205,7 @@ namespace MWScript
|
|||
bool wasEnabled = ptr.getRefData().isEnabled();
|
||||
MWBase::Environment::get().getWorld()->undeleteObject(ptr);
|
||||
MWBase::Environment::get().getWorld()->removeContainerScripts(ptr);
|
||||
MWBase::Environment::get().getWindowManager()->onDeleteCustomData(ptr);
|
||||
|
||||
// HACK: disable/enable object to re-add it to the scene properly (need a new Animation).
|
||||
MWBase::Environment::get().getWorld()->disable(ptr);
|
||||
|
|
Loading…
Reference in a new issue