X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_DataModel.cpp;h=157c9ed767b82bc8c474735eb6ffee0572928f1d;hb=64fc7e4fdd63997ec7a502b233ef5f88186d5bbb;hp=075317acbae1856c90ecd8dbc3bdf8ac8e672e2a;hpb=0df40de2e7a7abc2a0f13b222c30bdcb26fbda5d;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_DataModel.cpp b/src/XGUI/XGUI_DataModel.cpp index 075317acb..157c9ed76 100644 --- a/src/XGUI/XGUI_DataModel.cpp +++ b/src/XGUI/XGUI_DataModel.cpp @@ -26,7 +26,8 @@ #include #include -#define ACTIVE_COLOR QColor(0,72,140) +#define ACTIVE_COLOR Qt::black +//#define ACTIVE_COLOR QColor(0,72,140) //#define PASSIVE_COLOR Qt::black /// Returns ResultPart object if the given object is a Part feature @@ -64,6 +65,8 @@ XGUI_DataModel::XGUI_DataModel(QObject* theParent) : ModuleBase_IDocumentDataMod Events_Loop* aLoop = Events_Loop::loop(); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_CREATED)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_DELETED)); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_OBJECT_UPDATED)); + aLoop->registerListener(this, Events_Loop::eventByName(EVENT_ORDER_UPDATED)); aLoop->registerListener(this, Events_Loop::eventByName(EVENT_DOCUMENT_CHANGED)); } @@ -101,14 +104,16 @@ void XGUI_DataModel::processEvent(const std::shared_ptr& theMess } // Insert new object int aRow = aRootDoc->size(aObjType) - 1; - if (aObjType == aRootType) { - insertRow(aRow + aNbFolders + 1); - } else { - int aFolderId = myXMLReader.rootFolderId(aObjType); - if (aFolderId != -1) { - insertRow(aRow, createIndex(aFolderId, 0, -1)); - } - } + if (aRow != -1) { + if (aObjType == aRootType) { + insertRow(aRow + aNbFolders + 1); + } else { + int aFolderId = myXMLReader.rootFolderId(aObjType); + if (aFolderId != -1) { + insertRow(aRow, createIndex(aFolderId, 0, -1)); + } + } + } } else { // Object created in sub-document QModelIndex aDocRoot = findDocumentRootIndex(aDoc.get()); @@ -120,17 +125,21 @@ void XGUI_DataModel::processEvent(const std::shared_ptr& theMess // Appears first object in folder which can not be shown empty insertRow(myXMLReader.subFolderId(aObjType), aDocRoot); } - int aRow = aDoc->size(aObjType) - 1; - int aNbSubFolders = foldersCount(aDoc.get()); - if (aObjType == aSubType) { - // List of objects under document root - insertRow(aRow + aNbSubFolders, aDocRoot); - } else { - // List of objects under a folder - if (aRow != -1) { - int aFolderId = myXMLReader.subFolderId(aObjType); - if (aFolderId != -1) { - insertRow(aRow, createIndex(aFolderId, 0, aDoc.get())); + int aRow = aDoc->index(aObject); + if (aRow != -1) { + int aNbSubFolders = foldersCount(aDoc.get()); + if (aObjType == aSubType) { + // List of objects under document root + insertRow(aRow + aNbSubFolders, aDocRoot); + } else { + // List of objects under a folder + if (aRow != -1) { + int aFolderId = folderId(aObjType, aDoc.get()); + if (aFolderId != -1) { + QModelIndex aParentFolder = createIndex(aFolderId, 0, aDoc.get()); + insertRow(aRow, aParentFolder); + emit dataChanged(aParentFolder, aParentFolder); + } } } } @@ -179,15 +188,16 @@ void XGUI_DataModel::processEvent(const std::shared_ptr& theMess removeRow(aRow + aNbSubFolders, aDocRoot); } else { // List of objects under a folder - int aFolderId = myXMLReader.subFolderId(aGroup); + int aFolderId = folderId(aGroup, aDoc.get()); if (aFolderId != -1) { removeRow(aRow, createIndex(aFolderId, 0, aDoc.get())); } } // Check that some folders could disappear QStringList aNotEmptyFolders = listOfShowNotEmptyFolders(false); + int aSize = aDoc->size(aGroup); foreach (QString aNotEmptyFolder, aNotEmptyFolders) { - if ((aNotEmptyFolder.toStdString() == aGroup) && (aDoc->size(aGroup) == 1)) + if ((aNotEmptyFolder.toStdString() == aGroup) && (aSize == 0)) // Appears first object in folder which can not be shown empty removeRow(myXMLReader.subFolderId(aGroup), aDocRoot); } @@ -198,6 +208,47 @@ void XGUI_DataModel::processEvent(const std::shared_ptr& theMess #endif } } + } else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_OBJECT_UPDATED)) { + std::shared_ptr aUpdMsg = + std::dynamic_pointer_cast(theMessage); + std::set aObjects = aUpdMsg->objects(); + + std::set::const_iterator aIt; + 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); + } + } 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 aSartId = 0; + if (aDoc == aRootDoc) { + // Update a group under root + if (aGroup == myXMLReader.rootType()) // Update objects under root + aSartId = foldersCount(); + else // Update objects in folder under root + aParent = createIndex(folderId(aGroup), 0, -1); + } else { + // Update a sub-document + if (aGroup == myXMLReader.subType()) { + // Update sub-document root + aParent = findDocumentRootIndex(aDoc.get()); + aSartId = foldersCount(aDoc.get()); + } else + // update folder in sub-document + aParent = createIndex(folderId(aGroup, aDoc.get()), 0, aDoc.get()); + } + int aChildNb = rowCount(aParent); + // Rebuild all indexes + removeRows(aSartId, aChildNb - aSartId, aParent); + insertRows(aSartId, aChildNb - aSartId, aParent); } else if (theMessage->eventID() == Events_Loop::loop()->eventByName(EVENT_DOCUMENT_CHANGED)) { DocumentPtr aDoc = ModelAPI_Session::get()->activeDocument(); if (aDoc != aRootDoc) { @@ -346,15 +397,15 @@ QVariant XGUI_DataModel::data(const QModelIndex& theIndex, int theRole) const QString aTitle = QString(aObj->data()->name().c_str()); return aTitle + " = " + aVal; } - QString aPrefix; + QString aSuffix; if (aObj->groupName() == myXMLReader.subType()) { ResultPartPtr aPartRes = getPartResult(aObj); if (aPartRes.get()) { if (aPartRes->partDoc().get() == NULL) - aPrefix = "Not loaded "; + aSuffix = " (Not loaded)"; } } - return aPrefix + aObj->data()->name().c_str(); + return aObj->data()->name().c_str() + aSuffix; } case Qt::DecorationRole: return ModuleBase_IconFactory::get()->getIcon(object(theIndex)); @@ -474,7 +525,11 @@ QModelIndex XGUI_DataModel::index(int theRow, int theColumn, const QModelIndex & ModelAPI_Document* aDoc = getSubDocument(theParent.internalPointer()); if (aDoc) { // It is a folder of sub-document - std::string aType = myXMLReader.subFolderType(aParentPos); + 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); @@ -806,4 +861,37 @@ QModelIndex XGUI_DataModel::lastHistoryIndex() const else return createIndex(foldersCount(aCurDoc.get()) - 1, 1, aCurDoc.get()); } -} \ No newline at end of file +} + +//****************************************************** +int XGUI_DataModel::folderId(std::string theType, ModelAPI_Document* theDoc) +{ + SessionPtr aSession = ModelAPI_Session::get(); + ModelAPI_Document* aDoc = theDoc; + if (aDoc == 0) + aDoc = aSession->moduleDocument().get(); + + bool aUseSubDoc = (aDoc != aSession->moduleDocument().get()); + + int aRes = -1; + if (aUseSubDoc) { + int aId = myXMLReader.subFolderId(theType); + aRes = aId; + for (int i = 0; i < aId; i++) { + if (!myXMLReader.subShowEmpty(i)) { + if (aDoc->size(myXMLReader.subFolderType(i)) == 0) + aRes--; + } + } + } else { + int aId = myXMLReader.rootFolderId(theType); + aRes = aId; + for (int i = 0; i < aId; i++) { + if (!myXMLReader.rootShowEmpty(i)) { + if (aDoc->size(myXMLReader.rootFolderType(i)) == 0) + aRes--; + } + } + } + return aRes; +}