[vlc-commits] Qt: VLCModel/TreeView: delegate cover rendering (fix #10206)
Francois Cartegnie
git at videolan.org
Sat Mar 8 20:13:40 CET 2014
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Sat Mar 8 20:01:30 2014 +0100| [0823125ed7df8951b5e903525b53b41e402e66ff] | committer: Francois Cartegnie
Qt: VLCModel/TreeView: delegate cover rendering (fix #10206)
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=0823125ed7df8951b5e903525b53b41e402e66ff
---
.../gui/qt4/components/playlist/playlist_model.cpp | 54 +++++---------------
modules/gui/qt4/components/playlist/sorting.h | 2 +-
modules/gui/qt4/components/playlist/views.cpp | 10 +++-
modules/gui/qt4/components/playlist/views.hpp | 9 ++++
modules/gui/qt4/components/playlist/vlc_model.cpp | 31 ++++++-----
modules/gui/qt4/components/playlist/vlc_model.hpp | 2 +-
6 files changed, 53 insertions(+), 55 deletions(-)
diff --git a/modules/gui/qt4/components/playlist/playlist_model.cpp b/modules/gui/qt4/components/playlist/playlist_model.cpp
index 1b7abe9..4f3608e 100644
--- a/modules/gui/qt4/components/playlist/playlist_model.cpp
+++ b/modules/gui/qt4/components/playlist/playlist_model.cpp
@@ -381,7 +381,7 @@ QVariant PLModel::data( const QModelIndex &index, const int role ) const
break;
}
}
- return QVariant( artUrl );
+ return artUrl;
}
else
{
@@ -391,51 +391,25 @@ QVariant PLModel::data( const QModelIndex &index, const int role ) const
}
return QVariant( returninfo );
}
- else if( role == Qt::DecorationRole && index.column() == 0 )
+ else if( role == Qt::DecorationRole )
{
- /* Used to segfault here because i_type wasn't always initialized */
- return QVariant( icons[item->inputItem()->i_type] );
+ switch( columnToMeta(index.column()) )
+ {
+ case COLUMN_TITLE:
+ /* Used to segfault here because i_type wasn't always initialized */
+ return QVariant( icons[item->inputItem()->i_type] );
+ case COLUMN_COVER:
+ /* !warn: changes tree item line height. Otherwise, override
+ * delegate's sizehint */
+ return getArtPixmap( index, QSize(16,16) );
+ default:
+ return QVariant();
+ }
}
else if( role == Qt::FontRole )
{
return QVariant( QFont() );
}
- else if( role == Qt::ToolTipRole )
- {
- int i_art_policy = var_GetInteger( p_playlist, "album-art" );
- QString artUrl;
- /* FIXME: Skip, as we don't want the pixmap and do not know the cached art file */
- if ( i_art_policy == ALBUM_ART_ALL )
- artUrl = getArtUrl( index );
- if ( artUrl.isEmpty() ) artUrl = ":/noart";
- QString duration = qtr( "unknown" );
- QString name;
- PL_LOCK;
- input_item_t *p_item = item->inputItem();
- if ( !p_item )
- {
- PL_UNLOCK;
- return QVariant();
- }
- if ( p_item->i_duration > 0 )
- {
- char *psz = psz_column_meta( item->inputItem(), COLUMN_DURATION );
- duration = qfu( psz );
- free( psz );
- }
- name = qfu( p_item->psz_name );
- PL_UNLOCK;
- QPixmap image = getArtPixmap( index, QSize( 128, 128 ) );
- QByteArray bytes;
- QBuffer buffer( &bytes );
- buffer.open( QIODevice::WriteOnly );
- image.save(&buffer, "BMP"); /* uncompressed, see qpixmap#reading-and-writing-image-files */
- return QVariant( QString("<img width=\"128\" height=\"128\" align=\"left\" src=\"data:image/bmp;base64,%1\"/><div><b>%2</b><br/>%3</div>")
- .arg( bytes.toBase64().constData() )
- .arg( name )
- .arg( qtr("Duration") + ": " + duration )
- );
- }
else if( role == Qt::BackgroundRole && isCurrent( index ) )
{
return QVariant( QBrush( Qt::gray ) );
diff --git a/modules/gui/qt4/components/playlist/sorting.h b/modules/gui/qt4/components/playlist/sorting.h
index f0ea872..7762327 100644
--- a/modules/gui/qt4/components/playlist/sorting.h
+++ b/modules/gui/qt4/components/playlist/sorting.h
@@ -61,7 +61,7 @@ static inline const char * psz_column_title( uint32_t i_column )
case COLUMN_DESCRIPTION: return VLC_META_DESCRIPTION;
case COLUMN_URI: return _("URI");
case COLUMN_RATING: return VLC_META_RATING;
- case COLUMN_COVER: return VLC_META_ART_URL;
+ case COLUMN_COVER: return _("Cover");
default: abort();
}
}
diff --git a/modules/gui/qt4/components/playlist/views.cpp b/modules/gui/qt4/components/playlist/views.cpp
index 74f86eb..5e6929d 100644
--- a/modules/gui/qt4/components/playlist/views.cpp
+++ b/modules/gui/qt4/components/playlist/views.cpp
@@ -288,6 +288,13 @@ void PlTreeViewItemDelegate::paint( QPainter * painter, const QStyleOptionViewIt
}
}
+void CellPixmapDelegate::paint( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const
+{
+ QPixmap pixmap = index.data( Qt::DecorationRole ).value<QPixmap>();
+ painter->drawPixmap( option.rect.topLeft(),
+ pixmap.scaled( option.rect.size(), Qt::KeepAspectRatio ) );
+}
+
static inline void plViewStartDrag( QAbstractItemView *view, const Qt::DropActions & supportedActions )
{
QDrag *drag = new QDrag( view );
@@ -415,7 +422,8 @@ bool PlListView::viewportEvent ( QEvent * event )
PlTreeView::PlTreeView( QAbstractItemModel *, QWidget *parent ) : QTreeView( parent )
{
setItemDelegate( new PlTreeViewItemDelegate( this ) );
-
+ setItemDelegateForColumn( VLCModel::metaToColumn(COLUMN_COVER),
+ new CellPixmapDelegate( this ) );
setIconSize( QSize( 20, 20 ) );
setAlternatingRowColors( true );
setAnimated( true );
diff --git a/modules/gui/qt4/components/playlist/views.hpp b/modules/gui/qt4/components/playlist/views.hpp
index 968d35e..c34aa2a 100644
--- a/modules/gui/qt4/components/playlist/views.hpp
+++ b/modules/gui/qt4/components/playlist/views.hpp
@@ -78,6 +78,15 @@ public:
virtual void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const;
};
+class CellPixmapDelegate : public QStyledItemDelegate
+{
+ Q_OBJECT
+
+public:
+ CellPixmapDelegate(QWidget *parent = 0) : QStyledItemDelegate(parent) {}
+ virtual void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const;
+};
+
class PlIconView : public QListView
{
Q_OBJECT
diff --git a/modules/gui/qt4/components/playlist/vlc_model.cpp b/modules/gui/qt4/components/playlist/vlc_model.cpp
index 119a49e..6ec8302 100644
--- a/modules/gui/qt4/components/playlist/vlc_model.cpp
+++ b/modules/gui/qt4/components/playlist/vlc_model.cpp
@@ -76,18 +76,10 @@ QString VLCModel::getMeta( const QModelIndex & index, int meta )
data().toString();
}
-QString VLCModel::getArtUrl( const QModelIndex & index )
-{
- return index.model()->index( index.row(),
- columnFromMeta( COLUMN_COVER ),
- index.parent() )
- .data().toString();
-}
-
QPixmap VLCModel::getArtPixmap( const QModelIndex & index, const QSize & size )
{
- QString artUrl = VLCModel::getArtUrl( index ) ;
-
+ QString artUrl = index.sibling( index.row(),
+ VLCModel::columnFromMeta(COLUMN_COVER) ).data().toString();
QPixmap artPix;
QString key = artUrl + QString("%1%2").arg(size.width()).arg(size.height());
@@ -141,6 +133,21 @@ int VLCModel::columnToMeta( int _column )
return meta;
}
+int VLCModel::metaToColumn( int _meta )
+{
+ int meta = 1, column = 0;
+
+ while( meta != COLUMN_END )
+ {
+ if ( meta & _meta )
+ break;
+ meta <<= 1;
+ column++;
+ }
+
+ return column;
+}
+
int VLCModel::itemId( const QModelIndex &index, int type ) const
{
AbstractPLItem *item = getItem( index );
@@ -198,8 +205,8 @@ void VLCModel::ensureArtRequested( const QModelIndex &index )
QModelIndex child;
for( int row = 0 ; row < nbnodes ; row++ )
{
- child = index.child( row, 0 );
- if ( child.isValid() && getArtUrl( child ).isEmpty() )
+ child = index.child( row, COLUMN_COVER );
+ if ( child.isValid() && child.data().toString().isEmpty() )
THEMIM->getIM()->requestArtUpdate( getInputItem( child ) );
}
}
diff --git a/modules/gui/qt4/components/playlist/vlc_model.hpp b/modules/gui/qt4/components/playlist/vlc_model.hpp
index 2c76df8..5a4fabc 100644
--- a/modules/gui/qt4/components/playlist/vlc_model.hpp
+++ b/modules/gui/qt4/components/playlist/vlc_model.hpp
@@ -163,9 +163,9 @@ public:
/* Custom */
static int columnToMeta( int _column );
+ static int metaToColumn( int meta );
static QString getMeta( const QModelIndex & index, int meta );
static QPixmap getArtPixmap( const QModelIndex & index, const QSize & size );
- static QString getArtUrl( const QModelIndex & index );
protected:
/* Custom methods / helpers */
More information about the vlc-commits
mailing list