1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-08-07 14:46:33 +02:00

* Hover action on album name in GridView.

This commit is contained in:
Christian Muehlhaeuser
2014-08-20 10:44:57 +02:00
parent 6606365974
commit ec5473cbcb
2 changed files with 79 additions and 13 deletions

View File

@@ -201,7 +201,7 @@ GridItemDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option,
if ( oneLiner ) if ( oneLiner )
{ {
// If the user is hovering over an artist rect, draw a background so they knows it's clickable // If the user is hovering over an artist rect, draw a background so they knows it's clickable
if ( m_hoveringOver == index ) if ( m_hoveringOverArtist == index )
{ {
QFont f = painter->font(); QFont f = painter->font();
f.setUnderline( true ); f.setUnderline( true );
@@ -213,19 +213,35 @@ GridItemDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option,
painter->drawText( textRect, text, to ); painter->drawText( textRect, text, to );
// Calculate rect of artist on-hover button click area // Calculate rect of artist on-hover button click area
m_artistNameRects[ index ] = painter->fontMetrics().boundingRect( textRect, Qt::AlignLeft | Qt::AlignVCenter, text ); m_artistNameRects[ index ] = painter->fontMetrics().boundingRect( textRect, Qt::AlignLeft | Qt::AlignTop, text );
} }
else else
{ {
painter->save();
// If the user is hovering over an album rect, underline the album name
if ( m_hoveringOverAlbum == index )
{
QFont f = painter->font();
f.setUnderline( true );
painter->setFont( f );
}
to.setAlignment( Qt::AlignLeft | Qt::AlignTop ); to.setAlignment( Qt::AlignLeft | Qt::AlignTop );
text = painter->fontMetrics().elidedText( top, Qt::ElideRight, textRect.width() - 3 ); text = painter->fontMetrics().elidedText( top, Qt::ElideRight, textRect.width() - 3 );
painter->drawText( textRect, text, to ); painter->drawText( textRect, text, to );
if ( item->album() )
{
// Calculate rect of album on-hover button click area
m_albumNameRects[ index ] = painter->fontMetrics().boundingRect( textRect, Qt::AlignLeft | Qt::AlignTop, text );
}
painter->restore();
painter->setOpacity( 0.5 ); painter->setOpacity( 0.5 );
painter->setFont( smallFont ); painter->setFont( smallFont );
// If the user is hovering over an artist rect, draw a background so they knows it's clickable // If the user is hovering over an artist rect, underline the artist name
if ( m_hoveringOver == index ) if ( m_hoveringOverArtist == index )
{ {
QFont f = painter->font(); QFont f = painter->font();
f.setUnderline( true ); f.setUnderline( true );
@@ -295,16 +311,23 @@ GridItemDelegate::editorEvent( QEvent* event, QAbstractItemModel* model, const Q
return false; return false;
bool hoveringArtist = false; bool hoveringArtist = false;
bool hoveringAlbum = false;
if ( m_artistNameRects.contains( index ) ) if ( m_artistNameRects.contains( index ) )
{ {
const QRect artistNameRect = m_artistNameRects[ index ]; const QRect artistNameRect = m_artistNameRects[ index ];
const QMouseEvent* ev = static_cast< QMouseEvent* >( event ); const QMouseEvent* ev = static_cast< QMouseEvent* >( event );
hoveringArtist = artistNameRect.contains( ev->pos() ); hoveringArtist = artistNameRect.contains( ev->pos() );
} }
if ( m_albumNameRects.contains( index ) )
{
const QRect albumNameRect = m_albumNameRects[ index ];
const QMouseEvent* ev = static_cast< QMouseEvent* >( event );
hoveringAlbum = albumNameRect.contains( ev->pos() );
}
if ( event->type() == QEvent::MouseMove ) if ( event->type() == QEvent::MouseMove )
{ {
if ( hoveringArtist ) if ( hoveringArtist || hoveringAlbum )
m_view->setCursor( Qt::PointingHandCursor ); m_view->setCursor( Qt::PointingHandCursor );
else else
m_view->setCursor( Qt::ArrowCursor ); m_view->setCursor( Qt::ArrowCursor );
@@ -338,14 +361,25 @@ GridItemDelegate::editorEvent( QEvent* event, QAbstractItemModel* model, const Q
m_hoverControls[ index ] = controls; m_hoverControls[ index ] = controls;
} }
if ( m_hoveringOver != index || ( !hoveringArtist && m_hoveringOver.isValid() ) ) if ( m_hoveringOverArtist != index || ( !hoveringArtist && m_hoveringOverArtist.isValid() ) )
{ {
emit updateIndex( m_hoveringOver ); emit updateIndex( m_hoveringOverArtist );
if ( hoveringArtist ) if ( hoveringArtist )
m_hoveringOver = index; m_hoveringOverArtist = index;
else else
m_hoveringOver = QPersistentModelIndex(); m_hoveringOverArtist = QPersistentModelIndex();
emit updateIndex( index );
}
if ( m_hoveringOverAlbum != index || ( !hoveringAlbum && m_hoveringOverAlbum.isValid() ) )
{
emit updateIndex( m_hoveringOverAlbum );
if ( hoveringAlbum )
m_hoveringOverAlbum = index;
else
m_hoveringOverAlbum = QPersistentModelIndex();
emit updateIndex( index ); emit updateIndex( index );
} }
@@ -426,6 +460,29 @@ GridItemDelegate::editorEvent( QEvent* event, QAbstractItemModel* model, const Q
return true; return true;
} }
} }
if ( hoveringAlbum )
{
if ( event->type() == QEvent::MouseButtonRelease )
{
PlayableItem* item = m_model->sourceModel()->itemFromIndex( m_model->mapToSource( index ) );
if ( !item )
return false;
if ( item->query() )
ViewManager::instance()->show( item->query()->track()->albumPtr() );
else if ( item->album() )
ViewManager::instance()->show( item->album() );
event->accept();
return true;
}
else if ( event->type() == QEvent::MouseButtonPress )
{
// Stop the whole album from having a down click action as we just want the album name to be clicked
event->accept();
return true;
}
}
return false; return false;
} }
@@ -435,7 +492,9 @@ void
GridItemDelegate::modelChanged() GridItemDelegate::modelChanged()
{ {
m_artistNameRects.clear(); m_artistNameRects.clear();
m_hoveringOver = QPersistentModelIndex(); m_albumNameRects.clear();
m_hoveringOverArtist = QPersistentModelIndex();
m_hoveringOverAlbum = QPersistentModelIndex();
m_hoverIndex = QPersistentModelIndex(); m_hoverIndex = QPersistentModelIndex();
clearButtons(); clearButtons();
@@ -552,9 +611,14 @@ GridItemDelegate::resetHoverIndex()
} }
emit updateIndex( m_hoverIndex ); emit updateIndex( m_hoverIndex );
QModelIndex idx = m_hoveringOver;
m_hoveringOver = QPersistentModelIndex();
m_hoverIndex = QPersistentModelIndex(); m_hoverIndex = QPersistentModelIndex();
QModelIndex idx = m_hoveringOverArtist;
m_hoveringOverArtist = QPersistentModelIndex();
doUpdateIndex( idx );
idx = m_hoveringOverAlbum;
m_hoveringOverAlbum = QPersistentModelIndex();
doUpdateIndex( idx ); doUpdateIndex( idx );
} }

View File

@@ -89,10 +89,12 @@ private:
QSize m_itemSize; QSize m_itemSize;
mutable QHash< QPersistentModelIndex, QRect > m_artistNameRects; mutable QHash< QPersistentModelIndex, QRect > m_artistNameRects;
mutable QHash< QPersistentModelIndex, QRect > m_albumNameRects;
mutable QHash< QPersistentModelIndex, QSharedPointer< Tomahawk::PixmapDelegateFader > > m_covers; mutable QHash< QPersistentModelIndex, QSharedPointer< Tomahawk::PixmapDelegateFader > > m_covers;
QPersistentModelIndex m_hoverIndex; QPersistentModelIndex m_hoverIndex;
QPersistentModelIndex m_hoveringOver; QPersistentModelIndex m_hoveringOverArtist;
QPersistentModelIndex m_hoveringOverAlbum;
QPixmap m_shadowPixmap; QPixmap m_shadowPixmap;
mutable QHash< QPersistentModelIndex, QWidget* > m_spinner; mutable QHash< QPersistentModelIndex, QWidget* > m_spinner;