mirror of
https://github.com/tomahawk-player/tomahawk.git
synced 2025-08-11 08:34:34 +02:00
* Added PlaylistItemDelegate::drawLoveBox() which paints a little box showing all the sources that loved a particular track.
This commit is contained in:
@@ -102,7 +102,7 @@ PlaylistItemDelegate::sizeHint( const QStyleOptionViewItem& option, const QModel
|
|||||||
QSize size = QStyledItemDelegate::sizeHint( option, index );
|
QSize size = QStyledItemDelegate::sizeHint( option, index );
|
||||||
|
|
||||||
{
|
{
|
||||||
if ( m_model->style() == PlayableProxyModel::Short || m_model->style() == PlayableProxyModel::ShortWithAvatars )
|
if ( m_model->style() == PlayableProxyModel::Short )
|
||||||
{
|
{
|
||||||
int rowHeight = option.fontMetrics.height() + 8;
|
int rowHeight = option.fontMetrics.height() + 8;
|
||||||
size.setHeight( rowHeight * 2 );
|
size.setHeight( rowHeight * 2 );
|
||||||
@@ -140,15 +140,12 @@ PlaylistItemDelegate::paint( QPainter* painter, const QStyleOptionViewItem& opti
|
|||||||
case PlayableProxyModel::Short:
|
case PlayableProxyModel::Short:
|
||||||
paintShort( painter, option, index );
|
paintShort( painter, option, index );
|
||||||
break;
|
break;
|
||||||
case PlayableProxyModel::ShortWithAvatars:
|
|
||||||
paintShort( painter, option, index, true );
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
PlaylistItemDelegate::paintShort( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index, bool useAvatars ) const
|
PlaylistItemDelegate::paintShort( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const
|
||||||
{
|
{
|
||||||
PlayableItem* item = m_model->itemFromIndex( m_model->mapToSource( index ) );
|
PlayableItem* item = m_model->itemFromIndex( m_model->mapToSource( index ) );
|
||||||
Q_ASSERT( item );
|
Q_ASSERT( item );
|
||||||
@@ -199,21 +196,11 @@ PlaylistItemDelegate::paintShort( QPainter* painter, const QStyleOptionViewItem&
|
|||||||
painter->setPen( opt.palette.text().color() );
|
painter->setPen( opt.palette.text().color() );
|
||||||
|
|
||||||
QRect ir = r.adjusted( 4, 0, -option.rect.width() + option.rect.height() - 8 + r.left(), 0 );
|
QRect ir = r.adjusted( 4, 0, -option.rect.width() + option.rect.height() - 8 + r.left(), 0 );
|
||||||
|
pixmap = item->query()->track()->cover( ir.size(), true );
|
||||||
if ( useAvatars )
|
|
||||||
{
|
|
||||||
if ( item->playbackLog().source )
|
|
||||||
pixmap = item->playbackLog().source->avatar( TomahawkUtils::RoundedCorners, ir.size() );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
pixmap = item->query()->track()->cover( ir.size(), false );
|
|
||||||
|
|
||||||
if ( pixmap.isNull() )
|
if ( pixmap.isNull() )
|
||||||
{
|
{
|
||||||
if ( !useAvatars )
|
pixmap = TomahawkUtils::defaultPixmap( TomahawkUtils::DefaultTrackImage, TomahawkUtils::RoundedCorners, ir.size() );
|
||||||
pixmap = TomahawkUtils::defaultPixmap( TomahawkUtils::DefaultTrackImage, TomahawkUtils::Original, ir.size() );
|
|
||||||
else
|
|
||||||
pixmap = TomahawkUtils::defaultPixmap( TomahawkUtils::DefaultSourceAvatar, TomahawkUtils::RoundedCorners, ir.size() );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
painter->drawPixmap( ir, pixmap );
|
painter->drawPixmap( ir, pixmap );
|
||||||
@@ -344,22 +331,72 @@ PlaylistItemDelegate::drawCover( QPainter* painter, const QRect& rect, PlayableI
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QRect
|
||||||
|
PlaylistItemDelegate::drawLoveBox( QPainter* painter, const QRect& rect, PlayableItem* item, const QModelIndex& index ) const
|
||||||
|
{
|
||||||
|
const int height = rect.height() - 4 * 2;
|
||||||
|
const int width = 2 + rect.height() - 4 * 2;
|
||||||
|
QList< QPixmap > pixmaps = item->query()->queryTrack()->socialActionPixmaps( "Love", height );
|
||||||
|
const int max = 5;
|
||||||
|
const unsigned int count = qMin( pixmaps.count(), max );
|
||||||
|
|
||||||
|
painter->save();
|
||||||
|
|
||||||
|
painter->setRenderHint( QPainter::Antialiasing, true );
|
||||||
|
painter->setBrush( Qt::transparent );
|
||||||
|
QPen pen = painter->pen().color();
|
||||||
|
pen.setWidthF( 0.4 );
|
||||||
|
painter->setPen( pen );
|
||||||
|
|
||||||
|
QRect innerRect = rect.adjusted( rect.width() - width * ( count + 1 ) - 4 * 4, 0, 0, 0 );
|
||||||
|
|
||||||
|
if ( !pixmaps.isEmpty() )
|
||||||
|
painter->drawRoundedRect( innerRect, 4, 4, Qt::RelativeSize );
|
||||||
|
|
||||||
|
unsigned int i = 0;
|
||||||
|
foreach ( QPixmap pixmap, pixmaps )
|
||||||
|
{
|
||||||
|
if ( i >= max )
|
||||||
|
break;
|
||||||
|
|
||||||
|
QRect r = innerRect.adjusted( 4, 4, -4, -4 );
|
||||||
|
r.adjust( width * i, 0, 0, 0 );
|
||||||
|
r.setWidth( width );
|
||||||
|
|
||||||
|
if ( pixmap.isNull() )
|
||||||
|
pixmap = TomahawkUtils::defaultPixmap( TomahawkUtils::DefaultSourceAvatar, TomahawkUtils::Original, QSize( r.height(), r.height() ) );
|
||||||
|
painter->drawPixmap( r.adjusted( 1, 0, -1, 0 ), pixmap );
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
TomahawkUtils::ImageType type = item->query()->queryTrack()->loved() ? TomahawkUtils::Loved : TomahawkUtils::NotLoved;
|
||||||
|
QRect r = innerRect.adjusted( innerRect.width() - rect.height() + 4, 4, -4, -4 );
|
||||||
|
painter->drawPixmap( r, TomahawkUtils::defaultPixmap( type, TomahawkUtils::Original, QSize( r.height(), r.height() ) ) );
|
||||||
|
m_loveButtonRects[ index ] = r;
|
||||||
|
|
||||||
|
painter->restore();
|
||||||
|
return rect;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
QRect
|
QRect
|
||||||
PlaylistItemDelegate::drawSourceIcon( QPainter* painter, const QRect& rect, PlayableItem* item, float height ) const
|
PlaylistItemDelegate::drawSourceIcon( QPainter* painter, const QRect& rect, PlayableItem* item, float height ) const
|
||||||
{
|
{
|
||||||
if ( item->query()->numResults() == 0 )
|
|
||||||
return rect;
|
|
||||||
|
|
||||||
const int sourceIconSize = rect.height() * height;
|
const int sourceIconSize = rect.height() * height;
|
||||||
|
QRect resultRect = rect.adjusted( 0, 0, -( sourceIconSize + 8 ), 0 );
|
||||||
|
if ( item->query()->numResults() == 0 || !item->query()->results().first()->isOnline() )
|
||||||
|
return resultRect;
|
||||||
|
|
||||||
const QPixmap sourceIcon = item->query()->results().first()->sourceIcon( TomahawkUtils::RoundedCorners, QSize( sourceIconSize, sourceIconSize ) );
|
const QPixmap sourceIcon = item->query()->results().first()->sourceIcon( TomahawkUtils::RoundedCorners, QSize( sourceIconSize, sourceIconSize ) );
|
||||||
if ( sourceIcon.isNull() )
|
if ( sourceIcon.isNull() )
|
||||||
return rect;
|
return resultRect;
|
||||||
|
|
||||||
painter->setOpacity( 0.8 );
|
painter->setOpacity( 0.8 );
|
||||||
painter->drawPixmap( QRect( rect.right() - sourceIconSize, rect.center().y() - sourceIconSize / 2, sourceIcon.width(), sourceIcon.height() ), sourceIcon );
|
painter->drawPixmap( QRect( rect.right() - sourceIconSize, rect.center().y() - sourceIconSize / 2, sourceIcon.width(), sourceIcon.height() ), sourceIcon );
|
||||||
painter->setOpacity( 1.0 );
|
painter->setOpacity( 1.0 );
|
||||||
|
|
||||||
return rect.adjusted( 0, 0, -( sourceIcon.width() + 8 ), 0 );
|
return resultRect;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -376,16 +413,23 @@ PlaylistItemDelegate::editorEvent( QEvent* event, QAbstractItemModel* model, con
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool hoveringInfo = false;
|
bool hoveringInfo = false;
|
||||||
|
bool hoveringLove = false;
|
||||||
if ( m_infoButtonRects.contains( index ) )
|
if ( m_infoButtonRects.contains( index ) )
|
||||||
{
|
{
|
||||||
const QRect infoRect = m_infoButtonRects[ index ];
|
const QRect infoRect = m_infoButtonRects[ index ];
|
||||||
const QMouseEvent* ev = static_cast< QMouseEvent* >( event );
|
const QMouseEvent* ev = static_cast< QMouseEvent* >( event );
|
||||||
hoveringInfo = infoRect.contains( ev->pos() );
|
hoveringInfo = infoRect.contains( ev->pos() );
|
||||||
}
|
}
|
||||||
|
if ( m_loveButtonRects.contains( index ) )
|
||||||
|
{
|
||||||
|
const QRect loveRect = m_loveButtonRects[ index ];
|
||||||
|
const QMouseEvent* ev = static_cast< QMouseEvent* >( event );
|
||||||
|
hoveringLove = loveRect.contains( ev->pos() );
|
||||||
|
}
|
||||||
|
|
||||||
if ( event->type() == QEvent::MouseMove )
|
if ( event->type() == QEvent::MouseMove )
|
||||||
{
|
{
|
||||||
if ( hoveringInfo )
|
if ( hoveringInfo || hoveringLove )
|
||||||
m_view->setCursor( Qt::PointingHandCursor );
|
m_view->setCursor( Qt::PointingHandCursor );
|
||||||
else
|
else
|
||||||
m_view->setCursor( Qt::ArrowCursor );
|
m_view->setCursor( Qt::ArrowCursor );
|
||||||
@@ -404,17 +448,21 @@ PlaylistItemDelegate::editorEvent( QEvent* event, QAbstractItemModel* model, con
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// reset mouse cursor. we switch to a pointing hand cursor when hovering an info button
|
// reset mouse cursor. we switch to a pointing hand cursor when hovering a button
|
||||||
m_view->setCursor( Qt::ArrowCursor );
|
m_view->setCursor( Qt::ArrowCursor );
|
||||||
|
|
||||||
if ( hoveringInfo )
|
if ( event->type() == QEvent::MouseButtonRelease )
|
||||||
{
|
{
|
||||||
if ( event->type() == QEvent::MouseButtonRelease )
|
PlayableItem* item = m_model->sourceModel()->itemFromIndex( m_model->mapToSource( index ) );
|
||||||
{
|
if ( !item )
|
||||||
PlayableItem* item = m_model->sourceModel()->itemFromIndex( m_model->mapToSource( index ) );
|
return false;
|
||||||
if ( !item )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
|
if ( hoveringLove )
|
||||||
|
{
|
||||||
|
item->query()->track()->setLoved( !item->query()->track()->loved() );
|
||||||
|
}
|
||||||
|
else if ( hoveringInfo )
|
||||||
|
{
|
||||||
if ( m_model->style() != PlayableProxyModel::Detailed )
|
if ( m_model->style() != PlayableProxyModel::Detailed )
|
||||||
{
|
{
|
||||||
if ( item->query() )
|
if ( item->query() )
|
||||||
@@ -446,10 +494,10 @@ PlaylistItemDelegate::editorEvent( QEvent* event, QAbstractItemModel* model, con
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
event->accept();
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
event->accept();
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@@ -466,6 +514,7 @@ PlaylistItemDelegate::resetHoverIndex()
|
|||||||
|
|
||||||
m_hoveringOver = QModelIndex();
|
m_hoveringOver = QModelIndex();
|
||||||
m_infoButtonRects.clear();
|
m_infoButtonRects.clear();
|
||||||
|
m_loveButtonRects.clear();
|
||||||
|
|
||||||
QModelIndex itemIdx = m_model->mapToSource( idx );
|
QModelIndex itemIdx = m_model->mapToSource( idx );
|
||||||
if ( itemIdx.isValid() )
|
if ( itemIdx.isValid() )
|
||||||
|
@@ -64,9 +64,10 @@ protected:
|
|||||||
QRect drawInfoButton( QPainter* painter, const QRect& rect, const QModelIndex& index, float height ) const;
|
QRect drawInfoButton( QPainter* painter, const QRect& rect, const QModelIndex& index, float height ) const;
|
||||||
QRect drawSourceIcon( QPainter* painter, const QRect& rect, PlayableItem* item, float height ) const;
|
QRect drawSourceIcon( QPainter* painter, const QRect& rect, PlayableItem* item, float height ) const;
|
||||||
QRect drawCover( QPainter* painter, const QRect& rect, PlayableItem* item, const QModelIndex& index ) const;
|
QRect drawCover( QPainter* painter, const QRect& rect, PlayableItem* item, const QModelIndex& index ) const;
|
||||||
|
QRect drawLoveBox( QPainter* painter, const QRect& rect, PlayableItem* item, const QModelIndex& index ) const;
|
||||||
|
|
||||||
void paintDetailed( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const;
|
void paintDetailed( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const;
|
||||||
void paintShort( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index, bool useAvatars = false ) const;
|
void paintShort( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const;
|
||||||
|
|
||||||
QTextOption m_topOption;
|
QTextOption m_topOption;
|
||||||
QTextOption m_bottomOption;
|
QTextOption m_bottomOption;
|
||||||
@@ -87,6 +88,7 @@ protected slots:
|
|||||||
private:
|
private:
|
||||||
mutable QHash< QPersistentModelIndex, QSharedPointer< Tomahawk::PixmapDelegateFader > > m_pixmaps;
|
mutable QHash< QPersistentModelIndex, QSharedPointer< Tomahawk::PixmapDelegateFader > > m_pixmaps;
|
||||||
mutable QHash< QPersistentModelIndex, QRect > m_infoButtonRects;
|
mutable QHash< QPersistentModelIndex, QRect > m_infoButtonRects;
|
||||||
|
mutable QHash< QPersistentModelIndex, QRect > m_loveButtonRects;
|
||||||
QPersistentModelIndex m_hoveringOver;
|
QPersistentModelIndex m_hoveringOver;
|
||||||
|
|
||||||
TrackView* m_view;
|
TrackView* m_view;
|
||||||
|
Reference in New Issue
Block a user