@ -139,13 +139,28 @@ void CSMWorld::CommandDispatcher::executeModify (QAbstractItemModel *model, cons
if ( mLocked )
return ;
std : : unique_ptr < CSMWorld : : UpdateCellCommand > modifyCell ;
std : : unique_ptr < CSMWorld : : CloneCommand > clonedData ;
std : : unique_ptr < CSMWorld : : DeleteCommand > deleteData ;
std : : string newId ;
std : : unique_ptr < CSMWorld : : ModifyCommand > modifyDataRefNum ;
std : : unique_ptr < CSMWorld : : ModifyCommand > modifyData ;
std : : unique_ptr < CSMWorld : : UpdateCellCommand > modifyCell ;
int columnId = model - > data ( index , ColumnBase : : Role_ColumnId ) . toInt ( ) ;
if ( columnId = = Columns : : ColumnId_PositionXPos | | columnId = = Columns : : ColumnId_PositionYPos )
int stateColumn = dynamic_cast < CSMWorld : : IdTable & > ( * model ) . findColumnIndex ( Columns : : ColumnId_Modification ) ;
CSMWorld : : IdTable & table = dynamic_cast < CSMWorld : : IdTable & > ( * model ) ; // for getId()
QModelIndex stateIndex = table . getModelIndex ( table . getId ( index . row ( ) ) , stateColumn ) ;
RecordBase : : State state = static_cast < RecordBase : : State > ( model - > data ( stateIndex ) . toInt ( ) ) ;
// This is not guaranteed to be the same as \a model, since a proxy could be used.
IdTable & model2 = dynamic_cast < IdTable & > ( * mDocument . getData ( ) . getTableModel ( mId ) ) ;
// DeleteCommand triggers a signal to the whole row from IdTable::setData(), so ignore the second call
if ( state ! = RecordBase : : State_Deleted & &
( columnId = = Columns : : ColumnId_PositionXPos | | columnId = = Columns : : ColumnId_PositionYPos ) )
{
const float oldPosition = model - > data ( index ) . toFloat ( ) ;
@ -157,12 +172,9 @@ void CSMWorld::CommandDispatcher::executeModify (QAbstractItemModel *model, cons
int row = proxy ? proxy - > mapToSource ( index ) . row ( ) : index . row ( ) ;
// This is not guaranteed to be the same as \a model, since a proxy could be used.
IdTable & model2 = dynamic_cast < IdTable & > ( * mDocument . getData ( ) . getTableModel ( mId ) ) ;
int cellColumn = model2 . searchColumnIndex ( Columns : : ColumnId_Cell ) ;
if ( cellColumn ! = - 1 )
if ( cellColumn ! = - 1 )
{
QModelIndex cellIndex = model2 . index ( row , cellColumn ) ;
@ -170,31 +182,46 @@ void CSMWorld::CommandDispatcher::executeModify (QAbstractItemModel *model, cons
if ( cellId . find ( ' # ' ) ! = std : : string : : npos )
{
// Need to recalculate the cell and (if necessary) clear the instance's refNum
modifyCell. reset ( new UpdateCellCommand ( model2 , row ) ) ;
RefCollection & collection = mDocument . getData ( ) . getReferences ( ) ;
newId = collection . getNewId ( ) ;
// Not sure which model this should be applied to
int refNumColumn = model2 . searchColumnIndex ( Columns : : ColumnId_RefNum ) ;
clonedData . reset ( new CloneCommand ( table ,
table . getId ( row ) ,
newId ,
CSMWorld : : UniversalId : : Type_Reference ) ) ;
if ( refNumColumn ! = - 1 )
modifyDataRefNum . reset ( new ModifyCommand ( * model , model - > index ( row , refNumColumn ) , 0 ) ) ;
deleteData . reset ( new DeleteCommand ( table ,
table . getId ( row ) ,
CSMWorld : : UniversalId : : Type_Reference ) ) ;
}
}
}
}
std : : unique_ptr < CSMWorld : : ModifyCommand > modifyData (
new CSMWorld : : ModifyCommand ( * model , index , new_ ) ) ;
if ( ! clonedData . get ( ) )
{
// DeleteCommand will trigger executeModify after setting the state to State_Deleted
// from CommandDelegate::setModelDataImp() - ignore
if ( state ! = RecordBase : : State_Deleted )
modifyData . reset ( new CSMWorld : : ModifyCommand ( * model , index , new_ ) ) ;
}
if ( modifyCell . get ( ) )
if ( clonedData . get ( ) )
{
CommandMacro macro ( mDocument . getUndoStack ( ) ) ;
macro . push ( modifyData . release ( ) ) ;
macro . push ( modifyCell . release ( ) ) ;
if ( modifyDataRefNum . get ( ) )
macro . push ( modifyDataRefNum . release ( ) ) ;
macro . push ( clonedData . release ( ) ) ;
macro . push ( deleteData . release ( ) ) ;
// cannot do these earlier because newIndex is not available until CloneCommand is executed
QModelIndex newIndex = model2 . getModelIndex ( newId , index . column ( ) ) ;
modifyData . reset ( new CSMWorld : : ModifyCommand ( * model , newIndex , new_ ) ) ;
macro . push ( modifyData . release ( ) ) ;
// once the data is updated update the cell location
modifyCell . reset ( new UpdateCellCommand ( model2 , newIndex . row ( ) ) ) ;
macro . push ( modifyCell . release ( ) ) ;
}
else
else if ( ! clonedData . get ( ) & & modifyData . get ( ) )
mDocument . getUndoStack ( ) . push ( modifyData . release ( ) ) ;
}