forked from teamnwah/openmw-tes3coop
Merge branch 'move'
This commit is contained in:
commit
1bb23b6c77
8 changed files with 41 additions and 78 deletions
|
@ -11,6 +11,7 @@
|
|||
#include <components/misc/stringops.hpp>
|
||||
|
||||
#include "../world/infocollection.hpp"
|
||||
#include "../world/cellcoordinates.hpp"
|
||||
|
||||
#include "document.hpp"
|
||||
#include "savingstate.hpp"
|
||||
|
@ -238,7 +239,7 @@ void CSMDoc::CollectionReferencesStage::perform (int stage, Messages& messages)
|
|||
// An empty mOriginalCell is meant to indicate that it is the same as
|
||||
// the current cell. It is possible that a moved ref is moved again.
|
||||
if ((record.get().mOriginalCell.empty() ?
|
||||
record.get().mCell : record.get().mOriginalCell) != stream.str() && !interior)
|
||||
record.get().mCell : record.get().mOriginalCell) != stream.str() && !interior && record.mState!=CSMWorld::RecordBase::State_ModifiedOnly && !record.get().mNew)
|
||||
indices.push_back (i);
|
||||
else
|
||||
indices.push_front (i);
|
||||
|
@ -265,13 +266,32 @@ void CSMDoc::WriteCellCollectionStage::perform (int stage, Messages& messages)
|
|||
std::map<std::string, std::deque<int> >::const_iterator references =
|
||||
mState.getSubRecords().find (Misc::StringUtils::lowerCase (cell.get().mId));
|
||||
|
||||
if (cell.isModified() ||
|
||||
if (cell.isModified() ||
|
||||
cell.mState == CSMWorld::RecordBase::State_Deleted ||
|
||||
references!=mState.getSubRecords().end())
|
||||
{
|
||||
CSMWorld::Cell cellRecord = cell.get();
|
||||
bool interior = cellRecord.mId.substr (0, 1)!="#";
|
||||
|
||||
// count new references and adjust RefNumCount accordingsly
|
||||
int newRefNum = cellRecord.mRefNumCounter;
|
||||
|
||||
if (references!=mState.getSubRecords().end())
|
||||
{
|
||||
for (std::deque<int>::const_iterator iter (references->second.begin());
|
||||
iter!=references->second.end(); ++iter)
|
||||
{
|
||||
const CSMWorld::Record<CSMWorld::CellRef>& ref =
|
||||
mDocument.getData().getReferences().getRecord (*iter);
|
||||
|
||||
if (ref.get().mNew ||
|
||||
(!interior && ref.mState==CSMWorld::RecordBase::State_ModifiedOnly &&
|
||||
/// \todo consider worldspace
|
||||
CSMWorld::CellCoordinates (ref.get().getCellIndex()).getId("")!=ref.get().mCell))
|
||||
++cellRecord.mRefNumCounter;
|
||||
}
|
||||
}
|
||||
|
||||
// write cell data
|
||||
writer.startRecord (cellRecord.sRecordId);
|
||||
|
||||
|
@ -309,11 +329,18 @@ void CSMDoc::WriteCellCollectionStage::perform (int stage, Messages& messages)
|
|||
stream << "#" << index.first << " " << index.second;
|
||||
}
|
||||
|
||||
// An empty mOriginalCell is meant to indicate that it is the same as
|
||||
// the current cell. It is possible that a moved ref is moved again.
|
||||
if ((refRecord.mOriginalCell.empty() ? refRecord.mCell : refRecord.mOriginalCell)
|
||||
if (refRecord.mNew ||
|
||||
(!interior && ref.mState==CSMWorld::RecordBase::State_ModifiedOnly &&
|
||||
refRecord.mCell!=stream.str()))
|
||||
{
|
||||
refRecord.mRefNum.mIndex = newRefNum++;
|
||||
}
|
||||
else if ((refRecord.mOriginalCell.empty() ? refRecord.mCell : refRecord.mOriginalCell)
|
||||
!= stream.str() && !interior)
|
||||
{
|
||||
// An empty mOriginalCell is meant to indicate that it is the same as
|
||||
// the current cell. It is possible that a moved ref is moved again.
|
||||
|
||||
ESM::MovedCellRef moved;
|
||||
moved.mRefNum = refRecord.mRefNum;
|
||||
|
||||
|
@ -350,7 +377,7 @@ int CSMDoc::WritePathgridCollectionStage::setup()
|
|||
void CSMDoc::WritePathgridCollectionStage::perform (int stage, Messages& messages)
|
||||
{
|
||||
ESM::ESMWriter& writer = mState.getWriter();
|
||||
const CSMWorld::Record<CSMWorld::Pathgrid>& pathgrid =
|
||||
const CSMWorld::Record<CSMWorld::Pathgrid>& pathgrid =
|
||||
mDocument.getData().getPathgrids().getRecord (stage);
|
||||
|
||||
if (pathgrid.isModified() || pathgrid.mState == CSMWorld::RecordBase::State_Deleted)
|
||||
|
@ -386,7 +413,7 @@ int CSMDoc::WriteLandCollectionStage::setup()
|
|||
void CSMDoc::WriteLandCollectionStage::perform (int stage, Messages& messages)
|
||||
{
|
||||
ESM::ESMWriter& writer = mState.getWriter();
|
||||
const CSMWorld::Record<CSMWorld::Land>& land =
|
||||
const CSMWorld::Record<CSMWorld::Land>& land =
|
||||
mDocument.getData().getLand().getRecord (stage);
|
||||
|
||||
if (land.isModified() || land.mState == CSMWorld::RecordBase::State_Deleted)
|
||||
|
@ -412,7 +439,7 @@ int CSMDoc::WriteLandTextureCollectionStage::setup()
|
|||
void CSMDoc::WriteLandTextureCollectionStage::perform (int stage, Messages& messages)
|
||||
{
|
||||
ESM::ESMWriter& writer = mState.getWriter();
|
||||
const CSMWorld::Record<CSMWorld::LandTexture>& landTexture =
|
||||
const CSMWorld::Record<CSMWorld::LandTexture>& landTexture =
|
||||
mDocument.getData().getLandTextures().getRecord (stage);
|
||||
|
||||
if (landTexture.isModified() || landTexture.mState == CSMWorld::RecordBase::State_Deleted)
|
||||
|
|
|
@ -99,6 +99,7 @@ void CSMTools::MergeReferencesStage::perform (int stage, CSMDoc::Messages& messa
|
|||
|
||||
ref.mRefNum.mIndex = mIndex[Misc::StringUtils::lowerCase (ref.mCell)]++;
|
||||
ref.mRefNum.mContentFile = 0;
|
||||
ref.mNew = false;
|
||||
|
||||
CSMWorld::Record<CSMWorld::CellRef> newRecord (
|
||||
CSMWorld::RecordBase::State_ModifiedOnly, 0, &ref);
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
#include "cellcoordinates.hpp"
|
||||
|
||||
CSMWorld::CellRef::CellRef()
|
||||
CSMWorld::CellRef::CellRef() : mNew (true)
|
||||
{
|
||||
mRefNum.mIndex = 0;
|
||||
mRefNum.mContentFile = 0;
|
||||
|
|
|
@ -13,6 +13,7 @@ namespace CSMWorld
|
|||
std::string mId;
|
||||
std::string mCell;
|
||||
std::string mOriginalCell;
|
||||
bool mNew; // new reference, not counted yet, ref num not assigned yet
|
||||
|
||||
CellRef();
|
||||
|
||||
|
|
|
@ -19,6 +19,7 @@ void CSMWorld::RefCollection::load (ESM::ESMReader& reader, int cellIndex, bool
|
|||
Cell& cell2 = base ? cell.mBase : cell.mModified;
|
||||
|
||||
CellRef ref;
|
||||
ref.mNew = false;
|
||||
ESM::MovedCellRef mref;
|
||||
bool isDeleted = false;
|
||||
|
||||
|
|
|
@ -421,24 +421,7 @@ void CSVRender::InstanceMode::dropEvent (QDropEvent* event)
|
|||
CSMWorld::Columns::ColumnId_ReferenceableId),
|
||||
QString::fromUtf8 (iter->getId().c_str()));
|
||||
|
||||
std::auto_ptr<CSMWorld::ModifyCommand> incrementCommand;
|
||||
|
||||
if (!noCell)
|
||||
{
|
||||
// increase reference count in cell
|
||||
QModelIndex countIndex = cellTable.getModelIndex (cellId,
|
||||
cellTable.findColumnIndex (CSMWorld::Columns::ColumnId_RefNumCounter));
|
||||
|
||||
int count = cellTable.data (countIndex).toInt();
|
||||
|
||||
incrementCommand.reset (
|
||||
new CSMWorld::ModifyCommand (cellTable, countIndex, count+1));
|
||||
}
|
||||
|
||||
CSMWorld::CommandMacro macro (document.getUndoStack());
|
||||
macro.push (createCommand.release());
|
||||
if (incrementCommand.get())
|
||||
macro.push (incrementCommand.release());
|
||||
document.getUndoStack().push (createCommand.release());
|
||||
|
||||
dropped = true;
|
||||
}
|
||||
|
|
|
@ -26,51 +26,6 @@ void CSVWorld::ReferenceCreator::configureCreateCommand (CSMWorld::CreateCommand
|
|||
findColumnIndex (CSMWorld::Columns::ColumnId_Cell);
|
||||
|
||||
command.addValue (cellIdColumn, mCell->text());
|
||||
|
||||
// Set RefNum
|
||||
int refNumColumn = dynamic_cast<CSMWorld::IdTable&> (
|
||||
*getData().getTableModel (CSMWorld::UniversalId::Type_References)).
|
||||
findColumnIndex (CSMWorld::Columns::ColumnId_RefNum);
|
||||
|
||||
command.addValue (refNumColumn, getRefNumCount());
|
||||
}
|
||||
|
||||
void CSVWorld::ReferenceCreator::pushCommand (std::auto_ptr<CSMWorld::CreateCommand> command,
|
||||
const std::string& id)
|
||||
{
|
||||
// get the old count
|
||||
std::string cellId = mCell->text().toUtf8().constData();
|
||||
|
||||
CSMWorld::IdTable& cellTable = dynamic_cast<CSMWorld::IdTable&> (
|
||||
*getData().getTableModel (CSMWorld::UniversalId::Type_Cells));
|
||||
|
||||
int countColumn = cellTable.findColumnIndex (CSMWorld::Columns::ColumnId_RefNumCounter);
|
||||
|
||||
QModelIndex countIndex = cellTable.getModelIndex (cellId, countColumn);
|
||||
|
||||
int count = cellTable.data (countIndex).toInt();
|
||||
|
||||
// command for incrementing counter
|
||||
std::auto_ptr<CSMWorld::ModifyCommand> increment (new CSMWorld::ModifyCommand
|
||||
(cellTable, countIndex, count+1));
|
||||
|
||||
CSMWorld::CommandMacro macro (getUndoStack(), command->text());
|
||||
GenericCreator::pushCommand (command, id);
|
||||
macro.push (increment.release());
|
||||
}
|
||||
|
||||
int CSVWorld::ReferenceCreator::getRefNumCount() const
|
||||
{
|
||||
std::string cellId = mCell->text().toUtf8().constData();
|
||||
|
||||
CSMWorld::IdTable& cellTable = dynamic_cast<CSMWorld::IdTable&> (
|
||||
*getData().getTableModel (CSMWorld::UniversalId::Type_Cells));
|
||||
|
||||
int countColumn = cellTable.findColumnIndex (CSMWorld::Columns::ColumnId_RefNumCounter);
|
||||
|
||||
QModelIndex countIndex = cellTable.getModelIndex (cellId, countColumn);
|
||||
|
||||
return cellTable.data (countIndex).toInt();
|
||||
}
|
||||
|
||||
CSVWorld::ReferenceCreator::ReferenceCreator (CSMWorld::Data& data, QUndoStack& undoStack,
|
||||
|
|
|
@ -29,11 +29,6 @@ namespace CSVWorld
|
|||
|
||||
virtual void configureCreateCommand (CSMWorld::CreateCommand& command) const;
|
||||
|
||||
virtual void pushCommand (std::auto_ptr<CSMWorld::CreateCommand> command,
|
||||
const std::string& id);
|
||||
|
||||
int getRefNumCount() const;
|
||||
|
||||
public:
|
||||
|
||||
ReferenceCreator (CSMWorld::Data& data, QUndoStack& undoStack,
|
||||
|
@ -50,7 +45,7 @@ namespace CSVWorld
|
|||
|
||||
/// Focus main input widget
|
||||
virtual void focus();
|
||||
|
||||
|
||||
private slots:
|
||||
|
||||
void cellChanged();
|
||||
|
|
Loading…
Reference in a new issue