Undo for delete operation in referenceables table. Implemented by saving UniversalId::Type in DeleteCommand.

test
cc9cii 10 years ago
parent a6925683c6
commit 8aaa74a983

@ -8,6 +8,7 @@
#include "../doc/document.hpp"
#include "idtable.hpp"
#include "idtree.hpp"
#include "record.hpp"
#include "commands.hpp"
@ -153,7 +154,15 @@ void CSMWorld::CommandDispatcher::executeDelete()
std::string id = model.data (model.getModelIndex (*iter, columnIndex)).
toString().toUtf8().constData();
mDocument.getUndoStack().push (new CSMWorld::DeleteCommand (model, id));
if (mId.getType() == UniversalId::Type_Referenceables)
{
IdTree& tree = dynamic_cast<IdTree&> (*mDocument.getData().getTableModel (mId));
std::pair<int, UniversalId::Type> localIndex = tree.searchId (id);
mDocument.getUndoStack().push (new CSMWorld::DeleteCommand (model, id, localIndex.second));
}
else
mDocument.getUndoStack().push (new CSMWorld::DeleteCommand (model, id));
}
if (rows.size()>1)
@ -219,8 +228,17 @@ void CSMWorld::CommandDispatcher::executeExtendedDelete()
Misc::StringUtils::lowerCase (record.get().mCell)))
continue;
mDocument.getUndoStack().push (
new CSMWorld::DeleteCommand (model, record.get().mId));
if (mId.getType() == UniversalId::Type_Referenceables)
{
IdTree& tree = dynamic_cast<IdTree&> (*mDocument.getData().getTableModel (mId));
std::pair<int, UniversalId::Type> localIndex = tree.searchId (record.get().mId);
mDocument.getUndoStack().push (
new CSMWorld::DeleteCommand (model, record.get().mId, localIndex.second));
}
else
mDocument.getUndoStack().push (
new CSMWorld::DeleteCommand (model, record.get().mId));
}
}
}

@ -103,8 +103,9 @@ void CSMWorld::RevertCommand::undo()
mModel.setRecord (mId, *mOld);
}
CSMWorld::DeleteCommand::DeleteCommand (IdTable& model, const std::string& id, QUndoCommand* parent)
: QUndoCommand (parent), mModel (model), mId (id), mOld (0)
CSMWorld::DeleteCommand::DeleteCommand (IdTable& model,
const std::string& id, CSMWorld::UniversalId::Type type, QUndoCommand* parent)
: QUndoCommand (parent), mModel (model), mId (id), mOld (0), mType(type)
{
setText (("Delete record " + id).c_str());
@ -135,7 +136,7 @@ void CSMWorld::DeleteCommand::redo()
void CSMWorld::DeleteCommand::undo()
{
mModel.setRecord (mId, *mOld);
mModel.setRecord (mId, *mOld, mType);
}

@ -111,6 +111,7 @@ namespace CSMWorld
IdTable& mModel;
std::string mId;
RecordBase *mOld;
UniversalId::Type mType;
// not implemented
DeleteCommand (const DeleteCommand&);
@ -118,7 +119,8 @@ namespace CSMWorld
public:
DeleteCommand (IdTable& model, const std::string& id, QUndoCommand *parent = 0);
DeleteCommand (IdTable& model, const std::string& id,
UniversalId::Type type = UniversalId::Type_None, QUndoCommand *parent = 0);
virtual ~DeleteCommand();

@ -145,7 +145,7 @@ QModelIndex CSMWorld::IdTable::getModelIndex (const std::string& id, int column)
return index(mIdCollection->getIndex (id), column);
}
void CSMWorld::IdTable::setRecord (const std::string& id, const RecordBase& record)
void CSMWorld::IdTable::setRecord (const std::string& id, const RecordBase& record, CSMWorld::UniversalId::Type type)
{
int index = mIdCollection->searchId (id);
@ -155,7 +155,7 @@ void CSMWorld::IdTable::setRecord (const std::string& id, const RecordBase& reco
beginInsertRows (QModelIndex(), index, index);
mIdCollection->appendRecord (record);
mIdCollection->appendRecord (record, type);
endInsertRows();
}

@ -59,7 +59,8 @@ namespace CSMWorld
virtual QModelIndex getModelIndex (const std::string& id, int column) const;
void setRecord (const std::string& id, const RecordBase& record);
void setRecord (const std::string& id, const RecordBase& record,
UniversalId::Type type = UniversalId::Type_None);
///< Add record or overwrite existing recrod.
const RecordBase& getRecord (const std::string& id) const;

@ -4,6 +4,7 @@
#include "collectionbase.hpp"
#include "nestedcollection.hpp"
#include "refidcollection.hpp" // HACK: for searchId() only
#include "columnbase.hpp"
// NOTE: parent class still needs idCollection
@ -257,3 +258,9 @@ CSMWorld::NestedTableWrapperBase* CSMWorld::IdTree::nestedTable(const QModelInde
return mNestedCollection->nestedTable(index.row(), index.column());
}
// HACK: to get the UniversalId::Type associated with a particular record
std::pair<int, CSMWorld::UniversalId::Type> CSMWorld::IdTree::searchId (const std::string& id) const
{
return dynamic_cast<CSMWorld::RefIdCollection*>(idCollection())->getDataSet().searchId(id);
}

@ -73,6 +73,8 @@ namespace CSMWorld
virtual bool hasChildren (const QModelIndex& index) const;
std::pair<int, UniversalId::Type> searchId (const std::string& id) const;
signals:
void resetStart(const QString& id);

Loading…
Cancel
Save