Merge remote-tracking branch 'scrawl/master'

This commit is contained in:
Marc Zinnschlag 2013-08-26 08:47:22 +02:00
commit 5ff6f613bf
5 changed files with 19 additions and 14 deletions

View file

@ -88,8 +88,13 @@ namespace MWGui
mDragAndDropWidget->setVisible(false); mDragAndDropWidget->setVisible(false);
targetModel->copyItem(mItem, mDraggedCount); // If item is dropped where it was taken from, we don't need to do anything -
mSourceModel->removeItem(mItem, mDraggedCount); // otherwise, do the transfer
if (targetModel != mSourceModel)
{
targetModel->copyItem(mItem, mDraggedCount);
mSourceModel->removeItem(mItem, mDraggedCount);
}
mSourceModel->update(); mSourceModel->update();

View file

@ -74,13 +74,12 @@ ItemModel::ModelIndex ContainerItemModel::getIndex (ItemStack item)
void ContainerItemModel::copyItem (const ItemStack& item, size_t count) void ContainerItemModel::copyItem (const ItemStack& item, size_t count)
{ {
const MWWorld::Ptr& source = mItemSources[mItemSources.size()-1]; const MWWorld::Ptr& source = mItemSources[mItemSources.size()-1];
if (item.mBase.getContainerStore() == &source.getClass().getContainerStore(source))
throw std::runtime_error("Item to copy needs to be from a different container!");
int origCount = item.mBase.getRefData().getCount(); int origCount = item.mBase.getRefData().getCount();
item.mBase.getRefData().setCount(count); item.mBase.getRefData().setCount(count);
MWWorld::ContainerStoreIterator it = MWWorld::Class::get(source).getContainerStore(source).add(item.mBase, source); source.getClass().getContainerStore(source).add(item.mBase, source);
if (*it != item.mBase) item.mBase.getRefData().setCount(origCount);
item.mBase.getRefData().setCount(origCount);
else
item.mBase.getRefData().setCount(origCount + count); // item copied onto itself
} }
void ContainerItemModel::removeItem (const ItemStack& item, size_t count) void ContainerItemModel::removeItem (const ItemStack& item, size_t count)

View file

@ -40,13 +40,12 @@ ItemModel::ModelIndex InventoryItemModel::getIndex (ItemStack item)
void InventoryItemModel::copyItem (const ItemStack& item, size_t count) void InventoryItemModel::copyItem (const ItemStack& item, size_t count)
{ {
if (item.mBase.getContainerStore() == &mActor.getClass().getContainerStore(mActor))
throw std::runtime_error("Item to copy needs to be from a different container!");
int origCount = item.mBase.getRefData().getCount(); int origCount = item.mBase.getRefData().getCount();
item.mBase.getRefData().setCount(count); item.mBase.getRefData().setCount(count);
MWWorld::ContainerStoreIterator it = MWWorld::Class::get(mActor).getContainerStore(mActor).add(item.mBase, mActor); mActor.getClass().getContainerStore(mActor).add(item.mBase, mActor);
if (*it != item.mBase) item.mBase.getRefData().setCount(origCount);
item.mBase.getRefData().setCount(origCount);
else
item.mBase.getRefData().setCount(origCount + count); // item copied onto itself
} }

View file

@ -652,7 +652,8 @@ void RenderingManager::requestMap(MWWorld::Ptr::CellStore* cell)
Ogre::Vector2 center(cell->mCell->getGridX() + 0.5, cell->mCell->getGridY() + 0.5); Ogre::Vector2 center(cell->mCell->getGridX() + 0.5, cell->mCell->getGridY() + 0.5);
dims.merge(mTerrain->getWorldBoundingBox(center)); dims.merge(mTerrain->getWorldBoundingBox(center));
mTerrain->update(dims.getCenter()); if (dims.isFinite())
mTerrain->update(dims.getCenter());
mLocalMap->requestMap(cell, dims.getMinimum().z, dims.getMaximum().z); mLocalMap->requestMap(cell, dims.getMinimum().z, dims.getMaximum().z);
} }

View file

@ -43,7 +43,8 @@ namespace MWWorld
// Skip this when reference was deleted. // Skip this when reference was deleted.
// TODO: Support respawning references, in this case, we need to track it somehow. // TODO: Support respawning references, in this case, we need to track it somehow.
if (ref.mDeleted) { if (ref.mDeleted) {
mList.erase(iter); if (iter != mList.end())
mList.erase(iter);
return; return;
} }