mirror of
https://gitee.com/vnotex/vnote.git
synced 2025-07-05 13:59:52 +08:00
search: add context menu to search result tree
This commit is contained in:
parent
7c9da2a37c
commit
eb4d2a7ba3
@ -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,
|
||||||
|
@ -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) {
|
||||||
|
@ -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:
|
||||||
{
|
{
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user