]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
Bug fix for IPAL18646
authorstv <stv@opencascade.com>
Tue, 5 Feb 2008 10:43:59 +0000 (10:43 +0000)
committerstv <stv@opencascade.com>
Tue, 5 Feb 2008 10:43:59 +0000 (10:43 +0000)
src/LightApp/LightApp_Application.cxx
src/Qtx/Qtx.cxx
src/Qtx/Qtx.h
src/Qtx/QtxDockWidget.cxx

index af93f023e45a11d5d52faf71b4cc64ed58eb8705..6b7947f2c7805a634e7cdd42cb01ca7ae0473b66 100644 (file)
@@ -2290,10 +2290,16 @@ void LightApp_Application::updateWindows()
   for ( WinMap::ConstIterator it = myWin.begin(); it != myWin.end(); ++it )
   {
     QWidget* wid = it.value();
-    wid->setVisible( activeStudy() && winMap.contains( it.key() ) );
+    if ( activeStudy() )
+      wid->setVisible( winMap.contains( it.key() ) );
+    else
+      delete wid;
   }
 
-  loadDockWindowsState();
+  if ( activeStudy() )
+    loadDockWindowsState();
+  else
+    myWin.clear();
 }
 
 /*!
@@ -2313,6 +2319,9 @@ void LightApp_Application::updateViewManagers()
 */
 void LightApp_Application::loadDockWindowsState()
 {
+  if ( !desktop() )
+    return;
+
   bool store = resourceMgr()->booleanValue( "Study", "store_positions", true );
   if( !store )
     return;
@@ -2334,6 +2343,11 @@ void LightApp_Application::loadDockWindowsState()
   for ( QList<QToolBar*>::iterator tit = tbList.begin(); tit != tbList.end(); ++tit )
   {
     QToolBar* tb = *tit;
+
+    QObject* po = Qtx::findParent( tb, "QMainWindow" );
+    if ( po != desktop() )
+      continue;
+
     if ( tbMap.contains( tb->objectName() ) )
       tb->setVisible( tbMap[tb->objectName()] );
   }
@@ -2342,6 +2356,11 @@ void LightApp_Application::loadDockWindowsState()
   for ( QList<QDockWidget*>::iterator dit = dwList.begin(); dit != dwList.end(); ++dit )
   {
     QDockWidget* dw = *dit;
+
+    QObject* po = Qtx::findParent( dw, "QMainWindow" );
+    if ( po != desktop() )
+      continue;
+
     if ( dwMap.contains( dw->objectName() ) )
       dw->setVisible( dwMap[dw->objectName()] );
   }
@@ -2352,6 +2371,9 @@ void LightApp_Application::loadDockWindowsState()
 */
 void LightApp_Application::saveDockWindowsState()
 {
+  if ( !desktop() )
+    return;
+
   bool store = resourceMgr()->booleanValue( "Study", "store_positions", true );
   if( !store )
     return;
index a60911fd7262491824ff138ced39147743728070..2a061c64266af0267ea6892ee3d9a95904f7afb9 100755 (executable)
@@ -303,6 +303,33 @@ bool Qtx::isParent( QObject* child, QObject* parent )
   return res;
 }
 
+/*!
+  \brief Find the parent object of class specified by \a className (in terms of QObject).
+
+  \param obj current object
+  \param className class name of the parent
+  \return parent object or null pointer if the parent not found
+*/
+QObject* Qtx::findParent( QObject* obj, const char* className )
+{
+  if ( !obj )
+    return 0;
+
+  if ( !className || !strlen( className ) )
+    return obj->parent();
+
+  QObject* res = 0;
+  QObject* p = obj->parent();
+  while ( p && !res )
+  {
+    if ( p->inherits( className ) )
+      res = p;
+    p = p->parent();
+  }
+
+  return res;
+}
+
 /*!
   \brief Return directory part of the file path.
 
index e13edd2814604fef689c0e4ebfb4cfea64cee8df..49ab74cae69df465d581514502c95fc4f088c62f 100755 (executable)
@@ -108,6 +108,7 @@ public:
   static void        simplifySeparators( QWidget*, const bool = true );
 
   static bool        isParent( QObject*, QObject* );
+  static QObject*    findParent( QObject*, const char* );
 
   static QString     dir( const QString&, const bool = true );
   static QString     file( const QString&, const bool = true );
index fedca585d99e0936dc0c25e3ad77618666ee227c..5c39d9f1ca237b058646f28e2418eaffd575a00a 100644 (file)
@@ -47,6 +47,8 @@ public:
   bool           isVisible() const;
 
 protected:
+  enum { Update = QEvent::User, Remove };
+
   virtual void   customEvent( QEvent* );
 
 private:
@@ -96,7 +98,7 @@ bool QtxDockWidget::Watcher::eventFilter( QObject* o, QEvent* e )
                         e->type() == QEvent::Hide || e->type() == QEvent::HideToParent ) )
   {
     installFilters();
-    QApplication::postEvent( this, new QEvent( QEvent::User ) );
+    QApplication::postEvent( this, new QEvent( (QEvent::Type)Update ) );
   }
 
   if ( o == myCont && e->type() == QEvent::ChildAdded )
@@ -105,7 +107,7 @@ bool QtxDockWidget::Watcher::eventFilter( QObject* o, QEvent* e )
     if ( ce->child()->isWidgetType() )
       ce->child()->installEventFilter( this );
 
-    QApplication::postEvent( this, new QEvent( QEvent::User ) );
+    QApplication::postEvent( this, new QEvent( (QEvent::Type)Update ) );
   }
 
   if ( o != myCont && e->type() == QEvent::WindowIconChange )
@@ -115,10 +117,14 @@ bool QtxDockWidget::Watcher::eventFilter( QObject* o, QEvent* e )
     updateCaption();
 
   if ( ( o != myCont && ( e->type() == QEvent::Hide || e->type() == QEvent::HideToParent ) ) ||
-       ( o == myCont && ( e->type() == QEvent::ChildRemoved ) ) ||
        ( e->type() == QEvent::Show || e->type() == QEvent::ShowToParent ) )
     updateVisibility();
 
+  if ( o == myCont && e->type() == QEvent::ChildRemoved )
+  {
+    QApplication::postEvent( this, new QEvent( (QEvent::Type)Remove ) );
+  }
+
   return false;
 }
 
@@ -215,11 +221,19 @@ void QtxDockWidget::Watcher::hideContainer()
   \brief Proces custom events.
   \param e custom event (not used)
 */
-void QtxDockWidget::Watcher::customEvent( QEvent* /*e*/ )
+void QtxDockWidget::Watcher::customEvent( QEvent* e )
 {
-  updateIcon();
-  updateCaption();
-  updateVisibility();
+  if ( e->type() == Update )
+  {
+    updateIcon();
+    updateCaption();
+    updateVisibility();
+  }
+  else if ( myCont && e->type() == Remove && !myCont->widget() )
+  {
+    myCont->deleteLater();
+    myCont = 0;
+  }
 }
 
 /*!
@@ -251,13 +265,18 @@ void QtxDockWidget::Watcher::updateVisibility()
   if ( !myCont )
     return;
 
-  QLayout* l = myCont->layout();
-  if ( !l )
-    return;
-
   bool vis = false;
-  for ( int i = 0; i < (int)l->count() && !vis; i++ )
-    vis = l->itemAt( i ) && l->itemAt( i )->widget() && l->itemAt( i )->widget()->isVisibleTo( myCont );
+  if ( myCont->widget() )
+    vis = myCont->widget()->isVisibleTo( myCont );
+  else
+  {
+    QLayout* l = myCont->layout();
+    if ( l )
+    {
+      for ( int i = 0; i < (int)l->count() && !vis; i++ )
+       vis = l->itemAt( i ) && l->itemAt( i )->widget() && l->itemAt( i )->widget()->isVisibleTo( myCont );
+    }
+  }
 
   bool empty = isEmpty();
   if ( empty == vis )