From b8ccf9b2af287c8f785745b16debe0b1f8273f80 Mon Sep 17 00:00:00 2001 From: Leo Franchi Date: Fri, 21 Oct 2011 17:03:34 -0400 Subject: [PATCH] Switch to stars, and show on-hover star animation when rating --- data/images/star-hover.png | Bin 0 -> 2188 bytes data/images/star-unstarred.png | Bin 0 -> 1526 bytes data/images/starred.png | Bin 0 -> 2228 bytes src/GetNewStuffDelegate.cpp | 50 +++++++++++++++++++++++++-------- src/GetNewStuffDelegate.h | 5 ++-- src/GetNewStuffDialog.cpp | 2 ++ 6 files changed, 43 insertions(+), 14 deletions(-) create mode 100644 data/images/star-hover.png create mode 100644 data/images/star-unstarred.png create mode 100644 data/images/starred.png diff --git a/data/images/star-hover.png b/data/images/star-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..89efe2aef4360c17899963c54eeba1d3b8210f0d GIT binary patch literal 2188 zcmV;72y^#|P)T|GBNSW=i~@tenviV?1-}L)_1qt_EmcPwFp1v)V?aX~hD5?p3Ty^y)prB% z_K<7|1%Jfveed~cs1{Wbi-08Q4KNP8qT0rUF$J~&CiUJ298bO11MdvMo~q*@ey`sS zJfOaR8=_rR!3u)I{sQ1i^*sedL$j_5*op7#(G+bCHW>2g*MwtQbbr7jpja?=q_yv+X0%^1H@{9 z>wvEn*l@)lF#JuD&Y9+)mQLVFN7ieA*QB0uLx61&;H?#?+{F+opuieRM;j1Y^cS?=ogWml^q58$$yw-qn`kNjGy^oh-jxVrqMUWoSld*crzUH5+W}F zZvi%9GexCN&DIS54FTWsK2~7onO=j(fcNHT!J?6fwLLKqZx{U}V$q*fLKil_FhS6_ zKLZP0!3N;_j-UYd0H>A9nnbMa2G{wSMuuAP0;w-40_|gkfVC zYdT$anP}hf48=c;{jX_Vf5Ud58*^lB0D#l6sjAHZS6~Xo9 zF83K@-j+wb1w)Vro98FDXXyEr*rDB_Xk)a7lvDLi<4>1M!I&eL9 z&7Z+Qcl1KBQ=+W^9cd7e?g&$zP0RZaI;?qE$GaT*_kfR};*MM>qyaqnYq8myIz`_P zyc_tJ79Kg;zI<{r`3GYnEd}ZUKtx`subo~uf61{vht+}oN$a%P3G8&erw|>5ZifZ9 z1skRHDEd0!Y2Y#~e8%Gc#ISpfqEI8#+cP-76&uKC=i}H@rh=S@!bgBc3pQ}lKfEOH zRp7?dJ0jE!#G?sg%$bE$E+XA6%X{@QJO>+}e8{nT4|aVYE!YD}ONb<}J$@tpC8r4R zSzwzdWDL{Tb+|AX4mgxgVb^%i`3c}-*r`{P^H6$5NU({_OG)*33XPe?3#!?@Ii~CU zFLncWN2zMcl@c3q>UzxKcThN1JKsN7@23IBil{RUawcM}=NGdS8e>)t z9&I~Uk)FbC&%sWEE7D69j&e1CHYTvGH72sr6&8{S;F}`JEv~}=l^5CwD%!WXY+oNe57t(q@!th-(F@x)3V+lz{E-s z*=LNIJ2--#24lcJ^<9=}PzrMPNFvtua3UUkf0nYZ1%8E1mM+aCkcdaGNyOT|?U1vM zxG=Cu88Z&d*UXWg_T~&_BG}E-xGFn_4RX?up^kG19-O?fc=Jogca$N&$U}Y+@OxFp zefDDS5zmIFRhgR$wz^D+V1p6QkdMwHzYQBOX@^I!QJtpsGy8?fFDUt0_xzQ@h02H| z@Tx3wXJL~jZg1}c&c&Yk9B_C^;JetgTqdk>D|Ofk4g8IWzWvk`m9p^Y8KZjtp0 zR0n*C;1zlSUI5l-sk=wXU0b{x#X}#Ye9_@G0C$moDf%G6>v1kFz=qMf%oOQ4Nq{?* z%Q@lyk(R($pLn(g|8wS^5ufn>+_<3x2TqrIl zcz4j7KA*-;pSjrO)8k!Lv^PcIai#cfvj52LCHs#oAG82Jaq9Jk{6dGfrvyC(;Y{oa zu&4M@GB0JD%BZu8%uDDm)%P&@O|g=(mGmAdCYUJ{3$Z<)OZO$&3YQc5)|Y;=hO=cv z1o#ZWFj_yiS6Dx_*oy_O;-|>6p{Wqg!=6~Xc06Bc#cLgfCxOos&W@}e8y`$NHdXYh zeGC4z*TcZ;E2%6`tj9)-0{olc8DT|mHZ};!>#V;@@GfL72-}cT4*vtzoiw77^P-*r O0000m`OxIRCt{2n{A9;Lm0<@_wL?ZYO9Lc zN=v(gB|*M`V#2If2Fk_*11cJ%$QF-Klba0XCeu)#kAe+A-Ypw%TI z*DA0WC+2e#^kRKzadK_*w`t#tz)xD9$u5YwQUQJX zuhrre;N^%i!xkmrH`GP0&5&;@>I~T7ilA*=j@qzK>*U>`qz2xV!$OH>f8}x3BGTmC4i*1nu`@I`x{M3W4B39L)0E`1} z0**&k>=MxAg~o`q5^|2$)0({BU;2D6g z2|u4_8P-QMJcuqwoHqNt>q6Lq1Rb!<5vRW!5Su(`mk$N~$n^RLad7NMrutsQ>9HDk zIzfHih)Rz1>O0`oeTYGSVuAE)*mEGaLl0thRQ?Fe2HFwb9EbSyM*}U0t{2D;MPv`(*?ZB0YuIue81Gl4bpMz?$`e6@nsr9C0j|Ipq)Z5bwOb;t`Dq^bYh5CW} z7#>DR6YwPFwQVCZgX^M%+|`*Xcn`-;%Y>K!e1>@d?;+s;&IkT5RJI#A-ydn{Ky|J8 z;TK@$P%AwR_`*j--tEj|2v>>NPld&4H`cfea)Ak^8=^4a38PuyouX8)H_#P3^)!-}(GG=Kq zHd&A{B%F?FB<->!r-XXCDCwg_Hk>}L-(QzH>!t_eaa?Ob4){pr4?nQk$S`Qy+GA~KM zH*>7j$Xp+z%sIeUTDdB)1vzU(VYycBsl==^LJ8Gj616H9fjf{9H=QG@h-tknLawV_ zClWJJ$#1Tcw+-{TJuGaXz9Ykh-4Tf=G!nOjedVa-)SUt{T+iGk4+=ojXG-6sC^vaA9L3LqqMp&)bee~s7#BlQOL z1CJoPfQ}Ym6=v7l_o&z8MO1Il0QKJ;WR5#Ef-AlB7Ua6g)QDZg^Cr*5+<61QqYQT5 z^V;_tQ?@A)KGB3v2QENff10N83&61n>K}vrfx@Id+kmrytF-jj(={nRT9K*j3*L_` zN?{Ax)hT2x@#;4%pesX1IUY$EKx*m zbNeD>ugX|%4UWR>2n}vWlPt;)Go$^m8_Ty3Y_<^TWy07*qoM6N<$f~7OjegFUf literal 0 HcmV?d00001 diff --git a/data/images/starred.png b/data/images/starred.png new file mode 100644 index 0000000000000000000000000000000000000000..a93e9f6da08f6f9b664d9b143bf6cae3729c9508 GIT binary patch literal 2228 zcmV;l2ut^gP)1F{4SFbXs$VThB2QeYL} z8sE*prxUUz5&WLu@B7aqiCR=goCSCkHozG0rg|Hb#1L2wsQmkD!14ThBkEq#T77VUz|kKV z^sNT{nFQ>r3qC}+`=4jmy`( z4gT}>Gp#=bhUAbOHKrO^PqLEu==6tdr^aG5;i zv4U`*^Y$rZ7Z4r>i)(IO9q<5wLr z#?xSZPem_A`+%YAS4hkcz^kcDhoe+G(B9`}mUQPvcjs9z0e=84$ba_(`;Z3AMm$k; zo0bE{E!rVqzYA;vZjRk_@e%6&j!Jb-ekivS*lo%B4e;LlQ*CHqtpj|#29?`5ijnf_ zg+{GdY1q;^7#{0C0Z!D|CIwvVA~E`hDa^`_0Ea2Pn-!ygr`o34~P zXSqrbJ?5RPhSLCT!2Q701j9=Mw<9ah8xSNXO?(LnKxP=UzaTBPzg%l>qj`>UQ#U#h z&YRHMyQMLEZ1WW`T&^x;_4z5`P1iACU7kLPs0IKy9~lzwHfSTjmyvZkgqxwc$!+b? z;A*AX(K=)Dl~VJ7^OaIfrC6`E9s~Ahtq+9jVF=9-sL}D<@Rn=Mc_qM=$h>Ci`ZMwa z|85HxYXE>&BvrM_v<=t-T!pNwlju#iEmWxON-=keIxB|u^b3y4t=^D5zRzN1kX`2* z%igU(H*)S!fTzo2t%I8USDsvNoS((1w6701w;3y>8oeO0iif<=VV*ptT-D>z?l1vAZJJ zUC6{X)1d7`dhUzU)m>@>fE-)hNB9s^1GfR!A#465`rOPCRBF3Y>a-X-3Lx`<>g>)A z?X_4l5y!hM`j3IH5IsK>AWj4L^4B2QnzTWG2KXHCPgD3-THcdNJHJyB^T&qP9Q3l; z#XTH<&0@_%CTTNmb^;l$_r%c=cQ>ekTaYO2kU?JzJO?Z{g|A{{zrx!TQ%7K&r`JU| zzXsVXna=+WIc19FJe0p3-i@raj~levzz(E$Ox8OmJF-n{Zz!$;t@VKoL1+vTnB9p4 zH!TKz5cnW+<`^55(8Uogos8GnV&?`-99qW;-y0shTdkK|3x-%w^ypCS{b2XtFA}GY&DOV&=QTBc+7a8 z0lXf!&L~u?0nDZGuNWccfZK9GIZL5()cgUO&NN6*BbzpmVX&gGRD4vc0Ze0dn2ZVK zblAdL>mz7AfTl}py-s`HR;?+RD7D*Qmi2(0MRb;pYD8*h5bmy_22fgepn`Bid*0T@ zTx!!595r`)_w>{94V_k7lyW9hWu8(i36Jv~1cA>oWHl&z0)+U1P!!e!cjVuXAa?*K z0PbYQJ8}(;hamsgJ+G^KVq|A@HG*p2DfKtrTT91uqhue+VKZ6Vdf2X$!*j|b8 z)ffWi_IF|0Ji=WcH_9AMQ)HeX&T{_amwDM+oN~g7WUHjeTzG4=wU~L*HQ%zVLmiVayoe z2#tPPW=E89kj>MWQFaswataVp#~Fn08GfXE^DD=_h9QqnBMY*f{;g5Qes&^r$aHwl zC}Sr)>jno2MtnoQI*t5VBw#Wf9!8=%lXjTtFHC;dke_zXUn?vzjPQ``aTMNyBu(tU zy$d)KIrZ6N@jN6;-CCs1g_is|l{!-nZZr%iw%O@G4ms>Q!J7!LKxyE6gs;$R;2^NH zNZp4FxogUIqkQZ$47kDKH3N51cqw`>;p=fWE=0m;vrLY{oFvHB*q8ZD1%8x;vk5!5 z$lw)o;wEHIKOIVKyyXTj3%t2(Z^}TAq5KsjqD&)KVeM}GGVswdbbN~N-9dl&T#F2! zCS>{ad6$>%O&NH~P<%JVC$jq}K9QAzcHrk$y?&RUYw-pv&=U)@kP~2E@h^#9$}X*< zΜt&?k)VAxax!6=MyBf25pXCNAb8e|{?6pQwS}0+_eH%%^BLTSYj)*9nKw=F?YW z{kX`*0$cIZ6xqdrawText( 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 );