X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_DataModel.cpp;h=35ffdc34db0c641999677dd1245ad24aa86fa7a8;hb=a0677c5ef0e56b38aa8517caa23d1e94313252e3;hp=3e7b0e7967c38f7e2e2127e5d4dfd97429daeda1;hpb=66d913fb8f4a0b7764fbb79a4139785db4b3b346;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_DataModel.cpp b/src/XGUI/XGUI_DataModel.cpp index 3e7b0e796..35ffdc34d 100644 --- a/src/XGUI/XGUI_DataModel.cpp +++ b/src/XGUI/XGUI_DataModel.cpp @@ -22,12 +22,11 @@ #include #include -#include #include #include -#define ACTIVE_COLOR Qt::black +#define ACTIVE_COLOR QColor(Qt::black) //#define ACTIVE_COLOR QColor(0,72,140) //#define PASSIVE_COLOR Qt::black @@ -63,7 +62,8 @@ ModelAPI_Document* getSubDocument(void* theObj) // Constructor ************************************************* -XGUI_DataModel::XGUI_DataModel(QObject* theParent) : QAbstractItemModel(theParent) +XGUI_DataModel::XGUI_DataModel(QObject* theParent) : QAbstractItemModel(theParent)//, + //myIsEventsProcessingBlocked(false) { Events_Loop* aLoop = Events_Loop::loop(); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_CREATED)); @@ -80,6 +80,8 @@ XGUI_DataModel::~XGUI_DataModel() //****************************************************** void XGUI_DataModel::processEvent(const std::shared_ptr& theMessage) { + //if (myIsEventsProcessingBlocked) + // return; DocumentPtr aRootDoc = ModelAPI_Session::get()->moduleDocument(); std::string aRootType = myXMLReader->rootType(); std::string aSubType = myXMLReader->subType(); @@ -117,9 +119,9 @@ void XGUI_DataModel::processEvent(const std::shared_ptr& theMess } else { int aFolderId = myXMLReader->rootFolderId(aObjType); if (aFolderId != -1) { - insertRow(aRow, createIndex(aFolderId, 0, -1)); + insertRow(aRow, createIndex(aFolderId, 0, (void*)Q_NULLPTR)); } - } + } } } else { // Object created in sub-document @@ -150,11 +152,10 @@ void XGUI_DataModel::processEvent(const std::shared_ptr& theMess } } } - } -#ifdef _DEBUG - else - Events_Error::send("Problem with Data Model definition of sub-document"); -#endif + } else { + rebuildDataTree(); + break; + } } } // Deleted object event *********************** @@ -162,8 +163,21 @@ void XGUI_DataModel::processEvent(const std::shared_ptr& theMess std::shared_ptr aUpdMsg = std::dynamic_pointer_cast(theMessage); DocumentPtr aDoc = aUpdMsg->document(); - std::set aGroups = aUpdMsg->groups(); - std::set::const_iterator aIt; + std::set aMsgGroups = aUpdMsg->groups(); + + /// Sort groups because RootType deletion has to be done after others + std::string aType = (aDoc == aRootDoc)? aRootType : aSubType; + std::list aGroups; + std::set::const_iterator aSetIt; + for (aSetIt = aMsgGroups.begin(); aSetIt != aMsgGroups.end(); ++aSetIt) { + std::string aGroup = (*aSetIt); + if (aGroup == aType) + aGroups.push_back(aGroup); + else + aGroups.push_front(aGroup); + } + + std::list::const_iterator aIt; for (aIt = aGroups.begin(); aIt != aGroups.end(); ++aIt) { std::string aGroup = (*aIt); if (aDoc == aRootDoc) { // If root objects @@ -176,7 +190,7 @@ void XGUI_DataModel::processEvent(const std::shared_ptr& theMess // Process root sub-folder int aFolderId = myXMLReader->rootFolderId(aGroup); if (aFolderId != -1) { - QModelIndex aFolderIndex = createIndex(aFolderId, 0, -1); + QModelIndex aFolderIndex = createIndex(aFolderId, 0, (void*)Q_NULLPTR); removeRow(aRow, aFolderIndex); //rebuildBranch(0, aRow); } @@ -221,6 +235,9 @@ void XGUI_DataModel::processEvent(const std::shared_ptr& theMess break; } } + } else { + rebuildDataTree(); + break; } } } @@ -233,51 +250,57 @@ void XGUI_DataModel::processEvent(const std::shared_ptr& theMess std::string aObjType; for (aIt = aObjects.begin(); aIt != aObjects.end(); ++aIt) { ObjectPtr aObject = (*aIt); - QModelIndex aIndex = objectIndex(aObject); - if (aIndex.isValid()) - emit dataChanged(aIndex, aIndex); + if (aObject->data()->isValid()) { + QModelIndex aIndex = objectIndex(aObject); + if (aIndex.isValid()) { + emit dataChanged(aIndex, aIndex); + } + } else { + rebuildDataTree(); + break; + } } } else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_ORDER_UPDATED)) { std::shared_ptr aUpdMsg = std::dynamic_pointer_cast(theMessage); - DocumentPtr aDoc = aUpdMsg->document(); - std::string aGroup = aUpdMsg->group(); - - QModelIndex aParent; - int aStartId = 0; - if (aDoc == aRootDoc) { - // Update a group under root - if (aGroup == myXMLReader->rootType()) // Update objects under root - aStartId = foldersCount(); - else // Update objects in folder under root - aParent = createIndex(folderId(aGroup), 0, -1); + if (aUpdMsg->reordered().get()) { + DocumentPtr aDoc = aUpdMsg->reordered()->document(); + std::string aGroup = aUpdMsg->reordered()->group(); + + QModelIndex aParent; + int aStartId = 0; + if (aDoc == aRootDoc) { + // Update a group under root + if (aGroup == myXMLReader->rootType()) // Update objects under root + aStartId = foldersCount(); + else // Update objects in folder under root + aParent = createIndex(folderId(aGroup), 0, (void*)Q_NULLPTR); + } else { + // Update a sub-document + if (aGroup == myXMLReader->subType()) { + // Update sub-document root + aParent = findDocumentRootIndex(aDoc.get()); + aStartId = foldersCount(aDoc.get()); + } else + // update folder in sub-document + aParent = createIndex(folderId(aGroup, aDoc.get()), 0, aDoc.get()); + } + int aChildNb = rowCount(aParent); + rebuildBranch(aStartId, aChildNb - aStartId, aParent); } else { - // Update a sub-document - if (aGroup == myXMLReader->subType()) { - // Update sub-document root - aParent = findDocumentRootIndex(aDoc.get()); - aStartId = foldersCount(aDoc.get()); - } else - // update folder in sub-document - aParent = createIndex(folderId(aGroup, aDoc.get()), 0, aDoc.get()); + rebuildDataTree(); } - int aChildNb = rowCount(aParent); - rebuildBranch(aStartId, aChildNb - aStartId, aParent); } else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_DOCUMENT_CHANGED)) { DocumentPtr aDoc = ModelAPI_Session::get()->activeDocument(); if (aDoc != aRootDoc) { QModelIndex aDocRoot = findDocumentRootIndex(aDoc.get()); if (aDocRoot.isValid()) emit dataChanged(aDocRoot, aDocRoot); - else + else // We have got a new document rebuildDataTree(); -//#ifdef _DEBUG -// else -// Events_Error::send("Problem with Data Model definition of sub-document"); -//#endif } - } + } } //****************************************************** @@ -291,12 +314,13 @@ void XGUI_DataModel::rebuildDataTree() { beginResetModel(); endResetModel(); + emit treeRebuilt(); } //****************************************************** ObjectPtr XGUI_DataModel::object(const QModelIndex& theIndex) const { - if (theIndex.internalId() < 0) // this is a folder + if (theIndex.internalId() == 0) // this is a folder return ObjectPtr(); ModelAPI_Object* aObj = (ModelAPI_Object*)theIndex.internalPointer(); if (getSubDocument(aObj)) // the selected index is a folder of sub-document @@ -340,15 +364,15 @@ QModelIndex XGUI_DataModel::objectIndex(const ObjectPtr theObject) const } if (aRow == -1) return QModelIndex(); - else + else return createIndex(aRow, 0, theObject.get()); } SessionPtr aSession = ModelAPI_Session::get(); DocumentPtr aRootDoc = aSession->moduleDocument(); - if (aDoc == aRootDoc && myXMLReader->rootType() == aType) { + if (aDoc == aRootDoc && myXMLReader->rootType() == aType) { // The object from root document aRow += foldersCount(); - } else if (myXMLReader->subType() == aType) { + } else if (myXMLReader->subType() == aType) { // The object from sub document aRow += foldersCount(aDoc.get()); } @@ -369,11 +393,11 @@ QVariant XGUI_DataModel::data(const QModelIndex& theIndex, int theRole) const if (theIndex.column() == 1) return QVariant(); - int aParentId = theIndex.internalId(); - if (aParentId == -1) { // root folders + quintptr aParentId = theIndex.internalId(); + if (aParentId == 0) { // root folders switch (theRole) { case Qt::DisplayRole: - return QString(myXMLReader->rootFolderName(theIndexRow).c_str()) + + return QString(myXMLReader->rootFolderName(theIndexRow).c_str()) + QString(" (%1)").arg(rowCount(theIndex)); case Qt::DecorationRole: return QIcon(myXMLReader->rootFolderIcon(theIndexRow).c_str()); @@ -401,15 +425,16 @@ QVariant XGUI_DataModel::data(const QModelIndex& theIndex, int theRole) const if (aSubDoc) { // this is a folder of sub document QIntList aMissedIdx = missedFolderIndexes(aSubDoc); int aRow = theIndexRow; - while (aMissedIdx.contains(aRow)) + while (aMissedIdx.contains(aRow)) aRow++; - - switch (theRole) { - case Qt::DisplayRole: - return QString(myXMLReader->subFolderName(aRow).c_str()) + - QString(" (%1)").arg(rowCount(theIndex)); - case Qt::DecorationRole: - return QIcon(myXMLReader->subFolderIcon(aRow).c_str()); + if (aRow < myXMLReader->subFoldersNumber()) { + switch (theRole) { + case Qt::DisplayRole: + return QString(myXMLReader->subFolderName(aRow).c_str()) + + QString(" (%1)").arg(rowCount(theIndex)); + case Qt::DecorationRole: + return QIcon(myXMLReader->subFolderIcon(aRow).c_str()); + } } } else { ModelAPI_Object* aObj = (ModelAPI_Object*)theIndex.internalPointer(); @@ -418,7 +443,8 @@ QVariant XGUI_DataModel::data(const QModelIndex& theIndex, int theRole) const { if (aObj->groupName() == ModelAPI_ResultParameter::group()) { ModelAPI_ResultParameter* aParam = dynamic_cast(aObj); - AttributeDoublePtr aValueAttribute = aParam->data()->real(ModelAPI_ResultParameter::VALUE()); + AttributeDoublePtr aValueAttribute = + aParam->data()->real(ModelAPI_ResultParameter::VALUE()); QString aVal = QString::number(aValueAttribute->value()); QString aTitle = QString(aObj->data()->name().c_str()); return aTitle + " = " + aVal; @@ -465,8 +491,8 @@ int XGUI_DataModel::rowCount(const QModelIndex& theParent) const return aNbFolders + aNbItems; } - int aId = theParent.internalId(); - if (aId == -1) { + quintptr aId = theParent.internalId(); + if (aId == 0) { // this is a folder under root int aParentPos = theParent.row(); std::string aType = myXMLReader->rootFolderType(aParentPos); @@ -474,14 +500,16 @@ int XGUI_DataModel::rowCount(const QModelIndex& theParent) const } else { // It is an object which could have children ModelAPI_Document* aDoc = getSubDocument(theParent.internalPointer()); - if (aDoc) { + if (aDoc) { // a folder of sub-document QIntList aMissedIdx = missedFolderIndexes(aDoc); int aRow = theParent.row(); - while (aMissedIdx.contains(aRow)) + while (aMissedIdx.contains(aRow)) aRow++; - std::string aType = myXMLReader->subFolderType(aRow); - return aDoc->size(aType); + if (aRow < myXMLReader->subFoldersNumber()) { + std::string aType = myXMLReader->subFolderType(aRow); + return aDoc->size(aType); + } } else { ModelAPI_Object* aObj = (ModelAPI_Object*)theParent.internalPointer(); // Check for Part feature @@ -500,10 +528,10 @@ int XGUI_DataModel::rowCount(const QModelIndex& theParent) const } else { // Check for composite object ModelAPI_CompositeFeature* aCompFeature = dynamic_cast(aObj); - if (aCompFeature) + if (aCompFeature) return aCompFeature->numberOfSubs(true); ModelAPI_ResultCompSolid* aCompRes = dynamic_cast(aObj); - if (aCompRes) + if (aCompRes) return aCompRes->numberOfSubs(true); } } @@ -528,7 +556,7 @@ QModelIndex XGUI_DataModel::index(int theRow, int theColumn, const QModelIndex & if (!theParent.isValid()) { if (theRow < aNbFolders) // Return first level folder index - return createIndex(theRow, theColumn, -1); + return createIndex(theRow, theColumn, (void*)Q_NULLPTR); else { // return object under root index std::string aType = myXMLReader->rootType(); int aObjId = theRow - aNbFolders; @@ -538,9 +566,9 @@ QModelIndex XGUI_DataModel::index(int theRow, int theColumn, const QModelIndex & } } } else { - int aId = theParent.internalId(); + quintptr aId = theParent.internalId(); int aParentPos = theParent.row(); - if (aId == -1) { // return object index inside of first level of folders + if (aId == 0) { // return object index inside of first level of folders std::string aType = myXMLReader->rootFolderType(aParentPos); if (theRow < aRootDoc->size(aType)) { ObjectPtr aObj = aRootDoc->object(aType, theRow); @@ -549,16 +577,18 @@ QModelIndex XGUI_DataModel::index(int theRow, int theColumn, const QModelIndex & } else { // It is an object which could have children ModelAPI_Document* aDoc = getSubDocument(theParent.internalPointer()); - if (aDoc) { + if (aDoc) { // It is a folder of sub-document int aParentRow = aParentPos; QIntList aMissedIdx = missedFolderIndexes(aDoc); while (aMissedIdx.contains(aParentRow)) aParentRow++; - std::string aType = myXMLReader->subFolderType(aParentRow); - if (theRow < aDoc->size(aType)) { - ObjectPtr aObj = aDoc->object(aType, theRow); - aIndex = objectIndex(aObj); + if (aParentRow < myXMLReader->subFoldersNumber()) { + std::string aType = myXMLReader->subFolderType(aParentRow); + if (theRow < aDoc->size(aType)) { + ObjectPtr aObj = aDoc->object(aType, theRow); + aIndex = objectIndex(aObj); + } } } else { ModelAPI_Object* aParentObj = (ModelAPI_Object*)theParent.internalPointer(); @@ -578,12 +608,14 @@ QModelIndex XGUI_DataModel::index(int theRow, int theColumn, const QModelIndex & } } else { // Check for composite object - ModelAPI_CompositeFeature* aCompFeature = dynamic_cast(aParentObj); + ModelAPI_CompositeFeature* aCompFeature = + dynamic_cast(aParentObj); if (aCompFeature) { aIndex = objectIndex(aCompFeature->subFeature(theRow)); } else { - ModelAPI_ResultCompSolid* aCompRes = dynamic_cast(aParentObj); - if (aCompRes) + ModelAPI_ResultCompSolid* aCompRes = + dynamic_cast(aParentObj); + if (aCompRes) aIndex = objectIndex(aCompRes->subResult(theRow)); } } @@ -599,14 +631,16 @@ QModelIndex XGUI_DataModel::index(int theRow, int theColumn, const QModelIndex & static QModelIndex MYLastDeleted; QModelIndex XGUI_DataModel::parent(const QModelIndex& theIndex) const { + if (!theIndex.isValid()) + return QModelIndex(); // To avoid additional request about index which was already deleted if (theIndex == MYLastDeleted) return QModelIndex(); - int aId = theIndex.internalId(); - if (aId != -1) { // The object is not a root folder + quintptr aId = theIndex.internalId(); + if (aId != 0) { // The object is not a root folder ModelAPI_Document* aDoc = getSubDocument(theIndex.internalPointer()); - if (aDoc) { + if (aDoc) { // It is a folder of sub-document return findDocumentRootIndex(aDoc); } @@ -644,19 +678,19 @@ QModelIndex XGUI_DataModel::parent(const QModelIndex& theIndex) const // return first level of folder index int aFolderId = myXMLReader->rootFolderId(aType); // Items in a one row must have the same parent - return createIndex(aFolderId, 0, -1); + return createIndex(aFolderId, 0, (void*)Q_NULLPTR); } } else { if (aType == myXMLReader->subType()) return findDocumentRootIndex(aSubDoc.get()); else { // return first level of folder index - int aFolderId = myXMLReader->subFolderId(aType); + int aFolderId = folderId(aType, aSubDoc.get()); // Items in a one row must have the same parent return createIndex(aFolderId, 0, aSubDoc.get()); } } - } + } return QModelIndex(); } @@ -686,7 +720,7 @@ bool XGUI_DataModel::removeRows(int theRow, int theCount, const QModelIndex& the //****************************************************** Qt::ItemFlags XGUI_DataModel::flags(const QModelIndex& theIndex) const { - qint64 aIt = theIndex.internalId(); + quintptr aIt = theIndex.internalId(); ModelAPI_Object* aObj = 0; ModelAPI_Document* aDoc = 0; SessionPtr aSession = ModelAPI_Session::get(); @@ -697,7 +731,7 @@ Qt::ItemFlags XGUI_DataModel::flags(const QModelIndex& theIndex) const Qt::ItemFlags aEditingFlag = Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable; - if (aIt == -1) { + if (aIt == 0) { // Folders under root DocumentPtr aRootDoc = aSession->moduleDocument(); if (aRootDoc != aActiveDoc) @@ -710,9 +744,13 @@ Qt::ItemFlags XGUI_DataModel::flags(const QModelIndex& theIndex) const if (aObj) { // An object - if (aObj->isDisabled()) + if (aObj->isDisabled()) return theIndex.column() == 1? Qt::ItemIsSelectable : aNullFlag; - + + if (aSession->moduleDocument() != aObj->document()) + if (aActiveDoc != aObj->document()) + return theIndex.column() == 1? Qt::ItemIsSelectable : aNullFlag; + bool isCompositeSub = false; // An object which is sub-object of a composite object can not be accessible in column 1 if (theIndex.column() == 1) { @@ -720,13 +758,13 @@ Qt::ItemFlags XGUI_DataModel::flags(const QModelIndex& theIndex) const FeaturePtr aFeature = std::dynamic_pointer_cast(aObjPtr); if (aFeature.get()) { CompositeFeaturePtr aCompFea = ModelAPI_Tools::compositeOwner(aFeature); - if (aCompFea.get()) + if (aCompFea.get()) isCompositeSub = true; } else { ResultPtr aResult = std::dynamic_pointer_cast(aObjPtr); if (aResult.get()) { ResultCompSolidPtr aCompRes = ModelAPI_Tools::compSolidOwner(aResult); - if (aCompRes.get()) + if (aCompRes.get()) isCompositeSub = true; } } @@ -796,7 +834,7 @@ QModelIndex XGUI_DataModel::documentRootIndex(DocumentPtr theDoc) const DocumentPtr aRootDoc = aSession->moduleDocument(); if (theDoc == aRootDoc) return QModelIndex(); - else + else return findDocumentRootIndex(theDoc.get()); } @@ -884,13 +922,13 @@ QModelIndex XGUI_DataModel::lastHistoryIndex() const } else { if (aCurDoc == aSession->moduleDocument()) return createIndex(foldersCount() - 1, 1, -1); - else + else return createIndex(foldersCount(aCurDoc.get()) - 1, 1, aCurDoc.get()); } } //****************************************************** -int XGUI_DataModel::folderId(std::string theType, ModelAPI_Document* theDoc) +int XGUI_DataModel::folderId(std::string theType, ModelAPI_Document* theDoc) const { SessionPtr aSession = ModelAPI_Session::get(); ModelAPI_Document* aDoc = theDoc; @@ -930,3 +968,11 @@ void XGUI_DataModel::rebuildBranch(int theRow, int theCount, const QModelIndex& insertRows(theRow, theCount, theParent); } } + +//****************************************************** +//bool XGUI_DataModel::blockEventsProcessing(const bool theState) +//{ +// bool aPreviousState = myIsEventsProcessingBlocked; +// myIsEventsProcessingBlocked = theState; +// return aPreviousState; +//}