|
|
@@ -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:
|
|
|
{
|