#include <math.h>
+#define I_PLAY_TOOLTIP N_("Play\nIf the playlist is empty, open a media")
+
/**********************************************************************
* Video Widget. A simple frame on which video is drawn
* This class handles resize issues
{
/* Init */
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 */
+ hide();
+
+ /* Set the policy to expand in both directions */
+// setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
+
+ /* Black background is more coherent for a Video Widget */
QPalette plt = palette();
- plt.setColor( QPalette::Active, QPalette::Window , Qt::black );
- plt.setColor( QPalette::Inactive, QPalette::Window , Qt::black );
+ plt.setColor( QPalette::Window, Qt::black );
setPalette( plt );
+ setAutoFillBackground(true);
+
+ /* Indicates that the widget wants to draw directly onto the screen.
+ Widgets with this attribute set do not participate in composition
+ management */
setAttribute( Qt::WA_PaintOnScreen, true );
/* The core can ask through a callback to show the video. */
this, SLOT(SetSizing(unsigned int, unsigned int )),
Qt::BlockingQueuedConnection );
#else
-#error This is broken. Fix it with a QEventLoop with a processEvents ()
+#warning 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
#endif
}
+/* Kill the vout at Destruction */
VideoWidget::~VideoWidget()
{
- vout_thread_t *p_vout = i_vout
- ? (vout_thread_t *)vlc_object_get( i_vout ) : NULL;
+ vout_thread_t *p_vout = i_vout ?
+ (vout_thread_t *)vlc_object_get( p_intf->p_libvlc, i_vout ) : NULL;
if( p_vout )
{
- if( !p_intf->psz_switch_intf )
- {
- if( vout_Control( p_vout, VOUT_CLOSE ) != VLC_SUCCESS )
- vout_Control( p_vout, VOUT_REPARENT );
- }
- else
- {
- if( vout_Control( p_vout, VOUT_REPARENT ) != VLC_SUCCESS )
- vout_Control( p_vout, VOUT_CLOSE );
- }
+ if( vout_Control( p_vout, VOUT_CLOSE ) != VLC_SUCCESS )
+ vout_Control( p_vout, VOUT_REPARENT );
vlc_object_release( p_vout );
}
}
return NULL;
}
i_vout = p_nvout->i_object_id;
+#ifndef NDEBUG
msg_Dbg( p_intf, "embedded video ready (handle %p)", winId() );
+#endif
return ( void* )winId();
}
i_vout = 0;
videoSize.rwidth() = 0;
videoSize.rheight() = 0;
+ updateGeometry();
hide();
- updateGeometry(); // Needed for deinterlace
}
QSize VideoWidget::sizeHint() const
**********************************************************************/
#define ICON_SIZE 128
#define MAX_BG_SIZE 400
-#define MIN_BG_SIZE 64
+#define MIN_BG_SIZE 128
BackgroundWidget::BackgroundWidget( intf_thread_t *_p_i )
:QWidget( NULL ), p_intf( _p_i )
/* A dark background */
setAutoFillBackground( true );
- plt = palette();
+ plt = palette();
plt.setColor( QPalette::Active, QPalette::Window , Qt::black );
plt.setColor( QPalette::Inactive, QPalette::Window , Qt::black );
setPalette( plt );
backgroundLayout->setColumnStretch( 0, 1 );
backgroundLayout->setColumnStretch( 2, 1 );
- CONNECT( THEMIM->getIM(), artChanged( QString ), this, updateArt( QString ) );
+ CONNECT( THEMIM->getIM(), artChanged( input_item_t* ),
+ this, updateArt( input_item_t* ) );
}
BackgroundWidget::~BackgroundWidget()
label->show();
}
-void BackgroundWidget::updateArt( QString url )
+void BackgroundWidget::updateArt( input_item_t *p_item )
{
+ QString url;
+ if( p_item )
+ {
+ char *psz_art = input_item_GetArtURL( p_item );
+ url = psz_art;
+ free( psz_art );
+ }
+
if( url.isEmpty() )
{
if( QDate::currentDate().dayOfYear() >= 354 )
label->setPixmap( QPixmap( ":/vlc128-christmas.png" ) );
else
label->setPixmap( QPixmap( ":/vlc128.png" ) );
- return;
}
else
{
+ url = url.replace( "file://", QString("" ) );
+ /* Taglib seems to define a attachment://, It won't work yet */
+ url = url.replace( "attachment://", QString("" ) );
label->setPixmap( QPixmap( url ) );
}
}
QVLCMenu::PopupMenu( p_intf, true );
}
+#if 0
/**********************************************************************
* Visualization selector panel
**********************************************************************/
free( psz_new );
}
}
+#endif
/**********************************************************************
* TEH controls
aButton->setMinimumSize( QSize( 26, 26 ) ); \
aButton->setIconSize( QSize( 20, 20 ) ); }
-AdvControlsWidget::AdvControlsWidget( intf_thread_t *_p_i ) :
+/* init static variables in advanced controls */
+mtime_t AdvControlsWidget::timeA = 0;
+mtime_t AdvControlsWidget::timeB = 0;
+
+AdvControlsWidget::AdvControlsWidget( intf_thread_t *_p_i, bool b_fsCreation = false ) :
QFrame( NULL ), p_intf( _p_i )
{
QHBoxLayout *advLayout = new QHBoxLayout( this );
advLayout->setAlignment( Qt::AlignBottom );
/* A to B Button */
- ABButton = new QPushButton( "AB" );
+ ABButton = new QPushButton;
setupSmallButton( ABButton );
advLayout->addWidget( ABButton );
BUTTON_SET_ACT_I( ABButton, "", atob_nob,
- qtr( "Loop from point A to point B continuously\nClick to set point A" ), fromAtoB() );
+ 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 ) );
+ i_last_input_id = 0;
+ /* in FS controller we skip this, because we dont want to have it double
+ controlled */
+ if( !b_fsCreation )
+ CONNECT( THEMIM->getIM(), positionUpdated( float, int, int ),
+ this, AtoBLoop( float, int, int ) );
+ /* set up synchronization between main controller and fs controller */
+ CONNECT( THEMIM->getIM(), advControlsSetIcon(), this, setIcon() );
+ connect( this, SIGNAL( timeChanged() ),
+ THEMIM->getIM(), SIGNAL( advControlsSetIcon()));
#if 0
frameButton = new QPushButton( "Fr" );
frameButton->setMaximumSize( QSize( 26, 26 ) );
BUTTON_SET_ACT( frameButton, "Fr", qtr( "Frame by frame" ), frame() );
#endif
- recordButton = new QPushButton( "R" );
+ /* Record Button */
+#if 0
+ recordButton = new QPushButton;
setupSmallButton( recordButton );
advLayout->addWidget( recordButton );
BUTTON_SET_ACT_I( recordButton, "", record,
qtr( "Record" ), record() );
+#endif
/* Snapshot Button */
- snapshotButton = new QPushButton( "S" );
+ snapshotButton = new QPushButton;
setupSmallButton( snapshotButton );
advLayout->addWidget( snapshotButton );
BUTTON_SET_ACT_I( snapshotButton, "", snapshot,
void AdvControlsWidget::enableInput( bool enable )
{
+ int i_input_id = 0;
+ if( THEMIM->getInput() != NULL )
+ {
+ input_item_t *p_item = input_GetItem( THEMIM->getInput() );
+ i_input_id = p_item->i_id;
+#if 0
+ recordButton->setVisible( var_GetBool( THEMIM->getInput(), "can-record" ) );
+ }
+ else
+ {
+ recordButton->setVisible( false );
+#endif
+ }
+
ABButton->setEnabled( enable );
+#if 0
recordButton->setEnabled( enable );
+#endif
+
+ if( enable && ( i_last_input_id != i_input_id ) )
+ {
+ timeA = timeB = 0;
+ i_last_input_id = i_input_id;
+ emit timeChanged();
+ }
}
void AdvControlsWidget::enableVideo( bool enable )
{
vout_thread_t *p_vout =
(vout_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_VOUT, FIND_ANYWHERE );
- if( p_vout ) vout_Control( p_vout, VOUT_SNAPSHOT );
+ if( p_vout )
+ {
+ vout_Control( p_vout, VOUT_SNAPSHOT );
+ vlc_object_release( p_vout );
+ }
}
/* Function called when the button is clicked() */
if( !timeA )
{
timeA = var_GetTime( THEMIM->getInput(), "time" );
- ABButton->setToolTip( "Click to set point B" );
- ABButton->setIcon( QIcon( ":/atob_noa" ) );
+ emit timeChanged();
return;
}
if( !timeB )
{
timeB = var_GetTime( THEMIM->getInput(), "time" );
var_SetTime( THEMIM->getInput(), "time" , timeA );
- ABButton->setIcon( QIcon( ":/atob" ) );
- ABButton->setToolTip( "Stop the A to B loop" );
+ emit timeChanged();
return;
}
timeA = 0;
timeB = 0;
- ABButton->setToolTip( qtr( "Loop from point A to point B continuously\nClick to set point A" ) );
- ABButton->setIcon( QIcon( ":/atob_nob" ) );
+ emit timeChanged();
+}
+
+/* setting/synchro icons after click on main or fs controller */
+void AdvControlsWidget::setIcon()
+{
+ if( !timeA && !timeB)
+ {
+ ABButton->setIcon( QIcon( ":/atob_nob" ) );
+ ABButton->setToolTip( qtr( "Loop from point A to point B continuously\nClick to set point A" ) );
+ }
+ else if( timeA && !timeB )
+ {
+ ABButton->setIcon( QIcon( ":/atob_noa" ) );
+ ABButton->setToolTip( qtr( "Click to set point B" ) );
+ }
+ else if( timeA && timeB )
+ {
+ ABButton->setIcon( QIcon( ":/atob" ) );
+ ABButton->setToolTip( qtr( "Stop the A to B loop" ) );
+ }
}
/* Function called regularly when in an AtoB loop */
{
if( timeB )
{
- if( i_time >= (int)(timeB/1000000) )
+ if( ( i_time >= (int)( timeB/1000000 ) )
+ || ( i_time < (int)( timeA/1000000 ) ) )
var_SetTime( THEMIM->getInput(), "time" , timeA );
}
}
-/* FIXME Record function */
-void AdvControlsWidget::record(){}
+// TODO: On-the-fly record needs to be reimplemented
+void AdvControlsWidget::record()
+{
+ input_thread_t *p_input = THEMIM->getInput();
+ if( p_input )
+ {
+ /* This method won't work fine if the stream can't be cut anywhere */
+ const bool b_recording = var_GetBool( p_input, "record" );
+ var_SetBool( p_input, "record", !b_recording );
+#if 0
+ else
+ {
+ /* 'record' access-filter is not loaded, we open Save dialog */
+ input_item_t *p_item = input_GetItem( p_input );
+ if( !p_item )
+ return;
+
+ char *psz = input_item_GetURI( p_item );
+ if( psz )
+ THEDP->streamingDialog( NULL, psz, true );
+ }
+#endif
+ }
+}
#if 0
//FIXME Frame by frame function
/* advanced Controls handling */
b_advancedVisible = b_advControls;
- advControls = new AdvControlsWidget( p_intf );
+ advControls = new AdvControlsWidget( p_intf, b_fsCreation );
if( !b_advancedVisible ) advControls->hide();
/** Disc and Menus handling */
/* Add this block to the main layout */
- BUTTON_SET_ACT_I( playButton, "", play_b, qtr( "Play" ), play() );
+ BUTTON_SET_ACT_I( playButton, "", play_b, qtr( I_PLAY_TOOLTIP ), play() );
BUTTON_SET_ACT_I( prevButton, "" , previous_b,
- qtr( "Previous" ), prev() );
- BUTTON_SET_ACT_I( nextButton, "", next_b, qtr( "Next" ), next() );
- BUTTON_SET_ACT_I( stopButton, "", stop_b, qtr( "Stop" ), stop() );
+ 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
*/
+ /* */
+ CONNECT( THEMIM->getIM(), voutChanged(bool), this, enableVideo(bool) );
+
/** Fullscreen/Visualisation **/
fullscreenButton = new QPushButton;
- BUTTON_SET_ACT_I( fullscreenButton, "", fullscreen, qtr( "Fullscreen" ),
- fullscreen() );
+ BUTTON_SET_ACT_I( fullscreenButton, "", fullscreen,
+ qtr( "Toggle the video in fullscreen" ), fullscreen() );
setupSmallButton( fullscreenButton );
if( !b_fsCreation )
/** extended Settings **/
extSettingsButton = new QPushButton;
BUTTON_SET_ACT_I( extSettingsButton, "", extended,
- qtr( "Extended settings" ), extSettings() );
+ qtr( "Show extended settings" ), extSettings() );
setupSmallButton( extSettingsButton );
}
volMuteLabel = new QLabel;
volMuteLabel->setPixmap( QPixmap( ":/volume-medium" ) );
- volMuteLabel->setToolTip( qtr( "Mute" ) );
volMuteLabel->installEventFilter( hVolLabel );
if( b_shiny )
volumeSlider->setOrientation( Qt::Horizontal );
}
volumeSlider->setMaximumSize( QSize( 200, 40 ) );
- volumeSlider->setMinimumSize( QSize( 106, 30 ) );
+ volumeSlider->setMinimumSize( QSize( 85, 30 ) );
volumeSlider->setFocusPolicy( Qt::NoFocus );
/* Set the volume from the config */
controlLayout->setSpacing( 0 );
controlLayout->setLayoutMargins( 7, 5, 7, 3, 6 );
- controlLayout->addWidget( slider, 0, 1, 1, 16 );
+ controlLayout->addWidget( slider, 0, 1, 1, 18 );
controlLayout->addWidget( slowerButton, 0, 0 );
- controlLayout->addWidget( fasterButton, 0, 17 );
+ controlLayout->addWidget( fasterButton, 0, 19 );
- 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( discFrame, 1, 8, 2, 3, Qt::AlignBottom );
+ controlLayout->addWidget( telexFrame, 1, 8, 2, 5, Qt::AlignBottom );
- controlLayout->addWidget( playButton, 2, 0, 2, 2 );
- controlLayout->setColumnMinimumWidth( 2, 20 );
+ controlLayout->addWidget( playButton, 2, 0, 2, 2, Qt::AlignBottom );
+ controlLayout->setColumnMinimumWidth( 2, 10 );
controlLayout->setColumnStretch( 2, 0 );
- controlLayout->addLayout( controlButLayout, 3, 3, 1, 3 );
- controlLayout->setColumnMinimumWidth( 7, 20 );
+ controlLayout->addLayout( controlButLayout, 3, 3, 1, 3, Qt::AlignBottom );
+ /* Column 6 is unused */
+ controlLayout->setColumnStretch( 6, 0 );
controlLayout->setColumnStretch( 7, 0 );
- controlLayout->setColumnStretch( 8, 0 );
- controlLayout->setColumnStretch( 9, 0 );
+ controlLayout->setColumnMinimumWidth( 7, 10 );
+
+ controlLayout->addWidget( fullscreenButton, 3, 8, Qt::AlignBottom );
+ controlLayout->addWidget( playlistButton, 3, 9, Qt::AlignBottom );
+ controlLayout->addWidget( extSettingsButton, 3, 10, Qt::AlignBottom );
+ controlLayout->setColumnStretch( 11, 0 ); /* telex alignment */
- controlLayout->addWidget( fullscreenButton, 3, 10, Qt::AlignBottom );
- controlLayout->addWidget( playlistButton, 3, 11, Qt::AlignBottom );
- controlLayout->addWidget( extSettingsButton, 3, 12, Qt::AlignBottom );
+ controlLayout->setColumnStretch( 12, 0 );
+ controlLayout->setColumnMinimumWidth( 12, 10 );
- controlLayout->setColumnStretch( 13, 0 );
- controlLayout->setColumnMinimumWidth( 13, 24 );
- controlLayout->setColumnStretch( 14, 5 );
+ controlLayout->addWidget( advControls, 3, 13, 1, 3, Qt::AlignBottom );
- controlLayout->addWidget( volMuteLabel, 3, 15, Qt::AlignBottom );
- controlLayout->addWidget( volumeSlider, 2, 16, 2 , 2, Qt::AlignBottom );
+ controlLayout->setColumnStretch( 16, 10 );
+ controlLayout->setColumnMinimumWidth( 16, 10 );
+
+ controlLayout->addWidget( volMuteLabel, 3, 17, Qt::AlignBottom );
+ controlLayout->addWidget( volumeSlider, 3, 18, 1 , 2, Qt::AlignBottom );
}
updateInput();
}
else
{
- telexTransparent->setIcon( QIcon( ":/tvtelx-transparent" ) );
+ telexTransparent->setIcon( QIcon( ":/tvtelx-trans" ) );
telexTransparent->setToolTip( qtr( "Transparent" ) );
b_telexTransparent = true;
}
{
discFrame->hide();
} else if( navigation == 1 ) {
- prevSectionButton->setToolTip( qfu( HELP_PCH ) );
- nextSectionButton->setToolTip( qfu( HELP_NCH ) );
+ prevSectionButton->setToolTip( qtr( HELP_PCH ) );
+ nextSectionButton->setToolTip( qtr( HELP_NCH ) );
menuButton->show();
discFrame->show();
} else {
- prevSectionButton->setToolTip( qfu( HELP_PCH ) );
- nextSectionButton->setToolTip( qfu( HELP_NCH ) );
+ prevSectionButton->setToolTip( qtr( HELP_PCH ) );
+ nextSectionButton->setToolTip( qtr( HELP_NCH ) );
menuButton->hide();
discFrame->show();
}
aout_VolumeSet( p_intf, i_res );
}
if( i_sliderVolume == 0 )
+ {
volMuteLabel->setPixmap( QPixmap(":/volume-muted" ) );
- else if( i_sliderVolume < VOLUME_MAX / 3 )
+ 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( ":/volume-high" ) );
else volMuteLabel->setPixmap( QPixmap( ":/volume-medium" ) );
+ volMuteLabel->setToolTip( qtr( "Mute" ) );
}
void ControlsWidget::updateVolume()
{
/* Activate the interface buttons according to the presence of the input */
enableInput( THEMIM->getIM()->hasInput() );
- enableVideo( THEMIM->getIM()->hasVideo() && THEMIM->getIM()->hasInput() );
+ enableVideo( THEMIM->getIM()->hasVideo() );
}
void ControlsWidget::setStatus( int status )
if( status == PLAYING_S ) /* Playing */
{
playButton->setIcon( QIcon( ":/pause_b" ) );
- playButton->setToolTip( qtr( "Pause" ) );
+ playButton->setToolTip( qtr( "Pause the playback" ) );
}
else
{
playButton->setIcon( QIcon( ":/play_b" ) );
- playButton->setToolTip( qtr( "Play" ) );
+ playButton->setToolTip( qtr( I_PLAY_TOOLTIP ) );
}
}
{
slowerButton->setEnabled( enable );
slider->setEnabled( enable );
+ slider->setSliderPosition ( 0 );
fasterButton->setEnabled( enable );
/* Advanced Buttons too */
void ControlsWidget::toggleAdvanced()
{
- if( !VISIBLE( advControls ) )
+ if( advControls && !b_advancedVisible )
{
advControls->show();
b_advancedVisible = true;
emit advancedControlsToggled( b_advancedVisible );
}
-
/**********************************************************************
* Fullscrenn control widget
**********************************************************************/
: ControlsWidget( _p_i, _p_mi, b_advControls, b_shiny, true ),
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 )
+ b_fullscreen( false ), i_hide_timeout( 1 ), p_vout(NULL)
{
setWindowFlags( Qt::ToolTip );
setSizePolicy( QSizePolicy::Minimum, QSizePolicy::Minimum );
QGridLayout *fsLayout = new QGridLayout( this );
- fsLayout->setLayoutMargins( 5, 1, 5, 1, 5 );
+ fsLayout->setLayoutMargins( 5, 2, 5, 2, 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 );
+ slider->setMinimumWidth( 220 );
+ fsLayout->addWidget( slowerButton, 0, 0 );
+ fsLayout->addWidget( slider, 0, 1, 1, 9 );
+ fsLayout->addWidget( fasterButton, 0, 10 );
+ 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( discFrame, 1, 3 );
+ fsLayout->addWidget( telexFrame, 1, 4 );
+ fsLayout->addWidget( fullscreenButton, 1, 5 );
fsLayout->addWidget( advControls, 1, 6, Qt::AlignVCenter );
- fsLayout->addWidget( fullscreenButton, 1, 7 );
+ fsLayout->setColumnStretch( 7, 10 );
+ fsLayout->addWidget( volMuteLabel, 1, 8 );
+ fsLayout->addWidget( volumeSlider, 1, 9, 1, 2 );
/* hiding timer */
p_hideTimer = new QTimer( this );
#ifdef WIN32TRICK
setWindowOpacity( 0.0 );
- fscHidden = true;
+ b_fscHidden = true;
+ adjustSize();
show();
#endif
+ fullscreenButton->setIcon( QIcon( ":/defullscreen" ) );
+
vlc_mutex_init_recursive( &lock );
}
FullscreenControllerWidget::~FullscreenControllerWidget()
{
+ detachVout();
vlc_mutex_destroy( &lock );
}
*/
void FullscreenControllerWidget::showFSC()
{
+ adjustSize();
#ifdef WIN32TRICK
// after quiting and going to fs, we need to call show()
if( isHidden() )
show();
- if( fscHidden )
+ if( b_fscHidden )
{
- fscHidden = false;
+ b_fscHidden = false;
setWindowOpacity( 1.0 );
}
#else
void FullscreenControllerWidget::hideFSC()
{
#ifdef WIN32TRICK
- fscHidden = true;
+ b_fscHidden = true;
setWindowOpacity( 0.0 ); // simulate hidding
#else
hide();
else
{
#ifdef WIN32TRICK
- if ( windowOpacity() > 0.0 && !fscHidden )
+ if ( windowOpacity() > 0.0 && !b_fscHidden )
#else
if ( windowOpacity() > 0.0 )
#endif
switch( event->type() )
{
- 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;
+ case FullscreenControlToggle_Type:
+ vlc_mutex_lock( &lock );
+ b_fs = b_fullscreen;
+ vlc_mutex_unlock( &lock );
+ if( b_fs )
+#ifdef WIN32TRICK
+ if( b_fscHidden )
+#else
+ if( isHidden() )
+#endif
+ {
+ p_hideTimer->stop();
+ showFSC();
+ }
+ else
+ hideFSC();
+ break;
+ 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;
}
}
/**
* It is called when video start
*/
-void FullscreenControllerWidget::attachVout( vout_thread_t *p_vout )
+void FullscreenControllerWidget::attachVout( vout_thread_t *p_nvout )
{
- assert( p_vout );
+ assert( p_nvout && !p_vout );
+
+ p_vout = p_nvout;
vlc_mutex_lock( &lock );
var_AddCallback( p_vout, "fullscreen", FullscreenControllerWidgetFullscreenChanged, this ); /* I miss a add and fire */
/**
* It is called after turn off video.
*/
-void FullscreenControllerWidget::detachVout( vout_thread_t *p_vout )
+void FullscreenControllerWidget::detachVout()
{
- assert( p_vout );
-
- var_DelCallback( p_vout, "fullscreen", FullscreenControllerWidgetFullscreenChanged, this );
- vlc_mutex_lock( &lock );
- fullscreenChanged( p_vout, false, 0 );
- vlc_mutex_unlock( &lock );
+ if( p_vout )
+ {
+ var_DelCallback( p_vout, "fullscreen", FullscreenControllerWidgetFullscreenChanged, this );
+ vlc_mutex_lock( &lock );
+ fullscreenChanged( p_vout, false, 0 );
+ vlc_mutex_unlock( &lock );
+ p_vout = NULL;
+ }
}
/**
{
THEMIM->getIM()->setRate(INPUT_RATE_DEFAULT);
}
+
+
+
+static int downloadCoverCallback( vlc_object_t *p_this,
+ char const *psz_var,
+ vlc_value_t oldvar, vlc_value_t newvar,
+ void *data )
+{
+ if( !strcmp( psz_var, "item-change" ) )
+ {
+ CoverArtLabel *art = static_cast< CoverArtLabel* >( data );
+ if( art )
+ art->requestUpdate();
+ }
+ return VLC_SUCCESS;
+}
+
+CoverArtLabel::CoverArtLabel( QWidget *parent,
+ vlc_object_t *_p_this,
+ input_item_t *_p_input )
+ : QLabel( parent ), p_this( _p_this), p_input( _p_input ), prevArt()
+{
+ setContextMenuPolicy( Qt::ActionsContextMenu );
+ CONNECT( this, updateRequested(), this, doUpdate() );
+
+ playlist_t *p_playlist = pl_Yield( p_this );
+ var_AddCallback( p_playlist, "item-change",
+ downloadCoverCallback, this );
+ pl_Release( p_this );
+
+ setMinimumHeight( 128 );
+ setMinimumWidth( 128 );
+ setMaximumHeight( 128 );
+ setMaximumWidth( 128 );
+ setScaledContents( true );
+
+ doUpdate();
+}
+
+void CoverArtLabel::downloadCover()
+{
+ if( p_input )
+ {
+ playlist_t *p_playlist = pl_Yield( p_this );
+ playlist_AskForArtEnqueue( p_playlist, p_input );
+ pl_Release( p_this );
+ }
+}
+
+void CoverArtLabel::doUpdate()
+{
+ if( !p_input )
+ {
+ setPixmap( QPixmap( ":/noart.png" ) );
+ QList< QAction* > artActions = actions();
+ if( !artActions.isEmpty() )
+ foreach( QAction *act, artActions )
+ removeAction( act );
+ prevArt = "";
+ }
+ else
+ {
+ char *psz_meta = input_item_GetArtURL( p_input );
+ if( psz_meta && !strncmp( psz_meta, "file://", 7 ) )
+ {
+ QString artUrl = qfu( psz_meta ).replace( "file://", "" );
+ if( artUrl != prevArt )
+ setPixmap( QPixmap( artUrl ) );
+ QList< QAction* > artActions = actions();
+ if( !artActions.isEmpty() )
+ {
+ foreach( QAction *act, artActions )
+ removeAction( act );
+ }
+ prevArt = artUrl;
+ }
+ else
+ {
+ if( prevArt != "" )
+ setPixmap( QPixmap( ":/noart.png" ) );
+ prevArt = "";
+ QList< QAction* > artActions = actions();
+ if( artActions.isEmpty() )
+ {
+ QAction *action = new QAction( qtr( "Download cover art" ),
+ this );
+ addAction( action );
+ CONNECT( action, triggered(),
+ this, downloadCover() );
+ }
+ }
+ free( psz_meta );
+ }
+}
+