diff --git a/.gitignore b/.gitignore --- a/.gitignore +++ b/.gitignore @@ -1,21 +1,30 @@ # Ignore the following files -*~ +# Build products +*.moc +*.moc.cpp +/build*/ +cmake-build-debug/ +Doxyfile +Makefile + +# Backup and swap *.[oa] *.diff +*.orig +.*.swp +*~ +.swp.* +*.unc-backup* *.kate-swp + +# User settings +.idea/ *.kdev4 .kdev_include_paths *.kdevelop.pcs -*.moc -*.moc.cpp -*.orig +CMakeLists.txt.user* *.user -.*.swp -.swp.* -Doxyfile -Makefile + +# Other avail random_seed -/build*/ -CMakeLists.txt.user* -*.unc-backup* 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,18 +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" #include "basictab.h" @@ -127,13 +132,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 +173,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 @@ -178,10 +178,14 @@ void updateTreeView(bool showHidden); + // toggle expansion of all items in tree + void toggleAllItemExpansion(bool toggle); + public Q_SLOTS: 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 +208,7 @@ void moveUpItem(); void moveDownItem(); + protected: enum SortType { SortByName = 0, @@ -229,7 +234,9 @@ TreeItem *getParentItem(QTreeWidgetItem *item) const; void moveUpOrDownItem(bool isMovingUpAction); - void closeAllItems(QTreeWidgetItem *item); + // recursively toggle expansion of items in tree rooted at /p item + void toggleItem_rec(QTreeWidgetItem *item, bool toggle); + 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 @@ -113,9 +113,7 @@ load(); } -TreeItem::~TreeItem() -{ -} +TreeItem::~TreeItem() = default; /** * @brief Return the description. @@ -498,14 +496,20 @@ } } -void TreeView::closeAllItems(QTreeWidgetItem *item) +void TreeView::toggleItem_rec(QTreeWidgetItem *item, bool toggle) { - item->setExpanded(false); + item->setExpanded(toggle); for (int i = 0; i < item->childCount(); ++i) { - closeAllItems(item->child(i)); + toggleItem_rec(item->child(i), toggle); + } +} +void TreeView::toggleAllItemExpansion(bool toggle) +{ + // call recursive runner on all top level items + for (int i = 0; i < topLevelItemCount(); ++i) { + toggleItem_rec(topLevelItem(i), toggle); } } - TreeItem *TreeView::expandPath(TreeItem *item, const QString &path) { int i = path.indexOf(QStringLiteral("/")); @@ -534,9 +538,9 @@ void TreeView::selectMenu(const QString &menu) { - for (int i = 0; i < topLevelItemCount(); ++i) { - closeAllItems(topLevelItem(i)); - } + + // close all parent expansions + toggleAllItemExpansion(false); if (menu.length() <= 1) { setCurrentItem(topLevelItem(0)); @@ -1926,6 +1930,14 @@ QDBusConnection::sessionBus().send(message); } +/* + * Workaround to set expansion of categories when search updates + */ +void TreeView::searchUpdated(const QString &searchString) { + // close everything if we clear search bar, otherwise open all categories + toggleAllItemExpansion(!searchString.isEmpty()); +} + MenuItemMimeData::MenuItemMimeData(TreeItem *item) : QMimeData() , m_item(item)