mirror of
https://gitee.com/vnotex/vnote.git
synced 2025-07-05 13:59:52 +08:00
UniversalEntry/Searcher: Ctrl+B to expand/collapse all items
This commit is contained in:
parent
3902f7f080
commit
02fc5f20f3
@ -103,6 +103,11 @@ public:
|
||||
m_widgetParent = p_parent;
|
||||
}
|
||||
|
||||
virtual void expandCollapseAll(int p_id)
|
||||
{
|
||||
Q_UNUSED(p_id);
|
||||
}
|
||||
|
||||
signals:
|
||||
void widgetUpdated();
|
||||
|
||||
|
@ -1540,28 +1540,6 @@ QStringList VUtils::parseCombinedArgString(const QString &p_program)
|
||||
return args;
|
||||
}
|
||||
|
||||
const QTreeWidgetItem *VUtils::topLevelTreeItem(const QTreeWidgetItem *p_item)
|
||||
{
|
||||
if (!p_item) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (p_item->parent()) {
|
||||
return topLevelTreeItem(p_item->parent());
|
||||
} else {
|
||||
return p_item;
|
||||
}
|
||||
}
|
||||
|
||||
int VUtils::childIndexOfTreeItem(const QTreeWidgetItem *p_item)
|
||||
{
|
||||
if (p_item->parent()) {
|
||||
return p_item->parent()->indexOfChild(const_cast<QTreeWidgetItem *>(p_item));
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
QImage VUtils::imageFromFile(const QString &p_filePath)
|
||||
{
|
||||
QImage img;
|
||||
|
@ -333,10 +333,6 @@ public:
|
||||
// From QProcess code.
|
||||
static QStringList parseCombinedArgString(const QString &p_program);
|
||||
|
||||
static const QTreeWidgetItem *topLevelTreeItem(const QTreeWidgetItem *p_item);
|
||||
|
||||
static int childIndexOfTreeItem(const QTreeWidgetItem *p_item);
|
||||
|
||||
// Read QImage from local file @p_filePath.
|
||||
// Directly calling QImage(p_filePath) will judge the image format from the suffix,
|
||||
// resulting a null image in wrong suffix case.
|
||||
|
@ -80,6 +80,15 @@ namespace SnippetConfig
|
||||
static const QString c_autoIndent = "auto_indent";
|
||||
}
|
||||
|
||||
namespace Shortcut
|
||||
{
|
||||
static const QString c_expand = "Ctrl+B";
|
||||
static const QString c_info = "F2";
|
||||
static const QString c_copy = "Ctrl+C";
|
||||
static const QString c_cut = "Ctrl+X";
|
||||
static const QString c_paste = "Ctrl+V";
|
||||
}
|
||||
|
||||
static const QString c_emptyHeaderName = "[EMPTY]";
|
||||
|
||||
enum class TextDecoration
|
||||
|
@ -20,11 +20,6 @@ extern VMainWindow *g_mainWin;
|
||||
extern VConfigManager *g_config;
|
||||
extern VNote *g_vnote;
|
||||
|
||||
const QString VDirectoryTree::c_infoShortcutSequence = "F2";
|
||||
const QString VDirectoryTree::c_copyShortcutSequence = "Ctrl+C";
|
||||
const QString VDirectoryTree::c_cutShortcutSequence = "Ctrl+X";
|
||||
const QString VDirectoryTree::c_pasteShortcutSequence = "Ctrl+V";
|
||||
|
||||
VDirectoryTree::VDirectoryTree(QWidget *parent)
|
||||
: VTreeWidget(parent),
|
||||
VNavigationMode(),
|
||||
@ -49,28 +44,28 @@ VDirectoryTree::VDirectoryTree(QWidget *parent)
|
||||
|
||||
void VDirectoryTree::initShortcuts()
|
||||
{
|
||||
QShortcut *infoShortcut = new QShortcut(QKeySequence(c_infoShortcutSequence), this);
|
||||
QShortcut *infoShortcut = new QShortcut(QKeySequence(Shortcut::c_info), this);
|
||||
infoShortcut->setContext(Qt::WidgetWithChildrenShortcut);
|
||||
connect(infoShortcut, &QShortcut::activated,
|
||||
this, [this](){
|
||||
editDirectoryInfo();
|
||||
});
|
||||
|
||||
QShortcut *copyShortcut = new QShortcut(QKeySequence(c_copyShortcutSequence), this);
|
||||
QShortcut *copyShortcut = new QShortcut(QKeySequence(Shortcut::c_copy), this);
|
||||
copyShortcut->setContext(Qt::WidgetWithChildrenShortcut);
|
||||
connect(copyShortcut, &QShortcut::activated,
|
||||
this, [this](){
|
||||
copySelectedDirectories();
|
||||
});
|
||||
|
||||
QShortcut *cutShortcut = new QShortcut(QKeySequence(c_cutShortcutSequence), this);
|
||||
QShortcut *cutShortcut = new QShortcut(QKeySequence(Shortcut::c_cut), this);
|
||||
cutShortcut->setContext(Qt::WidgetWithChildrenShortcut);
|
||||
connect(cutShortcut, &QShortcut::activated,
|
||||
this, [this](){
|
||||
cutSelectedDirectories();
|
||||
});
|
||||
|
||||
QShortcut *pasteShortcut = new QShortcut(QKeySequence(c_pasteShortcutSequence), this);
|
||||
QShortcut *pasteShortcut = new QShortcut(QKeySequence(Shortcut::c_paste), this);
|
||||
pasteShortcut->setContext(Qt::WidgetWithChildrenShortcut);
|
||||
connect(pasteShortcut, &QShortcut::activated,
|
||||
this, [this](){
|
||||
@ -389,7 +384,7 @@ void VDirectoryTree::contextMenuRequested(QPoint pos)
|
||||
menu.addAction(deleteDirAct);
|
||||
|
||||
QAction *copyAct = new QAction(VIconUtils::menuIcon(":/resources/icons/copy.svg"),
|
||||
tr("&Copy\t%1").arg(VUtils::getShortcutText(c_copyShortcutSequence)),
|
||||
tr("&Copy\t%1").arg(VUtils::getShortcutText(Shortcut::c_copy)),
|
||||
&menu);
|
||||
copyAct->setToolTip(tr("Copy selected folders"));
|
||||
connect(copyAct, &QAction::triggered,
|
||||
@ -397,7 +392,7 @@ void VDirectoryTree::contextMenuRequested(QPoint pos)
|
||||
menu.addAction(copyAct);
|
||||
|
||||
QAction *cutAct = new QAction(VIconUtils::menuIcon(":/resources/icons/cut.svg"),
|
||||
tr("C&ut\t%1").arg(VUtils::getShortcutText(c_cutShortcutSequence)),
|
||||
tr("C&ut\t%1").arg(VUtils::getShortcutText(Shortcut::c_cut)),
|
||||
&menu);
|
||||
cutAct->setToolTip(tr("Cut selected folders"));
|
||||
connect(cutAct, &QAction::triggered,
|
||||
@ -411,7 +406,7 @@ void VDirectoryTree::contextMenuRequested(QPoint pos)
|
||||
}
|
||||
|
||||
QAction *pasteAct = new QAction(VIconUtils::menuIcon(":/resources/icons/paste.svg"),
|
||||
tr("&Paste\t%1").arg(VUtils::getShortcutText(c_pasteShortcutSequence)),
|
||||
tr("&Paste\t%1").arg(VUtils::getShortcutText(Shortcut::c_paste)),
|
||||
&menu);
|
||||
pasteAct->setToolTip(tr("Paste folders in this folder"));
|
||||
connect(pasteAct, &QAction::triggered,
|
||||
@ -445,7 +440,7 @@ void VDirectoryTree::contextMenuRequested(QPoint pos)
|
||||
menu.addAction(pinToHistoryAct);
|
||||
|
||||
QAction *dirInfoAct = new QAction(VIconUtils::menuIcon(":/resources/icons/dir_info.svg"),
|
||||
tr("&Info (Rename)\t%1").arg(VUtils::getShortcutText(c_infoShortcutSequence)),
|
||||
tr("&Info (Rename)\t%1").arg(VUtils::getShortcutText(Shortcut::c_info)),
|
||||
&menu);
|
||||
dirInfoAct->setToolTip(tr("View and edit current folder's information"));
|
||||
connect(dirInfoAct, &QAction::triggered,
|
||||
|
@ -163,11 +163,6 @@ private:
|
||||
|
||||
// Magic number for clipboard operations.
|
||||
int m_magicForClipboard;
|
||||
|
||||
static const QString c_infoShortcutSequence;
|
||||
static const QString c_copyShortcutSequence;
|
||||
static const QString c_cutShortcutSequence;
|
||||
static const QString c_pasteShortcutSequence;
|
||||
};
|
||||
|
||||
inline QPointer<VDirectory> VDirectoryTree::getVDirectory(QTreeWidgetItem *p_item) const
|
||||
|
@ -26,11 +26,6 @@ extern VConfigManager *g_config;
|
||||
extern VNote *g_vnote;
|
||||
extern VMainWindow *g_mainWin;
|
||||
|
||||
const QString VFileList::c_infoShortcutSequence = "F2";
|
||||
const QString VFileList::c_copyShortcutSequence = "Ctrl+C";
|
||||
const QString VFileList::c_cutShortcutSequence = "Ctrl+X";
|
||||
const QString VFileList::c_pasteShortcutSequence = "Ctrl+V";
|
||||
|
||||
VFileList::VFileList(QWidget *parent)
|
||||
: QWidget(parent),
|
||||
VNavigationMode(),
|
||||
@ -119,28 +114,28 @@ void VFileList::setupUI()
|
||||
|
||||
void VFileList::initShortcuts()
|
||||
{
|
||||
QShortcut *infoShortcut = new QShortcut(QKeySequence(c_infoShortcutSequence), this);
|
||||
QShortcut *infoShortcut = new QShortcut(QKeySequence(Shortcut::c_info), this);
|
||||
infoShortcut->setContext(Qt::WidgetWithChildrenShortcut);
|
||||
connect(infoShortcut, &QShortcut::activated,
|
||||
this, [this](){
|
||||
fileInfo();
|
||||
});
|
||||
|
||||
QShortcut *copyShortcut = new QShortcut(QKeySequence(c_copyShortcutSequence), this);
|
||||
QShortcut *copyShortcut = new QShortcut(QKeySequence(Shortcut::c_copy), this);
|
||||
copyShortcut->setContext(Qt::WidgetWithChildrenShortcut);
|
||||
connect(copyShortcut, &QShortcut::activated,
|
||||
this, [this](){
|
||||
copySelectedFiles();
|
||||
});
|
||||
|
||||
QShortcut *cutShortcut = new QShortcut(QKeySequence(c_cutShortcutSequence), this);
|
||||
QShortcut *cutShortcut = new QShortcut(QKeySequence(Shortcut::c_cut), this);
|
||||
cutShortcut->setContext(Qt::WidgetWithChildrenShortcut);
|
||||
connect(cutShortcut, &QShortcut::activated,
|
||||
this, [this](){
|
||||
cutSelectedFiles();
|
||||
});
|
||||
|
||||
QShortcut *pasteShortcut = new QShortcut(QKeySequence(c_pasteShortcutSequence), this);
|
||||
QShortcut *pasteShortcut = new QShortcut(QKeySequence(Shortcut::c_paste), this);
|
||||
pasteShortcut->setContext(Qt::WidgetWithChildrenShortcut);
|
||||
connect(pasteShortcut, &QShortcut::activated,
|
||||
this, [this](){
|
||||
@ -605,7 +600,7 @@ void VFileList::contextMenuRequested(QPoint pos)
|
||||
menu.addAction(deleteFileAct);
|
||||
|
||||
QAction *copyAct = new QAction(VIconUtils::menuIcon(":/resources/icons/copy.svg"),
|
||||
tr("&Copy\t%1").arg(VUtils::getShortcutText(c_copyShortcutSequence)),
|
||||
tr("&Copy\t%1").arg(VUtils::getShortcutText(Shortcut::c_copy)),
|
||||
&menu);
|
||||
copyAct->setToolTip(tr("Copy selected notes"));
|
||||
connect(copyAct, &QAction::triggered,
|
||||
@ -613,7 +608,7 @@ void VFileList::contextMenuRequested(QPoint pos)
|
||||
menu.addAction(copyAct);
|
||||
|
||||
QAction *cutAct = new QAction(VIconUtils::menuIcon(":/resources/icons/cut.svg"),
|
||||
tr("C&ut\t%1").arg(VUtils::getShortcutText(c_cutShortcutSequence)),
|
||||
tr("C&ut\t%1").arg(VUtils::getShortcutText(Shortcut::c_cut)),
|
||||
&menu);
|
||||
cutAct->setToolTip(tr("Cut selected notes"));
|
||||
connect(cutAct, &QAction::triggered,
|
||||
@ -627,7 +622,7 @@ void VFileList::contextMenuRequested(QPoint pos)
|
||||
}
|
||||
|
||||
QAction *pasteAct = new QAction(VIconUtils::menuIcon(":/resources/icons/paste.svg"),
|
||||
tr("&Paste\t%1").arg(VUtils::getShortcutText(c_pasteShortcutSequence)),
|
||||
tr("&Paste\t%1").arg(VUtils::getShortcutText(Shortcut::c_paste)),
|
||||
&menu);
|
||||
pasteAct->setToolTip(tr("Paste notes in current folder"));
|
||||
connect(pasteAct, &QAction::triggered,
|
||||
@ -686,7 +681,7 @@ void VFileList::contextMenuRequested(QPoint pos)
|
||||
|
||||
if (selectedSize == 1) {
|
||||
QAction *fileInfoAct = new QAction(VIconUtils::menuIcon(":/resources/icons/note_info.svg"),
|
||||
tr("&Info (Rename)\t%1").arg(VUtils::getShortcutText(c_infoShortcutSequence)),
|
||||
tr("&Info (Rename)\t%1").arg(VUtils::getShortcutText(Shortcut::c_info)),
|
||||
&menu);
|
||||
fileInfoAct->setToolTip(tr("View and edit current note's information"));
|
||||
connect(fileInfoAct, SIGNAL(triggered(bool)),
|
||||
|
@ -209,11 +209,6 @@ private:
|
||||
QListWidgetItem *m_itemClicked;
|
||||
|
||||
VFile *m_fileToCloseInSingleClick;
|
||||
|
||||
static const QString c_infoShortcutSequence;
|
||||
static const QString c_copyShortcutSequence;
|
||||
static const QString c_cutShortcutSequence;
|
||||
static const QString c_pasteShortcutSequence;
|
||||
};
|
||||
|
||||
inline void VFileList::setEditArea(VEditArea *editArea)
|
||||
|
@ -69,6 +69,7 @@ bool VHelpUE::initListWidget()
|
||||
m_listWidget->addItem(tr("Ctrl+K: Go to previous item"));
|
||||
m_listWidget->addItem(tr("Ctrl+L: Go to current item's parent item"));
|
||||
m_listWidget->addItem(tr("Ctrl+I: Expand/Collapse current item"));
|
||||
m_listWidget->addItem(tr("Ctrl+B: Expand/Collapse all items"));
|
||||
m_listWidget->addItem(tr("Ctrl+S: Sort items"));
|
||||
m_listWidget->addItem(tr("Enter: Activate current item"));
|
||||
m_listWidget->addItem(tr("Ctrl+M: Browse current item folder or the folder containing current item"));
|
||||
|
@ -55,7 +55,7 @@ void VOutlineUE::init()
|
||||
|
||||
connect(m_treeWidget, SIGNAL(itemActivated(QTreeWidgetItem *, int)),
|
||||
this, SLOT(activateItem(QTreeWidgetItem *, int)));
|
||||
connect(m_treeWidget, &VTreeWidget::itemExpanded,
|
||||
connect(m_treeWidget, &VTreeWidget::itemExpandedOrCollapsed,
|
||||
this, &VOutlineUE::widgetUpdated);
|
||||
}
|
||||
|
||||
@ -90,12 +90,7 @@ void VOutlineUE::processCommand(int p_id, const QString &p_cmd)
|
||||
const VTableOfContent &outline = tab->getOutline();
|
||||
VOutline::updateTreeFromOutline(m_treeWidget, outline);
|
||||
|
||||
// expandAll() has some bugs with the first item. Fix it.
|
||||
if (m_treeWidget->topLevelItemCount() > 0) {
|
||||
m_treeWidget->topLevelItem(0)->setExpanded(true);
|
||||
}
|
||||
|
||||
m_treeWidget->expandAll();
|
||||
VTreeWidget::expandCollapseAll(m_treeWidget);
|
||||
|
||||
const VHeaderPointer &header = tab->getCurrentHeader();
|
||||
if (outline.isMatched(header)) {
|
||||
@ -154,7 +149,7 @@ void VOutlineUE::updateWidget()
|
||||
delete item;
|
||||
}
|
||||
|
||||
wid = m_listWidget;
|
||||
wid = m_treeWidget;
|
||||
}
|
||||
|
||||
wid->updateGeometry();
|
||||
@ -252,3 +247,11 @@ void VOutlineUE::toggleItemExpanded(int p_id)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void VOutlineUE::expandCollapseAll(int p_id)
|
||||
{
|
||||
Q_UNUSED(p_id);
|
||||
if (m_listOutline) {
|
||||
VTreeWidget::expandCollapseAll(m_treeWidget);
|
||||
}
|
||||
}
|
||||
|
@ -35,6 +35,8 @@ public:
|
||||
|
||||
void toggleItemExpanded(int p_id) Q_DECL_OVERRIDE;
|
||||
|
||||
void expandCollapseAll(int p_id) Q_DECL_OVERRIDE;
|
||||
|
||||
protected:
|
||||
void init() Q_DECL_OVERRIDE;
|
||||
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include "vnote.h"
|
||||
#include "vconfigmanager.h"
|
||||
#include "vexplorer.h"
|
||||
#include "vconstants.h"
|
||||
|
||||
extern VMainWindow *g_mainWin;
|
||||
|
||||
@ -216,6 +217,11 @@ void VSearcher::setupUI()
|
||||
updateNumLabel(p_count);
|
||||
});
|
||||
|
||||
QShortcut *expandShortcut = new QShortcut(QKeySequence(Shortcut::c_expand), this);
|
||||
expandShortcut->setContext(Qt::WidgetWithChildrenShortcut);
|
||||
connect(expandShortcut, &QShortcut::activated,
|
||||
m_results, &VSearchResultTree::expandCollapseAll);
|
||||
|
||||
QFormLayout *formLayout = VUtils::getFormLayout();
|
||||
formLayout->addRow(tr("Keywords:"), m_keywordCB);
|
||||
formLayout->addRow(tr("Scope:"), m_searchScopeCB);
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include "vexplorer.h"
|
||||
#include "vuniversalentry.h"
|
||||
#include "vsearchue.h"
|
||||
#include "vconstants.h"
|
||||
|
||||
extern VNote *g_vnote;
|
||||
|
||||
@ -33,45 +34,12 @@ 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::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(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(VIconUtils::menuIcon(":/resources/icons/cart.svg"),
|
||||
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);
|
||||
|
||||
m_pinToHistoryAct = new QAction(VIconUtils::menuIcon(":/resources/icons/pin.svg"),
|
||||
tr("Pin To History"),
|
||||
this);
|
||||
m_pinToHistoryAct->setToolTip(tr("Pin selected notes to History"));
|
||||
connect(m_pinToHistoryAct, &QAction::triggered,
|
||||
this, &VSearchResultTree::pinSelectedItemsToHistory);
|
||||
}
|
||||
|
||||
void VSearchResultTree::updateResults(const QList<QSharedPointer<VSearchResultItem> > &p_items)
|
||||
{
|
||||
clearResults();
|
||||
@ -158,14 +126,15 @@ void VSearchResultTree::appendItem(const QSharedPointer<VSearchResultItem> &p_it
|
||||
|
||||
void VSearchResultTree::handleContextMenuRequested(QPoint p_pos)
|
||||
{
|
||||
QTreeWidgetItem *item = itemAt(p_pos);
|
||||
if (!item) {
|
||||
return;
|
||||
}
|
||||
|
||||
QMenu menu(this);
|
||||
menu.setToolTipsVisible(true);
|
||||
|
||||
QTreeWidgetItem *item = itemAt(p_pos);
|
||||
if (!item) {
|
||||
goto global;
|
||||
}
|
||||
|
||||
{
|
||||
QList<QTreeWidgetItem *> items = selectedItems();
|
||||
|
||||
bool hasNote = false;
|
||||
@ -177,20 +146,60 @@ void VSearchResultTree::handleContextMenuRequested(QPoint p_pos)
|
||||
}
|
||||
|
||||
if (items.size() == 1) {
|
||||
menu.addAction(m_openAct);
|
||||
QAction *openAct = new QAction(tr("&Open"), &menu);
|
||||
openAct->setToolTip(tr("Open selected notes"));
|
||||
connect(openAct, &QAction::triggered,
|
||||
this, [this]() {
|
||||
activateItem(currentItem());
|
||||
});
|
||||
menu.addAction(openAct);
|
||||
|
||||
if (hasNote) {
|
||||
menu.addAction(m_locateAct);
|
||||
QAction *locateAct = new QAction(VIconUtils::menuIcon(":/resources/icons/locate_note.svg"),
|
||||
tr("&Locate To Folder"),
|
||||
&menu);
|
||||
locateAct->setToolTip(tr("Locate the folder of current note"));
|
||||
connect(locateAct, &QAction::triggered,
|
||||
this, &VSearchResultTree::locateCurrentItem);
|
||||
menu.addAction(locateAct);
|
||||
}
|
||||
}
|
||||
|
||||
if (hasNote) {
|
||||
menu.addAction(m_addToCartAct);
|
||||
menu.addAction(m_pinToHistoryAct);
|
||||
QAction *addToCartAct = new QAction(VIconUtils::menuIcon(":/resources/icons/cart.svg"),
|
||||
tr("Add To Cart"),
|
||||
&menu);
|
||||
addToCartAct->setToolTip(tr("Add selected notes to Cart for further processing"));
|
||||
connect(addToCartAct, &QAction::triggered,
|
||||
this, &VSearchResultTree::addSelectedItemsToCart);
|
||||
menu.addAction(addToCartAct);
|
||||
|
||||
QAction *pinToHistoryAct = new QAction(VIconUtils::menuIcon(":/resources/icons/pin.svg"),
|
||||
tr("Pin To History"),
|
||||
&menu);
|
||||
pinToHistoryAct->setToolTip(tr("Pin selected notes to History"));
|
||||
connect(pinToHistoryAct, &QAction::triggered,
|
||||
this, &VSearchResultTree::pinSelectedItemsToHistory);
|
||||
menu.addAction(pinToHistoryAct);
|
||||
}
|
||||
}
|
||||
|
||||
global:
|
||||
if (topLevelItemCount() > 0) {
|
||||
if (item) {
|
||||
menu.addSeparator();
|
||||
}
|
||||
|
||||
QString shortcutText = VUtils::getShortcutText(Shortcut::c_expand);
|
||||
QAction *expandAct = new QAction(tr("Expand/Collapse All\t%1").arg(shortcutText),
|
||||
&menu);
|
||||
connect(expandAct, &QAction::triggered,
|
||||
this, &VSearchResultTree::expandCollapseAll);
|
||||
menu.addAction(expandAct);
|
||||
|
||||
menu.exec(mapToGlobal(p_pos));
|
||||
}
|
||||
}
|
||||
|
||||
void VSearchResultTree::locateCurrentItem()
|
||||
{
|
||||
@ -257,7 +266,7 @@ VSearchResultItem::ItemType VSearchResultTree::itemResultType(const QTreeWidgetI
|
||||
const QSharedPointer<VSearchResultItem> &VSearchResultTree::itemResultData(const QTreeWidgetItem *p_item) const
|
||||
{
|
||||
Q_ASSERT(p_item);
|
||||
const QTreeWidgetItem *topItem = VUtils::topLevelTreeItem(p_item);
|
||||
const QTreeWidgetItem *topItem = VTreeWidget::topLevelTreeItem(p_item);
|
||||
int idx = topItem->data(0, Qt::UserRole).toInt();
|
||||
Q_ASSERT(idx >= 0 && idx < m_data.size());
|
||||
return m_data[idx];
|
||||
@ -269,5 +278,10 @@ void VSearchResultTree::activateItem(const QTreeWidgetItem *p_item) const
|
||||
return;
|
||||
}
|
||||
|
||||
VSearchUE::activateItem(itemResultData(p_item), VUtils::childIndexOfTreeItem(p_item));
|
||||
VSearchUE::activateItem(itemResultData(p_item), VTreeWidget::childIndexOfTreeItem(p_item));
|
||||
}
|
||||
|
||||
void VSearchResultTree::expandCollapseAll()
|
||||
{
|
||||
VTreeWidget::expandCollapseAll(this);
|
||||
}
|
||||
|
@ -6,8 +6,6 @@
|
||||
#include "vtreewidget.h"
|
||||
#include "vsearch.h"
|
||||
|
||||
class QAction;
|
||||
|
||||
|
||||
class VSearchResultTree : public VTreeWidget
|
||||
{
|
||||
@ -26,6 +24,8 @@ public slots:
|
||||
|
||||
void handleContextMenuRequested(QPoint p_pos);
|
||||
|
||||
void expandCollapseAll();
|
||||
|
||||
signals:
|
||||
void countChanged(int p_count);
|
||||
|
||||
@ -39,8 +39,6 @@ private slots:
|
||||
private:
|
||||
void appendItem(const QSharedPointer<VSearchResultItem> &p_item);
|
||||
|
||||
void initActions();
|
||||
|
||||
VSearchResultItem::ItemType itemResultType(const QTreeWidgetItem *p_item) const;
|
||||
|
||||
void activateItem(const QTreeWidgetItem *p_item) const;
|
||||
@ -52,14 +50,6 @@ private:
|
||||
QIcon m_noteIcon;
|
||||
QIcon m_folderIcon;
|
||||
QIcon m_notebookIcon;
|
||||
|
||||
QAction *m_openAct;
|
||||
|
||||
QAction *m_locateAct;
|
||||
|
||||
QAction *m_addToCartAct;
|
||||
|
||||
QAction *m_pinToHistoryAct;
|
||||
};
|
||||
|
||||
#endif // VSEARCHRESULTTREE_H
|
||||
|
@ -131,7 +131,7 @@ void VSearchUE::init()
|
||||
m_treeWidget->hide();
|
||||
connect(m_treeWidget, SIGNAL(itemActivated(QTreeWidgetItem *, int)),
|
||||
this, SLOT(activateItem(QTreeWidgetItem *, int)));
|
||||
connect(m_treeWidget, &VTreeWidget::itemExpanded,
|
||||
connect(m_treeWidget, &VTreeWidget::itemExpandedOrCollapsed,
|
||||
this, &VSearchUE::widgetUpdated);
|
||||
}
|
||||
|
||||
@ -905,7 +905,7 @@ const QSharedPointer<VSearchResultItem> &VSearchUE::itemResultData(const QListWi
|
||||
const QSharedPointer<VSearchResultItem> &VSearchUE::itemResultData(const QTreeWidgetItem *p_item) const
|
||||
{
|
||||
Q_ASSERT(p_item);
|
||||
const QTreeWidgetItem *topItem = VUtils::topLevelTreeItem(p_item);
|
||||
const QTreeWidgetItem *topItem = VTreeWidget::topLevelTreeItem(p_item);
|
||||
int idx = topItem->data(0, Qt::UserRole).toInt();
|
||||
Q_ASSERT(idx >= 0 && idx < m_data.size());
|
||||
return m_data[idx];
|
||||
@ -1002,7 +1002,7 @@ void VSearchUE::activateItem(QTreeWidgetItem *p_item, int p_col)
|
||||
}
|
||||
|
||||
emit requestHideUniversalEntry();
|
||||
activateItem(itemResultData(p_item), VUtils::childIndexOfTreeItem(p_item));
|
||||
activateItem(itemResultData(p_item), VTreeWidget::childIndexOfTreeItem(p_item));
|
||||
}
|
||||
|
||||
void VSearchUE::selectNextItem(int p_id, bool p_forward)
|
||||
@ -1122,6 +1122,25 @@ void VSearchUE::toggleItemExpanded(int p_id)
|
||||
}
|
||||
}
|
||||
|
||||
void VSearchUE::expandCollapseAll(int p_id)
|
||||
{
|
||||
switch (p_id) {
|
||||
case ID::Content_Note_AllNotebook:
|
||||
case ID::Content_Note_CurrentNotebook:
|
||||
case ID::Content_Note_CurrentFolder:
|
||||
case ID::Content_Note_ExplorerDirectory:
|
||||
case ID::Content_Note_Buffer:
|
||||
case ID::Outline_Note_Buffer:
|
||||
{
|
||||
VTreeWidget::expandCollapseAll(m_treeWidget);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void VSearchUE::sort(int p_id)
|
||||
{
|
||||
static bool noteFirst = false;
|
||||
|
@ -95,6 +95,8 @@ public:
|
||||
|
||||
static void activateItem(const QSharedPointer<VSearchResultItem> &p_item, int p_matchIndex = 0);
|
||||
|
||||
void expandCollapseAll(int p_id) Q_DECL_OVERRIDE;
|
||||
|
||||
protected:
|
||||
void init() Q_DECL_OVERRIDE;
|
||||
|
||||
|
@ -47,18 +47,22 @@ VTreeWidget::VTreeWidget(QWidget *p_parent)
|
||||
m_delegate = new VStyledItemDelegate(NULL, this);
|
||||
setItemDelegate(m_delegate);
|
||||
|
||||
m_expandTimer = new QTimer(this);
|
||||
m_expandTimer->setSingleShot(true);
|
||||
m_expandTimer->setInterval(100);
|
||||
connect(m_expandTimer, &QTimer::timeout,
|
||||
this, [this]() {
|
||||
if (m_fitContent) {
|
||||
resizeColumnToContents(0);
|
||||
}
|
||||
|
||||
emit itemExpandedOrCollapsed();
|
||||
});
|
||||
|
||||
connect(this, &VTreeWidget::itemExpanded,
|
||||
this, [this]() {
|
||||
if (m_fitContent) {
|
||||
resizeColumnToContents(0);
|
||||
}
|
||||
});
|
||||
m_expandTimer, static_cast<void(QTimer::*)(void)>(&QTimer::start));
|
||||
connect(this, &VTreeWidget::itemCollapsed,
|
||||
this, [this]() {
|
||||
if (m_fitContent) {
|
||||
resizeColumnToContents(0);
|
||||
}
|
||||
});
|
||||
m_expandTimer, static_cast<void(QTimer::*)(void)>(&QTimer::start));
|
||||
}
|
||||
|
||||
void VTreeWidget::keyPressEvent(QKeyEvent *p_event)
|
||||
@ -349,3 +353,88 @@ void VTreeWidget::selectParentItem()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static bool isItemTreeExpanded(const QTreeWidgetItem *p_item)
|
||||
{
|
||||
if (!p_item) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (p_item->isHidden() || !p_item->isExpanded()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
int cnt = p_item->childCount();
|
||||
for (int i = 0; i < cnt; ++i) {
|
||||
if (!isItemTreeExpanded(p_item->child(i))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool VTreeWidget::isTreeExpanded(const QTreeWidget *p_tree)
|
||||
{
|
||||
int cnt = p_tree->topLevelItemCount();
|
||||
for (int i = 0; i < cnt; ++i) {
|
||||
if (!isItemTreeExpanded(p_tree->topLevelItem(i))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void VTreeWidget::expandCollapseAll(QTreeWidget *p_tree)
|
||||
{
|
||||
QTreeWidgetItem *topLevelItem = NULL;
|
||||
QTreeWidgetItem *item = p_tree->currentItem();
|
||||
if (item) {
|
||||
topLevelItem = const_cast<QTreeWidgetItem *>(topLevelTreeItem(item));
|
||||
}
|
||||
|
||||
bool expanded = isTreeExpanded(p_tree);
|
||||
if (expanded) {
|
||||
p_tree->collapseAll();
|
||||
} else {
|
||||
p_tree->expandAll();
|
||||
|
||||
}
|
||||
|
||||
VTreeWidget *vtree = dynamic_cast<VTreeWidget *>(p_tree);
|
||||
if (vtree) {
|
||||
if (vtree->m_fitContent) {
|
||||
vtree->resizeColumnToContents(0);
|
||||
}
|
||||
|
||||
emit vtree->itemExpandedOrCollapsed();
|
||||
}
|
||||
|
||||
if (topLevelItem) {
|
||||
p_tree->setCurrentItem(topLevelItem, 0, QItemSelectionModel::ClearAndSelect);
|
||||
p_tree->scrollToItem(topLevelItem);
|
||||
}
|
||||
}
|
||||
|
||||
const QTreeWidgetItem *VTreeWidget::topLevelTreeItem(const QTreeWidgetItem *p_item)
|
||||
{
|
||||
if (!p_item) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (p_item->parent()) {
|
||||
return topLevelTreeItem(p_item->parent());
|
||||
} else {
|
||||
return p_item;
|
||||
}
|
||||
}
|
||||
|
||||
int VTreeWidget::childIndexOfTreeItem(const QTreeWidgetItem *p_item)
|
||||
{
|
||||
if (p_item->parent()) {
|
||||
return p_item->parent()->indexOfChild(const_cast<QTreeWidgetItem *>(p_item));
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
@ -50,6 +50,15 @@ public:
|
||||
QTreeWidgetItem *p_item,
|
||||
bool p_forward);
|
||||
|
||||
// Whether @p_tree is expanded.
|
||||
static bool isTreeExpanded(const QTreeWidget *p_tree);
|
||||
|
||||
static void expandCollapseAll(QTreeWidget *p_tree);
|
||||
|
||||
static const QTreeWidgetItem *topLevelTreeItem(const QTreeWidgetItem *p_item);
|
||||
|
||||
static int childIndexOfTreeItem(const QTreeWidgetItem *p_item);
|
||||
|
||||
protected:
|
||||
void keyPressEvent(QKeyEvent *p_event) Q_DECL_OVERRIDE;
|
||||
|
||||
@ -61,6 +70,8 @@ signals:
|
||||
// Rows [@p_first, @p_last] were moved to @p_row.
|
||||
void rowsMoved(int p_first, int p_last, int p_row);
|
||||
|
||||
void itemExpandedOrCollapsed();
|
||||
|
||||
private slots:
|
||||
void handleSearchModeTriggered(bool p_inSearchMode, bool p_focus);
|
||||
|
||||
@ -81,6 +92,7 @@ private:
|
||||
VStyledItemDelegate *m_delegate;
|
||||
|
||||
QTimer *m_searchColdTimer;
|
||||
QTimer *m_expandTimer;
|
||||
|
||||
bool m_fitContent;
|
||||
};
|
||||
|
@ -413,6 +413,18 @@ void VUniversalEntry::keyPressEvent(QKeyEvent *p_event)
|
||||
|
||||
break;
|
||||
|
||||
case Qt::Key_B:
|
||||
if (VUtils::isControlModifierForVim(modifiers)) {
|
||||
// Ctrl+B to expand/collapse all the items.
|
||||
if (m_lastEntry) {
|
||||
m_lastEntry->m_entry->expandCollapseAll(m_lastEntry->m_id);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user