[vlc-commits] commit: Qt: New BackgroundWiget (Francois Cartegnie )

git at videolan.org git at videolan.org
Sat Mar 20 16:36:21 CET 2010


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Sat Mar 20 15:42:56 2010 +0100| [7bfa5717b05eb83164ec4fe93718696ff7f9997b] | committer: Jean-Baptiste Kempf 

Qt: New BackgroundWiget

Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=7bfa5717b05eb83164ec4fe93718696ff7f9997b
---

 modules/gui/qt4/components/interface_widgets.cpp |   91 +++++++++++++---------
 modules/gui/qt4/components/interface_widgets.hpp |    9 ++-
 2 files changed, 59 insertions(+), 41 deletions(-)

diff --git a/modules/gui/qt4/components/interface_widgets.cpp b/modules/gui/qt4/components/interface_widgets.cpp
index c9c778c..756630b 100644
--- a/modules/gui/qt4/components/interface_widgets.cpp
+++ b/modules/gui/qt4/components/interface_widgets.cpp
@@ -45,6 +45,7 @@
 #include <QPainter>
 #include <QTimer>
 #include <QSlider>
+#include <QBitmap>
 
 #ifdef Q_WS_X11
 # include <X11/Xlib.h>
@@ -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 8848eca..58c23f1 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& );



More information about the vlc-commits mailing list