]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
0021219: [CEA 463] Add a preference to setOpaqueResize V6_3_0a1
authorvsr <vsr@opencascade.com>
Wed, 13 Apr 2011 07:24:07 +0000 (07:24 +0000)
committervsr <vsr@opencascade.com>
Wed, 13 Apr 2011 07:24:07 +0000 (07:24 +0000)
src/LightApp/LightApp_Application.cxx
src/Qtx/QtxMainWindow.cxx
src/Qtx/QtxMainWindow.h
src/SUIT/SUIT_Desktop.cxx

index b30c2719af64a7c8e4388192735eef3177bb738f..cf22f07023e547a2362654cbedb04620050f2db6 100644 (file)
@@ -2633,6 +2633,7 @@ void LightApp_Application::preferencesChanged( const QString& sec, const QString
     if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
     else                dopts &= ~QMainWindow::AnimatedDocks;
     desktop()->setDockOptions( dopts );
+    desktop()->setOpaqueResize( opaqueResize );
     if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
       dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
   }
@@ -2691,6 +2692,7 @@ void LightApp_Application::loadPreferences()
     if ( opaqueResize ) dopts |= QMainWindow::AnimatedDocks;
     else                dopts &= ~QMainWindow::AnimatedDocks;
     desktop()->setDockOptions( dopts );
+    desktop()->setOpaqueResize( opaqueResize );
     if ( dynamic_cast<STD_TabDesktop*>( desktop() ) )
       dynamic_cast<STD_TabDesktop*>( desktop() )->workstack()->setOpaqueResize( opaqueResize );
   }
index d3cb7662132e88a58f3ae74990fbe4a07355337f..8546d96687bc89f4b93a42ecf688930dbdcfd28b 100644 (file)
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+//  File:      QtxMainWindow.cxx
+//  Author:    Sergey TELKOV
 
-// File:      QtxMainWindow.cxx
-// Author:    Sergey TELKOV
-//
 #include "QtxMainWindow.h"
 
 #include "QtxToolBar.h"
-#include "QtxResourceMgr.h"
 
 #include <QEvent>
+#include <QPoint>
+#include <QTimer>
+#include <QLayout>
 #include <QMenuBar>
 #include <QStatusBar>
+#include <QRubberBand>
+#include <QMouseEvent>
 #include <QApplication>
 #include <QDesktopWidget>
 
@@ -93,6 +96,131 @@ bool QtxMainWindow::Filter::eventFilter( QObject* o, QEvent* e )
   return QObject::eventFilter( o, e );
 }
 
+/*!
+  \class QtxMainWindow::Resizer
+  \internal
+  \brief Internal object used to resize dock widgets.
+*/
+
+class QtxMainWindow::Resizer : public QObject
+{
+public:
+  Resizer( const QPoint&, const Qt::Orientation, QtxMainWindow* );
+  virtual ~Resizer();
+
+  QMouseEvent*    finalEvent() const;
+  void            setFinalEvent( QMouseEvent* );
+
+  void            setPosition( const QPoint& );
+  virtual bool    eventFilter( QObject*, QEvent* );
+
+private:
+  void            setFilters( bool );
+
+private:
+  QPoint          myPos;
+  QMainWindow*    myMain;
+  QRubberBand*    myRubber;
+  Qt::Orientation myOrient;
+  QMouseEvent*    myFinEvent;
+};
+
+/*!
+  \brief Constructor.
+  \param mw parent main window
+*/
+QtxMainWindow::Resizer::Resizer( const QPoint& p, const Qt::Orientation o, QtxMainWindow* mw )
+: QObject( mw ),
+  myMain( mw ),
+  myOrient( o ),
+  myFinEvent( 0 )
+{
+  setFilters( true );
+
+  myRubber = new QRubberBand( QRubberBand::Line, 0 );
+
+  setPosition( p );
+
+  myRubber->show();
+};
+
+/*!
+  \brief Destructor.
+*/
+QtxMainWindow::Resizer::~Resizer()
+{
+  delete myRubber;
+
+  setFilters( false );
+}
+
+void QtxMainWindow::Resizer::setPosition( const QPoint& pos )
+{
+  myPos = pos;
+  if ( myRubber ) {
+    QRect r;
+    QPoint min = myMain->mapToGlobal( myMain->rect().topLeft() );
+    QPoint max = myMain->mapToGlobal( myMain->rect().bottomRight() );
+    if ( myOrient == Qt::Horizontal ) {
+      int p = qMax( qMin( myPos.y(), max.y() ), min.y() );
+      r = QRect( myMain->mapToGlobal( QPoint( 0, 0 ) ).x(), p - 1, myMain->width(), 3 );
+    }
+    else {
+      int p = qMax( qMin( myPos.x(), max.x() ), min.x() );
+      r = QRect( p - 1, myMain->mapToGlobal( QPoint( 0, 0 ) ).y(), 3, myMain->height() );
+    }
+    myRubber->setGeometry( r );
+  }
+}
+
+QMouseEvent* QtxMainWindow::Resizer::finalEvent() const
+{
+  return myFinEvent;
+}
+
+void QtxMainWindow::Resizer::setFinalEvent( QMouseEvent* e )
+{
+  myFinEvent = e;
+}
+
+/*!
+  \brief Event filter.
+
+  \param o recevier object
+  \param e event
+*/
+bool QtxMainWindow::Resizer::eventFilter( QObject* o, QEvent* e )
+{
+  if ( e->type() == QEvent::Timer ) {
+    if ( !finalEvent() )
+      return true;
+
+    setFilters( false );
+    QApplication::postEvent( myMain, finalEvent() );
+    myFinEvent = 0;
+    deleteLater();
+  }
+
+  return QObject::eventFilter( o, e );
+}
+
+void QtxMainWindow::Resizer::setFilters( bool on )
+{
+  if ( myMain ) {
+    if ( on )
+      myMain->layout()->installEventFilter( this );
+    else
+      myMain->layout()->removeEventFilter( this );
+  }
+
+  QTimer* t = qFindChild<QTimer*>( myMain->layout() );
+  if ( t ) {
+    if ( on )
+      t->installEventFilter( this );
+    else
+      t->removeEventFilter( this );
+  }
+}
 
 /*!
   \class QtxMainWindow
@@ -108,11 +236,14 @@ bool QtxMainWindow::Filter::eventFilter( QObject* o, QEvent* e )
 QtxMainWindow::QtxMainWindow( QWidget* parent, Qt::WindowFlags f )
 : QMainWindow( parent, f ),
   myMenuBar( 0 ),
-  myStatusBar( 0 )
+  myStatusBar( 0 ),
+  myOpaque( true ),
+  myResizer( 0 ),
+  myMouseMove( 0 )
 {
-       //rnv: Enables tooltips for inactive windows.
-       //rnv: For details see http://bugtracker.opencascade.com/show_bug.cgi?id=20893
-       setAttribute(Qt::WA_AlwaysShowToolTips);
+  //rnv: Enables tooltips for inactive windows.
+  //rnv: For details see http://bugtracker.opencascade.com/show_bug.cgi?id=20893
+  setAttribute(Qt::WA_AlwaysShowToolTips);
 }
 
 /*!
@@ -220,6 +351,16 @@ void QtxMainWindow::setDockableStatusBar( const bool on )
   }
 }
 
+bool QtxMainWindow::isOpaqueResize() const
+{
+  return myOpaque;
+}
+
+void QtxMainWindow::setOpaqueResize( bool on )
+{
+  myOpaque = on;
+}
+
 /*!
   \brief Dump main window geometry to the string.
   \return string represenation of the window geometry
@@ -313,7 +454,7 @@ void QtxMainWindow::retrieveGeometry( const QString& str )
     if ( xOk )
     {
       if ( xp )
-        x = screen.width() * qMax( qMin( x, 100 ), 0 ) / 100;
+       x = screen.width() * qMax( qMin( x, 100 ), 0 ) / 100;
       x = ( xs > 0 ? x : screen.right() - x - rect.width() ) + frameGeometry().x() - geometry().x();
     }
 
@@ -324,7 +465,7 @@ void QtxMainWindow::retrieveGeometry( const QString& str )
     if ( yOk )
     {
       if ( yp )
-        y = screen.height() * qMax( qMin( y, 100 ), 0 ) / 100;
+       y = screen.height() * qMax( qMin( y, 100 ), 0 ) / 100;
       y = ( ys > 0 ? y : screen.bottom() - y - rect.height() ) + frameGeometry().y() - geometry().y();
     }
 
@@ -417,3 +558,53 @@ void QtxMainWindow::onDestroyed( QObject* obj )
   }
 }
 
+bool QtxMainWindow::event( QEvent* e )
+{
+  if ( myResizer && e->type() == QEvent::MouseButtonRelease ) {
+    if ( myMouseMove ) {
+      QMainWindow::event( myMouseMove );
+      delete myMouseMove;
+      myMouseMove = 0;
+    }
+
+    QMouseEvent* me = static_cast<QMouseEvent*>( e );
+    myResizer->setFinalEvent( new QMouseEvent( me->type(), me->pos(), me->globalPos(),
+                                              me->button(), me->buttons(), me->modifiers() ) );
+    myResizer = 0;
+    return true;
+  }
+
+  if ( myResizer && e->type() == QEvent::MouseMove ) {
+    QMouseEvent* me = static_cast<QMouseEvent*>( e );
+    myMouseMove = new QMouseEvent( me->type(), me->pos(), me->globalPos(),
+                                   me->button(), me->buttons(), me->modifiers() );
+    myResizer->setPosition( me->globalPos() );
+  }
+
+  bool ok = QMainWindow::event( e );
+
+  if ( e->type() == QEvent::MouseButtonPress ) {
+    if ( !isOpaqueResize() && ok && testAttribute( Qt::WA_SetCursor ) ) {
+      bool status = true;
+      Qt::Orientation o;
+      switch ( cursor().shape() )
+       {
+       case Qt::SplitHCursor:
+         o = Qt::Vertical;
+         break;
+       case Qt::SplitVCursor:
+         o = Qt::Horizontal;
+         break;
+       default:
+         status = false;
+         break;
+       }
+      if ( status ) {
+       QMouseEvent* me = static_cast<QMouseEvent*>( e );
+       myResizer = new Resizer( me->globalPos(), o, this );
+      }
+    }
+  }
+
+  return ok;
+}
index 305e519c4f4197795212e17e4de3cf615f4ee5d9..79fcda482bf20937e3a9493233e7afc665556200 100644 (file)
 //
 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 //
+//  File:      QtxMainWindow.h
+//  Author:    Sergey TELKOV
 
-// File:      QtxMainWindow.h
-// Author:    Sergey TELKOV
-//
 #ifndef QTXMAINWINDOW_H
 #define QTXMAINWINDOW_H
 
@@ -37,11 +36,15 @@ class QTX_EXPORT QtxMainWindow : public QMainWindow
   Q_OBJECT
 
   class Filter;
+  class Resizer;
 
 public:
   QtxMainWindow( QWidget* = 0, Qt::WindowFlags = 0 );
   virtual ~QtxMainWindow();
 
+  bool              isOpaqueResize() const;
+  void              setOpaqueResize( bool );
+
   bool              isDockableMenuBar() const;
   void              setDockableMenuBar( const bool );
 
@@ -51,6 +54,9 @@ public:
   QString           storeGeometry() const;
   void              retrieveGeometry( const QString& );
 
+protected:
+  virtual bool      event( QEvent* );
+
 private slots:
   void              onDestroyed( QObject* );
 
@@ -60,6 +66,10 @@ private:
 private:
   QToolBar*         myMenuBar;       //!< dockable menu bar
   QToolBar*         myStatusBar;     //!< dockable status bar
+
+  bool              myOpaque;
+  Resizer*          myResizer;
+  QMouseEvent*      myMouseMove;
 };
 
 #endif // QTXMAINWINDOW_H
index ad4b310b53a703934a90db86fb332a23b7e49b66..2719e2ab50e0cc098db118df9fc52ea0f63dff74 100755 (executable)
@@ -88,7 +88,7 @@ bool SUIT_Desktop::event( QEvent* e )
     break;
   }
 
-  return QMainWindow::event( e );
+  return QtxMainWindow::event( e );
 }
 
 /*!