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);
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,

View File

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

View File

@ -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)
{
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) {
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<VSearchResultItem> &resItem = m_data[idx];
const QSharedPointer<VSearchResultItem> &resItem = itemResultData(p_item);
switch (resItem->m_type) {
case VSearchResultItem::Note:
{

View File

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