diff --git a/krusader/BookMan/krbookmarkhandler.h b/krusader/BookMan/krbookmarkhandler.h --- a/krusader/BookMan/krbookmarkhandler.h +++ b/krusader/BookMan/krbookmarkhandler.h @@ -81,6 +81,7 @@ QPointer _mainBookmarkPopup; // main bookmark popup menu QList _specialBookmarks; // the action list of the special bookmarks + QString* _menuSearch; //Search as you type string for the bookmark menu }; Q_DECLARE_METATYPE(KrBookmark *) diff --git a/krusader/BookMan/krbookmarkhandler.cpp b/krusader/BookMan/krbookmarkhandler.cpp --- a/krusader/BookMan/krbookmarkhandler.cpp +++ b/krusader/BookMan/krbookmarkhandler.cpp @@ -58,6 +58,8 @@ _privateCollection = new KActionCollection(this); _collection = _mainWindow->actions(); + _menuSearch = new QString(); + // create _root: father of all bookmarks. it is a dummy bookmark and never shown _root = new KrBookmark(i18n("Bookmarks")); _root->setParent(this); @@ -75,6 +77,7 @@ { delete manager; delete _privateCollection; + delete _menuSearch; } void KrBookmarkHandler::bookmarkCurrent(QUrl url) @@ -471,6 +474,51 @@ bool KrBookmarkHandler::eventFilter(QObject *obj, QEvent *ev) { + if(ev->type() == QEvent::Show){ + *_menuSearch = ""; + } + + //Having it occur on keypress is consistent with other shortcuts, + //such as ctrl+w and the '&' bookmark shortcut standard + //(&movies makes m a shortcut for said bookmark) + if(ev->type() == QEvent::KeyPress && obj->inherits("QMenu")){ + QKeyEvent* kev = static_cast(ev); + if( kev->modifiers() != Qt::NoModifier || + kev->text().isEmpty() || + kev->key() == Qt::Key_Delete){ + return QObject::eventFilter(obj, ev); + } + if (kev->key() == Qt::Key_Backspace){ + _menuSearch->chop(1); + } + else { + _menuSearch->append(kev->text()); + } + + QMenu *menu = static_cast(obj); + QList acts = menu->actions(); + QAction* found = NULL; + int menuSearchLength = _menuSearch->length(); + for (auto& act : acts){ + if (_specialBookmarks.contains(act) || act->isSeparator()) continue; + if(act->text().left(menuSearchLength).compare(_menuSearch, Qt::CaseInsensitive) == 0){ + if (!found){ + found = act; + } else { + menu->setActiveAction(found); + return QObject::eventFilter(obj, ev); + } + } + } + if (found){ + found->activate(QAction::Trigger); + menu->close(); + } else { + *_menuSearch = ""; + } + return QObject::eventFilter(obj, ev); + } + if (ev->type() == QEvent::MouseButtonRelease) { switch (static_cast(ev)->button()) { case Qt::RightButton: