/*****************************************************************************
* main_interface.cpp : Main interface
****************************************************************************
- * Copyright (C) 2006 the VideoLAN team
+ * Copyright (C) 2006-2007 the VideoLAN team
* $Id$
*
* Authors: Clément Stenac <zorglub@videolan.org>
*
* 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 <QStatusBar>
#include <QKeyEvent>
#include <QUrl>
+#include <QSystemTrayIcon>
#include <assert.h>
#include <vlc_keys.h>
#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 */
settings = new QSettings( "VideoLAN", "VLC" );
settings->beginGroup( "MainWindow" );
+ setWindowIcon( QApplication::windowIcon() );
+
need_components_update = false;
bgWidget = NULL; videoWidget = NULL; playlistWidget = NULL;
embeddedPlaylistWasActive = videoIsActive = false;
+
+ input_name = "";
videoEmbeddedFlag = false;
if( config_GetInt( p_intf, "embedded-video" ) ) videoEmbeddedFlag = true;
visualSelectorEnabled= settings->value( "visual-selector", false ).toBool();
/* UI */
- setWindowTitle( qtr( "VLC media player" ) );
+ setVLCWindowsTitle();
handleMainUi( settings );
QVLCMenu::createMenuBar( this, p_intf, playlistEmbeddedFlag,
advControlsEnabled, visualSelectorEnabled );
/* 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) );
+ 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(),
var_Create( p_intf, "interaction", VLC_VAR_ADDRESS );
var_AddCallback( p_intf, "interaction", InteractCallback, this );
p_intf->b_interaction = VLC_TRUE;
+
+ /* 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();
+
}
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() );
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 );
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()
+{
+ QVLCMenu::updateSystrayMenu( this, p_intf );
+ toggleVisible();
+}
+
+void MainInterface::handleSystrayClick( QSystemTrayIcon::ActivationReason reason )
+{
+ switch( reason )
+ {
+ case QSystemTrayIcon::Trigger:
+ this->toggleVisible(); break;
+ case QSystemTrayIcon::MiddleClick:
+ sysTray->showMessage( qtr( "VLC media player" ),
+ qtr( "Control menu for the player" )
+ + nameLabel->text() ,
+ 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
**********************************************************************/
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;
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;
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?? */
+ }
}
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( playlist_IsEmpty(THEPL) )
}
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 )
void MainInterface::setName( QString name )
{
+ input_name = name;
nameLabel->setText( " " + name+" " );
+
}
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")
QApplication::postEvent( THEDP, static_cast<QEvent*>(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;
+}