Qt: Add moving main window on any part of a window
authorAlexander Terentyev <lex.terentyev@gmail.com>
Wed, 5 Dec 2012 00:00:04 +0000 (11:00 +1100)
committerJean-Baptiste Kempf <jb@videolan.org>
Thu, 7 Feb 2013 16:51:50 +0000 (17:51 +0100)
Signed-off-by: Jean-Baptiste Kempf <jb@videolan.org>
modules/gui/qt4/main_interface.cpp
modules/gui/qt4/main_interface.hpp

index 730fcae..db52d71 100644 (file)
@@ -326,6 +326,11 @@ void MainInterface::computeMinimumSize()
     setMinimumWidth( minWidth );
 }
 
+inline void MainInterface::moveWindow( int offsetX, int offsetY )
+{
+    move( x() + offsetX, y() + offsetY );
+}
+
 /*****************************
  *   Main UI handling        *
  *****************************/
@@ -1387,6 +1392,36 @@ bool MainInterface::eventFilter( QObject *obj, QEvent *event )
     }
 }
 
+void MainInterface::mousePressEvent( QMouseEvent *event )
+{
+    b_customMoving = Qt::LeftButton == event->button();
+    lastCustomMovePos = event->globalPos();
+}
+
+void MainInterface::mouseMoveEvent( QMouseEvent *event )
+{
+    if( b_customMoving )
+    {
+        moveWindow(
+            event->globalX() - lastCustomMovePos.x(),
+            event->globalY() - lastCustomMovePos.y()
+        );
+        lastCustomMovePos = event->globalPos();
+    }
+}
+
+void MainInterface::mouseReleaseEvent( QMouseEvent *event )
+{
+    if( b_customMoving )
+    {
+        moveWindow(
+            event->globalX() - lastCustomMovePos.x(),
+            event->globalY() - lastCustomMovePos.y()
+        );
+    }
+    b_customMoving = false;
+}
+
 void MainInterface::toolBarConfUpdated()
 {
     QApplication::postEvent( this, new QEvent( MainInterface::ToolbarsNeedRebuild ) );
index 4c5b1fd..2cbf267 100644 (file)
@@ -105,6 +105,9 @@ protected:
     virtual void keyPressEvent( QKeyEvent *);
     virtual void wheelEvent( QWheelEvent * );
     virtual bool eventFilter(QObject *, QEvent *);
+    virtual void mousePressEvent( QMouseEvent * );
+    virtual void mouseMoveEvent( QMouseEvent * );
+    virtual void mouseReleaseEvent( QMouseEvent * );
 
 private:
     /* Main Widgets Creation */
@@ -127,6 +130,9 @@ private:
     void setInterfaceFullScreen( bool );
     void computeMinimumSize();
 
+    /* */
+    inline void moveWindow( int offsetX, int offsetY );
+
     /* */
     QSettings           *settings;
     QSystemTrayIcon     *sysTray;
@@ -155,6 +161,8 @@ private:
 
     QMap<QWidget *, QSize> stackWidgetsSizes;
 
+    QPoint              lastCustomMovePos;
+
     /* Flags */
     unsigned             i_notificationSetting; /// Systray Notifications
     bool                 b_autoresize;          ///< persistent resizable window
@@ -173,6 +181,7 @@ private:
 
     bool                 b_hasPausedWhenMinimized;
     bool                 b_statusbarVisible;
+    bool                 b_customMoving;        ///< Is the window moving by dragging ?
 
 #ifdef WIN32
     HIMAGELIST himl;