]> git.sesse.net Git - vlc/blobdiff - modules/gui/qt4/main_interface.cpp
Qt4: undo always-on-top hint when the video is released
[vlc] / modules / gui / qt4 / main_interface.cpp
index 0194e0d537a9bf28b63e4e8a3c99c123ac6fa437..986964043079ffe6f65f39a34dff049c349c6caf 100644 (file)
@@ -107,7 +107,7 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf )
     b_videoEmbedded = var_InheritBool( p_intf, "embedded-video" );
 
     /* Does the interface resize to video size or the opposite */
-    b_keep_size = !var_InheritBool( p_intf, "qt-video-autoresize" );
+    b_autoresize = var_InheritBool( p_intf, "qt-video-autoresize" );
 
     /* Are we in the enhanced always-video mode or not ? */
     i_visualmode = var_InheritInteger( p_intf, "qt-minimal-view" );
@@ -122,15 +122,6 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf )
     /* */
     b_plDocked = getSettings()->value( "pl-dock-status", true ).toBool();
 
-
-    /**
-     * Retrieve saved sizes for main window
-     *   mainBasedSize = based window size for normal mode
-     *                  (no video, no background)
-     *   mainVideoSize = window size with video (all modes)
-     **/
-    mainBasedSize = settings->value( "mainBasedSize", QSize( 350, 120 ) ).toSize();
-    mainVideoSize = settings->value( "mainVideoSize", QSize( 400, 300 ) ).toSize();
     settings->endGroup( );
 
     /**************
@@ -142,7 +133,6 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf )
      *  UI and Widgets design
      **************************/
     setVLCWindowsTitle();
-    createMainWidget( settings );
 
     /************
      * Menu Bar *
@@ -151,6 +141,7 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf )
     CONNECT( THEMIM->getIM(), voutListChanged( vout_thread_t **, int ),
              this, destroyPopupMenu() );
 
+    createMainWidget( settings );
     /*********************************
      * Create the Systray Management *
      *********************************/
@@ -216,10 +207,13 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf )
 
     if( videoWidget )
     {
-        CONNECT( this, askVideoToResize( unsigned int, unsigned int ),
-                 videoWidget, SetSizing( unsigned int, unsigned int ) );
-        CONNECT( videoWidget, sizeChanged( int, int ),
-                 this, resizeStack( int,  int ) );
+        if( b_autoresize )
+        {
+            CONNECT( this, askVideoToResize( unsigned int, unsigned int ),
+                     videoWidget, SetSizing( unsigned int, unsigned int ) );
+            CONNECT( videoWidget, sizeChanged( int, int ),
+                     this, resizeStack( int,  int ) );
+        }
         CONNECT( this, askVideoSetFullScreen( bool ),
                  videoWidget, SetFullScreen( bool ) );
         CONNECT( videoWidget, keyPressed( QKeyEvent * ),
@@ -239,26 +233,16 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf )
     /* Register callback for the intf-popupmenu variable */
     var_AddCallback( p_intf->p_libvlc, "intf-popupmenu", PopupMenuCB, p_intf );
 
+    /* Playlist */
+    int i_plVis = settings->value( "MainWindow/playlist-visible", false ).toBool();
+
+    if( i_plVis ) togglePlaylist();
+
     /**** FINAL SIZING and placement of interface */
     settings->beginGroup( "MainWindow" );
     QVLCTools::restoreWidgetPosition( settings, this, QSize(400, 100) );
-
-    /* resize to previously saved main window size if appicable */
-    //FIXME remove.
-    if( b_keep_size )
-    {
-       if( i_visualmode )
-           resize( mainVideoSize );
-       else
-           resize( mainBasedSize );
-    }
-
-    /* Playlist */
-    int i_plVis = settings->value( "playlist-visible", false ).toBool();
     settings->endGroup();
 
-    if( i_plVis ) togglePlaylist();
-
     /* Final sizing and showing */
     setVisible( !b_hideAfterCreation );
 
@@ -274,7 +258,7 @@ MainInterface::~MainInterface()
 {
     /* Unsure we hide the videoWidget before destroying it */
     if( stackCentralOldWidget == videoWidget )
-        showBg();
+        showTab( bgWidget );
 
 #ifdef WIN32
     if( himl )
@@ -309,10 +293,9 @@ MainInterface::~MainInterface()
     settings->setValue( "adv-controls",
                         getControlsVisibilityStatus() & CONTROLS_ADVANCED );
 
-    settings->setValue( "mainBasedSize", mainBasedSize );
-    settings->setValue( "mainVideoSize", mainVideoSize );
-
-    settings->setValue( "backgroundSize", bgWidget->size() );
+    /* Save the stackCentralW sizes */
+    settings->setValue( "bgSize", stackWidgetsSizes[bgWidget] );
+    settings->setValue( "playlistSize", stackWidgetsSizes[playlistWidget] );
 
     /* Save this size */
     QVLCTools::saveWidgetPosition(settings, this);
@@ -386,6 +369,9 @@ void MainInterface::createMainWidget( QSettings *settings )
     mainLayout->insertWidget( 1, stackCentralW );
 
     settings->beginGroup( "MainWindow" );
+    stackWidgetsSizes[bgWidget] = settings->value( "bgSize", QSize( 400, 0 ) ).toSize();
+    /* Resize even if no-auto-resize, because we are at creation */
+    resizeStack( stackWidgetsSizes[bgWidget].width(), stackWidgetsSizes[bgWidget].height() );
 
     /* Create the CONTROLS Widget */
     controls = new ControlsWidget( p_intf,
@@ -501,15 +487,21 @@ void MainInterface::debug()
 }
 
 inline void MainInterface::showVideo() { showTab( videoWidget ); }
-inline void MainInterface::showBg() { showTab( bgWidget ); }
+inline void MainInterface::restoreStackOldWidget()
+            { showTab( stackCentralOldWidget ); }
 
 inline void MainInterface::showTab( QWidget *widget )
 {
 #ifdef DEBUG_INTF
     msg_Warn( p_intf, "Old stackCentralOldWidget %i", stackCentralW->indexOf( stackCentralOldWidget ) );
 #endif
+
     stackCentralOldWidget = stackCentralW->currentWidget();
+    stackWidgetsSizes[stackCentralOldWidget] = stackCentralW->size();
+
     stackCentralW->setCurrentWidget( widget );
+    if( b_autoresize )
+        resizeStack( stackWidgetsSizes[widget].width(), stackWidgetsSizes[widget].height() );
 
 #ifdef DEBUG_INTF
     msg_Warn( p_intf, "State change %i",  stackCentralW->currentIndex() );
@@ -517,21 +509,6 @@ inline void MainInterface::showTab( QWidget *widget )
 #endif
 }
 
-inline void MainInterface::restoreStackOldWidget()
-{
-#ifdef DEBUG_INTF
-    msg_Warn( p_intf, "New stackCentralOldWidget %i", stackCentralW->indexOf( stackCentralOldWidget ) );
-#endif
-    QWidget *wTemp = stackCentralW->currentWidget();
-
-    stackCentralW->setCurrentWidget( stackCentralOldWidget );
-
-    stackCentralOldWidget = wTemp;
-#ifdef DEBUG_INTF
-    msg_Warn( p_intf, "Debug %i %i",stackCentralW->indexOf( wTemp ), stackCentralW->indexOf( stackCentralW->currentWidget() ) );
-#endif
-}
-
 void MainInterface::destroyPopupMenu()
 {
     QVLCMenu::PopupMenu( p_intf, false );
@@ -594,16 +571,16 @@ void MainInterface::getVideoSlot( WId *p_id, int *pi_x, int *pi_y,
 {
     /* Request the videoWidget */
     WId ret = videoWidget->request( pi_x, pi_y,
-                                    pi_width, pi_height, b_keep_size );
+                                    pi_width, pi_height, !b_autoresize );
     *p_id = ret;
     if( ret ) /* The videoWidget is available */
     {
-        /* Ask videoWidget to resize correctly, if we are in normal mode */
-        if( !isFullScreen() && !isMaximized() )
-            videoWidget->SetSizing( *pi_width, *pi_height );
-
         /* Consider the video active now */
         showVideo();
+
+        /* Ask videoWidget to resize correctly, if we are in normal mode */
+        if( !isFullScreen() && !isMaximized() && b_autoresize )
+            videoWidget->SetSizing( *pi_width, *pi_height );
     }
 }
 
@@ -611,6 +588,7 @@ void MainInterface::getVideoSlot( WId *p_id, int *pi_x, int *pi_y,
 void MainInterface::releaseVideo( void )
 {
     emit askReleaseVideo();
+    QApplication::postEvent( this, new SetVideoOnTopQtEvent( false ) );
 }
 
 /* Function that is CONNECTED to the previous emit */
@@ -668,8 +646,16 @@ void MainInterface::createPlaylist()
 {
     playlistWidget = new PlaylistWidget( p_intf, this );
 
-    if( !b_plDocked )
+    if( b_plDocked )
     {
+        stackCentralW->addWidget( playlistWidget );
+        stackWidgetsSizes[playlistWidget] = settings->value( "playlistSize", QSize( 500, 250 ) ).toSize();
+    }
+    else
+    {
+#ifdef WIN32
+        playlistWidget->setParent( NULL );
+#endif
         playlistWidget->setWindowFlags( Qt::Window );
 
         /* This will restore the geometry but will not work for position,
@@ -677,16 +663,14 @@ void MainInterface::createPlaylist()
         QVLCTools::restoreWidgetPosition( p_intf, "Playlist",
                 playlistWidget, QSize( 600, 300 ) );
     }
-    else
-    {
-        stackCentralW->addWidget( playlistWidget );
-    }
 }
 
 void MainInterface::togglePlaylist()
 {
     if( !playlistWidget )
+    {
         createPlaylist();
+    }
 
     if( b_plDocked )
     {
@@ -703,6 +687,9 @@ void MainInterface::togglePlaylist()
     }
     else
     {
+#ifdef WIN32
+        playlistWidget->setParent( NULL );
+#endif
         playlistWidget->setWindowFlags( Qt::Window );
         playlistVisible = !playlistVisible;
         playlistWidget->setVisible( playlistVisible );
@@ -719,6 +706,9 @@ void MainInterface::dockPlaylist( bool p_docked )
     if( !p_docked )
     {
         stackCentralW->removeWidget( playlistWidget );
+#ifdef WIN32
+        playlistWidget->setParent( NULL );
+#endif
         playlistWidget->setWindowFlags( Qt::Window );
         QVLCTools::restoreWidgetPosition( p_intf, "Playlist",
                 playlistWidget, QSize( 600, 300 ) );
@@ -741,7 +731,7 @@ void MainInterface::dockPlaylist( bool p_docked )
  */
 void MainInterface::toggleMinimalView( bool b_switch )
 {
-    if( i_visualmode == 0 )
+    if( i_visualmode == 0 && b_autoresize ) /* Normal mode */
     {
         if( stackCentralW->currentWidget() == bgWidget )
         {
@@ -1050,11 +1040,17 @@ void MainInterface::customEvent( QEvent *event )
     if ( event->type() == (int)SetVideoOnTopEvent_Type )
     {
         SetVideoOnTopQtEvent* p_event = (SetVideoOnTopQtEvent*)event;
+        Qt::WindowFlags oldflags = windowFlags(), newflags;
+
         if( p_event->OnTop() )
-            setWindowFlags( windowFlags() | Qt::WindowStaysOnTopHint );
+            newflags = oldflags | Qt::WindowStaysOnTopHint;
         else
-            setWindowFlags( windowFlags() & ~Qt::WindowStaysOnTopHint );
-        show(); /* necessary to apply window flags */
+            newflags = oldflags & ~Qt::WindowStaysOnTopHint;
+        if( newflags != oldflags )
+        {
+            setWindowFlags( newflags );
+            show(); /* necessary to apply window flags */
+        }
     }
 }