X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fmain_interface.cpp;h=35311a444fdba46cd2d4a4b31d2e0cf787d28ca2;hb=bad8f53f2b734cdc78f18bef8be1dc1589e5db4c;hp=341170aca25b2eb7cf40715d9c9b10f5067c5c49;hpb=ac471f21023adf4d3784ab3856b9a6040689d65c;p=vlc diff --git a/modules/gui/qt4/main_interface.cpp b/modules/gui/qt4/main_interface.cpp index 341170aca2..35311a444f 100644 --- a/modules/gui/qt4/main_interface.cpp +++ b/modules/gui/qt4/main_interface.cpp @@ -1,7 +1,7 @@ /***************************************************************************** - * main_inteface.cpp : Main interface + * main_interface.cpp : Main interface **************************************************************************** - * Copyright (C) 2006 the VideoLAN team + * Copyright (C) 2006-2007 the VideoLAN team * $Id$ * * Authors: Clément Stenac @@ -18,7 +18,8 @@ * * 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" @@ -37,11 +38,13 @@ #include #include #include +#include +#include +#include #include #include -#include -#include +#include #ifdef WIN32 #define PREF_W 410 @@ -59,6 +62,11 @@ #define DS(i) i.width(),i.height() +/* 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 ); +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 */ @@ -76,48 +84,43 @@ 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 ); } -bool embeddedPlaylistWasActive; -bool videoIsActive; -QSize savedVideoSize; - MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) { + /* Configuration */ settings = new QSettings( "VideoLAN", "VLC" ); settings->beginGroup( "MainWindow" ); - setAcceptDrops(true); + setWindowIcon( QApplication::windowIcon() ); need_components_update = false; bgWidget = NULL; videoWidget = NULL; playlistWidget = NULL; embeddedPlaylistWasActive = videoIsActive = false; + + input_name = ""; - /* Fetch configuration from settings and vlc config */ 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" )) alwaysVideoFlag = true; - playlistEmbeddedFlag = settings->value( "playlist-embedded", true ). - toBool(); + playlistEmbeddedFlag = settings->value("playlist-embedded", true).toBool(); advControlsEnabled= settings->value( "adv-controls", false ).toBool(); visualSelectorEnabled= settings->value( "visual-selector", false ).toBool(); - setWindowTitle( QString::fromUtf8( _("VLC media player") ) ); + /* UI */ + setVLCWindowsTitle(); handleMainUi( settings ); - QVLCMenu::createMenuBar( this, p_intf, playlistEmbeddedFlag, advControlsEnabled, visualSelectorEnabled ); - - /* Status bar */ timeLabel = new QLabel( 0 ); nameLabel = new QLabel( 0 ); statusBar()->addWidget( nameLabel, 4 ); statusBar()->addPermanentWidget( timeLabel, 1 ); setFocusPolicy( Qt::StrongFocus ); + setAcceptDrops(true); /* Init input manager */ MainInputManager::getInstance( p_intf ); @@ -125,68 +128,84 @@ MainInterface::MainInterface( intf_thread_t *_p_intf ) : QVLCMW( _p_intf ) /* Volume control */ CONNECT( ui.volumeSlider, valueChanged(int), this, updateVolume(int) ); + /* Connect the input manager to the GUI elements it manages */ CONNECT( THEMIM->getIM(), positionUpdated( float, int, int ), slider, setPosition( float,int, int ) ); CONNECT( THEMIM->getIM(), positionUpdated( float, int, int ), this, setDisplay( float, int, int ) ); - CONNECT( THEMIM->getIM(), nameChanged( QString ), this,setName( QString ) ); + + /* Naming in the controller */ + CONNECT( THEMIM->getIM(), nameChanged( QString ), this, + setName( QString ) ); + if( config_GetInt( p_intf, "qt-system-tray" ) ) + { + CONNECT( THEMIM->getIM(), nameChanged( QString ), this, + updateSystrayTooltipName(QString)); + } + if( config_GetInt( p_intf, "qt-name-in-title" ) ) + { + CONNECT( THEMIM->getIM(), nameChanged( QString ), this, + setVLCWindowsTitle( QString ) ); + } + + /* PLAY_STATUS */ CONNECT( THEMIM->getIM(), statusChanged( int ), this, setStatus( int ) ); + CONNECT( THEMIM->getIM(), navigationChanged( int ), + this, setNavigation(int) ); + if( config_GetInt( p_intf, "qt-system-tray" ) ) + { + 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() ); + var_Create( p_intf, "interaction", VLC_VAR_ADDRESS ); var_AddCallback( p_intf, "interaction", InteractCallback, this ); p_intf->b_interaction = VLC_TRUE; -} -void MainInterface::dropEvent(QDropEvent *event) -{ - const QMimeData *mimeData = event->mimeData(); + /* 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 ); + } + if( QSystemTrayIcon::isSystemTrayAvailable() && + ( config_GetInt( p_intf, "qt-start-mininimized") == 1)) + { + hide(); + createSystrayMenu(); + } + if( QSystemTrayIcon::isSystemTrayAvailable() && + ( config_GetInt( p_intf, "qt-system-tray") == 1)) + createSystrayMenu(); - /* D&D of a subtitles file, add it on the fly */ - if( mimeData->urls().size() == 1 ) - { - if( THEMIM->getIM()->hasInput() ) - { - if( input_AddSubtitles( THEMIM->getInput(), - qtu( mimeData->urls()[0].toString() ), - VLC_TRUE ) ) - { - event->acceptProposedAction(); - return; - } - } - } - bool first = true; - foreach( QUrl url, mimeData->urls() ) { - QString s = url.toString(); - if( s.length() > 0 ) { - playlist_PlaylistAdd( THEPL, qtu(s), NULL, - PLAYLIST_APPEND | (first ? PLAYLIST_GO:0), - PLAYLIST_END ); - first = false; - } - } - event->acceptProposedAction(); -} -void MainInterface::dragEnterEvent(QDragEnterEvent *event) -{ - event->acceptProposedAction(); -} -void MainInterface::dragMoveEvent(QDragMoveEvent *event) -{ - event->acceptProposedAction(); } -void MainInterface::dragLeaveEvent(QDragLeaveEvent *event) -{ - event->accept(); -} - - 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 ); + } + settings->setValue( "playlist-embedded", playlistEmbeddedFlag ); settings->setValue( "adv-controls", advControlsEnabled ); settings->setValue( "pos", pos() ); @@ -200,6 +219,18 @@ MainInterface::~MainInterface() p_intf->pf_control_window = NULL; } +void MainInterface::setVLCWindowsTitle( QString aTitle ) +{ + if( aTitle.isEmpty() ) + { + this->setWindowTitle( qtr( "VLC media player" ) ); + } + else + { + this->setWindowTitle( aTitle + " - " + qtr( "VLC media player" ) ); + } +} + void MainInterface::handleMainUi( QSettings *settings ) { QWidget *main = new QWidget( this ); @@ -207,7 +238,11 @@ void MainInterface::handleMainUi( QSettings *settings ) ui.setupUi( centralWidget() ); slider = new InputSlider( Qt::Horizontal, NULL ); - ui.hboxLayout->insertWidget( 0, slider ); + 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() ); @@ -223,7 +258,7 @@ void MainInterface::handleMainUi( QSettings *settings ) ui.volMuteLabel->installEventFilter(h); ui.volumeSlider->setFocusPolicy( Qt::NoFocus ); - BUTTON_SET_IMG( ui.playlistButton, "" ,volume-low.png, + BUTTON_SET_IMG( ui.playlistButton, "" , playlist_icon.png, playlistEmbeddedFlag ? qtr( "Show playlist" ) : qtr( "Open playlist" ) ); BUTTONACT( ui.playlistButton, playlist() ); @@ -267,6 +302,81 @@ void MainInterface::handleMainUi( QSettings *settings ) setMinimumSize( PREF_W, addSize.height() ); } +void MainInterface::createSystrayMenu() +{ + QIcon iconVLC = QIcon( QPixmap( ":/vlc128.png" ) ); + sysTray = new QSystemTrayIcon( iconVLC, this ); + systrayMenu = new QMenu( qtr( "VLC media player" ), this ); + systrayMenu->setIcon( iconVLC ); + sysTray->setToolTip( qtr( "VLC media player" )); + 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::toggleUpdateSystrayMenu() +{ + toggleVisible(); + 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; + } +} + + +void MainInterface::updateSystrayTooltipName( QString name ) +{ + if( name.isEmpty() ) + { + sysTray->setToolTip( qtr( "VLC media player" ) ); + } + else + { + sysTray->setToolTip( name ); + } +} + +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; + } + } +} /********************************************************************** * Handling of the components **********************************************************************/ @@ -331,13 +441,13 @@ void *MainInterface::requestVideo( vout_thread_t *p_nvout, int *pi_x, if( VISIBLE( playlistWidget ) ) { embeddedPlaylistWasActive = true; - playlistWidget->hide(); +// playlistWidget->hide(); } bool bgWasVisible = false; if( VISIBLE( bgWidget) ) { bgWasVisible = true; - bgWidget->hide(); +// bgWidget->hide(); } if( THEMIM->getIM()->hasVideo() || !bgWasVisible ) { @@ -350,7 +460,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(); /// FIXME: Needed ? need_components_update = true; } return ret; @@ -363,14 +473,31 @@ 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; } +class SetVideoOnTopQtEvent : public QEvent +{ +public: + SetVideoOnTopQtEvent( bool _onTop ) : + QEvent( (QEvent::Type)SetVideoOnTopEvent_Type ), onTop( _onTop) + { + } + + bool OnTop() const + { + return onTop; + } + +private: + bool onTop; +}; + int MainInterface::controlVideo( void *p_window, int i_query, va_list args ) { int i_ret = VLC_EGENERIC; @@ -389,15 +516,19 @@ int MainInterface::controlVideo( void *p_window, int i_query, va_list args ) { unsigned int i_width = va_arg( args, unsigned int ); unsigned int i_height = va_arg( args, unsigned int ); -// if( !i_width && p_vout ) i_width = p_vout->i_window_width; -// if( !i_height && p_vout ) i_height = p_vout->i_window_height; videoWidget->widgetSize = QSize( i_width, i_height ); - videoWidget->updateGeometry(); + // videoWidget->updateGeometry(); need_components_update = true; i_ret = VLC_SUCCESS; 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: msg_Warn( p_intf, "unsupported control query" ); break; @@ -462,8 +593,7 @@ void MainInterface::playlist() QSize( 650, 310 ) ).toSize(); playlistWidget->hide(); } - /// Todo, reset its size ? - if( VISIBLE( playlistWidget) ) + if( VISIBLE( playlistWidget ) ) { playlistWidget->hide(); if( videoIsActive ) @@ -533,6 +663,62 @@ void MainInterface::customEvent( QEvent *event ) visualSelectorEnabled); playlist(); } + 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?? */ + } +} + + +/************************************************************************ + * D&D + ************************************************************************/ +void MainInterface::dropEvent(QDropEvent *event) +{ + const QMimeData *mimeData = event->mimeData(); + + /* D&D of a subtitles file, add it on the fly */ + if( mimeData->urls().size() == 1 ) + { + if( THEMIM->getIM()->hasInput() ) + { + if( input_AddSubtitles( THEMIM->getInput(), + qtu( mimeData->urls()[0].toString() ), + VLC_TRUE ) ) + { + event->acceptProposedAction(); + return; + } + } + } + bool first = true; + foreach( QUrl url, mimeData->urls() ) { + QString s = url.toString(); + if( s.length() > 0 ) { + playlist_Add( THEPL, qtu(s), NULL, + PLAYLIST_APPEND | (first ? PLAYLIST_GO:0), + PLAYLIST_END, VLC_TRUE, VLC_FALSE ); + first = false; + } + } + event->acceptProposedAction(); +} +void MainInterface::dragEnterEvent(QDragEnterEvent *event) +{ + event->acceptProposedAction(); +} +void MainInterface::dragMoveEvent(QDragMoveEvent *event) +{ + event->acceptProposedAction(); +} +void MainInterface::dragLeaveEvent(QDragLeaveEvent *event) +{ + event->accept(); } /************************************************************************ @@ -550,28 +736,38 @@ void MainInterface::keyPressEvent( QKeyEvent *e ) e->ignore(); } +void MainInterface::wheelEvent( QWheelEvent *e ) +{ + int i_vlckey = qtWheelEventToVLCKey( e ); + var_SetInteger( p_intf->p_libvlc, "key-pressed", i_vlckey ); + e->accept(); +} + void MainInterface::stop() { - playlist_Stop( THEPL ); + THEMIM->stop(); } + void MainInterface::play() { - if( !THEPL->i_size || !THEPL->i_enabled ) + if( playlist_IsEmpty(THEPL) ) { /* The playlist is empty, open a file requester */ - THEDP->simpleOpenDialog(); + THEDP->openFileDialog(); setStatus( 0 ); return; } THEMIM->togglePlayPause(); } + void MainInterface::prev() { - playlist_Prev( THEPL ); + THEMIM->prev(); } + void MainInterface::next() { - playlist_Next( THEPL ); + THEMIM->next(); } void MainInterface::setDisplay( float pos, int time, int length ) @@ -586,7 +782,9 @@ void MainInterface::setDisplay( float pos, int time, int length ) void MainInterface::setName( QString name ) { + input_name = name; nameLabel->setText( " " + name+" " ); + } void MainInterface::setStatus( int status ) @@ -595,6 +793,36 @@ void MainInterface::setStatus( int status ) ui.playButton->setIcon( QIcon( ":/pixmaps/pause.png" ) ); else ui.playButton->setIcon( QIcon( ":/pixmaps/play.png" ) ); + 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; @@ -632,7 +860,7 @@ void MainInterface::updateOnTimer() void MainInterface::closeEvent( QCloseEvent *e ) { hide(); - p_intf->b_die = VLC_TRUE; + vlc_object_kill( p_intf ); } void MainInterface::updateVolume( int sliderVolume ) @@ -655,3 +883,34 @@ static int InteractCallback( vlc_object_t *p_this, QApplication::postEvent( THEDP, static_cast(event) ); return VLC_SUCCESS; } + +/***************************************************************************** + * PopupMenuCB: callback triggered by the intf-popupmenu playlist variable. + * We don't show the menu directly here because we don't want the + * caller to block for a too long time. + *****************************************************************************/ +static int PopupMenuCB( 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; + + if( p_intf->pf_show_dialog ) + { + p_intf->pf_show_dialog( p_intf, INTF_DIALOG_POPUPMENU, + new_val.b_bool, 0 ); + } + + return VLC_SUCCESS; +} + +/***************************************************************************** + * IntfShowCB: callback triggered by the intf-show playlist 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; + + return VLC_SUCCESS; +}