X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fmain_interface.cpp;h=858e714701d2e6a4cb730ad4fe428ae085f6c403;hb=3c3ccb56005f6d02be05de6ea051a14b0df77372;hp=acf626cbd53651f5f1c075db4831e5a1661d6a72;hpb=4c2466aaa09ba233fc13a79f617e342e8f19e553;p=vlc diff --git a/modules/gui/qt4/main_interface.cpp b/modules/gui/qt4/main_interface.cpp index acf626cbd5..858e714701 100644 --- a/modules/gui/qt4/main_interface.cpp +++ b/modules/gui/qt4/main_interface.cpp @@ -5,6 +5,7 @@ * $Id$ * * Authors: Clément Stenac + * Jean-Baptiste Kempf * * 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 @@ -18,13 +19,12 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #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" @@ -39,6 +39,13 @@ #include #include #include +#include +#include +#include +#include +#include +#include +#include #include #include @@ -46,14 +53,12 @@ #ifdef WIN32 #define PREF_W 410 - #define PREF_H 121 + #define PREF_H 151 #else - #define PREF_W 450 - #define PREF_H 125 + #define PREF_W 400 + #define PREF_H 140 #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); @@ -84,68 +89,150 @@ static int DoControl( intf_thread_t *p_intf, void *p_win, int i_q, va_list a ) MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) { - /* Configuration */ - settings = new QSettings( "VideoLAN", "VLC" ); - settings->beginGroup( "MainWindow" ); - - setWindowIcon( QApplication::windowIcon() ); - + /* Variables initialisation */ need_components_update = false; bgWidget = NULL; videoWidget = NULL; playlistWidget = NULL; embeddedPlaylistWasActive = videoIsActive = false; + input_name = ""; + + /** + * Configuration and settings + **/ + settings = new QSettings( "vlc", "vlc-qt-interface" ); + settings->beginGroup( "MainWindow" ); + + /* Main settings */ + setFocusPolicy( Qt::StrongFocus ); + 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; + if( config_GetInt( p_intf, "embedded-video" ) ) + videoEmbeddedFlag = true; alwaysVideoFlag = false; - if( videoEmbeddedFlag && config_GetInt( p_intf, "qt-always-video" )) + if( videoEmbeddedFlag && config_GetInt( p_intf, "qt-always-video" ) ) alwaysVideoFlag = true; - playlistEmbeddedFlag = settings->value("playlist-embedded", true).toBool(); - advControlsEnabled= settings->value( "adv-controls", false ).toBool(); - visualSelectorEnabled= settings->value( "visual-selector", false ).toBool(); - - /* UI */ + /* Set the other interface settings */ + playlistEmbeddedFlag = settings->value( "playlist-embedded", true).toBool(); + visualSelectorEnabled = settings->value( "visual-selector", false ).toBool(); + notificationEnabled = config_GetInt( p_intf, "qt-notification" ) + ? true : false; + /************************** + * UI and Widgets design + **************************/ setVLCWindowsTitle(); handleMainUi( settings ); + +#if 0 /* dock part */ + QDockWidget *dock = new QDockWidget( this ); + PlaylistWidget *plw = new PlaylistWidget( p_intf ); + dock->setWidget( plw ); + addDockWidget( Qt::RightDockWidgetArea, dock ); + + QToolBar *tb = new QToolBar(this); + tb->addAction( "playlist", dock, SLOT( hide() ) ); + addToolBar(Qt::RightToolBarArea, tb); +#endif + + /* Menu Bar */ QVLCMenu::createMenuBar( this, p_intf, playlistEmbeddedFlag, - advControlsEnabled, visualSelectorEnabled ); - timeLabel = new QLabel( 0 ); - nameLabel = new QLabel( 0 ); - statusBar()->addWidget( nameLabel, 4 ); - statusBar()->addPermanentWidget( timeLabel, 1 ); + visualSelectorEnabled ); + + /* Status Bar */ + /** + * TODO: clicking on the elapsed time should switch to the remaining time + **/ + /** + * TODO: do we add a label for the current Volume ? + **/ + b_remainingTime = false; + timeLabel = new TimeLabel; + nameLabel = new QLabel; + speedLabel = new QLabel( "1.00x" ); + timeLabel->setFrameStyle( QFrame::Sunken | QFrame::Panel ); + speedLabel->setFrameStyle( QFrame::Sunken | QFrame::Panel ); + statusBar()->addWidget( nameLabel, 8 ); + statusBar()->addPermanentWidget( speedLabel, 0 ); + statusBar()->addPermanentWidget( timeLabel, 2 ); + speedLabel->setContextMenuPolicy ( Qt::CustomContextMenu ); + timeLabel->setContextMenuPolicy ( Qt::CustomContextMenu ); + CONNECT( timeLabel, timeLabelClicked(), this, toggleTimeDisplay() ); + CONNECT( timeLabel, timeLabelDoubleClicked(), THEDP, gotoTimeDialog() ); + CONNECT( speedLabel, customContextMenuRequested( QPoint ), + this, showSpeedMenu( QPoint ) ); + CONNECT( timeLabel, customContextMenuRequested( QPoint ), + this, toggleTimeDisplay() ); + + /********************** + * Systray Management * + **********************/ + sysTray = NULL; + bool b_createSystray = false; + bool b_systrayAvailable = QSystemTrayIcon::isSystemTrayAvailable(); + if( config_GetInt( p_intf, "qt-start-minimized") ) + { + if( b_systrayAvailable ){ + b_createSystray = true; + hide(); //FIXME + } + else msg_Warn( p_intf, "You can't minize if you haven't a system " + "tray bar" ); + } + if( config_GetInt( p_intf, "qt-system-tray") ) + b_createSystray = true; - setFocusPolicy( Qt::StrongFocus ); - setAcceptDrops(true); + if( b_systrayAvailable && b_createSystray ) + createSystray(); /* Init input manager */ MainInputManager::getInstance( p_intf ); ON_TIMEOUT( updateOnTimer() ); - /* Volume control */ - CONNECT( ui.volumeSlider, valueChanged(int), this, updateVolume(int) ); + /** + * Various CONNECTs + **/ + /* 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 ) ); + + CONNECT( THEMIM->getIM(), rateChanged( int ), this, setRate( int ) ); + + /** Connects on nameChanged() */ + /* Naming in the controller statusbar */ CONNECT( THEMIM->getIM(), nameChanged( QString ), this, - setName( QString ) ); + setName( QString ) ); + /* 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 ) ); + } + + /** CONNECTS on PLAY_STATUS **/ + /* Status on the main controller */ CONNECT( THEMIM->getIM(), statusChanged( int ), this, setStatus( int ) ); - CONNECT( THEMIM->getIM(), statusChanged( int ), this, - updateSystrayMenu( int ) ); - CONNECT( THEMIM->getIM(), navigationChanged( int ), - this, setNavigation(int) ); - CONNECT( slider, sliderDragged( float ), - THEMIM->getIM(), sliderUpdate( float ) ); - - CONNECT( ui.prevSectionButton, clicked(), THEMIM->getIM(), - sectionPrev() ); - CONNECT( ui.nextSectionButton, clicked(), THEMIM->getIM(), - sectionNext() ); - CONNECT( ui.menuButton, clicked(), THEMIM->getIM(), - sectionMenu() ); + /* and in the systray */ + if( sysTray ) + { + CONNECT( THEMIM->getIM(), statusChanged( int ), this, + updateSystrayTooltipStatus( int ) ); + } + /** + * Callbacks + **/ var_Create( p_intf, "interaction", VLC_VAR_ADDRESS ); var_AddCallback( p_intf, "interaction", InteractCallback, this ); p_intf->b_interaction = VLC_TRUE; @@ -159,9 +246,6 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) var_AddCallback( p_playlist, "intf-show", IntfShowCB, p_intf ); vlc_object_release( p_playlist ); } - if( QSystemTrayIcon::isSystemTrayAvailable() && - ( config_GetInt( p_intf, "qt-system-tray") == 1)) - createSystrayMenu(); } MainInterface::~MainInterface() @@ -177,7 +261,7 @@ MainInterface::~MainInterface() } settings->setValue( "playlist-embedded", playlistEmbeddedFlag ); - settings->setValue( "adv-controls", advControlsEnabled ); + settings->setValue( "adv-controls", getControlsVisibilityStatus() & 0x1 ); settings->setValue( "pos", pos() ); settings->endGroup(); delete settings; @@ -189,122 +273,96 @@ MainInterface::~MainInterface() p_intf->pf_control_window = NULL; } +/***************************** + * Main UI handling * + *****************************/ + +/** + * 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() ) { - this->setWindowTitle( qtr( "VLC media player" ) ); + setWindowTitle( qtr( "VLC media player" ) ); } else { - this->setWindowTitle( aTitle + " - " + qtr( "VLC media player" ) ); + setWindowTitle( aTitle + " - " + qtr( "VLC media player" ) ); } } + void MainInterface::handleMainUi( QSettings *settings ) { + /* Create the main Widget and the mainLayout */ QWidget *main = new QWidget( this ); + mainLayout = new QVBoxLayout( main ); setCentralWidget( main ); - ui.setupUi( centralWidget() ); - - 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() ); - /* Set initial size */ - resize ( PREF_W, PREF_H ); + /* Margins, spacing */ + main->setContentsMargins( 0, 0, 0, 0 ); + mainLayout->setMargin( 0 ); - addSize = QSize( ui.vboxLayout->margin() * 2, PREF_H ); + /* Create the CONTROLS Widget */ + controls = new ControlsWidget( p_intf, + settings->value( "adv-controls", false ).toBool() ); - advControls = new ControlsWidget( p_intf ); - ui.vboxLayout->insertWidget( 0, advControls ); - advControls->updateGeometry(); - if( !advControlsEnabled ) advControls->hide(); - need_components_update = true; + /* Configure the Controls */ + BUTTON_SET_IMG( controls->playlistButton, "" , playlist_icon.png, + playlistEmbeddedFlag ? qtr( "Show playlist" ) : + qtr( "Open playlist" ) ); + BUTTONACT( controls->playlistButton, togglePlaylist() ); + + /* Add the controls Widget to the main Widget */ + mainLayout->addWidget( controls ); + + /* Create the Speed Control Widget */ + speedControl = new SpeedControlWidget( p_intf ); + speedControlMenu = new QMenu( this ); + QWidgetAction *widgetAction = new QWidgetAction( this ); + widgetAction->setDefaultWidget( speedControl ); + speedControlMenu->addAction( widgetAction ); + + /* Set initial size */ + resize( PREF_W, PREF_H ); + addSize = QSize( mainLayout->margin() * 2, PREF_H ); + /* Visualisation */ visualSelector = new VisualSelector( p_intf ); - ui.vboxLayout->insertWidget( 0, visualSelector ); + mainLayout->insertWidget( 0, visualSelector ); visualSelector->hide(); + /* And video Outputs */ if( alwaysVideoFlag ) { bgWidget = new BackgroundWidget( p_intf ); bgWidget->widgetSize = settings->value( "backgroundSize", - QSize( 200, 200 ) ).toSize(); + QSize( 300, 300 ) ).toSize(); bgWidget->resize( bgWidget->widgetSize ); bgWidget->updateGeometry(); - ui.vboxLayout->insertWidget( 0, bgWidget ); + mainLayout->insertWidget( 0, bgWidget ); } if( videoEmbeddedFlag ) { videoWidget = new VideoWidget( p_intf ); videoWidget->widgetSize = QSize( 1, 1 ); - videoWidget->resize( videoWidget->widgetSize ); - ui.vboxLayout->insertWidget( 0, videoWidget ); + //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; } - setMinimumSize( PREF_W, addSize.height() ); -} -void MainInterface::createSystrayMenu() -{ - QIcon iconVLC = QIcon( QPixmap( ":/vlc128.png" ) ); - sysTray = new QSystemTrayIcon( iconVLC ); - 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 ) ); -} - -void MainInterface::updateSystrayMenu( int status ) -{ - QVLCMenu::updateSystrayMenu( this, p_intf ) ; -} - -void MainInterface::handleSystrayClick( QSystemTrayIcon::ActivationReason reason ) -{ - switch( reason ) - { - case QSystemTrayIcon::Trigger: - this->show(); break; - case QSystemTrayIcon::MiddleClick: - sysTray->showMessage( qtr( "VLC media player" ), - qtr( "Control menu for the player" ), - QSystemTrayIcon::Information, 4000 ); - break; - } + /* Finish the sizing */ + setMinimumSize( PREF_W, addSize.height() ); } /********************************************************************** - * Handling of the components + * Handling of sizing of the components **********************************************************************/ void MainInterface::calculateInterfaceSize() { @@ -332,16 +390,17 @@ void MainInterface::calculateInterfaceSize() } if( VISIBLE( visualSelector ) ) height += visualSelector->height(); - if( VISIBLE( advControls) ) +/* if( VISIBLE( advControls) ) { height += advControls->sizeHint().height(); - } + }*/ mainSize = QSize( width + addSize.width(), height + addSize.height() ); } void MainInterface::resizeEvent( QResizeEvent *e ) { - videoWidget->widgetSize.setWidth( e->size().width() - addSize.width() ); + if( videoWidget ) + videoWidget->widgetSize.setWidth( e->size().width() - addSize.width() ); if( videoWidget && videoIsActive && videoWidget->widgetSize.height() > 1 ) { SET_WH( videoWidget, e->size().width() - addSize.width(), @@ -356,6 +415,17 @@ void MainInterface::resizeEvent( QResizeEvent *e ) } } +/**************************************************************************** + * Small right-click menus + ****************************************************************************/ +void MainInterface::showSpeedMenu( QPoint pos ) +{ + speedControlMenu->exec( QCursor::pos() - pos + QPoint( 0, speedLabel->height() ) ); +} + +/**************************************************************************** + * Video Handling + ****************************************************************************/ void *MainInterface::requestVideo( vout_thread_t *p_nvout, int *pi_x, int *pi_y, unsigned int *pi_width, unsigned int *pi_height ) @@ -373,7 +443,7 @@ void *MainInterface::requestVideo( vout_thread_t *p_nvout, int *pi_x, if( VISIBLE( bgWidget) ) { bgWasVisible = true; -// bgWidget->hide(); + bgWidget->hide(); } if( THEMIM->getIM()->hasVideo() || !bgWasVisible ) { @@ -386,7 +456,7 @@ void *MainInterface::requestVideo( vout_thread_t *p_nvout, int *pi_x, // videoWidget->widgetSize = bgWidget->widgeTSize; videoWidget->widgetSize = QSize( *pi_width, *pi_height ); } -// videoWidget->updateGeometry(); /// FIXME: Needed ? + videoWidget->updateGeometry(); // Needed for deinterlace need_components_update = true; } return ret; @@ -399,9 +469,9 @@ void MainInterface::releaseVideo( void *p_win ) videoWidget->resize( videoWidget->widgetSize ); if( embeddedPlaylistWasActive ) - ;//playlistWidget->show(); + playlistWidget->show(); else if( bgWidget ) - ;//bgWidget->show(); + bgWidget->show(); videoIsActive = false; need_components_update = true; @@ -462,44 +532,15 @@ int MainInterface::controlVideo( void *p_window, int i_query, va_list args ) return i_ret; } -void MainInterface::advanced() -{ - if( !VISIBLE( advControls ) ) - { - advControls->show(); - advControlsEnabled = true; - } - else - { - advControls->hide(); - advControlsEnabled = false; - } - doComponentsUpdate(); -} - -void MainInterface::visual() -{ - if( !VISIBLE( visualSelector) ) - { - visualSelector->show(); - if( !THEMIM->getIM()->hasVideo() ) - { - /* Show the background widget */ - } - visualSelectorEnabled = true; - } - else - { - /* Stop any currently running visualization */ - visualSelector->hide(); - visualSelectorEnabled = false; - } - doComponentsUpdate(); -} - -void MainInterface::playlist() +/***************************************************************************** + * Playlist, Visualisation and Menus handling + *****************************************************************************/ +/** + * Toggle the playlist widget or dialog + **/ +void MainInterface::togglePlaylist() { - // Toggle the playlist dialog + // Toggle the playlist dialog if not embedded and return if( !playlistEmbeddedFlag ) { if( playlistWidget ) @@ -510,23 +551,30 @@ void MainInterface::playlist() return; } + // Create the playlist Widget and destroy the existing dialog if( !playlistWidget ) { PlaylistDialog::killInstance(); playlistWidget = new PlaylistWidget( p_intf ); - ui.vboxLayout->insertWidget( 0, playlistWidget ); + mainLayout->insertWidget( 0, playlistWidget ); playlistWidget->widgetSize = settings->value( "playlistSize", QSize( 650, 310 ) ).toSize(); playlistWidget->hide(); + if(bgWidget) + CONNECT( playlistWidget, artSet( QString ), bgWidget, setArt(QString) ); } + + // And toggle visibility if( VISIBLE( playlistWidget ) ) { playlistWidget->hide(); + if( bgWidget ) bgWidget->show(); if( videoIsActive ) { videoWidget->widgetSize = savedVideoSize; videoWidget->resize( videoWidget->widgetSize ); videoWidget->updateGeometry(); + if( bgWidget ) bgWidget->hide(); } } else @@ -541,15 +589,8 @@ void MainInterface::playlist() } if( VISIBLE( bgWidget ) ) bgWidget->hide(); } - doComponentsUpdate(); -} -/* Video widget cannot do this synchronously as it runs in another thread */ -/* Well, could it, actually ? Probably dangerous ... */ -void MainInterface::doComponentsUpdate() -{ - calculateInterfaceSize(); - resize( mainSize ); + doComponentsUpdate(); } void MainInterface::undockPlaylist() @@ -558,13 +599,12 @@ void MainInterface::undockPlaylist() { playlistWidget->hide(); playlistWidget->deleteLater(); - ui.vboxLayout->removeWidget( playlistWidget ); + mainLayout->removeWidget( playlistWidget ); playlistWidget = NULL; playlistEmbeddedFlag = false; menuBar()->clear(); - QVLCMenu::createMenuBar( this, p_intf, false, advControlsEnabled, - visualSelectorEnabled); + QVLCMenu::createMenuBar( this, p_intf, false, visualSelectorEnabled); if( videoIsActive ) { @@ -578,31 +618,255 @@ void MainInterface::undockPlaylist() } } -void MainInterface::customEvent( QEvent *event ) +#if 0 +void MainInterface::visual() { - if( event->type() == PLDockEvent_Type ) + if( !VISIBLE( visualSelector) ) { - PlaylistDialog::killInstance(); - playlistEmbeddedFlag = true; - menuBar()->clear(); - QVLCMenu::createMenuBar(this, p_intf, true, advControlsEnabled, - visualSelectorEnabled); - playlist(); + visualSelector->show(); + if( !THEMIM->getIM()->hasVideo() ) + { + /* Show the background widget */ + } + visualSelectorEnabled = true; } - else if ( event->type() == SetVideoOnTopEvent_Type ) + else { - SetVideoOnTopQtEvent* p_event = (SetVideoOnTopQtEvent*)event; - if( p_event->OnTop() ) - setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); + /* Stop any currently running visualization */ + visualSelector->hide(); + visualSelectorEnabled = false; + } + doComponentsUpdate(); +} +#endif + +void MainInterface::toggleMenus() +{ + TOGGLEV( controls ); + TOGGLEV( statusBar() ); + updateGeometry(); +} + +/* Video widget cannot do this synchronously as it runs in another thread */ +/* Well, could it, actually ? Probably dangerous ... */ +void MainInterface::doComponentsUpdate() +{ + calculateInterfaceSize(); + resize( mainSize ); +} + +void MainInterface::toggleAdvanced() +{ + controls->toggleAdvanced(); +} + +int MainInterface::getControlsVisibilityStatus() +{ + return( (controls->isVisible() ? 0x2 : 0x0 ) + + controls->b_advancedVisible ); +} + +/************************************************************************ + * 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 - time : time ); + QString title; title.sprintf( "%s/%s", psz_time, psz_length ); + if( b_remainingTime ) timeLabel->setText( " -"+title+" " ); + else timeLabel->setText( " "+title+" " ); +} + +void MainInterface::toggleTimeDisplay() +{ + b_remainingTime = ( b_remainingTime ? false : true ); +} + +void MainInterface::setName( QString name ) +{ + input_name = name; + nameLabel->setText( " " + name+" " ); +} + +void MainInterface::setStatus( int status ) +{ + controls->setStatus( status ); + if( sysTray ) + updateSystrayMenu( status ); +} + +void MainInterface::setRate( int rate ) +{ + QString str; + str.setNum( ( 1000 / (double)rate), 'f', 2 ); + str.append( "x" ); + speedLabel->setText( str ); + speedControl->updateControls( rate ); +} + +void MainInterface::updateOnTimer() +{ + /* \todo Make this event-driven */ + if( intf_ShouldDie( p_intf ) ) + { + QApplication::closeAllWindows(); + QApplication::quit(); + } + if( need_components_update ) + { + doComponentsUpdate(); + need_components_update = false; + } + + controls->updateOnTimer(); +} + +/***************************************************************************** + * 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 = 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 ) ); +} + +/** + * Update the menu of the Systray Icon. + * May be unneedded, since it just calls QVLCMenu::update + * FIXME !!! + **/ +void MainInterface::updateSystrayMenu( int status ) +{ + QVLCMenu::updateSystrayMenu( this, p_intf ) ; +} + +/** + * Updates the Systray Icon's menu and toggle the main interface + */ +void MainInterface::toggleUpdateSystrayMenu() +{ + if( isHidden() ) + { + show(); + activateWindow(); + } + else if( isMinimized() ) + { + showNormal(); + activateWindow(); + } + else + { +#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 + { + hide(); + } else - setWindowFlags(windowFlags() & ~Qt::WindowStaysOnTopHint); - show(); /* necessary to apply window flags?? */ + { + activateWindow(); + } } + QVLCMenu::updateSystrayMenu( this, p_intf ); } +void MainInterface::handleSystrayClick( + QSystemTrayIcon::ActivationReason reason ) +{ + switch( reason ) + { + case QSystemTrayIcon::Trigger: + toggleUpdateSystrayMenu(); + break; + case QSystemTrayIcon::MiddleClick: + sysTray->showMessage( qtr( "VLC media player" ), + qtr( "Control menu for the player" ), + QSystemTrayIcon::Information, 4000 ); + break; + } +} + +/** + * 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 ) +{ + if( name.isEmpty() ) + { + sysTray->setToolTip( qtr( "VLC media player" ) ); + } + else + { + sysTray->setToolTip( name ); + if( notificationEnabled && ( isHidden() || isMinimized() ) ) + { + sysTray->showMessage( qtr( "VLC media player" ), name, + QSystemTrayIcon::NoIcon, 4000 ); + } + } +} + +/** + * 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 ) +{ + 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; + } + } +} /************************************************************************ - * D&D + * D&D Events ************************************************************************/ void MainInterface::dropEvent(QDropEvent *event) { @@ -648,8 +912,29 @@ void MainInterface::dragLeaveEvent(QDragLeaveEvent *event) } /************************************************************************ - * Other stuff + * Events stuff ************************************************************************/ +void MainInterface::customEvent( QEvent *event ) +{ + if( event->type() == PLDockEvent_Type ) + { + PlaylistDialog::killInstance(); + playlistEmbeddedFlag = true; + menuBar()->clear(); + QVLCMenu::createMenuBar(this, p_intf, true, visualSelectorEnabled); + togglePlaylist(); + } + 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 ) { int i_vlck = qtEventToVLCKey( e ); @@ -669,134 +954,15 @@ 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 ) -{ - nameLabel->setText( " " + name+" " ); - setVLCWindowsTitle( 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" ) ); -} - -#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(); - p_intf->b_die = VLC_TRUE; -} - -void MainInterface::updateVolume( int sliderVolume ) -{ - if( !b_my_volume ) - { - int i_res = sliderVolume * AOUT_VOLUME_MAX / - (2*ui.volumeSlider->maximum() ); - aout_VolumeSet( p_intf, i_res ); - } + vlc_object_kill( p_intf ); } +/***************************************************************************** + * 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 )