X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fmain_interface.cpp;h=672da8ec211027aad2ef560362e25210de067909;hb=48c2120c955a7fd8d4137ccd91ecdfcd78afbe7e;hp=64eaab258b6b4ff4dcdf7581d992b4972b53ce28;hpb=fcde47951ad8224954a73d423d59da046d69497e;p=vlc diff --git a/modules/gui/qt4/main_interface.cpp b/modules/gui/qt4/main_interface.cpp index 64eaab258b..672da8ec21 100644 --- a/modules/gui/qt4/main_interface.cpp +++ b/modules/gui/qt4/main_interface.cpp @@ -6,6 +6,7 @@ * * Authors: Clément Stenac * Jean-Baptiste Kempf + * Ilkka Ollakka * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,6 +22,9 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif #include "qt4.hpp" #include "main_interface.hpp" @@ -49,6 +53,8 @@ #include #include #include +#include +#include #include #include @@ -89,26 +95,10 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) bgWidget = NULL; videoWidget = NULL; playlistWidget = NULL; videoIsActive = false; input_name = ""; + playlistVisible = false; - /** - * Ask for the network policy on FIRST STARTUP - **/ - if( config_GetInt( p_intf, "privacy-ask") ) - { - QList controls; - if( privacyDialog( controls ) == QDialog::Accepted ) - { - QList::Iterator i; - for( i = controls.begin() ; i != controls.end() ; i++ ) - { - ConfigControl *c = qobject_cast(*i); - c->doApply( p_intf ); - } - - config_PutInt( p_intf, "privacy-ask" , 0 ); - config_SaveConfigFile( p_intf, NULL ); - } - } + /* Ask for privacy */ + privacy(); /** * Configuration and settings @@ -132,7 +122,7 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) alwaysVideoFlag = true; /* Set the other interface settings */ - //FIXME I don't like that code + //TODO: I don't like that code visualSelectorEnabled = settings->value( "visual-selector", false ).toBool(); notificationEnabled = config_GetInt( p_intf, "qt-notification" ) ? true : false; @@ -146,11 +136,12 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) /* Create a Dock to get the playlist */ dockPL = new QDockWidget( qtr( "Playlist" ), this ); dockPL->setSizePolicy( QSizePolicy::Preferred, - QSizePolicy::MinimumExpanding ); + QSizePolicy::Expanding ); dockPL->setFeatures( QDockWidget::AllDockWidgetFeatures ); dockPL->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea ); + dockPL->hide(); /************ * Menu Bar @@ -160,10 +151,11 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) /**************** * Status Bar * ****************/ - /* Widgets Creation*/ b_remainingTime = false; timeLabel = new TimeLabel; + timeLabel->setText( " --:--/--:-- " ); + timeLabel->setAlignment( Qt::AlignRight | Qt::AlignVCenter ); nameLabel = new QLabel; nameLabel->setTextInteractionFlags( Qt::TextSelectableByMouse | Qt::TextSelectableByKeyboard ); @@ -175,10 +167,14 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) speedLabel->setFrameStyle( QFrame::Sunken | QFrame::Panel ); nameLabel->setFrameStyle( QFrame::Sunken | QFrame::StyledPanel); + pgBar = new QProgressBar; + pgBar->hide(); + /* and adding those */ statusBar()->addWidget( nameLabel, 8 ); statusBar()->addPermanentWidget( speedLabel, 0 ); - statusBar()->addPermanentWidget( timeLabel, 2 ); + statusBar()->addPermanentWidget( pgBar, 0 ); + statusBar()->addPermanentWidget( timeLabel, 0 ); /* timeLabel behaviour: - double clicking opens the goto time dialog @@ -201,7 +197,8 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) bool b_systrayAvailable = QSystemTrayIcon::isSystemTrayAvailable(); if( config_GetInt( p_intf, "qt-start-minimized") ) { - if( b_systrayAvailable ){ + if( b_systrayAvailable ) + { b_createSystray = true; hide(); //FIXME BUG HERE } @@ -217,24 +214,26 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) if( config_GetInt( p_intf, "qt-minimal-view" ) ) toggleMinimalView(); - /* Init input manager */ + /******************** + * Input Manager * + ********************/ MainInputManager::getInstance( p_intf ); - ON_TIMEOUT( updateOnTimer() ); - //ON_TIMEOUT( debug() ):; /******************** * Various CONNECTs * ********************/ - /* Connect the input manager to the GUI elements it manages */ + /* It is also connected to the control->slider, see the ControlsWidget */ CONNECT( THEMIM->getIM(), positionUpdated( float, int, int ), this, setDisplayPosition( float, int, int ) ); - + /* Change the SpeedRate in the Status */ CONNECT( THEMIM->getIM(), rateChanged( int ), this, setRate( int ) ); /** * Connects on nameChanged() + * Those connects are not merged because different options can trigger + * them down. */ /* Naming in the controller statusbar */ CONNECT( THEMIM->getIM(), nameChanged( QString ), this, @@ -252,7 +251,9 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) setVLCWindowsTitle( QString ) ); } - /** CONNECTS on PLAY_STATUS **/ + /** + * CONNECTS on PLAY_STATUS + **/ /* Status on the main controller */ CONNECT( THEMIM->getIM(), statusChanged( int ), this, setStatus( int ) ); /* and in the systray */ @@ -262,6 +263,11 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) updateSystrayTooltipStatus( int ) ); } + /** OnTimeOut **/ + // TODO + ON_TIMEOUT( updateOnTimer() ); + //ON_TIMEOUT( debug() ); + /** * Callbacks **/ @@ -279,26 +285,57 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) vlc_object_release( p_playlist ); } + /* VideoWidget connect mess to avoid different threads speaking to each other */ CONNECT( this, askReleaseVideo( void * ), this, releaseVideoSlot( void * ) ); + CONNECT( this, askVideoToResize( unsigned int, unsigned int ), + videoWidget, SetSizing( unsigned int, unsigned int ) ); + CONNECT( this, askUpdate(), this, doComponentsUpdate() ); CONNECT( dockPL, topLevelChanged( bool ), this, doComponentsUpdate() ); - // DEBUG FIXME - hide(); + CONNECT( controls, advancedControlsToggled( bool ), + this, doComponentsUpdate() ); - updateGeometry(); + move( settings->value( "pos", QPoint( 0, 0 ) ).toPoint() ); + + QSize newSize = settings->value( "size", QSize( 350, 60 ) ).toSize(); + if( newSize.isValid() ) + { + resize( newSize ); + } + else + { + msg_Warn( p_intf, "Invalid size in constructor" ); + } + + int tgPlay = settings->value( "playlist-visible", 0 ).toInt(); settings->endGroup(); + + if( tgPlay ) + { + togglePlaylist(); + } + + updateGeometry(); + } MainInterface::~MainInterface() { + msg_Dbg( p_intf, "Destroying the main interface" ); + if( playlistWidget ) playlistWidget->savingSettings( settings ); if( ExtendedDialog::exists() ) ExtendedDialog::getInstance( p_intf )->savingSettings(); settings->beginGroup( "MainWindow" ); - settings->setValue( "playlist-floats", dockPL->isFloating() ); - settings->setValue( "adv-controls", getControlsVisibilityStatus() & CONTROLS_ADVANCED ); + settings->setValue( "playlist-floats", (int)(dockPL->isFloating()) ); + settings->setValue( "playlist-visible", (int)playlistVisible ); + settings->setValue( "adv-controls", + getControlsVisibilityStatus() & CONTROLS_ADVANCED ); settings->setValue( "pos", pos() ); + settings->setValue( "size", size() ); + if( bgWidget ) + settings->setValue( "backgroundSize", bgWidget->size() ); settings->endGroup(); delete settings; @@ -319,6 +356,7 @@ MainInterface::~MainInterface() p_intf->pf_request_window = NULL; p_intf->pf_release_window = NULL; p_intf->pf_control_window = NULL; + p_intf->p_sys->p_mi = NULL; } /***************************** @@ -350,6 +388,7 @@ void MainInterface::handleMainUi( QSettings *settings ) /* Margins, spacing */ main->setContentsMargins( 0, 0, 0, 0 ); + // main->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Maximum ); mainLayout->setMargin( 0 ); /* Create the CONTROLS Widget */ @@ -381,9 +420,8 @@ void MainInterface::handleMainUi( QSettings *settings ) if( alwaysVideoFlag ) { bgWidget = new BackgroundWidget( p_intf ); - bgWidget->widgetSize = settings->value( "backgroundSize", - QSize( 300, 200 ) ).toSize(); - bgWidget->resize( bgWidget->widgetSize ); + bgWidget->resize( + settings->value( "backgroundSize", QSize( 300, 150 ) ).toSize() ); bgWidget->updateGeometry(); mainLayout->insertWidget( 0, bgWidget ); CONNECT( this, askBgWidgetToToggle(), bgWidget, toggle() ); @@ -392,8 +430,6 @@ void MainInterface::handleMainUi( QSettings *settings ) if( videoEmbeddedFlag ) { videoWidget = new VideoWidget( p_intf ); - videoWidget->widgetSize = QSize( 1, 1 ); - //videoWidget->resize( videoWidget->widgetSize ); mainLayout->insertWidget( 0, videoWidget ); p_intf->pf_request_window = ::DoRequest; @@ -405,6 +441,29 @@ void MainInterface::handleMainUi( QSettings *settings ) updateGeometry(); } +inline void MainInterface::privacy() +{ + /** + * Ask for the network policy on FIRST STARTUP + **/ + if( config_GetInt( p_intf, "qt-privacy-ask") ) + { + QList controls; + if( privacyDialog( controls ) == QDialog::Accepted ) + { + QList::Iterator i; + for( i = controls.begin() ; i != controls.end() ; i++ ) + { + ConfigControl *c = qobject_cast(*i); + c->doApply( p_intf ); + } + + config_PutInt( p_intf, "qt-privacy-ask" , 0 ); + config_SaveConfigFile( p_intf, NULL ); + } + } +} + int MainInterface::privacyDialog( QList controls ) { QDialog *privacy = new QDialog( this ); @@ -417,13 +476,12 @@ int MainInterface::privacyDialog( QList controls ) QGridLayout *blablaLayout = new QGridLayout( blabla ); QLabel *text = new QLabel( qtr( "

The VideoLAN Team doesn't like when an application goes " - "online without authorisation.

\n " + "online without authorization.

\n " "

VLC media player can request limited information on " - "Internet, espically to get CD Covers and songs metadata or to know " + "the Internet, especially to get CD covers and songs metadata or to know " "if updates are available.

\n" "

VLC media player DOES NOT send or collect ANY " - "information, even anonymously about your " - "usage.

\n" + "information, even anonymously, about your usage.

\n" "

Therefore please check the following options, the default being " "almost no access on the web.

\n") ); text->setWordWrap( true ); @@ -460,8 +518,9 @@ int MainInterface::privacyDialog( QList controls ) CONFIG_GENERIC( "album-art", IntegerList ); line++; CONFIG_GENERIC_NOBOOL( "fetch-meta", Bool ); line++; +#ifdef UPDATE_CHECK CONFIG_GENERIC_NOBOOL( "qt-updates-notif", Bool ); - +#endif QPushButton *ok = new QPushButton( qtr( "Ok" ) ); gLayout->addWidget( ok, 2, 2 ); @@ -473,8 +532,8 @@ int MainInterface::privacyDialog( QList controls ) //FIXME remove me at the end... void MainInterface::debug() { - msg_Dbg( p_intf, "size: %i - %i", controls->size().height(), controls->size().width() ); - msg_Dbg( p_intf, "sizeHint: %i - %i", controls->sizeHint().height(), controls->sizeHint().width() ); + msg_Dbg( p_intf, "size: %i - %i", size().height(), size().width() ); + msg_Dbg( p_intf, "sizeHint: %i - %i", sizeHint().height(), sizeHint().width() ); } /********************************************************************** @@ -487,22 +546,38 @@ void MainInterface::debug() the skins. Maybe the other solution is to redefine the sizeHint() of the playlist and ask _parent->isFloating()... - If you think this would be better, please FIX it... + If you think this would be better, please FIXME it... */ QSize MainInterface::sizeHint() const { - QSize tempSize = controls->sizeHint() + - QSize( 100, menuBar()->size().height() + statusBar()->size().height() ); - + int nwidth = controls->sizeHint().width(); + int nheight = controls->isVisible() ? + controls->size().height() + + menuBar()->size().height() + + statusBar()->size().height() + : 0 ; + + msg_Dbg( p_intf, "1 %i %i", nheight, nwidth ); if( VISIBLE( bgWidget ) ) - tempSize += bgWidget->sizeHint(); + { + nheight += bgWidget->size().height(); + nwidth = bgWidget->size().width(); + msg_Dbg( p_intf, "1b %i %i", nheight, nwidth ); + } else if( videoIsActive ) - tempSize += videoWidget->size(); - - if( !dockPL->isFloating() && dockPL->widget() ) - tempSize += dockPL->widget()->size(); - - return tempSize; + { + nheight += videoWidget->size().height(); + nwidth = videoWidget->size().width(); + msg_Dbg( p_intf, "2 %i %i", nheight, nwidth ); + } + if( !dockPL->isFloating() && dockPL->isVisible() && dockPL->widget() ) + { + nheight += dockPL->size().height(); + nwidth = __MAX( nwidth, dockPL->size().width() ); + msg_Dbg( p_intf, "3 %i %i", nheight, nwidth ); + } + msg_Dbg( p_intf, "4 %i %i", nheight, nwidth ); + return QSize( nwidth, nheight ); } #if 0 @@ -519,7 +594,6 @@ void MainInterface::resizeEvent( QResizeEvent *e ) } if( VISIBLE( playlistWidget ) ) { - //FIXME // SET_WH( playlistWidget , e->size().width() - addSize.width(), // e->size().height() - addSize.height() ); playlistWidget->updateGeometry(); @@ -533,7 +607,7 @@ void MainInterface::resizeEvent( QResizeEvent *e ) void MainInterface::showSpeedMenu( QPoint pos ) { speedControlMenu->exec( QCursor::pos() - pos - + QPoint( 0, speedLabel->height() ) ); + + QPoint( 0, speedLabel->height() ) ); } /**************************************************************************** @@ -555,36 +629,41 @@ private: bool onTop; }; +/* function called from ::DoRequest in order to show a nice VideoWidget + at the good size */ void *MainInterface::requestVideo( vout_thread_t *p_nvout, int *pi_x, int *pi_y, unsigned int *pi_width, unsigned int *pi_height ) { + bool bgWasVisible = false; + + /* Request the videoWidget */ void *ret = videoWidget->request( p_nvout,pi_x, pi_y, pi_width, pi_height ); - if( ret ) + if( ret ) /* The videoWidget is available */ { - videoIsActive = true; - bool bgWasVisible = false; - - /* Did we have a bg ? */ + /* Did we have a bg ? Hide it! */ if( VISIBLE( bgWidget) ) { bgWasVisible = true; emit askBgWidgetToToggle(); } - if( THEMIM->getIM()->hasVideo() || !bgWasVisible ) + /*if( THEMIM->getIM()->hasVideo() || !bgWasVisible ) { videoWidget->widgetSize = QSize( *pi_width, *pi_height ); } else /* Background widget available, use its size */ - { + /*{ /* Ok, our visualizations are bad, so don't do this for the moment * use the requested size anyway */ // videoWidget->widgetSize = bgWidget->widgeTSize; - videoWidget->widgetSize = QSize( *pi_width, *pi_height ); - } - videoWidget->updateGeometry(); // Needed for deinterlace - updateGeometry(); + /* videoWidget->widgetSize = QSize( *pi_width, *pi_height ); + }*/ + + videoIsActive = true; + + emit askVideoToResize( *pi_width, *pi_height ); + emit askUpdate(); } return ret; } @@ -599,11 +678,11 @@ void MainInterface::releaseVideoSlot( void *p_win ) videoWidget->release( p_win ); videoWidget->hide(); - if( bgWidget ) + if( bgWidget )// WORONG bgWidget->show(); videoIsActive = false; - updateGeometry(); + emit askUpdate(); } int MainInterface::controlVideo( void *p_window, int i_query, va_list args ) @@ -615,8 +694,8 @@ int MainInterface::controlVideo( void *p_window, int i_query, va_list args ) { unsigned int *pi_width = va_arg( args, unsigned int * ); unsigned int *pi_height = va_arg( args, unsigned int * ); - *pi_width = videoWidget->widgetSize.width(); - *pi_height = videoWidget->widgetSize.height(); + *pi_width = videoWidget->width(); + *pi_height = videoWidget->height(); i_ret = VLC_SUCCESS; break; } @@ -624,8 +703,8 @@ int MainInterface::controlVideo( void *p_window, int i_query, va_list args ) { unsigned int i_width = va_arg( args, unsigned int ); unsigned int i_height = va_arg( args, unsigned int ); - videoWidget->widgetSize = QSize( i_width, i_height ); - videoWidget->updateGeometry(); + emit askVideoToResize( i_width, i_height ); + emit askUpdate(); updateGeometry(); i_ret = VLC_SUCCESS; break; @@ -656,11 +735,7 @@ void MainInterface::togglePlaylist() If no playlist exist, then create one and attach it to the DockPL*/ if( !playlistWidget ) { - msg_Dbg( p_intf, "Creating a new playlist" ); - playlistWidget = new PlaylistWidget( p_intf, settings ); - if( bgWidget ) - CONNECT( playlistWidget, artSet( QString ), - bgWidget, setArt(QString) ); + playlistWidget = new PlaylistWidget( p_intf, settings, dockPL ); /* Add it to the parent DockWidget */ dockPL->setWidget( playlistWidget ); @@ -669,29 +744,37 @@ void MainInterface::togglePlaylist() addDockWidget( Qt::BottomDockWidgetArea, dockPL ); /* Make the playlist floating is requested. Default is not. */ - if( settings->value( "playlist-floats", false ).toBool() ); + settings->beginGroup( "MainWindow" ); + if( settings->value( "playlist-floats", 1 ).toInt() ) { - msg_Dbg( p_intf, "we don't want it inside"); + msg_Dbg( p_intf, "we don't want the playlist inside"); dockPL->setFloating( true ); } + settings->endGroup(); + settings->beginGroup( "playlist" ); + dockPL->move( settings->value( "pos", QPoint( 0,0 ) ).toPoint() ); + QSize newSize = settings->value( "size", QSize( 400, 300 ) ).toSize(); + if( newSize.isValid() ) + dockPL->resize( newSize ); + settings->endGroup(); + + dockPL->show(); + playlistVisible = true; } else { /* toggle the visibility of the playlist */ TOGGLEV( dockPL ); - //resize(sizeHint()); + resize( sizeHint() ); + playlistVisible = !playlistVisible; } -#if 0 - doComponentsUpdate(); -#endif - updateGeometry(); } /* Function called from the menu to undock the playlist */ void MainInterface::undockPlaylist() { dockPL->setFloating( true ); - updateGeometry(); + resize( sizeHint() ); } void MainInterface::toggleMinimalView() @@ -699,13 +782,15 @@ void MainInterface::toggleMinimalView() TOGGLEV( menuBar() ); TOGGLEV( controls ); TOGGLEV( statusBar() ); - updateGeometry(); + doComponentsUpdate(); } /* Video widget cannot do this synchronously as it runs in another thread */ /* Well, could it, actually ? Probably dangerous ... */ void MainInterface::doComponentsUpdate() { + resize( sizeHint() ); + msg_Dbg( p_intf, "Updating the geometry" ); updateGeometry(); } @@ -754,19 +839,18 @@ void MainInterface::setDisplayPosition( float pos, int time, int length ) secstotimestr( psz_time, ( b_remainingTime && length ) ? length - time : time ); - QString title; - title.sprintf( "%s/%s", psz_time, + QString timestr; + timestr.sprintf( "%s/%s", psz_time, ( !length && time ) ? "--:--" : psz_length ); /* Add a minus to remaining time*/ - if( b_remainingTime && length ) timeLabel->setText( " -"+title+" " ); - else timeLabel->setText( " "+title+" " ); + if( b_remainingTime && length ) timeLabel->setText( " -"+timestr+" " ); + else timeLabel->setText( " "+timestr+" " ); } void MainInterface::toggleTimeDisplay() { b_remainingTime = !b_remainingTime; - //b_remainingTime = ( b_remainingTime ? false : true ); } void MainInterface::setName( QString name ) @@ -796,14 +880,13 @@ void MainInterface::setRate( int rate ) speedControl->updateControls( rate ); } -//FIXME Remove this function at the end... void MainInterface::updateOnTimer() { - /* if( intf_ShouldDie( p_intf ) ) + if( intf_ShouldDie( p_intf ) ) { QApplication::closeAllWindows(); QApplication::quit(); - }*/ + } #if 0 if( need_components_update ) { @@ -811,8 +894,6 @@ void MainInterface::updateOnTimer() need_components_update = false; } #endif - - controls->updateOnTimer(); } /***************************************************************************** @@ -825,7 +906,11 @@ void MainInterface::updateOnTimer() **/ void MainInterface::createSystray() { - QIcon iconVLC = QIcon( QPixmap( ":/vlc128.png" ) ); + QIcon iconVLC; + if( QDate::currentDate().dayOfYear() >= 354 ) + iconVLC = QIcon( QPixmap( ":/vlc128-christmas.png" ) ); + else + iconVLC = QIcon( QPixmap( ":/vlc128.png" ) ); sysTray = new QSystemTrayIcon( iconVLC, this ); sysTray->setToolTip( qtr( "VLC media player" )); @@ -1051,9 +1136,15 @@ void MainInterface::wheelEvent( QWheelEvent *e ) void MainInterface::closeEvent( QCloseEvent *e ) { hide(); - vlc_object_kill( p_intf ); - QApplication::closeAllWindows(); - QApplication::quit(); + THEDP->quit(); +} + +void MainInterface::toggleFullScreen( void ) +{ + if( isFullScreen() ) + showNormal(); + else + showFullScreen(); } /***************************************************************************** @@ -1079,6 +1170,7 @@ static int PopupMenuCB( vlc_object_t *p_this, const char *psz_variable, vlc_value_t old_val, vlc_value_t new_val, void *param ) { intf_thread_t *p_intf = (intf_thread_t *)param; + msg_Dbg( p_this, "Menu Requested" ); // DEBUG to track the non disparition of the menu... if( p_intf->pf_show_dialog ) { @@ -1096,6 +1188,7 @@ static int IntfShowCB( vlc_object_t *p_this, const char *psz_variable, vlc_value_t old_val, vlc_value_t new_val, void *param ) { intf_thread_t *p_intf = (intf_thread_t *)param; + msg_Dbg( p_this, "Intf Show Requested" ); // DEBUG to track the non disparition of the menu... //p_intf->p_sys->b_intf_show = VLC_TRUE; return VLC_SUCCESS;