diff --git a/src/vcart.cpp b/src/vcart.cpp index 753ea8ca..5f2b9721 100644 --- a/src/vcart.cpp +++ b/src/vcart.cpp @@ -75,7 +75,7 @@ void VCart::initActions() this, &VCart::openSelectedItems); m_locateAct = new QAction(VIconUtils::menuIcon(":/resources/icons/locate_note.svg"), - tr("Locate To Folder"), + tr("&Locate To Folder"), this); m_locateAct->setToolTip(tr("Locate the folder of current note")); connect(m_locateAct, &QAction::triggered, diff --git a/src/vfilelist.cpp b/src/vfilelist.cpp index fc78229a..bce14951 100644 --- a/src/vfilelist.cpp +++ b/src/vfilelist.cpp @@ -551,14 +551,14 @@ void VFileList::deleteFiles(const QVector &p_files) void VFileList::contextMenuRequested(QPoint pos) { - QListWidgetItem *item = fileList->itemAt(pos); - QMenu menu(this); - menu.setToolTipsVisible(true); - if (!m_directory) { return; } + QListWidgetItem *item = fileList->itemAt(pos); + QMenu menu(this); + menu.setToolTipsVisible(true); + int selectedSize = fileList->selectedItems().size(); if (item && selectedSize == 1) { diff --git a/src/vsearchresulttree.cpp b/src/vsearchresulttree.cpp index c121188e..0c9487cc 100644 --- a/src/vsearchresulttree.cpp +++ b/src/vsearchresulttree.cpp @@ -1,9 +1,14 @@ #include "vsearchresulttree.h" +#include +#include + #include "utils/viconutils.h" #include "vnote.h" #include "vmainwindow.h" #include "vnotebookselector.h" +#include "vnotefile.h" +#include "vcart.h" extern VNote *g_vnote; @@ -15,6 +20,8 @@ VSearchResultTree::VSearchResultTree(QWidget *p_parent) setColumnCount(1); setHeaderHidden(true); setExpandsOnDoubleClick(false); + setContextMenuPolicy(Qt::CustomContextMenu); + setSelectionMode(QAbstractItemView::ExtendedSelection); setSimpleSearchMatchFlags(getSimpleSearchMatchFlags() & ~Qt::MatchRecursive); @@ -22,8 +29,34 @@ VSearchResultTree::VSearchResultTree(QWidget *p_parent) m_folderIcon = VIconUtils::treeViewIcon(":/resources/icons/dir_item.svg"); m_notebookIcon = VIconUtils::treeViewIcon(":/resources/icons/notebook_item.svg"); + initActions(); + connect(this, &VTreeWidget::itemActivated, - this, &VSearchResultTree::handleItemActivated); + this, &VSearchResultTree::activateItem); + connect(this, &VTreeWidget::customContextMenuRequested, + this, &VSearchResultTree::handleContextMenuRequested); +} + +void VSearchResultTree::initActions() +{ + m_openAct = new QAction(tr("&Open"), this); + m_openAct->setToolTip(tr("Open selected notes")); + connect(m_openAct, &QAction::triggered, + this, [this]() { + activateItem(topLevelItem(currentItem())); + }); + + m_locateAct = new QAction(VIconUtils::menuIcon(":/resources/icons/locate_note.svg"), + tr("&Locate To Folder"), + this); + m_locateAct->setToolTip(tr("Locate the folder of current note")); + connect(m_locateAct, &QAction::triggered, + this, &VSearchResultTree::locateCurrentItem); + + m_addToCartAct = new QAction(tr("Add To Cart"), this); + m_addToCartAct->setToolTip(tr("Add selected notes to Cart for further processing")); + connect(m_addToCartAct, &QAction::triggered, + this, &VSearchResultTree::addSelectedItemsToCart); } void VSearchResultTree::updateResults(const QList > &p_items) @@ -93,22 +126,100 @@ void VSearchResultTree::appendItem(const QSharedPointer &p_it } } -void VSearchResultTree::handleItemActivated(QTreeWidgetItem *p_item, int p_column) +void VSearchResultTree::handleContextMenuRequested(QPoint p_pos) +{ + QTreeWidgetItem *item = itemAt(p_pos); + if (!item) { + return; + } + + QMenu menu(this); + menu.setToolTipsVisible(true); + + QList items = selectedItems(); + + bool hasNote = false; + for (auto const & it : items) { + if (itemResultType(it) == VSearchResultItem::Note) { + hasNote = true; + break; + } + } + + if (items.size() == 1) { + menu.addAction(m_openAct); + + if (hasNote) { + menu.addAction(m_locateAct); + } + } + + if (hasNote) { + menu.addAction(m_addToCartAct); + } + + menu.exec(mapToGlobal(p_pos)); +} + +void VSearchResultTree::locateCurrentItem() +{ + auto item = currentItem(); + if (!item) { + return; + } + + const QSharedPointer &resItem = itemResultData(item); + if (resItem->m_type == VSearchResultItem::Note) { + VFile *file = g_vnote->getInternalFile(resItem->m_path); + if (file) { + g_mainWin->locateFile(file); + } + } +} + +void VSearchResultTree::addSelectedItemsToCart() +{ + QList items = selectedItems(); + VCart *cart = g_mainWin->getCart(); + + int nrAdded = 0; + for (int i = 0; i < items.size(); ++i) { + const QSharedPointer &resItem = itemResultData(items[i]); + if (resItem->m_type == VSearchResultItem::Note) { + cart->addFile(resItem->m_path); + ++nrAdded; + } + } + + if (nrAdded) { + g_mainWin->showStatusMessage(tr("%1 %2 added to Cart") + .arg(nrAdded) + .arg(nrAdded > 1 ? tr("notes") : tr("note"))); + } +} + +VSearchResultItem::ItemType VSearchResultTree::itemResultType(const QTreeWidgetItem *p_item) const +{ + Q_ASSERT(p_item); + return itemResultData(p_item)->m_type; +} + +const QSharedPointer &VSearchResultTree::itemResultData(const QTreeWidgetItem *p_item) const +{ + Q_ASSERT(p_item); + const QTreeWidgetItem *topItem = topLevelItem(p_item); + int idx = topItem->data(0, Qt::UserRole).toInt(); + Q_ASSERT(idx >= 0 && idx < m_data.size()); + return m_data[idx]; +} + +void VSearchResultTree::activateItem(const QTreeWidgetItem *p_item) const { - Q_UNUSED(p_column); if (!p_item) { return; } - QTreeWidgetItem *topItem = p_item; - if (p_item->parent()) { - topItem = p_item->parent(); - } - - int idx = topItem->data(0, Qt::UserRole).toInt(); - Q_ASSERT(idx >= 0 && idx < m_data.size()); - - const QSharedPointer &resItem = m_data[idx]; + const QSharedPointer &resItem = itemResultData(p_item); switch (resItem->m_type) { case VSearchResultItem::Note: { diff --git a/src/vsearchresulttree.h b/src/vsearchresulttree.h index d5f3c35d..bc9f2e48 100644 --- a/src/vsearchresulttree.h +++ b/src/vsearchresulttree.h @@ -6,6 +6,8 @@ #include "vtreewidget.h" #include "vsearch.h" +class QAction; + class VSearchResultTree : public VTreeWidget { @@ -20,20 +22,52 @@ public: public slots: void addResultItem(const QSharedPointer &p_item); + void handleContextMenuRequested(QPoint p_pos); + signals: void countChanged(int p_count); private slots: - void handleItemActivated(QTreeWidgetItem *p_item, int p_column); + void locateCurrentItem(); + + void addSelectedItemsToCart(); private: void appendItem(const QSharedPointer &p_item); + void initActions(); + + VSearchResultItem::ItemType itemResultType(const QTreeWidgetItem *p_item) const; + + const QTreeWidgetItem *topLevelItem(const QTreeWidgetItem *p_item) const; + + void activateItem(const QTreeWidgetItem *p_item) const; + + const QSharedPointer &itemResultData(const QTreeWidgetItem *p_item) const; + QVector > m_data; QIcon m_noteIcon; QIcon m_folderIcon; QIcon m_notebookIcon; + + QAction *m_openAct; + + QAction *m_locateAct; + + QAction *m_addToCartAct; }; +inline const QTreeWidgetItem *VSearchResultTree::topLevelItem(const QTreeWidgetItem *p_item) const +{ + if (!p_item) { + return NULL; + } + + if (p_item->parent()) { + return p_item->parent(); + } else { + return p_item; + } +} #endif // VSEARCHRESULTTREE_H