X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_DocumentDataModel.cpp;h=1ed348e1c3d0d3c2347661c529b9582b96de8122;hb=fc2acc7bd36f7bff6ec1f5095bf7c44be15e2574;hp=291c193e8ad64576d7320ee7ed931395f6c9829b;hpb=15822811a0c323a95d1a6ac80fcbe3481988b4f0;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_DocumentDataModel.cpp b/src/XGUI/XGUI_DocumentDataModel.cpp index 291c193e8..1ed348e1c 100644 --- a/src/XGUI/XGUI_DocumentDataModel.cpp +++ b/src/XGUI/XGUI_DocumentDataModel.cpp @@ -29,9 +29,10 @@ XGUI_DocumentDataModel::XGUI_DocumentDataModel(QObject* theParent) myActivePart(0) { // Register in event loop - Events_Loop::loop()->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_CREATED)); - Events_Loop::loop()->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_UPDATED)); - Events_Loop::loop()->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_DELETED)); + //Events_Loop* aLoop = Events_Loop::loop(); + //aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_CREATED)); + //aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_UPDATED)); + //aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_DELETED)); // Create a top part of data tree model myModel = new XGUI_TopDataModel(this); @@ -41,22 +42,23 @@ XGUI_DocumentDataModel::XGUI_DocumentDataModel(QObject* theParent) XGUI_DocumentDataModel::~XGUI_DocumentDataModel() { clearModelIndexes(); + clearSubModels(); } -void XGUI_DocumentDataModel::processEvent(const Events_Message* theMessage) +void XGUI_DocumentDataModel::processEvent(const std::shared_ptr& theMessage) { DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument(); // Created object event ******************* if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_CREATED)) { - const ModelAPI_ObjectUpdatedMessage* aUpdMsg = - dynamic_cast(theMessage); + std::shared_ptr aUpdMsg = + std::dynamic_pointer_cast(theMessage); std::set aObjects = aUpdMsg->objects(); std::set::const_iterator aIt; for (aIt = aObjects.begin(); aIt != aObjects.end(); ++aIt) { ObjectPtr aObject = (*aIt); - FeaturePtr aFeature = boost::dynamic_pointer_cast(aObject); + FeaturePtr aFeature = std::dynamic_pointer_cast(aObject); if (aFeature && (!aFeature->isInHistory())) continue; @@ -79,10 +81,9 @@ void XGUI_DocumentDataModel::processEvent(const Events_Message* theMessage) } } else { // if sub-objects of first level nodes XGUI_PartModel* aPartModel = 0; - QList::const_iterator aIt; - for (aIt = myPartModels.constBegin(); aIt != myPartModels.constEnd(); ++aIt) { - if ((*aIt)->hasDocument(aDoc)) { - aPartModel = (*aIt); + foreach (XGUI_PartModel* aPart, myPartModels) { + if (aPart->hasDocument(aDoc)) { + aPartModel = aPart; break; } } @@ -96,8 +97,8 @@ void XGUI_DocumentDataModel::processEvent(const Events_Message* theMessage) } // Deleted object event *********************** } else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_DELETED)) { - const ModelAPI_ObjectDeletedMessage* aUpdMsg = - dynamic_cast(theMessage); + std::shared_ptr aUpdMsg = + std::dynamic_pointer_cast(theMessage); DocumentPtr aDoc = aUpdMsg->document(); std::set aGroups = aUpdMsg->groups(); @@ -107,12 +108,14 @@ void XGUI_DocumentDataModel::processEvent(const Events_Message* theMessage) if (aDoc == aRootDoc) { // If root objects if (aGroup == ModelAPI_ResultPart::group()) { // Update only Parts group int aStart = myPartModels.size() - 1; - removeSubModel(aStart); - removeRow(aStart, partFolderNode()); - if (myActivePart && (!isPartSubModel(myActivePart))) { - myActivePart = 0; - myActivePartIndex = QModelIndex(); - myModel->setItemsColor(ACTIVE_COLOR); + if (aStart >= 0) {// MPV: this could be reproduced on close + removeSubModel(aStart); + removeRow(aStart, partFolderNode()); + if (myActivePart && (!isPartSubModel(myActivePart))) { + myActivePart = 0; + myActivePartIndex = QModelIndex(); + myModel->setItemsColor(ACTIVE_COLOR); + } } } else { // Update top groups (other except parts QModelIndex aIndex = myModel->findGroup(aGroup); @@ -122,10 +125,9 @@ void XGUI_DocumentDataModel::processEvent(const Events_Message* theMessage) } } else { XGUI_PartModel* aPartModel = 0; - QList::const_iterator aIt; - for (aIt = myPartModels.constBegin(); aIt != myPartModels.constEnd(); ++aIt) { - if ((*aIt)->hasDocument(aDoc)) { - aPartModel = (*aIt); + foreach (XGUI_PartModel* aPart, myPartModels) { + if (aPart->hasDocument(aDoc)) { + aPartModel = aPart; break; } } @@ -139,7 +141,7 @@ void XGUI_DocumentDataModel::processEvent(const Events_Message* theMessage) } // Deleted object event *********************** } else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_UPDATED)) { - //const ModelAPI_ObjectUpdatedMessage* aUpdMsg = dynamic_cast(theMessage); + //std::shared_ptr aUpdMsg = std::dynamic_pointer_cast(theMessage); //ObjectPtr aFeature = aUpdMsg->feature(); //DocumentPtr aDoc = aFeature->document(); @@ -202,7 +204,7 @@ QVariant XGUI_DocumentDataModel::data(const QModelIndex& theIndex, int theRole) int aOffset = historyOffset(); DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument(); ObjectPtr aObj = aRootDoc->object(ModelAPI_Feature::group(), theIndex.row() - aOffset); - FeaturePtr aFeature = boost::dynamic_pointer_cast(aObj); + FeaturePtr aFeature = std::dynamic_pointer_cast(aObj); if (!aFeature) return QVariant(); switch (theRole) { @@ -360,12 +362,18 @@ QModelIndex* XGUI_DocumentDataModel::getModelIndex(const QModelIndex& theIndex) void XGUI_DocumentDataModel::clearModelIndexes() { - QList::const_iterator aIt; - for (aIt = myIndexes.constBegin(); aIt != myIndexes.constEnd(); ++aIt) - delete (*aIt); + foreach (QModelIndex* aIndex, myIndexes) + delete aIndex; myIndexes.clear(); } +void XGUI_DocumentDataModel::clearSubModels() +{ + foreach (XGUI_PartModel* aPart, myPartModels) + delete aPart; + myPartModels.clear(); +} + ObjectPtr XGUI_DocumentDataModel::object(const QModelIndex& theIndex) const { if (theIndex.internalId() == PartsFolder) @@ -476,7 +484,7 @@ bool XGUI_DocumentDataModel::activatedIndex(const QModelIndex& theIndex) myActivePart->setItemsColor(ACTIVE_COLOR); myModel->setItemsColor(PASSIVE_COLOR); } else - myModel->setItemsColor(ACTIVE_COLOR); + myModel->setItemsColor(ACTIVE_COLOR); return true; } } @@ -533,7 +541,7 @@ QModelIndex XGUI_DocumentDataModel::objectIndex(const ObjectPtr theObject) const DocumentPtr aDoc = theObject->document(); if (aDoc == aRootDoc) { // This feature belongs to histrory or top model - FeaturePtr aFeature = boost::dynamic_pointer_cast(theObject); + FeaturePtr aFeature = std::dynamic_pointer_cast(theObject); if (aFeature) { int aId; int aNb = aRootDoc->size(ModelAPI_Feature::group()); @@ -569,3 +577,13 @@ QModelIndex XGUI_DocumentDataModel::objectIndex(const ObjectPtr theObject) const } return QModelIndex(); } + + +void XGUI_DocumentDataModel::clear() +{ + clearModelIndexes(); + clearSubModels(); + myActivePart = 0; + myActivePartIndex = QModelIndex(); + myModel->setItemsColor(ACTIVE_COLOR); +}