mirror of
https://github.com/tomahawk-player/tomahawk.git
synced 2025-07-31 11:20:22 +02:00
Self adjust item height in GridItemDelegate and GridView. We now only specify a width.
This commit is contained in:
@@ -53,6 +53,7 @@ GridItemDelegate::GridItemDelegate( QAbstractItemView* parent, PlayableProxyMode
|
|||||||
: QStyledItemDelegate( (QObject*)parent )
|
: QStyledItemDelegate( (QObject*)parent )
|
||||||
, m_view( parent )
|
, m_view( parent )
|
||||||
, m_model( proxy )
|
, m_model( proxy )
|
||||||
|
, m_itemWidth( 0 )
|
||||||
, m_showPosition( false )
|
, m_showPosition( false )
|
||||||
, m_margin( TomahawkUtils::DpiScaler::scaledY( parent, 32 ) )
|
, m_margin( TomahawkUtils::DpiScaler::scaledY( parent, 32 ) )
|
||||||
{
|
{
|
||||||
@@ -73,13 +74,29 @@ GridItemDelegate::GridItemDelegate( QAbstractItemView* parent, PlayableProxyMode
|
|||||||
QSize
|
QSize
|
||||||
GridItemDelegate::sizeHint( const QStyleOptionViewItem& option, const QModelIndex& index ) const
|
GridItemDelegate::sizeHint( const QStyleOptionViewItem& option, const QModelIndex& index ) const
|
||||||
{
|
{
|
||||||
if ( m_itemSize.isNull() )
|
if ( m_itemWidth == 0 )
|
||||||
{
|
{
|
||||||
QSize size = QStyledItemDelegate::sizeHint( option, index );
|
QSize size = QStyledItemDelegate::sizeHint( option, index );
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return m_itemSize;
|
{
|
||||||
|
PlayableItem* item = m_model->sourceModel()->itemFromIndex( m_model->mapToSource( index ) );
|
||||||
|
if ( !item || !index.isValid() )
|
||||||
|
return QStyledItemDelegate::sizeHint( option, index );
|
||||||
|
|
||||||
|
if ( item->artist() )
|
||||||
|
return QSize( m_itemWidth, m_itemWidth + option.fontMetrics.height() * 3 );
|
||||||
|
|
||||||
|
return QSize( m_itemWidth, m_itemWidth + option.fontMetrics.height() * 4.4 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QSize
|
||||||
|
GridItemDelegate::itemSize() const
|
||||||
|
{
|
||||||
|
return sizeHint( QStyleOptionViewItem(), m_model->index( 0, 0 ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -217,9 +234,9 @@ GridItemDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option,
|
|||||||
}
|
}
|
||||||
|
|
||||||
const QString fig = QString::number( index.row() + 1 );
|
const QString fig = QString::number( index.row() + 1 );
|
||||||
painter->drawText( textRect, fig, QTextOption( Qt::AlignLeft | Qt::AlignTop ) );
|
painter->drawText( textRect, fig, QTextOption( Qt::AlignLeft | Qt::AlignVCenter ) );
|
||||||
|
|
||||||
textRect.adjust( painter->fontMetrics().boundingRect( textRect, Qt::AlignLeft | Qt::AlignTop, fig ).width() + m_margin / 4, 0, 0, 0 );
|
textRect.adjust( painter->fontMetrics().boundingRect( textRect, Qt::AlignLeft | Qt::AlignVCenter, fig ).width() + m_margin / 4, 0, 0, 0 );
|
||||||
painter->restore();
|
painter->restore();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -46,8 +46,8 @@ Q_OBJECT
|
|||||||
public:
|
public:
|
||||||
GridItemDelegate( QAbstractItemView* parent, PlayableProxyModel* proxy );
|
GridItemDelegate( QAbstractItemView* parent, PlayableProxyModel* proxy );
|
||||||
|
|
||||||
QSize itemSize() const { return m_itemSize; }
|
QSize itemSize() const;
|
||||||
void setItemSize( const QSize& size ) { m_itemSize = size; }
|
void setItemWidth( int width ) { m_itemWidth = width; }
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void resetHoverIndex();
|
void resetHoverIndex();
|
||||||
@@ -87,7 +87,7 @@ private:
|
|||||||
|
|
||||||
QAbstractItemView* m_view;
|
QAbstractItemView* m_view;
|
||||||
PlayableProxyModel* m_model;
|
PlayableProxyModel* m_model;
|
||||||
QSize m_itemSize;
|
int m_itemWidth;
|
||||||
bool m_showPosition;
|
bool m_showPosition;
|
||||||
|
|
||||||
mutable QHash< QPersistentModelIndex, QRect > m_artistNameRects;
|
mutable QHash< QPersistentModelIndex, QRect > m_artistNameRects;
|
||||||
|
@@ -59,6 +59,7 @@ GridView::GridView( QWidget* parent )
|
|||||||
, m_overlay( new OverlayWidget( this ) )
|
, m_overlay( new OverlayWidget( this ) )
|
||||||
, m_contextMenu( new ContextMenu( this ) )
|
, m_contextMenu( new ContextMenu( this ) )
|
||||||
, m_inited( false )
|
, m_inited( false )
|
||||||
|
, m_itemWidth( 0 )
|
||||||
{
|
{
|
||||||
setFrameShape( QFrame::NoFrame );
|
setFrameShape( QFrame::NoFrame );
|
||||||
setAttribute( Qt::WA_MacShowFocusRect, 0 );
|
setAttribute( Qt::WA_MacShowFocusRect, 0 );
|
||||||
@@ -81,7 +82,7 @@ GridView::GridView( QWidget* parent )
|
|||||||
setAutoFitItems( true );
|
setAutoFitItems( true );
|
||||||
setAutoResize( false );
|
setAutoResize( false );
|
||||||
|
|
||||||
setItemSize( TomahawkUtils::DpiScaler::scaled( this, QSize( 170, 170 + 56 ) ) );
|
setItemWidth( TomahawkUtils::DpiScaler::scaledX( this, 170 ) );
|
||||||
setProxyModel( new PlayableProxyModel( this ) );
|
setProxyModel( new PlayableProxyModel( this ) );
|
||||||
|
|
||||||
m_timer.setInterval( SCROLL_TIMEOUT );
|
m_timer.setInterval( SCROLL_TIMEOUT );
|
||||||
@@ -129,7 +130,7 @@ GridView::setProxyModel( PlayableProxyModel* model )
|
|||||||
m_delegate = new GridItemDelegate( this, m_proxyModel );
|
m_delegate = new GridItemDelegate( this, m_proxyModel );
|
||||||
connect( m_delegate, SIGNAL( startedPlaying( QPersistentModelIndex ) ), this, SLOT( onDelegatePlaying( QPersistentModelIndex ) ) );
|
connect( m_delegate, SIGNAL( startedPlaying( QPersistentModelIndex ) ), this, SLOT( onDelegatePlaying( QPersistentModelIndex ) ) );
|
||||||
connect( m_delegate, SIGNAL( stoppedPlaying( QPersistentModelIndex ) ), this, SLOT( onDelegateStopped( QPersistentModelIndex ) ) );
|
connect( m_delegate, SIGNAL( stoppedPlaying( QPersistentModelIndex ) ), this, SLOT( onDelegateStopped( QPersistentModelIndex ) ) );
|
||||||
m_delegate->setItemSize( m_itemSize );
|
m_delegate->setItemWidth( m_itemWidth );
|
||||||
setItemDelegate( m_delegate );
|
setItemDelegate( m_delegate );
|
||||||
|
|
||||||
QListView::setModel( m_proxyModel );
|
QListView::setModel( m_proxyModel );
|
||||||
@@ -289,7 +290,7 @@ GridView::verifySize()
|
|||||||
scrollbar = 0; //don't count it any more
|
scrollbar = 0; //don't count it any more
|
||||||
|
|
||||||
const int rectWidth = contentsRect().width() - scrollbar - 3 - spacing();
|
const int rectWidth = contentsRect().width() - scrollbar - 3 - spacing();
|
||||||
const int itemWidth = m_itemSize.width() + spacing();
|
const int itemWidth = m_itemWidth + spacing();
|
||||||
const int itemsPerRow = qMax( 1, qFloor( rectWidth / itemWidth ) );
|
const int itemsPerRow = qMax( 1, qFloor( rectWidth / itemWidth ) );
|
||||||
|
|
||||||
const int overlapRows = m_model->rowCount( QModelIndex() ) % itemsPerRow;
|
const int overlapRows = m_model->rowCount( QModelIndex() ) % itemsPerRow;
|
||||||
@@ -322,14 +323,14 @@ GridView::layoutItems()
|
|||||||
scrollbar = 0; //don't count it any more
|
scrollbar = 0; //don't count it any more
|
||||||
|
|
||||||
const int rectWidth = contentsRect().width() - scrollbar - 3 - spacing();
|
const int rectWidth = contentsRect().width() - scrollbar - 3 - spacing();
|
||||||
const int itemWidth = m_itemSize.width() + spacing();
|
const int itemWidth = m_itemWidth + spacing();
|
||||||
const int itemsPerRow = qMax( 1, qFloor( rectWidth / itemWidth ) );
|
const int itemsPerRow = qMax( 1, qFloor( rectWidth / itemWidth ) );
|
||||||
|
|
||||||
const int remSpace = rectWidth - ( itemsPerRow * itemWidth );
|
const int remSpace = rectWidth - ( itemsPerRow * itemWidth );
|
||||||
const int extraSpace = remSpace / itemsPerRow;
|
const int extraSpace = remSpace / itemsPerRow;
|
||||||
const int newItemWidth = itemWidth + extraSpace - spacing();
|
const int newItemWidth = itemWidth + extraSpace - spacing();
|
||||||
|
|
||||||
m_delegate->setItemSize( QSize( newItemWidth, newItemWidth + ( m_itemSize.height() - m_itemSize.width() ) ) );
|
m_delegate->setItemWidth( newItemWidth );
|
||||||
}
|
}
|
||||||
|
|
||||||
verifySize();
|
verifySize();
|
||||||
@@ -496,11 +497,11 @@ GridView::setPlaylistInterface( const Tomahawk::playlistinterface_ptr& playlistI
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
GridView::setItemSize( const QSize& size )
|
GridView::setItemWidth( int width )
|
||||||
{
|
{
|
||||||
m_itemSize = size;
|
m_itemWidth = width;
|
||||||
if ( m_delegate )
|
if ( m_delegate )
|
||||||
m_delegate->setItemSize( m_itemSize );
|
m_delegate->setItemWidth( m_itemWidth );
|
||||||
|
|
||||||
layoutItems();
|
layoutItems();
|
||||||
}
|
}
|
||||||
|
@@ -67,8 +67,8 @@ public:
|
|||||||
|
|
||||||
void setEmptyTip( const QString& tip );
|
void setEmptyTip( const QString& tip );
|
||||||
|
|
||||||
QSize itemSize() const { return m_itemSize; }
|
int itemWidth() const { return m_itemWidth; }
|
||||||
void setItemSize( const QSize& size );
|
void setItemWidth( int width );
|
||||||
|
|
||||||
virtual QWidget* widget() { return this; }
|
virtual QWidget* widget() { return this; }
|
||||||
virtual Tomahawk::playlistinterface_ptr playlistInterface() const;
|
virtual Tomahawk::playlistinterface_ptr playlistInterface() const;
|
||||||
@@ -135,7 +135,7 @@ private:
|
|||||||
bool m_inited;
|
bool m_inited;
|
||||||
bool m_autoFitItems;
|
bool m_autoFitItems;
|
||||||
bool m_autoResize;
|
bool m_autoResize;
|
||||||
QSize m_itemSize;
|
int m_itemWidth;
|
||||||
QRect m_paintRect;
|
QRect m_paintRect;
|
||||||
|
|
||||||
QTimer m_timer;
|
QTimer m_timer;
|
||||||
|
Reference in New Issue
Block a user