moved ref num assingment from instance creation to save procedure

move
Marc Zinnschlag 9 years ago
parent 8052225460
commit 1774f6d9bf

@ -265,13 +265,29 @@ 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)
++cellRecord.mRefNumCounter;
}
}
// write cell data
writer.startRecord (cellRecord.sRecordId);
@ -309,11 +325,16 @@ 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)
{
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 +371,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 +407,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 +433,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…
Cancel
Save