Merge branch 'move'

openmw-39
Marc Zinnschlag 9 years ago
commit 1bb23b6c77

@ -11,6 +11,7 @@
#include <components/misc/stringops.hpp> #include <components/misc/stringops.hpp>
#include "../world/infocollection.hpp" #include "../world/infocollection.hpp"
#include "../world/cellcoordinates.hpp"
#include "document.hpp" #include "document.hpp"
#include "savingstate.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 // 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. // the current cell. It is possible that a moved ref is moved again.
if ((record.get().mOriginalCell.empty() ? 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); indices.push_back (i);
else else
indices.push_front (i); 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 = std::map<std::string, std::deque<int> >::const_iterator references =
mState.getSubRecords().find (Misc::StringUtils::lowerCase (cell.get().mId)); mState.getSubRecords().find (Misc::StringUtils::lowerCase (cell.get().mId));
if (cell.isModified() || if (cell.isModified() ||
cell.mState == CSMWorld::RecordBase::State_Deleted || cell.mState == CSMWorld::RecordBase::State_Deleted ||
references!=mState.getSubRecords().end()) references!=mState.getSubRecords().end())
{ {
CSMWorld::Cell cellRecord = cell.get(); CSMWorld::Cell cellRecord = cell.get();
bool interior = cellRecord.mId.substr (0, 1)!="#"; 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 // write cell data
writer.startRecord (cellRecord.sRecordId); writer.startRecord (cellRecord.sRecordId);
@ -309,11 +329,18 @@ void CSMDoc::WriteCellCollectionStage::perform (int stage, Messages& messages)
stream << "#" << index.first << " " << index.second; stream << "#" << index.first << " " << index.second;
} }
// An empty mOriginalCell is meant to indicate that it is the same as if (refRecord.mNew ||
// the current cell. It is possible that a moved ref is moved again. (!interior && ref.mState==CSMWorld::RecordBase::State_ModifiedOnly &&
if ((refRecord.mOriginalCell.empty() ? refRecord.mCell : refRecord.mOriginalCell) refRecord.mCell!=stream.str()))
{
refRecord.mRefNum.mIndex = newRefNum++;
}
else if ((refRecord.mOriginalCell.empty() ? refRecord.mCell : refRecord.mOriginalCell)
!= stream.str() && !interior) != 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; ESM::MovedCellRef moved;
moved.mRefNum = refRecord.mRefNum; moved.mRefNum = refRecord.mRefNum;
@ -350,7 +377,7 @@ int CSMDoc::WritePathgridCollectionStage::setup()
void CSMDoc::WritePathgridCollectionStage::perform (int stage, Messages& messages) void CSMDoc::WritePathgridCollectionStage::perform (int stage, Messages& messages)
{ {
ESM::ESMWriter& writer = mState.getWriter(); ESM::ESMWriter& writer = mState.getWriter();
const CSMWorld::Record<CSMWorld::Pathgrid>& pathgrid = const CSMWorld::Record<CSMWorld::Pathgrid>& pathgrid =
mDocument.getData().getPathgrids().getRecord (stage); mDocument.getData().getPathgrids().getRecord (stage);
if (pathgrid.isModified() || pathgrid.mState == CSMWorld::RecordBase::State_Deleted) 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) void CSMDoc::WriteLandCollectionStage::perform (int stage, Messages& messages)
{ {
ESM::ESMWriter& writer = mState.getWriter(); ESM::ESMWriter& writer = mState.getWriter();
const CSMWorld::Record<CSMWorld::Land>& land = const CSMWorld::Record<CSMWorld::Land>& land =
mDocument.getData().getLand().getRecord (stage); mDocument.getData().getLand().getRecord (stage);
if (land.isModified() || land.mState == CSMWorld::RecordBase::State_Deleted) 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) void CSMDoc::WriteLandTextureCollectionStage::perform (int stage, Messages& messages)
{ {
ESM::ESMWriter& writer = mState.getWriter(); ESM::ESMWriter& writer = mState.getWriter();
const CSMWorld::Record<CSMWorld::LandTexture>& landTexture = const CSMWorld::Record<CSMWorld::LandTexture>& landTexture =
mDocument.getData().getLandTextures().getRecord (stage); mDocument.getData().getLandTextures().getRecord (stage);
if (landTexture.isModified() || landTexture.mState == CSMWorld::RecordBase::State_Deleted) 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.mIndex = mIndex[Misc::StringUtils::lowerCase (ref.mCell)]++;
ref.mRefNum.mContentFile = 0; ref.mRefNum.mContentFile = 0;
ref.mNew = false;
CSMWorld::Record<CSMWorld::CellRef> newRecord ( CSMWorld::Record<CSMWorld::CellRef> newRecord (
CSMWorld::RecordBase::State_ModifiedOnly, 0, &ref); CSMWorld::RecordBase::State_ModifiedOnly, 0, &ref);

@ -6,7 +6,7 @@
#include "cellcoordinates.hpp" #include "cellcoordinates.hpp"
CSMWorld::CellRef::CellRef() CSMWorld::CellRef::CellRef() : mNew (true)
{ {
mRefNum.mIndex = 0; mRefNum.mIndex = 0;
mRefNum.mContentFile = 0; mRefNum.mContentFile = 0;

@ -13,6 +13,7 @@ namespace CSMWorld
std::string mId; std::string mId;
std::string mCell; std::string mCell;
std::string mOriginalCell; std::string mOriginalCell;
bool mNew; // new reference, not counted yet, ref num not assigned yet
CellRef(); CellRef();

@ -19,6 +19,7 @@ void CSMWorld::RefCollection::load (ESM::ESMReader& reader, int cellIndex, bool
Cell& cell2 = base ? cell.mBase : cell.mModified; Cell& cell2 = base ? cell.mBase : cell.mModified;
CellRef ref; CellRef ref;
ref.mNew = false;
ESM::MovedCellRef mref; ESM::MovedCellRef mref;
bool isDeleted = false; bool isDeleted = false;

@ -421,24 +421,7 @@ void CSVRender::InstanceMode::dropEvent (QDropEvent* event)
CSMWorld::Columns::ColumnId_ReferenceableId), CSMWorld::Columns::ColumnId_ReferenceableId),
QString::fromUtf8 (iter->getId().c_str())); QString::fromUtf8 (iter->getId().c_str()));
std::auto_ptr<CSMWorld::ModifyCommand> incrementCommand; document.getUndoStack().push (createCommand.release());
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());
dropped = true; dropped = true;
} }

@ -26,51 +26,6 @@ void CSVWorld::ReferenceCreator::configureCreateCommand (CSMWorld::CreateCommand
findColumnIndex (CSMWorld::Columns::ColumnId_Cell); findColumnIndex (CSMWorld::Columns::ColumnId_Cell);
command.addValue (cellIdColumn, mCell->text()); 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, CSVWorld::ReferenceCreator::ReferenceCreator (CSMWorld::Data& data, QUndoStack& undoStack,

@ -29,11 +29,6 @@ namespace CSVWorld
virtual void configureCreateCommand (CSMWorld::CreateCommand& command) const; virtual void configureCreateCommand (CSMWorld::CreateCommand& command) const;
virtual void pushCommand (std::auto_ptr<CSMWorld::CreateCommand> command,
const std::string& id);
int getRefNumCount() const;
public: public:
ReferenceCreator (CSMWorld::Data& data, QUndoStack& undoStack, ReferenceCreator (CSMWorld::Data& data, QUndoStack& undoStack,
@ -50,7 +45,7 @@ namespace CSVWorld
/// Focus main input widget /// Focus main input widget
virtual void focus(); virtual void focus();
private slots: private slots:
void cellChanged(); void cellChanged();

Loading…
Cancel
Save