From 585a7ad8784d5eacf479302be422e5a14c949c03 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 5 Sep 2013 22:19:46 +0200 Subject: [PATCH] * Some of the ugliest, hackiest code I've written in recent times. Hack around broken QColumnView. --- src/libtomahawk/playlist/ColumnView.cpp | 46 +++++++++++++++++++++++++ src/libtomahawk/playlist/ColumnView.h | 6 ++++ 2 files changed, 52 insertions(+) diff --git a/src/libtomahawk/playlist/ColumnView.cpp b/src/libtomahawk/playlist/ColumnView.cpp index 5349138a4..28a8fb3a6 100644 --- a/src/libtomahawk/playlist/ColumnView.cpp +++ b/src/libtomahawk/playlist/ColumnView.cpp @@ -58,6 +58,7 @@ ColumnView::ColumnView( QWidget* parent ) , m_previewWidget( new ColumnViewPreviewWidget( this ) ) , m_updateContextView( true ) , m_contextMenu( new ContextMenu( this ) ) + , m_scrollDelta( 0 ) { setFrameShape( QFrame::NoFrame ); setAttribute( Qt::WA_MacShowFocusRect, 0 ); @@ -73,6 +74,7 @@ ColumnView::ColumnView( QWidget* parent ) setSelectionBehavior( QAbstractItemView::SelectRows ); setContextMenuPolicy( Qt::CustomContextMenu ); setProxyModel( new TreeProxyModel( this ) ); + setPreviewWidget( m_previewWidget ); m_timer.setInterval( SCROLL_TIMEOUT ); @@ -453,9 +455,53 @@ ColumnView::guid() const } +void +ColumnView::onScrollBarChanged( int value ) +{ + QWidget* parent = qobject_cast< QWidget* >( m_previewWidget->parent() ); + parent->scroll( 0, m_scrollDelta - value ); + + m_scrollDelta = value; +} + + +void +ColumnView::fixScrollBars() +{ + foreach ( QObject* widget, children() ) + { + foreach ( QObject* view, widget->children() ) + { + QScrollBar* sb = qobject_cast< QScrollBar* >( view ); + if ( sb && sb->orientation() == Qt::Horizontal ) + { + sb->setSingleStep( 6 ); + } + + foreach ( QObject* subviews, view->children() ) + { + foreach ( QObject* scrollbar, subviews->children() ) + { + QScrollBar* sb = qobject_cast< QScrollBar* >( scrollbar ); + if ( sb && sb->orientation() == Qt::Vertical ) + { + sb->setSingleStep( 6 ); + connect( sb, SIGNAL( valueChanged( int ) ), SLOT( onScrollBarChanged( int ) ), Qt::UniqueConnection ); + + break; + } + } + } + } + } +} + + void ColumnView::onUpdatePreviewWidget( const QModelIndex& index ) { + fixScrollBars(); + PlayableItem* item = m_proxyModel->itemFromIndex( m_proxyModel->mapToSource( index ) ); if ( !item || !item->result() ) { diff --git a/src/libtomahawk/playlist/ColumnView.h b/src/libtomahawk/playlist/ColumnView.h index c2e6965c7..b74385a44 100644 --- a/src/libtomahawk/playlist/ColumnView.h +++ b/src/libtomahawk/playlist/ColumnView.h @@ -97,7 +97,11 @@ private slots: void onCustomContextMenu( const QPoint& pos ); void onMenuTriggered( int action ); + void onScrollBarChanged( int value ); + private: + void fixScrollBars(); + OverlayWidget* m_overlay; TreeModel* m_model; TreeProxyModel* m_proxyModel; @@ -110,6 +114,8 @@ private: QModelIndex m_contextMenuIndex; Tomahawk::ContextMenu* m_contextMenu; + int m_scrollDelta; + QString m_emptyTip; QTimer m_timer; mutable QString m_guid;