From 29e92b65cd20fe014dc7d946034cc47e500e21e1 Mon Sep 17 00:00:00 2001 From: vsv Date: Fri, 19 Oct 2018 14:58:03 +0300 Subject: [PATCH] Apply warning icon to folder only in case if it is not expanded --- src/PartSet/PartSet_IconFactory.cpp | 80 ++++++++++++++++++++--------- src/PartSet/PartSet_IconFactory.h | 5 +- src/PartSet/PartSet_Module.cpp | 2 +- src/PartSet/PartSet_Tools.cpp | 26 ++++++++++ src/PartSet/PartSet_Tools.h | 2 + src/PartSet/PartSet_TreeNodes.cpp | 72 +++----------------------- src/PartSet/PartSet_TreeNodes.h | 8 --- src/XGUI/XGUI_ObjectsBrowser.h | 2 +- 8 files changed, 98 insertions(+), 99 deletions(-) diff --git a/src/PartSet/PartSet_IconFactory.cpp b/src/PartSet/PartSet_IconFactory.cpp index da1c13a4a..3aebefefb 100644 --- a/src/PartSet/PartSet_IconFactory.cpp +++ b/src/PartSet/PartSet_IconFactory.cpp @@ -19,6 +19,13 @@ // #include "PartSet_IconFactory.h" +#include "PartSet_Tools.h" +#include "PartSet_Module.h" +#include "XGUI_DataModel.h" + +#include +#include + #include #include @@ -33,7 +40,8 @@ QMap PartSet_IconFactory::myIcons; -PartSet_IconFactory::PartSet_IconFactory():ModuleBase_IconFactory() +PartSet_IconFactory::PartSet_IconFactory(PartSet_Module* theModule) + : ModuleBase_IconFactory(), myModule(theModule) { Events_Loop::loop()->registerListener(this, Events_Loop::eventByName(Config_FeatureMessage::GUI_EVENT())); @@ -42,55 +50,79 @@ PartSet_IconFactory::PartSet_IconFactory():ModuleBase_IconFactory() QIcon PartSet_IconFactory::getIcon(ObjectPtr theObj) { - QIcon anIcon; - if (!theObj.get()) - return anIcon; + return QIcon(); + std::string aGroup = theObj->groupName(); FeaturePtr aFeature = std::dynamic_pointer_cast(theObj); if (aFeature.get()) { std::string aKind = aFeature->getKind(); QString aId(aKind.c_str()); if (!myIcons.contains(aId)) - return anIcon; + return QIcon(); QString anIconString = myIcons[aId]; ModelAPI_ExecState aState = aFeature->data()->execState(); - switch(aState) { - case ModelAPI_StateDone: - case ModelAPI_StateNothing: { - anIcon = loadIcon(anIconString); - } + switch (aState) { + case ModelAPI_StateMustBeUpdated: + return ModuleBase_Tools::composite(":icons/toWork.png", anIconString); + //anIcon = ModuleBase_Tools::lighter(anIconString); break; - case ModelAPI_StateMustBeUpdated: { - anIcon = ModuleBase_Tools::composite(":icons/toWork.png", anIconString); - //anIcon = ModuleBase_Tools::lighter(anIconString); - } + case ModelAPI_StateExecFailed: + return ModuleBase_Tools::composite(":icons/isFailed.png", anIconString); break; - case ModelAPI_StateExecFailed: { - anIcon = ModuleBase_Tools::composite(":icons/isFailed.png", anIconString); - } + case ModelAPI_StateInvalidArgument: + return ModuleBase_Tools::composite(":icons/exec_state_invalid_parameters.png", + anIconString); break; - case ModelAPI_StateInvalidArgument: { - anIcon = ModuleBase_Tools::composite(":icons/exec_state_invalid_parameters.png", - anIconString); - } + default: + return loadIcon(anIconString); break; - default: break; } } //if (theObj->data() && theObj->data()->execState() == ModelAPI_StateMustBeUpdated) // return QIcon(":pictures/constr_object_modified.png"); - std::string aGroup = theObj->groupName(); if (aGroup == ModelAPI_ResultPart::group()) return QIcon(":pictures/part_ico.png"); if (aGroup == ModelAPI_ResultConstruction::group()) return QIcon(":pictures/constr_object.png"); + if (aGroup == ModelAPI_Folder::group()) { + static QString anIconString(":pictures/features_folder.png"); + int aFirst = -1, aLast = -1; + PartSet_Tools::getFirstAndLastIndexInFolder(theObj, aFirst, aLast); + if ((aFirst != -1) && (aLast != -1)) { + int aNbItems = aLast - aFirst + 1; + if (aNbItems) { + XGUI_ObjectsBrowser* aObBrowser = myModule->getWorkshop()->objectBrowser(); + XGUI_DataTree* aTree = aObBrowser->treeView(); + QModelIndex aIndex = aTree->dataModel()->objectIndex(theObj, 0); + if (!aTree->isExpanded(aIndex)) { + DocumentPtr aDoc = theObj->document(); + ObjectPtr aSubObj; + ModelAPI_ExecState aState; + bool aHasWarning = false; + for (int i = aFirst; i < aLast + 1; i++) { + aSubObj = aDoc->object(ModelAPI_Feature::group(), i); + aState = aSubObj->data()->execState(); + if ((aState == ModelAPI_StateExecFailed) || (aState == ModelAPI_StateMustBeUpdated)) { + aHasWarning = true; + break; + } + } + if (aHasWarning) { + return QIcon(ModuleBase_Tools::composite(":icons/hasWarning.png", anIconString)); + } + } + } + } + return loadIcon(anIconString); + } + ResultPtr aResult = std::dynamic_pointer_cast(theObj); if (aResult.get()) { GeomShapePtr aShape = aResult->shape(); @@ -125,7 +157,7 @@ QIcon PartSet_IconFactory::getIcon(ObjectPtr theObj) } } } - return anIcon; + return QIcon(); } void PartSet_IconFactory::processEvent(const std::shared_ptr& theMessage) diff --git a/src/PartSet/PartSet_IconFactory.h b/src/PartSet/PartSet_IconFactory.h index 092754e28..34906ae33 100644 --- a/src/PartSet/PartSet_IconFactory.h +++ b/src/PartSet/PartSet_IconFactory.h @@ -28,6 +28,8 @@ #include +class PartSet_Module; + /**\class PartSet_IconFactory * \ingroup GUI * \brief This is a class is redefined in order to provide @@ -37,7 +39,7 @@ class PARTSET_EXPORT PartSet_IconFactory : public ModuleBase_IconFactory, public { public: /// Constructor - PartSet_IconFactory(); + PartSet_IconFactory(PartSet_Module* theModule); /// Returns Icon for the given object /// \param theObj an object @@ -49,6 +51,7 @@ public: private: static QMap myIcons; + PartSet_Module* myModule; }; #endif \ No newline at end of file diff --git a/src/PartSet/PartSet_Module.cpp b/src/PartSet/PartSet_Module.cpp index aa7b4e383..c6dcfa228 100755 --- a/src/PartSet/PartSet_Module.cpp +++ b/src/PartSet/PartSet_Module.cpp @@ -156,7 +156,7 @@ PartSet_Module::PartSet_Module(ModuleBase_IWorkshop* theWshop) myRoot(0), myIsOperationIsLaunched(false) { - new PartSet_IconFactory(); + new PartSet_IconFactory(this); mySketchMgr = new PartSet_SketcherMgr(this); mySketchReentrantMgr = new PartSet_SketcherReentrantMgr(theWshop); diff --git a/src/PartSet/PartSet_Tools.cpp b/src/PartSet/PartSet_Tools.cpp index 4c77d6c16..7e030c5aa 100755 --- a/src/PartSet/PartSet_Tools.cpp +++ b/src/PartSet/PartSet_Tools.cpp @@ -752,3 +752,29 @@ ResultPtr PartSet_Tools::createFixedByExternalCenter( return ResultPtr(); } + +void PartSet_Tools::getFirstAndLastIndexInFolder(const ObjectPtr& theFolder, + int& theFirst, int& theLast) +{ + DocumentPtr aDoc = theFolder->document(); + FolderPtr aFolder = std::dynamic_pointer_cast(theFolder); + if (!aFolder.get()) + return; + + AttributeReferencePtr aFirstFeatAttr = aFolder->data()->reference(ModelAPI_Folder::FIRST_FEATURE_ID()); + FeaturePtr aFirstFeatureInFolder = ModelAPI_Feature::feature(aFirstFeatAttr->value()); + if (!aFirstFeatureInFolder.get()) { + theFirst = -1; + return; + } + AttributeReferencePtr aLastFeatAttr = + aFolder->data()->reference(ModelAPI_Folder::LAST_FEATURE_ID()); + FeaturePtr aLastFeatureInFolder = ModelAPI_Feature::feature(aLastFeatAttr->value()); + if (!aLastFeatureInFolder.get()) { + theLast = -1; + return; + } + + theFirst = aDoc->index(aFirstFeatureInFolder); + theLast = aDoc->index(aLastFeatureInFolder); +} \ No newline at end of file diff --git a/src/PartSet/PartSet_Tools.h b/src/PartSet/PartSet_Tools.h index b76e1dd44..2e88b022b 100755 --- a/src/PartSet/PartSet_Tools.h +++ b/src/PartSet/PartSet_Tools.h @@ -292,6 +292,8 @@ public: bool theTemporary, FeaturePtr& theCreatedFeature); + + static void getFirstAndLastIndexInFolder(const ObjectPtr& theFolder, int& theFirst, int& theLast); }; #endif diff --git a/src/PartSet/PartSet_TreeNodes.cpp b/src/PartSet/PartSet_TreeNodes.cpp index 08e9e3681..e8acf5f61 100644 --- a/src/PartSet/PartSet_TreeNodes.cpp +++ b/src/PartSet/PartSet_TreeNodes.cpp @@ -19,6 +19,7 @@ // #include "PartSet_TreeNodes.h" +#include "PartSet_Tools.h" #include #include @@ -122,10 +123,7 @@ QVariant PartSet_ObjectNode::data(int theColumn, int theRole) const return QIcon(":pictures/eyeclosed.png"); } case 1: - if (myObject->groupName() == ModelAPI_Folder::group()) - return QIcon(":pictures/features_folder.png"); - else - return ModuleBase_IconFactory::get()->getIcon(myObject); + return ModuleBase_IconFactory::get()->getIcon(myObject); case 2: if (isCurrentFeature(myObject)) return QIcon(":pictures/arrow.png"); @@ -1024,8 +1022,8 @@ QTreeNodesList PartSet_PartRootNode::objectsDeleted(const DocumentPtr& theDoc, ////////////////////////////////////////////////////////////////////////////////// void PartSet_ObjectFolderNode::update() { - int aFirst, aLast; - getFirstAndLastIndex(aFirst, aLast); + int aFirst = -1, aLast = -1; + PartSet_Tools::getFirstAndLastIndexInFolder(myObject, aFirst, aLast); if ((aFirst == -1) || (aLast == -1)) { deleteChildren(); return; @@ -1081,8 +1079,8 @@ void PartSet_ObjectFolderNode::update() QTreeNodesList PartSet_ObjectFolderNode::objectCreated(const QObjectPtrList& theObjects) { QTreeNodesList aResult; - int aFirst, aLast; - getFirstAndLastIndex(aFirst, aLast); + int aFirst = -1, aLast = -1; + PartSet_Tools::getFirstAndLastIndexInFolder(myObject, aFirst, aLast); if ((aFirst == -1) || (aLast == -1)) { return aResult; } @@ -1114,8 +1112,8 @@ QTreeNodesList PartSet_ObjectFolderNode::objectsDeleted(const DocumentPtr& theDo const QString& theGroup) { QTreeNodesList aResult; - int aFirst, aLast; - getFirstAndLastIndex(aFirst, aLast); + int aFirst = -1, aLast = -1; + PartSet_Tools::getFirstAndLastIndexInFolder(myObject, aFirst, aLast); if ((aFirst == -1) || (aLast == -1)) { return aResult; } @@ -1155,60 +1153,6 @@ QTreeNodesList PartSet_ObjectFolderNode::objectsDeleted(const DocumentPtr& theDo return aResult; } -FeaturePtr PartSet_ObjectFolderNode::getFeature(const std::string& theId) const -{ - FolderPtr aFolder = std::dynamic_pointer_cast(myObject); - AttributeReferencePtr aFeatAttr = aFolder->data()->reference(theId); - if (aFeatAttr) - return ModelAPI_Feature::feature(aFeatAttr->value()); - return FeaturePtr(); -} - -void PartSet_ObjectFolderNode::getFirstAndLastIndex(int& theFirst, int& theLast) const -{ - DocumentPtr aDoc = myObject->document(); - FolderPtr aFolder = std::dynamic_pointer_cast(myObject); - - FeaturePtr aFirstFeatureInFolder = getFeature(ModelAPI_Folder::FIRST_FEATURE_ID()); - if (!aFirstFeatureInFolder.get()) { - theFirst = -1; - return; - } - FeaturePtr aLastFeatureInFolder = getFeature(ModelAPI_Folder::LAST_FEATURE_ID()); - if (!aLastFeatureInFolder.get()) { - theLast = -1; - return; - } - - theFirst = aDoc->index(aFirstFeatureInFolder); - theLast = aDoc->index(aLastFeatureInFolder); -} - - -QVariant PartSet_ObjectFolderNode::data(int theColumn, int theRole) const -{ - const QImage anAditional(":icons/hasWarning.png"); - - if ((theRole == Qt::DecorationRole) && (theColumn == 1)) { - ObjectPtr aObject; - bool aHasWarning = false; - foreach(ModuleBase_ITreeNode* aNode, myChildren) { - aObject = aNode->object(); - if (aObject.get()) { - ModelAPI_ExecState aState = aObject->data()->execState(); - if ((aState == ModelAPI_StateExecFailed) || (aState == ModelAPI_StateMustBeUpdated)) { - aHasWarning = true; - break; - } - } - } - if (aHasWarning) { - return QIcon(ModuleBase_Tools::composite(":icons/hasWarning.png", - ":pictures/features_folder.png")); - } - } - return PartSet_ObjectNode::data(theColumn, theRole); -} ////////////////////////////////////////////////////////////////////////////////// diff --git a/src/PartSet/PartSet_TreeNodes.h b/src/PartSet/PartSet_TreeNodes.h index 4e37df89c..5961121e9 100644 --- a/src/PartSet/PartSet_TreeNodes.h +++ b/src/PartSet/PartSet_TreeNodes.h @@ -326,14 +326,6 @@ public: /// \param theDoc a document where objects were deleted /// \param theGroup a name of group where objects were deleted virtual QTreeNodesList objectsDeleted(const DocumentPtr& theDoc, const QString& theGroup); - - /// Returns the node representation according to theRole. - virtual QVariant data(int theColumn, int theRole) const; - -private: - FeaturePtr getFeature(const std::string& theId) const; - - void getFirstAndLastIndex(int& theFirst, int& theLast) const; }; diff --git a/src/XGUI/XGUI_ObjectsBrowser.h b/src/XGUI/XGUI_ObjectsBrowser.h index c05073065..e2a457940 100644 --- a/src/XGUI/XGUI_ObjectsBrowser.h +++ b/src/XGUI/XGUI_ObjectsBrowser.h @@ -90,7 +90,7 @@ private: * \ingroup GUI * Implementation of Data Tree object for Object Browser */ -class XGUI_DataTree : public QTreeView +class XGUI_EXPORT XGUI_DataTree : public QTreeView { Q_OBJECT public: -- 2.30.2