diff --git a/kmenuedit.h b/kmenuedit.h --- a/kmenuedit.h +++ b/kmenuedit.h @@ -26,6 +26,7 @@ class QAction; class BasicTab; class TreeView; +class KTreeWidgetSearchLine; class KMenuEdit : public KXmlGuiWindow { @@ -56,6 +57,7 @@ TreeView *m_tree = nullptr; BasicTab *m_basicTab = nullptr; QSplitter *m_splitter = nullptr; + KTreeWidgetSearchLine* m_searchLine = nullptr; QAction *m_actionDelete = nullptr; bool m_showHidden = false; diff --git a/kmenuedit.cpp b/kmenuedit.cpp --- a/kmenuedit.cpp +++ b/kmenuedit.cpp @@ -20,17 +20,21 @@ #include "kmenuedit.h" #include +#include +#include #include #include #include #include + #include #include #include #include #include #include +#include #include #include "treeview.h" @@ -127,13 +131,30 @@ void KMenuEdit::setupView() { + // setup search and tree view + m_tree = new TreeView(actionCollection(), this); + + m_searchLine = new KTreeWidgetSearchLine(this, m_tree); + m_searchLine->setCaseSensitivity(Qt::CaseSensitivity::CaseInsensitive); + m_searchLine->setKeepParentsVisible(true); + m_searchLine->setPlaceholderText(i18n("Search...")); + m_searchLine->setToolTip(i18n("Type to filter applications below")); + + auto treeLayout = new QVBoxLayout; + treeLayout->addWidget(m_searchLine); + treeLayout->addWidget(m_tree); + auto treeFrame = new QFrame; + treeFrame->setLayout(treeLayout); + m_splitter = new QSplitter(this); m_splitter->setOrientation(Qt::Horizontal); - m_tree = new TreeView(actionCollection(), this); - m_splitter->addWidget(m_tree); + m_splitter->addWidget(treeFrame); + + // setup info tab view m_basicTab = new BasicTab; m_splitter->addWidget(m_basicTab); + connect(m_tree, SIGNAL(entrySelected(MenuFolderInfo*)), m_basicTab, SLOT(setFolderInfo(MenuFolderInfo*))); connect(m_tree, SIGNAL(entrySelected(MenuEntryInfo*)), @@ -150,6 +171,8 @@ connect(m_basicTab, &BasicTab::findServiceShortcut, m_tree, &TreeView::findServiceShortcut); + connect(m_searchLine, &KTreeWidgetSearchLine::searchUpdated, + m_tree, &TreeView::searchUpdated); // restore splitter sizes QList sizes = ConfigurationManager::getInstance()->getSplitterSizes(); if (sizes.isEmpty()) { diff --git a/treeview.h b/treeview.h --- a/treeview.h +++ b/treeview.h @@ -182,6 +182,7 @@ void currentDataChanged(MenuFolderInfo *folderInfo); void currentDataChanged(MenuEntryInfo *entryInfo); void findServiceShortcut(const QKeySequence &, KService::Ptr &); + void searchUpdated(const QString &searchString); Q_SIGNALS: void entrySelected(MenuFolderInfo *folderInfo); @@ -204,6 +205,7 @@ void moveUpItem(); void moveDownItem(); + protected: enum SortType { SortByName = 0, @@ -229,7 +231,6 @@ TreeItem *getParentItem(QTreeWidgetItem *item) const; void moveUpOrDownItem(bool isMovingUpAction); - void closeAllItems(QTreeWidgetItem *item); TreeItem *expandPath(TreeItem *item, const QString &path); // moving = src will be removed later diff --git a/treeview.cpp b/treeview.cpp --- a/treeview.cpp +++ b/treeview.cpp @@ -497,15 +497,6 @@ } } } - -void TreeView::closeAllItems(QTreeWidgetItem *item) -{ - item->setExpanded(false); - for (int i = 0; i < item->childCount(); ++i) { - closeAllItems(item->child(i)); - } -} - TreeItem *TreeView::expandPath(TreeItem *item, const QString &path) { int i = path.indexOf(QStringLiteral("/")); @@ -534,9 +525,10 @@ void TreeView::selectMenu(const QString &menu) { - for (int i = 0; i < topLevelItemCount(); ++i) { - closeAllItems(topLevelItem(i)); - } + + // close all parent expansions and deselect everything + collapseAll(); + setCurrentIndex(rootIndex()); if (menu.length() <= 1) { setCurrentItem(topLevelItem(0)); @@ -1926,6 +1918,19 @@ QDBusConnection::sessionBus().send(message); } +/* + * Workaround to set expansion of categories when search updates + */ +void TreeView::searchUpdated(const QString &searchString) { + // expand all categories if we typed more than a few characters, otherwise collapse and un-select everything + if (searchString.length() > 2) { + expandAll(); + } else { + collapseAll(); + setCurrentIndex(rootIndex()); + } +} + MenuItemMimeData::MenuItemMimeData(TreeItem *item) : QMimeData() , m_item(item)