From 056ff3b8ceec2f33fa3c719afd34aaf5b93cd562 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Tue, 4 Nov 2014 16:52:11 +0100 Subject: [PATCH] Word-wrapping setting for GridItemDelegate so we can accurately determine the size before content got loaded. --- src/libtomahawk/playlist/GridItemDelegate.cpp | 35 +++++++++++-------- src/libtomahawk/playlist/GridItemDelegate.h | 4 +++ 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/libtomahawk/playlist/GridItemDelegate.cpp b/src/libtomahawk/playlist/GridItemDelegate.cpp index 63f7986a7..8289cee0b 100644 --- a/src/libtomahawk/playlist/GridItemDelegate.cpp +++ b/src/libtomahawk/playlist/GridItemDelegate.cpp @@ -55,11 +55,17 @@ GridItemDelegate::GridItemDelegate( QAbstractItemView* parent, PlayableProxyMode , m_model( proxy ) , m_itemWidth( 0 ) , m_showPosition( false ) + , m_wordWrapping( false ) , m_margin( TomahawkUtils::DpiScaler::scaledY( parent, 32 ) ) { if ( m_view && m_view->metaObject()->indexOfSignal( "modelChanged()" ) > -1 ) connect( m_view, SIGNAL( modelChanged() ), this, SLOT( modelChanged() ) ); + QFont m_font = m_view->font(); + QFont m_smallFont = m_font; + m_font.setPointSize( TomahawkUtils::defaultFontSize() + 2 ); + m_smallFont.setPointSize( TomahawkUtils::defaultFontSize() ); + connect( this, SIGNAL( updateIndex( QModelIndex ) ), parent, SLOT( update( QModelIndex ) ) ); connect( proxy, SIGNAL( rowsAboutToBeInserted( QModelIndex, int, int ) ), SLOT( modelChanged() ) ); @@ -81,14 +87,13 @@ GridItemDelegate::sizeHint( const QStyleOptionViewItem& option, const QModelInde } else { - PlayableItem* item = m_model->sourceModel()->itemFromIndex( m_model->mapToSource( index ) ); - if ( !item || !index.isValid() ) - return QStyledItemDelegate::sizeHint( option, index ); + const QFontMetrics fm( m_font ); + const QFontMetrics fms( m_smallFont ); - if ( item->artist() ) - return QSize( m_itemWidth, m_itemWidth + option.fontMetrics.height() * 3 ); + if ( !m_wordWrapping ) + return QSize( m_itemWidth, m_itemWidth + fm.height() + m_margin ); - return QSize( m_itemWidth, m_itemWidth + option.fontMetrics.height() * 4.4 ); + return QSize( m_itemWidth, m_itemWidth + fm.height() + fms.height() + m_margin ); } } @@ -107,6 +112,13 @@ GridItemDelegate::setShowPosition( bool enabled ) } +void +GridItemDelegate::setWordWrapping( bool enabled ) +{ + m_wordWrapping = enabled; +} + + void GridItemDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const { @@ -207,18 +219,13 @@ GridItemDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, to.setWrapMode( QTextOption::NoWrap ); QString text; - QFont font = opt.font; - font.setPointSize( TomahawkUtils::defaultFontSize() + 2 ); - QFont smallFont = font; - smallFont.setPointSize( TomahawkUtils::defaultFontSize() ); - QRect textRect = option.rect.adjusted( 0, r.height() + m_margin / 4, 0, -m_margin / 2 + m_margin / 8 ); bool oneLiner = false; if ( bottom.isEmpty() ) oneLiner = true; painter->setPen( TomahawkStyle::SELECTION_FOREGROUND ); - painter->setFont( font ); + painter->setFont( m_font ); painter->setPen( Qt::black ); painter->setOpacity( 0.8 ); @@ -228,7 +235,7 @@ GridItemDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, if ( !oneLiner ) { - QFont figFont = font; + QFont figFont = m_font; figFont.setPixelSize( textRect.height() - m_margin / 8 ); painter->setFont( figFont ); } @@ -280,7 +287,7 @@ GridItemDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, painter->restore(); painter->setOpacity( 0.6 ); - painter->setFont( smallFont ); + painter->setFont( m_smallFont ); // If the user is hovering over an artist rect, underline the artist name if ( m_hoveringOverArtist == index ) diff --git a/src/libtomahawk/playlist/GridItemDelegate.h b/src/libtomahawk/playlist/GridItemDelegate.h index 20dd5b67c..dc4eba050 100644 --- a/src/libtomahawk/playlist/GridItemDelegate.h +++ b/src/libtomahawk/playlist/GridItemDelegate.h @@ -52,6 +52,7 @@ public: public slots: void resetHoverIndex(); void setShowPosition( bool enabled ); + void setWordWrapping( bool enabled ); protected: void paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const; @@ -89,6 +90,7 @@ private: PlayableProxyModel* m_model; int m_itemWidth; bool m_showPosition; + bool m_wordWrapping; mutable QHash< QPersistentModelIndex, QRect > m_artistNameRects; mutable QHash< QPersistentModelIndex, QRect > m_albumNameRects; @@ -102,6 +104,8 @@ private: mutable QHash< QPersistentModelIndex, HoverControls* > m_hoverControls; mutable QHash< QPersistentModelIndex, QTimeLine* > m_hoverFaders; + QFont m_font; + QFont m_smallFont; const int m_margin; };