X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fmain_interface.cpp;h=300bea7ad843d086a0aee1a9a8dc50d313d12abe;hb=2a100fcd186304e600d6d896325855836fa899e6;hp=5e26980c1d2eba7871b5f5176eb28edb0e56575c;hpb=3f6e3c48ca8727dd82256e0680ef32d7e9d334d1;p=vlc diff --git a/modules/gui/qt4/main_interface.cpp b/modules/gui/qt4/main_interface.cpp index 5e26980c1d..300bea7ad8 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,20 +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 "dialogs/firstrun.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 @@ -56,22 +56,13 @@ #include #include #include -#include -#include #include -#ifdef WIN32 - #include - #include -#endif - -#include - -#include /* Wheel event */ -#include -#include +#include /* Wheel event */ +#include /* vout_thread_t and VOUT_ events */ // #define DEBUG_INTF + /* Callback prototypes */ static int PopupMenuCB( vlc_object_t *p_this, const char *psz_variable, vlc_value_t old_val, vlc_value_t new_val, void *param ); @@ -81,10 +72,10 @@ 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 @@ -93,14 +84,13 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) controls = NULL; inputC = NULL; - b_hideAfterCreation = false; - playlistVisible = false; // FIXME remove + b_hideAfterCreation = false; // --qt-start-minimized + playlistVisible = false; input_name = ""; - i_bg_height = 0; /* Ask for Privacy */ - new FirstRun( this, p_intf ); + FirstRun::CheckAndRun( this, p_intf ); /** * Configuration and settings @@ -111,33 +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" ); + 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 * @@ -148,7 +136,6 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) * UI and Widgets design **************************/ setVLCWindowsTitle(); - createMainWidget( settings ); /************ * Menu Bar * @@ -157,6 +144,7 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) CONNECT( THEMIM->getIM(), voutListChanged( vout_thread_t **, int ), this, destroyPopupMenu() ); + createMainWidget( settings ); /********************************* * Create the Systray Management * *********************************/ @@ -168,7 +156,9 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) MainInputManager::getInstance( p_intf ); #ifdef WIN32 - createTaskBarButtons(); + himl = NULL; + p_taskbl = NULL; + taskbar_wmsg = RegisterWindowMessage("TaskbarButtonCreated"); #endif /************************************************************ @@ -190,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& ) ); @@ -210,102 +200,70 @@ 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() ); - /* Enable the popup menu in the MI */ - setContextMenuPolicy( Qt::CustomContextMenu ); - CONNECT( this, customContextMenuRequested( const QPoint& ), - this, popupMenu( const QPoint& ) ); - /** END of CONNECTS**/ - /**** FINAL SIZING and placement of interface */ - settings->beginGroup( "MainWindow" ); - QVLCTools::restoreWidgetPosition( settings, this, QSize(380, 60) ); + /************ + * Callbacks + ************/ + var_AddCallback( p_intf->p_libvlc, "intf-show", IntfShowCB, p_intf ); - /* 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 ); - } - } + /* Register callback for the intf-popupmenu variable */ + var_AddCallback( p_intf->p_libvlc, "intf-popupmenu", PopupMenuCB, p_intf ); - msg_Dbg( p_intf, "%i", stackCentralOldState ); /* Playlist */ - if( settings->value( "playlist-visible", 0 ).toInt() ) - togglePlaylist(); + int i_plVis = settings->value( "MainWindow/playlist-visible", false ).toBool(); + + 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 ); - //setMinimumSize( QSize( 0, 0 ) ); - // setMinimumWidth( __MAX( controls->sizeHint().width(), - // menuBar()->sizeHint().width() ) ); - debug(); - /* And switch to minimal view if needed - Must be called after the show() */ - if( i_visualmode == QT_MINIMAL_MODE ) - toggleMinimalView( true ); + computeMinimumSize(); - /* Update the geometry : It is useful if you switch between - qt-display-modes */ - updateGeometry(); - resize( sizeHint() ); + /* Switch to minimal view if needed, must be called after the show() */ + if( b_minimalView ) + toggleMinimalView( true ); } MainInterface::~MainInterface() { - msg_Dbg( p_intf, "Destroying the main interface" ); - /* Unsure we hide the videoWidget before destroying it */ - if( stackCentralOldState == VIDEO_TAB ) - showBg(); - - /* Save playlist state */ - if( playlistWidget ) - { - if( !isDocked() ) - QVLCTools::saveWidgetPosition( p_intf, "Playlist", playlistWidget ); - - delete playlistWidget; - } + if( stackCentralOldWidget == videoWidget ) + showTab( bgWidget ); #ifdef WIN32 if( himl ) @@ -315,29 +273,43 @@ 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 ); var_DelCallback( p_intf->p_libvlc, "intf-popupmenu", PopupMenuCB, p_intf ); @@ -345,24 +317,36 @@ MainInterface::~MainInterface() p_intf->p_sys->p_mi = NULL; } +void MainInterface::computeMinimumSize() +{ + int minWidth = 30; + if( menuBar()->isVisible() ) + minWidth += __MAX( controls->sizeHint().width(), menuBar()->sizeHint().width() ); + + setMinimumWidth( minWidth ); +} + /***************************** * Main UI handling * *****************************/ 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 ); + 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 ); @@ -375,89 +359,69 @@ void MainInterface::createMainWidget( QSettings *settings ) QWidget *main = new QWidget; setCentralWidget( main ); mainLayout = new QVBoxLayout( main ); - - /* Margins, spacing */ main->setContentsMargins( 0, 0, 0, 0 ); mainLayout->setSpacing( 0 ); mainLayout->setMargin( 0 ); /* */ - stackCentralW = new QStackedWidget( main ); + stackCentralW = new QVLCStackedWidget( main ); /* Bg Cone */ bgWidget = new BackgroundWidget( p_intf ); - bgWidget->resize( - settings->value( "backgroundSize", QSize( 300, 200 ) ).toSize() ); - bgWidget->updateGeometry(); - stackCentralW->insertWidget( BACKG_TAB, bgWidget ); - + stackCentralW->addWidget( bgWidget ); /* And video Outputs */ - if( videoEmbeddedFlag ) + if( b_videoEmbedded ) { videoWidget = new VideoWidget( p_intf ); - stackCentralW->insertWidget( VIDEO_TAB, videoWidget ); + stackCentralW->addWidget( videoWidget ); } - mainLayout->insertWidget( 1, stackCentralW, 100 ); + mainLayout->insertWidget( 1, stackCentralW ); + settings->beginGroup( "MainWindow" ); + stackWidgetsSizes[bgWidget] = settings->value( "bgSize", QSize( 400, 0 ) ).toSize(); + /* Resize even if no-auto-resize, because we are at creation */ + resizeStack( stackWidgetsSizes[bgWidget].width(), stackWidgetsSizes[bgWidget].height() ); /* Create the CONTROLS Widget */ controls = new ControlsWidget( p_intf, settings->value( "adv-controls", false ).toBool(), this ); - CONNECT( controls, advancedControlsToggled( bool ), - this, doComponentsUpdate() ); - CONNECT( controls, sizeChanged(), - this, doComponentsUpdate() ); inputC = new InputControlsWidget( p_intf, this ); - if( i_visualmode != QT_ALWAYS_VIDEO_MODE && - i_visualmode != QT_MINIMAL_MODE ) - { - hideStackWidget(); - stackCentralOldState = HIDDEN_TAB; - } - else - { - showTab( BACKG_TAB ); - stackCentralOldState = BACKG_TAB; - } - - - //mainLayout->setRowStretch( 1, 10 ); mainLayout->insertWidget( 2, inputC ); mainLayout->insertWidget( settings->value( "ToolbarPos", 0 ).toInt() ? 0: 3, controls ); - /* Visualisation */ - /* Disabled for now, they SUCK */ + /* Visualisation, disabled for now, they SUCK */ #if 0 visualSelector = new VisualSelector( p_intf ); mainLayout->insertWidget( 0, visualSelector ); visualSelector->hide(); #endif - /* Finish the sizing */ - main->updateGeometry(); + settings->endGroup(); - 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, this ); - CONNECT( fullscreenControls, keyPressed( QKeyEvent * ), - this, handleKeyPress( QKeyEvent * ) ); - } + /* Enable the popup menu in the MI */ + main->setContextMenuPolicy( Qt::CustomContextMenu ); + CONNECT( main, customContextMenuRequested( const QPoint& ), + this, popupMenu( const QPoint& ) ); + + 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 = config_GetInt( p_intf, "qt-system-tray" ); + bool b_systrayWanted = var_InheritBool( p_intf, "qt-system-tray" ); - if( config_GetInt( p_intf, "qt-start-minimized") > 0 ) + if( var_InheritBool( p_intf, "qt-start-minimized") ) { if( b_systrayAvailable ) { @@ -485,12 +449,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 ); @@ -505,275 +473,67 @@ 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" ); - } + CONNECT( THEMIM->getIM(), seekRequested( float ), + timeLabel, setDisplayPosition( float ) ); - CoInitialize( 0 ); - - 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 - - - /********************************************************************** * 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 -{ -#if 0 - 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; - } - } -#endif - - int nwidth = __MAX( controls->sizeHint().width(), - menuBar()->sizeHint().width() ); - - int nheight = controls->isVisible() ? - controls->size().height() - + inputC->size().height() - + menuBar()->size().height() - + statusBar()->size().height() - : 0 ; - - if( stackCentralW->isVisible() ) - nheight += stackCentralW->height(); - nwidth = __MAX( nwidth, stackCentralW->width() ); - -/* if( VISIBLE( bgWidget ) ) - { - msg_Warn( p_intf, "Hello here" ); - if( i_bg_height ) - nheight += i_bg_height; - else - nheight += bgWidget->size().height(); - nwidth = __MAX( nwidth, bgWidget->size().width() ); - } - else if( videoIsActive && videoWidget->isVisible() ) - { - msg_Warn( p_intf, "Hello there" ); - 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 ); - } -#endif - return QSize( nwidth, nheight ); -} - - -/* 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() -{ - if( isFullScreen() || isMaximized() ) return; - -// msg_Warn( p_intf, "Updating the geometry" ); - /* Here we resize to sizeHint() and not adjustsize because we want - the videoWidget to be exactly the correctSize */ - -#ifndef NDEBUG - debug(); -#endif - /* This is WRONG, but I believe there is a Qt bug here */ - setMinimumSize( 0, 0 ); - resize( sizeHint() ); - - //adjustSize() ; /* This is not needed, but might help in the future */ -} - void MainInterface::debug() { -#ifndef NDEBUG - msg_Dbg( p_intf, "Stack Size: %i - %i", stackCentralW->size().height(), size().width() ); - msg_Dbg( p_intf, "Stack Size: %i - %i", stackCentralW->widget( VIDEO_TAB )->size().height(), stackCentralW->widget( VIDEO_TAB )->size().width() ); - +#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, "maximumsize: %i - %i", maximumSize().height(), maximumSize().width() ); - - msg_Dbg( p_intf, "Stack minimumsize: %i - %i", stackCentralW->minimumSize().height(), stackCentralW->minimumSize().width() ); - msg_Dbg( p_intf, "Controls minimumsize: %i - %i", controls->minimumSize().height(), controls->minimumSize().width() ); - msg_Dbg( p_intf, "Central minimumsize: %i - %i", centralWidget()->minimumSize().height(), centralWidget()->minimumSize().width() ); - msg_Dbg( p_intf, "Menu minimumsize: %i - %i", menuBar()->minimumSize().height(), menuBar()->minimumSize().width() ); - msg_Dbg( p_intf, "Input minimuSize: %i - %i", inputC->minimumSize().height(), inputC->minimumSize().width() ); - msg_Dbg( p_intf, "Status minimumsize: %i - %i", statusBar()->minimumSize().height(), statusBar()->minimumSize().width() ); msg_Dbg( p_intf, "minimumsize: %i - %i", minimumSize().height(), minimumSize().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() ); - }*/ + 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 } -inline void MainInterface::showTab( int i_tab ) +inline void MainInterface::showVideo() { showTab( videoWidget ); } +inline void MainInterface::restoreStackOldWidget() + { showTab( stackCentralOldWidget ); } + +inline void MainInterface::showTab( QWidget *widget ) { #ifdef DEBUG_INTF - msg_Err( p_intf, "showTab %i", i_tab ); - msg_Warn( p_intf, "Old stackCentralOldState %i", stackCentralOldState ); -#endif - stackCentralOldState = stackCentralW->isVisible() ? stackCentralW->currentIndex() - : HIDDEN_TAB; -#ifdef DEBUG_INTF - msg_Warn( p_intf, "State change %i %i", stackCentralW->currentIndex(), i_tab ); + msg_Warn( p_intf, "Old stackCentralOldWidget %i", stackCentralW->indexOf( stackCentralOldWidget ) ); #endif - if( i_visualmode == QT_NORMAL_MODE ) - { - stackCentralW->setVisible( i_tab != HIDDEN_TAB ); - doComponentsUpdate(); // resize the player - } - else - if( i_tab == HIDDEN_TAB ) i_tab == BACKG_TAB; + stackCentralOldWidget = stackCentralW->currentWidget(); + stackWidgetsSizes[stackCentralOldWidget] = stackCentralW->size(); - stackCentralW->setCurrentIndex( i_tab ); + stackCentralW->setCurrentWidget( widget ); + if( b_autoresize ) + resizeStack( stackWidgetsSizes[widget].width(), stackWidgetsSizes[widget].height() ); #ifdef DEBUG_INTF - msg_Warn( p_intf, "New stackCentralOldState %i", stackCentralOldState ); + msg_Warn( p_intf, "State change %i", stackCentralW->currentIndex() ); + msg_Warn( p_intf, "New stackCentralOldWidget %i", stackCentralW->indexOf( stackCentralOldWidget ) ); #endif } -inline void MainInterface::restoreStackOldWidget() +void MainInterface::destroyPopupMenu() { -#ifdef DEBUG_INTF - msg_Warn( p_intf, "Old stackCentralOldState %i", stackCentralOldState ); -#endif - int temp = stackCentralW->isVisible() ? stackCentralW->currentIndex() - : HIDDEN_TAB; - stackCentralW->setCurrentIndex( stackCentralOldState ); - if( i_visualmode == QT_NORMAL_MODE ) - { - stackCentralW->setVisible( stackCentralOldState != HIDDEN_TAB ); - doComponentsUpdate(); // resize the player - } - - stackCentralOldState = temp; -#ifdef DEBUG_INTF - msg_Warn( p_intf, "Debug %i %i", temp, stackCentralW->currentIndex() ); -#endif + QVLCMenu::PopupMenu( p_intf, false ); } -void MainInterface::destroyPopupMenu() +void MainInterface::popupMenu( const QPoint &p ) { - QVLCMenu::PopupMenu( p_intf, false ); + QVLCMenu::PopupMenu( p_intf, true ); } void MainInterface::toggleFSC() @@ -784,37 +544,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... @@ -837,65 +573,124 @@ void MainInterface::getVideoSlot( WId *p_id, int *pi_x, int *pi_y, { /* Request the videoWidget */ WId ret = videoWidget->request( pi_x, pi_y, - pi_width, pi_height, b_keep_size ); + pi_width, pi_height, !b_autoresize ); *p_id = ret; if( ret ) /* The videoWidget is available */ { - /* ask videoWidget to show */ - videoWidget->SetSizing( *pi_width, *pi_height ); - /* Consider the video active now */ showVideo(); - stackCentralW->resize( *pi_width, *pi_height ); - - 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 ); - restoreStackOldWidget(); + if( stackCentralW->currentWidget() == videoWidget ) + restoreStackOldWidget(); - /* Try to resize, except when you are in Fullscreen mode */ -// doComponentsUpdate(); + /* We don't want to have a blank video to popup */ + stackCentralOldWidget = bgWidget; +} + +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 + { + /* TODO do we want to restore screen and position ? (when + * qt-fullscreen-screennumber is forced) */ + setMinimalView( b_minimalView ); + setInterfaceFullScreen( b_interfaceFullScreen ); + } + videoWidget->sync(); +} + +/* 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; + + 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 */ int MainInterface::controlVideo( int i_query, va_list args ) { - /* Debug to check if VOUT_WINDOW_SET_SIZE is called, because this is broken now */ - msg_Warn( p_intf, "Control Video: %i", i_query ); switch( i_query ) { case VOUT_WINDOW_SET_SIZE: { 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; } @@ -911,16 +706,20 @@ int MainInterface::controlVideo( int i_query, va_list args ) /** * Toggle the playlist widget or dialog **/ -void MainInterface::createPlaylist( bool b_show ) +void MainInterface::createPlaylist() { - playlistWidget = new PlaylistWidget( p_intf ); - - i_pl_dock = PL_BOTTOM; - /* i_pl_dock = (pl_dock_e)getSettings() - ->value( "pl-dock-status", PL_UNDOCKED ).toInt(); */ + playlistWidget = new PlaylistWidget( p_intf, this ); - if( i_pl_dock == PL_UNDOCKED ) + 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, @@ -928,100 +727,110 @@ void MainInterface::createPlaylist( bool b_show ) QVLCTools::restoreWidgetPosition( p_intf, "Playlist", playlistWidget, QSize( 600, 300 ) ); } - else - { -#ifdef DEBUG_INTF - msg_Warn( p_intf, "Here %i", stackCentralW->currentIndex() ); -#endif - stackCentralW->insertWidget( PLAYL_TAB, playlistWidget ); -#ifdef DEBUG_INTF - msg_Warn( p_intf, "Here %i", stackCentralW->currentIndex() ); -#endif - } - - if( b_show ) - { - playlistVisible = true; - stackCentralW->show(); - } } void MainInterface::togglePlaylist() { -#ifdef DEBUG_INTF - msg_Warn( p_intf, "Here toggling %i %i", stackCentralW->currentIndex(), stackCentralOldState ); -#endif if( !playlistWidget ) { - createPlaylist( true ); + createPlaylist(); } -#ifdef DEBUG_INTF - msg_Warn( p_intf, "Here toggling %i %i", stackCentralW->currentIndex(), stackCentralOldState ); -#endif - if( i_pl_dock != PL_UNDOCKED ) + if( b_plDocked ) { - /* Playlist not visible */ - if( stackCentralW->currentIndex() != PLAYL_TAB ) + /* Playlist is not visible, show it */ + if( stackCentralW->currentWidget() != playlistWidget ) { - showTab( PLAYL_TAB ); - stackCentralW->show(); + showTab( playlistWidget ); } - else + else /* Hide it! */ { restoreStackOldWidget(); } - playlistVisible = ( stackCentralW->currentIndex() == PLAYL_TAB ); - //doComponentsUpdate(); //resize( sizeHint() ); + playlistVisible = ( stackCentralW->currentWidget() == playlistWidget ); + } + else + { +#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 ) +/* + * setMinimalView is the private function used by + * the SLOT toggleMinimalView and setVideoFullScreen + */ +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 ) +/* + * This public SLOT is used for moving to minimal View Mode + * + * 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 */ - stackCentralW->show(); - if( !videoWidget || stackCentralW->currentIndex() != VIDEO_TAB ) - { - showBg(); - } - 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( stackCentralOldState == BACKG_TAB ) - stackCentralOldState = HIDDEN_TAB; - else - stackCentralOldState = BACKG_TAB; + if( stackCentralW->height() < 16 ) + { + resizeStack( stackCentralW->width(), 100 ); + } } } + b_minimalView = b_minimal; + if( !b_videoFullScreen ) + { + setMinimalView( b_minimalView ); + computeMinimumSize(); + } - i_bg_height = stackCentralW->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(); @@ -1030,6 +839,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 ); } @@ -1052,7 +862,6 @@ void MainInterface::visual() visualSelector->hide(); visualSelectorEnabled = false; } - doComponentsUpdate(); } #endif @@ -1098,6 +907,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 *****************************************************************************/ @@ -1181,7 +996,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" ), @@ -1206,7 +1025,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 ); @@ -1224,23 +1043,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 ); } @@ -1256,8 +1067,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(); @@ -1277,18 +1089,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( url.toEncoded().constData(), 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) @@ -1307,30 +1131,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 ); @@ -1338,10 +1138,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(); } @@ -1355,31 +1154,6 @@ void MainInterface::handleKeyPress( QKeyEvent *e ) e->ignore(); } -void MainInterface::resizeEvent( QResizeEvent * event ) -{ -#if 0 - 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(); - } - } -#endif - QVLCMW::resizeEvent( event ); - msg_Dbg( p_intf, "Resize Event, height: %i", size().height() ); -} - void MainInterface::wheelEvent( QWheelEvent *e ) { int i_vlckey = qtWheelEventToVLCKey( e ); @@ -1394,79 +1168,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 ); } /*****************************************************************************