X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fmain_interface.cpp;h=17810d90963031d0e7e49a929697a052bf04b00f;hb=10c68b56f970e05729b30a1c0f42cfe87d5fc55d;hp=986d9ae98e60254fb4b47b6921e7c1b726567e0c;hpb=dcd0b1379fdb4db2d8ff24c52f27fd4a6938a5a7;p=vlc diff --git a/modules/gui/qt4/main_interface.cpp b/modules/gui/qt4/main_interface.cpp index 986d9ae98e..17810d9096 100644 --- a/modules/gui/qt4/main_interface.cpp +++ b/modules/gui/qt4/main_interface.cpp @@ -1,7 +1,7 @@ /***************************************************************************** * main_interface.cpp : Main interface **************************************************************************** - * Copyright (C) 2006-2009 the VideoLAN team + * Copyright (C) 2006-2010 VideoLAN and AUTHORS * $Id$ * * Authors: Clément Stenac @@ -19,8 +19,8 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + * 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 @@ -30,19 +30,20 @@ #include "qt4.hpp" #include "main_interface.hpp" -#include "input_manager.hpp" -#include "actions_manager.hpp" +#include "input_manager.hpp" // Creation +#include "actions_manager.hpp" // killInstance +#include "extensions_manager.hpp" // killInstance -#include "util/customwidgets.hpp" -#include "util/qt_dirs.hpp" +#include "util/customwidgets.hpp" // qtEventToVLCKey, QVLCStackedWidget +#include "util/qt_dirs.hpp" // toNativeSeparators -#include "components/interface_widgets.hpp" -#include "components/controller.hpp" -#include "components/playlist/playlist.hpp" -#include "dialogs/external.hpp" +#include "components/interface_widgets.hpp" // bgWidget, videoWidget +#include "components/controller.hpp" // controllers +#include "components/playlist/playlist.hpp" // plWidget +#include "dialogs/firstrun.hpp" // First Run -#include "menus.hpp" -#include "recents.hpp" +#include "menus.hpp" // Menu creation +#include "recents.hpp" // RecentItems when DnD #include #include @@ -55,19 +56,12 @@ #include #include #include -#include -#include +#include -#ifdef WIN32 - #include - #include -#endif - -#include +#include /* Wheel event */ +#include /* vout_thread_t and VOUT_ events */ -#include /* Wheel event */ -#include -#include +// #define DEBUG_INTF /* Callback prototypes */ static int PopupMenuCB( vlc_object_t *p_this, const char *psz_variable, @@ -78,27 +72,25 @@ static int IntfShowCB( vlc_object_t *p_this, const char *psz_variable, MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) { /* Variables initialisation */ - // need_components_update = false; bgWidget = NULL; videoWidget = NULL; playlistWidget = NULL; + stackCentralOldWidget= NULL; #ifndef HAVE_MAEMO sysTray = NULL; #endif - videoIsActive = false; - playlistVisible = false; - input_name = ""; fullscreenControls = NULL; cryptedLabel = NULL; controls = NULL; inputC = NULL; - b_shouldHide = false; - bgWasVisible = false; - i_bg_height = 0; + b_hideAfterCreation = false; // --qt-start-minimized + playlistVisible = false; + input_name = ""; + - /* Ask for privacy */ - askForPrivacy(); + /* Ask for Privacy */ + FirstRun::CheckAndRun( this, p_intf ); /** * Configuration and settings @@ -109,32 +101,31 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) setAcceptDrops( true ); setWindowRole( "vlc-main" ); setWindowIcon( QApplication::windowIcon() ); - setWindowOpacity( config_GetFloat( p_intf, "qt-opacity" ) ); + setWindowOpacity( var_InheritFloat( p_intf, "qt-opacity" ) ); +#ifdef Q_WS_MAC + setAttribute( Qt::WA_MacBrushedMetal ); +#endif - /* Set The Video In emebedded Mode or not */ - videoEmbeddedFlag = config_GetInt( p_intf, "embedded-video" ); + /* Is video in embedded in the UI or not */ + b_videoEmbedded = var_InheritBool( p_intf, "embedded-video" ); /* Does the interface resize to video size or the opposite */ - b_keep_size = !config_GetInt( 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 = config_GetInt( p_intf, "qt-display-mode" ); + b_minimalView = var_InheritBool( p_intf, "qt-minimal-view" ); - /* Do we want anoying popups or not */ - notificationEnabled = (bool)config_GetInt( p_intf, "qt-notification" ); + /* Do we want anoying popups or not */ + b_notificationEnabled = var_InheritBool( p_intf, "qt-notification" ); /* Set the other interface settings */ settings = getSettings(); settings->beginGroup( "MainWindow" ); - /** - * 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(); + /* */ + b_plDocked = getSettings()->value( "pl-dock-status", true ).toBool(); + + settings->endGroup( ); /************** * Status Bar * @@ -145,7 +136,6 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) * UI and Widgets design **************************/ setVLCWindowsTitle(); - createMainWidget( settings ); /************ * Menu Bar * @@ -154,18 +144,7 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) CONNECT( THEMIM->getIM(), voutListChanged( vout_thread_t **, int ), this, destroyPopupMenu() ); -#if 0 - /* Create a Dock to get the playlist */ - dockPL = new QDockWidget( qtr( "Playlist" ), this ); - dockPL->setSizePolicy( QSizePolicy::Preferred, - QSizePolicy::Expanding ); - dockPL->setFeatures( QDockWidget::AllDockWidgetFeatures ); - dockPL->setAllowedAreas( Qt::LeftDockWidgetArea - | Qt::RightDockWidgetArea - | Qt::BottomDockWidgetArea ); - dockPL->hide(); -#endif - + createMainWidget( settings ); /********************************* * Create the Systray Management * *********************************/ @@ -176,6 +155,12 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) ********************/ MainInputManager::getInstance( p_intf ); +#ifdef WIN32 + himl = NULL; + p_taskbl = NULL; + taskbar_wmsg = RegisterWindowMessage("TaskbarButtonCreated"); +#endif + /************************************************************ * Connect the input manager to the GUI elements it manages * ************************************************************/ @@ -195,7 +180,7 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) } #endif /* and title of the Main Interface*/ - if( config_GetInt( p_intf, "qt-name-in-title" ) ) + if( var_InheritBool( p_intf, "qt-name-in-title" ) ) { CONNECT( THEMIM->getIM(), nameChanged( const QString& ), this, setVLCWindowsTitle( const QString& ) ); @@ -215,100 +200,71 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) /* END CONNECTS ON IM */ - /************ - * Callbacks - ************/ - var_AddCallback( p_intf->p_libvlc, "intf-show", IntfShowCB, p_intf ); - - /* Register callback for the intf-popupmenu variable */ - var_AddCallback( p_intf->p_libvlc, "intf-popupmenu", PopupMenuCB, p_intf ); - - /* VideoWidget connects for asynchronous calls */ + b_videoFullScreen = false; + b_videoOnTop = false; connect( this, SIGNAL(askGetVideo(WId*,int*,int*,unsigned*,unsigned *)), this, SLOT(getVideoSlot(WId*,int*,int*,unsigned*,unsigned*)), Qt::BlockingQueuedConnection ); connect( this, SIGNAL(askReleaseVideo( void )), this, SLOT(releaseVideoSlot( void )), Qt::BlockingQueuedConnection ); + CONNECT( this, askVideoOnTop(bool), this, setVideoOnTop(bool)); if( videoWidget ) { - CONNECT( this, askVideoToResize( unsigned int, unsigned int ), - videoWidget, SetSizing( unsigned int, unsigned int ) ); + if( b_autoresize ) + { + CONNECT( this, askVideoToResize( unsigned int, unsigned int ), + this, setVideoSize( unsigned int, unsigned int ) ); + CONNECT( videoWidget, sizeChanged( int, int ), + this, resizeStack( int, int ) ); + } CONNECT( this, askVideoSetFullScreen( bool ), - videoWidget, SetFullScreen( bool ) ); - CONNECT( videoWidget, keyPressed( QKeyEvent * ), - this, handleKeyPress( QKeyEvent * ) ); + this, setVideoFullScreen( bool ) ); } - CONNECT( this, askUpdate(), this, doComponentsUpdate() ); CONNECT( THEDP, toolBarConfUpdated(), this, recreateToolbars() ); - /* Size and placement of interface */ - settings->beginGroup( "MainWindow" ); - QVLCTools::restoreWidgetPosition( settings, this, QSize(380, 60) ); + /** END of CONNECTS**/ - /* 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 ); - } - } - bool b_pl_visible = settings->value( "playlist-visible", 0 ).toInt(); - settings->endGroup(); + /************ + * Callbacks + ************/ + var_AddCallback( p_intf->p_libvlc, "intf-show", IntfShowCB, p_intf ); + + /* Register callback for the intf-popupmenu variable */ + var_AddCallback( p_intf->p_libvlc, "intf-popupmenu", PopupMenuCB, p_intf ); /* Playlist */ - if( b_pl_visible ) togglePlaylist(); + int i_plVis = settings->value( "MainWindow/playlist-visible", false ).toBool(); - /* Enable the popup menu in the MI */ - setContextMenuPolicy( Qt::CustomContextMenu ); - CONNECT( this, customContextMenuRequested( const QPoint& ), - this, popupMenu( const QPoint& ) ); + if( i_plVis ) togglePlaylist(); + + /**** FINAL SIZING and placement of interface */ + settings->beginGroup( "MainWindow" ); + QVLCTools::restoreWidgetPosition( settings, this, QSize(400, 100) ); + settings->endGroup(); + + b_interfaceFullScreen = isFullScreen(); /* Final sizing and showing */ + setVisible( !b_hideAfterCreation ); + setMinimumWidth( __MAX( controls->sizeHint().width(), - menuBar()->sizeHint().width() ) ); - setVisible( !b_shouldHide ); + menuBar()->sizeHint().width() ) + 30 ); - /* And switch to minimal view if needed - Must be called after the show() */ - if( i_visualmode == QT_MINIMAL_MODE ) + /* Switch to minimal view if needed, must be called after the show() */ + if( b_minimalView ) toggleMinimalView( true ); - - /* Update the geometry : It is useful if you switch between - qt-display-modes */ - updateGeometry(); - resize( sizeHint() ); - -#ifdef WIN32 - createTaskBarButtons(); -#endif } 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 ) - { - if( !isDocked() ) - QVLCTools::saveWidgetPosition( p_intf, "Playlist", playlistWidget ); - - delete playlistWidget; - } + if( stackCentralOldWidget == videoWidget ) + showTab( bgWidget ); #ifdef WIN32 if( himl ) @@ -318,29 +274,42 @@ MainInterface::~MainInterface() CoUninitialize(); #endif - /* Be sure to kill the actionsManager... FIXME */ + /* Be sure to kill the actionsManager... Only used in the MI and control */ ActionsManager::killInstance(); + /* Idem */ + ExtensionsManager::killInstance(); + /* Delete the FSC controller */ delete fullscreenControls; /* Save states */ settings->beginGroup( "MainWindow" ); - settings->setValue( "pl-dock-status", (int)i_pl_dock ); - settings->setValue( "playlist-visible", (int)playlistVisible ); + + settings->setValue( "pl-dock-status", b_plDocked ); + /* Save playlist state */ + if( playlistWidget ) + settings->setValue( "playlist-visible", playlistVisible ); + settings->setValue( "adv-controls", getControlsVisibilityStatus() & CONTROLS_ADVANCED ); - settings->setValue( "mainBasedSize", mainBasedSize ); - settings->setValue( "mainVideoSize", mainVideoSize ); - - if( bgWidget ) - 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 */ var_DelCallback( p_intf->p_libvlc, "intf-show", IntfShowCB, p_intf ); @@ -354,20 +323,25 @@ MainInterface::~MainInterface() *****************************/ void MainInterface::recreateToolbars() { - msg_Dbg( p_intf, "Recreating the toolbars" ); + 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, doComponentsUpdate() ); - CONNECT( controls, sizeChanged(), - this, doComponentsUpdate() ); + + controls = new ControlsWidget( p_intf, b_adv, this ); inputC = new InputControlsWidget( p_intf, this ); - mainLayout->addWidget( inputC, 2, 0, 1, -1, Qt::AlignBottom ); - mainLayout->addWidget( controls, settings->value( "ToolbarPos", 0 ).toInt() ? 0: 3, - 0, 1, -1, Qt::AlignBottom ); + 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 ); settings->endGroup(); } @@ -376,73 +350,83 @@ void MainInterface::createMainWidget( QSettings *settings ) /* Create the main Widget and the mainLayout */ QWidget *main = new QWidget; setCentralWidget( main ); - mainLayout = new QGridLayout( main ); - - /* Margins, spacing */ + mainLayout = new QVBoxLayout( main ); main->setContentsMargins( 0, 0, 0, 0 ); - main->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Maximum ); - mainLayout->setSpacing( 0 ); - mainLayout->setMargin( 0 ); + mainLayout->setSpacing( 0 ); mainLayout->setMargin( 0 ); - /* Visualisation */ - /* Disabled for now, they SUCK */ - #if 0 - visualSelector = new VisualSelector( p_intf ); - mainLayout->insertWidget( 0, visualSelector ); - visualSelector->hide(); - #endif + /* */ + stackCentralW = new QVLCStackedWidget( main ); /* Bg Cone */ bgWidget = new BackgroundWidget( p_intf ); - bgWidget->resize( - settings->value( "backgroundSize", QSize( 300, 200 ) ).toSize() ); - bgWidget->updateGeometry(); + stackCentralW->addWidget( bgWidget ); - if( i_visualmode != QT_ALWAYS_VIDEO_MODE && - i_visualmode != QT_MINIMAL_MODE ) + /* And video Outputs */ + if( b_videoEmbedded ) { - bgWidget->hide(); + videoWidget = new VideoWidget( p_intf ); + stackCentralW->addWidget( videoWidget ); } + mainLayout->insertWidget( 1, stackCentralW ); - /* And video Outputs */ - if( videoEmbeddedFlag ) - videoWidget = new VideoWidget( p_intf ); + 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, doComponentsUpdate() ); - CONNECT( controls, sizeChanged(), - this, doComponentsUpdate() ); inputC = new InputControlsWidget( p_intf, this ); + mainLayout->insertWidget( 2, inputC ); + mainLayout->insertWidget( settings->value( "ToolbarPos", 0 ).toInt() ? 0: 3, + controls ); - /* Add the controls Widget to the main Widget */ - if( videoWidget ){ - mainLayout->addWidget( videoWidget, 0, 0, 1, -1 ); - mainLayout->setRowStretch( 0, 10 ); - } - mainLayout->addWidget( bgWidget, 1, 0, 1, -1 ); - //mainLayout->setRowStretch( 1, 10 ); - mainLayout->addWidget( inputC, 2, 0, 1, -1, Qt::AlignBottom ); - mainLayout->addWidget( controls, settings->value( "ToolbarPos", 0 ).toInt() ? 0: 3, - 0, 1, -1, Qt::AlignBottom ); + /* Visualisation, disabled for now, they SUCK */ + #if 0 + visualSelector = new VisualSelector( p_intf ); + mainLayout->insertWidget( 0, visualSelector ); + visualSelector->hide(); + #endif + + settings->endGroup(); - /* Finish the sizing */ - main->updateGeometry(); + /* Enable the popup menu in the MI */ + main->setContextMenuPolicy( Qt::CustomContextMenu ); + CONNECT( main, customContextMenuRequested( const QPoint& ), + this, popupMenu( const QPoint& ) ); - getSettings()->endGroup(); -#ifdef WIN32 - if ( depth() > 8 ) -#endif - /* Create the FULLSCREEN CONTROLS Widget */ - if( config_GetInt( p_intf, "qt-fs-controller" ) ) + if ( depth() > 8 ) /* 8bit depth has too many issues with opacity */ + /* Create the FULLSCREEN CONTROLS Widget */ + if( var_InheritBool( p_intf, "qt-fs-controller" ) ) + { + fullscreenControls = new FullscreenControllerWidget( p_intf, this ); + CONNECT( fullscreenControls, keyPressed( QKeyEvent * ), + this, handleKeyPress( QKeyEvent * ) ); + } +} + +inline void MainInterface::initSystray() +{ +#ifndef HAVE_MAEMO + bool b_systrayAvailable = QSystemTrayIcon::isSystemTrayAvailable(); + bool b_systrayWanted = var_InheritBool( p_intf, "qt-system-tray" ); + + if( var_InheritBool( p_intf, "qt-start-minimized") ) { - fullscreenControls = new FullscreenControllerWidget( p_intf, this ); - CONNECT( fullscreenControls, keyPressed( QKeyEvent * ), - this, handleKeyPress( QKeyEvent * ) ); + if( b_systrayAvailable ) + { + b_systrayWanted = true; + b_hideAfterCreation = true; + } + else + msg_Err( p_intf, "cannot start minimized without system tray bar" ); } + + if( b_systrayAvailable && b_systrayWanted ) + createSystray(); +#endif } inline void MainInterface::createStatusBar() @@ -457,12 +441,16 @@ inline void MainInterface::createStatusBar() nameLabel = new QLabel( this ); nameLabel->setTextInteractionFlags( Qt::TextSelectableByMouse | Qt::TextSelectableByKeyboard ); - SpeedLabel *speedLabel = new SpeedLabel( p_intf, "1.00x", this ); + SpeedLabel *speedLabel = new SpeedLabel( p_intf, this ); /* Styling those labels */ 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 ); @@ -477,313 +465,68 @@ inline void MainInterface::createStatusBar() CONNECT( THEMIM->getIM(), encryptionChanged( bool ), this, showCryptedLabel( bool ) ); -} - -#ifdef WIN32 -void MainInterface::createTaskBarButtons() -{ - /*Here is the code for the taskbar thumb buttons - FIXME:We need pretty buttons in 16x16 px that are handled correctly by masks in Qt - FIXME:the play button's picture doesn't changed to pause when clicked - */ - OSVERSIONINFO winVer; - winVer.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - if( GetVersionEx(&winVer) && winVer.dwMajorVersion > 5 ) - { - if(himl = ImageList_Create( 15, //cx - 18, //cy - ILC_COLOR,//flags - 4,//initial nb of images - 0//nb of images that can be added - )) - { - QPixmap img = QPixmap(":/toolbar/previous_b"); - QPixmap img2 = QPixmap(":/toolbar/pause_b"); - QPixmap img3 = QPixmap(":/toolbar/play_b"); - QPixmap img4 = QPixmap(":/toolbar/next_b"); - QBitmap mask = img.createMaskFromColor(Qt::transparent); - QBitmap mask2 = img2.createMaskFromColor(Qt::transparent); - QBitmap mask3 = img3.createMaskFromColor(Qt::transparent); - QBitmap mask4 = img4.createMaskFromColor(Qt::transparent); - - if(-1 == ImageList_Add(himl, img.toWinHBITMAP(QPixmap::PremultipliedAlpha),mask.toWinHBITMAP())) - msg_Err( p_intf, "ImageList_Add failed" ); - if(-1 == ImageList_Add(himl, img2.toWinHBITMAP(QPixmap::PremultipliedAlpha),mask2.toWinHBITMAP())) - msg_Err( p_intf, "ImageList_Add failed" ); - if(-1 == ImageList_Add(himl, img3.toWinHBITMAP(QPixmap::PremultipliedAlpha),mask3.toWinHBITMAP())) - msg_Err( p_intf, "ImageList_Add failed" ); - if(-1 == ImageList_Add(himl, img4.toWinHBITMAP(QPixmap::PremultipliedAlpha),mask4.toWinHBITMAP())) - msg_Err( p_intf, "ImageList_Add failed" ); - } - CoInitialize( 0 ); + CONNECT( THEMIM->getIM(), seekRequested( float ), + timeLabel, setDisplayPosition( float ) ); - if( S_OK == CoCreateInstance( &clsid_ITaskbarList, - NULL, CLSCTX_INPROC_SERVER, - &IID_ITaskbarList3, - (void **)&p_taskbl) ) - { - p_taskbl->vt->HrInit(p_taskbl); - - int msg_value = RegisterWindowMessage("TaskbarButtonCreated"); - //msg_Info( p_intf, "msg value: %04x", msg_value ); - - // Define an array of two buttons. These buttons provide images through an - // image list and also provide tooltips. - DWORD dwMask = THB_BITMAP | THB_FLAGS; - - THUMBBUTTON thbButtons[2]; - thbButtons[0].dwMask = dwMask; - thbButtons[0].iId = 0; - thbButtons[0].iBitmap = 0; - thbButtons[0].dwFlags = THBF_HIDDEN; - - thbButtons[1].dwMask = dwMask; - thbButtons[1].iId = 1; - thbButtons[1].iBitmap = 2; - thbButtons[1].dwFlags = THBF_HIDDEN; - - thbButtons[2].dwMask = dwMask; - thbButtons[2].iId = 2; - thbButtons[2].iBitmap = 3; - thbButtons[2].dwFlags = THBF_HIDDEN; - - HRESULT hr = p_taskbl->vt->ThumbBarSetImageList(p_taskbl, GetForegroundWindow(), himl ); - if(S_OK != hr) - msg_Err( p_intf, "ThumbBarSetImageList failed with error %08x", hr ); - if(S_OK != p_taskbl->vt->ThumbBarAddButtons(p_taskbl, GetForegroundWindow(), 3, thbButtons)) - msg_Err( p_intf, "ThumbBarAddButtons failed with error %08x", GetLastError() ); - - CONNECT( THEMIM->getIM(), statusChanged( int ), this, changeThumbbarButtons( int ) ); - } - } - else - { - himl = NULL; - p_taskbl = NULL; - } + /* This shouldn't be necessary, but for somehow reason, the statusBarr + starts at height of 20px and when a text is shown it needs more space. + But, as the QMainWindow policy doesn't allow statusBar to change QMW's + geometry, we need to force a height. If you have a better idea, please + tell me -- jb + */ + statusBarr->setFixedHeight( statusBarr->sizeHint().height() + 2 ); } -#endif - - -inline void MainInterface::initSystray() -{ -#ifndef HAVE_MAEMO - bool b_systrayAvailable = QSystemTrayIcon::isSystemTrayAvailable(); - bool b_systrayWanted = config_GetInt( p_intf, "qt-system-tray" ); - - if( config_GetInt( p_intf, "qt-start-minimized") > 0 ) - { - if( b_systrayAvailable ) - { - b_systrayWanted = true; - b_shouldHide = true; - } - else - msg_Err( p_intf, "cannot start minimized without system tray bar" ); - } - - if( b_systrayAvailable && b_systrayWanted ) - createSystray(); -#endif -} - -inline void MainInterface::askForPrivacy() -{ - /** - * 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 ); - /* We have to save here because the user may not launch Prefs */ - config_SaveConfigFile( p_intf, NULL ); - } - } -} - -int MainInterface::privacyDialog( QList *controls ) -{ - QDialog *privacy = new QDialog( this ); - - privacy->setWindowTitle( qtr( "Privacy and Network Policies" ) ); - privacy->setWindowRole( "vlc-privacy" ); - - QGridLayout *gLayout = new QGridLayout( privacy ); - - QGroupBox *blabla = new QGroupBox( qtr( "Privacy and Network Warning" ) ); - QGridLayout *blablaLayout = new QGridLayout( blabla ); - QLabel *text = new QLabel( qtr( - "

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

\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 select from the following options, the default being " - "almost no access to the web.

\n") ); - text->setWordWrap( true ); - text->setTextFormat( Qt::RichText ); - - blablaLayout->addWidget( text, 0, 0 ) ; - - QGroupBox *options = new QGroupBox; - QGridLayout *optionsLayout = new QGridLayout( options ); - - gLayout->addWidget( blabla, 0, 0, 1, 3 ); - gLayout->addWidget( options, 1, 0, 1, 3 ); - module_config_t *p_config; - ConfigControl *control; - int line = 0; - -#define CONFIG_GENERIC( option, type ) \ - p_config = config_FindConfig( VLC_OBJECT(p_intf), option ); \ - if( p_config ) \ - { \ - control = new type ## ConfigControl( VLC_OBJECT(p_intf), \ - p_config, options, false, optionsLayout, line ); \ - controls->append( control ); \ - } - -#define CONFIG_GENERIC_NOBOOL( option, type ) \ - p_config = config_FindConfig( VLC_OBJECT(p_intf), option ); \ - if( p_config ) \ - { \ - control = new type ## ConfigControl( VLC_OBJECT(p_intf), \ - p_config, options, optionsLayout, line ); \ - controls->append( control ); \ - } - - CONFIG_GENERIC( "album-art", IntegerList ); line++; -#ifdef UPDATE_CHECK - CONFIG_GENERIC_NOBOOL( "qt-updates-notif", Bool ); line++; -#endif - - QPushButton *ok = new QPushButton( qtr( "OK" ) ); - - gLayout->addWidget( ok, 2, 2 ); - - CONNECT( ok, clicked(), privacy, accept() ); - return privacy->exec(); -} - /********************************************************************** * Handling of sizing of the components **********************************************************************/ -/* This function is probably wrong, but we don't have many many choices... - Since we can't know from the playlist Widget if we are inside a dock or not, - because the playlist Widget can be called by THEDP, as a separate windows for - 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 FIXME it... -*/ - -QSize MainInterface::sizeHint() const +void MainInterface::debug() { - 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 ; +#ifdef DEBUG_INTF + msg_Dbg( p_intf, "size: %i - %i", size().height(), size().width() ); + msg_Dbg( p_intf, "sizeHint: %i - %i", sizeHint().height(), sizeHint().width() ); + msg_Dbg( p_intf, "minimumsize: %i - %i", minimumSize().height(), minimumSize().width() ); - if( VISIBLE( bgWidget ) ) - { - if( i_bg_height ) - nheight += i_bg_height; - else - nheight += bgWidget->size().height(); - nwidth = __MAX( nwidth, bgWidget->size().width() ); - } - else if( videoIsActive && videoWidget->isVisible() ) - { - nheight += videoWidget->sizeHint().height(); - nwidth = __MAX( nwidth, videoWidget->sizeHint().width() ); - } -#if 0 - if( !dockPL->isFloating() && dockPL->isVisible() && dockPL->widget() ) - { - nheight += dockPL->size().height(); - nwidth = __MAX( nwidth, dockPL->size().width() ); - msg_Warn( p_intf, "3 %i %i", nheight, nwidth ); - } + msg_Dbg( p_intf, "Stack size: %i - %i", stackCentralW->size().height(), stackCentralW->size().width() ); + msg_Dbg( p_intf, "Stack sizeHint: %i - %i", stackCentralW->sizeHint().height(), stackCentralW->sizeHint().width() ); + msg_Dbg( p_intf, "Central size: %i - %i", centralWidget()->size().height(), centralWidget()->size().width() ); #endif - return QSize( nwidth, nheight ); } -/* Video widget cannot do this synchronously as it runs in another thread */ -/* Well, could it, actually ? Probably dangerous ... */ +inline void MainInterface::showVideo() { showTab( videoWidget ); } +inline void MainInterface::restoreStackOldWidget() + { showTab( stackCentralOldWidget ); } -/* 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() +inline void MainInterface::showTab( QWidget *widget ) { - if( isFullScreen() || isMaximized() ) return; - - msg_Dbg( p_intf, "Updating the geometry" ); - /* Here we resize to sizeHint() and not adjustsize because we want - the videoWidget to be exactly the correctSize */ - resize( sizeHint() ); - // adjustSize() ; -#ifndef NDEBUG - debug(); +#ifdef DEBUG_INTF + msg_Warn( p_intf, "Old stackCentralOldWidget %i", stackCentralW->indexOf( stackCentralOldWidget ) ); #endif -} -void MainInterface::debug() -{ -#ifndef NDEBUG - 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() ) - { - msg_Dbg( p_intf, "size: %i - %i", size().height(), size().width() ); - msg_Dbg( p_intf, "sizeHint: %i - %i", sizeHint().height(), sizeHint().width() ); - } + 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() ); + msg_Warn( p_intf, "New stackCentralOldWidget %i", stackCentralW->indexOf( stackCentralOldWidget ) ); #endif } void MainInterface::destroyPopupMenu() { - QVLCMenu::PopupMenu(p_intf, false ); + QVLCMenu::PopupMenu( p_intf, false ); } +void MainInterface::popupMenu( const QPoint &p ) +{ + QVLCMenu::PopupMenu( p_intf, true ); +} void MainInterface::toggleFSC() { @@ -793,37 +536,13 @@ void MainInterface::toggleFSC() QApplication::postEvent( fullscreenControls, eShow ); } -void MainInterface::popupMenu( const QPoint &p ) -{ - /* Ow, that's ugly: don't show the popup menu if cursor over - * the main menu bar or the status bar */ - if( !childAt( p ) || ( ( childAt( p ) != menuBar() ) - && ( childAt( p )->parentWidget() != statusBar() ) ) ) - QVLCMenu::PopupMenu( p_intf, true ); -} - /**************************************************************************** * Video Handling ****************************************************************************/ -/* This event is used to deal with the fullscreen and always on top - issue conflict (bug in wx) */ -class SetVideoOnTopQtEvent : public QEvent -{ -public: - SetVideoOnTopQtEvent( bool _onTop ) : - QEvent( (QEvent::Type)SetVideoOnTopEvent_Type ), onTop( _onTop) - {} - - bool OnTop() const { return onTop; } - -private: - bool onTop; -}; - /** * NOTE: - * You must note change the state of this object or other Qt4 UI objects, + * You must not change the state of this object or other Qt4 UI objects, * from the video output thread - only from the Qt4 UI main loop thread. * All window provider queries must be handled through signals or events. * That's why we have all those emit statements... @@ -846,51 +565,97 @@ 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 */ { - /* Did we have a bg ? Hide it! */ - if( VISIBLE( bgWidget) ) - { - bgWasVisible = true; - bgWidget->toggle(); - } - else - bgWasVisible = false; - - /* ask videoWidget to show */ - videoWidget->SetSizing( *pi_width, *pi_height ); - /* Consider the video active now */ - videoIsActive = true; + showVideo(); - emit askUpdate(); + /* Ask videoWidget to resize correctly, if we are in normal mode */ + if( !isFullScreen() && !isMaximized() && b_autoresize ) + videoWidget->SetSizing( *pi_width, *pi_height ); } } /* Asynchronous call from the WindowClose function */ void MainInterface::releaseVideo( void ) { - emit askReleaseVideo( ); + emit askReleaseVideo(); } /* Function that is CONNECTED to the previous emit */ void MainInterface::releaseVideoSlot( void ) { - videoWidget->release( ); + videoWidget->release(); + setVideoOnTop( false ); + setVideoFullScreen( false ); + + if( stackCentralW->currentWidget() == videoWidget ) + restoreStackOldWidget(); + + /* We don't want to have a blank video to popup */ + stackCentralOldWidget = bgWidget; +} - if( bgWasVisible ) +void MainInterface::setVideoSize( unsigned int w, unsigned int h ) +{ + if( !isFullScreen() && !isMaximized() ) + videoWidget->SetSizing( w, h ); +} + +void MainInterface::setVideoFullScreen( bool fs ) +{ + b_videoFullScreen = fs; + if( fs ) + { + int numscreen = var_InheritInteger( p_intf, "qt-fullscreen-screennumber" ); + /* if user hasn't defined screennumber, or screennumber that is bigger + * than current number of screens, take screennumber where current interface + * is + */ + if( numscreen == -1 || numscreen > QApplication::desktop()->numScreens() ) + numscreen = QApplication::desktop()->screenNumber( p_intf->p_sys->p_mi ); + + QRect screenres = QApplication::desktop()->screenGeometry( numscreen ); + + /* To be sure window is on proper-screen in xinerama */ + if( !screenres.contains( pos() ) ) + { + msg_Dbg( p_intf, "Moving video to correct screen"); + move( QPoint( screenres.x(), screenres.y() ) ); + } + setMinimalView( true ); + setInterfaceFullScreen( true ); + } + else { - /* Reset the bg state */ - bgWasVisible = false; - bgWidget->show(); + /* TODO do we want to restore screen and position ? (when + * qt-fullscreen-screennumber is forced) */ + setMinimalView( b_minimalView ); + setInterfaceFullScreen( b_interfaceFullScreen ); } + videoWidget->sync(); +} - videoIsActive = false; +/* Slot to change the video always-on-top flag. + * Emit askVideoOnTop() to invoke this from other thread. */ +void MainInterface::setVideoOnTop( bool on_top ) +{ + b_videoOnTop = on_top; - /* Try to resize, except when you are in Fullscreen mode */ - doComponentsUpdate(); + Qt::WindowFlags oldflags = windowFlags(), newflags; + + if( b_videoOnTop ) + newflags = oldflags | Qt::WindowStaysOnTopHint; + else + newflags = oldflags & ~Qt::WindowStaysOnTopHint; + + if( newflags != oldflags ) + { + setWindowFlags( newflags ); + show(); /* necessary to apply window flags */ + } } /* Asynchronous call from WindowControl function */ @@ -902,19 +667,22 @@ 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 ); + emit askVideoToResize( i_width, i_height ); - emit askUpdate(); return VLC_SUCCESS; } - case VOUT_WINDOW_SET_ON_TOP: + case VOUT_WINDOW_SET_STATE: { - int i_arg = va_arg( args, int ); - QApplication::postEvent( this, new SetVideoOnTopQtEvent( i_arg ) ); + unsigned i_arg = va_arg( args, unsigned ); + unsigned on_top = i_arg & VOUT_WINDOW_STATE_ABOVE; + + emit askVideoOnTop( on_top != 0 ); return VLC_SUCCESS; } case VOUT_WINDOW_SET_FULLSCREEN: { bool b_fs = va_arg( args, int ); + emit askVideoSetFullScreen( b_fs ); return VLC_SUCCESS; } @@ -930,85 +698,122 @@ int MainInterface::controlVideo( int i_query, va_list args ) /** * Toggle the playlist widget or dialog **/ +void MainInterface::createPlaylist() +{ + playlistWidget = new PlaylistWidget( p_intf, this ); + + if( b_plDocked ) + { + stackCentralW->addWidget( playlistWidget ); + stackWidgetsSizes[playlistWidget] = settings->value( "playlistSize", QSize( 500, 250 ) ).toSize(); + } + else + { +#ifdef WIN32 + playlistWidget->setParent( NULL ); +#endif + playlistWidget->setWindowFlags( Qt::Window ); + + /* This will restore the geometry but will not work for position, + because of parenting */ + QVLCTools::restoreWidgetPosition( p_intf, "Playlist", + playlistWidget, QSize( 600, 300 ) ); + } +} + void MainInterface::togglePlaylist() { - /* CREATION - If no playlist exist, then create one and attach it to the DockPL*/ if( !playlistWidget ) { - playlistWidget = new PlaylistWidget( p_intf ); - - i_pl_dock = PL_UNDOCKED; -/* i_pl_dock = (pl_dock_e)getSettings() - ->value( "pl-dock-status", PL_UNDOCKED ).toInt(); */ + createPlaylist(); + } - if( i_pl_dock == PL_UNDOCKED ) + if( b_plDocked ) + { + /* Playlist is not visible, show it */ + if( stackCentralW->currentWidget() != playlistWidget ) { - playlistWidget->setWindowFlags( Qt::Window ); - - /* This will restore the geometry but will not work for position, - because of parenting */ - QVLCTools::restoreWidgetPosition( p_intf, "Playlist", - playlistWidget, QSize( 600, 300 ) ); + showTab( playlistWidget ); } - else + else /* Hide it! */ { - // mainLayout->insertWidget( 4, playlistWidget ); + restoreStackOldWidget(); } - playlistVisible = true; - - playlistWidget->show(); + playlistVisible = ( stackCentralW->currentWidget() == playlistWidget ); } else { - /* toggle the visibility of the playlist */ - TOGGLEV( playlistWidget ); - playlistVisible = !playlistVisible; - //doComponentsUpdate(); //resize( sizeHint() ); +#ifdef WIN32 + playlistWidget->setParent( NULL ); +#endif + playlistWidget->setWindowFlags( Qt::Window ); + playlistVisible = !playlistVisible; + playlistWidget->setVisible( playlistVisible ); } + debug(); } -/* Function called from the menu to undock the playlist */ -void MainInterface::undockPlaylist() +void MainInterface::dockPlaylist( bool p_docked ) { -// dockPL->setFloating( true ); -// adjustSize(); + if( b_plDocked == p_docked ) return; + b_plDocked = p_docked; + + if( !playlistWidget ) return; /* Playlist wasn't created yet */ + if( !p_docked ) + { + stackCentralW->removeWidget( playlistWidget ); +#ifdef WIN32 + playlistWidget->setParent( NULL ); +#endif + playlistWidget->setWindowFlags( Qt::Window ); + QVLCTools::restoreWidgetPosition( p_intf, "Playlist", + playlistWidget, QSize( 600, 300 ) ); + playlistWidget->show(); + restoreStackOldWidget(); + } + 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 ); + showTab( playlistWidget ); + } + playlistVisible = true; } -void MainInterface::dockPlaylist( pl_dock_e i_pos ) +void MainInterface::setMinimalView( bool b_minimal ) { + menuBar()->setVisible( !b_minimal ); + controls->setVisible( !b_minimal ); + statusBar()->setVisible( !b_minimal ); + inputC->setVisible( !b_minimal ); } -void MainInterface::toggleMinimalView( bool b_switch ) +/* + If b_minimal is false, then we are normalView + */ +void MainInterface::toggleMinimalView( bool b_minimal ) { - if( i_visualmode != QT_ALWAYS_VIDEO_MODE && - i_visualmode != QT_MINIMAL_MODE ) - { /* NORMAL MODE then */ - if( !videoWidget || videoWidget->isHidden() ) - { - bgWidget->toggle(); - } - else + if( !b_minimalView && b_autoresize ) /* Normal mode */ + { + if( stackCentralW->currentWidget() == bgWidget ) { - /* If video is visible, then toggle the status of bgWidget */ - bgWasVisible = !bgWasVisible; + if( stackCentralW->height() < 16 ) + { + resizeStack( stackCentralW->width(), 100 ); + } } } + b_minimalView = b_minimal; + if( !b_videoFullScreen ) + setMinimalView( b_minimalView ); - i_bg_height = bgWidget->height(); - - menuBar()->setVisible( !b_switch ); - controls->setVisible( !b_switch ); - statusBar()->setVisible( !b_switch ); - inputC->setVisible( !b_switch ); - - doComponentsUpdate(); - - emit minimalViewToggled( b_switch ); + emit minimalViewToggled( b_minimalView ); } /* toggling advanced controls buttons */ -void MainInterface::toggleAdvanced() +void MainInterface::toggleAdvancedButtons() { controls->toggleAdvanced(); // if( fullscreenControls ) fullscreenControls->toggleAdvanced(); @@ -1017,6 +822,7 @@ void MainInterface::toggleAdvanced() /* 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 ); } @@ -1039,7 +845,6 @@ void MainInterface::visual() visualSelector->hide(); visualSelectorEnabled = false; } - doComponentsUpdate(); } #endif @@ -1085,6 +890,12 @@ void MainInterface::showCryptedLabel( bool b_show ) cryptedLabel->setVisible( b_show ); } +void MainInterface::showBuffering( float f_cache ) +{ + QString amount = QString("Buffering: %1%").arg( (int)(100*f_cache) ); + statusBar()->showMessage( amount, 1000 ); +} + /***************************************************************************** * Systray Icon and Systray Menu *****************************************************************************/ @@ -1097,9 +908,9 @@ void MainInterface::createSystray() { QIcon iconVLC; if( QDate::currentDate().dayOfYear() >= 354 ) - iconVLC = QIcon( QPixmap( ":/logo/vlc128-christmas.png" ) ); + iconVLC = QIcon( ":/logo/vlc128-christmas.png" ); else - iconVLC = QIcon( QPixmap( ":/logo/vlc128.png" ) ); + iconVLC = QIcon( ":/logo/vlc128.png" ); sysTray = new QSystemTrayIcon( iconVLC, this ); sysTray->setToolTip( qtr( "VLC media player" )); @@ -1168,7 +979,11 @@ void MainInterface::handleSystrayClick( { case QSystemTrayIcon::Trigger: case QSystemTrayIcon::DoubleClick: +#ifdef Q_WS_MAC + QVLCMenu::updateSystrayMenu( this, p_intf ); +#else toggleUpdateSystrayMenu(); +#endif break; case QSystemTrayIcon::MiddleClick: sysTray->showMessage( qtr( "VLC media player" ), @@ -1193,7 +1008,7 @@ void MainInterface::updateSystrayTooltipName( const QString& name ) else { sysTray->setToolTip( name ); - if( notificationEnabled && ( isHidden() || isMinimized() ) ) + if( b_notificationEnabled && ( isHidden() || isMinimized() ) ) { sysTray->showMessage( qtr( "VLC media player" ), name, QSystemTrayIcon::NoIcon, 3000 ); @@ -1211,23 +1026,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 ); } @@ -1243,8 +1050,9 @@ void MainInterface::dropEvent(QDropEvent *event) void MainInterface::dropEventPlay( QDropEvent *event, bool b_play ) { - event->setDropAction( Qt::CopyAction ); - if( !event->possibleActions() & Qt::CopyAction ) + if( event->possibleActions() & Qt::CopyAction ) + event->setDropAction( Qt::CopyAction ); + else return; const QMimeData *mimeData = event->mimeData(); @@ -1264,18 +1072,30 @@ void MainInterface::dropEventPlay( QDropEvent *event, bool b_play ) bool first = b_play; foreach( const QUrl &url, mimeData->urls() ) { - QString s = toNativeSeparators( url.toLocalFile() ); - - if( s.length() > 0 ) { - char* psz_uri = make_URI( qtu(s) ); + if( url.isValid() ) + { + char* psz_uri = make_URI( qtu( url.toString() ), NULL ); playlist_Add( THEPL, psz_uri, NULL, PLAYLIST_APPEND | (first ? PLAYLIST_GO: PLAYLIST_PREPARSE), PLAYLIST_END, true, pl_Unlocked ); free( psz_uri ); first = false; - RecentsMRL::getInstance( p_intf )->addRecent( s ); + RecentsMRL::getInstance( p_intf )->addRecent( url.toString() ); } } + + /* Browsers give content as text if you dnd the addressbar, + so check if mimedata has valid url in text and use it + if we didn't get any normal Urls()*/ + if( !mimeData->hasUrls() && mimeData->hasText() && + QUrl(mimeData->text()).isValid() ) + { + char *psz_uri = make_URI( qtu( mimeData->text() ), NULL ); + playlist_Add( THEPL, psz_uri, NULL, + PLAYLIST_APPEND | (first ? PLAYLIST_GO: PLAYLIST_PREPARSE), + PLAYLIST_END, true, pl_Unlocked ); + free( psz_uri ); + } event->accept(); } void MainInterface::dragEnterEvent(QDragEnterEvent *event) @@ -1294,30 +1114,6 @@ void MainInterface::dragLeaveEvent(QDragLeaveEvent *event) /************************************************************************ * Events stuff ************************************************************************/ -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; - if( p_event->OnTop() ) - setWindowFlags( windowFlags() | Qt::WindowStaysOnTopHint ); - else - setWindowFlags( windowFlags() & ~Qt::WindowStaysOnTopHint ); - show(); /* necessary to apply window flags */ - } -} - void MainInterface::keyPressEvent( QKeyEvent *e ) { handleKeyPress( e ); @@ -1325,10 +1121,9 @@ void MainInterface::keyPressEvent( QKeyEvent *e ) void MainInterface::handleKeyPress( QKeyEvent *e ) { - if( ( e->modifiers() & Qt::ControlModifier ) && ( e->key() == Qt::Key_H ) - && !menuBar()->isVisible() ) + if( ( e->modifiers() & Qt::ControlModifier ) && ( e->key() == Qt::Key_H ) ) { - toggleMinimalView( false ); + toggleMinimalView( !b_minimalView ); e->accept(); } @@ -1342,27 +1137,6 @@ void MainInterface::handleKeyPress( 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 ); @@ -1377,79 +1151,19 @@ void MainInterface::closeEvent( QCloseEvent *e ) THEDP->quit(); } -void MainInterface::toggleFullScreen( void ) +void MainInterface::setInterfaceFullScreen( bool fs ) { - if( isFullScreen() ) - { - showNormal(); - emit askUpdate(); // Needed if video was launched after the F11 - emit fullscreenInterfaceToggled( false ); - } + if( fs ) + setWindowState( windowState() | Qt::WindowFullScreen ); else - { - showFullScreen(); - emit fullscreenInterfaceToggled( true ); - } - + setWindowState( windowState() & ~Qt::WindowFullScreen ); } - -//moc doesn't know about #ifdef, so we have to build this method for every platform -void MainInterface::changeThumbbarButtons( int i_status) +void MainInterface::toggleInterfaceFullScreen() { -#ifdef WIN32 - // Define an array of two buttons. These buttons provide images through an - // image list and also provide tooltips. - DWORD dwMask = THB_BITMAP | THB_FLAGS; - - THUMBBUTTON thbButtons[3]; - //prev - thbButtons[0].dwMask = dwMask; - thbButtons[0].iId = 0; - thbButtons[0].iBitmap = 0; - - //play/pause - thbButtons[1].dwMask = dwMask; - thbButtons[1].iId = 1; - - //next - thbButtons[2].dwMask = dwMask; - thbButtons[2].iId = 2; - thbButtons[2].iBitmap = 3; - - switch( i_status ) - { - case 0: - case END_S: - { - thbButtons[0].dwFlags = THBF_HIDDEN; - thbButtons[1].dwFlags = THBF_HIDDEN; - thbButtons[2].dwFlags = THBF_HIDDEN; - break; - } - case PLAYING_S: - { - thbButtons[0].dwFlags = THBF_ENABLED; - thbButtons[1].dwFlags = THBF_ENABLED; - thbButtons[2].dwFlags = THBF_ENABLED; - thbButtons[1].iBitmap = 1; - break; - } - case PAUSE_S: - { - //thbButtons[0].dwFlags = THBF_ENABLED; - //thbButtons[1].dwFlags = THBF_ENABLED; - //thbButtons[2].dwFlags = THBF_ENABLED; - thbButtons[1].iBitmap = 2; - break; - } - } - - HRESULT hr = p_taskbl->vt->ThumbBarUpdateButtons(p_taskbl, GetForegroundWindow(), 3, thbButtons); - if(S_OK != hr) - msg_Err( p_intf, "ThumbBarUpdateButtons failed with error %08x", hr ); -#else - ; -#endif + b_interfaceFullScreen = !b_interfaceFullScreen; + if( !b_videoFullScreen ) + setInterfaceFullScreen( b_interfaceFullScreen ); + emit fullscreenInterfaceToggled( b_interfaceFullScreen ); } /***************************************************************************** @@ -1483,4 +1197,3 @@ static int IntfShowCB( vlc_object_t *p_this, const char *psz_variable, /* Show event */ return VLC_SUCCESS; } -