diff --git a/krusader/BookMan/krbookmarkhandler.h b/krusader/BookMan/krbookmarkhandler.h --- a/krusader/BookMan/krbookmarkhandler.h +++ b/krusader/BookMan/krbookmarkhandler.h @@ -83,8 +83,9 @@ QPointer _mainBookmarkPopup; // main bookmark popup menu QList _specialBookmarks; // the action list of the special bookmarks - QWidgetAction *_quickSearchAction; - QLineEdit *_quickSearchBar; + QWidgetAction *_quickSearchAction; ///< Search bar container action + QLineEdit *_quickSearchBar; ///< Search bar containing current query + QMenu *_quickSearchMenu; ///< The menu where the search is performed QHash _quickSearchOriginalActionTitles; ///< Saved original action text values to restore after search void _setQuickSearchText(const QString &text); diff --git a/krusader/BookMan/krbookmarkhandler.cpp b/krusader/BookMan/krbookmarkhandler.cpp --- a/krusader/BookMan/krbookmarkhandler.cpp +++ b/krusader/BookMan/krbookmarkhandler.cpp @@ -35,6 +35,7 @@ #include #include #include +#include // QtGui #include #include @@ -52,9 +53,15 @@ #define BOOKMARKS_FILE "krusader/krbookmarks.xml" #define CONNECT_BM(X) { disconnect(X, SIGNAL(activated(QUrl)), 0, 0); connect(X, SIGNAL(activated(QUrl)), this, SLOT(slotActivated(QUrl))); } -KrBookmarkHandler::KrBookmarkHandler(KrMainWindow *mainWindow) : QObject(mainWindow->widget()), - _mainWindow(mainWindow), _middleClick(false), _mainBookmarkPopup(0), _specialBookmarks(), - _quickSearchAction(nullptr), _quickSearchBar(nullptr) +KrBookmarkHandler::KrBookmarkHandler(KrMainWindow *mainWindow) : + QObject(mainWindow->widget()), + _mainWindow(mainWindow), + _middleClick(false), + _mainBookmarkPopup(0), + _specialBookmarks(), + _quickSearchAction(nullptr), + _quickSearchBar(nullptr), + _quickSearchMenu(nullptr) { // create our own action collection and make the shortcuts apply only to parent _privateCollection = new KActionCollection(this); @@ -538,16 +545,41 @@ bool KrBookmarkHandler::eventFilter(QObject *obj, QEvent *ev) { - if (obj->inherits("QMenu") && (ev->type() == QEvent::Show || - ev->type() == QEvent::Close)) { + auto eventType = ev->type(); + QMenu *menu = dynamic_cast(obj); + + if (eventType == QEvent::Show && menu) { _setQuickSearchText(""); + _quickSearchMenu = menu; + qDebug() << "Bookmark search: menu" << menu << "is shown"; + } + + if (eventType == QEvent::Close && menu && _quickSearchMenu) { + if (_quickSearchMenu == menu) { + qDebug() << "Bookmark search: stopped on menu" << menu; + _setQuickSearchText(""); + _quickSearchMenu = nullptr; + } + else { + qDebug() << "Bookmark search: active action =" << _quickSearchMenu->activeAction(); + + // fix automatic deactivation of current action due to spurious close event from submenu + auto quickSearchMenu = _quickSearchMenu; + auto activeAction = _quickSearchMenu->activeAction(); + QTimer::singleShot(0, this, [=]() { + qDebug() << "Bookmark search: active action =" << quickSearchMenu->activeAction(); + if (!quickSearchMenu->activeAction() && activeAction) { + quickSearchMenu->setActiveAction(activeAction); + qDebug() << "Bookmark search: restored active action =" << quickSearchMenu->activeAction(); + } + }); + } } // Having it occur on keypress is consistent with other shortcuts, // such as Ctrl+W and accelerator keys - if (ev->type() == QEvent::KeyPress && obj->inherits("QMenu")) { + if (eventType == QEvent::KeyPress && menu) { QKeyEvent *kev = static_cast(ev); - QMenu *menu = static_cast(obj); QList acts = menu->actions(); bool quickSearchStarted = false; bool searchInSpecialItems = KConfigGroup(krConfig, "Look&Feel").readEntry("Search in special items", false); @@ -561,9 +593,8 @@ kev->text().isEmpty() || kev->key() == Qt::Key_Delete || kev->key() == Qt::Key_Return || - kev->key() == Qt::Key_Escape) + kev->key() == Qt::Key_Escape) { - { return QObject::eventFilter(obj, ev); } @@ -582,7 +613,8 @@ } if (quickSearchStarted) { - qDebug() << "Bookmark search: started"; + _quickSearchMenu = menu; + qDebug() << "Bookmark search: started on menu" << menu; } // match actions @@ -652,7 +684,7 @@ return true; } - if (ev->type() == QEvent::MouseButtonRelease) { + if (eventType == QEvent::MouseButtonRelease) { switch (static_cast(ev)->button()) { case Qt::RightButton: _middleClick = false;