]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
0021216: EDF 1483 GEOM,GUI,KERNEL: Degradation of performance of the "publish" and...
authorvsr <vsr@opencascade.com>
Tue, 29 Mar 2011 13:41:53 +0000 (13:41 +0000)
committervsr <vsr@opencascade.com>
Tue, 29 Mar 2011 13:41:53 +0000 (13:41 +0000)
src/LightApp/LightApp_Application.cxx
src/LightApp/LightApp_Application.h
src/SUIT/SUIT_TreeModel.cxx
src/SUIT/SUIT_TreeModel.h
src/SalomeApp/SalomeApp_Study.cxx
src/SalomeApp/SalomeApp_Study.h

index 4b49152d44433329ad9d62047491e6cede6c569b..cf4a79140fac84e51e76b9684285f30882419c55 100644 (file)
@@ -76,7 +76,6 @@
 #include <SUIT_Accel.h>
 #include <SUIT_MessageBox.h>
 #include <SUIT_ViewWindow.h>
-#include <SUIT_TreeModel.h>
 
 #include <Qtx.h>
 #include <QtxToolBar.h>
@@ -1733,6 +1732,7 @@ QWidget* LightApp_Application::createWindow( const int flag )
 
     QString EntryCol = QObject::tr( "ENTRY_COLUMN" );
     SUIT_AbstractModel* treeModel = dynamic_cast<SUIT_AbstractModel*>( ob->model() );
+    treeModel->setSearcher( this );
     treeModel->registerColumn( 0, EntryCol, LightApp_DataObject::EntryId );
     treeModel->setAppropriate( EntryCol, Qtx::Toggled );
 
@@ -3583,3 +3583,9 @@ QString LightApp_Application::browseObjects( const QStringList& theEntryList,
 
   return aResult;
 }
+
+SUIT_DataObject* LightApp_Application::findObject( const QString& id ) const
+{
+  LightApp_Study* study = dynamic_cast<LightApp_Study*>( activeStudy() );
+  return study ? study->findObjectByEntry( id ) : 0;
+}
index e31c342147021a22480fa3921517d1954a5b1381..59dba611ee67581b8e6ffb50f682b20bddc4aee3 100644 (file)
@@ -32,6 +32,7 @@
 #endif // _MSC_VER > 1000
 
 #include "LightApp.h"
+#include <SUIT_TreeModel.h>
 #include <CAM_Application.h>
 
 #include <QPointer>
@@ -64,7 +65,7 @@ class QTimer;
   Description : Application containing only LightApp module
 */
 
-class LIGHTAPP_EXPORT LightApp_Application : public CAM_Application
+class LIGHTAPP_EXPORT LightApp_Application : public CAM_Application, public SUIT_DataSearcher
 {
   Q_OBJECT
 
@@ -163,6 +164,8 @@ public:
                                                      const bool theIsApplyAndClose = true,
                                                      const bool theIsOptimizedBrowsing = false );
 
+  virtual SUIT_DataObject*            findObject( const QString& ) const;
+
 signals:
   void                                studyOpened();
   void                                studySaved();
index c79713e2d01483879308dc8d561b9533cb828f38..2583d8a84cbb69662eee0ed37cab193b53b30b3f 100755 (executable)
@@ -30,7 +30,7 @@
 #include <QApplication>
 #include <QHash>
 
-SUIT_AbstractModel::SUIT_AbstractModel()
+SUIT_AbstractModel::SUIT_AbstractModel() : mySearcher( 0 )
 {
 }
 
@@ -49,9 +49,15 @@ SUIT_AbstractModel::operator const QObject*() const
   return dynamic_cast<const QObject*>( this );
 }
 
+SUIT_DataSearcher* SUIT_AbstractModel::searcher() const
+{
+  return mySearcher;
+}
 
-
-
+void SUIT_AbstractModel::setSearcher( SUIT_DataSearcher* s )
+{
+  mySearcher = s;
+}
 
 
 /*!
@@ -492,23 +498,22 @@ SUIT_TreeModel::~SUIT_TreeModel()
 void SUIT_TreeModel::registerColumn( const int group_id, const QString& name, const int custom_id )
 {
   bool found = false;
-  for( int i=0, n=myColumns.size(); i<n && !found; i++ )
-    if( name==myColumns[i].myName )
-        {
-          myColumns[i].myIds.insert( group_id, custom_id );
-          found = true;
-        }
-  if( !found )
-  {
-        ColumnInfo inf;
-        inf.myName = name;
-        inf.myIds.insert( group_id, custom_id );
-        inf.myAppropriate = Qtx::Shown;
-       inf.myHeaderFlags = Qtx::ShowAll;
-        int n = myColumns.size();
-        myColumns.resize( n+1 );
-        myColumns[n] = inf;
-        reset();
+  for ( int i=0, n=myColumns.size(); i<n && !found; i++ ) {
+    if ( name == myColumns[i].myName ) {
+      myColumns[i].myIds.insert( group_id, custom_id );
+      found = true;
+    }
+  }
+  if ( !found ) {
+    ColumnInfo inf;
+    inf.myName = name;
+    inf.myIds.insert( group_id, custom_id );
+    inf.myAppropriate = Qtx::Shown;
+    inf.myHeaderFlags = Qtx::ShowAll;
+    int n = myColumns.size();
+    myColumns.resize( n+1 );
+    myColumns[n] = inf;
+    reset();
   }
 }
 
@@ -525,17 +530,16 @@ void SUIT_TreeModel::registerColumn( const int group_id, const QString& name, co
  */
 void SUIT_TreeModel::unregisterColumn( const int group_id, const QString& name )
 {
-  for( int i=0, n=myColumns.size(); i<n; i++ )
-    if( myColumns[i].myName==name )
-        {
-          myColumns[i].myIds.remove( group_id );
-          if( myColumns[i].myIds.isEmpty() )
-          {
-            myColumns.remove( i );
-                reset();
-          }
-          break;
+  for ( int i = 0, n = myColumns.size(); i < n; i++ ) {
+    if ( myColumns[i].myName == name ) {
+      myColumns[i].myIds.remove( group_id );
+      if ( myColumns[i].myIds.isEmpty() ) {
+       myColumns.remove( i );
+       reset();
+      }
+      break;
     }
+  }
 }
 
 /*!
@@ -546,12 +550,12 @@ void SUIT_TreeModel::unregisterColumn( const int group_id, const QString& name )
 */
 void SUIT_TreeModel::setColumnIcon( const QString& name, const QPixmap& icon )
 {
-  for( int i=0, n=myColumns.size(); i<n; i++ )
-    if( myColumns[i].myName==name )
-        {
-          myColumns[i].myIcon = icon;
-          break;
-        }
+  for ( int i = 0, n = myColumns.size(); i < n; i++ ) {
+    if ( myColumns[i].myName == name ) {
+      myColumns[i].myIcon = icon;
+      break;
+    }
+  }
 }
 
 /*!
@@ -563,12 +567,12 @@ void SUIT_TreeModel::setColumnIcon( const QString& name, const QPixmap& icon )
 QPixmap SUIT_TreeModel::columnIcon( const QString& name ) const
 {
   QPixmap res;
-  for( int i=0, n=myColumns.size(); i<n; i++ )
-    if( myColumns[i].myName==name )
-        {
-          res = myColumns[i].myIcon;
-          break;
-        }
+  for ( int i = 0, n = myColumns.size(); i < n; i++ ) {
+    if ( myColumns[i].myName == name ) {
+      res = myColumns[i].myIcon;
+      break;
+    }
+  }
   return res;
 }
 
@@ -586,13 +590,13 @@ QPixmap SUIT_TreeModel::columnIcon( const QString& name ) const
 */
 void SUIT_TreeModel::setAppropriate( const QString& name, const Qtx::Appropriate appr )
 {
-  for( int i=0, n=myColumns.size(); i<n; i++ )
-    if( myColumns[i].myName==name && myColumns[i].myAppropriate != appr )
-    {
+  for ( int i = 0, n = myColumns.size(); i < n; i++ ) {
+    if ( myColumns[i].myName == name && myColumns[i].myAppropriate != appr ) {
       myColumns[i].myAppropriate = appr;
       emit headerDataChanged( Qt::Horizontal, i, i );
       break;
     }
+  }
 }
 
 /*!
@@ -608,12 +612,12 @@ void SUIT_TreeModel::setAppropriate( const QString& name, const Qtx::Appropriate
 Qtx::Appropriate SUIT_TreeModel::appropriate( const QString& name ) const
 {
   Qtx::Appropriate appr = Qtx::Shown;
-  for( int i=0, n=myColumns.size(); i<n; i++ )
-    if( myColumns[i].myName==name )
-        {
-          appr = myColumns[i].myAppropriate;
-          break;
-        }
+  for ( int i = 0, n = myColumns.size(); i < n; i++ ) {
+    if ( myColumns[i].myName == name ) {
+      appr = myColumns[i].myAppropriate;
+      break;
+    }
+  }
   return appr;
 }
 
@@ -628,14 +632,15 @@ Qtx::Appropriate SUIT_TreeModel::appropriate( const QString& name ) const
   \param flags - header flags
 
 */
-void SUIT_TreeModel::setHeaderFlags( const QString& name, const Qtx::HeaderViewFlags flags ) {
-  for( int i=0, n=myColumns.size(); i<n; i++ )
-    if( myColumns[i].myName==name && myColumns[i].myHeaderFlags != flags )
-    {
+void SUIT_TreeModel::setHeaderFlags( const QString& name, const Qtx::HeaderViewFlags flags )
+{
+  for ( int i = 0, n = myColumns.size(); i < n; i++ ) {
+    if ( myColumns[i].myName == name && myColumns[i].myHeaderFlags != flags ) {
       myColumns[i].myHeaderFlags = flags;
       emit headerDataChanged( Qt::Horizontal, i, i );
       break;
     }
+  }
 }
 
 /*!
@@ -647,14 +652,15 @@ void SUIT_TreeModel::setHeaderFlags( const QString& name, const Qtx::HeaderViewF
   \param name - column name
   \return header flags
 */
-Qtx::HeaderViewFlags SUIT_TreeModel::headerFlags( const QString& name ) const {
+Qtx::HeaderViewFlags SUIT_TreeModel::headerFlags( const QString& name ) const
+{
   Qtx::HeaderViewFlags flags;
-  for( int i=0, n=myColumns.size(); i<n; i++ )
-    if( myColumns[i].myName==name )
-      {
-       flags = myColumns[i].myHeaderFlags;
-       break;
-      }
+  for ( int i = 0, n = myColumns.size(); i < n; i++ ) {
+    if ( myColumns[i].myName == name ) {
+      flags = myColumns[i].myHeaderFlags;
+      break;
+    }
+  }
   return flags;
 }
 
@@ -664,25 +670,32 @@ Qtx::HeaderViewFlags SUIT_TreeModel::headerFlags( const QString& name ) const {
   \param id - column name
   \param state - visible state
 */
-void SUIT_TreeModel::setVisibilityState(const QString& id, Qtx::VisibilityState state) {
-  if(myVisibilityMap.contains(id) && myVisibilityMap.value(id) == state)
+void SUIT_TreeModel::setVisibilityState( const QString& id, Qtx::VisibilityState state )
+{
+  VisibilityMap::const_iterator it = myVisibilityMap.find( id );
+  if ( it != myVisibilityMap.end() && it.value() == state )
     return;
   
   bool needSignal = false;
-  if(state != Qtx::UnpresentableState) {
-    myVisibilityMap.insert(id, state);
+  if ( state != Qtx::UnpresentableState ) {
+    myVisibilityMap.insert( id, state );
     needSignal = true;
   }
   else {
-    int nb = myVisibilityMap.remove(id);
-    if(nb > 0)
-      needSignal = true;
+    needSignal = myVisibilityMap.remove( id ) > 0;
   }
-  if(needSignal) {
-    QModelIndexList lst = match(index(0,root()->customData(Qtx::IdType).toInt()), DisplayRole, id, 1, Qt::MatchExactly | Qt::MatchRecursive);
-    if(!lst.isEmpty()) {
-      QModelIndex idx = index(lst[0].row(), SUIT_DataObject::VisibilityId ,lst[0].parent());
-      emit dataChanged(idx,idx);
+  if ( needSignal ) {
+    QModelIndexList lst;
+    if ( searcher() ) {
+      SUIT_DataObject* o = searcher()->findObject( id );
+      if ( o ) lst << index( o );
+    }
+    else {
+      lst = match( index( 0, root()->customData( Qtx::IdType ).toInt() ), DisplayRole, id, 1, Qt::MatchExactly | Qt::MatchRecursive );
+    }
+    if ( !lst.isEmpty() ) {
+      QModelIndex idx = index( lst.first().row(), SUIT_DataObject::VisibilityId, lst.first().parent() );
+      emit dataChanged( idx, idx );
     }
   }
 }
@@ -693,23 +706,32 @@ void SUIT_TreeModel::setVisibilityState(const QString& id, Qtx::VisibilityState
   \param id - column name
   \param state - visible state
 */
-void SUIT_TreeModel::setVisibilityStateForAll(Qtx::VisibilityState state) {
-  if(state != Qtx::UnpresentableState) {
+void SUIT_TreeModel::setVisibilityStateForAll( Qtx::VisibilityState state )
+{
+  if ( state != Qtx::UnpresentableState ) {
     VisibilityMap::ConstIterator it = myVisibilityMap.begin();
-    while(it != myVisibilityMap.end() ) {
-      if(it.value() != state)
-       setVisibilityState(it.key(), state);
+    while ( it != myVisibilityMap.end() ) {
+      if ( it.value() != state )
+       setVisibilityState( it.key(), state );
       it++;
     }
-  } else {
+  }
+  else {
     QList<QString> anIds = myVisibilityMap.keys();
     myVisibilityMap.clear();
     QList<QString>::ConstIterator it = anIds.begin();
-    while(it != anIds.end()){
-      QModelIndexList lst = match(index(0,root()->customData(Qtx::IdType).toInt()), DisplayRole, (*it), 1, Qt::MatchExactly | Qt::MatchRecursive);
-      if(!lst.isEmpty()) {
-       QModelIndex idx = index(lst[0].row(), SUIT_DataObject::VisibilityId ,lst[0].parent());
-       emit dataChanged(idx,idx);
+    while ( it != anIds.end() ) {
+      QModelIndexList lst;
+      if ( searcher() ) {
+       SUIT_DataObject* o = searcher()->findObject( *it );
+       if ( o ) lst << index( o );
+      }
+      else {
+       lst = match( index( 0, root()->customData( Qtx::IdType ).toInt() ), DisplayRole, (*it), 1, Qt::MatchExactly | Qt::MatchRecursive );
+      }
+      if ( !lst.isEmpty() ) {
+       QModelIndex idx = index( lst.first().row(), SUIT_DataObject::VisibilityId ,lst.first().parent() );
+       emit dataChanged( idx, idx );
       }
       it++;
     }
@@ -722,11 +744,10 @@ void SUIT_TreeModel::setVisibilityStateForAll(Qtx::VisibilityState state) {
   \param id - column name
   \return visible state
 */
-Qtx::VisibilityState SUIT_TreeModel::visibilityState(const QString& id) const {
-  if(myVisibilityMap.contains(id))
-    return myVisibilityMap.value(id);
-  else 
-    return Qtx::UnpresentableState;
+Qtx::VisibilityState SUIT_TreeModel::visibilityState( const QString& id ) const
+{
+  VisibilityMap::const_iterator it = myVisibilityMap.find( id );
+  return it != myVisibilityMap.end() ? it.value() : Qtx::UnpresentableState;
 }
 
 /*!
@@ -1761,6 +1782,16 @@ bool SUIT_ProxyModel::isSortingEnabled() const
   return mySortingEnabled;
 }
 
+SUIT_DataSearcher* SUIT_ProxyModel::searcher() const
+{
+  return treeModel() ? treeModel()->searcher() : 0;
+}
+
+void SUIT_ProxyModel::setSearcher( SUIT_DataSearcher* s )
+{
+  if ( treeModel() ) treeModel()->setSearcher( s );
+}
+
 /*!
   \brief Get item delegate for the model.
   \return new item delegate
index f47033ff2fccb2cd55170a43609ecba9da5b14b2..b8ad06bf20b8958eff14cc8ba6d66fbb5584503c 100755 (executable)
 class SUIT_DataObject;
 class SUIT_TreeModel;
 
+class SUIT_EXPORT SUIT_DataSearcher
+{
+public:
+  virtual SUIT_DataObject* findObject( const QString& ) const = 0;
+};
+
 class SUIT_EXPORT SUIT_AbstractModel
 {
+  SUIT_DataSearcher* mySearcher;
+
 public:
   SUIT_AbstractModel();
 
@@ -78,8 +86,10 @@ public:
   virtual Qtx::VisibilityState  visibilityState(const QString& id) const = 0;
   virtual void                  setHeaderFlags( const QString& name, const Qtx::HeaderViewFlags flags ) = 0;
   virtual Qtx::HeaderViewFlags  headerFlags( const QString& name ) const = 0;
-  virtual void           emitClicked( SUIT_DataObject* obj, const QModelIndex& index) = 0;
+  virtual void                  emitClicked( SUIT_DataObject* obj, const QModelIndex& index) = 0;
 
+  virtual SUIT_DataSearcher*    searcher() const;
+  virtual void                  setSearcher( SUIT_DataSearcher* );
 };
 
 
@@ -259,6 +269,8 @@ public:
   virtual Qtx::HeaderViewFlags  headerFlags( const QString& name ) const;
   virtual void             emitClicked( SUIT_DataObject* obj, const QModelIndex& index);
 
+  virtual SUIT_DataSearcher*    searcher() const;
+  virtual void                  setSearcher( SUIT_DataSearcher* );
 
   QAbstractItemDelegate* delegate() const;
 
index af95c76eef6d73ab8d0b2e966d804a8eaa88e756..64f0c4173d8d3f090ba2f93de74083840dd122d8 100644 (file)
@@ -52,7 +52,7 @@
 #include <SALOMEconfig.h>
 #include CORBA_SERVER_HEADER(SALOME_Exception)
 
-using namespace std;
+//#define NOTIFY_BY_EVENT
 
 class ObserverEvent : public QEvent
 {
@@ -81,23 +81,33 @@ public:
     fillEntryMap();
   }
   
+  SUIT_DataObject* findObject( const char* theID ) const
+  {
+    EntryMap::const_iterator it = entry2SuitObject.find( theID );
+    return it != entry2SuitObject.end() ? it->second : 0;
+  }
+
   virtual void notifyObserverID(const char* theID, CORBA::Long event)
   {
+#ifdef NOTIFY_BY_EVENT
     QCoreApplication::postEvent(this,new ObserverEvent(theID,event));
+#else
+    notifyObserverID_real(theID,event);
+#endif
   }
 
   virtual bool event(QEvent *event)
   {
     if (event->type() == QEvent::User ) 
-      {
-        //START_TIMING(notify);
-        notifyObserverID_real(static_cast<ObserverEvent *>(event)->_anID.c_str(),static_cast<ObserverEvent *>(event)->_event);
-        //END_TIMING(notify,100);
-      }
+    {
+      //START_TIMING(notify);
+      notifyObserverID_real(static_cast<ObserverEvent *>(event)->_anID.c_str(),static_cast<ObserverEvent *>(event)->_event);
+      //END_TIMING(notify,100);
+    }
     return true;
   }
 
-  void notifyObserverID_real(const char* theID, CORBA::Long event)
+  void notifyObserverID_real(const std::string& theID, long event)
   {
     SalomeApp_DataObject* suit_obj;
     
@@ -111,16 +121,15 @@ public:
           return;
         }
         _PTR(SObject) obj = myStudyDS->FindObjectID( theID );
-        std::string entry_str = theID;
-        int last2Pnt_pos = entry_str.rfind( ":" );
-        std::string parent_id = entry_str.substr( 0, last2Pnt_pos );
-        int tag = atoi( entry_str.substr( last2Pnt_pos+1 ).c_str() );
+        int last2Pnt_pos = theID.rfind( ":" );
+        std::string parent_id = theID.substr( 0, last2Pnt_pos );
+        int tag = atoi( theID.substr( last2Pnt_pos+1 ).c_str() );
       
         if ( parent_id.length() == 3 ) // "0:1" - root item?
         {
           // It's probably a SComponent
           _PTR(SComponent) aSComp = obj->GetFatherComponent();
-          if ( aSComp && !aSComp->IsNull() && aSComp->GetID() == entry_str )
+          if ( aSComp && !aSComp->IsNull() && aSComp->GetID() == theID )
             suit_obj = new SalomeApp_ModuleObject( aSComp );
           else
             suit_obj = new SalomeApp_DataObject( obj );
@@ -153,8 +162,8 @@ public:
             std::string obj_id = parent_id.substr( 4 );
             
             std::string anID;
-            string::size_type debut = 0;
-            string::size_type fin;
+           std::string::size_type debut = 0;
+            std::string::size_type fin;
             SalomeApp_DataObject* anObj = dynamic_cast<SalomeApp_DataObject*>( myStudy->root() );
             while ( 1 )
             {
@@ -226,14 +235,14 @@ public:
           suit_obj = it->second;
         
         /* Define visibility state */
-        if( suit_obj ) {
+       bool isComponent = dynamic_cast<SalomeApp_ModuleObject*>( suit_obj ) != 0;
+        if ( suit_obj && !isComponent ) {
           QString moduleTitle = ((CAM_Application*)myStudy->application())->moduleTitle(suit_obj->componentDataType());
-          if(!moduleTitle.isEmpty()) {
+          if (!moduleTitle.isEmpty()) {
             LightApp_Displayer* aDisplayer = LightApp_Displayer::FindDisplayer(moduleTitle,false);
-            
-            if(aDisplayer && !myStudy->isComponent(theID)) {
-              if(aDisplayer->canBeDisplayed(theID)) {
-                myStudy->setVisibilityState( theID, Qtx::HiddenState );
+            if(aDisplayer) {
+              if(aDisplayer->canBeDisplayed(theID.c_str())) {
+                myStudy->setVisibilityState( theID.c_str(), Qtx::HiddenState );
                 //MESSAGE("Object with entry : "<< theID <<" CAN be displayed !!!");
               } else 
                 MESSAGE("Object with entry : "<< theID <<" CAN'T be displayed !!!");
@@ -887,6 +896,12 @@ void SalomeApp_Study::markAsSavedIn(QString theFileName)
   setIsSaved(true);
 }
 
+LightApp_DataObject* SalomeApp_Study::findObjectByEntry( const QString& theEntry )
+{
+  LightApp_DataObject* o = dynamic_cast<LightApp_DataObject*>( myObserver ? myObserver->findObject( theEntry.toLatin1().constData() ) : 0 );
+  return o;
+}
+
 /*!
   Deletes all references to object
   \param obj - object
index cabef20562f15ad2cf083e5aaee8147e0207ab66..e4436b86bd981c67036851eb25185b0b427e3c14 100644 (file)
@@ -83,6 +83,8 @@ public:
   virtual void        restoreState(int savePoint);
   void                markAsSavedIn(QString theFileName);
 
+  virtual LightApp_DataObject* findObjectByEntry( const QString& theEntry );
+
 protected:
   virtual void        saveModuleData ( QString theModuleName, QStringList theListOfFiles );
   virtual void        openModuleData ( QString theModuleName, QStringList& theListOfFiles );