]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
0022768: [EDF] Model inspector: resolved windows problems mpa/22768
authormpa <mpa@opencascade.com>
Thu, 18 Dec 2014 15:58:51 +0000 (18:58 +0300)
committermpa <mpa@opencascade.com>
Thu, 18 Dec 2014 15:58:51 +0000 (18:58 +0300)
src/RepairGUI/RepairGUI_InspectObjectDlg.cxx
src/RepairGUI/RepairGUI_InspectObjectDlg.h

index 0d8300bb5bdff6dd5ab9758eb0151bfa491c948b..82d89899838b484e9117b749e6749672368b1718 100644 (file)
@@ -175,20 +175,7 @@ RepairGUI_InspectObjectDlg::RepairGUI_InspectObjectDlg( SUIT_Desktop* parent )
   setAttribute( Qt::WA_DeleteOnClose );
 
   myApp = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
-  if ( !myApp ) return;
-
-  SUIT_ViewWindow* aViewWindow = 0;
-  SUIT_Study* activeStudy = myApp->activeStudy();
-  if (activeStudy)
-    aViewWindow = myApp->desktop()->activeWindow();
-  if (aViewWindow == 0) return;
-  SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( myApp->activeStudy() );
-  SUIT_ViewManager* aViewManager = aViewWindow->getViewManager();
-  if( aViewManager->getType() != OCCViewer_Viewer::Type() &&
-      aViewManager->getType() != SVTK_Viewer::Type())
-    return;
-
-  myGlobalId = aViewManager->getGlobalId();
+  myViewWindow = myApp->desktop()->activeWindow();
 
   QGridLayout* topLayout = new QGridLayout( this );
   topLayout->setMargin( 11 ); topLayout->setSpacing( 6 );
@@ -282,11 +269,20 @@ RepairGUI_InspectObjectDlg::RepairGUI_InspectObjectDlg( SUIT_Desktop* parent )
   connect( myApp->selectionMgr(), SIGNAL( currentSelectionChanged() ),
            this, SLOT( onViewSelectionChanged() ) );
 
+  connect( myApp->desktop(), SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
+           this, SLOT( onWindowActivated( SUIT_ViewWindow* ) ) );
+
+  if( myViewWindow )
+    connect( myViewWindow->getViewManager(), SIGNAL( deleteView( SUIT_ViewWindow* ) ),
+             this, SLOT( onCloseView( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
+
   init();
 }
 
 RepairGUI_InspectObjectDlg::~RepairGUI_InspectObjectDlg()
 {
+  if( myViewWindow )
+    onEditMainShape();
   // restore initial parameters for viewer
   getDisplayer()->UnsetColor();
   getDisplayer()->UnsetWidth();
@@ -306,6 +302,13 @@ void RepairGUI_InspectObjectDlg::init()
   if( selected.Extent() != 1 )
     return;
 
+  if( !myViewWindow ) {
+    SUIT_ViewManager* occVm = myApp->getViewManager( OCCViewer_Viewer::Type(), true );
+    myViewWindow = occVm->getActiveView();
+    connect( occVm, SIGNAL( deleteView( SUIT_ViewWindow* ) ),
+             this, SLOT( onCloseView( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
+  }
+
   TopoDS_Shape aShape = GEOMBase::GetTopoFromSelection( selected );
   if( aShape.IsNull() )
     return;
@@ -320,14 +323,11 @@ void RepairGUI_InspectObjectDlg::init()
 
   // remember initial transparency value
   SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( myApp->activeStudy() );
-  QVariant v = aStudy->getObjectProperty( myGlobalId, QString( anEntry.in() ),
+  QVariant v = aStudy->getObjectProperty( myViewWindow->getViewManager()->getGlobalId(),
+                                          QString( anEntry.in() ),
                                           GEOM::propertyName( GEOM::Transparency ), myTransparency );
   if( v.canConvert( QVariant::Double ) )
     myTransparency = v.toDouble();
-  aStudy->setObjectProperty( myGlobalId, QString( anEntry.in() ), GEOM::propertyName( GEOM::Transparency ), 0.5 );
-
-  if ( GEOM_Displayer::GetActiveView()->isVisible( anIO ) )
-    getDisplayer()->Redisplay( anIO, true );
 
   TreeWidgetItem* anItem = new TreeWidgetItem( myTreeObjects, QStringList() << aName, aShape, anIO );
   if( getDisplayer()->IsDisplayed( anEntry.in() ) )
@@ -335,6 +335,8 @@ void RepairGUI_InspectObjectDlg::init()
   else
     anItem->setVisible( false, myInvisible );
 
+  setMainObjectTransparency( 0.5 );
+
   // add sub-objects in the tree
   addSubObjects( anItem );
 
@@ -423,46 +425,69 @@ void RepairGUI_InspectObjectDlg::setItemDisplayStatus( TreeWidgetItem* theItem,
 }
 
 //=================================================================================
-// function : onEditMainShape()
-// purpose  : called when selection button was clicked
+// function : setMainObjectTransparency()
+// purpose  : set transparency for the inspected object
 //=================================================================================
-void RepairGUI_InspectObjectDlg::onEditMainShape()
+void RepairGUI_InspectObjectDlg::setMainObjectTransparency( double theTransparency )
 {
-  if( myEditMainShape->text().isEmpty() )
-    return;
+  SUIT_ViewManager* aViewMan = myViewWindow->getViewManager();
+  SALOME_View* aView = dynamic_cast<SALOME_View*>( aViewMan->getViewModel() );
+  SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( myApp->activeStudy() );
+
+  TreeWidgetItem* aMainItem = dynamic_cast<TreeWidgetItem*>( myTreeObjects->topLevelItem(0) );
+  aStudy->setObjectProperty( myViewWindow->getViewManager()->getGlobalId(),
+                             QString( aMainItem->getIO()->getEntry() ),
+                             GEOM::propertyName( GEOM::Transparency ), theTransparency );
+
+  if ( aView->isVisible( aMainItem->getIO() ) )
+    getDisplayer()->Redisplay( aMainItem->getIO(), true, aView );
+}
 
+//=================================================================================
+// function : restoreParam()
+// purpose  : restore initial parameters of the dialog and the viewer
+//=================================================================================
+void RepairGUI_InspectObjectDlg::restoreParam()
+{
+  SUIT_ViewManager* aViewMan = myViewWindow->getViewManager();
+  SALOME_View* aView = dynamic_cast<SALOME_View*>( aViewMan->getViewModel() );
   GEOM_Displayer* aDisplayer = getDisplayer();
   // restore initial parameters for viewer
   aDisplayer->UnsetColor();
   aDisplayer->UnsetWidth();
 
   // restore transparency of main object
-  TreeWidgetItem* aMainItem = dynamic_cast<TreeWidgetItem*>( myTreeObjects->topLevelItem(0) );
-  SalomeApp_Study* aStudy = dynamic_cast<SalomeApp_Study*>( myApp->activeStudy() );
-  aStudy->setObjectProperty( myGlobalId, QString(aMainItem->getIO()->getEntry()) ,
-                             GEOM::propertyName( GEOM::Transparency ), myTransparency );
-
-  if( GEOM_Displayer::GetActiveView()->isVisible( aMainItem->getIO() ) )
-    aDisplayer->Redisplay( aMainItem->getIO(), false );
+  setMainObjectTransparency( myTransparency );
 
   // erase sub-shapes
-  SALOME_ListIO aListOfIO;
+  TreeWidgetItem* aMainItem = dynamic_cast<TreeWidgetItem*>( myTreeObjects->topLevelItem(0) );
   QTreeWidgetItemIterator it( myTreeObjects );
   while(*it) {
     if( *it != aMainItem ) {
       TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>(*it);
-      aListOfIO.Append( anItem->getIO() );
+      aDisplayer->Erase( anItem->getIO(), false, false, aView );
+      anItem->setVisible( false, myInvisible );
     }
     ++it;
   }
-  aDisplayer->Erase( aListOfIO );
+}
+
+//=================================================================================
+// function : onEditMainShape()
+// purpose  : called when selection button was clicked
+//=================================================================================
+void RepairGUI_InspectObjectDlg::onEditMainShape()
+{
+  if( myEditMainShape->text().isEmpty() || !myViewWindow )
+    return;
+
+  restoreParam();
 
   // restore initial parameters for dialog box
   myEditMainShape->setEnabled( true );
   myEditMainShape->setText("");
   myEditMainShape->setFocus();
   myTreeObjects->clear();
-  myTreeObjects->update();
 }
 
 //=================================================================================
@@ -471,7 +496,7 @@ void RepairGUI_InspectObjectDlg::onEditMainShape()
 //=================================================================================
 void RepairGUI_InspectObjectDlg::onItemClicked( QTreeWidgetItem* theItem, int theColumn )
 {
-  if( theColumn!= 1 || !( theItem->flags() & Qt::ItemIsSelectable ) )
+  if( theColumn!= 1 || !( theItem->flags() & Qt::ItemIsSelectable ) || !myViewWindow )
     return;
 
   GEOM_Displayer* aDisplayer = getDisplayer();
@@ -538,6 +563,9 @@ void RepairGUI_InspectObjectDlg::onItemExpanded( QTreeWidgetItem* theItem )
 //=================================================================================
 void RepairGUI_InspectObjectDlg::onItemSelectionChanged()
 {
+  if( !myViewWindow )
+    return;
+
   QList<QTreeWidgetItem*> listItem = myTreeObjects->selectedItems();
   SALOME_ListIO aSelected;
   for( int i = 0; i < listItem.size(); i++ ) {
@@ -553,7 +581,7 @@ void RepairGUI_InspectObjectDlg::onItemSelectionChanged()
 //=================================================================================
 void RepairGUI_InspectObjectDlg::onHeaderClicked( int theColumn )
 {
-  if( theColumn != 1 )
+  if( theColumn != 1 || !myViewWindow )
     return;
 
   GEOM_Displayer* aDisplayer = getDisplayer();
@@ -600,12 +628,57 @@ void RepairGUI_InspectObjectDlg::onViewSelectionChanged()
     init();
 }
 
+//=================================================================================
+// function : onWindowActivated()
+// purpose  : called when other window was activated
+//=================================================================================
+void RepairGUI_InspectObjectDlg::onWindowActivated( SUIT_ViewWindow* theViewWindow )
+{
+  if( myViewWindow )
+    restoreParam();
+
+  connect( theViewWindow->getViewManager(), SIGNAL( deleteView( SUIT_ViewWindow* ) ),
+           this, SLOT( onCloseView( SUIT_ViewWindow* ) ), Qt::UniqueConnection );
+
+  if( theViewWindow->getViewManager()->getType() != OCCViewer_Viewer::Type() &&
+      theViewWindow->getViewManager()->getType() != SVTK_Viewer::Type() ) {
+    myViewWindow = 0;
+    return;
+  }
+  myViewWindow = theViewWindow;
+
+  if( myTreeObjects->topLevelItemCount() > 0 ) {
+    setMainObjectTransparency( 0.5 );
+    TreeWidgetItem* aMainItem = dynamic_cast<TreeWidgetItem*>( myTreeObjects->topLevelItem(0) );
+    if( getDisplayer()->IsDisplayed( aMainItem->getIO()->getEntry() ) )
+      aMainItem->setVisible( true, myVisible );
+    else
+      aMainItem->setVisible( false, myInvisible );
+  }
+  checkVisibleIcon();
+}
+
+//=================================================================================
+// function : onCloseView()
+// purpose  : called when last view was closed
+//=================================================================================
+void RepairGUI_InspectObjectDlg::onCloseView( SUIT_ViewWindow* )
+{
+  if( myApp->desktop()->windows().size() == 0 ) {
+    restoreParam();
+    myViewWindow = 0;
+  }
+}
+
 //=================================================================================
 // function : clickOnShow()
 // purpose  : called when "Show selected" button was clicked
 //=================================================================================
 void RepairGUI_InspectObjectDlg::clickOnShow()
 {
+  if( !myViewWindow )
+    return;
+
   QList<QTreeWidgetItem*> listItem = myTreeObjects->selectedItems();
   for( int i = 0; i < listItem.size(); i++ ) {
     TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>( listItem.at(i) );
@@ -624,6 +697,9 @@ void RepairGUI_InspectObjectDlg::clickOnShow()
 //=================================================================================
 void RepairGUI_InspectObjectDlg::clickOnShowOnly()
 {
+  if( !myViewWindow )
+    return;
+
   SALOME_ListIO aListOfIO;
   QTreeWidgetItemIterator it( myTreeObjects );
   while(*it) {
@@ -645,11 +721,14 @@ void RepairGUI_InspectObjectDlg::clickOnShowOnly()
 //=================================================================================
 void RepairGUI_InspectObjectDlg::clickOnHide()
 {
+  if( !myViewWindow )
+    return;
+
   QList<QTreeWidgetItem*> listItem = myTreeObjects->selectedItems();
   for( int i = 0; i < listItem.size(); i++ ) {
     TreeWidgetItem* anItem = dynamic_cast<TreeWidgetItem*>( listItem.at(i) );
     if( anItem->isVisible() ) {
-      getDisplayer()->Erase( anItem->getIO(), false, true );
+      getDisplayer()->Erase( anItem->getIO(), false, false );
       setItemDisplayStatus( anItem, false );
     }
   }
index 43cb69c613b26ea015bf487fa79189a631bcd486..ecb9ab6f28fc842cb2465694b57ad54447501b1c 100644 (file)
@@ -28,6 +28,7 @@
 #include <QTreeWidget>
 #include <QLabel>
 #include <QLineEdit>
+#include <QPointer>
 
 class RepairGUI_InspectObjectDlg : public QDialog, public GEOMBase_Helper
 { 
@@ -52,6 +53,9 @@ private slots:
 
   void                    onViewSelectionChanged();
 
+  void                    onWindowActivated( SUIT_ViewWindow* );
+  void                    onCloseView( SUIT_ViewWindow* );
+
   void                    clickOnShow();
   void                    clickOnShowOnly();
   void                    clickOnHide();
@@ -64,18 +68,20 @@ private:
   void                    addSubObjects( TreeWidgetItem* );
   void                    displayItem( TreeWidgetItem* );
   void                    setItemDisplayStatus( TreeWidgetItem* theItem, bool theIsVisible );
+  void                    setMainObjectTransparency( double );
+  void                    restoreParam();
 
-  SalomeApp_Application*  myApp;
-  int                     myGlobalId;
+  SalomeApp_Application*     myApp;
+  QPointer<SUIT_ViewWindow>  myViewWindow;
 
-  QIcon                   myVisible;
-  QIcon                   myInvisible;
+  QIcon                      myVisible;
+  QIcon                      myInvisible;
 
-  QTreeWidget*            myTreeObjects;
-  QLineEdit*              myEditMainShape;
+  QTreeWidget*               myTreeObjects;
+  QLineEdit*                 myEditMainShape;
 
-  bool                    myIsSelectAll;
-  double                  myTransparency;
+  bool                       myIsSelectAll;
+  double                     myTransparency;
 
 };