# include "config.h"
#endif
+#include "qt4.hpp"
#include "components/interface_widgets.hpp"
#include "dialogs_provider.hpp"
#include "util/customwidgets.hpp" // qtEventToVLCKey, QVLCStackedWidget
layout = new QHBoxLayout( this );
layout->setContentsMargins( 0, 0, 0, 0 );
stable = NULL;
+ show();
}
VideoWidget::~VideoWidget()
if( stable )
{
msg_Dbg( p_intf, "embedded video already in use" );
- return NULL;
+ return 0;
}
if( b_keep_size )
{
plt.setColor( QPalette::Window, Qt::black );
stable->setPalette( plt );
stable->setAutoFillBackground(true);
+ /* Force the widget to be native so that it gets a winId() */
+ stable->setAttribute( Qt::WA_NativeWindow, true );
/* Indicates that the widget wants to draw directly onto the screen.
Widgets with this attribute set do not participate in composition
management */
/* This is currently disabled on X11 as it does not seem to improve
* performance, but causes the video widget to be transparent... */
-#ifndef Q_WS_X11
+#if !defined (Q_WS_X11) && !defined (Q_WS_QPA)
stable->setAttribute( Qt::WA_PaintOnScreen, true );
#endif
XSelectInput( dpy, w, attr.your_event_mask );
#endif
sync();
-#ifndef NDEBUG
- msg_Dbg( p_intf, "embedded video ready (handle %p)",
- (void *)stable->winId() );
-#endif
return stable->winId();
}
Parent has to care about resizing itself */
void VideoWidget::SetSizing( unsigned int w, unsigned int h )
{
- if( !isVisible() ) show();
resize( w, h );
emit sizeChanged( w, h );
/* Work-around a bug?misconception? that would happen when vout core resize
This cause a small flicker.
See #3621
*/
- if( size().width() == w && size().height() == h )
+ if( (unsigned)size().width() == w && (unsigned)size().height() == h )
updateGeometry();
sync();
}
{
msg_Dbg( p_intf, "Video is not needed anymore" );
- assert( stable );
- layout->removeWidget( stable );
- stable->deleteLater();
- stable = NULL;
+ if( stable )
+ {
+ layout->removeWidget( stable );
+ stable->deleteLater();
+ stable = NULL;
+ }
updateGeometry();
- hide();
}
/**********************************************************************
**********************************************************************/
BackgroundWidget::BackgroundWidget( intf_thread_t *_p_i )
- :QWidget( NULL ), p_intf( _p_i ), b_expandPixmap( false )
+ :QWidget( NULL ), p_intf( _p_i ), b_expandPixmap( false ), b_withart( true )
{
/* A dark background */
setAutoFillBackground( true );
}
else
{ /* Xmas joke */
- if( QDate::currentDate().dayOfYear() >= 354 )
- pixmapUrl = QString( ":/logo/vlc128-christmas.png" );
+ if( QDate::currentDate().dayOfYear() >= QT_XMAS_JOKE_DAY && var_InheritBool( p_intf, "qt-icon-change" ) )
+ pixmapUrl = QString( ":/logo/vlc128-xmas.png" );
else
pixmapUrl = QString( ":/logo/vlc128.png" );
}
void BackgroundWidget::paintEvent( QPaintEvent *e )
{
+ if ( !b_withart )
+ {
+ /* we just want background autofill */
+ QWidget::paintEvent( e );
+ return;
+ }
+
int i_maxwidth, i_maxheight;
QPixmap pixmap = QPixmap( pixmapUrl );
QPainter painter(this);
QBitmap pMask;
float f_alpha = 1.0;
- i_maxwidth = std::min( maximumWidth(), width() ) - MARGIN * 2;
- i_maxheight = std::min( maximumHeight(), height() ) - MARGIN * 2;
+ i_maxwidth = __MIN( maximumWidth(), width() ) - MARGIN * 2;
+ i_maxheight = __MIN( maximumHeight(), height() ) - MARGIN * 2;
if ( height() > MARGIN * 2 )
{
void BackgroundWidget::contextMenuEvent( QContextMenuEvent *event )
{
- QVLCMenu::PopupMenu( p_intf, true );
+ VLCMenuBar::PopupMenu( p_intf, true );
event->accept();
}
widgetAction->setDefaultWidget( speedControl );
speedControlMenu->addAction( widgetAction );
- /* Change the SpeedRate in the Status Bar */
+ /* Change the SpeedRate in the Label */
CONNECT( THEMIM->getIM(), rateChanged( float ), this, setRate( float ) );
DCONNECT( THEMIM, inputChanged( input_thread_t * ),
speedControl, activateOnState() );
- setRate( var_InheritFloat( p_intf, "rate" ) );
+
+ setFrameStyle( QFrame::StyledPanel | QFrame::Raised );
+ setLineWidth( 1 );
+
+ setRate( var_InheritFloat( THEPL, "rate" ) );
}
SpeedLabel::~SpeedLabel()
void SpeedLabel::showSpeedMenu( QPoint pos )
{
speedControlMenu->exec( QCursor::pos() - pos
- + QPoint( 0, height() ) );
+ + QPoint( -70 + width()/2, height() ) );
}
void SpeedLabel::setRate( float rate )
SpeedControlWidget::SpeedControlWidget( intf_thread_t *_p_i, QWidget *_parent )
: QFrame( _parent ), p_intf( _p_i )
{
- QSizePolicy sizePolicy( QSizePolicy::Maximum, QSizePolicy::Fixed );
+ QSizePolicy sizePolicy( QSizePolicy::Fixed, QSizePolicy::Maximum );
sizePolicy.setHorizontalStretch( 0 );
sizePolicy.setVerticalStretch( 0 );
speedSlider = new QSlider( this );
speedSlider->setSizePolicy( sizePolicy );
- speedSlider->setMaximumSize( QSize( 80, 200 ) );
- speedSlider->setOrientation( Qt::Vertical );
- speedSlider->setTickPosition( QSlider::TicksRight );
+ speedSlider->setMinimumSize( QSize( 140, 20 ) );
+ speedSlider->setOrientation( Qt::Horizontal );
+ speedSlider->setTickPosition( QSlider::TicksBelow );
speedSlider->setRange( -34, 34 );
speedSlider->setSingleStep( 1 );
CONNECT( speedSlider, valueChanged( int ), this, updateRate( int ) );
QToolButton *normalSpeedButton = new QToolButton( this );
- normalSpeedButton->setMaximumSize( QSize( 26, 20 ) );
+ normalSpeedButton->setMaximumSize( QSize( 26, 16 ) );
normalSpeedButton->setAutoRaise( true );
normalSpeedButton->setText( "1x" );
normalSpeedButton->setToolTip( qtr( "Revert to normal play speed" ) );
CONNECT( normalSpeedButton, clicked(), this, resetRate() );
- QVBoxLayout *speedControlLayout = new QVBoxLayout( this );
- speedControlLayout->setContentsMargins( 4, 4, 4, 4 );
- speedControlLayout->setSpacing( 4 );
- speedControlLayout->addWidget( speedSlider );
- speedControlLayout->addWidget( normalSpeedButton );
+ QToolButton *slowerButton = new QToolButton( this );
+ slowerButton->setMaximumSize( QSize( 26, 16 ) );
+ slowerButton->setAutoRaise( true );
+ slowerButton->setToolTip( tooltipL[SLOWER_BUTTON] );
+ slowerButton->setIcon( QIcon( iconL[SLOWER_BUTTON] ) );
+ CONNECT( slowerButton, clicked(), THEMIM->getIM(), slower() );
+
+ QToolButton *fasterButton = new QToolButton( this );
+ fasterButton->setMaximumSize( QSize( 26, 16 ) );
+ fasterButton->setAutoRaise( true );
+ fasterButton->setToolTip( tooltipL[FASTER_BUTTON] );
+ fasterButton->setIcon( QIcon( iconL[FASTER_BUTTON] ) );
+ CONNECT( fasterButton, clicked(), THEMIM->getIM(), faster() );
+
+/* spinBox = new QDoubleSpinBox();
+ spinBox->setDecimals( 2 );
+ spinBox->setMaximum( 32 );
+ spinBox->setMinimum( 0.03F );
+ spinBox->setSingleStep( 0.10F );
+ spinBox->setAlignment( Qt::AlignRight );
+
+ CONNECT( spinBox, valueChanged( double ), this, updateSpinBoxRate( double ) ); */
+
+ QGridLayout* speedControlLayout = new QGridLayout( this );
+ speedControlLayout->addWidget( speedSlider, 0, 0, 1, 3 );
+ speedControlLayout->addWidget( slowerButton, 1, 0 );
+ speedControlLayout->addWidget( normalSpeedButton, 1, 1, 1, 1, Qt::AlignRight );
+ speedControlLayout->addWidget( fasterButton, 1, 2, 1, 1, Qt::AlignRight );
+ //speedControlLayout->addWidget( spinBox );
+ speedControlLayout->setContentsMargins( 0, 0, 0, 0 );
+ speedControlLayout->setSpacing( 0 );
lastValue = 0;
void SpeedControlWidget::activateOnState()
{
speedSlider->setEnabled( THEMIM->getIM()->hasInput() );
+ //spinBox->setEnabled( THEMIM->getIM()->hasInput() );
}
void SpeedControlWidget::updateControls( float rate )
return;
}
- double value = 17 * log( rate ) / log( 2 );
+ double value = 17 * log( rate ) / log( 2. );
int sliderValue = (int) ( ( value > 0 ) ? value + .5 : value - .5 );
if( sliderValue < speedSlider->minimum() )
lastValue = sliderValue;
speedSlider->setValue( sliderValue );
+ //spinBox->setValue( rate );
}
void SpeedControlWidget::updateRate( int sliderValue )
int rate = INPUT_RATE_DEFAULT / speed;
THEMIM->getIM()->setRate(rate);
+ //spinBox->setValue( var_InheritFloat( THEPL, "rate" ) );
+}
+
+void SpeedControlWidget::updateSpinBoxRate( double r )
+{
+ var_SetFloat( THEPL, "rate", r );
}
void SpeedControlWidget::resetRate()
}
CoverArtLabel::CoverArtLabel( QWidget *parent, intf_thread_t *_p_i )
- : QLabel( parent ), p_intf( _p_i )
+ : QLabel( parent ), p_intf( _p_i ), p_item( NULL )
{
setContextMenuPolicy( Qt::ActionsContextMenu );
- CONNECT( this, updateRequested(), this, askForUpdate() );
+ CONNECT( THEMIM->getIM(), artChanged( input_item_t * ),
+ this, showArtUpdate( input_item_t * ) );
setMinimumHeight( 128 );
setMinimumWidth( 128 );
- setMaximumHeight( 128 );
- setMaximumWidth( 128 );
setScaledContents( false );
setAlignment( Qt::AlignCenter );
- QList< QAction* > artActions = actions();
QAction *action = new QAction( qtr( "Download cover art" ), this );
CONNECT( action, triggered(), this, askForUpdate() );
addAction( action );
QList< QAction* > artActions = actions();
foreach( QAction *act, artActions )
removeAction( act );
+ if ( p_item ) vlc_gc_decref( p_item );
+}
+
+void CoverArtLabel::setItem( input_item_t *_p_item )
+{
+ if ( p_item ) vlc_gc_decref( p_item );
+ p_item = _p_item;
+ if ( p_item ) vlc_gc_incref( p_item );
}
void CoverArtLabel::showArtUpdate( const QString& url )
QPixmap pix;
if( !url.isEmpty() && pix.load( url ) )
{
- pix = pix.scaled( maximumWidth(), maximumHeight(),
+ pix = pix.scaled( minimumWidth(), minimumHeight(),
Qt::KeepAspectRatioByExpanding,
Qt::SmoothTransformation );
}
setPixmap( pix );
}
+void CoverArtLabel::showArtUpdate( input_item_t *_p_item )
+{
+ /* not for me */
+ if ( _p_item != p_item )
+ return;
+
+ QString url;
+ if ( _p_item ) url = THEMIM->getIM()->decodeArtURL( _p_item );
+ showArtUpdate( url );
+}
+
void CoverArtLabel::askForUpdate()
{
- THEMIM->getIM()->requestArtUpdate();
+ THEMIM->getIM()->requestArtUpdate( p_item );
}
-TimeLabel::TimeLabel( intf_thread_t *_p_intf )
- : QLabel(), p_intf( _p_intf ), bufTimer( new QTimer(this) ),
- buffering( false ), showBuffering(false), bufVal( -1 )
+TimeLabel::TimeLabel( intf_thread_t *_p_intf, TimeLabel::Display _displayType )
+ : ClickableQLabel(), p_intf( _p_intf ), bufTimer( new QTimer(this) ),
+ buffering( false ), showBuffering(false), bufVal( -1 ), displayType( _displayType )
{
b_remainingTime = false;
- setText( " --:--/--:-- " );
+ if( _displayType != TimeLabel::Elapsed )
+ b_remainingTime = getSettings()->value( "MainWindow/ShowRemainingTime", false ).toBool();
+ switch( _displayType ) {
+ case TimeLabel::Elapsed:
+ setText( " --:-- " );
+ setToolTip( qtr("Elapsed time") );
+ break;
+ case TimeLabel::Remaining:
+ setText( " --:-- " );
+ setToolTip( qtr("Total/Remaining time")
+ + QString("\n-")
+ + qtr("Click to toggle between total and remaining time")
+ );
+ break;
+ case TimeLabel::Both:
+ setText( " --:--/--:-- " );
+ setToolTip( QString( "- " )
+ + qtr( "Click to toggle between elapsed and remaining time" )
+ + QString( "\n- " )
+ + qtr( "Double click to jump to a chosen time position" ) );
+ break;
+ }
setAlignment( Qt::AlignRight | Qt::AlignVCenter );
- setToolTip( QString( "- " )
- + qtr( "Click to toggle between elapsed and remaining time" )
- + QString( "\n- " )
- + qtr( "Double click to jump to a chosen time position" ) );
+
bufTimer->setSingleShot( true );
CONNECT( THEMIM->getIM(), positionUpdated( float, int64_t, int ),
CONNECT( THEMIM->getIM(), cachingChanged( float ),
this, updateBuffering( float ) );
CONNECT( bufTimer, timeout(), this, updateBuffering() );
+
+ setStyleSheet( "padding-left: 4px; padding-right: 4px;" );
}
void TimeLabel::setDisplayPosition( float pos, int64_t t, int length )
if( pos == -1.f )
{
- setText( " --:--/--:-- " );
+ setMinimumSize( QSize( 0, 0 ) );
+ if( displayType == TimeLabel::Both )
+ setText( "--:--/--:--" );
+ else
+ setText( "--:--" );
return;
}
secstotimestr( psz_time, ( b_remainingTime && length ) ? length - time
: time );
- QString timestr = QString( " %1%2/%3 " )
+ // compute the minimum size that will be required for the psz_length
+ // and use it to enforce a minimal size to avoid "dancing" widgets
+ QSize minsize( 0, 0 );
+ if ( length > 0 )
+ {
+ QMargins margins = contentsMargins();
+ minsize += QSize(
+ fontMetrics().size( 0, QString( psz_length ), 0, 0 ).width(),
+ sizeHint().height()
+ );
+ minsize += QSize( margins.left() + margins.right() + 8, 0 ); /* +padding */
+
+ if ( b_remainingTime )
+ minsize += QSize( fontMetrics().size( 0, "-", 0, 0 ).width(), 0 );
+ }
+
+ switch( displayType )
+ {
+ case TimeLabel::Elapsed:
+ setMinimumSize( minsize );
+ setText( QString( psz_time ) );
+ break;
+ case TimeLabel::Remaining:
+ if( b_remainingTime )
+ {
+ setMinimumSize( minsize );
+ setText( QString("-") + QString( psz_time ) );
+ }
+ else
+ {
+ setMinimumSize( QSize( 0, 0 ) );
+ setText( QString( psz_length ) );
+ }
+ break;
+ case TimeLabel::Both:
+ default:
+ QString timestr = QString( "%1%2/%3" )
.arg( QString( (b_remainingTime && length) ? "-" : "" ) )
.arg( QString( psz_time ) )
.arg( QString( ( !length && time ) ? "--:--" : psz_length ) );
- setText( timestr );
-
+ setText( timestr );
+ break;
+ }
cachedLength = length;
}
secstotimestr( psz_time,
( b_remainingTime && cachedLength ?
cachedLength - time : time ) );
- QString timestr = QString( " %1%2/%3 " )
+ QString timestr = QString( "%1%2/%3" )
.arg( QString( (b_remainingTime && cachedLength) ? "-" : "" ) )
.arg( QString( psz_time ) )
.arg( QString( ( !cachedLength && time ) ? "--:--" : psz_length ) );
void TimeLabel::toggleTimeDisplay()
{
b_remainingTime = !b_remainingTime;
+ getSettings()->setValue( "MainWindow/ShowRemainingTime", b_remainingTime );
}