diff --git a/data/images/star-hover.png b/data/images/star-hover.png new file mode 100644 index 000000000..89efe2aef Binary files /dev/null and b/data/images/star-hover.png differ diff --git a/data/images/star-unstarred.png b/data/images/star-unstarred.png new file mode 100644 index 000000000..75dc2b798 Binary files /dev/null and b/data/images/star-unstarred.png differ diff --git a/data/images/starred.png b/data/images/starred.png new file mode 100644 index 000000000..a93e9f6da Binary files /dev/null and b/data/images/starred.png differ diff --git a/src/GetNewStuffDelegate.cpp b/src/GetNewStuffDelegate.cpp index 7ae0466f1..5329e0591 100644 --- a/src/GetNewStuffDelegate.cpp +++ b/src/GetNewStuffDelegate.cpp @@ -29,6 +29,7 @@ #define PADDING 4 #define PADDING_BETWEEN_STARS 2 +#define STAR_SIZE 12 #ifdef Q_WS_MAC #define SIZEHINT_HEIGHT 70 @@ -41,11 +42,14 @@ GetNewStuffDelegate::GetNewStuffDelegate( QObject* parent ) , m_widestTextWidth( 0 ) { m_defaultCover.load( RESPATH "images/sipplugin-online.png" ); - m_ratingStarPositive.load( RESPATH "images/loved.png" ); - m_ratingStarNegative.load( RESPATH "images/not-loved.png" ); + m_ratingStarPositive.load( RESPATH "images/starred.png" ); + m_ratingStarNegative.load( RESPATH "images/star-unstarred.png" ); + m_onHoverStar.load( RESPATH "images/star-hover.png" ); + + m_ratingStarPositive = m_ratingStarPositive.scaled( STAR_SIZE, STAR_SIZE, Qt::KeepAspectRatio, Qt::SmoothTransformation ); + m_ratingStarNegative = m_ratingStarNegative.scaled( STAR_SIZE, STAR_SIZE, Qt::KeepAspectRatio, Qt::SmoothTransformation ); + m_onHoverStar = m_onHoverStar.scaled( STAR_SIZE, STAR_SIZE, Qt::KeepAspectRatio, Qt::SmoothTransformation ); - m_ratingStarPositive = m_ratingStarPositive.scaled( 8, 8, Qt::KeepAspectRatio, Qt::SmoothTransformation ); - m_ratingStarNegative = m_ratingStarNegative.scaled( 8, 8, Qt::KeepAspectRatio, Qt::SmoothTransformation ); const int w = SIZEHINT_HEIGHT - 2*PADDING; m_defaultCover = m_defaultCover.scaled( w, w, Qt::KeepAspectRatio, Qt::SmoothTransformation ); @@ -175,6 +179,7 @@ GetNewStuffDelegate::paint( QPainter* painter, const QStyleOptionViewItem& optio painter->drawText( btnRect, Qt::AlignCenter, actionText ); painter->setPen( saved ); + // rating stars int rating = index.data( GetNewStuffModel::RatingRole ).toInt(); const int ratingWidth = 5 * ( m_ratingStarPositive.width() + PADDING_BETWEEN_STARS ); @@ -185,10 +190,21 @@ GetNewStuffDelegate::paint( QPainter* painter, const QStyleOptionViewItem& optio if ( i == 1 ) m_cachedStarRects[ QPair(index.row(), index.column()) ] = r; - if ( i <= rating ) // positive star - painter->drawPixmap( r, m_ratingStarPositive ); + QPixmap pm; + if ( m_hoveringOver > -1 ) + { + if ( i <= m_hoveringOver ) // positive star + painter->drawPixmap( r, m_onHoverStar ); + else + painter->drawPixmap( r, m_ratingStarNegative ); + } else - painter->drawPixmap( r, m_ratingStarNegative ); + { + if ( i <= rating ) // positive star + painter->drawPixmap( r, m_ratingStarPositive ); + else + painter->drawPixmap( r, m_ratingStarNegative ); + } runningEdge += m_ratingStarPositive.width() + PADDING_BETWEEN_STARS; } @@ -242,10 +258,13 @@ bool GetNewStuffDelegate::editorEvent( QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, const QModelIndex& index ) { Q_UNUSED( option ); - if ( event->type() != QEvent::MouseButtonRelease ) + m_hoveringOver = -1; + + if ( event->type() != QEvent::MouseButtonRelease && + event->type() != QEvent::MouseMove ) return false; - if ( m_cachedButtonRects.contains( QPair( index.row(), index.column() ) ) ) + if ( event->type() == QEvent::MouseButtonRelease && m_cachedButtonRects.contains( QPair( index.row(), index.column() ) ) ) { QRect rect = m_cachedButtonRects[ QPair( index.row(), index.column() ) ]; QMouseEvent* me = static_cast< QMouseEvent* >( event ); @@ -273,8 +292,17 @@ GetNewStuffDelegate::editorEvent( QEvent* event, QAbstractItemModel* model, cons const int eachStar = starsWidth / 5; const int clickOffset = me->pos().x() - fullStars.x(); const int whichStar = (clickOffset / eachStar) + 1; - tDebug() << "Clicked on:" << whichStar; - model->setData( index, whichStar, GetNewStuffModel::RatingRole ); + + if ( event->type() == QEvent::MouseButtonRelease ) + { + tDebug() << "Clicked on:" << whichStar; + model->setData( index, whichStar, GetNewStuffModel::RatingRole ); + } + else if ( event->type() == QEvent::MouseMove ) + { + // 0-indexed + m_hoveringOver = whichStar; + } return true; } diff --git a/src/GetNewStuffDelegate.h b/src/GetNewStuffDelegate.h index a1976a8b5..e2b71afaa 100644 --- a/src/GetNewStuffDelegate.h +++ b/src/GetNewStuffDelegate.h @@ -35,11 +35,10 @@ protected: virtual bool editorEvent( QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, const QModelIndex& index ); private: - QPixmap m_defaultCover; - QPixmap m_ratingStarPositive; - QPixmap m_ratingStarNegative; + QPixmap m_defaultCover, m_onHoverStar, m_ratingStarPositive, m_ratingStarNegative; int m_widestTextWidth; + int m_hoveringOver; mutable QHash< QPair, QRect > m_cachedButtonRects; mutable QHash< QPair, QRect > m_cachedStarRects; }; diff --git a/src/GetNewStuffDialog.cpp b/src/GetNewStuffDialog.cpp index d27604150..a0102c648 100644 --- a/src/GetNewStuffDialog.cpp +++ b/src/GetNewStuffDialog.cpp @@ -33,6 +33,8 @@ GetNewStuffDialog::GetNewStuffDialog( QWidget *parent, Qt::WindowFlags f ) ui->listView->setItemDelegate( new GetNewStuffDelegate( ui->listView ) ); ui->listView->setVerticalScrollMode( QAbstractItemView::ScrollPerPixel ); + ui->listView->setMouseTracking( true ); + #ifdef Q_WS_MAC setMinimumSize( 510, 350 ); setMaximumSize( 510, 350 );