Index: .gitignore =================================================================== --- .gitignore +++ .gitignore @@ -19,3 +19,5 @@ /build*/ CMakeLists.txt.user* *.unc-backup* +.idea/ +cmake-build-debug/ \ No newline at end of file Index: kmenuedit.h =================================================================== --- kmenuedit.h +++ 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; Index: kmenuedit.cpp =================================================================== --- kmenuedit.cpp +++ kmenuedit.cpp @@ -20,17 +20,23 @@ #include "kmenuedit.h" #include +#include +#include +#include +#include #include #include #include #include + #include #include #include #include #include #include +#include #include #include "treeview.h" @@ -127,13 +133,31 @@ 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); + auto searchLayout = new QHBoxLayout; + searchLayout->addWidget(new QLabel(i18n("Filter:"))); + searchLayout->addWidget(m_searchLine); + + auto treeLayout = new QVBoxLayout; + treeLayout->addLayout(searchLayout); + 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 +174,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()) { Index: treeview.h =================================================================== --- treeview.h +++ 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 Index: treeview.cpp =================================================================== --- treeview.cpp +++ 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)