prepare view provider for undo/redo

This commit is contained in:
wmayer 2016-06-20 14:00:47 +02:00
parent 9ec06b47c6
commit 0f2db9061f
4 changed files with 43 additions and 16 deletions

View File

@ -1415,6 +1415,7 @@ void Document::restore (void)
// and then clear everything in one go. // and then clear everything in one go.
for (std::vector<DocumentObject*>::iterator obj = d->objectArray.begin(); obj != d->objectArray.end(); ++obj) { for (std::vector<DocumentObject*>::iterator obj = d->objectArray.begin(); obj != d->objectArray.end(); ++obj) {
signalDeletedObject(*(*obj)); signalDeletedObject(*(*obj));
signalTransactionRemove(*(*obj), 0);
} }
for (std::vector<DocumentObject*>::iterator obj = d->objectArray.begin(); obj != d->objectArray.end(); ++obj) { for (std::vector<DocumentObject*>::iterator obj = d->objectArray.begin(); obj != d->objectArray.end(); ++obj) {
delete *obj; delete *obj;

View File

@ -61,7 +61,7 @@ Transaction::Transaction(int pos)
*/ */
Transaction::~Transaction() Transaction::~Transaction()
{ {
std::map<const TransactionalObject*, TransactionObject*>::iterator It; TransactionList::iterator It;
for (It= _Objects.begin();It!=_Objects.end();++It) { for (It= _Objects.begin();It!=_Objects.end();++It) {
if (It->second->status == TransactionObject::New) { if (It->second->status == TransactionObject::New) {
// If an object has been removed from the document the transaction // If an object has been removed from the document the transaction
@ -105,9 +105,13 @@ int Transaction::getPos(void) const
bool Transaction::hasObject(const TransactionalObject *Obj) const bool Transaction::hasObject(const TransactionalObject *Obj) const
{ {
std::map<const TransactionalObject*, TransactionObject*>::const_iterator it; TransactionList::const_iterator it;
it = _Objects.find(Obj); for (it = _Objects.begin(); it != _Objects.end(); ++it) {
return (it != _Objects.end()); if (it->first == Obj)
return true;
}
return false;
} }
//************************************************************************** //**************************************************************************
@ -116,7 +120,7 @@ bool Transaction::hasObject(const TransactionalObject *Obj) const
void Transaction::apply(Document &Doc, bool forward) void Transaction::apply(Document &Doc, bool forward)
{ {
std::map<const TransactionalObject*, TransactionObject*>::iterator It; TransactionList::iterator It;
//for (It= _Objects.begin();It!=_Objects.end();++It) //for (It= _Objects.begin();It!=_Objects.end();++It)
// It->second->apply(Doc,const_cast<DocumentObject*>(It->first)); // It->second->apply(Doc,const_cast<DocumentObject*>(It->first));
for (It= _Objects.begin();It!=_Objects.end();++It) for (It= _Objects.begin();It!=_Objects.end();++It)
@ -129,7 +133,13 @@ void Transaction::apply(Document &Doc, bool forward)
void Transaction::addObjectNew(TransactionalObject *Obj) void Transaction::addObjectNew(TransactionalObject *Obj)
{ {
std::map<const TransactionalObject*, TransactionObject*>::iterator pos = _Objects.find(Obj); TransactionList::iterator pos = _Objects.end();
for (TransactionList::iterator it = _Objects.begin(); it != _Objects.end(); ++it) {
if (it->first == Obj) {
pos = it;
break;
}
}
if (pos != _Objects.end()) { if (pos != _Objects.end()) {
if (pos->second->status == TransactionObject::Del) { if (pos->second->status == TransactionObject::Del) {
@ -146,13 +156,19 @@ void Transaction::addObjectNew(TransactionalObject *Obj)
TransactionObject *To = TransactionFactory::instance().createTransaction(Obj->getTypeId()); TransactionObject *To = TransactionFactory::instance().createTransaction(Obj->getTypeId());
To->status = TransactionObject::New; To->status = TransactionObject::New;
To->_NameInDocument = Obj->detachFromDocument(); To->_NameInDocument = Obj->detachFromDocument();
_Objects[Obj] = To; _Objects.push_back(std::make_pair(Obj, To));
} }
} }
void Transaction::addObjectDel(const TransactionalObject *Obj) void Transaction::addObjectDel(const TransactionalObject *Obj)
{ {
std::map<const TransactionalObject*, TransactionObject*>::iterator pos = _Objects.find(Obj); TransactionList::iterator pos = _Objects.end();
for (TransactionList::iterator it = _Objects.begin(); it != _Objects.end(); ++it) {
if (it->first == Obj) {
pos = it;
break;
}
}
// is it created in this transaction ? // is it created in this transaction ?
if (pos != _Objects.end() && pos->second->status == TransactionObject::New) { if (pos != _Objects.end() && pos->second->status == TransactionObject::New) {
@ -165,14 +181,21 @@ void Transaction::addObjectDel(const TransactionalObject *Obj)
} }
else { else {
TransactionObject *To = TransactionFactory::instance().createTransaction(Obj->getTypeId()); TransactionObject *To = TransactionFactory::instance().createTransaction(Obj->getTypeId());
_Objects[Obj] = To; _Objects.push_back(std::make_pair(Obj, To));
To->status = TransactionObject::Del; To->status = TransactionObject::Del;
} }
} }
void Transaction::addObjectChange(const TransactionalObject *Obj, const Property *Prop) void Transaction::addObjectChange(const TransactionalObject *Obj, const Property *Prop)
{ {
std::map<const TransactionalObject*, TransactionObject*>::iterator pos = _Objects.find(Obj); TransactionList::iterator pos = _Objects.end();
for (TransactionList::iterator it = _Objects.begin(); it != _Objects.end(); ++it) {
if (it->first == Obj) {
pos = it;
break;
}
}
TransactionObject *To; TransactionObject *To;
if (pos != _Objects.end()) { if (pos != _Objects.end()) {
@ -180,7 +203,7 @@ void Transaction::addObjectChange(const TransactionalObject *Obj, const Property
} }
else { else {
To = TransactionFactory::instance().createTransaction(Obj->getTypeId()); To = TransactionFactory::instance().createTransaction(Obj->getTypeId());
_Objects[Obj] = To; _Objects.push_back(std::make_pair(Obj, To));
To->status = TransactionObject::Chn; To->status = TransactionObject::Chn;
} }

View File

@ -73,7 +73,8 @@ public:
private: private:
int iPos; int iPos;
std::map<const TransactionalObject*, TransactionObject*> _Objects; typedef std::list <std::pair<const TransactionalObject*, TransactionObject*> > TransactionList;
TransactionList _Objects;
}; };
/** Represents an entry for an object in a Transaction /** Represents an entry for an object in a Transaction

View File

@ -94,12 +94,14 @@ const char* ViewProviderDocumentObject::detachFromDocument()
void ViewProviderDocumentObject::onBeforeChange(const App::Property* prop) void ViewProviderDocumentObject::onBeforeChange(const App::Property* prop)
{ {
if (isAttachedToDocument()) {
App::DocumentObject* obj = getObject(); App::DocumentObject* obj = getObject();
App::Document* doc = obj ? obj->getDocument() : 0; App::Document* doc = obj ? obj->getDocument() : 0;
if (doc) { if (doc) {
onBeforeChangeProperty(doc, prop); onBeforeChangeProperty(doc, prop);
} }
} }
}
void ViewProviderDocumentObject::onChanged(const App::Property* prop) void ViewProviderDocumentObject::onChanged(const App::Property* prop)
{ {