search: add context menu to search result tree

This commit is contained in:
Le Tan 2018-03-15 22:00:30 +08:00
parent 7c9da2a37c
commit eb4d2a7ba3
4 changed files with 163 additions and 18 deletions

View File

@ -75,7 +75,7 @@ void VCart::initActions()
this, &VCart::openSelectedItems); this, &VCart::openSelectedItems);
m_locateAct = new QAction(VIconUtils::menuIcon(":/resources/icons/locate_note.svg"), m_locateAct = new QAction(VIconUtils::menuIcon(":/resources/icons/locate_note.svg"),
tr("Locate To Folder"), tr("&Locate To Folder"),
this); this);
m_locateAct->setToolTip(tr("Locate the folder of current note")); m_locateAct->setToolTip(tr("Locate the folder of current note"));
connect(m_locateAct, &QAction::triggered, connect(m_locateAct, &QAction::triggered,

View File

@ -551,14 +551,14 @@ void VFileList::deleteFiles(const QVector<VNoteFile *> &p_files)
void VFileList::contextMenuRequested(QPoint pos) void VFileList::contextMenuRequested(QPoint pos)
{ {
QListWidgetItem *item = fileList->itemAt(pos);
QMenu menu(this);
menu.setToolTipsVisible(true);
if (!m_directory) { if (!m_directory) {
return; return;
} }
QListWidgetItem *item = fileList->itemAt(pos);
QMenu menu(this);
menu.setToolTipsVisible(true);
int selectedSize = fileList->selectedItems().size(); int selectedSize = fileList->selectedItems().size();
if (item && selectedSize == 1) { if (item && selectedSize == 1) {

View File

@ -1,9 +1,14 @@
#include "vsearchresulttree.h" #include "vsearchresulttree.h"
#include <QAction>
#include <QMenu>
#include "utils/viconutils.h" #include "utils/viconutils.h"
#include "vnote.h" #include "vnote.h"
#include "vmainwindow.h" #include "vmainwindow.h"
#include "vnotebookselector.h" #include "vnotebookselector.h"
#include "vnotefile.h"
#include "vcart.h"
extern VNote *g_vnote; extern VNote *g_vnote;
@ -15,6 +20,8 @@ VSearchResultTree::VSearchResultTree(QWidget *p_parent)
setColumnCount(1); setColumnCount(1);
setHeaderHidden(true); setHeaderHidden(true);
setExpandsOnDoubleClick(false); setExpandsOnDoubleClick(false);
setContextMenuPolicy(Qt::CustomContextMenu);
setSelectionMode(QAbstractItemView::ExtendedSelection);
setSimpleSearchMatchFlags(getSimpleSearchMatchFlags() & ~Qt::MatchRecursive); setSimpleSearchMatchFlags(getSimpleSearchMatchFlags() & ~Qt::MatchRecursive);
@ -22,8 +29,34 @@ VSearchResultTree::VSearchResultTree(QWidget *p_parent)
m_folderIcon = VIconUtils::treeViewIcon(":/resources/icons/dir_item.svg"); m_folderIcon = VIconUtils::treeViewIcon(":/resources/icons/dir_item.svg");
m_notebookIcon = VIconUtils::treeViewIcon(":/resources/icons/notebook_item.svg"); m_notebookIcon = VIconUtils::treeViewIcon(":/resources/icons/notebook_item.svg");
initActions();
connect(this, &VTreeWidget::itemActivated, 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) 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)
{
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;
}
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
{ {
Q_UNUSED(p_column);
if (!p_item) { if (!p_item) {
return; return;
} }
QTreeWidgetItem *topItem = p_item; const QSharedPointer<VSearchResultItem> &resItem = itemResultData(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<VSearchResultItem> &resItem = m_data[idx];
switch (resItem->m_type) { switch (resItem->m_type) {
case VSearchResultItem::Note: case VSearchResultItem::Note:
{ {

View File

@ -6,6 +6,8 @@
#include "vtreewidget.h" #include "vtreewidget.h"
#include "vsearch.h" #include "vsearch.h"
class QAction;
class VSearchResultTree : public VTreeWidget class VSearchResultTree : public VTreeWidget
{ {
@ -20,20 +22,52 @@ public:
public slots: public slots:
void addResultItem(const QSharedPointer<VSearchResultItem> &p_item); void addResultItem(const QSharedPointer<VSearchResultItem> &p_item);
void handleContextMenuRequested(QPoint p_pos);
signals: signals:
void countChanged(int p_count); void countChanged(int p_count);
private slots: private slots:
void handleItemActivated(QTreeWidgetItem *p_item, int p_column); void locateCurrentItem();
void addSelectedItemsToCart();
private: private:
void appendItem(const QSharedPointer<VSearchResultItem> &p_item); 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; QVector<QSharedPointer<VSearchResultItem> > m_data;
QIcon m_noteIcon; QIcon m_noteIcon;
QIcon m_folderIcon; QIcon m_folderIcon;
QIcon m_notebookIcon; 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 #endif // VSEARCHRESULTTREE_H