Commit f7257d64 authored by Jakob Leben's avatar Jakob Leben

Qt: iconView: draw artwork as big as its aspect ratio allows

parent f9fa3d51
...@@ -35,11 +35,12 @@ ...@@ -35,11 +35,12 @@
#include "assert.h" #include "assert.h"
#define RECT_SIZE_W 100 #define RECT_SIZE_W 120
#define RECT_SIZE_H 105 #define RECT_SIZE_H 120
#define ART_SIZE 64 #define ART_SIZE_W 110
#define OFFSET (RECT_SIZE_W-64)/2 #define ART_SIZE_H 80
#define ITEMS_SPACING 10 //#define OFFSET (RECT_SIZE_W-ART_SIZE_W)/2
//#define ITEMS_SPACING 10
#define ART_RADIUS 5 #define ART_RADIUS 5
QString AbstractPlViewItemDelegate::getMeta( const QModelIndex & index, int meta ) const QString AbstractPlViewItemDelegate::getMeta( const QModelIndex & index, int meta ) const
...@@ -76,29 +77,21 @@ QPixmap AbstractPlViewItemDelegate::getArtPixmap( const QModelIndex & index, con ...@@ -76,29 +77,21 @@ QPixmap AbstractPlViewItemDelegate::getArtPixmap( const QModelIndex & index, con
} }
} }
QPixmap artPix( size ); QPixmap artPix;
QString key = artUrl + QString("%1%2").arg(size.width()).arg(size.height()); QString key = artUrl + QString("%1%2").arg(size.width()).arg(size.height());
if( !QPixmapCache::find( key, artPix )) if( !QPixmapCache::find( key, artPix ))
{ {
QPixmap tmp; if( artUrl.isEmpty() || !artPix.load( artUrl ) )
bool cache = false;
if( artUrl.isEmpty() || !tmp.load( artUrl ) )
{ {
tmp = QPixmap( ":/noart64" ).scaled( size, Qt::KeepAspectRatio, Qt::SmoothTransformation ); artPix = QPixmap( ":/noart" ).scaled( size, Qt::KeepAspectRatio, Qt::SmoothTransformation );
} }
else else
{ {
tmp = tmp.scaled( size, Qt::KeepAspectRatio, Qt::SmoothTransformation ); artPix = artPix.scaled( size, Qt::KeepAspectRatio, Qt::SmoothTransformation );
cache = true; QPixmapCache::insert( key, artPix );
} }
artPix.fill( Qt::black );
QPainter p( &artPix );
p.drawPixmap( (size.width() - tmp.width()) / 2,
(size.height() - tmp.height()) / 2,
tmp );
if( cache ) QPixmapCache::insert( key, artPix );
} }
return artPix; return artPix;
...@@ -109,7 +102,7 @@ void PlIconViewItemDelegate::paint( QPainter * painter, const QStyleOptionViewIt ...@@ -109,7 +102,7 @@ void PlIconViewItemDelegate::paint( QPainter * painter, const QStyleOptionViewIt
QString title = getMeta( index, COLUMN_TITLE ); QString title = getMeta( index, COLUMN_TITLE );
QString artist = getMeta( index, COLUMN_ARTIST ); QString artist = getMeta( index, COLUMN_ARTIST );
QPixmap artPix = getArtPixmap( index, QSize( ART_SIZE, ART_SIZE ) ); QPixmap artPix = getArtPixmap( index, QSize( ART_SIZE_W, ART_SIZE_H ) );
QApplication::style()->drawPrimitive( QStyle::PE_PanelItemViewItem, &option, QApplication::style()->drawPrimitive( QStyle::PE_PanelItemViewItem, &option,
painter ); painter );
...@@ -125,7 +118,9 @@ void PlIconViewItemDelegate::paint( QPainter * painter, const QStyleOptionViewIt ...@@ -125,7 +118,9 @@ void PlIconViewItemDelegate::paint( QPainter * painter, const QStyleOptionViewIt
painter->restore(); painter->restore();
} }
QRect artRect = option.rect.adjusted( OFFSET - 1, 2, - OFFSET, - OFFSET *2 ); QRect artRect( option.rect.x() + 5 + ( ART_SIZE_W - artPix.width() ) / 2,
option.rect.y() + 5 + ( ART_SIZE_H - artPix.height() ) / 2,
artPix.width(), artPix.height() );
// Draw the drop shadow // Draw the drop shadow
painter->save(); painter->save();
...@@ -154,7 +149,7 @@ void PlIconViewItemDelegate::paint( QPainter * painter, const QStyleOptionViewIt ...@@ -154,7 +149,7 @@ void PlIconViewItemDelegate::paint( QPainter * painter, const QStyleOptionViewIt
painter->setFont( font ); painter->setFont( font );
QFontMetrics fm = painter->fontMetrics(); QFontMetrics fm = painter->fontMetrics();
QRect textRect = option.rect.adjusted( 1, ART_SIZE + 8, 0, -1 ); QRect textRect = option.rect.adjusted( 1, ART_SIZE_H + 10, 0, -1 );
textRect.setHeight( fm.height() + 1 ); textRect.setHeight( fm.height() + 1 );
painter->drawText( textRect, painter->drawText( textRect,
...@@ -208,16 +203,19 @@ void PlListViewItemDelegate::paint( QPainter * painter, const QStyleOptionViewIt ...@@ -208,16 +203,19 @@ void PlListViewItemDelegate::paint( QPainter * painter, const QStyleOptionViewIt
if( index.data( PLModel::IsCurrentRole ).toBool() ) if( index.data( PLModel::IsCurrentRole ).toBool() )
paintPlayingItemBg( painter, option ); paintPlayingItemBg( painter, option );
painter->drawPixmap( option.rect.topLeft() + QPoint(3,3), artPix ); painter->drawPixmap( option.rect.topLeft() + QPoint(3,3)
+ QPoint( (LISTVIEW_ART_SIZE - artPix.width()) / 2,
(LISTVIEW_ART_SIZE - artPix.height()) / 2 ),
artPix );
int textH = option.fontMetrics.height() + 2; int textH = option.fontMetrics.height() + 2;
int margin = ( option.rect.height() / 2 ) - textH; int marginY = ( option.rect.height() / 2 ) - textH;
QRect textRect = option.rect.adjusted( LISTVIEW_ART_SIZE + 10, QRect textRect = option.rect.adjusted( LISTVIEW_ART_SIZE + 10,
margin, marginY,
-10, -10,
margin * -1 - ( artistAlbum.isEmpty() ? 0 : textH ) ); marginY * -1 - ( artistAlbum.isEmpty() ? 0 : textH ) );
painter->save(); painter->save();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment