]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
Slot onDeleteView() renamed as onClosingView().
authorstv <stv@opencascade.com>
Fri, 8 Sep 2006 12:49:58 +0000 (12:49 +0000)
committerstv <stv@opencascade.com>
Fri, 8 Sep 2006 12:49:58 +0000 (12:49 +0000)
Handler QWidget::closeEvent() not invoked for SUIT_ViewWindow. View window hides and removes by the virtual method SUIT_ViewManager::closeView(). User can define own behavior of window closing.
Identificator assignment moved on the base level - SUIT_ViewManager. Useless id's removed from inherit classes.
Title mechanism in the SUIT_ViewManager was changed. Now view manager support title for views with specific tags: %M - view manager number, %V - view number.

src/SUIT/SUIT_ViewManager.cxx
src/SUIT/SUIT_ViewManager.h
src/SUIT/SUIT_ViewWindow.cxx
src/SUIT/SUIT_ViewWindow.h

index 619b9c488522fe9e451c8e9d01bfa7c4558c4006..9d2e7e18619cdd04f16bd00d33734716b7b91d20 100755 (executable)
 #include "SUIT_Study.h"
 
 #include <qcursor.h>
+#include <qregexp.h>
 #include <qmessagebox.h>
 
 #ifdef WNT
 #include <windows.h>
 #endif
 
+QMap<QString, int> SUIT_ViewManager::_ViewMgrId;
+
 /*!\class SUIT_ViewManager.
  * Class provide manipulation with view windows.
  */
@@ -39,17 +42,20 @@ SUIT_ViewManager::SUIT_ViewManager( SUIT_Study* theStudy,
                                     SUIT_ViewModel* theViewModel )
 : QObject( 0 ),
 myDesktop( theDesktop ),
-myTitle( "Default viewer" ),
+myTitle( "Default: %M - viewer %V" ),
 myStudy( NULL )
 {
   myViewModel = 0;
   myActiveView = 0;
-  setViewModel(theViewModel);
-  connect(theDesktop, SIGNAL(windowActivated(SUIT_ViewWindow*)), 
-          this,       SLOT(onWindowActivated(SUIT_ViewWindow*)));
+  setViewModel( theViewModel );
+
+  myId = useNewId( getType() );
+
+  connect( theDesktop, SIGNAL( windowActivated( SUIT_ViewWindow* ) ), 
+           this,       SLOT( onWindowActivated( SUIT_ViewWindow* ) ) );
 
   myStudy = theStudy;
-  if( myStudy )
+  if ( myStudy )
     connect( myStudy, SIGNAL( destroyed() ), this, SLOT( onDeleteStudy() ) );
 }
 
@@ -63,6 +69,26 @@ SUIT_ViewManager::~SUIT_ViewManager()
   }
 }
 
+int SUIT_ViewManager::useNewId( const QString& type )
+{
+  if ( !_ViewMgrId.contains( type ) )
+    _ViewMgrId.insert( type, 0 );
+
+  int id = _ViewMgrId[type];
+  _ViewMgrId[type]++;
+  return id;
+}
+
+void SUIT_ViewManager::setTitle( const QString& theTitle )
+{
+  if ( myTitle == theTitle )
+    return;
+
+  myTitle = theTitle;
+  for ( uint i = 0; i < myViews.count(); i++ )
+    setViewName( myViews[i] );
+}
+
 /*!Sets view model \a theViewModel to view manager.*/
 void SUIT_ViewManager::setViewModel(SUIT_ViewModel* theViewModel) 
 {
@@ -76,10 +102,31 @@ void SUIT_ViewManager::setViewModel(SUIT_ViewModel* theViewModel)
 }
 
 /*!Sets view name for view window \a theView.*/
-void SUIT_ViewManager::setViewName(SUIT_ViewWindow* theView)
+void SUIT_ViewManager::setViewName( SUIT_ViewWindow* theView )
 {
-  int aPos = myViews.find(theView);
-  theView->setCaption(myTitle + QString(":%1").arg(aPos+1));
+  QString title = prepareTitle( getTitle(), myId + 1, myViews.find( theView ) + 1 );
+  theView->setCaption( title );
+}
+
+QString SUIT_ViewManager::prepareTitle( const QString& title, const int mId, const int vId )
+{
+  QString res = title;
+  QRegExp re( "%[%MV]" );
+  int i = 0;
+  while ( ( i = re.search( res, i ) ) != -1 )
+  {
+    QString rplc;
+    QString str = res.mid( i, re.matchedLength() );
+    if ( str == QString( "%%" ) )
+      rplc = QString( "%" );
+    else if ( str == QString( "%M" ) )
+      rplc = QString::number( mId );
+    else if ( str == QString( "%V" ) )
+      rplc = QString::number( vId );
+    res.replace( i, re.matchedLength(), rplc );
+    i += rplc.length();
+  }
+  return res;
 }
 
 /*! Creates View, adds it into list of views and returns just created view window*/
@@ -131,7 +178,7 @@ bool SUIT_ViewManager::insertView(SUIT_ViewWindow* theView)
   }
   
   connect(theView, SIGNAL(closing(SUIT_ViewWindow*)),
-          this,    SLOT(onDeleteView(SUIT_ViewWindow*)));
+          this,    SLOT(onClosingView(SUIT_ViewWindow*)));
 
   connect(theView, SIGNAL(mousePressed(SUIT_ViewWindow*, QMouseEvent*)),
           this,    SLOT(onMousePressed(SUIT_ViewWindow*, QMouseEvent*)));
@@ -168,10 +215,31 @@ bool SUIT_ViewManager::insertView(SUIT_ViewWindow* theView)
 
 /*!Emit delete view. Remove view window \a theView from view manager.
 */
-void SUIT_ViewManager::onDeleteView(SUIT_ViewWindow* theView)
+void SUIT_ViewManager::onClosingView( SUIT_ViewWindow* theView )
 {
-  emit deleteView(theView);
-  removeView(theView);
+  closeView( theView );
+}
+
+/*!
+  Remove the view window \a theView from view manager and destroy it.
+*/
+void SUIT_ViewManager::closeView( SUIT_ViewWindow* theView )
+{
+  if ( !theView )
+    return;
+
+  QGuardedPtr<SUIT_ViewWindow> view( theView );
+
+  view->hide();
+
+  if ( !view->testWFlags( WDestructiveClose ) )
+    return;
+
+  emit deleteView( view );
+  removeView( view );
+
+  if ( view )
+    delete view;
 }
 
 /*!Remove view window \a theView from view manager.
@@ -188,6 +256,26 @@ void SUIT_ViewManager::removeView(SUIT_ViewWindow* theView)
     emit lastViewClosed(this);
 }
 
+/*!
+  Set or clear flag Qt::WDestructiveClose for all views
+*/
+void SUIT_ViewManager::setDestructiveClose( const bool on )
+{
+  for ( uint i = 0; i < myViews.count(); i++ )
+    myViews[i]->setDestructiveClose( on );
+}
+
+/*!
+  Returns 'true' if any of views (view windows) is visible.
+*/
+bool SUIT_ViewManager::isVisible() const
+{
+  bool res = false;
+  for ( uint i = 0; i < myViews.count() && !res; i++ )
+    res = myViews[i]->isVisibleTo( myViews[i]->parentWidget() );
+  return res;
+}
+
 /*!
   Show or hide all views (view windows)
 */
@@ -223,17 +311,15 @@ void SUIT_ViewManager::onWindowActivated(SUIT_ViewWindow* view)
 */
 void SUIT_ViewManager::closeAllViews()
 {
-  unsigned int aSize = myViews.size();
-  for (uint i = 0; i < aSize; i++) {
-    if (myViews[i])
-      myViews[i]->close();
-  }
+  for ( uint i = 0; i < myViews.size(); i++ )
+    delete myViews[i];
+  myViews.clear();
 }
 
 /*!
  *\retval QString - type of view model.
  */
-QString  SUIT_ViewManager::getType() const 
+QString SUIT_ViewManager::getType() const
 { 
   return (!myViewModel)? "": myViewModel->getType(); 
 }
index 8cacbe253904f5fcf4996954577088b01fd6fa43..9fdd2ecd83f2341975db38d6bac413a884386654 100755 (executable)
@@ -59,12 +59,14 @@ public:
   int              getViewsCount() { return myViews.count(); }
   QPtrVector<SUIT_ViewWindow> getViews() { return myViews; }  
 
-  QString          getTitle() const { return myTitle;}
-  void             setTitle(QString theTitle) { myTitle = theTitle; }
+  QString          getTitle() const { return myTitle; }
+  virtual void     setTitle( const QString& );
 
   SUIT_ViewWindow* createViewWindow();
 
+  bool             isVisible() const;
   virtual void     setShown( const bool );
+  virtual void     setDestructiveClose( const bool );
 
 public slots:
   void             createView();
@@ -85,8 +87,8 @@ signals:
   
 protected slots:
   void             onWindowActivated(SUIT_ViewWindow*);
-  void             onDeleteView(SUIT_ViewWindow* theView);
-  void             onMousePressed(SUIT_ViewWindow* theView, QMouseEvent* theEvent);
+  void             onClosingView( SUIT_ViewWindow* );
+  void             onMousePressed(SUIT_ViewWindow*, QMouseEvent* );
   void             onDeleteStudy();
 
 private slots:
@@ -101,8 +103,14 @@ protected:
   /*! Removes the View from internal Views Vector.*/
   virtual void     removeView(SUIT_ViewWindow* theView);
   
+  /*! Close the specified View.*/
+  virtual void     closeView(SUIT_ViewWindow* theView);
+  
   /*! Used to set unique name for the view.*/
   virtual void     setViewName(SUIT_ViewWindow* theView);
+  QString          prepareTitle( const QString&, const int, const int );
+
+  static int       useNewId( const QString& );
 
 protected:
   SUIT_Desktop*               myDesktop;
@@ -110,8 +118,11 @@ protected:
   QPtrVector<SUIT_ViewWindow> myViews;
   SUIT_ViewWindow*            myActiveView;
 
+  int                         myId;
   QString                     myTitle;
   SUIT_Study*                 myStudy;
+
+  static QMap<QString, int>   _ViewMgrId;
 };
 
 #ifdef WIN32
index 0df3081c310cbcc28b42a47069f832054d6a6b77..faf064fb51486b4cdbf093c3a33d3379263b1d38 100755 (executable)
@@ -111,11 +111,22 @@ bool SUIT_ViewWindow::dumpViewToFormat( const QString& fileName, const QString&
   return dumpViewToFormat( dumpView(), fileName, format );
 }
 
+/*!
+  Set or clear flag Qt::WDestructiveClose
+*/
+void SUIT_ViewWindow::setDestructiveClose( const bool on )
+{
+  if ( on )
+    setWFlags( WDestructiveClose );
+  else
+    clearWFlags( WDestructiveClose );
+}
+
 /*! Close event \a theEvent.
 */
 void SUIT_ViewWindow::closeEvent(QCloseEvent* theEvent)
 {
-  QMainWindow::closeEvent( theEvent );
+//  QMainWindow::closeEvent( theEvent );
   emit closing( this );
 }
 
index 2e5eb7804028577bea7157c854b2d13c04a444da..6a6a6f86920a840d25c2f6915f6b607141d9903f 100755 (executable)
@@ -54,6 +54,8 @@ public:
   virtual QString   getVisualParameters();
   virtual void      setVisualParameters( const QString& parameters );
 
+  void              setDestructiveClose( const bool );
+
 public slots:
   virtual void      onDumpView();