bool GridItemDelegate::editorEvent( QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, const QModelIndex& index ) { Q_UNUSED( model ); Q_UNUSED( option ); if ( event->type() != QEvent::MouseButtonRelease && event->type() != QEvent::MouseMove && event->type() != QEvent::MouseButtonPress && event->type() != QEvent::Leave ) return false; bool hoveringArtist = false; if ( m_artistNameRects.contains( index ) ) { const QRect artistNameRect = m_artistNameRects[ index ]; const QMouseEvent* ev = static_cast< QMouseEvent* >( event ); hoveringArtist = artistNameRect.contains( ev->pos() ); } if ( event->type() == QEvent::MouseMove ) { if ( hoveringArtist ) m_view->setCursor( Qt::PointingHandCursor ); else m_view->setCursor( Qt::ArrowCursor ); foreach ( const QModelIndex& idx, m_playButton.keys() ) { if ( index != idx ) m_playButton.take( idx )->deleteLater(); } if ( !m_playButton.contains( index ) && !m_spinner.contains( index ) && !m_pauseButton.contains( index ) ) { foreach ( ImageButton* button, m_playButton ) button->deleteLater(); m_playButton.clear(); ImageButton* button = new ImageButton( m_view ); button->setPixmap( RESPATH "images/play-rest.png" ); button->setPixmap( RESPATH "images/play-pressed.png", QIcon::Off, QIcon::Active ); button->setFixedSize( 48, 48 ); button->move( option.rect.center() - QPoint( 23, 23 ) ); button->setContentsMargins( 0, 0, 0, 0 ); button->setFocusPolicy( Qt::NoFocus ); button->installEventFilter( this ); button->show(); NewClosure( button, SIGNAL( clicked( bool ) ), const_cast<GridItemDelegate*>(this), SLOT( onPlayClicked( QPersistentModelIndex ) ), QPersistentModelIndex( index ) ); m_playButton[ index ] = button; } if ( m_hoveringOver != index || ( !hoveringArtist && m_hoveringOver.isValid() ) ) { emit updateIndex( m_hoveringOver ); if ( hoveringArtist ) m_hoveringOver = index; else m_hoveringOver = QPersistentModelIndex(); emit updateIndex( index ); } if ( m_hoverIndex != index ) { if ( m_hoverIndex.isValid() ) { QTimeLine* fadeOut = createTimeline( QTimeLine::Forward ); _detail::Closure* c = NewClosure( fadeOut, SIGNAL( frameChanged( int ) ), this, SLOT( fadingFrameChanged( QPersistentModelIndex ) ), QPersistentModelIndex( m_hoverIndex ) ); c->setAutoDelete( false ); c = NewClosure( fadeOut, SIGNAL( finished() ), this, SLOT( fadingFrameFinished( QPersistentModelIndex ) ), QPersistentModelIndex( m_hoverIndex ) ); c->setAutoDelete( false ); m_hoverFaders[ m_hoverIndex ] = fadeOut; fadeOut->start(); } emit updateIndex( m_hoverIndex ); m_hoverIndex = index; QTimeLine* fadeIn = createTimeline( QTimeLine::Backward ); _detail::Closure* c = NewClosure( fadeIn, SIGNAL( frameChanged( int ) ), this, SLOT( fadingFrameChanged( QPersistentModelIndex ) ), QPersistentModelIndex( index ) ); c->setAutoDelete( false ); c = NewClosure( fadeIn, SIGNAL( finished() ), this, SLOT( fadingFrameFinished( QPersistentModelIndex ) ), QPersistentModelIndex( index ) ); c->setAutoDelete( false ); m_hoverFaders[ index ] = fadeIn; fadeIn->start(); emit updateIndex( index ); }
bool GridItemDelegate::editorEvent( QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, const QModelIndex& index ) { Q_UNUSED( model ); Q_UNUSED( option ); if ( event->type() != QEvent::MouseButtonRelease && event->type() != QEvent::MouseMove && event->type() != QEvent::MouseButtonPress && event->type() != QEvent::Leave ) return false; const QMouseEvent* ev = static_cast< QMouseEvent* >( event ); bool hoveringArtist = false; bool hoveringAlbum = false; bool hoveringBuyButton = false; if ( m_artistNameRects.contains( index ) ) { const QRect artistNameRect = m_artistNameRects[ index ]; hoveringArtist = artistNameRect.contains( ev->pos() ); } if ( m_albumNameRects.contains( index ) ) { const QRect albumNameRect = m_albumNameRects[ index ]; hoveringAlbum = albumNameRect.contains( ev->pos() ); } if ( m_buyButtonRects.contains( index ) ) { const QRect buyButtonRect = m_buyButtonRects[ index ]; hoveringBuyButton = buyButtonRect.contains( ev->pos() ); } QRect coverRect = m_view->visualRect( index ); coverRect.setHeight( coverRect.width() ); const bool hoveringCover = coverRect.contains( ev->pos() ); if ( event->type() == QEvent::MouseMove ) { if ( hoveringArtist || hoveringAlbum || hoveringBuyButton ) m_view->setCursor( Qt::PointingHandCursor ); else m_view->setCursor( Qt::ArrowCursor ); foreach ( const QModelIndex& idx, m_hoverControls.keys() ) { if ( index != idx ) m_hoverControls.take( idx )->deleteLater(); } if ( hoveringCover && !m_hoverControls.contains( index ) && !m_spinner.contains( index ) ) { foreach ( HoverControls* control, m_hoverControls ) control->deleteLater(); m_hoverControls.clear(); QRect cRect = option.rect; cRect.setHeight( cRect.width() ); HoverControls* controls = new HoverControls( m_view ); controls->setFixedSize( m_margin * 2, m_margin + m_margin / 4 ); controls->move( cRect.center() - QPoint( controls->width() / 2 -1, controls->height() / 2 -1 ) ); controls->setContentsMargins( 0, 0, 0, 0 ); controls->setFocusPolicy( Qt::NoFocus ); controls->installEventFilter( this ); controls->show(); NewClosure( controls, SIGNAL( play() ), const_cast<GridItemDelegate*>(this), SLOT( onPlayClicked( QPersistentModelIndex ) ), QPersistentModelIndex( index ) ); m_hoverControls[ index ] = controls; } if ( m_hoveringOverArtist != index || ( !hoveringArtist && m_hoveringOverArtist.isValid() ) ) { emit updateIndex( m_hoveringOverArtist ); if ( hoveringArtist ) m_hoveringOverArtist = index; else 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 ); } if ( m_hoveringOverBuyButton != index || ( !hoveringBuyButton && m_hoveringOverBuyButton.isValid() ) ) { emit updateIndex( m_hoveringOverBuyButton ); if ( hoveringBuyButton ) m_hoveringOverBuyButton = index; else m_hoveringOverBuyButton = QPersistentModelIndex(); emit updateIndex( index ); } if ( m_hoverIndex != index || !hoveringCover ) { if ( m_hoverIndex.isValid() ) { int startFrame = 100; if ( m_hoverFaders.contains( m_hoverIndex ) ) { QTimeLine* oldFader = m_hoverFaders.take( m_hoverIndex ); startFrame = oldFader->currentFrame(); oldFader->deleteLater(); } QTimeLine* fadeOut = createTimeline( QTimeLine::Backward, startFrame ); _detail::Closure* c = NewClosure( fadeOut, SIGNAL( frameChanged( int ) ), this, SLOT( fadingFrameChanged( QPersistentModelIndex ) ), QPersistentModelIndex( m_hoverIndex ) ); c->setAutoDelete( false ); c = NewClosure( fadeOut, SIGNAL( finished() ), this, SLOT( fadingFrameFinished( QPersistentModelIndex ) ), QPersistentModelIndex( m_hoverIndex ) ); c->setAutoDelete( false ); m_hoverFaders[ m_hoverIndex ] = fadeOut; fadeOut->start(); } emit updateIndex( m_hoverIndex ); foreach ( HoverControls* controls, m_hoverControls ) controls->deleteLater(); m_hoverControls.clear(); m_hoverIndex = QPersistentModelIndex(); } if ( hoveringCover && m_hoverIndex != index ) { m_hoverIndex = index; int startFrame = 0; if ( m_hoverFaders.contains( index ) ) { QTimeLine* oldFader = m_hoverFaders.take( index ); startFrame = oldFader->currentFrame(); oldFader->deleteLater(); } QTimeLine* fadeIn = createTimeline( QTimeLine::Forward, startFrame ); _detail::Closure* c = NewClosure( fadeIn, SIGNAL( frameChanged( int ) ), this, SLOT( fadingFrameChanged( QPersistentModelIndex ) ), QPersistentModelIndex( index ) ); c->setAutoDelete( false ); c = NewClosure( fadeIn, SIGNAL( finished() ), this, SLOT( fadingFrameFinished( QPersistentModelIndex ) ), QPersistentModelIndex( index ) ); c->setAutoDelete( false ); m_hoverFaders[ index ] = fadeIn; fadeIn->start(); emit updateIndex( index ); }