SVN commit 1118646 by shantanu: Add simple Type-and-Select feature. BUG: 187241 M +32 -2 iconview.cpp M +2 -0 iconview.h --- trunk/KDE/kdebase/apps/plasma/applets/folderview/iconview.cpp #1118645:1118646 @@ -1669,6 +1669,30 @@ QModelIndex currentIndex = m_selectionModel->currentIndex(); + bool sameKeyWasPressed = m_searchQuery.endsWith(event->text()); + m_searchQuery.append(event->text()); + m_searchQueryTimer.start(2000, this); //clears search query when the user doesn't press any key + + // First try to match the exact icon string + QModelIndexList matches = m_model->match(currentIndex, Qt::DisplayRole, m_searchQuery, + 1, Qt::MatchFixedString | Qt::MatchWrap); + + if (matches.count()<=0) { + // Exact match failed, try matching the beginning of the icon string + matches = m_model->match(currentIndex, Qt::DisplayRole, m_searchQuery, + 1, Qt::MatchStartsWith | Qt::MatchWrap); + + if (matches.count()<=0 && sameKeyWasPressed) { + // Didn't even match beginning, try next icon string starting with the same letter + matches = m_model->match(currentIndex.sibling(currentIndex.row()+1, currentIndex.column()), + Qt::DisplayRole, event->text(), 1, Qt::MatchStartsWith | Qt::MatchWrap); + } + } + + if (matches.count()>0) { + selectIcon(matches.at(0)); + } + switch (event->key()) { case Qt::Key_Home: selectFirstIcon(); @@ -2456,6 +2480,9 @@ void IconView::selectIcon(QModelIndex index) { + if (!index.isValid()) { + return; + } repaintSelectedIcons(); m_selectionModel->select(index, QItemSelectionModel::ClearAndSelect); m_selectionModel->setCurrentIndex(index, QItemSelectionModel::NoUpdate); @@ -2466,8 +2493,8 @@ void IconView::selectFirstOrLastIcon(bool firstIcon) { - int minVertical; - int minHorizontal; + int minVertical=0; + int minHorizontal=0; int dirn=1; //Useful in calculations as it stores whether view is LeftToRight or RightToLeft int isFirst = firstIcon ? 1 : -1; //Useful in calculations to decide whether to select First or Last icon QModelIndex toSelect; @@ -2651,6 +2678,9 @@ connect(m_popupView, SIGNAL(requestClose()), SLOT(popupCloseRequested())); m_popupIndex = m_hoveredIndex; } + } else if (event->timerId() == m_searchQueryTimer.timerId()) { + m_searchQuery.clear(); + m_searchQueryTimer.stop(); } } --- trunk/KDE/kdebase/apps/plasma/applets/folderview/iconview.h #1118645:1118646 @@ -252,6 +252,7 @@ QBasicTimer m_delayedRelayoutTimer; QBasicTimer m_delayedCacheClearTimer; QBasicTimer m_toolTipShowTimer; + QBasicTimer m_searchQueryTimer; ToolTipWidget *m_toolTipWidget; QPointer m_popupView; QPointer m_popupCausedWidget; @@ -263,6 +264,7 @@ Animator *m_animator; ActionOverlay *m_actionOverlay; QStringList m_popupPreviewPlugins; + QString m_searchQuery; }; #endif