From 3721ef2975691191375cd846dc0d556c12a98683 Mon Sep 17 00:00:00 2001
From: Christian Muehlhaeuser <muesli@gmail.com>
Date: Mon, 3 Dec 2012 17:15:11 +0100
Subject: [PATCH] * Mark-up tracks in the sidebar when hovered.

---
 src/sourcetree/SourceDelegate.cpp | 28 +++++++++++++++++++++++++---
 src/sourcetree/SourceDelegate.h   |  5 +++--
 2 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/src/sourcetree/SourceDelegate.cpp b/src/sourcetree/SourceDelegate.cpp
index 3d8420a78..f30c09be6 100644
--- a/src/sourcetree/SourceDelegate.cpp
+++ b/src/sourcetree/SourceDelegate.cpp
@@ -263,6 +263,12 @@ SourceDelegate::paintCollection( QPainter* painter, const QStyleOptionViewItem&
             m_lockRects.remove( index );
     }
 
+    if ( m_trackHovered == index )
+    {
+        QFont font = painter->font();
+        font.setUnderline( true );
+        painter->setFont( font );
+    }
     textRect.adjust( 0, 0, 0, 2 );
     text = painter->fontMetrics().elidedText( desc, Qt::ElideRight, textRect.width() - 8 );
     QTextOption to( Qt::AlignVCenter );
@@ -626,6 +632,22 @@ SourceDelegate::editorEvent( QEvent* event, QAbstractItemModel* model, const QSt
         const QRect trackRect = m_trackRects[ index ];
         const QMouseEvent* ev = static_cast< QMouseEvent* >( event );
         hoveringTrack = trackRect.contains( ev->pos() );
+
+        if ( hoveringTrack )
+        {
+            if ( m_trackHovered != index )
+            {
+                m_trackHovered = index;
+                QMetaObject::invokeMethod( m_parent, "update", Qt::QueuedConnection, Q_ARG( QModelIndex, index ) );
+            }
+        }
+    }
+    if ( !hoveringTrack )
+    {
+        if ( m_trackHovered.isValid() )
+            QMetaObject::invokeMethod( m_parent, "update", Qt::QueuedConnection, Q_ARG( QModelIndex, m_trackHovered ) );
+
+        m_trackHovered = QPersistentModelIndex();
     }
 
     bool lockRectContainsClick = false, headphonesRectContainsClick = false;
@@ -806,7 +828,7 @@ SourceDelegate::hovered( const QModelIndex& index, const QMimeData* mimeData )
 {
     if ( !index.isValid() )
     {
-        foreach ( AnimationHelper *helper, m_expandedMap )
+        foreach ( AnimationHelper* helper, m_expandedMap )
         {
             helper->collapse();
         }
@@ -815,14 +837,14 @@ SourceDelegate::hovered( const QModelIndex& index, const QMimeData* mimeData )
 
     if ( !m_expandedMap.contains( index ) )
     {
-        foreach ( AnimationHelper *helper, m_expandedMap )
+        foreach ( AnimationHelper* helper, m_expandedMap )
         {
             helper->collapse();
         }
 
         m_newDropHoverIndex = index;
         m_dropMimeData->clear();
-        foreach ( const QString &mimeDataFormat, mimeData->formats() )
+        foreach ( const QString& mimeDataFormat, mimeData->formats() )
         {
             m_dropMimeData->setData( mimeDataFormat, mimeData->data( mimeDataFormat ) );
         }
diff --git a/src/sourcetree/SourceDelegate.h b/src/sourcetree/SourceDelegate.h
index 9fe2d4bb4..62881e520 100644
--- a/src/sourcetree/SourceDelegate.h
+++ b/src/sourcetree/SourceDelegate.h
@@ -37,7 +37,7 @@ public:
     SourceDelegate( QAbstractItemView* parent = 0 );
     ~SourceDelegate();
 
-    void hovered( const QModelIndex &index, const QMimeData *mimeData );
+    void hovered( const QModelIndex& index, const QMimeData* mimeData );
     void dragLeaveEvent();
 
     SourceTreeItem::DropType hoveredDropType() const;
@@ -69,7 +69,7 @@ private:
     mutable int m_iconHeight;
     QModelIndex m_dropHoverIndex;
     QModelIndex m_newDropHoverIndex;
-    QMimeData *m_dropMimeData;
+    QMimeData* m_dropMimeData;
     mutable SourceTreeItem::DropType m_hoveredDropType; // Hack to keep easily track of the current highlighted DropType in paint()
     QMap< QModelIndex, AnimationHelper* > m_expandedMap;
     QPixmap m_headphonesOn, m_headphonesOff, m_realtimeLocked, m_realtimeUnlocked, m_nowPlayingSpeaker, m_nowPlayingSpeakerDark, m_collaborativeOn;
@@ -78,6 +78,7 @@ private:
     QMap< int, QString > m_dropTypeTextMap;
     QMap< int, QPixmap > m_dropTypeImageMap;
 
+    mutable QPersistentModelIndex m_trackHovered;
     mutable QHash< QPersistentModelIndex, QRect > m_trackRects;
     mutable QHash< QPersistentModelIndex, QRect > m_headphoneRects;
     mutable QHash< QPersistentModelIndex, QRect > m_lockRects;