mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-03-12 04:14:05 +00:00
moved ref num assingment from instance creation to save procedure
This commit is contained in:
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…
x
Reference in New Issue
Block a user