From: Francois Cartegnie Date: Sat, 20 Mar 2010 14:42:56 +0000 (+0100) Subject: Qt: New BackgroundWiget X-Git-Tag: 1.1.0-pre1~336 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=7bfa5717b05eb83164ec4fe93718696ff7f9997b;p=vlc Qt: New BackgroundWiget Signed-off-by: Jean-Baptiste Kempf --- diff --git a/modules/gui/qt4/components/interface_widgets.cpp b/modules/gui/qt4/components/interface_widgets.cpp index c9c778c4f9..756630b603 100644 --- a/modules/gui/qt4/components/interface_widgets.cpp +++ b/modules/gui/qt4/components/interface_widgets.cpp @@ -45,6 +45,7 @@ #include #include #include +#include #ifdef Q_WS_X11 # include @@ -272,17 +273,10 @@ void VideoWidget::release( void ) * Background Widget. Show a simple image background. Currently, * it's album art if present or cone. **********************************************************************/ -#define ICON_SIZE 128 -#define MAX_BG_SIZE 400 -#define MIN_BG_SIZE 128 -#define MARGIN 5 BackgroundWidget::BackgroundWidget( intf_thread_t *_p_i ) - :QWidget( NULL ), p_intf( _p_i ) + :QWidget( NULL ), p_intf( _p_i ), b_expandPixmap( false ) { - /* We should use that one to take the more size it can */ - //setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding); - /* A dark background */ setAutoFillBackground( true ); QPalette plt = palette(); @@ -290,58 +284,79 @@ BackgroundWidget::BackgroundWidget( intf_thread_t *_p_i ) plt.setColor( QPalette::Inactive, QPalette::Window , Qt::black ); setPalette( plt ); - /* A cone in the middle */ - label = new QLabel; - label->setMargin( MARGIN ); - label->setAlignment( Qt::AlignCenter ); - /* Init the cone art */ updateArt( "" ); - /* Grid, because of the visual selector */ - QGridLayout *backgroundLayout = new QGridLayout( this ); - backgroundLayout->setMargin( 0 ); - backgroundLayout->addWidget( label, 0, 1 ); - backgroundLayout->setColumnStretch( 0, 1 ); - backgroundLayout->setColumnStretch( 2, 1 ); - CONNECT( THEMIM->getIM(), artChanged( QString ), this, updateArt( const QString& ) ); - - /* Start Hidden */ - label->hide(); } void BackgroundWidget::resizeEvent( QResizeEvent * event ) { - if( event->size().height() <= MIN_BG_SIZE + MARGIN * 2 + 2 ) - label->hide(); - else - label->show(); + updateArt( "" ); + QWidget::resizeEvent( event ); } void BackgroundWidget::updateArt( const QString& url ) { - if( url.isEmpty() ) + if ( !url.isEmpty() ) { - /* Xmas joke */ + pixmapUrl = url; + } + else + { /* Xmas joke */ if( QDate::currentDate().dayOfYear() >= 354 ) - label->setPixmap( QPixmap( ":/logo/vlc128-christmas.png" ) ); + pixmapUrl = QString( ":/logo/vlc128-christmas.png" ); else - label->setPixmap( QPixmap( ":/logo/vlc128.png" ) ); + pixmapUrl = QString( ":/logo/vlc128.png" ); } - else +} + +void BackgroundWidget::paintEvent( QPaintEvent *e ) +{ + 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; + + if ( height() > MARGIN * 2 ) { - QPixmap pixmap( url ); - if( pixmap.width() > label->maximumWidth() || - pixmap.height() > label->maximumHeight() ) + /* Scale down the pixmap if the widget is too small */ + if( pixmap.width() > i_maxwidth || pixmap.height() > i_maxheight ) + { + pixmap = pixmap.scaled( i_maxwidth, i_maxheight, + Qt::KeepAspectRatio, Qt::SmoothTransformation ); + } + else + if ( b_expandPixmap && + pixmap.width() < width() && pixmap.height() < height() ) { - pixmap = pixmap.scaled( label->maximumWidth(), - label->maximumHeight(), Qt::KeepAspectRatio ); + /* Scale up the pixmap to fill widget's size */ + f_alpha = ( (float) pixmap.height() / (float) height() ); + pixmap = pixmap.scaled( + width() - MARGIN * 2, + height() - MARGIN * 2, + Qt::KeepAspectRatio, + ( f_alpha < .2 )? /* Don't waste cpu when not visible */ + Qt::SmoothTransformation: + Qt::FastTransformation + ); + /* Non agressive alpha compositing when sizing up */ + pMask = QBitmap( pixmap.width(), pixmap.height() ); + pMask.fill( QColor::fromRgbF( 1.0, 1.0, 1.0, f_alpha ) ); + pixmap.setMask( pMask ); } - label->setPixmap( pixmap ); + painter.drawPixmap( + MARGIN + ( i_maxwidth - pixmap.width() ) /2, + MARGIN + ( i_maxheight - pixmap.height() ) /2, + pixmap); } + QWidget::paintEvent( e ); } void BackgroundWidget::contextMenuEvent( QContextMenuEvent *event ) diff --git a/modules/gui/qt4/components/interface_widgets.hpp b/modules/gui/qt4/components/interface_widgets.hpp index 8848eca849..58c23f1c1a 100644 --- a/modules/gui/qt4/components/interface_widgets.hpp +++ b/modules/gui/qt4/components/interface_widgets.hpp @@ -89,13 +89,16 @@ class BackgroundWidget : public QWidget Q_OBJECT public: BackgroundWidget( intf_thread_t * ); - + void setExpandstoHeight( bool b_expand ) { b_expandPixmap = b_expand; } private: - QLabel *label; + QString pixmapUrl; + bool b_expandPixmap; virtual void contextMenuEvent( QContextMenuEvent *event ); intf_thread_t *p_intf; virtual void resizeEvent( QResizeEvent * event ); - +protected: + void paintEvent( QPaintEvent *e ); + static const int MARGIN = 5; public slots: void toggle(){ TOGGLEV( this ); } void updateArt( const QString& );