X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fmain_interface.cpp;h=07f5a9293837d44901754992509675b904daf449;hb=a607f3213d71303218a0daafd3bd26ed63d9230a;hp=2de523d87053785121fb1b343ea5576992f9f138;hpb=0e4fa2de5367a6be40a7b73b74c4ab6b82e94733;p=vlc diff --git a/modules/gui/qt4/main_interface.cpp b/modules/gui/qt4/main_interface.cpp index 2de523d870..e04b5b6d12 100644 --- a/modules/gui/qt4/main_interface.cpp +++ b/modules/gui/qt4/main_interface.cpp @@ -1,10 +1,12 @@ /***************************************************************************** * main_interface.cpp : Main interface **************************************************************************** - * Copyright (C) 2006-2007 the VideoLAN team + * Copyright (C) 2006-2008 the VideoLAN team * $Id$ * * Authors: Clément Stenac + * Jean-Baptiste Kempf + * Ilkka Ollakka * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,14 +23,19 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + #include "qt4.hpp" #include "main_interface.hpp" #include "input_manager.hpp" -#include "util/input_slider.hpp" #include "util/qvlcframe.hpp" #include "util/customwidgets.hpp" #include "dialogs_provider.hpp" #include "components/interface_widgets.hpp" +#include "components/playlist/playlist.hpp" +#include "dialogs/extended.hpp" #include "dialogs/playlist.hpp" #include "menus.hpp" @@ -41,29 +48,17 @@ #include #include #include +#include +#include +#include +#include +#include +#include #include #include #include -#ifdef WIN32 - #define PREF_W 410 - #define PREF_H 121 -#else - #define PREF_W 450 - #define PREF_H 125 -#endif - -#define VISIBLE(i) (i && i->isVisible()) - -#define SET_WIDTH(i,j) i->widgetSize.setWidth(j) -#define SET_HEIGHT(i,j) i->widgetSize.setHeight(j) -#define SET_WH( i,j,k) i->widgetSize.setWidth(j); i->widgetSize.setHeight(k); - -#define DS(i) i.width(),i.height() - -#define DEBUG_COLOR 0 - /* 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 ); @@ -71,192 +66,284 @@ 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 *); -/* Video handling */ -static void *DoRequest( intf_thread_t *p_intf, vout_thread_t *p_vout, - int *pi1, int *pi2, unsigned int*pi3,unsigned int*pi4) -{ - return p_intf->p_sys->p_mi->requestVideo( p_vout, pi1, pi2, pi3, pi4 ); -} -static void DoRelease( intf_thread_t *p_intf, void *p_win ) -{ - return p_intf->p_sys->p_mi->releaseVideo( p_win ); -} -static int DoControl( intf_thread_t *p_intf, void *p_win, int i_q, va_list a ) -{ - return p_intf->p_sys->p_mi->controlVideo( p_win, i_q, a ); -} MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) { /* Variables initialisation */ - need_components_update = false; - bgWidget = NULL; videoWidget = NULL; playlistWidget = NULL; - embeddedPlaylistWasActive = videoIsActive = false; - - bool b_createSystray = false; - input_name = ""; + // need_components_update = false; + bgWidget = NULL; + videoWidget = NULL; + playlistWidget = NULL; + sysTray = NULL; + videoIsActive = false; + playlistVisible = false; + input_name = ""; + fullscreenControls = NULL; + + /* Ask for privacy */ + askForPrivacy(); /** * Configuration and settings + * Pre-building of interface **/ - settings = new QSettings( "VideoLAN", "VLC" ); - settings->beginGroup( "MainWindow" ); - /* Main settings */ setFocusPolicy( Qt::StrongFocus ); - setAcceptDrops(true); + setAcceptDrops( true ); setWindowIcon( QApplication::windowIcon() ); + setWindowOpacity( config_GetFloat( p_intf, "qt-opacity" ) ); /* Set The Video In emebedded Mode or not */ - videoEmbeddedFlag = false; - if( config_GetInt( p_intf, "embedded-video" ) ) - videoEmbeddedFlag = true; + videoEmbeddedFlag = config_GetInt( p_intf, "embedded-video" ); - alwaysVideoFlag = false; - if( videoEmbeddedFlag && config_GetInt( p_intf, "qt-always-video" ) ) - alwaysVideoFlag = true; + /* Are we in the enhanced always-video mode or not ? */ + i_visualmode = config_GetInt( p_intf, "qt-display-mode" ); /* Set the other interface settings */ - playlistEmbeddedFlag = settings->value("playlist-embedded", true).toBool(); - advControlsEnabled= settings->value( "adv-controls", false ).toBool(); - visualSelectorEnabled= settings->value( "visual-selector", false ).toBool(); - -#if DEBUG_COLOR - QPalette palette2; - palette2.setColor(this->backgroundRole(), Qt::magenta); - setPalette(palette2); -#endif + settings = getSettings(); + settings->beginGroup( "MainWindow" ); - /** - * UI design - **/ + /* Visualisation, not really used yet */ + visualSelectorEnabled = settings->value( "visual-selector", false).toBool(); + + /* Do we want anoying popups or not */ + notificationEnabled = (bool)config_GetInt( p_intf, "qt-notification" ); + + /************************** + * UI and Widgets design + **************************/ setVLCWindowsTitle(); handleMainUi( settings ); - /* Menu Bar */ - QVLCMenu::createMenuBar( this, p_intf, playlistEmbeddedFlag, - advControlsEnabled, visualSelectorEnabled ); +#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 - /* Status Bar */ - timeLabel = new QLabel; - nameLabel = new QLabel; - speedLabel = new QLabel( "1.0x" ); - timeLabel->setFrameStyle( QFrame::Sunken | QFrame::Panel ); - speedLabel->setFrameStyle( QFrame::Sunken | QFrame::Panel ); - statusBar()->addWidget( nameLabel, 8 ); - statusBar()->addPermanentWidget( speedLabel, 0 ); - statusBar()->addPermanentWidget( timeLabel, 2 ); + /************************** + * Menu Bar and Status Bar + **************************/ + QVLCMenu::createMenuBar( this, p_intf, visualSelectorEnabled ); + /* StatusBar Creation */ + createStatusBar(); - /* Systray */ - sysTray = NULL; - if( config_GetInt( p_intf, "qt-start-minimized") ) - { - hide(); - b_createSystray = true; - } - if( config_GetInt( p_intf, "qt-system-tray") ) - b_createSystray = true; - if (QSystemTrayIcon::isSystemTrayAvailable() && b_createSystray ) - createSystray(); - /* Init input manager */ + /******************** + * Input Manager * + ********************/ MainInputManager::getInstance( p_intf ); - ON_TIMEOUT( updateOnTimer() ); - - /** - * CONNECTs - **/ - - /* Volume control */ - CONNECT( ui.volumeSlider, valueChanged(int), this, updateVolume(int) ); + /************************** + * Various CONNECTs on IM * + **************************/ /* Connect the input manager to the GUI elements it manages */ + + /* It is also connected to the control->slider, see the ControlsWidget */ CONNECT( THEMIM->getIM(), positionUpdated( float, int, int ), - slider, setPosition( float,int, int ) ); - CONNECT( THEMIM->getIM(), positionUpdated( float, int, int ), - this, setDisplay( float, int, int ) ); + this, setDisplayPosition( float, int, int ) ); + /* Change the SpeedRate in the Status */ + CONNECT( THEMIM->getIM(), rateChanged( int ), this, setRate( int ) ); - /* Naming in the controller */ + /** + * 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 ) ); - if( config_GetInt( p_intf, "qt-system-tray" ) && sysTray ) + /* and in the systray */ + if( sysTray ) { CONNECT( THEMIM->getIM(), nameChanged( QString ), this, updateSystrayTooltipName( QString ) ); } + /* and in the title of the controller */ if( config_GetInt( p_intf, "qt-name-in-title" ) ) { CONNECT( THEMIM->getIM(), nameChanged( QString ), this, setVLCWindowsTitle( QString ) ); } - /* PLAY_STATUS */ + /** + * CONNECTS on PLAY_STATUS + **/ + /* Status on the main controller */ CONNECT( THEMIM->getIM(), statusChanged( int ), this, setStatus( int ) ); - CONNECT( THEMIM->getIM(), navigationChanged( int ), - this, setNavigation(int) ); - if( config_GetInt( p_intf, "qt-system-tray" ) && sysTray ) + /* and in the systray */ + if( sysTray ) { CONNECT( THEMIM->getIM(), statusChanged( int ), this, updateSystrayTooltipStatus( int ) ); } - CONNECT( slider, sliderDragged( float ), - THEMIM->getIM(), sliderUpdate( float ) ); - /* Buttons */ - CONNECT( ui.prevSectionButton, clicked(), THEMIM->getIM(), - sectionPrev() ); - CONNECT( ui.nextSectionButton, clicked(), THEMIM->getIM(), - sectionNext() ); - CONNECT( ui.menuButton, clicked(), THEMIM->getIM(), - sectionMenu() ); + /* END CONNECTS ON IM */ - /** + + /** OnTimeOut **/ + /* TODO Remove this function, but so far, there is no choice because there + is no intf-should-die variable #1365 */ + ON_TIMEOUT( updateOnTimer() ); + + /************ * Callbacks - **/ + ************/ var_Create( p_intf, "interaction", VLC_VAR_ADDRESS ); var_AddCallback( p_intf, "interaction", InteractCallback, this ); - p_intf->b_interaction = VLC_TRUE; + p_intf->b_interaction = true; + + var_AddCallback( p_intf->p_libvlc, "intf-show", IntfShowCB, p_intf ); /* Register callback for the intf-popupmenu variable */ - playlist_t *p_playlist = (playlist_t *)vlc_object_find( p_intf, - VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); - if( p_playlist != NULL ) - { - var_AddCallback( p_playlist, "intf-popupmenu", PopupMenuCB, p_intf ); - var_AddCallback( p_playlist, "intf-show", IntfShowCB, p_intf ); - vlc_object_release( p_playlist ); - } + var_AddCallback( p_intf->p_libvlc, "intf-popupmenu", PopupMenuCB, p_intf ); + + + /* VideoWidget connects to avoid different threads speaking to each other */ + CONNECT( this, askReleaseVideo( void * ), + this, releaseVideoSlot( void * ) ); + if( videoWidget ) + CONNECT( this, askVideoToResize( unsigned int, unsigned int ), + videoWidget, SetSizing( unsigned int, unsigned int ) ); + + CONNECT( this, askUpdate(), this, doComponentsUpdate() ); + + /* Size and placement of interface */ + QVLCTools::restoreWidgetPosition( settings, this, QSize(380, 60) ); + + + /* Playlist */ + if( settings->value( "playlist-visible", 0 ).toInt() ) togglePlaylist(); + settings->endGroup(); + + + /* Final sizing and showing */ + setMinimumWidth( __MAX( controls->sizeHint().width(), + menuBar()->sizeHint().width() ) ); + show(); + + /* And switch to minimal view if needed + Must be called after the show() */ + if( i_visualmode == QT_MINIMAL_MODE ) + toggleMinimalView(); + + /* Update the geometry TODO: is it useful ?*/ + updateGeometry(); + // resize( sizeHint() ); + + /***************************************************** + * End everything by creating the Systray Management * + *****************************************************/ + initSystray(); } MainInterface::~MainInterface() { - /* Unregister callback for the intf-popupmenu variable */ - playlist_t *p_playlist = (playlist_t *)vlc_object_find( p_intf, - VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); - if( p_playlist != NULL ) - { - var_DelCallback( p_playlist, "intf-popupmenu", PopupMenuCB, p_intf ); - var_DelCallback( p_playlist, "intf-show", IntfShowCB, p_intf ); - vlc_object_release( p_playlist ); - } + msg_Dbg( p_intf, "Destroying the main interface" ); + + if( playlistWidget ) + playlistWidget->savingSettings(); + + settings->beginGroup( "MainWindow" ); + + // settings->setValue( "playlist-floats", (int)(dockPL->isFloating()) ); + settings->setValue( "playlist-visible", (int)playlistVisible ); + settings->setValue( "adv-controls", + getControlsVisibilityStatus() & CONTROLS_ADVANCED ); + + if( !videoIsActive ) + QVLCTools::saveWidgetPosition(settings, this); + + if( bgWidget ) + settings->setValue( "backgroundSize", bgWidget->size() ); - settings->setValue( "playlist-embedded", playlistEmbeddedFlag ); - settings->setValue( "adv-controls", advControlsEnabled ); - settings->setValue( "pos", pos() ); settings->endGroup(); - delete settings; - p_intf->b_interaction = VLC_FALSE; + + var_DelCallback( p_intf->p_libvlc, "intf-show", IntfShowCB, p_intf ); + + /* Unregister callback for the intf-popupmenu variable */ + 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->pf_request_window = NULL; - p_intf->pf_release_window = NULL; - p_intf->pf_control_window = NULL; + p_intf->p_sys->p_mi = NULL; } /***************************** * Main UI handling * *****************************/ +inline void MainInterface::createStatusBar() +{ + /**************** + * Status Bar * + ****************/ + /* Widgets Creation*/ + b_remainingTime = false; + timeLabel = new TimeLabel; + timeLabel->setText( " --:--/--:-- " ); + timeLabel->setAlignment( Qt::AlignRight | Qt::AlignVCenter ); + timeLabel->setToolTip( qtr( "Toggle between elapsed and remaining time" ) ); + nameLabel = new QLabel; + 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, timeLabelClicked(), this, toggleTimeDisplay() ); + CONNECT( timeLabel, timeLabelDoubleClicked(), THEDP, gotoTimeDialog() ); + CONNECT( timeLabel, timeLabelDoubleClicked(), this, toggleTimeDisplay() ); + + /* 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(); +} + /** * Give the decorations of the Main Window a correct Name. * If nothing is given, set it to VLC... @@ -275,376 +362,464 @@ void MainInterface::setVLCWindowsTitle( QString aTitle ) void MainInterface::handleMainUi( QSettings *settings ) { - QWidget *main = new QWidget( this ); - QVBoxLayout *mainLayout = new QVBoxLayout( main ); + /* Create the main Widget and the mainLayout */ + QWidget *main = new QWidget; setCentralWidget( main ); + mainLayout = new QVBoxLayout( main ); /* Margins, spacing */ main->setContentsMargins( 0, 0, 0, 0 ); + main->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Maximum ); + mainLayout->setSpacing( 0 ); mainLayout->setMargin( 0 ); - /* CONTROLS */ - QWidget *controls = new QWidget; - ui.setupUi( controls ); - - /* Configure the UI */ - slider = new InputSlider( Qt::Horizontal, NULL ); - ui.vboxLayout->insertWidget( 0, slider ); - ui.discFrame->hide(); - - BUTTON_SET_IMG( ui.prevSectionButton, "", previous.png, "" ); - BUTTON_SET_IMG( ui.nextSectionButton, "", next.png, "" ); - BUTTON_SET_IMG( ui.menuButton, "", previous.png, "" ); - - BUTTON_SET_ACT_I( ui.prevButton, "" , previous.png, - qtr("Previous"), prev() ); - BUTTON_SET_ACT_I( ui.nextButton, "", next.png, qtr("Next"), next() ); - BUTTON_SET_ACT_I( ui.playButton, "", play.png, qtr("Play"), play() ); - BUTTON_SET_ACT_I( ui.stopButton, "", stop.png, qtr("Stop"), stop() ); - - /* Volume */ - ui.volMuteLabel->setPixmap( QPixmap( ":/pixmaps/volume-low.png" ) ); - ui.volumeSlider->setMaximum( 100 ); - ui.volMuteLabel->setToolTip( qtr( "Mute" ) ); - VolumeClickHandler *h = new VolumeClickHandler( p_intf, this ); - ui.volMuteLabel->installEventFilter(h); - ui.volumeSlider->setFocusPolicy( Qt::NoFocus ); - - BUTTON_SET_IMG( ui.playlistButton, "" , playlist_icon.png, - playlistEmbeddedFlag ? qtr( "Show playlist" ) : - qtr( "Open playlist" ) ); - BUTTONACT( ui.playlistButton, playlist() ); - -#if DEBUG_COLOR - QPalette palette; - palette.setColor(main->backgroundRole(), Qt::green); - main->setPalette(palette); -#endif + /* Create the CONTROLS Widget */ + bool b_shiny = config_GetInt( p_intf, "qt-blingbling" ); + controls = new ControlsWidget( p_intf, this, + settings->value( "adv-controls", false ).toBool(), + b_shiny ); + CONNECT( controls, advancedControlsToggled( bool ), + this, doComponentsUpdate() ); - /* Add the controls Widget */ - mainLayout->addWidget( controls ); +#ifdef WIN32 + if ( depth() > 8 ) +#endif + /* Create the FULLSCREEN CONTROLS Widget */ + if( config_GetInt( p_intf, "qt-fs-controller" ) ) + { + fullscreenControls = new FullscreenControllerWidget( p_intf, this, + settings->value( "adv-controls", false ).toBool(), + b_shiny ); + CONNECT( fullscreenControls, advancedControlsToggled( bool ), + this, doComponentsUpdate() ); + } - /* Set initial size */ - resize ( PREF_W, PREF_H ); + /* Add the controls Widget to the main Widget */ + mainLayout->insertWidget( 0, controls, 0, Qt::AlignBottom ); - addSize = QSize( mainLayout->margin() * 2, PREF_H ); + /* Create the Speed Control Widget */ + speedControl = new SpeedControlWidget( p_intf ); + speedControlMenu = new QMenu( this ); - /* advanced Controls handling */ - advControls = new ControlsWidget( p_intf ); - mainLayout->insertWidget( 0, advControls ); - advControls->updateGeometry(); - if( !advControlsEnabled ) advControls->hide(); - need_components_update = true; + QWidgetAction *widgetAction = new QWidgetAction( speedControl ); + widgetAction->setDefaultWidget( speedControl ); + speedControlMenu->addAction( widgetAction ); /* Visualisation */ + /* Disabled for now, they SUCK */ + #if 0 visualSelector = new VisualSelector( p_intf ); mainLayout->insertWidget( 0, visualSelector ); visualSelector->hide(); - - /* And video Outputs */ - if( alwaysVideoFlag ) + #endif + + /* Bg Cone */ + bgWidget = new BackgroundWidget( p_intf ); + 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 && + i_visualmode != QT_MINIMAL_MODE ) { - bgWidget = new BackgroundWidget( p_intf ); - bgWidget->widgetSize = settings->value( "backgroundSize", - QSize( 200, 200 ) ).toSize(); - bgWidget->resize( bgWidget->widgetSize ); - bgWidget->updateGeometry(); - mainLayout->insertWidget( 0, bgWidget ); + bgWidget->hide(); } + /* And video Outputs */ if( videoEmbeddedFlag ) { videoWidget = new VideoWidget( p_intf ); - videoWidget->widgetSize = QSize( 1, 1 ); - //videoWidget->resize( videoWidget->widgetSize ); - mainLayout->insertWidget( 0, videoWidget ); - - p_intf->pf_request_window = ::DoRequest; - p_intf->pf_release_window = ::DoRelease; - p_intf->pf_control_window = ::DoControl; + mainLayout->insertWidget( 0, videoWidget, 10 ); } /* Finish the sizing */ - setMinimumSize( PREF_W, addSize.height() ); + main->updateGeometry(); } -/********************************************************************** - * Handling of the components - **********************************************************************/ -void MainInterface::calculateInterfaceSize() +inline void MainInterface::askForPrivacy() { - int width = 0, height = 0; - if( VISIBLE( bgWidget ) ) - { - width = bgWidget->widgetSize.width(); - height = bgWidget->widgetSize.height(); - assert( !(playlistWidget && playlistWidget->isVisible() ) ); - } - else if( VISIBLE( playlistWidget ) ) - { - width = playlistWidget->widgetSize.width(); - height = playlistWidget->widgetSize.height(); - } - else if( videoIsActive ) - { - width = videoWidget->widgetSize.width() ; - height = videoWidget->widgetSize.height(); - } - else - { - width = PREF_W - addSize.width(); - height = PREF_H - addSize.height(); - } - if( VISIBLE( visualSelector ) ) - height += visualSelector->height(); - if( VISIBLE( advControls) ) + /** + * Ask for the network policy on FIRST STARTUP + **/ + if( config_GetInt( p_intf, "qt-privacy-ask") ) { - height += advControls->sizeHint().height(); + QList controls; + if( privacyDialog( &controls ) == QDialog::Accepted ) + { + QList::Iterator i; + for( i = controls.begin() ; i != controls.end() ; i++ ) + { + ConfigControl *c = qobject_cast(*i); + c->doApply( p_intf ); + } + + config_PutInt( p_intf, "qt-privacy-ask" , 0 ); + /* We have to save here because the user may not launch Prefs */ + config_SaveConfigFile( p_intf, NULL ); + } } - mainSize = QSize( width + addSize.width(), height + addSize.height() ); } -void MainInterface::resizeEvent( QResizeEvent *e ) +int MainInterface::privacyDialog( QList *controls ) { - videoWidget->widgetSize.setWidth( e->size().width() - addSize.width() ); - if( videoWidget && videoIsActive && videoWidget->widgetSize.height() > 1 ) - { - SET_WH( videoWidget, e->size().width() - addSize.width(), - e->size().height() - addSize.height() ); - videoWidget->updateGeometry(); - } - if( VISIBLE( playlistWidget ) ) - { - SET_WH( playlistWidget , e->size().width() - addSize.width(), - e->size().height() - addSize.height() ); - playlistWidget->updateGeometry(); + QDialog *privacy = new QDialog(); + + 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 request limited information on " + "the Internet, especially to get CD covers or to know " + "if updates are available.

\n" + "

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

\n" + "

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

\n") ); + 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 ); \ } -} -/***************************************************************************** - * Systray Icon and Systray Menu - *****************************************************************************/ +#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 ); \ + } -/** - * Create a SystemTray icon and a menu that would go with it. - * Connects to a click handler on the icon. - **/ -void MainInterface::createSystray() -{ - QIcon iconVLC = QIcon( QPixmap( ":/vlc128.png" ) ); - sysTray = new QSystemTrayIcon( iconVLC, this ); - sysTray->setToolTip( qtr( "VLC media player" )); + 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 - systrayMenu = new QMenu( qtr( "VLC media player" ), this ); - systrayMenu->setIcon( iconVLC ); + QPushButton *ok = new QPushButton( qtr( "OK" ) ); - QVLCMenu::updateSystrayMenu( this, p_intf, true ); - sysTray->show(); + gLayout->addWidget( ok, 2, 2 ); - CONNECT( sysTray, activated( QSystemTrayIcon::ActivationReason ), - this, handleSystrayClick( QSystemTrayIcon::ActivationReason ) ); + CONNECT( ok, clicked(), privacy, accept() ); + return privacy->exec(); } -/** - * Update the menu of the Systray Icon. - * May be unneedded, since it just calls QVLCMenu::update - * FIXME !!! - **/ -void MainInterface::updateSystrayMenu( int status ) + +/********************************************************************** + * 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 { - QVLCMenu::updateSystrayMenu( this, p_intf ) ; + int nwidth = controls->sizeHint().width(); + int nheight = controls->isVisible() ? + controls->size().height() + + menuBar()->size().height() + + statusBar()->size().height() + : 0 ; + + if( VISIBLE( bgWidget ) ) + { + nheight += bgWidget->size().height(); + nwidth = bgWidget->size().width(); + } + else if( videoIsActive && videoWidget->isVisible() ) + { + nheight += videoWidget->sizeHint().height(); + 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 ); } -/** - * Updates the Systray Icon's menu and toggle the main interface - */ -void MainInterface::toggleUpdateSystrayMenu() +void MainInterface::toggleFSC() { - toggleVisible(); - QVLCMenu::updateSystrayMenu( this, p_intf ); + if( !fullscreenControls ) return; + + IMEvent *eShow = new IMEvent( FullscreenControlToggle_Type, 0 ); + QApplication::postEvent( fullscreenControls, static_cast(eShow) ); } -void MainInterface::handleSystrayClick( - QSystemTrayIcon::ActivationReason reason ) + +//FIXME remove me at the end... +void MainInterface::debug() { - switch( reason ) +#ifndef NDEBUG + msg_Dbg( p_intf, "size: %i - %i", size().height(), size().width() ); + msg_Dbg( p_intf, "sizeHint: %i - %i", sizeHint().height(), sizeHint().width() ); + if( videoWidget && videoWidget->isVisible() ) { - case QSystemTrayIcon::Trigger: - toggleUpdateSystrayMenu(); - break; - case QSystemTrayIcon::MiddleClick: - sysTray->showMessage( qtr( "VLC media player" ), - qtr( "Control menu for the player" ), - QSystemTrayIcon::Information, 4000 ); - break; + // sleep( 10 ); + msg_Dbg( p_intf, "size: %i - %i", size().height(), size().width() ); + msg_Dbg( p_intf, "sizeHint: %i - %i", sizeHint().height(), sizeHint().width() ); } + adjustSize(); +#endif } -/** - * Updates the name of the systray Icon tooltip. - * Doesn't check if the systray exists, check before you call it. - * FIXME !!! Fusion with next function ? - **/ -void MainInterface::updateSystrayTooltipName( QString name ) +/**************************************************************************** + * Small right-click menu for rate control + ****************************************************************************/ +void MainInterface::showSpeedMenu( QPoint pos ) { - if( name.isEmpty() ) - { - sysTray->setToolTip( qtr( "VLC media player" ) ); - } - else - { - sysTray->setToolTip( name ); - } + speedControlMenu->exec( QCursor::pos() - pos + + QPoint( 0, speedLabel->height() ) ); } +/**************************************************************************** + * 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; +}; + /** - * Updates the status of the systray Icon tooltip. - * Doesn't check if the systray exists, check before you call it. + * 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 **/ -void MainInterface::updateSystrayTooltipStatus( int i_status ) -{ - switch( i_status ) - { - case 0: - { - sysTray->setToolTip( qtr( "VLC media player" ) ); - break; - } - case PLAYING_S: - { - sysTray->setToolTip( input_name ); - //+ " - " + qtr( "Playing" ) ); - break; - } - case PAUSE_S: - { - sysTray->setToolTip( input_name + " - " - + qtr( "Paused") ); - break; - } - } -} void *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 ); - if( ret ) + if( ret ) /* The videoWidget is available */ { - videoIsActive = true; - if( VISIBLE( playlistWidget ) ) - { - embeddedPlaylistWasActive = true; -// playlistWidget->hide(); - } - bool bgWasVisible = false; + /* Did we have a bg ? Hide it! */ if( VISIBLE( bgWidget) ) { bgWasVisible = true; -// bgWidget->hide(); - } - if( THEMIM->getIM()->hasVideo() || !bgWasVisible ) - { - videoWidget->widgetSize = QSize( *pi_width, *pi_height ); - } - else /* Background widget available, use its size */ - { - /* Ok, our visualizations are bad, so don't do this for the moment - * use the requested size anyway */ - // videoWidget->widgetSize = bgWidget->widgeTSize; - videoWidget->widgetSize = QSize( *pi_width, *pi_height ); + emit askBgWidgetToToggle(); } -// videoWidget->updateGeometry(); /// FIXME: Needed ? - need_components_update = true; + else + bgWasVisible = false; + + /* Consider the video active now */ + videoIsActive = true; + + emit askUpdate(); + + if( fullscreenControls ) fullscreenControls->attachVout( p_nvout ); } return ret; } +/* Call from the WindowClose function */ void MainInterface::releaseVideo( void *p_win ) +{ + if( fullscreenControls ) fullscreenControls->detachVout(); + if( p_win ) + emit askReleaseVideo( p_win ); +} + +/* Function that is CONNECTED to the previous emit */ +void MainInterface::releaseVideoSlot( void *p_win ) { videoWidget->release( p_win ); - videoWidget->widgetSize = QSize( 0, 0 ); - videoWidget->resize( videoWidget->widgetSize ); - if( embeddedPlaylistWasActive ) - ;//playlistWidget->show(); - else if( bgWidget ) - ;//bgWidget->show(); + if( bgWasVisible ) + { + /* Reset the bg state */ + bgWasVisible = false; + bgWidget->show(); + } - videoIsActive = false; - need_components_update = true; + /* Try to resize, except when you are in Fullscreen mode */ + if( !isFullScreen() ) doComponentsUpdate(); } -class SetVideoOnTopQtEvent : public QEvent -{ -public: - SetVideoOnTopQtEvent( bool _onTop ) : - QEvent( (QEvent::Type)SetVideoOnTopEvent_Type ), onTop( _onTop) - { - } - - bool OnTop() const - { - return onTop; - } - -private: - bool onTop; -}; - +/* Call from WindowControl function */ int MainInterface::controlVideo( void *p_window, int i_query, va_list args ) { - int i_ret = VLC_EGENERIC; + 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->widgetSize.width(); - *pi_height = videoWidget->widgetSize.height(); - i_ret = VLC_SUCCESS; + *pi_width = videoWidget->videoSize.width(); + *pi_height = videoWidget->videoSize.height(); break; } case VOUT_SET_SIZE: { unsigned int i_width = va_arg( args, unsigned int ); unsigned int i_height = va_arg( args, unsigned int ); - videoWidget->widgetSize = QSize( i_width, i_height ); - // videoWidget->updateGeometry(); - need_components_update = true; - i_ret = VLC_SUCCESS; + 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 ) ); - i_ret = VLC_SUCCESS; break; } default: + i_ret = VLC_EGENERIC; msg_Warn( p_intf, "unsupported control query" ); break; } return i_ret; } -void MainInterface::advanced() +/***************************************************************************** + * Playlist, Visualisation and Menus handling + *****************************************************************************/ +/** + * Toggle the playlist widget or dialog + **/ +void MainInterface::togglePlaylist() { - if( !VISIBLE( advControls ) ) + THEDP->playlistDialog(); +#if 0 + /* CREATION + If no playlist exist, then create one and attach it to the DockPL*/ + if( !playlistWidget ) { - advControls->show(); - advControlsEnabled = true; + playlistWidget = new PlaylistWidget( p_intf, settings, dockPL ); + + /* Add it to the parent DockWidget */ + dockPL->setWidget( playlistWidget ); + + /* Add the dock to the main Interface */ + addDockWidget( Qt::BottomDockWidgetArea, dockPL ); + + /* Make the playlist floating is requested. Default is not. */ + settings->beginGroup( "MainWindow" ); + if( settings->value( "playlist-floats", 1 ).toInt() ) + { + msg_Dbg( p_intf, "we don't want the playlist inside"); + dockPL->setFloating( true ); + } + settings->endGroup(); + settings->beginGroup( "playlist" ); + dockPL->move( settings->value( "pos", QPoint( 0,0 ) ).toPoint() ); + QSize newSize = settings->value( "size", QSize( 400, 300 ) ).toSize(); + if( newSize.isValid() ) + dockPL->resize( newSize ); + settings->endGroup(); + + dockPL->show(); + playlistVisible = true; } else { - advControls->hide(); - advControlsEnabled = false; + /* toggle the visibility of the playlist */ + TOGGLEV( dockPL ); + resize( sizeHint() ); + playlistVisible = !playlistVisible; + } + #endif +} + +/* Function called from the menu to undock the playlist */ +void MainInterface::undockPlaylist() +{ +// dockPL->setFloating( true ); + adjustSize(); +} + +void MainInterface::toggleMinimalView() +{ + /* 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->isHidden() ) emit askBgWidgetToToggle(); + else + { + /* If video is visible, then toggle the status of bgWidget */ + bgWasVisible = !bgWasVisible; + } } + + TOGGLEV( menuBar() ); + TOGGLEV( controls ); + TOGGLEV( statusBar() ); doComponentsUpdate(); } +/* Video widget cannot do this synchronously as it runs in another thread */ +/* Well, could it, actually ? Probably dangerous ... */ +void MainInterface::doComponentsUpdate() +{ + msg_Dbg( p_intf, "Updating the geometry" ); + // resize( sizeHint() ); + adjustSize(); +} + +/* toggling advanced controls buttons */ +void MainInterface::toggleAdvanced() +{ + controls->toggleAdvanced(); + if( fullscreenControls ) fullscreenControls->toggleAdvanced(); +} + +/* Get the visibility status of the controls (hidden or not, advanced or not) */ +int MainInterface::getControlsVisibilityStatus() +{ + return( (controls->isVisible() ? CONTROLS_VISIBLE : CONTROLS_HIDDEN ) + + CONTROLS_ADVANCED * controls->b_advancedVisible ); +} + +#if 0 void MainInterface::visual() { if( !VISIBLE( visualSelector) ) @@ -664,121 +839,222 @@ void MainInterface::visual() } doComponentsUpdate(); } +#endif + +/************************************************************************ + * Other stuff + ************************************************************************/ +void MainInterface::setDisplayPosition( float pos, int time, int length ) +{ + char psz_length[MSTRTIME_MAX_SIZE], psz_time[MSTRTIME_MAX_SIZE]; + secstotimestr( psz_length, length ); + secstotimestr( psz_time, ( b_remainingTime && length ) ? length - time + : time ); + + QString timestr; + timestr.sprintf( "%s/%s", psz_time, + ( !length && time ) ? "--:--" : psz_length ); + + /* Add a minus to remaining time*/ + if( b_remainingTime && length ) timeLabel->setText( " -"+timestr+" " ); + else timeLabel->setText( " "+timestr+" " ); +} + +void MainInterface::toggleTimeDisplay() +{ + b_remainingTime = !b_remainingTime; +} + +void MainInterface::setName( QString name ) +{ + input_name = name; /* store it for the QSystray use */ + /* Display it in the status bar, but also as a Tooltip in case it doesn't + fit in the label */ + nameLabel->setText( " " + name + " " ); + nameLabel->setToolTip( " " + name +" " ); +} + +void MainInterface::setStatus( int status ) +{ + msg_Dbg( p_intf, "Updating the stream status: %i", status ); + + /* Forward the status to the controls to toggle Play/Pause */ + controls->setStatus( status ); + controls->updateInput(); + + if( fullscreenControls ) + { + fullscreenControls->setStatus( status ); + fullscreenControls->updateInput(); + } + + speedControl->setEnable( THEMIM->getIM()->hasInput() ); + + /* And in the systray for the menu */ + if( sysTray ) + QVLCMenu::updateSystrayMenu( this, p_intf ); +} + +void MainInterface::setRate( int rate ) +{ + QString str; + str.setNum( ( 1000 / (double)rate ), 'f', 2 ); + str.append( "x" ); + speedLabel->setText( str ); + speedLabel->setToolTip( str ); + speedControl->updateControls( rate ); +} -void MainInterface::playlist() +void MainInterface::updateOnTimer() { - // Toggle the playlist dialog - if( !playlistEmbeddedFlag ) + /* No event for dying */ + if( intf_ShouldDie( p_intf ) ) { - if( playlistWidget ) - { - /// \todo Destroy it - } - THEDP->playlistDialog(); - return; + QApplication::closeAllWindows(); + QApplication::quit(); } +} - if( !playlistWidget ) +/***************************************************************************** + * Systray Icon and Systray Menu + *****************************************************************************/ + +/** + * Create a SystemTray icon and a menu that would go with it. + * Connects to a click handler on the icon. + **/ +void MainInterface::createSystray() +{ + QIcon iconVLC; + if( QDate::currentDate().dayOfYear() >= 354 ) + iconVLC = QIcon( QPixmap( ":/vlc128-christmas.png" ) ); + else + iconVLC = QIcon( QPixmap( ":/vlc128.png" ) ); + sysTray = new QSystemTrayIcon( iconVLC, this ); + sysTray->setToolTip( qtr( "VLC media player" )); + + systrayMenu = new QMenu( qtr( "VLC media player" ), this ); + systrayMenu->setIcon( iconVLC ); + + QVLCMenu::updateSystrayMenu( this, p_intf, true ); + sysTray->show(); + + CONNECT( sysTray, activated( QSystemTrayIcon::ActivationReason ), + this, handleSystrayClick( QSystemTrayIcon::ActivationReason ) ); +} + +/** + * Updates the Systray Icon's menu and toggle the main interface + */ +void MainInterface::toggleUpdateSystrayMenu() +{ + /* If hidden, show it */ + if( isHidden() ) { - PlaylistDialog::killInstance(); - playlistWidget = new PlaylistWidget( p_intf ); - ui.vboxLayout->insertWidget( 0, playlistWidget ); - playlistWidget->widgetSize = settings->value( "playlistSize", - QSize( 650, 310 ) ).toSize(); - playlistWidget->hide(); + show(); + activateWindow(); } - if( VISIBLE( playlistWidget ) ) + else if( isMinimized() ) { - playlistWidget->hide(); - if( videoIsActive ) - { - videoWidget->widgetSize = savedVideoSize; - videoWidget->resize( videoWidget->widgetSize ); - videoWidget->updateGeometry(); - } - if( bgWidget ) bgWidget->show(); + /* Minimized */ + showNormal(); + activateWindow(); } else { - playlistWidget->show(); - if( videoIsActive ) + /* Visible */ +#ifdef WIN32 + /* check if any visible window is above vlc in the z-order, + * but ignore the ones always on top */ + WINDOWINFO wi; + HWND hwnd; + wi.cbSize = sizeof( WINDOWINFO ); + for( hwnd = GetNextWindow( internalWinId(), GW_HWNDPREV ); + hwnd && !IsWindowVisible( hwnd ); + hwnd = GetNextWindow( hwnd, GW_HWNDPREV ) ); + if( !hwnd || !GetWindowInfo( hwnd, &wi ) || + (wi.dwExStyle&WS_EX_TOPMOST) ) +#else + if( isActiveWindow() ) +#endif { - savedVideoSize = videoWidget->widgetSize; - videoWidget->widgetSize.setHeight( 0 ); - videoWidget->resize( videoWidget->widgetSize ); - videoWidget->updateGeometry(); + hide(); + } + else + { + activateWindow(); } - if( VISIBLE( bgWidget ) ) bgWidget->hide(); } - doComponentsUpdate(); + QVLCMenu::updateSystrayMenu( this, p_intf ); } -/* Video widget cannot do this synchronously as it runs in another thread */ -/* Well, could it, actually ? Probably dangerous ... */ -void MainInterface::doComponentsUpdate() +void MainInterface::handleSystrayClick( + QSystemTrayIcon::ActivationReason reason ) { - calculateInterfaceSize(); - resize( mainSize ); + switch( reason ) + { + case QSystemTrayIcon::Trigger: + toggleUpdateSystrayMenu(); + break; + case QSystemTrayIcon::MiddleClick: + sysTray->showMessage( qtr( "VLC media player" ), + qtr( "Control menu for the player" ), + QSystemTrayIcon::Information, 3000 ); + break; + } } -void MainInterface::undockPlaylist() +/** + * 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 ) { - if( playlistWidget ) + if( name.isEmpty() ) { - playlistWidget->hide(); - playlistWidget->deleteLater(); - ui.vboxLayout->removeWidget( playlistWidget ); - playlistWidget = NULL; - playlistEmbeddedFlag = false; - - menuBar()->clear(); - QVLCMenu::createMenuBar( this, p_intf, false, advControlsEnabled, - visualSelectorEnabled); - - if( videoIsActive ) + sysTray->setToolTip( qtr( "VLC media player" ) ); + } + else + { + sysTray->setToolTip( name ); + if( notificationEnabled && ( isHidden() || isMinimized() ) ) { - videoWidget->widgetSize = savedVideoSize; - videoWidget->resize( videoWidget->widgetSize ); - videoWidget->updateGeometry(); + sysTray->showMessage( qtr( "VLC media player" ), name, + QSystemTrayIcon::NoIcon, 3000 ); } - - doComponentsUpdate(); - THEDP->playlistDialog(); } } -void MainInterface::toggleMenus() -{ - if( menuBar()->isVisible() ) menuBar()->hide(); - else menuBar()->show(); - msg_Dbg( p_intf, "I was there: \\_o<~~ coin coin" ); -} - -void MainInterface::customEvent( QEvent *event ) +/** + * Updates the status of the systray Icon tooltip. + * Doesn't check if the systray exists, check before you call it. + **/ +void MainInterface::updateSystrayTooltipStatus( int i_status ) { - if( event->type() == PLDockEvent_Type ) - { - PlaylistDialog::killInstance(); - playlistEmbeddedFlag = true; - menuBar()->clear(); - QVLCMenu::createMenuBar(this, p_intf, true, advControlsEnabled, - visualSelectorEnabled); - playlist(); - } - else if ( event->type() == SetVideoOnTopEvent_Type ) + switch( i_status ) { - SetVideoOnTopQtEvent* p_event = (SetVideoOnTopQtEvent*)event; - if( p_event->OnTop() ) - setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); - else - setWindowFlags(windowFlags() & ~Qt::WindowStaysOnTopHint); - show(); /* necessary to apply window flags?? */ + 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; + } } } - /************************************************************************ - * D&D + * D&D Events ************************************************************************/ void MainInterface::dropEvent(QDropEvent *event) { @@ -791,7 +1067,7 @@ void MainInterface::dropEvent(QDropEvent *event) { if( input_AddSubtitles( THEMIM->getInput(), qtu( mimeData->urls()[0].toString() ), - VLC_TRUE ) ) + true ) ) { event->acceptProposedAction(); return; @@ -799,12 +1075,13 @@ void MainInterface::dropEvent(QDropEvent *event) } } bool first = true; - foreach( QUrl url, mimeData->urls() ) { - QString s = url.toString(); + foreach( QUrl url, mimeData->urls() ) + { + QString s = url.toLocalFile(); if( s.length() > 0 ) { playlist_Add( THEPL, qtu(s), NULL, PLAYLIST_APPEND | (first ? PLAYLIST_GO:0), - PLAYLIST_END, VLC_TRUE, VLC_FALSE ); + PLAYLIST_END, true, false ); first = false; } } @@ -824,12 +1101,43 @@ void MainInterface::dragLeaveEvent(QDragLeaveEvent *event) } /************************************************************************ - * Other stuff + * 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() == 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 ) { + if( ( e->modifiers() & Qt::ControlModifier ) && ( e->key() & Qt::Key_H ) + && menuBar()->isHidden() ) + { + toggleMinimalView(); + e->accept(); + } + int i_vlck = qtEventToVLCKey( e ); - if( i_vlck >= 0 ) + if( i_vlck > 0 ) { var_SetInteger( p_intf->p_libvlc, "key-pressed", i_vlck ); e->accept(); @@ -845,136 +1153,23 @@ void MainInterface::wheelEvent( QWheelEvent *e ) e->accept(); } -void MainInterface::stop() -{ - THEMIM->stop(); -} - -void MainInterface::play() -{ - if( playlist_IsEmpty(THEPL) ) - { - /* The playlist is empty, open a file requester */ - THEDP->openFileDialog(); - setStatus( 0 ); - return; - } - THEMIM->togglePlayPause(); -} - -void MainInterface::prev() -{ - THEMIM->prev(); -} - -void MainInterface::next() -{ - THEMIM->next(); -} - -void MainInterface::setDisplay( float pos, int time, int length ) -{ - char psz_length[MSTRTIME_MAX_SIZE], psz_time[MSTRTIME_MAX_SIZE]; - secstotimestr( psz_length, length ); - secstotimestr( psz_time, time ); - QString title; - title.sprintf( "%s/%s", psz_time, psz_length ); - timeLabel->setText( " "+title+" " ); -} - -void MainInterface::setName( QString name ) -{ - input_name = name; - nameLabel->setText( " " + name+" " ); -} - -void MainInterface::setStatus( int status ) -{ - if( status == 1 ) // Playing - ui.playButton->setIcon( QIcon( ":/pixmaps/pause.png" ) ); - else - ui.playButton->setIcon( QIcon( ":/pixmaps/play.png" ) ); - if( systrayMenu ) - updateSystrayMenu( status ); -} - -#define HELP_MENU N_("Menu") -#define HELP_PCH N_("Previous chapter") -#define HELP_NCH N_("Next chapter") -#define HELP_PTR N_("Previous track") -#define HELP_NTR N_("Next track") - -void MainInterface::setNavigation( int navigation ) -{ - // 1 = chapter, 2 = title, 0 = no - if( navigation == 0 ) - { - ui.discFrame->hide(); - } else if( navigation == 1 ) { - ui.prevSectionButton->show(); - ui.prevSectionButton->setToolTip( qfu(HELP_PCH) ); - ui.nextSectionButton->show(); - ui.nextSectionButton->setToolTip( qfu(HELP_NCH) ); - ui.menuButton->show(); - ui.discFrame->show(); - } else { - ui.prevSectionButton->show(); - ui.prevSectionButton->setToolTip( qfu(HELP_PCH) ); - ui.nextSectionButton->show(); - ui.nextSectionButton->setToolTip( qfu(HELP_NCH) ); - ui.menuButton->hide(); - ui.discFrame->show(); - } -} - -static bool b_my_volume; - -void MainInterface::updateOnTimer() -{ - /* \todo Make this event-driven */ - advControls->enableInput( THEMIM->getIM()->hasInput() ); - advControls->enableVideo( THEMIM->getIM()->hasVideo() ); - - if( intf_ShouldDie( p_intf ) ) - { - QApplication::closeAllWindows(); - QApplication::quit(); - } - if( need_components_update ) - { - doComponentsUpdate(); - need_components_update = false; - } - - audio_volume_t i_volume; - aout_VolumeGet( p_intf, &i_volume ); - i_volume = (i_volume * 200 )/ AOUT_VOLUME_MAX ; - int i_gauge = ui.volumeSlider->value(); - b_my_volume = false; - if( i_volume - i_gauge > 1 || i_gauge - i_volume > 1 ) - { - b_my_volume = true; - ui.volumeSlider->setValue( i_volume ); - b_my_volume = false; - } -} - void MainInterface::closeEvent( QCloseEvent *e ) { hide(); - vlc_object_kill( p_intf ); + THEDP->quit(); } -void MainInterface::updateVolume( int sliderVolume ) +void MainInterface::toggleFullScreen( void ) { - if( !b_my_volume ) - { - int i_res = sliderVolume * AOUT_VOLUME_MAX / - (2*ui.volumeSlider->maximum() ); - aout_VolumeSet( p_intf, i_res ); - } + if( isFullScreen() ) + showNormal(); + else + showFullScreen(); } +/***************************************************************************** + * 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 ) @@ -1006,13 +1201,14 @@ static int PopupMenuCB( vlc_object_t *p_this, const char *psz_variable, } /***************************************************************************** - * IntfShowCB: callback triggered by the intf-show playlist variable. + * IntfShowCB: callback triggered by the intf-show libvlc variable. *****************************************************************************/ static int IntfShowCB( vlc_object_t *p_this, const char *psz_variable, vlc_value_t old_val, vlc_value_t new_val, void *param ) { intf_thread_t *p_intf = (intf_thread_t *)param; - //p_intf->p_sys->b_intf_show = VLC_TRUE; + p_intf->p_sys->p_mi->toggleFSC(); - return VLC_SUCCESS; + /* Show event */ + return VLC_SUCCESS; }