From 47ad127fca0499ae2c6026df524047d74f89ee20 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Sun, 21 Sep 2014 21:12:51 +0200 Subject: [PATCH] Work on selective message restoring. --- .../icons/mini-kfaenza/recycle-bin-empty.png | Bin 3275 -> 3030 bytes .../mini-kfaenza/recycle-bin-restore-all.png | Bin 0 -> 2921 bytes ...estore.png => recycle-bin-restore-one.png} | Bin src/core/messagesmodel.cpp | 10 +++++- src/core/messagesmodel.h | 1 + src/gui/feedmessageviewer.cpp | 4 ++- src/gui/feedsview.cpp | 2 +- src/gui/formmain.cpp | 5 +-- src/gui/formmain.ui | 10 ++++-- src/gui/messagesview.cpp | 33 +++++++++++++++++- src/gui/messagesview.h | 1 + 11 files changed, 58 insertions(+), 8 deletions(-) create mode 100644 resources/graphics/icons/mini-kfaenza/recycle-bin-restore-all.png rename resources/graphics/icons/mini-kfaenza/{recycle-bin-restore.png => recycle-bin-restore-one.png} (100%) diff --git a/resources/graphics/icons/mini-kfaenza/recycle-bin-empty.png b/resources/graphics/icons/mini-kfaenza/recycle-bin-empty.png index acbc49820d21cc73b12287a8c75f28fa1eb735d4..ab34ad257327ccf1cf52946f32f238950901c044 100644 GIT binary patch delta 3024 zcmV;>3orD`8P*q&B!3BTNLh0L01FcU01FcV0GgZ_0000WV@Og>004R=004l4008;_ z004mL004C`008P>0026e000+nl3&F}000YINkl75?s>eRcmd5V>@vi+j)B5yE8j;&*6t>-O28(leO2C;`B;KtDT*Dcg}au``i)C zj2n4K+~C6l078gj;0T+p=fO5n!4J$M0JwnSw@I5K04M;4O;&*fIED{E7{Dwk<-JnM zdCVNTp1Bu7q<@I0kBIgG=m(GlkRAPZFu+GqazFrk1sr(l4dFlZfKB1Xut#=LIwyfSE#w`BRN~03ad=A?5>^ zY4fT%-Jk{_0HBhYJyX@?F|*gUasGS&gnhw#1Gs*#ZGZelejp@okih5)KAjAU8wdbV zEEEjAvgxd*mO-BE0}oWrzkrMDGAN2H*@c>p1`_Yyg_2lwX=403zVgYIpzermw7D zj-mI*eQjFik4Ma*z5V(*w)HvW5#IH)12ZIJtoq(hulSJmYW^HpHqj`+HvFpq8vsr{KD3XwIZ%xlU1jLftKm9;J)XYHrsi*b11t~lLTjQ% zNTw`x=Hb`O+?!9?VXn*!Nq@XNbAoTr>fz?Q63wQczk`Oo0QWLM(`%L3z z8w9uiwE(0~B+S#l-6x01qJnjh%;JfADpmssjn@lIBpvpxooj^MT-N27!nx>3094Ga zaoj*lbu75|2aTHnR2BIT6F~H*hf+t*N8MfI+PQjliIuFfq{A}c(Y*D35`S(xe6W|Z zUw=(?oQu$y(m-(oU#N-(_wShfKoNBSfUE^15B9R*w#KXggkO`s@$xcW36S?K@-LJb z1-7_=-uQ?I+G1AkH+HIyp(ue|?#U5F4Xp7c{QGyzYAvD;1R(zA$28HNjFOK!jL%-E>md8A;-_ZOJcx5K$cuy-r;N z5gOAbP{c&DC*ga4NBve8N#HbbTG!p@hQYp4p1mw?P-TjUG>?jH&VQW^x209vwm(zP zP?WEt4knf%;oY-+<^y?>zyMegT<56_iE_mO*St_nXOk6>PZbiV^lQ$(VirK^U_u>v z{4dmVF3ND5mm?ZBu|_0(d!L%#3ZO3cOw~cnU*U6~6U}h89A2Q5IDk7YaU2$-fDA(G z%0N@zTB9I*=S}J!ihqpk9EuPRn`jnE-`=OD-w&V`fY!P!&?GZdc(27cc8Q}UBt=Ez zfKtSW{}WaHhT*=OtxM40lCx(4qz+0ZqDD^G`weJ9iJpihtV!witBLL^CCQ|9YbK zzEw5kcf03I1Z_CQ+SV&W&HXi^^{mTFI#8GYRk~sqkT{??MHBs|BQ~` zJ>t7%Mun%o2nbmKsgE*rblYChJs4rI%Q|DxkzS}zvNV9ab3YTw21^0N0xfQ}=0!xY%GIJobKlZNZ8o2DTPJab1Ts48wlw548T=2oI}h>X7;Hv8W= zmg$U{6n_UGf?ip&pM1ANcz<45zzb&ui@OuHIik8h)91LmWx3mNxrGVXWk$x`2hb>^p*7>rv%soY# z2Y;A=BqS|hV0(tsuN!E3+KZc7D&P&2P`EPz=l~9-h57R=pF9pe10Z6H{rG*p3vcC8 zf&BO&1;9K;h(BWBY?FbRk7}5|P9W6a!Dslc@s5B!V33oqs5^ z=t~WgFviXXrTk1z&QV@s`q0H2R&H!OX0b8vRa0ocmNtIqzj6g5%!YCmDu8*=#mMMC|}h*}P_*6(L~c zouSzP76VuXU=c=|l-hMJ{mM?CI{~x1B=$S9c^{~rKh0)|Wi SxSksT0000VLp5{o0*9m!1Ec|91X! z2Kb7;+(Z^>qi*|ReU<|Wmw8ZQkZ>}9u**`3KFf&&00zKt+4eUU3l{=V51@lmdX!SS zS_n~lQ*QGH5g|n7oDXx(-vuxVAP2zo+9h9K1wbQ!HIgKKA3%o?Lb<7TdjrUop^Z{{ zhY(@}Kpubv*MB5rw;urz1<*n%JuHL>a~^0i%a$mmVM^&i&Upro2G{@ub=xI40JIZA z*4}Eu0|4h7gpjoW+TqA50gk7Kdl3OpCxnoLr&#{vnnOM29sD%_i2K8`xA`(ifn)jv zm3=VpJffUtoeS4*gkGY=~&Se zRwN1lhQ;`~$*I)GBNKDnNl+L{}hG}Bl|M$aMlhLXs4H=HU~&A6&I!J)NGUu&caxSq5+GV1FH%y!_}Z zZ~ez)Ooy|&tBPCz{t4hyH~{3m#gGD^2|x!SWPh#rqNh}vq`sEsmN&llt>b%Pt;FmM z0b|ZnuZ9@|$)xG+b$|0MY>Lr365_v#Vpp%MTqp z);Tj-FAM`hh^1k}KulL75ANKt=HKI!iK(2HuLcAcfWcA##I6GXy0NvT?JwUra^Z~a7UPo17$}63pa+fR95rfId0_k2o;QcbCz5%+Vi1Zn zAO*lK4ujQ10TPj^{v96|8mICK!o|=rl`1N}aAAfx5)z?hMR8+1B1u_${not^C+Pp$9X34cu` zUu4Uho9Y|4tY05`GAPP{h&82?SH$&-n>+{W5yY-KnUA_9eT*$f*R z>zm%0O-&?JO+%Sl-~uq}0+0q^1!+Jf07QPfZ|C0C`CLOeUR@XlHbg?PE$h}bymIO4 zI0|FCSG=?USQ*>a{xOwI?QX1Z?|%-5LdA1YJx{wkJL_J)GCYhja|9QF5dd*G8em<| zT0rV+iN*FR=n$NtTxOXRj!X91Ki+@j0GtG@m;@ZH$mxtFo*20N>4=&)gXTIAqMf}> z4KWnfHY*dt{q&+h7a^plObrMtMqxT(IG2o%giOoOo6diGvCF>>mSj0hLy{zKkfjFBIEwkr zne@~npIz-gpV3Sf(C)FFPJiPlGkTvtc6dL6%>e*R2IStEO(%lp*r+It3Z+W5vQ(=9 zbZb*%lbp{>f-w~HYqP2Gp}aZz!_SBM&u3MW2lVlnrBgU&X}!-MJLLI<;(Oo#jFZW9 zJZQX<*QDEHjg1umP*MXZ09xikh^~^Qdchb3=LKwYj*F^313(|r&41BHFOT*QdpRt0*Glp)N)|Uf-D_hB$-~x0OArj$sD99$$rezsI zc=0_qq?;p;TpBxlHmmB3`h-*(M-8p_h5HU3!a_|DrVvKjw5*`9HC%)$xp)6X)nSm? zj0D-F5X9Sw^}?AtVSia;j}OK_9Z>VeqCO#$!Tx-%=h?&i_MuP{1OQ=kh@f%IwyQ4W zR2>C!j9Ec8*+7UAmJ1Sj6M#BwS|g7Q#m`(&^Twh+AvK4idA0Z1ukH05BLRSDNR}F9 zNe&v5VRj`|qmmj>Nl8o$8D>669buYeS8J@fXs&A@{AgtI%zt@RHx@UC6zK;Q07+a&Dt{~hn15Hb5!Gg*SS`6>;M+CP zP3s%#V+f8k765h3wnv{xB>M;S#m&J^rNB*d!S6ZS7JtiWqo}NOzGOQ?_JqxnCsl1G z$TQbW#zW6++kCiAQA#B#rUL>S{mD$K|GaK28Xbc8tz3S3im@cFqh#(kfmQ(B06NMX z%K=DNZGXld2rH{XKw&|I3)E+G;csr=*8Rb3GLbaRplU7yz%yLrKhQ08yDYW05+b9F zLg^f1{K<6gOqz=%%2$8DsRxb&n1!z(;`agN0ssIa#f4QPNaJ={Y9PhSUfV`(G8uVz z^QN^ewKdAA*|}Nn6b=1AFaSI&g#Mvvt9umM7JmaN=@Y!=_6w>${*GZ@1fZd^ZL~=M zW5oc30kl;C00%%mv21mROgp*=T~N6ZjDaSmB zM}LJAQUG3A>nwne09*u+TZ-Lb4j>;FV*IB$U4A+m+TJHg;Zoj}C+A=# z=Kz2Z$Mm3;`6m|`Gk%^o`x8P;z$vO;_kSj4kP}={#XL^=3dp~2^K7p`Yy}}y3C#NdbEyCT+yqAj^tTyL5-!3$AaxNTNU?J)mzfZl z=7PUu*%QCA?K3&Ye%0#`egOarOu*eit#)z?K#l?IImYz2Ih*_rp=j-M2 zfFxty{+K&R1K1S-^(;jC4S|Un=PBjjU}9ovPK^}ESbRccsm=^>I5%wp&=WxBMS;l| zA)-Ve+zr&N1ZpMs{}{l>0d*9}34bT7<=ye#j#1g$Uu96iDY0SzKnNkIV(YmCF_%p^ zj!P1NG6K+%!W;3bNF4J5FZnqkS2myo00j+8On%{XEIgDcfYL8DEHN#*7$TJ3l#_ED zj@f&BQ%;4svVC<<&`)2T6!rb+oSvrimIc8l+q}HKb}tOxdT&e26Gw@|(tiT3L*kqp zilW?dTA(Nj;hcMKjV*X*$cB?@rWj*NBoYydqEN;dIOoD|7G5azM++~$`hWAr%!l6K zF&+uup#*=r>ix_)U(g;j#(%cKyLU;F0D$Ydt^k;WlU>?=01Ov^tDN&rUDr2-LZN&l z5}||;iBbwe2%(fhk|g54CVzwwNs>S*C4>poO8iBzjp1G zzXW6K+BN4~c%O_he_z2lhp(^q$qmEcrfJr4&d&iDbY(SxLXQ{$&(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ`?@2^KRCwC#TWM?@R~`SoH#>Xy+FhSBlF|dxrYB9)Mzo^gOIryEP(cU^ zMTiz5M2ipzsS*f!q@o4V&;wQK2WY=E(1wDN(k6Djp-+IZJ%$JcsyeP25>JM-S3 z4?DXaZ|uZgudCF_UmA_}cyIUrd;jzI<}o6|r7RqmxVQj-F}4sm%)UO&LiQ!k`G6=5 zz&xOM>`PfC00;nveOc#NfJ58>N&&3loPUvXUQa~DpJweDV>4399x3I!0Qvw-14v~* zC!&lCr~v!`>J>%#CJ}j7ldm(z3?am;0L}uK0AM;@fC2CUsNkI6Nkkqgc>s`7f-$xpK((!_;!J}I055o=%0?B?JIls1#i^uBmu~w37HJ_%83*O1!GdO5)Ds;x{`6Yw>8jw!2pAJhr>wyh3kY^E-~&(x z;5yFvu0mCUn<|U^Ri$dlT{kptc<6!KH&^;S9Et^ECcp)lA^>is0pJ2qB$y(>T>w)U zh9?dA|5{#wSN?tA>f zUG=pAmAI8wnoB^jY~=-@2r$J0Q=|g~0yu%Y7~pat+&7W>{!b4aBF4?87JYD;035Ob z=piC)MS|eXSNdx=t*xqlK}1Wsgp?4{!lre8_ZzQ#80RfWW^Ktgl z^AGI&`gdRd7r+pT=o5JYfE59tvdCTb%&9@Aq0-LbsEq7?Z~O7@Z_0rOz*eJNiokf0)P?fmHmfLi8D_; z*V@|J-fu}MKp96OfOFunAMd=jx=Jm(Xi8y!v9Gke*r&*xNZvO%Oi%sw{nJgI6CnUe z%tKGlN8kXMIeb!te)V+A$!K(pax+9tb%`qw@RlvtZ3~hGHU@kZkA8W_=QBQ^St-l3 zu=npryAxC95C9#sUa?rw<0BOR%j;(bEX&HKl637N@q>qNxwdhWuY5UKpiu3wQWGfi zW>yFGeQz1~>S;!78`AG{YjsQ>hsM zE}zHEGKCH(JyCm4Y_z&mbqn%UtnsVGU;twh&Ee_3rC3DhtQh`Z$LRQu9q?s0x(M*N z73PTQl#d0ta=Ee#^#Kgb_nY1K?%KNk3YGgfm=9nc2E#HyATXM(T^{?|J#{~Gu{yX2 z;1ZTdVegwq`kTWoF*tT-784Z1U1Osls)eIUbh#9#PhSuKTek%{!9`gBfy|%3_4diG zfdSGq4VtDQscDe&)cU%nA*m&yB{j^<%-}%NhsguY9o-A0!1MlWFyM3L&Yx$~w!9e7 zrRhV7l$rSR2QA&2Vax`lH19rJ^E)hoK!^>G(F^-ev^R&RB6$G7wl-7*=ky357%6Mn z@hh(^5Ye>w;hurc=5TjXO6h1^kS%~R>54$mbOU?eJaINLX(j-eOJAWqi5NK-aPQLeHe>fc1@=Av_6})Wi z8o!!5_h4*NFb0_i0Bj)umLg_CHxs`12KK&n zqAM|FCYBiW0RWA4+aj#>EKdNI7X))% z;b?RsvhSds6>Rg24vo>C{l{B7hmz5yn*MFqxN7UxsFkno*?o6e33zt(?cg^(tzqBG zC(m?*^+X;q<-CMQK0*Mr56;FS@3nW=+>?x?MNduiLyKSbp`EiePO`k?K+f^wbQ%32^aQGDHY8w@&C! z|KU_iN2d{6WNW<;AyV*-5wmkti|&5*&3AQOPXZWOgz59rB6r}?2XELSk%A>tNEy>e znG#R{mZ|%ZRzBQ4Eq?jyBPTjKjs8Ncel8`(mq{)V08Q8RVLLD_#`KwG37VOn2JC$S zrcnA%*wrPF<`dsJJTbLrUu#=Om)U1?3(H}Jv$__P6t!1;aw&l+J|UAt1m>t7opkur zbP})bA4%+gC;U-Iw>7XBxB8@m;Cz;_v;hvKNk~X(A(=ApeycY9$Jg3Fwk$c(aaIiG z$to3=4_FCFYB~r4(b-VnWV4?YdRpA1&6cOia6}tdCN8fqUpj^eP zFBeLKWS5+ll+sXDb=6scs;W#%X*gPS>8u1T08;?Qg%GOO>m^lHxex+UN^-hICY3s~ zMJB&G-^+|~mKF1jadd>)df!>DX5N-kp7Z&9W1J^pGyh#t6abLAuB!mXkUlwPIRP+i z0J@}w!k@tbDkZW zQAA1!DJ9wTIyv?lNeGdBEv2N)T?pa)E=eij_-^Jd4a1PBRH|4?*$$xF)-?spJvQeB zPz#_Dz%>9GkUmDIe9Em~Abm`(13)`~Fn~b-dhW?l9YBU=o&wMbpnMh73KGDmty>hp zkdsn#T0llT0LlOqUkrRffy6}m0j){f-LvsxJ^-Ap@^XpNi$OAHhsAtU-2Vpv(#XBk TN?NBY00000NkvXXu0mjf setBatchMessagesRestored(); + // obnovime zpravy, po obnoveni je treba jako ve funkci setBatchMessagesDeleted + // pres feedCountsChanged dat informaci ze pocty zprav se zmenily, ale oni + // se zmenily nejen ve vybranych kanalech (je vybran odkadkovy kos) ale v kanalech do kterych patri + return true; +} + QVariant MessagesModel::headerData(int section, Qt::Orientation orientation, int role) const { Q_UNUSED(orientation) diff --git a/src/core/messagesmodel.h b/src/core/messagesmodel.h index ce4da6515..1421d42bf 100644 --- a/src/core/messagesmodel.h +++ b/src/core/messagesmodel.h @@ -102,6 +102,7 @@ class MessagesModel : public QSqlTableModel { bool switchBatchMessageImportance(const QModelIndexList &messages); bool setBatchMessagesDeleted(const QModelIndexList &messages, int deleted); bool setBatchMessagesRead(const QModelIndexList &messages, int read); + bool setBatchMessagesRestored(const QModelIndexList &messages); // Fetches ALL available data to the model. void fetchAll(); diff --git a/src/gui/feedmessageviewer.cpp b/src/gui/feedmessageviewer.cpp index f8f6aea8e..637e6e0af 100755 --- a/src/gui/feedmessageviewer.cpp +++ b/src/gui/feedmessageviewer.cpp @@ -235,6 +235,8 @@ void FeedMessageViewer::createConnections() { SIGNAL(triggered()), m_messagesView, SLOT(switchSelectedMessagesImportance())); connect(form_main->m_ui->m_actionDeleteSelectedMessages, SIGNAL(triggered()), m_messagesView, SLOT(deleteSelectedMessages())); + connect(form_main->m_ui->m_actionRestoreSelectedMessagesFromRecycleBin, + SIGNAL(triggered()), m_messagesView, SLOT(restoreSelectedMessages())); connect(form_main->m_ui->m_actionMarkSelectedMessagesAsRead, SIGNAL(triggered()), m_messagesView, SLOT(markSelectedMessagesRead())); connect(form_main->m_ui->m_actionMarkSelectedMessagesAsUnread, @@ -269,7 +271,7 @@ void FeedMessageViewer::createConnections() { SIGNAL(triggered()), m_feedsView, SLOT(openSelectedFeedsInNewspaperMode())); connect(form_main->m_ui->m_actionEmptyRecycleBin, SIGNAL(triggered()), m_feedsView, SLOT(emptyRecycleBin())); - connect(form_main->m_ui->m_actionRestoreAllMessages, + connect(form_main->m_ui->m_actionRestoreRecycleBin, SIGNAL(triggered()), m_feedsView, SLOT(restoreRecycleBin())); connect(form_main->m_ui->m_actionDeleteSelectedFeedCategory, SIGNAL(triggered()), m_feedsView, SLOT(deleteSelectedItem())); diff --git a/src/gui/feedsview.cpp b/src/gui/feedsview.cpp index b800c583f..c192500b9 100755 --- a/src/gui/feedsview.cpp +++ b/src/gui/feedsview.cpp @@ -521,7 +521,7 @@ void FeedsView::initializeContextMenuEmptySpace() { void FeedsView::initializeContextMenuRecycleBin() { m_contextMenuRecycleBin = new QMenu(tr("Context menu for recycle bin"), this); m_contextMenuRecycleBin->addActions(QList() << - qApp->mainForm()->m_ui->m_actionRestoreAllMessages << + qApp->mainForm()->m_ui->m_actionRestoreRecycleBin << qApp->mainForm()->m_ui->m_actionEmptyRecycleBin); } diff --git a/src/gui/formmain.cpp b/src/gui/formmain.cpp index 40278b747..78423ca7d 100755 --- a/src/gui/formmain.cpp +++ b/src/gui/formmain.cpp @@ -127,7 +127,7 @@ QList FormMain::allActions() { actions << m_ui->m_actionDefragmentDatabase; // Add recycle bin actions. - actions << m_ui->m_actionRestoreAllMessages; + actions << m_ui->m_actionRestoreRecycleBin; actions << m_ui->m_actionEmptyRecycleBin; return actions; @@ -222,7 +222,8 @@ void FormMain::setupIcons() { // Recycle bin. m_ui->m_actionEmptyRecycleBin->setIcon(icon_theme_factory->fromTheme("recycle-bin-empty")); - m_ui->m_actionRestoreAllMessages->setIcon(icon_theme_factory->fromTheme("recycle-bin-restore")); + m_ui->m_actionRestoreRecycleBin->setIcon(icon_theme_factory->fromTheme("recycle-bin-restore-all")); + m_ui->m_actionRestoreSelectedMessagesFromRecycleBin->setIcon(icon_theme_factory->fromTheme("recycle-bin-restore-one")); // Web browser. m_ui->m_actionAddBrowser->setIcon(icon_theme_factory->fromTheme("list-add")); diff --git a/src/gui/formmain.ui b/src/gui/formmain.ui index 286b079de..959065135 100755 --- a/src/gui/formmain.ui +++ b/src/gui/formmain.ui @@ -170,7 +170,8 @@ &Recycle bin - + + @@ -598,11 +599,16 @@ &Empty recycle bin - + &Restore all messages + + + Restore &selected messages + + diff --git a/src/gui/messagesview.cpp b/src/gui/messagesview.cpp index e48e7bd40..371f65219 100755 --- a/src/gui/messagesview.cpp +++ b/src/gui/messagesview.cpp @@ -155,7 +155,8 @@ void MessagesView::initializeContextMenu() { qApp->mainForm()->m_ui->m_actionMarkSelectedMessagesAsRead << qApp->mainForm()->m_ui->m_actionMarkSelectedMessagesAsUnread << qApp->mainForm()->m_ui->m_actionSwitchImportanceOfSelectedMessages << - qApp->mainForm()->m_ui->m_actionDeleteSelectedMessages); + qApp->mainForm()->m_ui->m_actionDeleteSelectedMessages << + qApp->mainForm()->m_ui->m_actionRestoreSelectedMessagesFromRecycleBin); } void MessagesView::mousePressEvent(QMouseEvent *event) { @@ -357,6 +358,36 @@ void MessagesView::deleteSelectedMessages() { } } +void MessagesView::restoreSelectedMessages() { + QModelIndex current_index = selectionModel()->currentIndex(); + + if (!current_index.isValid()) { + return; + } + + QModelIndexList selected_indexes = selectionModel()->selectedRows(); + QModelIndexList mapped_indexes = m_proxyModel->mapListToSource(selected_indexes); + + m_sourceModel->setBatchMessagesRestored(mapped_indexes); + sortByColumn(header()->sortIndicatorSection(), header()->sortIndicatorOrder()); + + int row_count = m_sourceModel->rowCount(); + if (row_count > 0) { + QModelIndex last_item = current_index.row() < row_count ? + m_proxyModel->index(current_index.row(), + MSG_DB_TITLE_INDEX) : + m_proxyModel->index(row_count - 1, + MSG_DB_TITLE_INDEX); + + setCurrentIndex(last_item); + scrollTo(last_item); + reselectIndexes(QModelIndexList() << last_item); + } + else { + emit currentMessagesRemoved(); + } +} + void MessagesView::switchSelectedMessagesImportance() { QModelIndex current_index = selectionModel()->currentIndex(); diff --git a/src/gui/messagesview.h b/src/gui/messagesview.h index edd7e1bf5..05aced6b2 100755 --- a/src/gui/messagesview.h +++ b/src/gui/messagesview.h @@ -74,6 +74,7 @@ class MessagesView : public QTreeView { void markSelectedMessagesUnread(); void switchSelectedMessagesImportance(); void deleteSelectedMessages(); + void restoreSelectedMessages(); void selectNextItem(); void selectPreviousItem();