X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fmain_interface.cpp;h=5722ba571935b94290732ef7b250331e0e56934d;hb=3834b98eedc37503d888a8bffa03eb48536b1e1f;hp=33cbba1f663abfbf0199a21388206aa9b488d7da;hpb=52c18c4dec68158eedd655e0502820b7d7b6128f;p=vlc diff --git a/modules/gui/qt4/main_interface.cpp b/modules/gui/qt4/main_interface.cpp index 33cbba1f66..5722ba5719 100644 --- a/modules/gui/qt4/main_interface.cpp +++ b/modules/gui/qt4/main_interface.cpp @@ -32,6 +32,7 @@ #include "main_interface.hpp" #include "input_manager.hpp" #include "actions_manager.hpp" +#include "extensions_manager.hpp" // killInstance #include "util/customwidgets.hpp" #include "util/qt_dirs.hpp" @@ -40,6 +41,7 @@ #include "components/controller.hpp" #include "components/playlist/playlist.hpp" #include "dialogs/external.hpp" +#include "dialogs/firstrun.hpp" #include "menus.hpp" #include "recents.hpp" @@ -57,12 +59,20 @@ #include #include #include +#include + +#ifdef WIN32 + #include + #include +#endif #include #include /* Wheel event */ -#include +#include +#include +// #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 ); @@ -76,21 +86,22 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) bgWidget = NULL; videoWidget = NULL; playlistWidget = NULL; +#ifndef HAVE_MAEMO sysTray = NULL; - videoIsActive = false; - playlistVisible = false; - input_name = ""; +#endif fullscreenControls = NULL; cryptedLabel = NULL; controls = NULL; inputC = NULL; - b_shouldHide = false; - bgWasVisible = false; + b_hideAfterCreation = false; + playlistVisible = false; // FIXME remove + input_name = ""; + i_bg_height = 0; - /* Ask for privacy */ - askForPrivacy(); + /* Ask for Privacy */ + FirstRun::CheckAndRun( this, p_intf ); /** * Configuration and settings @@ -99,17 +110,21 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) /* Main settings */ setFocusPolicy( Qt::StrongFocus ); setAcceptDrops( true ); + setWindowRole( "vlc-main" ); setWindowIcon( QApplication::windowIcon() ); - setWindowOpacity( config_GetFloat( p_intf, "qt-opacity" ) ); + setWindowOpacity( var_InheritFloat( p_intf, "qt-opacity" ) ); /* Set The Video In emebedded Mode or not */ - videoEmbeddedFlag = config_GetInt( p_intf, "embedded-video" ); + videoEmbeddedFlag = 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_keep_size = !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" ); + i_visualmode = var_InheritInteger( p_intf, "qt-display-mode" ); + + /* Do we want anoying popups or not */ + notificationEnabled = (bool)var_InheritBool( p_intf, "qt-notification" ); /* Set the other interface settings */ settings = getSettings(); @@ -124,8 +139,6 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) mainBasedSize = settings->value( "mainBasedSize", QSize( 350, 120 ) ).toSize(); mainVideoSize = settings->value( "mainVideoSize", QSize( 400, 300 ) ).toSize(); - /* Do we want anoying popups or not */ - notificationEnabled = (bool)config_GetInt( p_intf, "qt-notification" ); /************** * Status Bar * @@ -145,69 +158,61 @@ 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 + /********************************* + * Create the Systray Management * + *********************************/ + initSystray(); /******************** * Input Manager * ********************/ MainInputManager::getInstance( p_intf ); - /********************************* - * Create the Systray Management * - *********************************/ - initSystray(); - - /************************** - * Various CONNECTs on IM * - **************************/ - /* Connect the input manager to the GUI elements it manages */ +#ifdef WIN32 + himl = NULL; + p_taskbl = NULL; + taskbar_wmsg = RegisterWindowMessage("TaskbarButtonCreated"); +#endif + /************************************************************ + * Connect the input manager to the GUI elements it manages * + ************************************************************/ /** * Connects on nameChanged() - * Those connects are not merged because different options can trigger - * them down. - */ - /* Naming in the controller statusbar */ - CONNECT( THEMIM->getIM(), nameChanged( QString ), - this, setName( QString ) ); - /* and in the systray */ + * Those connects are different because options can impeach them to trigger. + **/ + /* Main Interface statusbar */ + CONNECT( THEMIM->getIM(), nameChanged( const QString& ), + this, setName( const QString& ) ); + /* and systray */ +#ifndef HAVE_MAEMO if( sysTray ) { - CONNECT( THEMIM->getIM(), nameChanged( QString ), this, - updateSystrayTooltipName( QString ) ); + CONNECT( THEMIM->getIM(), nameChanged( const QString& ), + this, updateSystrayTooltipName( const QString& ) ); } - /* and in the title of the controller */ - if( config_GetInt( p_intf, "qt-name-in-title" ) ) +#endif + /* and title of the Main Interface*/ + if( var_InheritBool( p_intf, "qt-name-in-title" ) ) { - CONNECT( THEMIM->getIM(), nameChanged( QString ), this, - setVLCWindowsTitle( QString ) ); + CONNECT( THEMIM->getIM(), nameChanged( const QString& ), + this, setVLCWindowsTitle( const QString& ) ); } /** * CONNECTS on PLAY_STATUS **/ /* Status on the systray */ +#ifndef HAVE_MAEMO if( sysTray ) { CONNECT( THEMIM->getIM(), statusChanged( int ), this, updateSystrayTooltipStatus( int ) ); } - +#endif /* END CONNECTS ON IM */ - dialogHandler = new DialogHandler (p_intf); - /************ * Callbacks ************/ @@ -217,24 +222,36 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) var_AddCallback( p_intf->p_libvlc, "intf-popupmenu", PopupMenuCB, p_intf ); - /* VideoWidget connects to avoid different threads speaking to each other */ + /* VideoWidget connects for asynchronous calls */ + 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 ); + this, SLOT(releaseVideoSlot( void )), + Qt::BlockingQueuedConnection ); if( videoWidget ) { CONNECT( this, askVideoToResize( unsigned int, unsigned int ), videoWidget, SetSizing( unsigned int, unsigned int ) ); - - connect( this, SIGNAL(askVideoToShow( unsigned int, unsigned int)), - videoWidget, SLOT(SetSizing(unsigned int, unsigned int )), - Qt::BlockingQueuedConnection ); + CONNECT( this, askVideoSetFullScreen( bool ), + videoWidget, SetFullScreen( bool ) ); + CONNECT( videoWidget, keyPressed( QKeyEvent * ), + this, handleKeyPress( QKeyEvent * ) ); } CONNECT( this, askUpdate(), this, doComponentsUpdate() ); CONNECT( THEDP, toolBarConfUpdated(), this, recreateToolbars() ); - /* Size and placement of interface */ + /* 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) ); @@ -252,42 +269,40 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) } } - bool b_visible = settings->value( "playlist-visible", 0 ).toInt(); - settings->endGroup(); + msg_Dbg( p_intf, "%i", stackCentralOldState ); /* Playlist */ - if( b_visible ) togglePlaylist(); + int i_plVis = settings->value( "playlist-visible", 0 ).toInt(); - /* Enable the popup menu in the MI */ - setContextMenuPolicy( Qt::CustomContextMenu ); - CONNECT( this, customContextMenuRequested( const QPoint& ), - this, popupMenu( const QPoint& ) ); + settings->endGroup(); + + if( i_plVis ) togglePlaylist(); /* Final sizing and showing */ - setMinimumWidth( __MAX( controls->sizeHint().width(), - menuBar()->sizeHint().width() ) ); - setVisible( !b_shouldHide ); + 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 ); /* Update the geometry : It is useful if you switch between - qt-display-modes ?*/ + qt-display-modes */ updateGeometry(); resize( sizeHint() ); - } MainInterface::~MainInterface() { msg_Dbg( p_intf, "Destroying the main interface" ); - delete dialogHandler; - /* Unsure we hide the videoWidget before destroying it */ - if( videoIsActive ) videoWidget->hide(); + if( stackCentralOldState == VIDEO_TAB ) + showBg(); /* Save playlist state */ if( playlistWidget ) @@ -298,9 +313,20 @@ MainInterface::~MainInterface() delete playlistWidget; } +#ifdef WIN32 + if( himl ) + ImageList_Destroy( himl ); + if(p_taskbl) + p_taskbl->vt->Release(p_taskbl); + CoUninitialize(); +#endif + /* Be sure to kill the actionsManager... FIXME */ ActionsManager::killInstance(); + /* Idem, FIXME */ + ExtensionsManager::killInstance(); + /* Delete the FSC controller */ delete fullscreenControls; @@ -321,7 +347,6 @@ MainInterface::~MainInterface() QVLCTools::saveWidgetPosition(settings, this); settings->endGroup(); - /* Unregister callbacks */ var_DelCallback( p_intf->p_libvlc, "intf-show", IntfShowCB, p_intf ); var_DelCallback( p_intf->p_libvlc, "intf-popupmenu", PopupMenuCB, p_intf ); @@ -334,19 +359,22 @@ MainInterface::~MainInterface() *****************************/ void MainInterface::recreateToolbars() { + //msg_Dbg( p_intf, "Recreating the toolbars" ); 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() ); + inputC = new InputControlsWidget( p_intf, this ); - mainLayout->insertWidget( 2, inputC, 0, Qt::AlignBottom ); + mainLayout->insertWidget( 2, inputC ); mainLayout->insertWidget( settings->value( "ToolbarPos", 0 ).toInt() ? 0: 3, - controls, 0, Qt::AlignBottom ); + controls ); settings->endGroup(); } @@ -359,34 +387,27 @@ void MainInterface::createMainWidget( QSettings *settings ) /* Margins, spacing */ 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 QStackedWidget( main ); /* Bg Cone */ bgWidget = new BackgroundWidget( p_intf ); bgWidget->resize( settings->value( "backgroundSize", QSize( 300, 200 ) ).toSize() ); bgWidget->updateGeometry(); - CONNECT( this, askBgWidgetToToggle(), bgWidget, toggle() ); + stackCentralW->insertWidget( BACKG_TAB, bgWidget ); - if( i_visualmode != QT_ALWAYS_VIDEO_MODE && - i_visualmode != QT_MINIMAL_MODE ) - { - bgWidget->hide(); - } /* And video Outputs */ if( videoEmbeddedFlag ) + { videoWidget = new VideoWidget( p_intf ); + stackCentralW->insertWidget( VIDEO_TAB, videoWidget ); + } + mainLayout->insertWidget( 1, stackCentralW, 100 ); + /* Create the CONTROLS Widget */ controls = new ControlsWidget( p_intf, @@ -397,13 +418,31 @@ void MainInterface::createMainWidget( QSettings *settings ) 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; + } + - /* Add the controls Widget to the main Widget */ - mainLayout->insertWidget( 0, bgWidget ); - if( videoWidget ) mainLayout->insertWidget( 0, videoWidget, 10 ); - mainLayout->insertWidget( 2, inputC, 0, Qt::AlignBottom ); + //mainLayout->setRowStretch( 1, 10 ); + mainLayout->insertWidget( 2, inputC ); mainLayout->insertWidget( settings->value( "ToolbarPos", 0 ).toInt() ? 0: 3, - controls, 0, Qt::AlignBottom ); + controls ); + + /* 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(); @@ -413,12 +452,36 @@ void MainInterface::createMainWidget( QSettings *settings ) if ( depth() > 8 ) #endif /* Create the FULLSCREEN CONTROLS Widget */ - if( config_GetInt( p_intf, "qt-fs-controller" ) ) + if( var_InheritBool( p_intf, "qt-fs-controller" ) ) { - fullscreenControls = new FullscreenControllerWidget( p_intf ); + 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") ) + { + 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() { /**************** @@ -453,116 +516,158 @@ inline void MainInterface::createStatusBar() this, showCryptedLabel( bool ) ); } -inline void MainInterface::initSystray() +#ifdef WIN32 +void MainInterface::createTaskBarButtons() { - bool b_systrayAvailable = QSystemTrayIcon::isSystemTrayAvailable(); - bool b_systrayWanted = config_GetInt( p_intf, "qt-system-tray" ); - - if( config_GetInt( p_intf, "qt-start-minimized") > 0 ) + taskbar_wmsg = WM_NULL; + /*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 + */ + + CoInitialize( 0 ); + + if( S_OK == CoCreateInstance( &clsid_ITaskbarList, + NULL, CLSCTX_INPROC_SERVER, + &IID_ITaskbarList3, + (void **)&p_taskbl) ) { - if( b_systrayAvailable ) + p_taskbl->vt->HrInit(p_taskbl); + + if(himl = ImageList_Create( 15, //cx + 18, //cy + ILC_COLOR,//flags + 4,//initial nb of images + 0//nb of images that can be added + )) { - b_systrayWanted = true; - b_shouldHide = true; + 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" ); } + + // 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]; + 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, winId(), himl ); + if(S_OK != hr) + msg_Err( p_intf, "ThumbBarSetImageList failed with error %08x", hr ); else - msg_Err( p_intf, "cannot start minimized without system tray bar" ); + { + hr = p_taskbl->vt->ThumbBarAddButtons(p_taskbl, winId(), 3, thbButtons); + if(S_OK != hr) + msg_Err( p_intf, "ThumbBarAddButtons failed with error %08x", hr ); + } + CONNECT( THEMIM->getIM(), statusChanged( int ), this, changeThumbbarButtons( int ) ); + } + else + { + himl = NULL; + p_taskbl = NULL; } - if( b_systrayAvailable && b_systrayWanted ) - createSystray(); } -inline void MainInterface::askForPrivacy() +bool MainInterface::winEvent ( MSG * msg, long * result ) { - /** - * Ask for the network policy on FIRST STARTUP - **/ - if( config_GetInt( p_intf, "qt-privacy-ask") ) + if (msg->message == taskbar_wmsg) { - QList controls; - if( privacyDialog( &controls ) == QDialog::Accepted ) - { - QList::Iterator i; - for( i = controls.begin() ; i != controls.end() ; i++ ) + //We received the taskbarbuttoncreated, now we can really create th buttons + createTaskBarButtons(); + } + + short cmd; + switch( msg->message ) + { + case WM_COMMAND: + if (HIWORD(msg->wParam) == THBN_CLICKED) { - ConfigControl *c = qobject_cast(*i); - c->doApply( p_intf ); + switch(LOWORD(msg->wParam)) + { + case 0: + THEMIM->prev(); + break; + case 1: + THEMIM->togglePlayPause(); + break; + case 2: + THEMIM->next(); + break; + } } - - 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 ); - } + break; + case WM_APPCOMMAND: + cmd = GET_APPCOMMAND_LPARAM(msg->lParam); + switch(cmd) + { + case APPCOMMAND_MEDIA_PLAY_PAUSE: + THEMIM->togglePlayPause(); + break; + case APPCOMMAND_MEDIA_PLAY: + THEMIM->play(); + break; + case APPCOMMAND_MEDIA_PAUSE: + THEMIM->pause(); + break; + case APPCOMMAND_MEDIA_PREVIOUSTRACK: + THEMIM->prev(); + break; + case APPCOMMAND_MEDIA_NEXTTRACK: + THEMIM->next(); + break; + case APPCOMMAND_MEDIA_STOP: + THEMIM->stop(); + break; + case APPCOMMAND_VOLUME_DOWN: + THEAM->AudioDown(); + break; + case APPCOMMAND_VOLUME_UP: + THEAM->AudioUp(); + break; + case APPCOMMAND_VOLUME_MUTE: + THEAM->toggleMuteAudio(); + break; + default: + msg_Dbg( p_intf, "unknown APPCOMMAND = %d", cmd); + break; + } + break; } + return false; } - -int MainInterface::privacyDialog( QList *controls ) -{ - QDialog *privacy = new QDialog( this ); - - privacy->setWindowTitle( qtr( "Privacy and Network Policies" ) ); - - 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 **********************************************************************/ @@ -578,6 +683,7 @@ int MainInterface::privacyDialog( QList *controls ) QSize MainInterface::sizeHint() const { +#if 0 if( b_keep_size ) { if( i_visualmode == QT_ALWAYS_VIDEO_MODE || @@ -595,8 +701,11 @@ QSize MainInterface::sizeHint() const return mainBasedSize; } } +#endif + + int nwidth = __MAX( controls->sizeHint().width(), + menuBar()->sizeHint().width() ); - int nwidth = controls->sizeHint().width(); int nheight = controls->isVisible() ? controls->size().height() + inputC->size().height() @@ -604,8 +713,13 @@ QSize MainInterface::sizeHint() const + statusBar()->size().height() : 0 ; - if( VISIBLE( bgWidget ) ) + 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 @@ -614,9 +728,10 @@ QSize MainInterface::sizeHint() const } 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() ) { @@ -628,6 +743,7 @@ QSize MainInterface::sizeHint() const return QSize( nwidth, nheight ); } + /* Video widget cannot do this synchronously as it runs in another thread */ /* Well, could it, actually ? Probably dangerous ... */ @@ -640,34 +756,102 @@ void MainInterface::doComponentsUpdate() { if( isFullScreen() || isMaximized() ) return; - msg_Dbg( p_intf, "Updating the geometry" ); +// 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 */ - resize( sizeHint() ); - // adjustSize() ; + #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() ); + if( videoEmbeddedFlag ) + msg_Dbg( p_intf, "Stack Size: %i - %i", + stackCentralW->widget( VIDEO_TAB )->size().height(), + stackCentralW->widget( VIDEO_TAB )->size().width() ); + else + msg_Dbg( p_intf, "no embedded video" ); + 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, "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() ); + }*/ +#endif +} + +inline void MainInterface::showTab( int i_tab ) +{ +#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 ); +#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; + + stackCentralW->setCurrentIndex( i_tab ); + +#ifdef DEBUG_INTF + msg_Warn( p_intf, "New stackCentralOldState %i", stackCentralOldState ); #endif } -void MainInterface::destroyPopupMenu() +inline void MainInterface::restoreStackOldWidget() { - QVLCMenu::PopupMenu(p_intf, false ); +#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 } +void MainInterface::destroyPopupMenu() +{ + QVLCMenu::PopupMenu( p_intf, false ); +} void MainInterface::toggleFSC() { @@ -706,41 +890,49 @@ private: }; /** - * README - * Thou shall not call/resize/hide widgets from on another thread. - * This is wrong, and this is THE reason to emit signals on those Video Functions - **/ -WId MainInterface::requestVideo( vout_thread_t *p_nvout, int *pi_x, - int *pi_y, unsigned int *pi_width, - unsigned int *pi_height ) + * NOTE: + * You must note 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... + */ +WId MainInterface::getVideo( int *pi_x, int *pi_y, + unsigned int *pi_width, unsigned int *pi_height ) +{ + if( !videoWidget ) + return 0; + + /* This is a blocking call signal. Results are returned through pointers. + * Beware of deadlocks! */ + WId id; + emit askGetVideo( &id, pi_x, pi_y, pi_width, pi_height ); + return id; +} + +void MainInterface::getVideoSlot( WId *p_id, int *pi_x, int *pi_y, + unsigned *pi_width, unsigned *pi_height ) { /* Request the videoWidget */ - if( !videoWidget ) return 0; - WId ret = videoWidget->request( p_nvout,pi_x, pi_y, + WId ret = videoWidget->request( pi_x, pi_y, pi_width, pi_height, b_keep_size ); + *p_id = ret; if( ret ) /* The videoWidget is available */ { - /* Did we have a bg ? Hide it! */ - if( VISIBLE( bgWidget) ) - { - bgWasVisible = true; - emit askBgWidgetToToggle(); - } - else - bgWasVisible = false; - /* ask videoWidget to show */ - emit askVideoToShow( *pi_width, *pi_height ); + videoWidget->SetSizing( *pi_width, *pi_height ); /* Consider the video active now */ - videoIsActive = true; + showVideo(); + + stackCentralW->resize( *pi_width, *pi_height ); emit askUpdate(); } - return ret; } -/* Call from the WindowClose function */ + + +/* Asynchronous call from the WindowClose function */ void MainInterface::releaseVideo( void ) { emit askReleaseVideo( ); @@ -751,45 +943,44 @@ void MainInterface::releaseVideoSlot( void ) { videoWidget->release( ); - if( bgWasVisible ) - { - /* Reset the bg state */ - bgWasVisible = false; - bgWidget->show(); - } - - videoIsActive = false; + restoreStackOldWidget(); /* Try to resize, except when you are in Fullscreen mode */ - doComponentsUpdate(); +// doComponentsUpdate(); } -/* Call from WindowControl function */ +/* Asynchronous call from WindowControl function */ int MainInterface::controlVideo( int i_query, va_list args ) { - int i_ret = VLC_SUCCESS; + /* 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_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(); - break; - } - case VOUT_SET_STAY_ON_TOP: - { - int i_arg = va_arg( args, int ); - QApplication::postEvent( this, new SetVideoOnTopQtEvent( i_arg ) ); - break; - } - default: - i_ret = VLC_EGENERIC; - msg_Warn( p_intf, "unsupported control query" ); - break; + 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_EGENERIC; + } + case VOUT_WINDOW_SET_STATE: + { + unsigned i_arg = va_arg( args, unsigned ); + unsigned on_top = i_arg & VOUT_WINDOW_STATE_ABOVE; + QApplication::postEvent( this, new SetVideoOnTopQtEvent( on_top ) ); + return VLC_SUCCESS; + } + case VOUT_WINDOW_SET_FULLSCREEN: + { + bool b_fs = va_arg( args, int ); + emit askVideoSetFullScreen( b_fs ); + return VLC_SUCCESS; + } + default: + msg_Warn( p_intf, "unsupported control query" ); + return VLC_EGENERIC; } - return i_ret; } /***************************************************************************** @@ -798,41 +989,68 @@ int MainInterface::controlVideo( int i_query, va_list args ) /** * Toggle the playlist widget or dialog **/ +void MainInterface::createPlaylist( bool b_show ) +{ + playlistWidget = new PlaylistWidget( p_intf, this ); + + i_pl_dock = PL_BOTTOM; + /* i_pl_dock = (pl_dock_e)getSettings() + ->value( "pl-dock-status", PL_UNDOCKED ).toInt(); */ + + if( i_pl_dock == PL_UNDOCKED ) + { + 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 ) ); + } + 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() { - /* CREATION - If no playlist exist, then create one and attach it to the DockPL*/ +#ifdef DEBUG_INTF + msg_Warn( p_intf, "Here toggling %i %i", stackCentralW->currentIndex(), stackCentralOldState ); +#endif 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( true ); + } +#ifdef DEBUG_INTF + msg_Warn( p_intf, "Here toggling %i %i", stackCentralW->currentIndex(), stackCentralOldState ); - if( i_pl_dock == PL_UNDOCKED ) +#endif + if( i_pl_dock != PL_UNDOCKED ) + { + /* Playlist not visible */ + if( stackCentralW->currentIndex() != PLAYL_TAB ) { - 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( PLAYL_TAB ); + stackCentralW->show(); } else { - mainLayout->insertWidget( 4, playlistWidget ); + restoreStackOldWidget(); } - playlistVisible = true; - - playlistWidget->show(); - } - else - { - /* toggle the visibility of the playlist */ - TOGGLEV( playlistWidget ); - playlistVisible = !playlistVisible; - //doComponentsUpdate(); //resize( sizeHint() ); + playlistVisible = ( stackCentralW->currentIndex() == PLAYL_TAB ); + //doComponentsUpdate(); //resize( sizeHint() ); } } @@ -852,18 +1070,23 @@ void MainInterface::toggleMinimalView( bool b_switch ) if( i_visualmode != QT_ALWAYS_VIDEO_MODE && i_visualmode != QT_MINIMAL_MODE ) { /* NORMAL MODE then */ - if( !videoWidget || videoWidget->isHidden() ) + stackCentralW->show(); + if( !videoWidget || stackCentralW->currentIndex() != VIDEO_TAB ) { - emit askBgWidgetToToggle(); + showBg(); } else { /* If video is visible, then toggle the status of bgWidget */ - bgWasVisible = !bgWasVisible; + //bgWasVisible = !bgWasVisible; + if( stackCentralOldState == BACKG_TAB ) + stackCentralOldState = HIDDEN_TAB; + else + stackCentralOldState = BACKG_TAB; } } - i_bg_height = bgWidget->height(); + i_bg_height = stackCentralW->height(); menuBar()->setVisible( !b_switch ); controls->setVisible( !b_switch ); @@ -914,7 +1137,7 @@ void MainInterface::visual() /************************************************************************ * Other stuff ************************************************************************/ -void MainInterface::setName( QString name ) +void MainInterface::setName( const QString& name ) { input_name = name; /* store it for the QSystray use */ /* Display it in the status bar, but also as a Tooltip in case it doesn't @@ -927,7 +1150,7 @@ void MainInterface::setName( QString name ) * Give the decorations of the Main Window a correct Name. * If nothing is given, set it to VLC... **/ -void MainInterface::setVLCWindowsTitle( QString aTitle ) +void MainInterface::setVLCWindowsTitle( const QString& aTitle ) { if( aTitle.isEmpty() ) { @@ -956,7 +1179,7 @@ void MainInterface::showCryptedLabel( bool b_show ) /***************************************************************************** * Systray Icon and Systray Menu *****************************************************************************/ - +#ifndef HAVE_MAEMO /** * Create a SystemTray icon and a menu that would go with it. * Connects to a click handler on the icon. @@ -965,9 +1188,9 @@ void MainInterface::createSystray() { QIcon iconVLC; if( QDate::currentDate().dayOfYear() >= 354 ) - iconVLC = QIcon( QPixmap( ":/vlc128-christmas.png" ) ); + iconVLC = QIcon( ":/logo/vlc128-christmas.png" ); else - iconVLC = QIcon( QPixmap( ":/vlc128.png" ) ); + iconVLC = QIcon( ":/logo/vlc128.png" ); sysTray = new QSystemTrayIcon( iconVLC, this ); sysTray->setToolTip( qtr( "VLC media player" )); @@ -1052,7 +1275,7 @@ void MainInterface::handleSystrayClick( * Updates the name of the systray Icon tooltip. * Doesn't check if the systray exists, check before you call it. **/ -void MainInterface::updateSystrayTooltipName( QString name ) +void MainInterface::updateSystrayTooltipName( const QString& name ) { if( name.isEmpty() ) { @@ -1099,6 +1322,7 @@ void MainInterface::updateSystrayTooltipStatus( int i_status ) } QVLCMenu::updateSystrayMenu( this, p_intf ); } +#endif /************************************************************************ * D&D Events @@ -1110,41 +1334,40 @@ void MainInterface::dropEvent(QDropEvent *event) void MainInterface::dropEventPlay( QDropEvent *event, bool b_play ) { - event->setDropAction( Qt::CopyAction ); - if( !event->possibleActions() & Qt::CopyAction ) - return; + event->setDropAction( Qt::CopyAction ); + if( !event->possibleActions() & Qt::CopyAction ) + return; - const QMimeData *mimeData = event->mimeData(); + const QMimeData *mimeData = event->mimeData(); - /* D&D of a subtitles file, add it on the fly */ - if( mimeData->urls().size() == 1 ) - { - if( THEMIM->getIM()->hasInput() ) + /* D&D of a subtitles file, add it on the fly */ + if( mimeData->urls().size() == 1 && THEMIM->getIM()->hasInput() ) + { + if( !input_AddSubtitle( THEMIM->getInput(), + qtu( toNativeSeparators( mimeData->urls()[0].toLocalFile() ) ), + true ) ) { - if( !input_AddSubtitle( THEMIM->getInput(), - qtu( toNativeSeparators( - mimeData->urls()[0].toLocalFile() ) ), - true ) ) - { - event->accept(); - return; - } + event->accept(); + return; } - } - bool first = b_play; - foreach( const QUrl &url, mimeData->urls() ) - { + } + + bool first = b_play; + foreach( const QUrl &url, mimeData->urls() ) + { QString s = toNativeSeparators( url.toLocalFile() ); if( s.length() > 0 ) { - playlist_Add( THEPL, qtu(s), NULL, - PLAYLIST_APPEND | (first ? PLAYLIST_GO: 0), - PLAYLIST_END, true, false ); + char* psz_uri = make_URI( qtu(s) ); + 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 ); } - } - event->accept(); + } + event->accept(); } void MainInterface::dragEnterEvent(QDragEnterEvent *event) { @@ -1179,14 +1402,19 @@ void MainInterface::customEvent( QEvent *event ) { SetVideoOnTopQtEvent* p_event = (SetVideoOnTopQtEvent*)event; if( p_event->OnTop() ) - setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); + setWindowFlags( windowFlags() | Qt::WindowStaysOnTopHint ); else - setWindowFlags(windowFlags() & ~Qt::WindowStaysOnTopHint); - show(); /* necessary to apply window flags?? */ + setWindowFlags( windowFlags() & ~Qt::WindowStaysOnTopHint ); + show(); /* necessary to apply window flags */ } } void MainInterface::keyPressEvent( QKeyEvent *e ) +{ + handleKeyPress( e ); +} + +void MainInterface::handleKeyPress( QKeyEvent *e ) { if( ( e->modifiers() & Qt::ControlModifier ) && ( e->key() == Qt::Key_H ) && !menuBar()->isVisible() ) @@ -1207,6 +1435,7 @@ void MainInterface::keyPressEvent( QKeyEvent *e ) void MainInterface::resizeEvent( QResizeEvent * event ) { +#if 0 if( b_keep_size ) { if( i_visualmode == QT_ALWAYS_VIDEO_MODE || @@ -1224,6 +1453,9 @@ void MainInterface::resizeEvent( QResizeEvent * event ) mainBasedSize = size(); } } +#endif + QVLCMW::resizeEvent( event ); + msg_Dbg( p_intf, "Resize Event, height: %i", size().height() ); } void MainInterface::wheelEvent( QWheelEvent *e ) @@ -1256,6 +1488,58 @@ void MainInterface::toggleFullScreen( void ) } +//moc doesn't know about #ifdef, so we have to build this method for every platform +void MainInterface::changeThumbbarButtons( int i_status) +{ +#ifdef WIN32 + // Define an array of three 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 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; + } + default: + return; + } + HRESULT hr = p_taskbl->vt->ThumbBarUpdateButtons(p_taskbl, this->winId(), 3, thbButtons); + if(S_OK != hr) + msg_Err( p_intf, "ThumbBarUpdateButtons failed with error %08x", hr ); +#else + ; +#endif +} + /***************************************************************************** * PopupMenuCB: callback triggered by the intf-popupmenu playlist variable. * We don't show the menu directly here because we don't want the @@ -1287,4 +1571,3 @@ static int IntfShowCB( vlc_object_t *p_this, const char *psz_variable, /* Show event */ return VLC_SUCCESS; } -