X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FXGUI%2FXGUI_DataModel.cpp;h=afb0aba04ebb6ce375f7c87fe9ceb85e4d8a4b61;hb=cee771b5b59162bd91aa69a3a737a79b1905d866;hp=a8fa72080920d15d8b8880a517588d140a83e90e;hpb=a7189ce21257b93322dfd68eaf390605f85a8bf6;p=modules%2Fshaper.git diff --git a/src/XGUI/XGUI_DataModel.cpp b/src/XGUI/XGUI_DataModel.cpp index a8fa72080..afb0aba04 100644 --- a/src/XGUI/XGUI_DataModel.cpp +++ b/src/XGUI/XGUI_DataModel.cpp @@ -58,13 +58,14 @@ ModelAPI_Document* getSubDocument(void* theObj) // Constructor ************************************************* -XGUI_DataModel::XGUI_DataModel(QObject* theParent) : ModuleBase_IDocumentDataModel(theParent) +XGUI_DataModel::XGUI_DataModel(QObject* theParent) : QAbstractItemModel(theParent) { myXMLReader.readAll(); 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)); } @@ -87,7 +88,7 @@ void XGUI_DataModel::processEvent(const std::shared_ptr& theMess std::string aObjType; for (aIt = aObjects.begin(); aIt != aObjects.end(); ++aIt) { ObjectPtr aObject = (*aIt); - // We do not show objects which not has to be shown in object browser + // We do not show objects which does not need to be shown in object browser if (!aObject->isInHistory()) continue; @@ -161,20 +162,27 @@ void XGUI_DataModel::processEvent(const std::shared_ptr& theMess if (aDoc == aRootDoc) { // If root objects int aRow = aRootDoc->size(aGroup); if (aGroup == aRootType) { + // Process root folder removeRow(aRow + aNbFolders); + rebuildBranch(aNbFolders, aRow); } else { + // Process root sub-folder int aFolderId = myXMLReader.rootFolderId(aGroup); if (aFolderId != -1) { QModelIndex aFolderIndex = createIndex(aFolderId, 0, -1); removeRow(aRow, aFolderIndex); + //rebuildBranch(0, aRow); } } // Check that some folders could erased QStringList aNotEmptyFolders = listOfShowNotEmptyFolders(); foreach (QString aNotEmptyFolder, aNotEmptyFolders) { - if ((aNotEmptyFolder.toStdString() == aGroup) && (aRootDoc->size(aGroup) == 0)) + if ((aNotEmptyFolder.toStdString() == aGroup) && (aRootDoc->size(aGroup) == 0)) { // Appears first object in folder which can not be shown empty removeRow(myXMLReader.rootFolderId(aGroup)); + //rebuildBranch(0, aNbFolders + aDoc->size(myXMLReader.rootType())); + break; + } } } else { // Remove row for sub-document @@ -185,20 +193,26 @@ void XGUI_DataModel::processEvent(const std::shared_ptr& theMess if (aGroup == aSubType) { // List of objects under document root removeRow(aRow + aNbSubFolders, aDocRoot); + rebuildBranch(aNbSubFolders, aRow, aDocRoot); } else { // List of objects under a folder int aFolderId = folderId(aGroup, aDoc.get()); if (aFolderId != -1) { - removeRow(aRow, createIndex(aFolderId, 0, aDoc.get())); + QModelIndex aFolderRoot = createIndex(aFolderId, 0, aDoc.get()); + removeRow(aRow, aFolderRoot); + //rebuildBranch(0, aRow, aFolderRoot); } } // Check that some folders could disappear QStringList aNotEmptyFolders = listOfShowNotEmptyFolders(false); int aSize = aDoc->size(aGroup); foreach (QString aNotEmptyFolder, aNotEmptyFolders) { - if ((aNotEmptyFolder.toStdString() == aGroup) && (aSize == 0)) + if ((aNotEmptyFolder.toStdString() == aGroup) && (aSize == 0)) { // Appears first object in folder which can not be shown empty removeRow(myXMLReader.subFolderId(aGroup), aDocRoot); + //rebuildBranch(0, aNbSubFolders + aDoc->size(myXMLReader.subType()), aDocRoot); + break; + } } } #ifdef _DEBUG @@ -207,6 +221,19 @@ 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); @@ -214,11 +241,11 @@ void XGUI_DataModel::processEvent(const std::shared_ptr& theMess std::string aGroup = aUpdMsg->group(); QModelIndex aParent; - int aSartId = 0; + int aStartId = 0; if (aDoc == aRootDoc) { // Update a group under root if (aGroup == myXMLReader.rootType()) // Update objects under root - aSartId = foldersCount(); + aStartId = foldersCount(); else // Update objects in folder under root aParent = createIndex(folderId(aGroup), 0, -1); } else { @@ -226,25 +253,26 @@ void XGUI_DataModel::processEvent(const std::shared_ptr& theMess if (aGroup == myXMLReader.subType()) { // Update sub-document root aParent = findDocumentRootIndex(aDoc.get()); - aSartId = foldersCount(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); - // Rebuild all indexes - removeRows(aSartId, aChildNb - aSartId, aParent); - insertRows(aSartId, aChildNb - aSartId, aParent); + rebuildBranch(aStartId, aChildNb - aStartId); } 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); -#ifdef _DEBUG - else - Events_Error::send("Problem with Data Model definition of sub-document"); -#endif + else + // We have got a new document + rebuildDataTree(); +//#ifdef _DEBUG +// else +// Events_Error::send("Problem with Data Model definition of sub-document"); +//#endif } } } @@ -258,7 +286,8 @@ void XGUI_DataModel::clear() //****************************************************** void XGUI_DataModel::rebuildDataTree() { - + beginResetModel(); + endResetModel(); } //****************************************************** @@ -346,13 +375,13 @@ QVariant XGUI_DataModel::data(const QModelIndex& theIndex, int theRole) const case Qt::DecorationRole: return QIcon(myXMLReader.rootFolderIcon(theIndexRow).c_str()); case Qt::ForegroundRole: - if ((flags(theIndex) & Qt::ItemIsEditable) == 0) + if ((theIndex.flags() & Qt::ItemIsEditable) == 0) return QBrush(Qt::lightGray); return ACTIVE_COLOR; } } else { // an object or sub-document if (theRole == Qt::ForegroundRole) { - if ((flags(theIndex) & Qt::ItemIsEditable) == 0) + if ((theIndex.flags() & Qt::ItemIsEditable) == 0) return QBrush(Qt::lightGray); return ACTIVE_COLOR; } @@ -383,15 +412,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)); @@ -881,3 +910,12 @@ int XGUI_DataModel::folderId(std::string theType, ModelAPI_Document* theDoc) } return aRes; } + +//****************************************************** +void XGUI_DataModel::rebuildBranch(int theRow, int theCount, const QModelIndex& theParent) +{ + if (theCount > 0) { + removeRows(theRow, theCount, theParent); + insertRows(theRow, theCount, theParent); + } +}