1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-03-23 01:09:42 +01:00

Try out some fading

This commit is contained in:
Leo Franchi 2012-05-24 21:05:35 -04:00
parent 216e43a502
commit 052093f1ea
3 changed files with 97 additions and 38 deletions

View File

@ -23,6 +23,7 @@
#include <QPainter>
#include <QAbstractItemView>
#include <QMouseEvent>
#include <QTimeLine>
#include "Artist.h"
#include "Query.h"
@ -42,6 +43,10 @@
#include "widgets/ImageButton.h"
#include "utils/Logger.h"
namespace {
static const int FADE_DURATION = 90;
};
AlbumItemDelegate::AlbumItemDelegate( QAbstractItemView* parent, AlbumProxyModel* proxy )
: QStyledItemDelegate( (QObject*)parent )
@ -50,7 +55,7 @@ AlbumItemDelegate::AlbumItemDelegate( QAbstractItemView* parent, AlbumProxyModel
{
if ( m_view && m_view->metaObject()->indexOfSignal( "modelChanged()" ) > -1 )
connect( m_view, SIGNAL( modelChanged() ), this, SLOT( modelChanged() ) );
connect( m_view, SIGNAL( scrolledContents( int, int ) ), SLOT( onScrolled( int, int ) ) );
}
@ -121,33 +126,28 @@ AlbumItemDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option,
const QPixmap cover = fader->currentPixmap();
if ( false && option.state & QStyle::State_Selected )
{
#if defined(Q_WS_MAC) || defined(Q_WS_WIN)
painter->save();
QPainterPath border;
border.addRoundedRect( r.adjusted( -2, -2, 2, 2 ), 3, 3 );
QPen borderPen( QColor( 86, 170, 243 ) );
borderPen.setWidth( 5 );
painter->setPen( borderPen );
painter->drawPath( border );
painter->restore();
#else
opt.palette.setColor( QPalette::Text, opt.palette.color( QPalette::HighlightedText ) );
#endif
}
painter->drawPixmap( r, cover );
if ( m_hoverIndex == index )
qreal opacity = -1.;
if ( m_hoverFaders.contains( index ) )
{
const qreal pct = ( m_hoverFaders[ index ]->currentFrame() / 100. );
opacity = 0.15 - pct * 0.15;
}
else if ( m_hoverIndex != index )
{
opacity = 0.15;
}
if ( opacity > -1. )
{
painter->save();
painter->setPen( QColor( 33, 33, 33 ) );
painter->setBrush( QColor( 33, 33, 33 ) );
painter->setOpacity( 0.5 );
painter->setPen( QColor( 240, 240, 240 ) );
painter->setBrush( QColor( 240, 240, 240 ) );
painter->setOpacity( opacity );
painter->drawRect( r );
painter->restore();
@ -236,12 +236,12 @@ AlbumItemDelegate::onPlayClicked( const QPersistentModelIndex& index )
spinner->installEventFilter( this );
m_spinner[ index ] = spinner;
PlayableItem* item = m_model->sourceModel()->itemFromIndex( m_model->mapToSource( index ) );
if ( item )
{
_detail::Closure* closure;
closure = NewClosure( AudioEngine::instance(), SIGNAL( loading( Tomahawk::result_ptr ) ),
const_cast<AlbumItemDelegate*>(this), SLOT( onPlaybackStarted( QPersistentModelIndex ) ), QPersistentModelIndex( index ) );
@ -276,8 +276,8 @@ AlbumItemDelegate::editorEvent( QEvent* event, QAbstractItemModel* model, const
bool hoveringArtist = false;
if ( m_artistNameRects.contains( index ) )
{
QRect artistNameRect = m_artistNameRects[ index ];
QMouseEvent* ev = static_cast< QMouseEvent* >( event );
const QRect artistNameRect = m_artistNameRects[ index ];
const QMouseEvent* ev = static_cast< QMouseEvent* >( event );
hoveringArtist = artistNameRect.contains( ev->pos() );
}
@ -288,7 +288,7 @@ AlbumItemDelegate::editorEvent( QEvent* event, QAbstractItemModel* model, const
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 )
@ -304,7 +304,7 @@ AlbumItemDelegate::editorEvent( QEvent* event, QAbstractItemModel* model, const
button->setFocusPolicy( Qt::NoFocus );
button->installEventFilter( this );
button->show();
NewClosure( button, SIGNAL( clicked( bool ) ),
const_cast<AlbumItemDelegate*>(this), SLOT( onPlayClicked( QPersistentModelIndex ) ), QPersistentModelIndex( index ) );
@ -325,11 +325,32 @@ AlbumItemDelegate::editorEvent( QEvent* event, QAbstractItemModel* model, const
if ( m_hoverIndex != index )
{
if ( m_hoverIndex.isValid() )
{
QTimeLine* fadeOut = createTimeline( QTimeLine::Backward );
_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::Forward );
_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 );
}
event->accept();
return true;
}
@ -443,7 +464,7 @@ AlbumItemDelegate::onPlaylistChanged( const QPersistentModelIndex& index )
if ( AudioEngine::instance()->currentTrackPlaylist() != item->artist()->playlistInterface( Tomahawk::Mixed ) )
finished = true;
}
if ( finished )
{
if ( m_pauseButton.contains( index ) )
@ -468,7 +489,7 @@ AlbumItemDelegate::onPlaybackStarted( const QPersistentModelIndex& index )
delete widget;
}
m_spinner.clear();
ImageButton* button = new ImageButton( m_view );
button->setPixmap( RESPATH "images/pause-rest.png" );
button->setPixmap( RESPATH "images/pause-pressed.png", QIcon::Off, QIcon::Active );
@ -478,13 +499,45 @@ AlbumItemDelegate::onPlaybackStarted( const QPersistentModelIndex& index )
button->setFocusPolicy( Qt::NoFocus );
button->installEventFilter( this );
button->show();
connect( button, SIGNAL( clicked( bool ) ), AudioEngine::instance(), SLOT( playPause() ) );
m_pauseButton[ index ] = button;
}
void
AlbumItemDelegate::fadingFrameChanged( const QPersistentModelIndex& idx )
{
emit updateIndex( idx );
}
void
AlbumItemDelegate::fadingFrameFinished( const QPersistentModelIndex& idx )
{
if ( m_hoverFaders.contains( idx ) )
{
m_hoverFaders.take( idx )->deleteLater();
emit updateIndex( idx );
}
}
QTimeLine*
AlbumItemDelegate::createTimeline( QTimeLine::Direction direction )
{
QTimeLine* timeline = new QTimeLine( FADE_DURATION, this );
timeline->setDirection( direction );
timeline->setCurveShape( QTimeLine::LinearCurve );
timeline->setUpdateInterval( 30 );
timeline->setStartFrame( 0 );
timeline->setEndFrame( 100 );
return timeline;
}
bool
AlbumItemDelegate::eventFilter( QObject* obj, QEvent* event )
{

View File

@ -21,9 +21,11 @@
#define ALBUMITEMDELEGATE_H
#include <QStyledItemDelegate>
#include <QTimeLine>
#include "DllMacro.h"
class QTimeLine;
namespace Tomahawk {
class PixmapDelegateFader;
}
@ -52,15 +54,19 @@ signals:
private slots:
void modelChanged();
void doUpdateIndex( const QPersistentModelIndex& idx );
void onScrolled( int dx, int dy );
void onPlaybackStarted( const QPersistentModelIndex& index );
void onPlaybackFinished();
void onPlayClicked( const QPersistentModelIndex& index );
void onPlaylistChanged( const QPersistentModelIndex& index );
void fadingFrameChanged( const QPersistentModelIndex& );
void fadingFrameFinished( const QPersistentModelIndex& );
private:
QTimeLine* createTimeline( QTimeLine::Direction direction );
QAbstractItemView* m_view;
AlbumProxyModel* m_model;
@ -75,6 +81,8 @@ private:
mutable QHash< QPersistentModelIndex, QWidget* > m_spinner;
mutable QHash< QPersistentModelIndex, ImageButton* > m_playButton;
mutable QHash< QPersistentModelIndex, ImageButton* > m_pauseButton;
mutable QHash< QPersistentModelIndex, QTimeLine* > m_hoverFaders;
};
#endif // ALBUMITEMDELEGATE_H

View File

@ -29,8 +29,6 @@
using namespace Tomahawk;
#define COVER_FADEIN 1000
QWeakPointer< TomahawkUtils::SharedTimeLine > PixmapDelegateFader::s_stlInstance = QWeakPointer< TomahawkUtils::SharedTimeLine >();
@ -126,7 +124,7 @@ void
PixmapDelegateFader::setSize( const QSize& size )
{
m_size = size;
if ( m_defaultImage )
{
// No cover loaded yet, use default and don't fade in