]> git.sesse.net Git - vlc/blobdiff - modules/gui/qt4/main_interface.cpp
Qt: fix sizing of the interface
[vlc] / modules / gui / qt4 / main_interface.cpp
index 5b1fa63f85e400c73511338c0d00773d6ff29dec..207916e417dd30b0450d738aaf3be2513d01d392 100644 (file)
@@ -34,7 +34,7 @@
 #include "actions_manager.hpp"                  // killInstance
 #include "extensions_manager.hpp"               // killInstance
 
-#include "util/customwidgets.hpp"               // qtEventToVLCKey
+#include "util/customwidgets.hpp"               // qtEventToVLCKey, QVLCStackedWidget
 #include "util/qt_dirs.hpp"                     // toNativeSeparators
 
 #include "components/interface_widgets.hpp"     // bgWidget, videoWidget
@@ -75,6 +75,7 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf )
     bgWidget             = NULL;
     videoWidget          = NULL;
     playlistWidget       = NULL;
+    stackCentralOldWidget= NULL;
 #ifndef HAVE_MAEMO
     sysTray              = NULL;
 #endif
@@ -106,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" );
@@ -121,16 +122,7 @@ 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( );
 
     /**************
      * Status Bar *
@@ -215,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 * ),
@@ -242,19 +237,8 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf )
     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", 0 ).toInt();
-
+    int i_plVis = settings->value( "playlist-visible", false ).toBool();
     settings->endGroup();
 
     if( i_plVis ) togglePlaylist();
@@ -273,17 +257,8 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf )
 MainInterface::~MainInterface()
 {
     /* Unsure we hide the videoWidget before destroying it */
-    if( stackCentralOldWidget == playlistWidget )
-        showBg();
-
-    /* Save playlist state */
-    if( playlistWidget )
-    {
-        if( !isPlDocked() )
-            QVLCTools::saveWidgetPosition( p_intf, "Playlist", playlistWidget );
-
-        delete playlistWidget;
-    }
+    if( stackCentralOldWidget == videoWidget )
+        showTab( bgWidget );
 
 #ifdef WIN32
     if( himl )
@@ -304,20 +279,35 @@ MainInterface::~MainInterface()
 
     /* Save states */
     settings->beginGroup( "MainWindow" );
+
     settings->setValue( "pl-dock-status", b_plDocked );
-    settings->setValue( "playlist-visible", (int)playlistVisible );
+    /* Save playlist state */
+    if( playlistWidget )
+    {
+        settings->setValue( "playlist-visible",
+                            isPlDocked() ?
+                            playlistVisible :
+                            playlistWidget->isVisible() /* FIXME */ );
+    }
+
     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);
+
     settings->endGroup();
 
+    /* Save undocked playlist size */
+    if( playlistWidget && !isPlDocked() )
+        QVLCTools::saveWidgetPosition( p_intf, "Playlist", playlistWidget );
+
+    delete playlistWidget;
+
     delete statusBar();
 
     /* Unregister callbacks */
@@ -332,19 +322,22 @@ MainInterface::~MainInterface()
  *****************************/
 void MainInterface::recreateToolbars()
 {
-    // FIXME: do the same for the FSC
+    bool b_adv = getControlsVisibilityStatus() & CONTROLS_ADVANCED;
+
     settings->beginGroup( "MainWindow" );
     delete controls;
     delete inputC;
 
-    controls = new ControlsWidget( p_intf, false, this ); /* FIXME */
-    CONNECT( controls, advancedControlsToggled( bool ),
-             this, adaptGeometry() );
-    CONNECT( controls, sizeChanged(),
-             this, adaptGeometry() );
-
+    controls = new ControlsWidget( p_intf, b_adv, this );
     inputC = new InputControlsWidget( p_intf, this );
 
+    if( fullscreenControls )
+    {
+        delete fullscreenControls;
+        fullscreenControls = new FullscreenControllerWidget( p_intf, this );
+        CONNECT( fullscreenControls, keyPressed( QKeyEvent * ),
+                 this, handleKeyPress( QKeyEvent * ) );
+    }
     mainLayout->insertWidget( 2, inputC );
     mainLayout->insertWidget( settings->value( "ToolbarPos", 0 ).toInt() ? 0: 3,
                               controls );
@@ -361,7 +354,7 @@ void MainInterface::createMainWidget( QSettings *settings )
     mainLayout->setSpacing( 0 ); mainLayout->setMargin( 0 );
 
     /* */
-    stackCentralW = new QStackedWidget( main );
+    stackCentralW = new QVLCStackedWidget( main );
 
     /* Bg Cone */
     bgWidget = new BackgroundWidget( p_intf );
@@ -375,13 +368,14 @@ 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,
                    settings->value( "adv-controls", false ).toBool(), this );
-    CONNECT( controls, advancedControlsToggled( bool ),
-             this, adaptGeometry() );
-    CONNECT( controls, sizeChanged(),
-             this, adaptGeometry() );
     inputC = new InputControlsWidget( p_intf, this );
 
     mainLayout->insertWidget( 2, inputC );
@@ -395,7 +389,7 @@ void MainInterface::createMainWidget( QSettings *settings )
     visualSelector->hide();
     #endif
 
-    getSettings()->endGroup();
+    settings->endGroup();
 
     /* Enable the popup menu in the MI */
     main->setContextMenuPolicy( Qt::CustomContextMenu );
@@ -452,6 +446,10 @@ inline void MainInterface::createStatusBar()
     timeLabel->setFrameStyle( QFrame::Sunken | QFrame::Panel );
     speedLabel->setFrameStyle( QFrame::Sunken | QFrame::Panel );
     nameLabel->setFrameStyle( QFrame::Sunken | QFrame::StyledPanel);
+    timeLabel->setStyleSheet(
+            "QLabel:hover { background-color: rgba(255, 255, 255, 50%) }" );
+    speedLabel->setStyleSheet(
+            "QLabel:hover { background-color: rgba(255, 255, 255, 50%) }" );
 
     /* and adding those */
     statusBarr->addWidget( nameLabel, 8 );
@@ -475,19 +473,6 @@ inline void MainInterface::createStatusBar()
  * Handling of sizing of the components
  **********************************************************************/
 
-/* This function is called:
-   - Advanced buttons toggled
-   - Toolbar geom changed
- */
-void MainInterface::adaptGeometry()
-{
-  resize( sizeHint() );
-
-#ifdef DEBUG_INTF
-    debug();
-#endif
-}
-
 void MainInterface::debug()
 {
 #ifdef DEBUG_INTF
@@ -502,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() );
@@ -518,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 );
@@ -595,15 +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 show */
-        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 );
     }
 }
 
@@ -618,7 +595,9 @@ void MainInterface::releaseVideoSlot( void )
 {
     videoWidget->release();
 
-    restoreStackOldWidget();
+    msg_Warn( p_intf, "Here" );
+    if( stackCentralW->currentWidget() == videoWidget )
+        restoreStackOldWidget();
 
     /* We don't want to have a blank video to popup */
     stackCentralOldWidget = bgWidget;
@@ -633,6 +612,8 @@ int MainInterface::controlVideo( int i_query, va_list args )
     {
         unsigned int i_width  = va_arg( args, unsigned int );
         unsigned int i_height = va_arg( args, unsigned int );
+        if( isFullScreen() || isMaximized() )
+            showNormal();
         emit askVideoToResize( i_width, i_height );
         return VLC_SUCCESS;
     }
@@ -665,7 +646,12 @@ 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
     {
         playlistWidget->setWindowFlags( Qt::Window );
 
@@ -674,31 +660,25 @@ 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 )
     {
         /* Playlist is not visible, show it */
         if( stackCentralW->currentWidget() != playlistWidget )
         {
-            playlistWidget->forceShow();
             showTab( playlistWidget );
         }
         else /* Hide it! */
         {
             restoreStackOldWidget();
-            stackCentralW->updateGeometry();
-            // HACK: So it doesn't limit the stackWidget minimumSize
-            playlistWidget->forceHide();
         }
         playlistVisible = ( stackCentralW->currentWidget() == playlistWidget );
     }
@@ -728,11 +708,13 @@ void MainInterface::dockPlaylist( bool p_docked )
     }
     else
     {
+        QVLCTools::saveWidgetPosition( p_intf, "Playlist", playlistWidget );
         playlistWidget->setWindowFlags( Qt::Widget ); // Probably a Qt bug here
         // It would be logical that QStackWidget::addWidget reset the flags...
         stackCentralW->addWidget( playlistWidget );
-        stackCentralW->setCurrentWidget( playlistWidget );
+        showTab( playlistWidget );
     }
+    playlistVisible = true;
 }
 
 /*
@@ -740,23 +722,14 @@ void MainInterface::dockPlaylist( bool p_docked )
  */
 void MainInterface::toggleMinimalView( bool b_switch )
 {
-    if( i_visualmode == 0 )
-    { /* NORMAL MODE then */
-        if( !videoWidget || stackCentralW->currentWidget() != videoWidget )
-        {
-            showBg();
-        }
-        else
+    if( i_visualmode == 0 && b_autoresize ) /* Normal mode */
+    {
+        if( stackCentralW->currentWidget() == bgWidget )
         {
-            /* If video is visible, then toggle the status of bgWidget */
-            //FIXME
-            //bgWasVisible = !bgWasVisible;
-            /* if( stackCentralOldState == BACK G_TAB )
-                stackCentralOldState = HID DEN_TAB;
-            else
-                stackCentralOldState = BACK G_TAB;
-
-                */
+            if( stackCentralW->height() < 16 )
+            {
+                resizeStack( stackCentralW->width(), 100 );
+            }
         }
     }
 
@@ -778,6 +751,7 @@ void MainInterface::toggleAdvancedButtons()
 /* Get the visibility status of the controls (hidden or not, advanced or not) */
 int MainInterface::getControlsVisibilityStatus()
 {
+    if( !controls ) return 0;
     return( (controls->isVisible() ? CONTROLS_VISIBLE : CONTROLS_HIDDEN )
                 + CONTROLS_ADVANCED * controls->b_advancedVisible );
 }
@@ -977,23 +951,15 @@ void MainInterface::updateSystrayTooltipStatus( int i_status )
 {
     switch( i_status )
     {
-        case  0:
-        case  END_S:
-            {
-                sysTray->setToolTip( qtr( "VLC media player" ) );
-                break;
-            }
-        case PLAYING_S:
-            {
-                sysTray->setToolTip( input_name );
-                break;
-            }
-        case PAUSE_S:
-            {
-                sysTray->setToolTip( input_name + " - "
-                        + qtr( "Paused") );
-                break;
-            }
+    case PLAYING_S:
+        sysTray->setToolTip( input_name );
+        break;
+    case PAUSE_S:
+        sysTray->setToolTip( input_name + " - " + qtr( "Paused") );
+        break;
+    default:
+        sysTray->setToolTip( qtr( "VLC media player" ) );
+        break;
     }
     QVLCMenu::updateSystrayMenu( this, p_intf );
 }
@@ -1062,17 +1028,6 @@ void MainInterface::dragLeaveEvent(QDragLeaveEvent *event)
  ************************************************************************/
 void MainInterface::customEvent( QEvent *event )
 {
-#if 0
-    if( event->type() == PLDockEvent_Type )
-    {
-        PlaylistDialog::killInstance();
-        playlistEmbeddedFlag = true;
-        menuBar()->clear();
-        QVLCMenu::createMenuBar(this, p_intf, true, visualSelectorEnabled);
-        togglePlaylist();
-    }
-#endif
-    /*else */
     if ( event->type() == (int)SetVideoOnTopEvent_Type )
     {
         SetVideoOnTopQtEvent* p_event = (SetVideoOnTopQtEvent*)event;
@@ -1108,31 +1063,6 @@ void MainInterface::handleKeyPress( QKeyEvent *e )
         e->ignore();
 }
 
-void MainInterface::resizeEvent( QResizeEvent * event )
-{
-#if 0
-    if( b_keep_size )
-    {
-        if( i_visualmode )
-        {
-                mainVideoSize = size();
-        }
-        else
-        {
-            if( VISIBLE( bgWidget) ||
-                ( videoIsActive && videoWidget->isVisible() )
-              )
-                mainVideoSize = size();
-            else
-                mainBasedSize = size();
-        }
-    }
-#endif
-    QVLCMW::resizeEvent( event );
-    msg_Dbg( p_intf, "Resize Event, height: %i", size().height() );
-    debug();
-}
-
 void MainInterface::wheelEvent( QWheelEvent *e )
 {
     int i_vlckey = qtWheelEventToVLCKey( e );