diff --git a/src/libtomahawk/playlist/TreeItemDelegate.cpp b/src/libtomahawk/playlist/TreeItemDelegate.cpp index 7b66cf664..4cc3c4dc7 100644 --- a/src/libtomahawk/playlist/TreeItemDelegate.cpp +++ b/src/libtomahawk/playlist/TreeItemDelegate.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include "Query.h" #include "Result.h" @@ -35,6 +36,7 @@ #include "PlayableItem.h" #include "TreeProxyModel.h" #include "TreeView.h" +#include "ViewManager.h" #include "Typedefs.h" @@ -73,7 +75,7 @@ TreeItemDelegate::sizeHint( const QStyleOptionViewItem& option, const QModelInde break; } } - + // artist per default size.setHeight( option.fontMetrics.height() * 4 ); return size; @@ -135,13 +137,15 @@ TreeItemDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, if ( oldX > 0 ) o.rect.setX( oldX ); - if ( m_view->hoveredIndex() == index && !index.data().toString().isEmpty() && index.column() == 0 ) + if ( m_hoveringOver == index && !index.data().toString().isEmpty() && index.column() == 0 ) { o.rect.setWidth( o.rect.width() - o.rect.height() ); QRect arrowRect( o.rect.x() + o.rect.width(), o.rect.y() + 1, o.rect.height() - 2, o.rect.height() - 2 ); QPixmap infoIcon = TomahawkUtils::defaultPixmap( TomahawkUtils::InfoIcon, TomahawkUtils::Original, arrowRect.size() ); painter->drawPixmap( arrowRect, infoIcon ); + + m_infoButtonRects[ index ] = arrowRect; } { @@ -226,3 +230,78 @@ TreeItemDelegate::doUpdateIndex( const QPersistentModelIndex& index ) emit updateIndex( index ); } + +bool +TreeItemDelegate::editorEvent( QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, const QModelIndex& index ) +{ + Q_UNUSED( model ); + Q_UNUSED( option ); + + if ( event->type() != QEvent::MouseButtonRelease && + event->type() != QEvent::MouseMove && + event->type() != QEvent::MouseButtonPress && + event->type() != QEvent::Leave ) + return false; + + bool hoveringInfo = false; + if ( m_infoButtonRects.contains( index ) ) + { + const QRect infoRect = m_infoButtonRects[ index ]; + const QMouseEvent* ev = static_cast< QMouseEvent* >( event ); + hoveringInfo = infoRect.contains( ev->pos() ); + } + + if ( event->type() == QEvent::MouseMove ) + { + if ( hoveringInfo ) + m_view->setCursor( Qt::PointingHandCursor ); + else + m_view->setCursor( Qt::ArrowCursor ); + + if ( m_hoveringOver != index || ( !hoveringInfo && m_hoveringOver.isValid() ) ) + { + emit updateIndex( m_hoveringOver ); + m_hoveringOver = index; + emit updateIndex( index ); + } + + event->accept(); + return true; + } + + // reset mouse cursor. we switch to a pointing hand cursor when hovering an info button + m_view->setCursor( Qt::ArrowCursor ); + + if ( hoveringInfo ) + { + if ( event->type() == QEvent::MouseButtonRelease ) + { + PlayableItem* item = m_model->sourceModel()->itemFromIndex( m_model->mapToSource( index ) ); + if ( !item ) + return false; + + switch ( index.column() ) + { + case 0: + { + ViewManager::instance()->show( item->query()->displayQuery() ); + break; + } + + default: + break; + } + + event->accept(); + return true; + } + else if ( event->type() == QEvent::MouseButtonPress ) + { + // Stop the whole item from having a down click action as we just want the info button to be clicked + event->accept(); + return true; + } + } + + return false; +} diff --git a/src/libtomahawk/playlist/TreeItemDelegate.h b/src/libtomahawk/playlist/TreeItemDelegate.h index 7f80e50e7..8cdef6206 100644 --- a/src/libtomahawk/playlist/TreeItemDelegate.h +++ b/src/libtomahawk/playlist/TreeItemDelegate.h @@ -42,6 +42,7 @@ public: protected: void paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const; + bool editorEvent( QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, const QModelIndex& index ); signals: void updateIndex( const QModelIndex& idx ); @@ -54,6 +55,8 @@ private: TreeProxyModel* m_model; mutable QHash< QPersistentModelIndex, QSharedPointer< Tomahawk::PixmapDelegateFader > > m_pixmaps; + mutable QHash< QPersistentModelIndex, QRect > m_infoButtonRects; + QPersistentModelIndex m_hoveringOver; }; #endif // TREEITEMDELEGATE_H