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

* Handle source-icon and info-icon painting in the base delegate class.

This commit is contained in:
Christian Muehlhaeuser 2013-06-10 10:36:07 +02:00
parent 29c08dede7
commit 29a2c1e904
2 changed files with 143 additions and 14 deletions

View File

@ -22,6 +22,7 @@
#include <QApplication>
#include <QPainter>
#include <QMouseEvent>
#include <boost/concept_check.hpp>
#include "Query.h"
#include "Result.h"
@ -37,6 +38,8 @@
#include "ViewHeader.h"
#include "ViewManager.h"
#include "utils/PixmapDelegateFader.h"
#include "utils/Closure.h"
#include "utils/TomahawkUtilsGui.h"
#include "utils/Logger.h"
@ -45,16 +48,42 @@ using namespace Tomahawk;
PlaylistItemDelegate::PlaylistItemDelegate( TrackView* parent, PlayableProxyModel* proxy )
: QStyledItemDelegate( (QObject*)parent )
, m_smallBoldFontMetrics( QFontMetrics( parent->font() ) )
, m_bigBoldFontMetrics( QFontMetrics( parent->font() ) )
, m_view( parent )
, m_model( proxy )
{
connect( this, SIGNAL( updateIndex( QModelIndex ) ), parent, SLOT( update( QModelIndex ) ) );
m_topOption = QTextOption( Qt::AlignTop );
m_topOption.setWrapMode( QTextOption::NoWrap );
m_bottomOption = QTextOption( Qt::AlignBottom );
m_bottomOption.setWrapMode( QTextOption::NoWrap );
m_centerOption = QTextOption( Qt::AlignVCenter );
m_centerOption.setWrapMode( QTextOption::NoWrap );
m_centerRightOption = QTextOption( Qt::AlignVCenter | Qt::AlignRight );
m_centerRightOption.setWrapMode( QTextOption::NoWrap );
m_bigBoldFont = parent->font();
m_bigBoldFont.setPointSize( TomahawkUtils::defaultFontSize() + 2 );
m_bigBoldFont.setWeight( 99 );
m_boldFont = parent->font();
m_boldFont.setBold( true );
m_smallBoldFont = parent->font();
m_smallBoldFont.setPointSize( TomahawkUtils::defaultFontSize() - 1 );
m_smallBoldFont.setBold( true );
m_smallBoldFont.setWeight( 60 );
m_smallFont = parent->font();
m_smallFont.setPointSize( TomahawkUtils::defaultFontSize() - 1 );
m_bigBoldFontMetrics = QFontMetrics( m_bigBoldFont );
m_smallBoldFontMetrics = QFontMetrics( m_smallBoldFont );
connect( this, SIGNAL( updateIndex( QModelIndex ) ), parent, SLOT( update( QModelIndex ) ) );
connect( proxy, SIGNAL( modelReset() ), SLOT( modelChanged() ) );
connect( parent, SIGNAL( modelChanged() ), SLOT( modelChanged() ) );
}
@ -187,11 +216,8 @@ PlaylistItemDelegate::paintShort( QPainter* painter, const QStyleOptionViewItem&
painter->drawPixmap( ir, pixmap );
QFont boldFont = opt.font;
boldFont.setBold( true );
r.adjust( ir.width() + 12, 0, -12, 0 );
painter->setFont( boldFont );
painter->setFont( m_boldFont );
QString text = painter->fontMetrics().elidedText( upperText, Qt::ElideRight, r.width() );
painter->drawText( r.adjusted( 0, 1, 0, 0 ), text, m_topOption );
@ -226,9 +252,7 @@ PlaylistItemDelegate::paintDetailed( QPainter* painter, const QStyleOptionViewIt
{
opt.rect.setWidth( opt.rect.width() - opt.rect.height() - 2 );
const QRect arrowRect( opt.rect.x() + opt.rect.width(), opt.rect.y() + 1, opt.rect.height() - 2, opt.rect.height() - 2 );
painter->drawPixmap( arrowRect, TomahawkUtils::defaultPixmap( TomahawkUtils::InfoIcon, TomahawkUtils::Original, arrowRect.size() ) );
m_infoButtonRects[ index ] = arrowRect;
drawInfoButton( painter, arrowRect, index, 0.9 );
}
painter->save();
@ -285,6 +309,58 @@ PlaylistItemDelegate::paintDetailed( QPainter* painter, const QStyleOptionViewIt
}
QRect
PlaylistItemDelegate::drawInfoButton( QPainter* painter, const QRect& rect, const QModelIndex& index, float height ) const
{
const int iconSize = rect.height() * height;
QRect pixmapRect = QRect( ( rect.height() - iconSize ) / 2 + rect.left(), rect.center().y() - iconSize / 2, iconSize, iconSize );
painter->drawPixmap( pixmapRect, TomahawkUtils::defaultPixmap( TomahawkUtils::InfoIcon, TomahawkUtils::Original, pixmapRect.size() ) );
m_infoButtonRects[ index ] = pixmapRect;
return rect.adjusted( rect.height(), 0, 0, 0 );
}
QRect
PlaylistItemDelegate::drawCover( QPainter* painter, const QRect& rect, PlayableItem* item, const QModelIndex& index ) const
{
QRect pixmapRect = rect;
pixmapRect.setWidth( pixmapRect.height() );
if ( !m_pixmaps.contains( index ) )
{
m_pixmaps.insert( index, QSharedPointer< Tomahawk::PixmapDelegateFader >( new Tomahawk::PixmapDelegateFader( item->query(), pixmapRect.size(), TomahawkUtils::RoundedCorners, false ) ) );
_detail::Closure* closure = NewClosure( m_pixmaps[ index ], SIGNAL( repaintRequest() ), const_cast<PlaylistItemDelegate*>(this), SLOT( doUpdateIndex( const QPersistentModelIndex& ) ), QPersistentModelIndex( index ) );
closure->setAutoDelete( false );
}
const QPixmap pixmap = m_pixmaps[ index ]->currentPixmap();
painter->drawPixmap( pixmapRect, pixmap );
return rect.adjusted( pixmapRect.width(), 0, 0, 0 );
}
QRect
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 QPixmap sourceIcon = item->query()->results().first()->sourceIcon( TomahawkUtils::RoundedCorners, QSize( sourceIconSize, sourceIconSize ) );
if ( sourceIcon.isNull() )
return rect;
painter->setOpacity( 0.8 );
painter->drawPixmap( QRect( rect.right() - sourceIconSize, rect.center().y() - sourceIconSize / 2, sourceIcon.width(), sourceIcon.height() ), sourceIcon );
painter->setOpacity( 1.0 );
return rect.adjusted( 0, 0, -( sourceIcon.width() + 8 ), 0 );
}
bool
PlaylistItemDelegate::editorEvent( QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, const QModelIndex& index )
{
@ -314,9 +390,11 @@ PlaylistItemDelegate::editorEvent( QEvent* event, QAbstractItemModel* model, con
if ( m_hoveringOver != index )
{
PlayableItem* item = m_model->sourceModel()->itemFromIndex( m_model->mapToSource( index ) );
item->requestRepaint();
QPersistentModelIndex ti = m_hoveringOver;
m_hoveringOver = index;
PlayableItem* item = m_model->sourceModel()->itemFromIndex( m_model->mapToSource( ti ) );
item->requestRepaint();
emit updateIndex( m_hoveringOver );
}
@ -379,6 +457,33 @@ PlaylistItemDelegate::editorEvent( QEvent* event, QAbstractItemModel* model, con
void
PlaylistItemDelegate::resetHoverIndex()
{
if ( !m_model )
return;
QPersistentModelIndex idx = m_hoveringOver;
m_hoveringOver = QModelIndex();
m_infoButtonRects.clear();
PlayableItem* item = m_model->sourceModel()->itemFromIndex( m_model->mapToSource( idx ) );
if ( item )
item->requestRepaint();
emit updateIndex( idx );
m_view->repaint();
}
void
PlaylistItemDelegate::modelChanged()
{
m_pixmaps.clear();
}
void
PlaylistItemDelegate::doUpdateIndex( const QPersistentModelIndex& index )
{
if ( index.isValid() )
emit updateIndex( index );
}

View File

@ -29,6 +29,10 @@ class PlayableItem;
class PlayableProxyModel;
class TrackView;
namespace Tomahawk {
class PixmapDelegateFader;
}
class DLLEXPORT PlaylistItemDelegate : public QStyledItemDelegate
{
Q_OBJECT
@ -46,6 +50,9 @@ public slots:
signals:
void updateIndex( const QModelIndex& idx );
private slots:
void doUpdateIndex( const QPersistentModelIndex& index );
protected:
void prepareStyleOption( QStyleOptionViewItemV4* option, const QModelIndex& index, PlayableItem* item ) const;
@ -53,15 +60,32 @@ protected:
bool editorEvent( QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, const QModelIndex& index );
QPersistentModelIndex hoveringOver() const { return m_hoveringOver; }
void setInfoButtonRect( const QPersistentModelIndex& index, const QRect& rect ) const { m_infoButtonRects[ index ] = rect; }
private:
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;
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;
QTextOption m_topOption;
QTextOption m_bottomOption;
QTextOption m_centerOption;
QTextOption m_centerRightOption;
QFont m_smallFont;
QFont m_smallBoldFont;
QFont m_boldFont;
QFont m_bigBoldFont;
QFontMetrics m_smallBoldFontMetrics;
QFontMetrics m_bigBoldFontMetrics;
protected slots:
virtual void modelChanged();
private:
mutable QHash< QPersistentModelIndex, QSharedPointer< Tomahawk::PixmapDelegateFader > > m_pixmaps;
mutable QHash< QPersistentModelIndex, QRect > m_infoButtonRects;
QPersistentModelIndex m_hoveringOver;