X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fmain_interface.cpp;h=5f1eb0f6a847e0cf5a280b48e2b447bf204f02b9;hb=10962a57ff7652aba71f606229304558270da095;hp=f5cd1d94cbfb943aa89c840f0f2d6025922a916c;hpb=0fba573281060a64c512de99499d0f71982c42db;p=vlc diff --git a/modules/gui/qt4/main_interface.cpp b/modules/gui/qt4/main_interface.cpp index f5cd1d94cb..5f1eb0f6a8 100644 --- a/modules/gui/qt4/main_interface.cpp +++ b/modules/gui/qt4/main_interface.cpp @@ -28,36 +28,40 @@ #endif #include "qt4.hpp" + #include "main_interface.hpp" #include "input_manager.hpp" -#include "util/qvlcframe.hpp" +#include "actions_manager.hpp" + #include "util/customwidgets.hpp" -#include "dialogs_provider.hpp" +#include "util/qt_dirs.hpp" + #include "components/interface_widgets.hpp" +#include "components/controller.hpp" #include "components/playlist/playlist.hpp" -#include "dialogs/extended.hpp" -#include "dialogs/playlist.hpp" + #include "menus.hpp" +#include "recents.hpp" -#include #include -#include -#include #include + #include -#include #include +#include + #include +#include +#include #include -#include -#include -#include #include -#include +#include #include -#include + +#include /* Wheel event */ #include +#include /* Callback prototypes */ static int PopupMenuCB( vlc_object_t *p_this, const char *psz_variable, @@ -66,6 +70,8 @@ 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 *); +static int DialogCallback( vlc_object_t *, const char *, + vlc_value_t, vlc_value_t, void *); MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) { @@ -79,6 +85,9 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) playlistVisible = false; input_name = ""; fullscreenControls = NULL; +#if 0 + cryptedLabel = NULL; +#endif /* Ask for privacy */ askForPrivacy(); @@ -96,6 +105,9 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) /* Set The Video In emebedded Mode or not */ videoEmbeddedFlag = config_GetInt( p_intf, "embedded-video" ); + /* Does the interface resize to video size or the opposite */ + b_keep_size = !config_GetInt( p_intf, "qt-video-autoresize" ); + /* Are we in the enhanced always-video mode or not ? */ i_visualmode = config_GetInt( p_intf, "qt-display-mode" ); @@ -103,18 +115,34 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) settings = getSettings(); settings->beginGroup( "MainWindow" ); - /* Visualisation, not really used yet */ - visualSelectorEnabled = settings->value( "visual-selector", false).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(); /* Do we want anoying popups or not */ notificationEnabled = (bool)config_GetInt( p_intf, "qt-notification" ); + /************** + * Status Bar * + **************/ + createStatusBar(); + /************************** * UI and Widgets design **************************/ setVLCWindowsTitle(); handleMainUi( settings ); + /************ + * Menu Bar * + ************/ + QVLCMenu::createMenuBar( this, p_intf ); + #if 0 /* Create a Dock to get the playlist */ dockPL = new QDockWidget( qtr( "Playlist" ), this ); @@ -127,14 +155,6 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) dockPL->hide(); #endif - /************************** - * Menu Bar and Status Bar - **************************/ - QVLCMenu::createMenuBar( this, p_intf, visualSelectorEnabled ); - /* StatusBar Creation */ - createStatusBar(); - - /******************** * Input Manager * ********************/ @@ -145,20 +165,14 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) **************************/ /* 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, - setName( QString ) ); + CONNECT( THEMIM->getIM(), nameChanged( QString ), + this, setName( QString ) ); /* and in the systray */ if( sysTray ) { @@ -175,29 +189,26 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) /** * CONNECTS on PLAY_STATUS **/ - /* Status on the main controller */ - CONNECT( THEMIM->getIM(), statusChanged( int ), this, setStatus( int ) ); - /* and in the systray */ + /* Status on the systray */ if( sysTray ) { - CONNECT( THEMIM->getIM(), statusChanged( int ), this, - updateSystrayTooltipStatus( int ) ); + CONNECT( THEMIM->getIM(), statusChanged( int ), + this, updateSystrayTooltipStatus( int ) ); } /* END CONNECTS ON IM */ - /** OnTimeOut **/ - /* TODO Remove this function, but so far, there is no choice because there - is no intf-should-die variable #1365 */ - ON_TIMEOUT( updateOnTimer() ); - /************ * Callbacks ************/ var_Create( p_intf, "interaction", VLC_VAR_ADDRESS ); var_AddCallback( p_intf, "interaction", InteractCallback, this ); - p_intf->b_interaction = true; + interaction_Register( p_intf ); + + var_Create( p_intf, "dialog-fatal", VLC_VAR_ADDRESS ); + var_AddCallback( p_intf, "dialog-fatal", DialogCallback, this ); + dialog_Register( p_intf ); var_AddCallback( p_intf->p_libvlc, "intf-show", IntfShowCB, p_intf ); @@ -206,22 +217,49 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) /* VideoWidget connects to avoid different threads speaking to each other */ - CONNECT( this, askReleaseVideo( void * ), - this, releaseVideoSlot( void * ) ); + connect( this, SIGNAL(askReleaseVideo( void )), + this, SLOT(releaseVideoSlot( void )), Qt::BlockingQueuedConnection ); + if( videoWidget ) + { CONNECT( this, askVideoToResize( unsigned int, unsigned int ), videoWidget, SetSizing( unsigned int, unsigned int ) ); + connect( this, SIGNAL(askVideoToShow( unsigned int, unsigned int)), + videoWidget, SLOT(SetSizing(unsigned int, unsigned int )), + Qt::BlockingQueuedConnection ); + } + CONNECT( this, askUpdate(), this, doComponentsUpdate() ); /* Size and placement of interface */ + settings->beginGroup( "MainWindow" ); QVLCTools::restoreWidgetPosition( settings, this, QSize(380, 60) ); + /* resize to previously saved main window size if appicable */ + if( b_keep_size ) + { + if( i_visualmode == QT_ALWAYS_VIDEO_MODE || + i_visualmode == QT_MINIMAL_MODE ) + { + resize( mainVideoSize ); + } + else + { + resize( mainBasedSize ); + } + } - /* Playlist */ - if( settings->value( "playlist-visible", 0 ).toInt() ) togglePlaylist(); + bool b_visible = settings->value( "playlist-visible", 0 ).toInt(); settings->endGroup(); + /* Playlist */ + if( b_visible ) togglePlaylist(); + + /* Enable the popup menu in the MI */ + setContextMenuPolicy( Qt::CustomContextMenu ); + CONNECT( this, customContextMenuRequested( const QPoint& ), + this, popupMenu() ); /* Final sizing and showing */ setMinimumWidth( __MAX( controls->sizeHint().width(), @@ -231,11 +269,12 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) /* And switch to minimal view if needed Must be called after the show() */ if( i_visualmode == QT_MINIMAL_MODE ) - toggleMinimalView(); + toggleMinimalView( true ); - /* Update the geometry TODO: is it useful ?*/ + /* Update the geometry : It is useful if you switch between + qt-display-modes ?*/ updateGeometry(); - // resize( sizeHint() ); + resize( sizeHint() ); /***************************************************** * End everything by creating the Systray Management * @@ -247,38 +286,52 @@ MainInterface::~MainInterface() { msg_Dbg( p_intf, "Destroying the main interface" ); + /* Unsure we hide the videoWidget before destroying it */ + if( videoIsActive ) videoWidget->hide(); + + /* Save playlist state */ if( playlistWidget ) - playlistWidget->savingSettings(); + { + if( !isDocked() ) + QVLCTools::saveWidgetPosition( p_intf, "Playlist", playlistWidget ); - settings->beginGroup( "MainWindow" ); + delete playlistWidget; + } + + /* Be sure to kill the actionsManager... FIXME */ + ActionsManager::killInstance(); - // settings->setValue( "playlist-floats", (int)(dockPL->isFloating()) ); + /* Delete the FSC controller */ + if( fullscreenControls ) delete fullscreenControls; + + /* Save states */ + settings->beginGroup( "MainWindow" ); + settings->setValue( "pl-dock-status", (int)i_pl_dock ); settings->setValue( "playlist-visible", (int)playlistVisible ); settings->setValue( "adv-controls", getControlsVisibilityStatus() & CONTROLS_ADVANCED ); - if( !videoIsActive ) - { - QVLCTools::saveWidgetPosition(settings, this); - } - else - { - msg_Dbg( p_intf, "Not saving because video is in use." ); - } + settings->setValue( "mainBasedSize", mainBasedSize ); + settings->setValue( "mainVideoSize", mainVideoSize ); if( bgWidget ) settings->setValue( "backgroundSize", bgWidget->size() ); + /* Save this size */ + QVLCTools::saveWidgetPosition(settings, this); settings->endGroup(); - var_DelCallback( p_intf->p_libvlc, "intf-show", IntfShowCB, p_intf ); - /* Unregister callback for the intf-popupmenu variable */ + /* Unregister callbacks */ + var_DelCallback( p_intf->p_libvlc, "intf-show", IntfShowCB, p_intf ); var_DelCallback( p_intf->p_libvlc, "intf-popupmenu", PopupMenuCB, p_intf ); - p_intf->b_interaction = false; + interaction_Unregister( p_intf ); var_DelCallback( p_intf, "interaction", InteractCallback, this ); + dialog_Unregister( p_intf ); + var_DelCallback( p_intf, "dialog-fatal", DialogCallback, this ); + p_intf->p_sys->p_mi = NULL; } @@ -292,18 +345,13 @@ 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; + QStatusBar *statusBarr = statusBar(); + + TimeLabel *timeLabel = new TimeLabel( p_intf ); + nameLabel = new QLabel( this ); 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 ); + SpeedLabel *speedLabel = new SpeedLabel( p_intf, "1.00x", this ); /* Styling those labels */ timeLabel->setFrameStyle( QFrame::Sunken | QFrame::Panel ); @@ -311,42 +359,51 @@ inline void MainInterface::createStatusBar() nameLabel->setFrameStyle( QFrame::Sunken | QFrame::StyledPanel); /* and adding those */ - statusBar()->addWidget( nameLabel, 8 ); - statusBar()->addPermanentWidget( speedLabel, 0 ); - statusBar()->addPermanentWidget( timeLabel, 0 ); + statusBarr->addWidget( nameLabel, 8 ); + statusBarr->addPermanentWidget( speedLabel, 0 ); + statusBarr->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() ); +#if 0 + CONNECT( THEMIM->getIM(), encryptionChanged( bool ) , this, showCryptedLabel( bool ) ); +#endif +} + +#if 0 +void MainInterface::showCryptedLabel( bool ) +{ + if( cryptedLabel == NULL ) + { + cryptedLabel = new QLabel; + cryptedLabel->setPixmap( QPixmap( ":/lock" ) ); + statusBar()->addWidget( cryptedLabel ); + } - /* Speed Label behaviour: - - right click gives the vertical speed slider */ - CONNECT( speedLabel, customContextMenuRequested( QPoint ), - this, showSpeedMenu( QPoint ) ); + cryptedLabel->show(); } +#endif inline void MainInterface::initSystray() { - bool b_createSystray = false; bool b_systrayAvailable = QSystemTrayIcon::isSystemTrayAvailable(); - if( config_GetInt( p_intf, "qt-start-minimized") ) + bool b_systrayWanted = config_GetInt( p_intf, "qt-system-tray" ); + + if( config_GetInt( p_intf, "qt-start-minimized") > 0 ) { if( b_systrayAvailable ) { - b_createSystray = true; + b_systrayWanted = true; hide(); } - else msg_Err( p_intf, "You can't minimize if you haven't a system " - "tray bar" ); + else + msg_Err( p_intf, "cannot start minimized without system tray bar" ); } - if( config_GetInt( p_intf, "qt-system-tray") ) - b_createSystray = true; - if( b_systrayAvailable && b_createSystray ) + if( b_systrayAvailable && b_systrayWanted ) createSystray(); } @@ -380,38 +437,15 @@ void MainInterface::handleMainUi( QSettings *settings ) mainLayout->setMargin( 0 ); /* Create the CONTROLS Widget */ - bool b_shiny = config_GetInt( p_intf, "qt-blingbling" ); - controls = new ControlsWidget( p_intf, this, - settings->value( "adv-controls", false ).toBool(), - b_shiny ); + controls = new ControlsWidget( p_intf, + settings->value( "adv-controls", false ).toBool(), this ); CONNECT( controls, advancedControlsToggled( bool ), this, doComponentsUpdate() ); + CONNECT( controls, sizeChanged(), + this, doComponentsUpdate() ); + inputC = new InputControlsWidget( p_intf, this ); -#ifdef WIN32 - if ( depth() > 8 ) -#endif - /* 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, 0, Qt::AlignBottom ); - - /* Create the Speed Control Widget */ - speedControl = new SpeedControlWidget( p_intf ); - speedControlMenu = new QMenu( this ); - - QWidgetAction *widgetAction = new QWidgetAction( speedControl ); - widgetAction->setDefaultWidget( speedControl ); - speedControlMenu->addAction( widgetAction ); - - /* Visualisation */ + /* Visualisation */ /* Disabled for now, they SUCK */ #if 0 visualSelector = new VisualSelector( p_intf ); @@ -424,7 +458,6 @@ void MainInterface::handleMainUi( QSettings *settings ) 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 && @@ -435,13 +468,27 @@ void MainInterface::handleMainUi( QSettings *settings ) /* And video Outputs */ if( videoEmbeddedFlag ) - { videoWidget = new VideoWidget( p_intf ); - mainLayout->insertWidget( 0, videoWidget, 10 ); - } + + /* Add the controls Widget to the main Widget */ + mainLayout->insertWidget( 0, bgWidget ); + if( videoWidget ) mainLayout->insertWidget( 0, videoWidget, 10 ); + mainLayout->insertWidget( 2, inputC, 0, Qt::AlignBottom ); + mainLayout->insertWidget( settings->value( "ToolbarPos", 0 ).toInt() ? 0: 3, + controls, 0, Qt::AlignBottom ); /* Finish the sizing */ main->updateGeometry(); + + getSettings()->endGroup(); +#ifdef WIN32 + if ( depth() > 8 ) +#endif + /* Create the FULLSCREEN CONTROLS Widget */ + if( config_GetInt( p_intf, "qt-fs-controller" ) ) + { + fullscreenControls = new FullscreenControllerWidget( p_intf ); + } } inline void MainInterface::askForPrivacy() @@ -470,7 +517,7 @@ inline void MainInterface::askForPrivacy() int MainInterface::privacyDialog( QList *controls ) { - QDialog *privacy = new QDialog(); + QDialog *privacy = new QDialog( this ); privacy->setWindowTitle( qtr( "Privacy and Network Policies" ) ); @@ -481,13 +528,13 @@ int MainInterface::privacyDialog( QList *controls ) QLabel *text = new QLabel( qtr( "

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

\n " - "

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

\n" + "

VLC media player can retreive limited information from " + "the Internet in order to get CD covers or to check " + "for available updates.

\n" "

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

\n" - "

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

\n") ); + "

Therefore please select from the following options, the default being " + "almost no access to the web.

\n") ); text->setWordWrap( true ); text->setTextFormat( Qt::RichText ); @@ -550,9 +597,28 @@ int MainInterface::privacyDialog( QList *controls ) QSize MainInterface::sizeHint() const { + if( b_keep_size ) + { + if( i_visualmode == QT_ALWAYS_VIDEO_MODE || + i_visualmode == QT_MINIMAL_MODE ) + { + return mainVideoSize; + } + else + { + if( VISIBLE( bgWidget) || + ( videoIsActive && videoWidget->isVisible() ) + ) + return mainVideoSize; + else + return mainBasedSize; + } + } + int nwidth = controls->sizeHint().width(); int nheight = controls->isVisible() ? controls->size().height() + + inputC->size().height() + menuBar()->size().height() + statusBar()->size().height() : 0 ; @@ -583,11 +649,14 @@ void MainInterface::toggleFSC() if( !fullscreenControls ) return; IMEvent *eShow = new IMEvent( FullscreenControlToggle_Type, 0 ); - QApplication::postEvent( fullscreenControls, static_cast(eShow) ); + QApplication::postEvent( fullscreenControls, eShow ); } +void MainInterface::popupMenu() +{ + QVLCMenu::PopupMenu( p_intf, true ); +} -//FIXME remove me at the end... void MainInterface::debug() { #ifndef NDEBUG @@ -595,23 +664,12 @@ void MainInterface::debug() 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(); #endif } -/**************************************************************************** - * Small right-click menu for rate control - ****************************************************************************/ -void MainInterface::showSpeedMenu( QPoint pos ) -{ - speedControlMenu->exec( QCursor::pos() - pos - + QPoint( 0, speedLabel->height() ) ); -} - /**************************************************************************** * Video Handling ****************************************************************************/ @@ -634,14 +692,15 @@ private: /** * 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 + * This is wrong, and this is THE 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 ) +WId MainInterface::requestVideo( vout_thread_t *p_nvout, int *pi_x, + int *pi_y, unsigned int *pi_width, + unsigned int *pi_height ) { /* Request the videoWidget */ - void *ret = videoWidget->request( p_nvout,pi_x, pi_y, pi_width, pi_height ); + WId ret = videoWidget->request( p_nvout,pi_x, pi_y, + pi_width, pi_height, b_keep_size ); if( ret ) /* The videoWidget is available */ { /* Did we have a bg ? Hide it! */ @@ -653,28 +712,27 @@ void *MainInterface::requestVideo( vout_thread_t *p_nvout, int *pi_x, else bgWasVisible = false; + /* ask videoWidget to show */ + emit askVideoToShow( *pi_width, *pi_height ); + /* Consider the video active now */ videoIsActive = true; emit askUpdate(); - - if( fullscreenControls ) fullscreenControls->attachVout( p_nvout ); } return ret; } /* Call from the WindowClose function */ -void MainInterface::releaseVideo( void *p_win ) +void MainInterface::releaseVideo( void ) { - if( fullscreenControls ) fullscreenControls->detachVout(); - if( p_win ) - emit askReleaseVideo( p_win ); + emit askReleaseVideo( ); } /* Function that is CONNECTED to the previous emit */ -void MainInterface::releaseVideoSlot( void *p_win ) +void MainInterface::releaseVideoSlot( void ) { - videoWidget->release( p_win ); + videoWidget->release( ); if( bgWasVisible ) { @@ -690,19 +748,11 @@ void MainInterface::releaseVideoSlot( void *p_win ) } /* Call from WindowControl function */ -int MainInterface::controlVideo( void *p_window, int i_query, va_list args ) +int MainInterface::controlVideo( int i_query, va_list args ) { 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->videoSize.width(); - *pi_height = videoWidget->videoSize.height(); - break; - } case VOUT_SET_SIZE: { unsigned int i_width = va_arg( args, unsigned int ); @@ -733,64 +783,59 @@ 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, dockPL ); + playlistWidget = new PlaylistWidget( p_intf ); - /* Add it to the parent DockWidget */ - dockPL->setWidget( playlistWidget ); + i_pl_dock = PL_UNDOCKED; +/* i_pl_dock = (pl_dock_e)getSettings() + ->value( "pl-dock-status", PL_UNDOCKED ).toInt(); */ - /* Add the dock to the main Interface */ - addDockWidget( Qt::BottomDockWidgetArea, dockPL ); + if( i_pl_dock == PL_UNDOCKED ) + { + playlistWidget->setWindowFlags( Qt::Window ); - /* Make the playlist floating is requested. Default is not. */ - settings->beginGroup( "MainWindow" ); - if( settings->value( "playlist-floats", 1 ).toInt() ) + /* This will restore the geometry but will not work for position, + because of parenting */ + QVLCTools::restoreWidgetPosition( p_intf, "Playlist", + playlistWidget, QSize( 600, 300 ) ); + } + else { - msg_Dbg( p_intf, "we don't want the playlist inside"); - dockPL->setFloating( true ); + mainLayout->insertWidget( 4, playlistWidget ); } - 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; + + playlistWidget->show(); } else { /* toggle the visibility of the playlist */ - TOGGLEV( dockPL ); - resize( sizeHint() ); + TOGGLEV( playlistWidget ); playlistVisible = !playlistVisible; + //doComponentsUpdate(); //resize( sizeHint() ); } - #endif } /* Function called from the menu to undock the playlist */ void MainInterface::undockPlaylist() { // dockPL->setFloating( true ); - adjustSize(); +// adjustSize(); } -void MainInterface::toggleMinimalView() +void MainInterface::dockPlaylist( pl_dock_e i_pos ) { - /* HACK for minimalView, see menus.cpp */ - if( !menuBar()->isVisible() ) QVLCMenu::minimalViewAction->toggle(); +} +void MainInterface::toggleMinimalView( bool b_switch ) +{ if( i_visualmode != QT_ALWAYS_VIDEO_MODE && i_visualmode != QT_MINIMAL_MODE ) { /* NORMAL MODE then */ - if( videoWidget->isHidden() ) emit askBgWidgetToToggle(); + if( !videoWidget || videoWidget->isHidden() ) emit askBgWidgetToToggle(); else { /* If video is visible, then toggle the status of bgWidget */ @@ -798,26 +843,40 @@ void MainInterface::toggleMinimalView() } } - TOGGLEV( menuBar() ); - TOGGLEV( controls ); - TOGGLEV( statusBar() ); + menuBar()->setVisible( !b_switch ); + controls->setVisible( !b_switch ); + statusBar()->setVisible( !b_switch ); + inputC->setVisible( !b_switch ); doComponentsUpdate(); + + emit minimalViewToggled( b_switch ); } /* Video widget cannot do this synchronously as it runs in another thread */ /* Well, could it, actually ? Probably dangerous ... */ + +/* This function is called: + - toggling of minimal View + - through askUpdate() by Vout thread request video and resize video (zoom) + - Advanced buttons toggled + */ void MainInterface::doComponentsUpdate() { msg_Dbg( p_intf, "Updating the geometry" ); - // resize( sizeHint() ); - adjustSize(); + /* Here we resize to sizeHint() and not adjustsize because we want + the videoWidget to be exactly the correctSize */ + resize( sizeHint() ); + // adjustSize() ; +#ifndef NDEBUG + debug(); +#endif } /* toggling advanced controls buttons */ void MainInterface::toggleAdvanced() { controls->toggleAdvanced(); - if( fullscreenControls ) fullscreenControls->toggleAdvanced(); +// if( fullscreenControls ) fullscreenControls->toggleAdvanced(); } /* Get the visibility status of the controls (hidden or not, advanced or not) */ @@ -852,27 +911,6 @@ void MainInterface::visual() /************************************************************************ * Other stuff ************************************************************************/ -void MainInterface::setDisplayPosition( float pos, int time, int length ) -{ - char psz_length[MSTRTIME_MAX_SIZE], psz_time[MSTRTIME_MAX_SIZE]; - secstotimestr( psz_length, length ); - secstotimestr( psz_time, ( b_remainingTime && length ) ? length - time - : 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( " -"+timestr+" " ); - else timeLabel->setText( " "+timestr+" " ); -} - -void MainInterface::toggleTimeDisplay() -{ - b_remainingTime = !b_remainingTime; -} - void MainInterface::setName( QString name ) { input_name = name; /* store it for the QSystray use */ @@ -882,47 +920,6 @@ void MainInterface::setName( QString name ) nameLabel->setToolTip( " " + name +" " ); } -void MainInterface::setStatus( int status ) -{ - msg_Dbg( p_intf, "Updating the stream status: %i", 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 ); -} - -void MainInterface::setRate( int rate ) -{ - QString str; - str.setNum( ( 1000 / (double)rate ), 'f', 2 ); - str.append( "x" ); - speedLabel->setText( str ); - speedLabel->setToolTip( str ); - speedControl->updateControls( rate ); -} - -void MainInterface::updateOnTimer() -{ - /* No event for dying */ - if( intf_ShouldDie( p_intf ) ) - { - QApplication::closeAllWindows(); - QApplication::quit(); - } -} - /***************************************************************************** * Systray Icon and Systray Menu *****************************************************************************/ @@ -970,28 +967,31 @@ void MainInterface::toggleUpdateSystrayMenu() } else { - /* Visible */ + /* Visible (possibly under other windows) */ #ifdef WIN32 /* check if any visible window is above vlc in the z-order, - * but ignore the ones always on top */ + * but ignore the ones always on top + * and the ones which can't be activated */ WINDOWINFO wi; HWND hwnd; wi.cbSize = sizeof( WINDOWINFO ); for( hwnd = GetNextWindow( internalWinId(), GW_HWNDPREV ); - hwnd && !IsWindowVisible( hwnd ); + hwnd && ( !IsWindowVisible( hwnd ) || + ( GetWindowInfo( hwnd, &wi ) && + (wi.dwExStyle&WS_EX_NOACTIVATE) ) ); hwnd = GetNextWindow( hwnd, GW_HWNDPREV ) ); - if( !hwnd || !GetWindowInfo( hwnd, &wi ) || + if( !hwnd || !GetWindowInfo( hwnd, &wi ) || (wi.dwExStyle&WS_EX_TOPMOST) ) + { + hide(); + } + else + { + activateWindow(); + } #else - if( isActiveWindow() ) + hide(); #endif - { - hide(); - } - else - { - activateWindow(); - } } QVLCMenu::updateSystrayMenu( this, p_intf ); } @@ -1002,6 +1002,7 @@ void MainInterface::handleSystrayClick( switch( reason ) { case QSystemTrayIcon::Trigger: + case QSystemTrayIcon::DoubleClick: toggleUpdateSystrayMenu(); break; case QSystemTrayIcon::MiddleClick: @@ -1009,6 +1010,8 @@ void MainInterface::handleSystrayClick( qtr( "Control menu for the player" ), QSystemTrayIcon::Information, 3000 ); break; + default: + break; } } @@ -1031,6 +1034,8 @@ void MainInterface::updateSystrayTooltipName( QString name ) QSystemTrayIcon::NoIcon, 3000 ); } } + + QVLCMenu::updateSystrayMenu( this, p_intf ); } /** @@ -1065,6 +1070,11 @@ void MainInterface::updateSystrayTooltipStatus( int i_status ) * D&D Events ************************************************************************/ void MainInterface::dropEvent(QDropEvent *event) +{ + dropEventPlay( event, true ); +} + +void MainInterface::dropEventPlay( QDropEvent *event, bool b_play ) { const QMimeData *mimeData = event->mimeData(); @@ -1073,8 +1083,9 @@ void MainInterface::dropEvent(QDropEvent *event) { if( THEMIM->getIM()->hasInput() ) { - if( input_AddSubtitles( THEMIM->getInput(), - qtu( mimeData->urls()[0].toString() ), + if( !input_AddSubtitle( THEMIM->getInput(), + qtu( toNativeSeparators( + mimeData->urls()[0].toLocalFile() ) ), true ) ) { event->acceptProposedAction(); @@ -1082,15 +1093,17 @@ void MainInterface::dropEvent(QDropEvent *event) } } } - bool first = true; - foreach( QUrl url, mimeData->urls() ) + bool first = b_play; + foreach( const QUrl &url, mimeData->urls() ) { - QString s = url.toLocalFile(); + QString s = toNativeSeparators( url.toLocalFile() ); + if( s.length() > 0 ) { playlist_Add( THEPL, qtu(s), NULL, - PLAYLIST_APPEND | (first ? PLAYLIST_GO:0), + PLAYLIST_APPEND | (first ? PLAYLIST_GO: 0), PLAYLIST_END, true, false ); first = false; + RecentsMRL::getInstance( p_intf )->addRecent( s ); } } event->acceptProposedAction(); @@ -1124,7 +1137,7 @@ void MainInterface::customEvent( QEvent *event ) } #endif /*else */ - if ( event->type() == SetVideoOnTopEvent_Type ) + if ( event->type() == (int)SetVideoOnTopEvent_Type ) { SetVideoOnTopQtEvent* p_event = (SetVideoOnTopQtEvent*)event; if( p_event->OnTop() ) @@ -1137,10 +1150,10 @@ void MainInterface::customEvent( QEvent *event ) void MainInterface::keyPressEvent( QKeyEvent *e ) { - if( ( e->modifiers() & Qt::ControlModifier ) && ( e->key() & Qt::Key_H ) - && menuBar()->isHidden() ) + if( ( e->modifiers() & Qt::ControlModifier ) && ( e->key() == Qt::Key_H ) + && !menuBar()->isVisible() ) { - toggleMinimalView(); + toggleMinimalView( false ); e->accept(); } @@ -1154,6 +1167,27 @@ void MainInterface::keyPressEvent( QKeyEvent *e ) e->ignore(); } +void MainInterface::resizeEvent( QResizeEvent * event ) +{ + if( b_keep_size ) + { + if( i_visualmode == QT_ALWAYS_VIDEO_MODE || + i_visualmode == QT_MINIMAL_MODE ) + { + mainVideoSize = size(); + } + else + { + if( VISIBLE( bgWidget) || + ( videoIsActive && videoWidget->isVisible() ) + ) + mainVideoSize = size(); + else + mainBasedSize = size(); + } + } +} + void MainInterface::wheelEvent( QWheelEvent *e ) { int i_vlckey = qtWheelEventToVLCKey( e ); @@ -1163,6 +1197,7 @@ void MainInterface::wheelEvent( QWheelEvent *e ) void MainInterface::closeEvent( QCloseEvent *e ) { + e->accept(); hide(); THEDP->quit(); } @@ -1170,9 +1205,17 @@ void MainInterface::closeEvent( QCloseEvent *e ) void MainInterface::toggleFullScreen( void ) { if( isFullScreen() ) + { showNormal(); + emit askUpdate(); // Needed if video was launched after the F11 + emit fullscreenInterfaceToggled( false ); + } else + { showFullScreen(); + emit fullscreenInterfaceToggled( true ); + } + } /***************************************************************************** @@ -1185,7 +1228,22 @@ static int InteractCallback( vlc_object_t *p_this, intf_dialog_args_t *p_arg = new intf_dialog_args_t; p_arg->p_dialog = (interaction_dialog_t *)(new_val.p_address); DialogEvent *event = new DialogEvent( INTF_DIALOG_INTERACTION, 0, p_arg ); - QApplication::postEvent( THEDP, static_cast(event) ); + QApplication::postEvent( THEDP, event ); + return VLC_SUCCESS; +} + +static int DialogCallback( vlc_object_t *p_this, + const char *type, vlc_value_t previous, + vlc_value_t value, void *data ) +{ + MainInterface *self = (MainInterface *)data; + const dialog_fatal_t *dialog = (const dialog_fatal_t *)value.p_address; + + if (!strcmp (type, "dialog-fatal")) + printf ("ERROR: %s\n %s\n", dialog->title, dialog->message); + + /* FIXME!!! */ + (void) previous; return VLC_SUCCESS; } @@ -1202,7 +1260,7 @@ static int PopupMenuCB( vlc_object_t *p_this, const char *psz_variable, if( p_intf->pf_show_dialog ) { p_intf->pf_show_dialog( p_intf, INTF_DIALOG_POPUPMENU, - new_val.b_bool, 0 ); + new_val.b_bool, NULL ); } return VLC_SUCCESS; @@ -1220,3 +1278,4 @@ static int IntfShowCB( vlc_object_t *p_this, const char *psz_variable, /* Show event */ return VLC_SUCCESS; } +