diff --git a/src/libtomahawk/playlist/PlaylistItemDelegate.cpp b/src/libtomahawk/playlist/PlaylistItemDelegate.cpp index 09674d54f..80e07a8ff 100644 --- a/src/libtomahawk/playlist/PlaylistItemDelegate.cpp +++ b/src/libtomahawk/playlist/PlaylistItemDelegate.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include @@ -357,7 +358,7 @@ PlaylistItemDelegate::drawLoveBox( QPainter* painter, const QRect& rect, Playabl QRect avatarsRect = innerRect.adjusted( 4, 4, -4, -4 ); - drawAvatarsForBox( painter, avatarsRect, avatarSize, avatarMargin, count, sources ); + drawAvatarsForBox( painter, avatarsRect, avatarSize, avatarMargin, count, sources, index ); TomahawkUtils::ImageType type = item->query()->queryTrack()->loved() ? TomahawkUtils::Loved : TomahawkUtils::NotLoved; QRect r = innerRect.adjusted( innerRect.width() - rect.height() + 4, 4, -4, -4 ); @@ -369,9 +370,11 @@ PlaylistItemDelegate::drawLoveBox( QPainter* painter, const QRect& rect, Playabl QRect -PlaylistItemDelegate::drawGenericBox( QPainter* painter, const QStyleOptionViewItem& option, +PlaylistItemDelegate::drawGenericBox( QPainter* painter, + const QStyleOptionViewItem& option, const QRect& rect, const QString& text, - const QList< Tomahawk::source_ptr >& sources ) const + const QList< Tomahawk::source_ptr >& sources, + const QModelIndex& index ) const { const int avatarSize = rect.height() - 4 * 2; const int avatarMargin = 2; @@ -397,7 +400,7 @@ PlaylistItemDelegate::drawGenericBox( QPainter* painter, const QStyleOptionViewI drawRectForBox( painter, innerRect ); QRect avatarsRect = innerRect.adjusted( textDoc.idealWidth() + 3*4, 4, -4, -4 ); - drawAvatarsForBox( painter, avatarsRect, avatarSize, avatarMargin, count, sources ); + drawAvatarsForBox( painter, avatarsRect, avatarSize, avatarMargin, count, sources, index ); return rect; } @@ -421,20 +424,20 @@ PlaylistItemDelegate::drawRectForBox( QPainter* painter, const QRect& rect ) con void -PlaylistItemDelegate::drawAvatarsForBox( QPainter* painter, const QRect& avatarsRect, - int avatarSize, int avatarMargin, int count, - const QList< Tomahawk::source_ptr >& sources ) const +PlaylistItemDelegate::drawAvatarsForBox( QPainter* painter, + const QRect& avatarsRect, + int avatarSize, + int avatarMargin, + int count, + const QList< Tomahawk::source_ptr >& sources, + const QModelIndex& index ) const { - QList< QPixmap > pixmaps; - foreach ( const Tomahawk::source_ptr& s, sources ) - { - pixmaps << s->avatar( TomahawkUtils::Original, QSize( avatarSize, avatarSize ) ); - } - painter->save(); + QHash< Tomahawk::source_ptr, QRect > rectsToSave; + unsigned int i = 0; - foreach ( QPixmap pixmap, pixmaps ) + foreach ( const Tomahawk::source_ptr& s, sources ) { if ( i >= count ) break; @@ -442,13 +445,20 @@ PlaylistItemDelegate::drawAvatarsForBox( QPainter* painter, const QRect& avatars QRect r = avatarsRect.adjusted( ( avatarSize + avatarMargin ) * i, 0, 0, 0 ); r.setWidth( avatarSize + avatarMargin ); + QPixmap pixmap = s->avatar( TomahawkUtils::Original, QSize( avatarSize, avatarSize ) ); + if ( pixmap.isNull() ) pixmap = TomahawkUtils::defaultPixmap( TomahawkUtils::DefaultSourceAvatar, TomahawkUtils::Original, QSize( r.height(), r.height() ) ); painter->drawPixmap( r.adjusted( avatarMargin/2, 0, -(avatarMargin/2), 0 ), pixmap ); + rectsToSave.insert( s, r ); + i++; } + if ( !rectsToSave.isEmpty() ) + m_avatarBoxRects.insert( index, rectsToSave ); + painter->restore(); } @@ -511,6 +521,8 @@ PlaylistItemDelegate::editorEvent( QEvent* event, QAbstractItemModel* model, con bool hoveringInfo = false; bool hoveringLove = false; + Tomahawk::source_ptr hoveredAvatar; + QRect hoveredAvatarRect; if ( m_infoButtonRects.contains( index ) ) { const QRect infoRect = m_infoButtonRects[ index ]; @@ -523,6 +535,20 @@ PlaylistItemDelegate::editorEvent( QEvent* event, QAbstractItemModel* model, con const QMouseEvent* ev = static_cast< QMouseEvent* >( event ); hoveringLove = loveRect.contains( ev->pos() ); } + if ( m_avatarBoxRects.contains( index ) ) + { + const QMouseEvent* ev = static_cast< QMouseEvent* >( event ); + for ( QHash< Tomahawk::source_ptr, QRect >::const_iterator it = m_avatarBoxRects[ index ].constBegin(); + it != m_avatarBoxRects[ index ].constEnd(); ++it ) + { + if ( it.value().contains( ev->pos() ) ) + { + hoveredAvatar = it.key(); + hoveredAvatarRect = it.value(); + break; + } + } + } if ( event->type() == QEvent::MouseMove ) { @@ -531,6 +557,15 @@ PlaylistItemDelegate::editorEvent( QEvent* event, QAbstractItemModel* model, con else m_view->setCursor( Qt::ArrowCursor ); + if ( !hoveredAvatar.isNull() ) + { + const QMouseEvent* ev = static_cast< QMouseEvent* >( event ); + QToolTip::showText( m_view->mapToGlobal( hoveredAvatarRect.bottomLeft() ), + hoveredAvatar->friendlyName(), + m_view, + hoveredAvatarRect ); + } + if ( m_hoveringOver != index ) { QPersistentModelIndex ti = m_hoveringOver; diff --git a/src/libtomahawk/playlist/PlaylistItemDelegate.h b/src/libtomahawk/playlist/PlaylistItemDelegate.h index 844d5f71a..856cafaea 100644 --- a/src/libtomahawk/playlist/PlaylistItemDelegate.h +++ b/src/libtomahawk/playlist/PlaylistItemDelegate.h @@ -67,12 +67,24 @@ protected: 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 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; - QRect drawGenericBox( QPainter* painter, const QStyleOptionViewItem& option, const QRect& rect, - const QString& text, const QList< Tomahawk::source_ptr >& sources ) const; + QRect drawLoveBox( QPainter* painter, + const QRect& rect, + PlayableItem* item, + const QModelIndex& index ) const; + QRect drawGenericBox( QPainter* painter, + const QStyleOptionViewItem& option, + const QRect& rect, + const QString& text, + const QList< Tomahawk::source_ptr >& sources, + const QModelIndex& index ) const; void drawRectForBox( QPainter* painter, const QRect& rect ) const; - void drawAvatarsForBox( QPainter* painter, const QRect& avatarsRect, int avatarSize, int avatarMargin, - int count, const QList< Tomahawk::source_ptr >& sources ) const; + void drawAvatarsForBox( QPainter* painter, + const QRect& avatarsRect, + int avatarSize, + int avatarMargin, + int count, + const QList< Tomahawk::source_ptr >& sources, + const QModelIndex& index ) const; void drawRichText( QPainter* painter, const QStyleOptionViewItem& option, const QRect& rect, int flags, QTextDocument& text ) const; void paintDetailed( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const; @@ -98,6 +110,7 @@ private: mutable QHash< QPersistentModelIndex, QSharedPointer< Tomahawk::PixmapDelegateFader > > m_pixmaps; mutable QHash< QPersistentModelIndex, QRect > m_infoButtonRects; mutable QHash< QPersistentModelIndex, QRect > m_loveButtonRects; + mutable QHash< QPersistentModelIndex, QHash< Tomahawk::source_ptr, QRect > > m_avatarBoxRects; QPersistentModelIndex m_hoveringOver; TrackView* m_view; diff --git a/src/libtomahawk/playlist/PlaylistLargeItemDelegate.cpp b/src/libtomahawk/playlist/PlaylistLargeItemDelegate.cpp index 42eacc015..9c8707d06 100644 --- a/src/libtomahawk/playlist/PlaylistLargeItemDelegate.cpp +++ b/src/libtomahawk/playlist/PlaylistLargeItemDelegate.cpp @@ -222,7 +222,7 @@ PlaylistLargeItemDelegate::paint( QPainter* painter, const QStyleOptionViewItem& QString timeString = TomahawkUtils::ageToString( earliestTimestamp, true ); - drawGenericBox( painter, opt, leftRect, timeString, sources ); + drawGenericBox( painter, opt, leftRect, timeString, sources, index ); } else if ( m_mode == RecentlyPlayed ) { @@ -233,7 +233,7 @@ PlaylistLargeItemDelegate::paint( QPainter* painter, const QStyleOptionViewItem& QString playtime = TomahawkUtils::ageToString( QDateTime::fromTime_t( item->playbackLog().timestamp ), true ); - drawGenericBox( painter, opt, leftRect, playtime, sources ); + drawGenericBox( painter, opt, leftRect, playtime, sources, index ); } } else if ( m_mode == LatestAdditions ) @@ -244,7 +244,7 @@ PlaylistLargeItemDelegate::paint( QPainter* painter, const QStyleOptionViewItem& QString modtime = TomahawkUtils::ageToString( QDateTime::fromTime_t( item->query()->results().first()->modificationTime() ), true ); - drawGenericBox( painter, opt, leftRect, modtime, sources ); + drawGenericBox( painter, opt, leftRect, modtime, sources, index ); } } else