X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fmain_interface.cpp;h=76784947aa9de0e28939ae095584200be47937cd;hb=6661270193cc9d9b8da61ce1579b76d0e9af49fd;hp=4665e5da2d81d8e65baa3447d8c87f27ef82b72e;hpb=b95136f6ea88b18b0d05bd8f3b7dc8475ab3f7f9;p=vlc diff --git a/modules/gui/qt4/main_interface.cpp b/modules/gui/qt4/main_interface.cpp index 4665e5da2d..76784947aa 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-2008 the VideoLAN team + * Copyright (C) 2006-2009 the VideoLAN team * $Id$ * * Authors: Clément Stenac @@ -28,38 +28,39 @@ #endif #include "qt4.hpp" + #include "main_interface.hpp" #include "input_manager.hpp" -#include "util/qvlcframe.hpp" -#include "util/qvlcapp.hpp" +#include "actions_manager.hpp" + #include "util/customwidgets.hpp" -#include "dialogs_provider.hpp" +#include "util/qt_dirs.hpp" + #include "components/interface_widgets.hpp" #include "components/controller.hpp" #include "components/playlist/playlist.hpp" -#include "dialogs/extended.hpp" -#include "dialogs/playlist.hpp" +#include "dialogs/external.hpp" + #include "menus.hpp" #include "recents.hpp" -#include #include -#include -#include #include + #include -#include #include +#include + #include +#include +#include #include -#include -#include -#include #include -#include +#include #include -#include + +#include /* Wheel event */ #include /* Callback prototypes */ @@ -67,8 +68,6 @@ static int PopupMenuCB( vlc_object_t *p_this, const char *psz_variable, vlc_value_t old_val, vlc_value_t new_val, void *param ); static int IntfShowCB( vlc_object_t *p_this, const char *psz_variable, vlc_value_t old_val, vlc_value_t new_val, void *param ); -static int InteractCallback( vlc_object_t *, const char *, vlc_value_t, - vlc_value_t, void *); MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) { @@ -82,6 +81,12 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) playlistVisible = false; input_name = ""; fullscreenControls = NULL; + cryptedLabel = NULL; + controls = NULL; + inputC = NULL; + + bgWasVisible = false; + i_bg_height = 0; /* Ask for privacy */ askForPrivacy(); @@ -99,6 +104,9 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) /* Set The Video In emebedded Mode or not */ videoEmbeddedFlag = config_GetInt( p_intf, "embedded-video" ); + /* Does the interface resize to video size or the opposite */ + b_keep_size = !config_GetInt( p_intf, "qt-video-autoresize" ); + /* Are we in the enhanced always-video mode or not ? */ i_visualmode = config_GetInt( p_intf, "qt-display-mode" ); @@ -106,17 +114,33 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) settings = getSettings(); settings->beginGroup( "MainWindow" ); - /* Visualisation, not really used yet */ - visualSelectorEnabled = settings->value( "visual-selector", false).toBool(); + /** + * Retrieve saved sizes for main window + * mainBasedSize = based window size for normal mode + * (no video, no background) + * mainVideoSize = window size with video (all modes) + **/ + mainBasedSize = settings->value( "mainBasedSize", QSize( 350, 120 ) ).toSize(); + mainVideoSize = settings->value( "mainVideoSize", QSize( 400, 300 ) ).toSize(); /* Do we want anoying popups or not */ notificationEnabled = (bool)config_GetInt( p_intf, "qt-notification" ); + /************** + * Status Bar * + **************/ + createStatusBar(); + /************************** * UI and Widgets design **************************/ setVLCWindowsTitle(); - handleMainUi( settings ); + createMainWidget( settings ); + + /************ + * Menu Bar * + ************/ + QVLCMenu::createMenuBar( this, p_intf ); #if 0 /* Create a Dock to get the playlist */ @@ -130,18 +154,6 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) dockPL->hide(); #endif - /************************** - * Menu Bar and Status Bar - **************************/ - QVLCMenu::createMenuBar( this, p_intf, visualSelectorEnabled ); - - /* StatusBar Creation */ - createStatusBar(); - - /* Recents menu updates */ - CONNECT( RecentsMRL::getInstance( p_intf ), updated(), - this, updateRecentsMenu() ); - /******************** * Input Manager * ********************/ @@ -152,18 +164,14 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) **************************/ /* Connect the input manager to the GUI elements it manages */ - /* It is also connected to the control->slider, see the ControlsWidget */ - /* Change the SpeedRate in the Status */ - CONNECT( THEMIM->getIM(), rateChanged( int ), this, setRate( int ) ); - /** * Connects on nameChanged() * Those connects are not merged because different options can trigger * them down. */ /* Naming in the controller statusbar */ - CONNECT( THEMIM->getIM(), nameChanged( QString ), this, - setName( QString ) ); + CONNECT( THEMIM->getIM(), nameChanged( QString ), + this, setName( QString ) ); /* and in the systray */ if( sysTray ) { @@ -180,25 +188,20 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) /** * CONNECTS on PLAY_STATUS **/ - /* Status on the main controller */ - CONNECT( THEMIM->getIM(), statusChanged( int ), this, setStatus( int ) ); - /* and in the systray */ + /* Status on the systray */ if( sysTray ) { - CONNECT( THEMIM->getIM(), statusChanged( int ), this, - updateSystrayTooltipStatus( int ) ); + CONNECT( THEMIM->getIM(), statusChanged( int ), + this, updateSystrayTooltipStatus( int ) ); } /* END CONNECTS ON IM */ + dialogHandler = new DialogHandler (p_intf); /************ * Callbacks ************/ - var_Create( p_intf, "interaction", VLC_VAR_ADDRESS ); - var_AddCallback( p_intf, "interaction", InteractCallback, this ); - p_intf->b_interaction = true; - var_AddCallback( p_intf->p_libvlc, "intf-show", IntfShowCB, p_intf ); /* Register callback for the intf-popupmenu variable */ @@ -206,24 +209,51 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) /* VideoWidget connects to avoid different threads speaking to each other */ - CONNECT( this, askReleaseVideo( void ), - this, releaseVideoSlot( void ) ); + connect( this, SIGNAL(askReleaseVideo( void )), + this, SLOT(releaseVideoSlot( void )), Qt::BlockingQueuedConnection ); + if( videoWidget ) + { CONNECT( this, askVideoToResize( unsigned int, unsigned int ), videoWidget, SetSizing( unsigned int, unsigned int ) ); + connect( this, SIGNAL(askVideoToShow( unsigned int, unsigned int)), + videoWidget, SLOT(SetSizing(unsigned int, unsigned int )), + Qt::BlockingQueuedConnection ); + } + CONNECT( this, askUpdate(), this, doComponentsUpdate() ); + CONNECT( THEDP, toolBarConfUpdated(), this, recreateToolbars() ); /* Size and placement of interface */ settings->beginGroup( "MainWindow" ); QVLCTools::restoreWidgetPosition( settings, this, QSize(380, 60) ); + /* resize to previously saved main window size if appicable */ + if( b_keep_size ) + { + if( i_visualmode == QT_ALWAYS_VIDEO_MODE || + i_visualmode == QT_MINIMAL_MODE ) + { + resize( mainVideoSize ); + } + else + { + resize( mainBasedSize ); + } + } + bool b_visible = settings->value( "playlist-visible", 0 ).toInt(); settings->endGroup(); /* Playlist */ if( b_visible ) togglePlaylist(); + /* Enable the popup menu in the MI */ + setContextMenuPolicy( Qt::CustomContextMenu ); + CONNECT( this, customContextMenuRequested( const QPoint& ), + this, popupMenu( const QPoint& ) ); + /* Final sizing and showing */ setMinimumWidth( __MAX( controls->sizeHint().width(), menuBar()->sizeHint().width() ) ); @@ -232,7 +262,7 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) /* And switch to minimal view if needed Must be called after the show() */ if( i_visualmode == QT_MINIMAL_MODE ) - toggleMinimalView(); + toggleMinimalView( true ); /* Update the geometry : It is useful if you switch between qt-display-modes ?*/ @@ -249,8 +279,12 @@ MainInterface::~MainInterface() { msg_Dbg( p_intf, "Destroying the main interface" ); + delete dialogHandler; + + /* Unsure we hide the videoWidget before destroying it */ if( videoIsActive ) videoWidget->hide(); + /* Save playlist state */ if( playlistWidget ) { if( !isDocked() ) @@ -259,109 +293,59 @@ MainInterface::~MainInterface() delete playlistWidget; } - settings->beginGroup( "MainWindow" ); + /* Be sure to kill the actionsManager... FIXME */ + ActionsManager::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( "adv-controls", getControlsVisibilityStatus() & CONTROLS_ADVANCED ); + settings->setValue( "mainBasedSize", mainBasedSize ); + settings->setValue( "mainVideoSize", mainVideoSize ); + if( bgWidget ) settings->setValue( "backgroundSize", bgWidget->size() ); + /* Save this size */ QVLCTools::saveWidgetPosition(settings, this); settings->endGroup(); - var_DelCallback( p_intf->p_libvlc, "intf-show", IntfShowCB, p_intf ); - /* Unregister callback for the intf-popupmenu variable */ + /* Unregister callbacks */ + var_DelCallback( p_intf->p_libvlc, "intf-show", IntfShowCB, p_intf ); var_DelCallback( p_intf->p_libvlc, "intf-popupmenu", PopupMenuCB, p_intf ); - p_intf->b_interaction = false; - var_DelCallback( p_intf, "interaction", InteractCallback, this ); - p_intf->p_sys->p_mi = NULL; } /***************************** * Main UI handling * *****************************/ - -inline void MainInterface::createStatusBar() +void MainInterface::recreateToolbars() { - /**************** - * Status Bar * - ****************/ - /* Widgets Creation*/ - timeLabel = new TimeLabel( p_intf ); - nameLabel = new QLabel; - nameLabel->setTextInteractionFlags( Qt::TextSelectableByMouse - | Qt::TextSelectableByKeyboard ); - speedLabel = new SpeedLabel( p_intf, "1.00x" ); - speedLabel->setToolTip( - qtr( "Current playback speed.\nRight click to adjust" ) ); - speedLabel->setContextMenuPolicy ( Qt::CustomContextMenu ); - - /* Styling those labels */ - timeLabel->setFrameStyle( QFrame::Sunken | QFrame::Panel ); - speedLabel->setFrameStyle( QFrame::Sunken | QFrame::Panel ); - nameLabel->setFrameStyle( QFrame::Sunken | QFrame::StyledPanel); - - /* and adding those */ - statusBar()->addWidget( nameLabel, 8 ); - statusBar()->addPermanentWidget( speedLabel, 0 ); - statusBar()->addPermanentWidget( timeLabel, 0 ); - - /* timeLabel behaviour: - - double clicking opens the goto time dialog - - right-clicking and clicking just toggle between remaining and - elapsed time.*/ - CONNECT( timeLabel, timeLabelDoubleClicked(), THEDP, gotoTimeDialog() ); - - /* Speed Label behaviour: - - right click gives the vertical speed slider */ - CONNECT( speedLabel, customContextMenuRequested( QPoint ), - this, showSpeedMenu( QPoint ) ); -} - -inline void MainInterface::initSystray() -{ - bool b_createSystray = false; - bool b_systrayAvailable = QSystemTrayIcon::isSystemTrayAvailable(); - if( config_GetInt( p_intf, "qt-start-minimized") ) - { - if( b_systrayAvailable ) - { - b_createSystray = true; - hide(); - } - else msg_Err( p_intf, "You can't minimize if you haven't a system " - "tray bar" ); - } - if( config_GetInt( p_intf, "qt-system-tray") ) - b_createSystray = true; - - if( b_systrayAvailable && b_createSystray ) - createSystray(); -} + 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 ); -/** - * Give the decorations of the Main Window a correct Name. - * If nothing is given, set it to VLC... - **/ -void MainInterface::setVLCWindowsTitle( QString aTitle ) -{ - if( aTitle.isEmpty() ) - { - setWindowTitle( qtr( "VLC media player" ) ); - } - else - { - setWindowTitle( aTitle + " - " + qtr( "VLC media player" ) ); - } + mainLayout->insertWidget( 2, inputC, 0, Qt::AlignBottom ); + mainLayout->insertWidget( settings->value( "ToolbarPos", 0 ).toInt() ? 0: 3, + controls, 0, Qt::AlignBottom ); + settings->endGroup(); } -void MainInterface::handleMainUi( QSettings *settings ) +void MainInterface::createMainWidget( QSettings *settings ) { /* Create the main Widget and the mainLayout */ QWidget *main = new QWidget; @@ -374,23 +358,6 @@ void MainInterface::handleMainUi( QSettings *settings ) mainLayout->setSpacing( 0 ); mainLayout->setMargin( 0 ); - /* Create the CONTROLS Widget */ - controls = new ControlsWidget( p_intf, - settings->value( "adv-controls", false ).toBool() ); - CONNECT( controls, advancedControlsToggled( bool ), - this, doComponentsUpdate() ); - - /* Add the controls Widget to the main Widget */ - mainLayout->insertWidget( 0, controls, 0, Qt::AlignBottom ); - - /* Create the Speed Control Widget */ - speedControl = new SpeedControlWidget( p_intf ); - speedControlMenu = new QMenu( this ); - - QWidgetAction *widgetAction = new QWidgetAction( speedControl ); - widgetAction->setDefaultWidget( speedControl ); - speedControlMenu->addAction( widgetAction ); - /* Visualisation */ /* Disabled for now, they SUCK */ #if 0 @@ -404,7 +371,6 @@ void MainInterface::handleMainUi( QSettings *settings ) bgWidget->resize( settings->value( "backgroundSize", QSize( 300, 200 ) ).toSize() ); bgWidget->updateGeometry(); - mainLayout->insertWidget( 0, bgWidget ); CONNECT( this, askBgWidgetToToggle(), bgWidget, toggle() ); if( i_visualmode != QT_ALWAYS_VIDEO_MODE && @@ -415,10 +381,24 @@ void MainInterface::handleMainUi( QSettings *settings ) /* And video Outputs */ if( videoEmbeddedFlag ) - { videoWidget = new VideoWidget( p_intf ); - mainLayout->insertWidget( 0, videoWidget, 10 ); - } + + /* 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 ); + + + /* Add the controls Widget to the main Widget */ + mainLayout->insertWidget( 0, bgWidget ); + if( videoWidget ) mainLayout->insertWidget( 0, videoWidget, 10 ); + mainLayout->insertWidget( 2, inputC, 0, Qt::AlignBottom ); + mainLayout->insertWidget( settings->value( "ToolbarPos", 0 ).toInt() ? 0: 3, + controls, 0, Qt::AlignBottom ); /* Finish the sizing */ main->updateGeometry(); @@ -434,6 +414,60 @@ void MainInterface::handleMainUi( QSettings *settings ) } } +inline void MainInterface::createStatusBar() +{ + /**************** + * Status Bar * + ****************/ + /* Widgets Creation*/ + QStatusBar *statusBarr = statusBar(); + + TimeLabel *timeLabel = new TimeLabel( p_intf ); + nameLabel = new QLabel( this ); + nameLabel->setTextInteractionFlags( Qt::TextSelectableByMouse + | Qt::TextSelectableByKeyboard ); + SpeedLabel *speedLabel = new SpeedLabel( p_intf, "1.00x", this ); + + /* Styling those labels */ + timeLabel->setFrameStyle( QFrame::Sunken | QFrame::Panel ); + speedLabel->setFrameStyle( QFrame::Sunken | QFrame::Panel ); + nameLabel->setFrameStyle( QFrame::Sunken | QFrame::StyledPanel); + + /* and adding those */ + statusBarr->addWidget( nameLabel, 8 ); + statusBarr->addPermanentWidget( speedLabel, 0 ); + statusBarr->addPermanentWidget( timeLabel, 0 ); + + /* timeLabel behaviour: + - double clicking opens the goto time dialog + - right-clicking and clicking just toggle between remaining and + elapsed time.*/ + CONNECT( timeLabel, timeLabelDoubleClicked(), THEDP, gotoTimeDialog() ); + + CONNECT( THEMIM->getIM(), encryptionChanged( bool ), + this, showCryptedLabel( bool ) ); +} + +inline void MainInterface::initSystray() +{ + 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; + hide(); + } + else + msg_Err( p_intf, "cannot start minimized without system tray bar" ); + } + + if( b_systrayAvailable && b_systrayWanted ) + createSystray(); +} + inline void MainInterface::askForPrivacy() { /** @@ -460,7 +494,7 @@ inline void MainInterface::askForPrivacy() int MainInterface::privacyDialog( QList *controls ) { - QDialog *privacy = new QDialog(); + QDialog *privacy = new QDialog( this ); privacy->setWindowTitle( qtr( "Privacy and Network Policies" ) ); @@ -513,7 +547,6 @@ int MainInterface::privacyDialog( QList *controls ) CONFIG_GENERIC( "album-art", IntegerList ); line++; #ifdef UPDATE_CHECK CONFIG_GENERIC_NOBOOL( "qt-updates-notif", Bool ); line++; - CONFIG_GENERIC_NOBOOL( "qt-updates-days", Integer ); line++; #endif QPushButton *ok = new QPushButton( qtr( "OK" ) ); @@ -540,22 +573,44 @@ int MainInterface::privacyDialog( QList *controls ) QSize MainInterface::sizeHint() const { + if( b_keep_size ) + { + if( i_visualmode == QT_ALWAYS_VIDEO_MODE || + i_visualmode == QT_MINIMAL_MODE ) + { + return mainVideoSize; + } + else + { + if( VISIBLE( bgWidget) || + ( videoIsActive && videoWidget->isVisible() ) + ) + return mainVideoSize; + else + return mainBasedSize; + } + } + int nwidth = controls->sizeHint().width(); int nheight = controls->isVisible() ? controls->size().height() + + inputC->size().height() + menuBar()->size().height() + statusBar()->size().height() : 0 ; if( VISIBLE( bgWidget ) ) { - nheight += bgWidget->size().height(); - nwidth = bgWidget->size().width(); + 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 = videoWidget->sizeHint().width(); + nwidth = __MAX( nwidth, videoWidget->sizeHint().width() ); } #if 0 if( !dockPL->isFloating() && dockPL->isVisible() && dockPL->widget() ) @@ -568,12 +623,24 @@ QSize MainInterface::sizeHint() const return QSize( nwidth, nheight ); } -void MainInterface::toggleFSC() -{ - if( !fullscreenControls ) return; +/* Video widget cannot do this synchronously as it runs in another thread */ +/* Well, could it, actually ? Probably dangerous ... */ - IMEvent *eShow = new IMEvent( FullscreenControlToggle_Type, 0 ); - QApplication::postEvent( fullscreenControls, static_cast(eShow) ); +/* This function is called: + - toggling of minimal View + - through askUpdate() by Vout thread request video and resize video (zoom) + - Advanced buttons toggled + */ +void MainInterface::doComponentsUpdate() +{ + msg_Dbg( p_intf, "Updating the geometry" ); + /* 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 } void MainInterface::debug() @@ -589,13 +656,21 @@ void MainInterface::debug() #endif } -/**************************************************************************** - * Small right-click menu for rate control - ****************************************************************************/ -void MainInterface::showSpeedMenu( QPoint pos ) +void MainInterface::toggleFSC() { - speedControlMenu->exec( QCursor::pos() - pos - + QPoint( 0, speedLabel->height() ) ); + if( !fullscreenControls ) return; + + IMEvent *eShow = new IMEvent( FullscreenControlToggle_Type, 0 ); + 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 ); } /**************************************************************************** @@ -620,14 +695,15 @@ private: /** * README * Thou shall not call/resize/hide widgets from on another thread. - * This is wrong, and this is TEH reason to emit signals on those Video Functions + * This is wrong, and this is THE reason to emit signals on those Video Functions **/ -void *MainInterface::requestVideo( vout_thread_t *p_nvout, int *pi_x, - int *pi_y, unsigned int *pi_width, - unsigned int *pi_height ) +WId MainInterface::requestVideo( vout_thread_t *p_nvout, int *pi_x, + int *pi_y, unsigned int *pi_width, + unsigned int *pi_height ) { /* Request the videoWidget */ - void *ret = videoWidget->request( p_nvout,pi_x, pi_y, pi_width, pi_height ); + WId ret = videoWidget->request( p_nvout,pi_x, pi_y, + pi_width, pi_height, b_keep_size ); if( ret ) /* The videoWidget is available */ { /* Did we have a bg ? Hide it! */ @@ -639,12 +715,13 @@ void *MainInterface::requestVideo( vout_thread_t *p_nvout, int *pi_x, else bgWasVisible = false; + /* ask videoWidget to show */ + emit askVideoToShow( *pi_width, *pi_height ); + /* Consider the video active now */ videoIsActive = true; emit askUpdate(); - - if( fullscreenControls ) fullscreenControls->attachVout( p_nvout ); } return ret; } @@ -652,7 +729,6 @@ void *MainInterface::requestVideo( vout_thread_t *p_nvout, int *pi_x, /* Call from the WindowClose function */ void MainInterface::releaseVideo( void ) { - if( fullscreenControls ) fullscreenControls->detachVout(); emit askReleaseVideo( ); } @@ -675,19 +751,11 @@ void MainInterface::releaseVideoSlot( void ) } /* Call from WindowControl function */ -int MainInterface::controlVideo( void *p_window, int i_query, va_list args ) +int MainInterface::controlVideo( int i_query, va_list args ) { int i_ret = VLC_SUCCESS; switch( i_query ) { - case VOUT_GET_SIZE: - { - unsigned int *pi_width = va_arg( args, unsigned int * ); - unsigned int *pi_height = va_arg( args, unsigned int * ); - *pi_width = videoWidget->videoSize.width(); - *pi_height = videoWidget->videoSize.height(); - break; - } case VOUT_SET_SIZE: { unsigned int i_width = va_arg( args, unsigned int ); @@ -765,15 +833,15 @@ void MainInterface::dockPlaylist( pl_dock_e i_pos ) { } -void MainInterface::toggleMinimalView() +void MainInterface::toggleMinimalView( bool b_switch ) { - /* HACK for minimalView, see menus.cpp */ - if( !menuBar()->isVisible() ) QVLCMenu::minimalViewAction->toggle(); - if( i_visualmode != QT_ALWAYS_VIDEO_MODE && i_visualmode != QT_MINIMAL_MODE ) { /* NORMAL MODE then */ - if( !videoWidget || videoWidget->isHidden() ) emit askBgWidgetToToggle(); + if( !videoWidget || videoWidget->isHidden() ) + { + emit askBgWidgetToToggle(); + } else { /* If video is visible, then toggle the status of bgWidget */ @@ -781,30 +849,16 @@ void MainInterface::toggleMinimalView() } } - TOGGLEV( menuBar() ); - TOGGLEV( controls ); - TOGGLEV( statusBar() ); - doComponentsUpdate(); -} + i_bg_height = bgWidget->height(); -/* Video widget cannot do this synchronously as it runs in another thread */ -/* Well, could it, actually ? Probably dangerous ... */ + menuBar()->setVisible( !b_switch ); + controls->setVisible( !b_switch ); + statusBar()->setVisible( !b_switch ); + inputC->setVisible( !b_switch ); -/* This function is called: - - toggling of minimal View - - through askUpdate() by Vout thread request video and resize video (zoom) - - Advanced buttons toggled - */ -void MainInterface::doComponentsUpdate() -{ - msg_Dbg( p_intf, "Updating the geometry" ); - /* 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 + doComponentsUpdate(); + + emit minimalViewToggled( b_switch ); } /* toggling advanced controls buttons */ @@ -855,25 +909,34 @@ void MainInterface::setName( QString name ) nameLabel->setToolTip( " " + name +" " ); } -void MainInterface::setStatus( int status ) +/** + * Give the decorations of the Main Window a correct Name. + * If nothing is given, set it to VLC... + **/ +void MainInterface::setVLCWindowsTitle( QString aTitle ) { - msg_Dbg( p_intf, "Updating the stream status: %i", status ); - - speedControl->setEnable( THEMIM->getIM()->hasInput() ); - - /* And in the systray for the menu */ - if( sysTray ) - QVLCMenu::updateSystrayMenu( this, p_intf ); + if( aTitle.isEmpty() ) + { + setWindowTitle( qtr( "VLC media player" ) ); + } + else + { + setWindowTitle( aTitle + " - " + qtr( "VLC media player" ) ); + } } -void MainInterface::setRate( int rate ) +void MainInterface::showCryptedLabel( bool b_show ) { - QString str; - str.setNum( ( 1000 / (double)rate ), 'f', 2 ); - str.append( "x" ); - speedLabel->setText( str ); - speedLabel->setToolTip( str ); - speedControl->updateControls( rate ); + if( cryptedLabel == NULL ) + { + cryptedLabel = new QLabel; + // The lock icon is not the right one for DRM protection/scrambled. + //cryptedLabel->setPixmap( QPixmap( ":/lock" ) ); + cryptedLabel->setText( "DRM" ); + statusBar()->addWidget( cryptedLabel ); + } + + cryptedLabel->setVisible( b_show ); } /***************************************************************************** @@ -923,28 +986,31 @@ void MainInterface::toggleUpdateSystrayMenu() } else { - /* Visible */ + /* Visible (possibly under other windows) */ #ifdef WIN32 /* check if any visible window is above vlc in the z-order, - * but ignore the ones always on top */ + * but ignore the ones always on top + * and the ones which can't be activated */ WINDOWINFO wi; HWND hwnd; wi.cbSize = sizeof( WINDOWINFO ); for( hwnd = GetNextWindow( internalWinId(), GW_HWNDPREV ); - hwnd && !IsWindowVisible( hwnd ); + hwnd && ( !IsWindowVisible( hwnd ) || + ( GetWindowInfo( hwnd, &wi ) && + (wi.dwExStyle&WS_EX_NOACTIVATE) ) ); hwnd = GetNextWindow( hwnd, GW_HWNDPREV ) ); - if( !hwnd || !GetWindowInfo( hwnd, &wi ) || + if( !hwnd || !GetWindowInfo( hwnd, &wi ) || (wi.dwExStyle&WS_EX_TOPMOST) ) + { + hide(); + } + else + { + activateWindow(); + } #else - if( isActiveWindow() ) + hide(); #endif - { - hide(); - } - else - { - activateWindow(); - } } QVLCMenu::updateSystrayMenu( this, p_intf ); } @@ -955,6 +1021,7 @@ void MainInterface::handleSystrayClick( switch( reason ) { case QSystemTrayIcon::Trigger: + case QSystemTrayIcon::DoubleClick: toggleUpdateSystrayMenu(); break; case QSystemTrayIcon::MiddleClick: @@ -962,6 +1029,8 @@ void MainInterface::handleSystrayClick( qtr( "Control menu for the player" ), QSystemTrayIcon::Information, 3000 ); break; + default: + break; } } @@ -984,6 +1053,8 @@ void MainInterface::updateSystrayTooltipName( QString name ) QSystemTrayIcon::NoIcon, 3000 ); } } + + QVLCMenu::updateSystrayMenu( this, p_intf ); } /** @@ -1024,6 +1095,10 @@ void MainInterface::dropEvent(QDropEvent *event) void MainInterface::dropEventPlay( QDropEvent *event, bool b_play ) { + event->setDropAction( Qt::CopyAction ); + if( !event->possibleActions() & Qt::CopyAction ) + return; + const QMimeData *mimeData = event->mimeData(); /* D&D of a subtitles file, add it on the fly */ @@ -1031,18 +1106,18 @@ void MainInterface::dropEventPlay( QDropEvent *event, bool b_play ) { if( THEMIM->getIM()->hasInput() ) { - if( input_AddSubtitles( THEMIM->getInput(), + if( !input_AddSubtitle( THEMIM->getInput(), qtu( toNativeSeparators( mimeData->urls()[0].toLocalFile() ) ), true ) ) { - event->acceptProposedAction(); + event->accept(); return; } } } bool first = b_play; - foreach( QUrl url, mimeData->urls() ) + foreach( const QUrl &url, mimeData->urls() ) { QString s = toNativeSeparators( url.toLocalFile() ); @@ -1054,7 +1129,7 @@ void MainInterface::dropEventPlay( QDropEvent *event, bool b_play ) RecentsMRL::getInstance( p_intf )->addRecent( s ); } } - event->acceptProposedAction(); + event->accept(); } void MainInterface::dragEnterEvent(QDragEnterEvent *event) { @@ -1099,9 +1174,9 @@ void MainInterface::customEvent( QEvent *event ) void MainInterface::keyPressEvent( QKeyEvent *e ) { if( ( e->modifiers() & Qt::ControlModifier ) && ( e->key() == Qt::Key_H ) - && menuBar()->isHidden() ) + && !menuBar()->isVisible() ) { - toggleMinimalView(); + toggleMinimalView( false ); e->accept(); } @@ -1115,6 +1190,27 @@ void MainInterface::keyPressEvent( QKeyEvent *e ) e->ignore(); } +void MainInterface::resizeEvent( QResizeEvent * event ) +{ + if( b_keep_size ) + { + if( i_visualmode == QT_ALWAYS_VIDEO_MODE || + i_visualmode == QT_MINIMAL_MODE ) + { + mainVideoSize = size(); + } + else + { + if( VISIBLE( bgWidget) || + ( videoIsActive && videoWidget->isVisible() ) + ) + mainVideoSize = size(); + else + mainBasedSize = size(); + } + } +} + void MainInterface::wheelEvent( QWheelEvent *e ) { int i_vlckey = qtWheelEventToVLCKey( e ); @@ -1124,6 +1220,7 @@ void MainInterface::wheelEvent( QWheelEvent *e ) void MainInterface::closeEvent( QCloseEvent *e ) { + e->accept(); hide(); THEDP->quit(); } @@ -1134,23 +1231,14 @@ void MainInterface::toggleFullScreen( void ) { showNormal(); emit askUpdate(); // Needed if video was launched after the F11 + emit fullscreenInterfaceToggled( false ); } else + { showFullScreen(); -} + emit fullscreenInterfaceToggled( true ); + } -/***************************************************************************** - * Callbacks - *****************************************************************************/ -static int InteractCallback( vlc_object_t *p_this, - const char *psz_var, vlc_value_t old_val, - vlc_value_t new_val, void *param ) -{ - intf_dialog_args_t *p_arg = new intf_dialog_args_t; - p_arg->p_dialog = (interaction_dialog_t *)(new_val.p_address); - DialogEvent *event = new DialogEvent( INTF_DIALOG_INTERACTION, 0, p_arg ); - QApplication::postEvent( THEDP, static_cast(event) ); - return VLC_SUCCESS; } /***************************************************************************** @@ -1166,7 +1254,7 @@ static int PopupMenuCB( vlc_object_t *p_this, const char *psz_variable, if( p_intf->pf_show_dialog ) { p_intf->pf_show_dialog( p_intf, INTF_DIALOG_POPUPMENU, - new_val.b_bool, 0 ); + new_val.b_bool, NULL ); } return VLC_SUCCESS; @@ -1185,11 +1273,3 @@ static int IntfShowCB( vlc_object_t *p_this, const char *psz_variable, return VLC_SUCCESS; } -/***************************************************************************** - * updateRecentsMenu: event called by RecentsMRL - *****************************************************************************/ - -void MainInterface::updateRecentsMenu() -{ - QVLCMenu::updateRecents( p_intf ); -}