1
0
mirror of https://github.com/tomahawk-player/tomahawk.git synced 2025-07-31 11:20:22 +02:00

* Added scroll timeouts to GridView, only request covers for displayed items.

This commit is contained in:
Christian Muehlhaeuser
2014-08-28 21:15:59 +02:00
parent 020847f3a2
commit 023cde714a
2 changed files with 72 additions and 1 deletions

View File

@@ -81,6 +81,11 @@ GridView::GridView( QWidget* parent )
setItemSize( QSize( 170, 170 + 56 ) );
setProxyModel( new PlayableProxyModel( this ) );
m_timer.setInterval( SCROLL_TIMEOUT );
connect( verticalScrollBar(), SIGNAL( rangeChanged( int, int ) ), SLOT( onViewChanged() ) );
connect( verticalScrollBar(), SIGNAL( valueChanged( int ) ), SLOT( onViewChanged() ) );
connect( &m_timer, SIGNAL( timeout() ), SLOT( onScrollTimeout() ) );
connect( this, SIGNAL( doubleClicked( QModelIndex ) ), SLOT( onItemActivated( QModelIndex ) ) );
connect( this, SIGNAL( customContextMenuRequested( QPoint ) ), SLOT( onCustomContextMenu( QPoint ) ) );
}
@@ -442,3 +447,65 @@ GridView::setItemSize( const QSize& size )
layoutItems();
}
void
GridView::onViewChanged()
{
if ( m_timer.isActive() )
m_timer.stop();
m_timer.start();
}
void
GridView::onScrollTimeout()
{
if ( m_timer.isActive() )
m_timer.stop();
QModelIndex left, right;
for ( int y = viewport()->rect().topLeft().y(); y <= viewport()->rect().bottomLeft().y(); y += ( spacing() + 1 ) )
{
for ( int x = viewport()->rect().topLeft().x(); x <= viewport()->rect().topRight().x(); x += ( spacing() + 1 ) )
{
left = indexAt( QPoint( x, y ) );
if ( left.isValid() )
break;
}
if ( left.isValid() )
break;
}
if ( !left.isValid() )
{
tDebug() << "Could not find first visible index!";
return;
}
while ( left.isValid() && left.parent().isValid() )
left = left.parent();
for ( int y = viewport()->rect().bottomLeft().y(); y >= viewport()->rect().topLeft().y(); y -= ( spacing() + 1 ) )
{
for ( int x = viewport()->rect().topRight().x(); x >= viewport()->rect().topLeft().x(); x -= ( spacing() + 1 ) )
{
right = indexAt( QPoint( x, y ) );
if ( right.isValid() )
break;
}
if ( right.isValid() )
break;
}
while ( right.isValid() && right.parent().isValid() )
right = right.parent();
if ( !right.isValid() )
{
tDebug() << "Could not find last visible index!";
return;
}
for ( int i = left.row(); i <= right.row(); i++ )
{
m_proxyModel->updateDetailedInfo( m_proxyModel->index( i, 0 ) );
}
}

View File

@@ -100,6 +100,9 @@ protected:
protected slots:
virtual void currentChanged( const QModelIndex& current, const QModelIndex& previous );
void onViewChanged();
void onScrollTimeout();
private slots:
void onFilterChanged( const QString& filter );
void onCustomContextMenu( const QPoint& pos );
@@ -127,9 +130,10 @@ private:
bool m_autoFitItems;
bool m_autoResize;
QSize m_itemSize;
QRect m_paintRect;
QTimer m_timer;
friend class ::GridPlaylistInterface;
};