X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fmain_interface.cpp;h=0641b25171ce9fb802d2fc1e95ae26511e662cfb;hb=6fa897afdd9799155c76e3fd4812e5304a51d766;hp=0271969fe1516bb56574d81d86b61e3f77fdec91;hpb=5bc67f89db065e1aadd2eba4d5467de025787c56;p=vlc diff --git a/modules/gui/qt4/main_interface.cpp b/modules/gui/qt4/main_interface.cpp index 0271969fe1..0641b25171 100644 --- a/modules/gui/qt4/main_interface.cpp +++ b/modules/gui/qt4/main_interface.cpp @@ -23,6 +23,10 @@ * 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" #include "input_manager.hpp" @@ -47,9 +51,13 @@ #include #include #include +#if 0 #include +#endif #include #include +#include +#include #include #include @@ -68,38 +76,27 @@ static int IntfShowCB( vlc_object_t *p_this, const char *psz_variable, vlc_value_t old_val, vlc_value_t new_val, void *param ); static int InteractCallback( vlc_object_t *, const char *, vlc_value_t, vlc_value_t, void *); -/* Video handling */ -static void *DoRequest( intf_thread_t *p_intf, vout_thread_t *p_vout, - int *pi1, int *pi2, unsigned int*pi3,unsigned int*pi4) -{ - return p_intf->p_sys->p_mi->requestVideo( p_vout, pi1, pi2, pi3, pi4 ); -} -static void DoRelease( intf_thread_t *p_intf, void *p_win ) -{ - return p_intf->p_sys->p_mi->releaseVideo( p_win ); -} -static int DoControl( intf_thread_t *p_intf, void *p_win, int i_q, va_list a ) -{ - return p_intf->p_sys->p_mi->controlVideo( p_win, i_q, a ); -} MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) { /* Variables initialisation */ // need_components_update = false; - bgWidget = NULL; videoWidget = NULL; playlistWidget = NULL; - videoIsActive = false; - input_name = ""; + bgWidget = NULL; + videoWidget = NULL; + playlistWidget = NULL; + sysTray = NULL; + videoIsActive = false; + playlistVisible = false; + input_name = ""; + fullscreenControls = NULL; /* Ask for privacy */ - privacy(); + askForPrivacy(); /** * Configuration and settings + * Pre-building of interface **/ - settings = new QSettings( "vlc", "vlc-qt-interface" ); - settings->beginGroup( "MainWindow" ); - /* Main settings */ setFocusPolicy( Qt::StrongFocus ); setAcceptDrops( true ); @@ -107,19 +104,18 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) setWindowOpacity( config_GetFloat( p_intf, "qt-opacity" ) ); /* Set The Video In emebedded Mode or not */ - videoEmbeddedFlag = false; - if( config_GetInt( p_intf, "embedded-video" ) ) videoEmbeddedFlag = true; + videoEmbeddedFlag = config_GetInt( p_intf, "embedded-video" ); /* Are we in the enhanced always-video mode or not ? */ - alwaysVideoFlag = false; - if( videoEmbeddedFlag && config_GetInt( p_intf, "qt-always-video" ) ) - alwaysVideoFlag = true; + i_visualmode = config_GetInt( p_intf, "qt-display-mode" ); /* Set the other interface settings */ + settings = getSettings(); + settings->beginGroup( "MainWindow" ); + //TODO: I don't like that code visualSelectorEnabled = settings->value( "visual-selector", false ).toBool(); - notificationEnabled = config_GetInt( p_intf, "qt-notification" ) - ? true : false; + notificationEnabled = (bool)config_GetInt( p_intf, "qt-notification" ); /************************** * UI and Widgets design @@ -127,6 +123,7 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) setVLCWindowsTitle(); handleMainUi( settings ); +#if 0 /* Create a Dock to get the playlist */ dockPL = new QDockWidget( qtr( "Playlist" ), this ); dockPL->setSizePolicy( QSizePolicy::Preferred, @@ -136,79 +133,25 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea ); dockPL->hide(); +#endif /************ * Menu Bar ************/ QVLCMenu::createMenuBar( this, p_intf, visualSelectorEnabled ); - /**************** - * Status Bar * - ****************/ - /* Widgets Creation*/ - b_remainingTime = false; - timeLabel = new TimeLabel; - nameLabel = new QLabel; - nameLabel->setTextInteractionFlags( Qt::TextSelectableByMouse - | Qt::TextSelectableByKeyboard ); - speedLabel = new QLabel( "1.00x" ); - speedLabel->setContextMenuPolicy ( Qt::CustomContextMenu ); - - /* Styling those labels */ - timeLabel->setFrameStyle( QFrame::Sunken | QFrame::Panel ); - speedLabel->setFrameStyle( QFrame::Sunken | QFrame::Panel ); - nameLabel->setFrameStyle( QFrame::Sunken | QFrame::StyledPanel); - - /* and adding those */ - statusBar()->addWidget( nameLabel, 8 ); - statusBar()->addPermanentWidget( speedLabel, 0 ); - statusBar()->addPermanentWidget( timeLabel, 2 ); - - /* timeLabel behaviour: - - double clicking opens the goto time dialog - - right-clicking and clicking just toggle between remaining and - elapsed time.*/ - CONNECT( timeLabel, timeLabelClicked(), this, toggleTimeDisplay() ); - CONNECT( timeLabel, timeLabelDoubleClicked(), THEDP, gotoTimeDialog() ); - CONNECT( timeLabel, timeLabelDoubleClicked(), this, toggleTimeDisplay() ); - - /* Speed Label behaviour: - - right click gives the vertical speed slider */ - CONNECT( speedLabel, customContextMenuRequested( QPoint ), - this, showSpeedMenu( QPoint ) ); - - /********************** - * Systray Management * - **********************/ - sysTray = NULL; - bool b_createSystray = false; - bool b_systrayAvailable = QSystemTrayIcon::isSystemTrayAvailable(); - if( config_GetInt( p_intf, "qt-start-minimized") ) - { - if( b_systrayAvailable ){ - b_createSystray = true; - hide(); //FIXME BUG HERE - } - else msg_Warn( p_intf, "You can't minize if you haven't a system " - "tray bar" ); - } - if( config_GetInt( p_intf, "qt-system-tray") ) - b_createSystray = true; - - if( b_systrayAvailable && b_createSystray ) - createSystray(); + /* StatusBar Creation */ + createStatusBar(); - if( config_GetInt( p_intf, "qt-minimal-view" ) ) - toggleMinimalView(); /******************** * Input Manager * ********************/ MainInputManager::getInstance( p_intf ); - /******************** - * Various CONNECTs * - ********************/ + /************************** + * Various CONNECTs on IM * + **************************/ /* Connect the input manager to the GUI elements it manages */ /* It is also connected to the control->slider, see the ControlsWidget */ @@ -250,8 +193,12 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) updateSystrayTooltipStatus( int ) ); } + /* END CONNECTS ON IM */ + + /** OnTimeOut **/ - // TODO + /* TODO Remove this function, but so far, there is no choice because there + is no intf-should-die variable */ ON_TIMEOUT( updateOnTimer() ); //ON_TIMEOUT( debug() ); @@ -260,71 +207,149 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) **/ var_Create( p_intf, "interaction", VLC_VAR_ADDRESS ); var_AddCallback( p_intf, "interaction", InteractCallback, this ); - p_intf->b_interaction = VLC_TRUE; + p_intf->b_interaction = true; + + var_AddCallback( p_intf->p_libvlc, "intf-show", IntfShowCB, p_intf ); /* Register callback for the intf-popupmenu variable */ - playlist_t *p_playlist = (playlist_t *)vlc_object_find( p_intf, - VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); - if( p_playlist != NULL ) - { - var_AddCallback( p_playlist, "intf-popupmenu", PopupMenuCB, p_intf ); - var_AddCallback( p_playlist, "intf-show", IntfShowCB, p_intf ); - vlc_object_release( p_playlist ); - } + var_AddCallback( p_intf->p_libvlc, "intf-popupmenu", PopupMenuCB, p_intf ); /* 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, askReleaseVideo( void * ), + this, releaseVideoSlot( void * ) ); + if( videoWidget ) + CONNECT( this, askVideoToResize( unsigned int, unsigned int ), + videoWidget, SetSizing( unsigned int, unsigned int ) ); + CONNECT( this, askUpdate(), this, doComponentsUpdate() ); - CONNECT( dockPL, topLevelChanged( bool ), this, doComponentsUpdate() ); - CONNECT( controls, advancedControlsToggled( bool ), - this, doComponentsUpdate() ); + /* Size and placement of interface */ + QVLCTools::restoreWidgetPosition( settings, this, QSize(380, 60) ); - resize( settings->value( "size", QSize( 350, 60 ) ).toSize() ); - updateGeometry(); + + /* Playlist */ + if( settings->value( "playlist-visible", 0 ).toInt() ) togglePlaylist(); settings->endGroup(); + + show(); + + if( i_visualmode == QT_MINIMAL_MODE ) + toggleMinimalView(); + + /* Update the geometry TODO: is it useful ?*/ + updateGeometry(); + + /***************************************************** + * End everything by creating the Systray Management * + *****************************************************/ + initSystray(); } MainInterface::~MainInterface() { - if( playlistWidget ) playlistWidget->savingSettings( settings ); - if( ExtendedDialog::exists() ) - ExtendedDialog::getInstance( p_intf )->savingSettings(); + msg_Dbg( p_intf, "Destroying the main interface" ); + + if( playlistWidget ) + playlistWidget->savingSettings(); settings->beginGroup( "MainWindow" ); - settings->setValue( "playlist-floats", dockPL->isFloating() ); + + // 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( !videoIsActive ) + QVLCTools::saveWidgetPosition(settings, this); + + if( bgWidget ) + settings->setValue( "backgroundSize", bgWidget->size() ); settings->endGroup(); - delete settings; + + var_DelCallback( p_intf->p_libvlc, "intf-show", IntfShowCB, p_intf ); /* Unregister callback for the intf-popupmenu variable */ - playlist_t *p_playlist = (playlist_t *)vlc_object_find( p_intf, - VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); - if( p_playlist != NULL ) - { - var_DelCallback( p_playlist, "intf-popupmenu", PopupMenuCB, p_intf ); - var_DelCallback( p_playlist, "intf-show", IntfShowCB, p_intf ); - vlc_object_release( p_playlist ); - } + var_DelCallback( p_intf->p_libvlc, "intf-popupmenu", PopupMenuCB, p_intf ); - p_intf->b_interaction = VLC_FALSE; + p_intf->b_interaction = false; var_DelCallback( p_intf, "interaction", InteractCallback, this ); - 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; } /***************************** * Main UI handling * *****************************/ +inline void MainInterface::createStatusBar() +{ + /**************** + * Status Bar * + ****************/ + /* Widgets Creation*/ + b_remainingTime = false; + timeLabel = new TimeLabel; + timeLabel->setText( " --:--/--:-- " ); + timeLabel->setAlignment( Qt::AlignRight | Qt::AlignVCenter ); + timeLabel->setToolTip( qtr( "Toggle between elapsed and remaining time" ) ); + nameLabel = new QLabel; + nameLabel->setTextInteractionFlags( Qt::TextSelectableByMouse + | Qt::TextSelectableByKeyboard ); + speedLabel = new SpeedLabel( p_intf, "1.00x" ); + speedLabel->setToolTip( + qtr( "Current playback speed.\nRight click to adjust" ) ); + speedLabel->setContextMenuPolicy ( Qt::CustomContextMenu ); + + /* Styling those labels */ + timeLabel->setFrameStyle( QFrame::Sunken | QFrame::Panel ); + 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( pgBar, 0 ); + statusBar()->addPermanentWidget( timeLabel, 0 ); + + /* timeLabel behaviour: + - double clicking opens the goto time dialog + - right-clicking and clicking just toggle between remaining and + elapsed time.*/ + CONNECT( timeLabel, timeLabelClicked(), this, toggleTimeDisplay() ); + CONNECT( timeLabel, timeLabelDoubleClicked(), THEDP, gotoTimeDialog() ); + CONNECT( timeLabel, timeLabelDoubleClicked(), this, toggleTimeDisplay() ); + + /* Speed Label behaviour: + - right click gives the vertical speed slider */ + CONNECT( speedLabel, customContextMenuRequested( QPoint ), + this, showSpeedMenu( QPoint ) ); +} + +inline void MainInterface::initSystray() +{ + bool b_createSystray = false; + bool b_systrayAvailable = QSystemTrayIcon::isSystemTrayAvailable(); + if( config_GetInt( p_intf, "qt-start-minimized") ) + { + if( b_systrayAvailable ) + { + b_createSystray = true; + hide(); + } + else msg_Err( p_intf, "You can't minimize if you haven't a system " + "tray bar" ); + } + if( config_GetInt( p_intf, "qt-system-tray") ) + b_createSystray = true; + + if( b_systrayAvailable && b_createSystray ) + createSystray(); +} + /** * Give the decorations of the Main Window a correct Name. * If nothing is given, set it to VLC... @@ -350,17 +375,30 @@ void MainInterface::handleMainUi( QSettings *settings ) /* Margins, spacing */ main->setContentsMargins( 0, 0, 0, 0 ); - // main->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Maximum ); + main->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Maximum ); + mainLayout->setSpacing( 0 ); mainLayout->setMargin( 0 ); /* Create the CONTROLS Widget */ - /* bool b_shiny = config_GetInt( p_intf, "qt-blingbling" ); */ + bool b_shiny = config_GetInt( p_intf, "qt-blingbling" ); controls = new ControlsWidget( p_intf, this, settings->value( "adv-controls", false ).toBool(), - config_GetInt( p_intf, "qt-blingbling" ) ); + b_shiny ); + CONNECT( controls, advancedControlsToggled( bool ), + this, doComponentsUpdate() ); + + /* Create the FULLSCREEN CONTROLS Widget */ + if( config_GetInt( p_intf, "qt-fs-controller" ) ) + { + fullscreenControls = new FullscreenControllerWidget( p_intf, this, + settings->value( "adv-controls", false ).toBool(), + b_shiny ); + CONNECT( fullscreenControls, advancedControlsToggled( bool ), + this, doComponentsUpdate() ); + } /* Add the controls Widget to the main Widget */ - mainLayout->insertWidget( 0, controls ); + mainLayout->insertWidget( 0, controls, 0, Qt::AlignBottom ); /* Create the Speed Control Widget */ speedControl = new SpeedControlWidget( p_intf ); @@ -378,41 +416,37 @@ void MainInterface::handleMainUi( QSettings *settings ) visualSelector->hide(); #endif - /* And video Outputs */ - if( alwaysVideoFlag ) + /* Bg Cone */ + bgWidget = new BackgroundWidget( p_intf ); + bgWidget->resize( + settings->value( "backgroundSize", QSize( 300, 200 ) ).toSize() ); + bgWidget->updateGeometry(); + mainLayout->insertWidget( 0, bgWidget ); + CONNECT( this, askBgWidgetToToggle(), bgWidget, toggle() ); + + if( i_visualmode != QT_ALWAYS_VIDEO_MODE && + i_visualmode != QT_MINIMAL_MODE ) { - bgWidget = new BackgroundWidget( p_intf ); - bgWidget->widgetSize = settings->value( "backgroundSize", - QSize( 300, 200 ) ).toSize(); - bgWidget->resize( bgWidget->widgetSize ); - bgWidget->updateGeometry(); - mainLayout->insertWidget( 0, bgWidget ); - CONNECT( this, askBgWidgetToToggle(), bgWidget, toggle() ); + bgWidget->hide(); } + /* And video Outputs */ if( videoEmbeddedFlag ) { videoWidget = new VideoWidget( p_intf ); - //videoWidget->widgetSize = QSize( 16, 16 ); - //videoWidget->hide(); - //videoWidget->resize( videoWidget->widgetSize ); - mainLayout->insertWidget( 0, videoWidget ); - - p_intf->pf_request_window = ::DoRequest; - p_intf->pf_release_window = ::DoRelease; - p_intf->pf_control_window = ::DoControl; + mainLayout->insertWidget( 0, videoWidget, 10 ); } /* Finish the sizing */ - updateGeometry(); + main->updateGeometry(); } -inline void MainInterface::privacy() +inline void MainInterface::askForPrivacy() { /** * Ask for the network policy on FIRST STARTUP **/ - if( config_GetInt( p_intf, "privacy-ask") ) + if( config_GetInt( p_intf, "qt-privacy-ask") ) { QList controls; if( privacyDialog( controls ) == QDialog::Accepted ) @@ -424,7 +458,8 @@ inline void MainInterface::privacy() c->doApply( p_intf ); } - config_PutInt( p_intf, "privacy-ask" , 0 ); + config_PutInt( p_intf, "qt-privacy-ask" , 0 ); + /* We have to save here because the user may not launch Prefs */ config_SaveConfigFile( p_intf, NULL ); } } @@ -432,9 +467,9 @@ inline void MainInterface::privacy() int MainInterface::privacyDialog( QList controls ) { - QDialog *privacy = new QDialog( this ); + QDialog *privacy = new QDialog(); - privacy->setWindowTitle( qtr( "Privacy and Network policies" ) ); + privacy->setWindowTitle( qtr( "Privacy and Network Policies" ) ); QGridLayout *gLayout = new QGridLayout( privacy ); @@ -442,13 +477,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 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 ); @@ -484,10 +518,12 @@ int MainInterface::privacyDialog( QList controls ) } CONFIG_GENERIC( "album-art", IntegerList ); line++; - CONFIG_GENERIC_NOBOOL( "fetch-meta", Bool ); line++; - CONFIG_GENERIC_NOBOOL( "qt-updates-notif", Bool ); +#ifdef UPDATE_CHECK + CONFIG_GENERIC_NOBOOL( "qt-updates-notif", Bool ); line++; + CONFIG_GENERIC_NOBOOL( "qt-updates-days", Integer ); line++; +#endif - QPushButton *ok = new QPushButton( qtr( "Ok" ) ); + QPushButton *ok = new QPushButton( qtr( "OK" ) ); gLayout->addWidget( ok, 2, 2 ); @@ -495,12 +531,6 @@ int MainInterface::privacyDialog( QList controls ) return privacy->exec(); } -//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() ); -} /********************************************************************** * Handling of sizing of the components @@ -514,18 +544,22 @@ void MainInterface::debug() ask _parent->isFloating()... If you think this would be better, please FIXME it... */ +#if 0 QSize MainInterface::sizeHint() const { - int nwidth = controls->sizeHint().width(); - int nheight = controls->sizeHint().height(); - + 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 ) ) { nheight += bgWidget->size().height(); nwidth = bgWidget->size().width(); + msg_Dbg( p_intf, "1b %i %i", nheight, nwidth ); } else if( videoIsActive ) { @@ -533,16 +567,16 @@ QSize MainInterface::sizeHint() const nwidth = videoWidget->size().width(); msg_Dbg( p_intf, "2 %i %i", nheight, nwidth ); } - if( !dockPL->isFloating() && dockPL->widget() ) +/* if( !dockPL->isFloating() && dockPL->isVisible() && dockPL->widget() ) { nheight += dockPL->size().height(); - nwidth = MAX( nwidth, dockPL->size().width() ); + 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 ); } - +#endif #if 0 /* FIXME This is dead code and need to be removed AT THE END */ void MainInterface::resizeEvent( QResizeEvent *e ) @@ -564,6 +598,25 @@ void MainInterface::resizeEvent( QResizeEvent *e ) } #endif +void MainInterface::requestLayoutUpdate() +{ + emit askUpdate(); +} + +//FIXME remove me at the end... +void MainInterface::debug() +{ + msg_Dbg( p_intf, "size: %i - %i", size().height(), size().width() ); + msg_Dbg( p_intf, "sizeHint: %i - %i", sizeHint().height(), sizeHint().width() ); + if( videoWidget && videoWidget->isVisible() ) + { +// sleep( 10 ); + msg_Dbg( p_intf, "size: %i - %i", size().height(), size().width() ); + msg_Dbg( p_intf, "sizeHint: %i - %i", sizeHint().height(), sizeHint().width() ); + } + adjustSize(); +} + /**************************************************************************** * Small right-click menu for rate control ****************************************************************************/ @@ -592,13 +645,17 @@ private: bool onTop; }; -/* function called from ::DoRequest in order to show a nice VideoWidget - at the good size */ +/** + * README + * README + * Thou shall not call/resize/hide widgets from on another thread. + * This is wrong, and this is TEH reason to emit signals on those Video Functions + **/ 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; + bgWasVisible = false; /* Request the videoWidget */ void *ret = videoWidget->request( p_nvout,pi_x, pi_y, pi_width, pi_height ); @@ -610,29 +667,32 @@ void *MainInterface::requestVideo( vout_thread_t *p_nvout, int *pi_x, bgWasVisible = true; emit askBgWidgetToToggle(); } - - /*if( THEMIM->getIM()->hasVideo() || !bgWasVisible ) +#if 0 + 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->widgetSize = QSize( *pi_width, *pi_height ); + } +#endif videoIsActive = true; - emit askVideoToResize( *pi_width, *pi_height ); +// emit askVideoToResize( *pi_width, *pi_height ); emit askUpdate(); + + if( fullscreenControls ) fullscreenControls->attachVout( p_nvout ); } return ret; } -void MainInterface::releaseVideo( void *p_win ) +void MainInterface::releaseVideo( vout_thread_t *p_vout, void *p_win ) { + if( fullscreenControls ) fullscreenControls->detachVout( p_vout ); emit askReleaseVideo( p_win ); } @@ -641,25 +701,27 @@ void MainInterface::releaseVideoSlot( void *p_win ) videoWidget->release( p_win ); videoWidget->hide(); - if( bgWidget )// WORONG + if( bgWasVisible ) + { + bgWasVisible = false; bgWidget->show(); + } + adjustSize(); videoIsActive = false; - emit askUpdate(); } int MainInterface::controlVideo( void *p_window, int i_query, va_list args ) { - int i_ret = VLC_EGENERIC; + int i_ret = VLC_SUCCESS; switch( i_query ) { case VOUT_GET_SIZE: { 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(); - i_ret = VLC_SUCCESS; + *pi_width = videoWidget->videoSize.width(); + *pi_height = videoWidget->videoSize.height(); break; } case VOUT_SET_SIZE: @@ -668,18 +730,16 @@ int MainInterface::controlVideo( void *p_window, int i_query, va_list args ) unsigned int i_height = va_arg( args, unsigned int ); emit askVideoToResize( i_width, i_height ); emit askUpdate(); - updateGeometry(); - i_ret = VLC_SUCCESS; break; } case VOUT_SET_STAY_ON_TOP: { int i_arg = va_arg( args, int ); QApplication::postEvent( this, new SetVideoOnTopQtEvent( i_arg ) ); - i_ret = VLC_SUCCESS; break; } default: + i_ret = VLC_EGENERIC; msg_Warn( p_intf, "unsupported control query" ); break; } @@ -694,11 +754,13 @@ int MainInterface::controlVideo( void *p_window, int i_query, va_list args ) **/ void MainInterface::togglePlaylist() { + THEDP->playlistDialog(); +#if 0 /* CREATION If no playlist exist, then create one and attach it to the DockPL*/ if( !playlistWidget ) { - playlistWidget = new PlaylistWidget( p_intf, settings ); + playlistWidget = new PlaylistWidget( p_intf, settings, dockPL ); /* Add it to the parent DockWidget */ dockPL->setWidget( playlistWidget ); @@ -707,38 +769,54 @@ void MainInterface::togglePlaylist() addDockWidget( Qt::BottomDockWidgetArea, dockPL ); /* Make the playlist floating is requested. Default is not. */ - //FIXME - 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 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(); + #endif } /* Function called from the menu to undock the playlist */ void MainInterface::undockPlaylist() { - dockPL->setFloating( true ); - updateGeometry(); +// dockPL->setFloating( true ); + adjustSize(); } void MainInterface::toggleMinimalView() { + /* HACK for minimalView, see menus.cpp */ + if( !menuBar()->isVisible() ) QVLCMenu::minimalViewAction->toggle(); + if( i_visualmode != QT_ALWAYS_VIDEO_MODE && + i_visualmode != QT_MINIMAL_MODE ) + { + emit askBgWidgetToToggle(); + } + TOGGLEV( menuBar() ); TOGGLEV( controls ); TOGGLEV( statusBar() ); - updateGeometry(); + doComponentsUpdate(); } /* Video widget cannot do this synchronously as it runs in another thread */ @@ -746,8 +824,8 @@ void MainInterface::toggleMinimalView() void MainInterface::doComponentsUpdate() { msg_Dbg( p_intf, "Updating the geometry" ); - updateGeometry(); - resize( sizeHint() ); +// resize( sizeHint() ); + debug(); } /* toggling advanced controls buttons */ @@ -795,13 +873,13 @@ 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() @@ -820,8 +898,20 @@ void MainInterface::setName( QString name ) void MainInterface::setStatus( int status ) { + msg_Dbg( p_intf, "I was here, updating your status" ); + /* Forward the status to the controls to toggle Play/Pause */ controls->setStatus( status ); + controls->updateInput(); + + if( fullscreenControls ) + { + fullscreenControls->setStatus( status ); + fullscreenControls->updateInput(); + } + + speedControl->setEnable( THEMIM->getIM()->hasInput() ); + /* And in the systray for the menu */ if( sysTray ) QVLCMenu::updateSystrayMenu( this, p_intf ); @@ -833,25 +923,18 @@ void MainInterface::setRate( int rate ) str.setNum( ( 1000 / (double)rate ), 'f', 2 ); str.append( "x" ); speedLabel->setText( str ); + speedLabel->setToolTip( str ); speedControl->updateControls( rate ); } void MainInterface::updateOnTimer() { -#if 0 + /* No event for dying */ if( intf_ShouldDie( p_intf ) ) { QApplication::closeAllWindows(); QApplication::quit(); } - if( need_components_update ) - { - doComponentsUpdate(); - need_components_update = false; - } -#endif - - controls->updateOnTimer(); } /***************************************************************************** @@ -864,7 +947,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" )); @@ -1002,7 +1089,7 @@ void MainInterface::dropEvent(QDropEvent *event) { if( input_AddSubtitles( THEMIM->getInput(), qtu( mimeData->urls()[0].toString() ), - VLC_TRUE ) ) + true ) ) { event->acceptProposedAction(); return; @@ -1010,12 +1097,13 @@ void MainInterface::dropEvent(QDropEvent *event) } } bool first = true; - foreach( QUrl url, mimeData->urls() ) { - QString s = url.toString(); + foreach( QUrl url, mimeData->urls() ) + { + QString s = url.toLocalFile(); if( s.length() > 0 ) { playlist_Add( THEPL, qtu(s), NULL, PLAYLIST_APPEND | (first ? PLAYLIST_GO:0), - PLAYLIST_END, VLC_TRUE, VLC_FALSE ); + PLAYLIST_END, true, false ); first = false; } } @@ -1090,9 +1178,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(); } /***************************************************************************** @@ -1129,13 +1223,13 @@ static int PopupMenuCB( vlc_object_t *p_this, const char *psz_variable, } /***************************************************************************** - * IntfShowCB: callback triggered by the intf-show playlist variable. + * IntfShowCB: callback triggered by the intf-show libvlc variable. *****************************************************************************/ 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; - //p_intf->p_sys->b_intf_show = VLC_TRUE; + p_intf->p_sys->p_mi->requestLayoutUpdate(); return VLC_SUCCESS; }