Przeglądaj źródła

search: add context menu to search result tree

Le Tan 7 lat temu
rodzic
commit
eb4d2a7ba3
4 zmienionych plików z 159 dodań i 14 usunięć
  1. 1 1
      src/vcart.cpp
  2. 4 4
      src/vfilelist.cpp
  3. 119 8
      src/vsearchresulttree.cpp
  4. 35 1
      src/vsearchresulttree.h

+ 1 - 1
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,

+ 4 - 4
src/vfilelist.cpp

@@ -551,14 +551,14 @@ void VFileList::deleteFiles(const QVector<VNoteFile *> &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) {

+ 119 - 8
src/vsearchresulttree.cpp

@@ -1,9 +1,14 @@
 #include "vsearchresulttree.h"
 
+#include <QAction>
+#include <QMenu>
+
 #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<QSharedPointer<VSearchResultItem> > &p_items)
@@ -93,22 +126,100 @@ void VSearchResultTree::appendItem(const QSharedPointer<VSearchResultItem> &p_it
     }
 }
 
-void VSearchResultTree::handleItemActivated(QTreeWidgetItem *p_item, int p_column)
+void VSearchResultTree::handleContextMenuRequested(QPoint p_pos)
 {
-    Q_UNUSED(p_column);
-    if (!p_item) {
+    QTreeWidgetItem *item = itemAt(p_pos);
+    if (!item) {
+        return;
+    }
+
+    QMenu menu(this);
+    menu.setToolTipsVisible(true);
+
+    QList<QTreeWidgetItem *> 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;
     }
 
-    QTreeWidgetItem *topItem = p_item;
-    if (p_item->parent()) {
-        topItem = p_item->parent();
+    const QSharedPointer<VSearchResultItem> &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<QTreeWidgetItem *> items = selectedItems();
+    VCart *cart = g_mainWin->getCart();
+
+    int nrAdded = 0;
+    for (int i = 0; i < items.size(); ++i) {
+        const QSharedPointer<VSearchResultItem> &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<VSearchResultItem> &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
+{
+    if (!p_item) {
+        return;
+    }
 
-    const QSharedPointer<VSearchResultItem> &resItem = m_data[idx];
+    const QSharedPointer<VSearchResultItem> &resItem = itemResultData(p_item);
     switch (resItem->m_type) {
     case VSearchResultItem::Note:
     {

+ 35 - 1
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<VSearchResultItem> &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<VSearchResultItem> &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<VSearchResultItem> &itemResultData(const QTreeWidgetItem *p_item) const;
+
     QVector<QSharedPointer<VSearchResultItem> > 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