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);
|
||||
|
||||
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,
|
||||
|
@ -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) {
|
||||
|
@ -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:
|
||||
{
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user