X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Fcomponents%2Finterface_widgets.cpp;h=6ce1adbc6ab55e759b7c529e320a488cb39536b4;hb=175d1beb96ca494f8bfdee0ad488b303ef55e9ec;hp=f6bb13349a8420fb0a39c16a39fd28b95acddcbc;hpb=dbce1bed8e286a346e4d57c2018e0ee784083cec;p=vlc diff --git a/modules/gui/qt4/components/interface_widgets.cpp b/modules/gui/qt4/components/interface_widgets.cpp index f6bb13349a..6ce1adbc6a 100644 --- a/modules/gui/qt4/components/interface_widgets.cpp +++ b/modules/gui/qt4/components/interface_widgets.cpp @@ -28,6 +28,8 @@ # include "config.h" #endif +#include + #include "dialogs_provider.hpp" #include "components/interface_widgets.hpp" #include "main_interface.hpp" @@ -35,7 +37,6 @@ #include "menus.hpp" #include "util/input_slider.hpp" #include "util/customwidgets.hpp" -#include #include #include @@ -47,7 +48,15 @@ #include #include #include -#include + +#ifdef Q_WS_X11 +# include +# include +#endif + +#include + +#define I_PLAY_TOOLTIP N_("Play\nIf the playlist is empty, open a media") /********************************************************************** * Video Widget. A simple frame on which video is drawn @@ -57,41 +66,44 @@ VideoWidget::VideoWidget( intf_thread_t *_p_i ) : QFrame( NULL ), p_intf( _p_i ) { /* Init */ - vlc_mutex_init( &lock ); - p_vout = NULL; - handleReady = false; + i_vout = 0; hide(); setMinimumSize( 16, 16 ); videoSize.rwidth() = -1; videoSize.rheight() = -1; + setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); /* Black background is more coherent for a Video Widget IMVHO */ QPalette plt = palette(); plt.setColor( QPalette::Active, QPalette::Window , Qt::black ); plt.setColor( QPalette::Inactive, QPalette::Window , Qt::black ); setPalette( plt ); - - /* The core can ask through a callback to show the video. - * NOTE: We need to block the video output core until the window handle - * is ready for use (otherwise an X11 invalid handle failure may occur). - * As a side effect, it is illegal to emit askVideoWidgetToShow from - * the same thread as the Qt4 thread that owns this. */ - QObject::connect( this, SIGNAL(askVideoWidgetToShow()), this, SLOT(show()), - Qt::BlockingQueuedConnection ); - - /* The core can ask through a callback to resize the video */ - // CONNECT( this, askResize( int, int ), this, SetSizing( int, int ) ); + setAttribute( Qt::WA_PaintOnScreen, true ); + + /* The core can ask through a callback to show the video. */ +#if HAS_QT43 + connect( this, SIGNAL(askVideoWidgetToShow( unsigned int, unsigned int)), + this, SLOT(SetSizing(unsigned int, unsigned int )), + Qt::BlockingQueuedConnection ); +#else +#error This is broken. Fix it with a QEventLoop with a processEvents () + connect( this, SIGNAL(askVideoWidgetToShow( unsigned int, unsigned int)), + this, SLOT(SetSizing(unsigned int, unsigned int )) ); +#endif } void VideoWidget::paintEvent(QPaintEvent *ev) { QFrame::paintEvent(ev); - handleReady = true; - handleWait.wakeAll(); +#ifdef Q_WS_X11 + XFlush( QX11Info::display() ); +#endif } VideoWidget::~VideoWidget() { - vlc_mutex_lock( &lock ); + vout_thread_t *p_vout = i_vout + ? (vout_thread_t *)vlc_object_get( i_vout ) : NULL; + if( p_vout ) { if( !p_intf->psz_switch_intf ) @@ -104,31 +116,24 @@ VideoWidget::~VideoWidget() if( vout_Control( p_vout, VOUT_REPARENT ) != VLC_SUCCESS ) vout_Control( p_vout, VOUT_CLOSE ); } + vlc_object_release( p_vout ); } - vlc_mutex_unlock( &lock ); - vlc_mutex_destroy( &lock ); } /** * Request the video to avoid the conflicts **/ void *VideoWidget::request( vout_thread_t *p_nvout, int *pi_x, int *pi_y, - unsigned int *pi_width, unsigned int *pi_height ) + unsigned int *pi_width, unsigned int *pi_height ) { - QMutexLocker locker( &handleLock ); msg_Dbg( p_intf, "Video was requested %i, %i", *pi_x, *pi_y ); - emit askVideoWidgetToShow(); - if( p_vout ) + emit askVideoWidgetToShow( *pi_width, *pi_height ); + if( i_vout ) { msg_Dbg( p_intf, "embedded video already in use" ); return NULL; } - p_vout = p_nvout; - while( !handleReady ) - { - msg_Dbg( p_intf, "embedded video pending (handle %p)", winId() ); - handleWait.wait( &handleLock ); - } + i_vout = p_nvout->i_object_id; msg_Dbg( p_intf, "embedded video ready (handle %p)", winId() ); return ( void* )winId(); } @@ -141,13 +146,14 @@ void VideoWidget::SetSizing( unsigned int w, unsigned int h ) msg_Dbg( p_intf, "Video is resizing to: %i %i", w, h ); videoSize.rwidth() = w; videoSize.rheight() = h; + if( isHidden() ) show(); updateGeometry(); // Needed for deinterlace } void VideoWidget::release( void *p_win ) { - msg_Dbg( p_intf, "Video is non needed anymore" ); - p_vout = NULL; + msg_Dbg( p_intf, "Video is not needed anymore" ); + i_vout = 0; videoSize.rwidth() = 0; videoSize.rheight() = 0; hide(); @@ -171,7 +177,7 @@ BackgroundWidget::BackgroundWidget( intf_thread_t *_p_i ) :QWidget( NULL ), p_intf( _p_i ) { /* We should use that one to take the more size it can */ -// setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred ); + setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding); /* A dark background */ setAutoFillBackground( true ); @@ -201,8 +207,7 @@ BackgroundWidget::BackgroundWidget( intf_thread_t *_p_i ) } BackgroundWidget::~BackgroundWidget() -{ -} +{} void BackgroundWidget::resizeEvent( QResizeEvent * event ) { @@ -233,6 +238,7 @@ void BackgroundWidget::contextMenuEvent( QContextMenuEvent *event ) QVLCMenu::PopupMenu( p_intf, true ); } +#if 0 /********************************************************************** * Visualization selector panel **********************************************************************/ @@ -246,9 +252,8 @@ VisualSelector::VisualSelector( intf_thread_t *_p_i ) : layout->addWidget( prevButton ); layout->addWidget( nextButton ); - layout->addItem( new QSpacerItem( 40,20, - QSizePolicy::Expanding, QSizePolicy::Minimum ) ); - layout->addWidget( new QLabel( qtr( "Current visualization:" ) ) ); + layout->addStretch( 10 ); + layout->addWidget( new QLabel( qtr( "Current visualization" ) ) ); current = new QLabel( qtr( "None" ) ); layout->addWidget( current ); @@ -261,8 +266,7 @@ VisualSelector::VisualSelector( intf_thread_t *_p_i ) : } VisualSelector::~VisualSelector() -{ -} +{} void VisualSelector::prev() { @@ -283,6 +287,7 @@ void VisualSelector::next() free( psz_new ); } } +#endif /********************************************************************** * TEH controls @@ -302,10 +307,12 @@ AdvControlsWidget::AdvControlsWidget( intf_thread_t *_p_i ) : advLayout->setAlignment( Qt::AlignBottom ); /* A to B Button */ - ABButton = new QPushButton( "AB" ); + ABButton = new QPushButton; setupSmallButton( ABButton ); advLayout->addWidget( ABButton ); - BUTTON_SET_ACT( ABButton, "AB", qtr( "A to B" ), fromAtoB() ); + BUTTON_SET_ACT_I( ABButton, "", atob_nob, + qtr( "Loop from point A to point B continuously.\nClick to set point A" ), + fromAtoB() ); timeA = timeB = 0; CONNECT( THEMIM->getIM(), positionUpdated( float, int, int ), this, AtoBLoop( float, int, int ) ); @@ -314,20 +321,21 @@ AdvControlsWidget::AdvControlsWidget( intf_thread_t *_p_i ) : frameButton->setMaximumSize( QSize( 26, 26 ) ); frameButton->setIconSize( QSize( 20, 20 ) ); advLayout->addWidget( frameButton ); - BUTTON_SET_ACT( frameButton, "Fr", qtr( "Frame by Frame" ), frame() ); + BUTTON_SET_ACT( frameButton, "Fr", qtr( "Frame by frame" ), frame() ); #endif - recordButton = new QPushButton( "R" ); + recordButton = new QPushButton; setupSmallButton( recordButton ); advLayout->addWidget( recordButton ); - BUTTON_SET_ACT_I( recordButton, "", record_16px.png, + BUTTON_SET_ACT_I( recordButton, "", record, qtr( "Record" ), record() ); /* Snapshot Button */ - snapshotButton = new QPushButton( "S" ); + snapshotButton = new QPushButton; setupSmallButton( snapshotButton ); advLayout->addWidget( snapshotButton ); - BUTTON_SET_ACT( snapshotButton, "S", qtr( "Take a snapshot" ), snapshot() ); + BUTTON_SET_ACT_I( snapshotButton, "", snapshot, + qtr( "Take a snapshot" ), snapshot() ); } AdvControlsWidget::~AdvControlsWidget() @@ -360,19 +368,22 @@ void AdvControlsWidget::fromAtoB() if( !timeA ) { timeA = var_GetTime( THEMIM->getInput(), "time" ); - ABButton->setText( "A->..." ); + ABButton->setToolTip( qtr( "Click to set point B" ) ); + ABButton->setIcon( QIcon( ":/atob_noa" ) ); return; } if( !timeB ) { timeB = var_GetTime( THEMIM->getInput(), "time" ); var_SetTime( THEMIM->getInput(), "time" , timeA ); - ABButton->setText( "A<=>B" ); + ABButton->setIcon( QIcon( ":/atob" ) ); + ABButton->setToolTip( qtr( "Stop the A to B loop" ) ); return; } timeA = 0; timeB = 0; - ABButton->setText( "AB" ); + ABButton->setToolTip( qtr( "Loop from point A to point B continuously\nClick to set point A" ) ); + ABButton->setIcon( QIcon( ":/atob_nob" ) ); } /* Function called regularly when in an AtoB loop */ @@ -403,19 +414,10 @@ ControlsWidget::ControlsWidget( intf_thread_t *_p_i, bool b_fsCreation) : QFrame( _p_mi ), p_intf( _p_i ) { - controlLayout = new QGridLayout( ); - - controlLayout->setSpacing( 0 ); - controlLayout->setLayoutMargins( 7, 5, 7, 3, 6 ); - - if( !b_fsCreation ) - setLayout( controlLayout ); - setSizePolicy( QSizePolicy::Preferred , QSizePolicy::Maximum ); /** The main Slider **/ slider = new InputSlider( Qt::Horizontal, NULL ); - controlLayout->addWidget( slider, 0, 1, 1, 16 ); /* Update the position when the IM has changed */ CONNECT( THEMIM->getIM(), positionUpdated( float, int, int ), slider, setPosition( float, int, int ) ); @@ -429,20 +431,17 @@ ControlsWidget::ControlsWidget( intf_thread_t *_p_i, slowerButton->setMaximumSize( QSize( 26, 20 ) ); BUTTON_SET_ACT( slowerButton, "-", qtr( "Slower" ), slower() ); - controlLayout->addWidget( slowerButton, 0, 0 ); fasterButton = new QToolButton; fasterButton->setAutoRaise( true ); fasterButton->setMaximumSize( QSize( 26, 20 ) ); BUTTON_SET_ACT( fasterButton, "+", qtr( "Faster" ), faster() ); - controlLayout->addWidget( fasterButton, 0, 17 ); /* advanced Controls handling */ b_advancedVisible = b_advControls; advControls = new AdvControlsWidget( p_intf ); - controlLayout->addWidget( advControls, 1, 3, 2, 4, Qt::AlignBottom ); if( !b_advancedVisible ) advControls->hide(); /** Disc and Menus handling */ @@ -464,11 +463,9 @@ ControlsWidget::ControlsWidget( intf_thread_t *_p_i, setupSmallButton( nextSectionButton ); discLayout->addWidget( nextSectionButton ); - controlLayout->addWidget( discFrame, 1, 10, 2, 3, Qt::AlignBottom ); - - BUTTON_SET_IMG( prevSectionButton, "", previous.png, "" ); - BUTTON_SET_IMG( nextSectionButton, "", next.png, "" ); - BUTTON_SET_IMG( menuButton, "", previous.png, "" ); + BUTTON_SET_IMG( prevSectionButton, "", dvd_prev, "" ); + BUTTON_SET_IMG( nextSectionButton, "", dvd_next, "" ); + BUTTON_SET_IMG( menuButton, "", dvd_menu, qtr( "Menu" ) ); discFrame->hide(); @@ -492,7 +489,7 @@ ControlsWidget::ControlsWidget( intf_thread_t *_p_i, telexLayout->setSpacing( 0 ); telexLayout->setMargin( 0 ); - QPushButton *telexOn = new QPushButton; + telexOn = new QPushButton; setupSmallButton( telexOn ); telexLayout->addWidget( telexOn ); @@ -510,25 +507,32 @@ ControlsWidget::ControlsWidget( intf_thread_t *_p_i, telexPage->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Minimum ); telexLayout->addWidget( telexPage ); - controlLayout->addWidget( telexFrame, 1, 10, 2, 4, Qt::AlignBottom ); telexFrame->hide(); /* default hidden */ CONNECT( telexPage, valueChanged( int ), THEMIM->getIM(), telexGotoPage( int ) ); + CONNECT( THEMIM->getIM(), setNewTelexPage( int ), + telexPage, setValue( int ) ); + + BUTTON_SET_IMG( telexOn, "", tv, qtr( "Teletext on" ) ); - BUTTON_SET_ACT_I( telexOn, "", tv.png, qtr( "Teletext on" ), - toggleTeletext() ); + CONNECT( telexOn, clicked(), THEMIM->getIM(), + telexToggleButtons() ); CONNECT( telexOn, clicked( bool ), THEMIM->getIM(), telexToggle( bool ) ); + CONNECT( THEMIM->getIM(), toggleTelexButtons(), + this, toggleTeletext() ); + b_telexEnabled = false; telexTransparent->setEnabled( false ); telexPage->setEnabled( false ); - BUTTON_SET_ACT_I( telexTransparent, "", tvtelx.png, qtr( "Teletext" ), - toggleTeletextTransparency() ); + BUTTON_SET_IMG( telexTransparent, "", tvtelx, qtr( "Teletext" ) ); CONNECT( telexTransparent, clicked( bool ), THEMIM->getIM(), telexSetTransparency() ); + CONNECT( THEMIM->getIM(), toggleTelexTransparency(), + this, toggleTeletextTransparency() ); CONNECT( THEMIM->getIM(), teletextEnabled( bool ), - telexFrame, setVisible( bool ) ); + this, enableTeletext( bool ) ); /** Play Buttons **/ QSizePolicy sizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ); @@ -542,10 +546,6 @@ ControlsWidget::ControlsWidget( intf_thread_t *_p_i, playButton->setMinimumSize( QSize( 36, 36 ) ); playButton->setIconSize( QSize( 30, 30 ) ); - controlLayout->addWidget( playButton, 2, 0, 2, 2 ); - - controlLayout->setColumnMinimumWidth( 2, 20 ); - controlLayout->setColumnStretch( 2, 0 ); /** Prev + Stop + Next Block **/ controlButLayout = new QHBoxLayout; @@ -573,55 +573,44 @@ ControlsWidget::ControlsWidget( intf_thread_t *_p_i, controlButLayout->addWidget( nextButton ); /* Add this block to the main layout */ - if( !b_fsCreation ) - controlLayout->addLayout( controlButLayout, 3, 3, 1, 3 ); - BUTTON_SET_ACT_I( playButton, "", play.png, qtr( "Play" ), play() ); - BUTTON_SET_ACT_I( prevButton, "" , previous.png, - qtr( "Previous" ), prev() ); - BUTTON_SET_ACT_I( nextButton, "", next.png, qtr( "Next" ), next() ); - BUTTON_SET_ACT_I( stopButton, "", stop.png, qtr( "Stop" ), stop() ); - - controlLayout->setColumnMinimumWidth( 7, 20 ); - controlLayout->setColumnStretch( 7, 0 ); - controlLayout->setColumnStretch( 8, 0 ); - controlLayout->setColumnStretch( 9, 0 ); + BUTTON_SET_ACT_I( playButton, "", play_b, qtr( I_PLAY_TOOLTIP ), play() ); + BUTTON_SET_ACT_I( prevButton, "" , previous_b, + qtr( "Previous media in the playlist" ), prev() ); + BUTTON_SET_ACT_I( nextButton, "", next_b, + qtr( "Next media in the playlist" ), next() ); + BUTTON_SET_ACT_I( stopButton, "", stop_b, qtr( "Stop playback" ), stop() ); /* * Other first Line buttons */ /** Fullscreen/Visualisation **/ - fullscreenButton = new QPushButton( "F" ); - BUTTON_SET_ACT( fullscreenButton, "F", qtr( "Fullscreen" ), fullscreen() ); + fullscreenButton = new QPushButton; + BUTTON_SET_ACT_I( fullscreenButton, "", fullscreen, + qtr( "Toggle the video in fullscreen" ), fullscreen() ); setupSmallButton( fullscreenButton ); - controlLayout->addWidget( fullscreenButton, 3, 10, Qt::AlignBottom ); - - /** Playlist Button **/ - playlistButton = new QPushButton; - setupSmallButton( playlistButton ); - controlLayout->addWidget( playlistButton, 3, 11, Qt::AlignBottom ); - BUTTON_SET_IMG( playlistButton, "" , playlist.png, qtr( "Show playlist" ) ); - CONNECT( playlistButton, clicked(), _p_mi, togglePlaylist() ); - - /** extended Settings **/ - extSettingsButton = new QPushButton; - BUTTON_SET_ACT( extSettingsButton, "Ex", qtr( "Extended Settings" ), - extSettings() ); - setupSmallButton( extSettingsButton ); - controlLayout->addWidget( extSettingsButton, 3, 12, Qt::AlignBottom ); - - controlLayout->setColumnStretch( 13, 0 ); - controlLayout->setColumnMinimumWidth( 13, 24 ); - controlLayout->setColumnStretch( 14, 5 ); + + if( !b_fsCreation ) + { + /** Playlist Button **/ + playlistButton = new QPushButton; + setupSmallButton( playlistButton ); + BUTTON_SET_IMG( playlistButton, "" , playlist, qtr( "Show playlist" ) ); + CONNECT( playlistButton, clicked(), _p_mi, togglePlaylist() ); + + /** extended Settings **/ + extSettingsButton = new QPushButton; + BUTTON_SET_ACT_I( extSettingsButton, "", extended, + qtr( "Show extended settings" ), extSettings() ); + setupSmallButton( extSettingsButton ); + } /* Volume */ hVolLabel = new VolumeClickHandler( p_intf, this ); volMuteLabel = new QLabel; - volMuteLabel->setPixmap( QPixmap( ":/pixmaps/volume-medium.png" ) ); - volMuteLabel->setToolTip( qtr( "Mute" ) ); + volMuteLabel->setPixmap( QPixmap( ":/volume-medium" ) ); volMuteLabel->installEventFilter( hVolLabel ); - controlLayout->addWidget( volMuteLabel, 3, 15, Qt::AlignBottom ); if( b_shiny ) { @@ -638,7 +627,6 @@ ControlsWidget::ControlsWidget( intf_thread_t *_p_i, volumeSlider->setMaximumSize( QSize( 200, 40 ) ); volumeSlider->setMinimumSize( QSize( 106, 30 ) ); volumeSlider->setFocusPolicy( Qt::NoFocus ); - controlLayout->addWidget( volumeSlider, 2, 16, 2 , 2, Qt::AlignBottom ); /* Set the volume from the config */ volumeSlider->setValue( ( config_GetInt( p_intf, "volume" ) ) * @@ -651,6 +639,43 @@ ControlsWidget::ControlsWidget( intf_thread_t *_p_i, CONNECT( volumeSlider, valueChanged( int ), this, updateVolume( int ) ); CONNECT( THEMIM, volumeChanged( void ), this, updateVolume( void ) ); + if( !b_fsCreation ) + { + controlLayout = new QGridLayout( this ); + + controlLayout->setSpacing( 0 ); + controlLayout->setLayoutMargins( 7, 5, 7, 3, 6 ); + + controlLayout->addWidget( slider, 0, 1, 1, 16 ); + controlLayout->addWidget( slowerButton, 0, 0 ); + controlLayout->addWidget( fasterButton, 0, 17 ); + + controlLayout->addWidget( advControls, 1, 3, 2, 4, Qt::AlignBottom ); + controlLayout->addWidget( discFrame, 1, 10, 2, 3, Qt::AlignBottom ); + controlLayout->addWidget( telexFrame, 1, 10, 2, 4, Qt::AlignBottom ); + + controlLayout->addWidget( playButton, 2, 0, 2, 2 ); + controlLayout->setColumnMinimumWidth( 2, 20 ); + controlLayout->setColumnStretch( 2, 0 ); + + controlLayout->addLayout( controlButLayout, 3, 3, 1, 3 ); + controlLayout->setColumnMinimumWidth( 7, 20 ); + controlLayout->setColumnStretch( 7, 0 ); + controlLayout->setColumnStretch( 8, 0 ); + controlLayout->setColumnStretch( 9, 0 ); + + controlLayout->addWidget( fullscreenButton, 3, 10, Qt::AlignBottom ); + controlLayout->addWidget( playlistButton, 3, 11, Qt::AlignBottom ); + controlLayout->addWidget( extSettingsButton, 3, 12, Qt::AlignBottom ); + + controlLayout->setColumnStretch( 13, 0 ); + controlLayout->setColumnMinimumWidth( 13, 24 ); + controlLayout->setColumnStretch( 14, 5 ); + + controlLayout->addWidget( volMuteLabel, 3, 15, Qt::AlignBottom ); + controlLayout->addWidget( volumeSlider, 2, 16, 2 , 2, Qt::AlignBottom ); + } + updateInput(); } @@ -674,17 +699,28 @@ void ControlsWidget::toggleTeletext() } } +void ControlsWidget::enableTeletext( bool b_enable ) +{ + telexFrame->setVisible( b_enable ); + bool b_on = THEMIM->teletextState(); + + telexOn->setChecked( b_on ); + telexTransparent->setEnabled( b_on ); + telexPage->setEnabled( b_on ); + b_telexEnabled = b_on; +} + void ControlsWidget::toggleTeletextTransparency() { if( b_telexTransparent ) { - telexTransparent->setIcon( QIcon( ":/pixmaps/tvtelx.png" ) ); + telexTransparent->setIcon( QIcon( ":/tvtelx" ) ); telexTransparent->setToolTip( qtr( "Teletext" ) ); b_telexTransparent = false; } else { - telexTransparent->setIcon( QIcon( ":/pixmaps/tvtelx-transparent.png" ) ); + telexTransparent->setIcon( QIcon( ":/tvtelx-transparent" ) ); telexTransparent->setToolTip( qtr( "Transparent" ) ); b_telexTransparent = true; } @@ -719,11 +755,8 @@ void ControlsWidget::next() void ControlsWidget::setNavigation( int navigation ) { -#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" ) // 1 = chapter, 2 = title, 0 = no if( navigation == 0 ) @@ -751,12 +784,18 @@ void ControlsWidget::updateVolume( int i_sliderVolume ) aout_VolumeSet( p_intf, i_res ); } if( i_sliderVolume == 0 ) - volMuteLabel->setPixmap( QPixmap(":/pixmaps/volume-muted.png" ) ); - else if( i_sliderVolume < VOLUME_MAX / 3 ) - volMuteLabel->setPixmap( QPixmap( ":/pixmaps/volume-low.png" ) ); + { + volMuteLabel->setPixmap( QPixmap(":/volume-muted" ) ); + volMuteLabel->setToolTip( qtr( "Unmute" ) ); + return; + } + + if( i_sliderVolume < VOLUME_MAX / 3 ) + volMuteLabel->setPixmap( QPixmap( ":/volume-low" ) ); else if( i_sliderVolume > (VOLUME_MAX * 2 / 3 ) ) - volMuteLabel->setPixmap( QPixmap( ":/pixmaps/volume-high.png" ) ); - else volMuteLabel->setPixmap( QPixmap( ":/pixmaps/volume-medium.png" ) ); + volMuteLabel->setPixmap( QPixmap( ":/volume-high" ) ); + else volMuteLabel->setPixmap( QPixmap( ":/volume-medium" ) ); + volMuteLabel->setToolTip( qtr( "Mute" ) ); } void ControlsWidget::updateVolume() @@ -786,13 +825,13 @@ void ControlsWidget::setStatus( int status ) { if( status == PLAYING_S ) /* Playing */ { - playButton->setIcon( QIcon( ":/pixmaps/pause.png" ) ); - playButton->setToolTip( qtr( "Pause" ) ); + playButton->setIcon( QIcon( ":/pause_b" ) ); + playButton->setToolTip( qtr( "Pause the playback" ) ); } else { - playButton->setIcon( QIcon( ":/pixmaps/play.png" ) ); - playButton->setToolTip( qtr( "Play" ) ); + playButton->setIcon( QIcon( ":/play_b" ) ); + playButton->setToolTip( qtr( I_PLAY_TOOLTIP ) ); } } @@ -832,6 +871,7 @@ void ControlsWidget::enableInput( bool enable ) { slowerButton->setEnabled( enable ); slider->setEnabled( enable ); + slider->setSliderPosition ( 0 ); fasterButton->setEnabled( enable ); /* Advanced Buttons too */ @@ -849,7 +889,7 @@ void ControlsWidget::enableVideo( bool enable ) void ControlsWidget::toggleAdvanced() { - if( !VISIBLE( advControls ) ) + if( advControls && !b_advancedVisible ) { advControls->show(); b_advancedVisible = true; @@ -869,8 +909,9 @@ void ControlsWidget::toggleAdvanced() FullscreenControllerWidget::FullscreenControllerWidget( intf_thread_t *_p_i, MainInterface *_p_mi, bool b_advControls, bool b_shiny ) : ControlsWidget( _p_i, _p_mi, b_advControls, b_shiny, true ), - i_lastPosX( -1 ), i_lastPosY( -1 ), i_hideTimeout( 1 ), - b_mouseIsOver( false ) + i_mouse_last_x( -1 ), i_mouse_last_y( -1 ), b_mouse_over(false), + b_slow_hide_begin(false), i_slow_hide_timeout(1), + b_fullscreen( false ), i_hide_timeout( 1 ) { setWindowFlags( Qt::ToolTip ); @@ -879,32 +920,28 @@ FullscreenControllerWidget::FullscreenControllerWidget( intf_thread_t *_p_i, setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum ); QGridLayout *fsLayout = new QGridLayout( this ); - controlLayout->setSpacing( 0 ); - controlLayout->setLayoutMargins( 5, 1, 5, 1, 5 ); + fsLayout->setLayoutMargins( 5, 1, 5, 1, 5 ); - fsLayout->addWidget( slowerButton, 0, 0 ); + /* First line */ slider->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Minimum); - fsLayout->addWidget( slider, 0, 1, 1, 6 ); - fsLayout->addWidget( fasterButton, 0, 7 ); - - fsLayout->addWidget( volMuteLabel, 1, 0); - fsLayout->addWidget( volumeSlider, 1, 1 ); + fsLayout->addWidget( slowerButton, 0, 0 ); + fsLayout->addWidget( slider, 0, 1, 1, 8 ); + fsLayout->addWidget( fasterButton, 0, 9 ); + fsLayout->addWidget( playButton, 1, 0, 1, 2 ); fsLayout->addLayout( controlButLayout, 1, 2 ); - fsLayout->addWidget( playButton, 1, 3 ); - - fsLayout->addWidget( discFrame, 1, 4 ); - - fsLayout->addWidget( telexFrame, 1, 5 ); - - fsLayout->addWidget( advControls, 1, 6, Qt::AlignVCenter ); + fsLayout->addWidget( discFrame, 1, 3 ); + fsLayout->addWidget( telexFrame, 1, 4 ); + fsLayout->addWidget( advControls, 1, 5, Qt::AlignVCenter ); + fsLayout->addWidget( fullscreenButton, 1, 6 ); - fsLayout->addWidget( fullscreenButton, 1, 7 ); + fsLayout->addWidget( volMuteLabel, 1, 7 ); + fsLayout->addWidget( volumeSlider, 1, 8, 1, 2 ); /* hiding timer */ p_hideTimer = new QTimer( this ); - CONNECT( p_hideTimer, timeout(), this, hideFSControllerWidget() ); + CONNECT( p_hideTimer, timeout(), this, hideFSC() ); p_hideTimer->setSingleShot( true ); /* slow hiding timer */ @@ -921,15 +958,44 @@ FullscreenControllerWidget::FullscreenControllerWidget( intf_thread_t *_p_i, move( p_desktop->width() / 2 - width() / 2, p_desktop->height() - height() ); - #ifdef WIN32TRICK +#ifdef WIN32TRICK setWindowOpacity( 0.0 ); fscHidden = true; + adjustSize(); show(); - #endif +#endif + + vlc_mutex_init_recursive( &lock ); } FullscreenControllerWidget::~FullscreenControllerWidget() { + vlc_mutex_destroy( &lock ); +} + +/** + * Show fullscreen controller + */ +void FullscreenControllerWidget::showFSC() +{ + adjustSize(); +#ifdef WIN32TRICK + // after quiting and going to fs, we need to call show() + if( isHidden() ) + show(); + + if( fscHidden ) + { + fscHidden = false; + setWindowOpacity( 1.0 ); + } +#else + show(); +#endif + +#if HAVE_TRANSPARENCY + setWindowOpacity( DEFAULT_OPACITY ); +#endif } /** @@ -937,14 +1003,32 @@ FullscreenControllerWidget::~FullscreenControllerWidget() * FIXME: under windows it have to be done by moving out of screen * because hide() doesnt work */ -void FullscreenControllerWidget::hideFSControllerWidget() +void FullscreenControllerWidget::hideFSC() { - #ifdef WIN32TRICK +#ifdef WIN32TRICK fscHidden = true; setWindowOpacity( 0.0 ); // simulate hidding - #else +#else hide(); - #endif +#endif +} + +/** + * Plane to hide fullscreen controller + */ +void FullscreenControllerWidget::planHideFSC() +{ + vlc_mutex_lock( &lock ); + int i_timeout = i_hide_timeout; + vlc_mutex_unlock( &lock ); + + p_hideTimer->start( i_timeout ); + +#if HAVE_TRANSPARENCY + b_slow_hide_begin = true; + i_slow_hide_timeout = i_timeout; + p_slowHideTimer->start( i_slow_hide_timeout / 2 ); +#endif } /** @@ -955,86 +1039,59 @@ void FullscreenControllerWidget::hideFSControllerWidget() void FullscreenControllerWidget::slowHideFSC() { #if HAVE_TRANSPARENCY - static bool first_call = true; - - if ( first_call ) + if( b_slow_hide_begin ) { - first_call = false; + b_slow_hide_begin = false; p_slowHideTimer->stop(); /* the last part of time divided to 100 pieces */ - p_slowHideTimer->start( - (int) ( i_hideTimeout / 2 / ( windowOpacity() * 100 ) ) ); + p_slowHideTimer->start( (int)( i_slow_hide_timeout / 2 / ( windowOpacity() * 100 ) ) ); + } else { +#ifdef WIN32TRICK + if ( windowOpacity() > 0.0 && !fscHidden ) +#else if ( windowOpacity() > 0.0 ) +#endif { /* we should use 0.01 because of 100 pieces ^^^ but than it cannt be done in time */ setWindowOpacity( windowOpacity() - 0.02 ); } - if ( windowOpacity() == 0.0 ) - { - first_call = true; + if ( windowOpacity() <= 0.0 ) p_slowHideTimer->stop(); - } } #endif } -/** - * Get state of visibility of FS controller on screen - * On windows control if it is on hidden position - */ -bool FullscreenControllerWidget::isFSCHidden() -{ - #ifdef WIN32TRICK - return fscHidden; - #endif - - return isHidden(); -} - /** * event handling * events: show, hide, start timer for hidding */ void FullscreenControllerWidget::customEvent( QEvent *event ) { - int type = event->type(); + bool b_fs; - if ( type == FullscreenControlShow_Type ) + switch( event->type() ) { - #ifdef WIN32TRICK - // after quiting and going to fs, we need to call show() - if ( isHidden() ) - show(); - - if ( fscHidden ) - { - fscHidden = false; - setWindowOpacity( 1.0 ); - } - #else - show(); - #endif - -#if HAVE_TRANSPARENCY - setWindowOpacity( DEFAULT_OPACITY ); -#endif - } - else if ( type == FullscreenControlHide_Type ) - { - hideFSControllerWidget(); - } - else if ( type == FullscreenControlPlanHide_Type && !b_mouseIsOver ) - { - p_hideTimer->start( i_hideTimeout ); -#if HAVE_TRANSPARENCY - p_slowHideTimer->start( i_hideTimeout / 2 ); -#endif + case FullscreenControlShow_Type: + vlc_mutex_lock( &lock ); + b_fs = b_fullscreen; + vlc_mutex_unlock( &lock ); + + if( b_fs ) // FIXME I am not sure about that one + showFSC(); + break; + case FullscreenControlHide_Type: + hideFSC(); + break; + case FullscreenControlPlanHide_Type: + if( !b_mouse_over ) // Only if the mouse is not over FSC + planHideFSC(); + break; } } @@ -1046,13 +1103,13 @@ void FullscreenControllerWidget::mouseMoveEvent( QMouseEvent *event ) { if ( event->buttons() == Qt::LeftButton ) { - int i_moveX = event->globalX() - i_lastPosX; - int i_moveY = event->globalY() - i_lastPosY; + int i_moveX = event->globalX() - i_mouse_last_x; + int i_moveY = event->globalY() - i_mouse_last_y; move( x() + i_moveX, y() + i_moveY ); - i_lastPosX = event->globalX(); - i_lastPosY = event->globalY(); + i_mouse_last_x = event->globalX(); + i_mouse_last_y = event->globalY(); } } @@ -1062,8 +1119,8 @@ void FullscreenControllerWidget::mouseMoveEvent( QMouseEvent *event ) */ void FullscreenControllerWidget::mousePressEvent( QMouseEvent *event ) { - i_lastPosX = event->globalX(); - i_lastPosY = event->globalY(); + i_mouse_last_x = event->globalX(); + i_mouse_last_y = event->globalY(); } /** @@ -1071,11 +1128,12 @@ void FullscreenControllerWidget::mousePressEvent( QMouseEvent *event ) */ void FullscreenControllerWidget::enterEvent( QEvent *event ) { + b_mouse_over = true; + p_hideTimer->stop(); #if HAVE_TRANSPARENCY p_slowHideTimer->stop(); #endif - b_mouseIsOver = true; } /** @@ -1083,11 +1141,9 @@ void FullscreenControllerWidget::enterEvent( QEvent *event ) */ void FullscreenControllerWidget::leaveEvent( QEvent *event ) { - p_hideTimer->start( i_hideTimeout ); -#if HAVE_TRANSPARENCY - p_slowHideTimer->start( i_hideTimeout / 2 ); -#endif - b_mouseIsOver = false; + planHideFSC(); + + b_mouse_over = false; } /** @@ -1107,78 +1163,85 @@ void FullscreenControllerWidget::keyPressEvent( QKeyEvent *event ) event->ignore(); } -/** - * It is called when video start - */ -void FullscreenControllerWidget::regFullscreenCallback( vout_thread_t *p_vout ) +/* */ +static int FullscreenControllerWidgetFullscreenChanged( vlc_object_t *vlc_object, const char *variable, + vlc_value_t old_val, vlc_value_t new_val, + void *data ) { - if ( p_vout ) - { - var_AddCallback( p_vout, "fullscreen", regMouseMoveCallback, this ); - } + vout_thread_t *p_vout = (vout_thread_t *) vlc_object; + FullscreenControllerWidget *p_fs = (FullscreenControllerWidget *)data; + + p_fs->fullscreenChanged( p_vout, new_val.b_bool, var_GetInteger( p_vout, "mouse-hide-timeout" ) ); + + return VLC_SUCCESS; } +/* */ +static int FullscreenControllerWidgetMouseMoved( vlc_object_t *vlc_object, const char *variable, + vlc_value_t old_val, vlc_value_t new_val, + void *data ) +{ + FullscreenControllerWidget *p_fs = (FullscreenControllerWidget *)data; + + /* Show event */ + IMEvent *eShow = new IMEvent( FullscreenControlShow_Type, 0 ); + QApplication::postEvent( p_fs, static_cast(eShow) ); + + /* Plan hide event */ + IMEvent *eHide = new IMEvent( FullscreenControlPlanHide_Type, 0 ); + QApplication::postEvent( p_fs, static_cast(eHide) ); + + return VLC_SUCCESS; +} + /** - * It is called after turn off video, because p_vout is NULL now - * we cannt delete callback, just hide if FScontroller is visible + * It is called when video start */ -void FullscreenControllerWidget::unregFullscreenCallback() +void FullscreenControllerWidget::attachVout( vout_thread_t *p_vout ) { - if ( isVisible() ) - hide(); -} + assert( p_vout ); + vlc_mutex_lock( &lock ); + var_AddCallback( p_vout, "fullscreen", FullscreenControllerWidgetFullscreenChanged, this ); /* I miss a add and fire */ + fullscreenChanged( p_vout, var_GetBool( p_vout, "fullscreen" ), var_GetInteger( p_vout, "mouse-hide-timeout" ) ); + vlc_mutex_unlock( &lock ); +} /** - * Register and unregister callback for mouse moving + * It is called after turn off video. */ -static int regMouseMoveCallback( vlc_object_t *vlc_object, const char *variable, - vlc_value_t old_val, vlc_value_t new_val, - void *data ) +void FullscreenControllerWidget::detachVout( vout_thread_t *p_vout ) { - vout_thread_t *p_vout = (vout_thread_t *) vlc_object; - - static bool b_registered = false; - FullscreenControllerWidget *p_fs = (FullscreenControllerWidget *) data; + assert( p_vout ); - if ( var_GetBool( p_vout, "fullscreen" ) && !b_registered ) - { - p_fs->SetHideTimeout( var_GetInteger( p_vout, "mouse-hide-timeout" ) ); - var_AddCallback( p_vout, "mouse-moved", - showFullscreenControllCallback, (void *) p_fs ); - b_registered = true; - } - - if ( !var_GetBool( p_vout, "fullscreen" ) && b_registered ) - { - var_DelCallback( p_vout, "mouse-moved", - showFullscreenControllCallback, (void *) p_fs ); - b_registered = false; - p_fs->hide(); - } - - return VLC_SUCCESS; + var_DelCallback( p_vout, "fullscreen", FullscreenControllerWidgetFullscreenChanged, this ); + vlc_mutex_lock( &lock ); + fullscreenChanged( p_vout, false, 0 ); + vlc_mutex_unlock( &lock ); } /** - * Show fullscreen controller after mouse move - * after show immediately plan hide event + * Register and unregister callback for mouse moving */ -static int showFullscreenControllCallback( vlc_object_t *vlc_object, const char *variable, - vlc_value_t old_val, vlc_value_t new_val, - void *data ) +void FullscreenControllerWidget::fullscreenChanged( vout_thread_t *p_vout, bool b_fs, int i_timeout ) { - FullscreenControllerWidget *p_fs = (FullscreenControllerWidget *) data; - - if ( p_fs->isFSCHidden() || p_fs->windowOpacity() < DEFAULT_OPACITY ) + vlc_mutex_lock( &lock ); + if( b_fs && !b_fullscreen ) { - IMEvent *event = new IMEvent( FullscreenControlShow_Type, 0 ); - QApplication::postEvent( p_fs, static_cast(event) ); + b_fullscreen = true; + i_hide_timeout = i_timeout; + var_AddCallback( p_vout, "mouse-moved", FullscreenControllerWidgetMouseMoved, this ); } + else if( !b_fs && b_fullscreen ) + { + b_fullscreen = false; + i_hide_timeout = i_timeout; + var_DelCallback( p_vout, "mouse-moved", FullscreenControllerWidgetMouseMoved, this ); - IMEvent *e = new IMEvent( FullscreenControlPlanHide_Type, 0 ); - QApplication::postEvent( p_fs, static_cast(e) ); - - return VLC_SUCCESS; + /* Force fs hidding */ + IMEvent *eHide = new IMEvent( FullscreenControlHide_Type, 0 ); + QApplication::postEvent( this, static_cast(eHide) ); + } + vlc_mutex_unlock( &lock ); } /********************************************************************** @@ -1197,22 +1260,24 @@ SpeedControlWidget::SpeedControlWidget( intf_thread_t *_p_i ) : speedSlider->setOrientation( Qt::Vertical ); speedSlider->setTickPosition( QSlider::TicksRight ); - speedSlider->setRange( -100, 100 ); - speedSlider->setSingleStep( 10 ); - speedSlider->setPageStep( 20 ); - speedSlider->setTickInterval( 20 ); + speedSlider->setRange( -24, 24 ); + speedSlider->setSingleStep( 1 ); + speedSlider->setPageStep( 1 ); + speedSlider->setTickInterval( 12 ); CONNECT( speedSlider, valueChanged( int ), this, updateRate( int ) ); QToolButton *normalSpeedButton = new QToolButton( this ); normalSpeedButton->setMaximumSize( QSize( 26, 20 ) ); normalSpeedButton->setAutoRaise( true ); - normalSpeedButton->setText( "N" ); + normalSpeedButton->setText( "1x" ); normalSpeedButton->setToolTip( qtr( "Revert to normal play speed" ) ); CONNECT( normalSpeedButton, clicked(), this, resetRate() ); QVBoxLayout *speedControlLayout = new QVBoxLayout; + speedControlLayout->setLayoutMargins( 4, 4, 4, 4, 4 ); + speedControlLayout->setSpacing( 4 ); speedControlLayout->addWidget( speedSlider ); speedControlLayout->addWidget( normalSpeedButton ); setLayout( speedControlLayout ); @@ -1226,10 +1291,6 @@ void SpeedControlWidget::setEnable( bool b_enable ) speedSlider->setEnabled( b_enable ); } -#define RATE_SLIDER_MAXIMUM 3.0 -#define RATE_SLIDER_MINIMUM 0.3 -#define RATE_SLIDER_LENGTH 100.0 - void SpeedControlWidget::updateControls( int rate ) { if( speedSlider->isSliderDown() ) @@ -1238,32 +1299,16 @@ void SpeedControlWidget::updateControls( int rate ) return; } - int sliderValue; - double speed = INPUT_RATE_DEFAULT / (double)rate; + double value = 12 * log( (double)INPUT_RATE_DEFAULT / rate ) / log( 2 ); + int sliderValue = (int) ( ( value > 0 ) ? value + .5 : value - .5 ); - if( rate >= INPUT_RATE_DEFAULT ) + if( sliderValue < speedSlider->minimum() ) { - if( speed < RATE_SLIDER_MINIMUM ) - { - sliderValue = speedSlider->minimum(); - } - else - { - sliderValue = (int)( ( speed - 1.0 ) * RATE_SLIDER_LENGTH - / ( 1.0 - RATE_SLIDER_MAXIMUM ) ); - } + sliderValue = speedSlider->minimum(); } - else + else if( sliderValue > speedSlider->maximum() ) { - if( speed > RATE_SLIDER_MAXIMUM ) - { - sliderValue = speedSlider->maximum(); - } - else - { - sliderValue = (int)( ( speed - 1.0 ) * RATE_SLIDER_LENGTH - / ( RATE_SLIDER_MAXIMUM - 1.0 ) ); - } + sliderValue = speedSlider->maximum(); } //Block signals to avoid feedback loop @@ -1274,18 +1319,8 @@ void SpeedControlWidget::updateControls( int rate ) void SpeedControlWidget::updateRate( int sliderValue ) { - int rate; - - if( sliderValue < 0.0 ) - { - rate = (int)(INPUT_RATE_DEFAULT* RATE_SLIDER_LENGTH / - ( sliderValue * ( 1.0 - RATE_SLIDER_MINIMUM ) + RATE_SLIDER_LENGTH )); - } - else - { - rate = (int)(INPUT_RATE_DEFAULT* RATE_SLIDER_LENGTH / - ( sliderValue * ( RATE_SLIDER_MAXIMUM - 1.0 ) + RATE_SLIDER_LENGTH )); - } + double speed = pow( 2, (double)sliderValue / 12 ); + int rate = INPUT_RATE_DEFAULT / speed; THEMIM->getIM()->setRate(rate); }