From 28d359c4bb51aa4de0aee553c1df074a44bcbf77 Mon Sep 17 00:00:00 2001 From: Le Tan Date: Wed, 21 Mar 2018 19:34:59 +0800 Subject: [PATCH] search: add search Object Path 1. For internal file and folder, search the relative path; 2. For orphan file, search the complete path; --- src/resources/themes/v_pure/v_pure.palette | 2 +- src/vsearch.cpp | 57 +++++++++++++++++----- src/vsearch.h | 10 ++++ src/vsearchconfig.h | 3 +- src/vsearcher.cpp | 4 +- 5 files changed, 61 insertions(+), 15 deletions(-) diff --git a/src/resources/themes/v_pure/v_pure.palette b/src/resources/themes/v_pure/v_pure.palette index 8c94012f..e8f0818a 100644 --- a/src/resources/themes/v_pure/v_pure.palette +++ b/src/resources/themes/v_pure/v_pure.palette @@ -41,7 +41,7 @@ hover_fg=@base_fg hover_bg=#D0D0D0 selected_fg=@base_fg -selected_bg=#80CBC4 +selected_bg=#7BBAB9 active_fg=@selected_fg active_bg=@selected_bg diff --git a/src/vsearch.cpp b/src/vsearch.cpp index 4dc61717..f97aeb69 100644 --- a/src/vsearch.cpp +++ b/src/vsearch.cpp @@ -1,7 +1,7 @@ #include "vsearch.h" #include "utils/vutils.h" -#include "vfile.h" +#include "vnotefile.h" #include "vdirectory.h" #include "vnotebook.h" #include "veditarea.h" @@ -16,6 +16,7 @@ VSearch::VSearch(QObject *p_parent) m_askedToStop(false), m_engine(NULL) { + m_slashReg = QRegExp("[\\/]"); } QSharedPointer VSearch::search(const QVector &p_files) @@ -152,6 +153,25 @@ void VSearch::searchFirstPhase(VFile *p_file, } } + if (testObject(VSearchConfig::Path)) { + QString normFilePath; + if (p_file->getType() == FileType::Note) { + normFilePath = static_cast(p_file)->fetchRelativePath(); + } else { + normFilePath = filePath; + } + + removeSlashFromPath(normFilePath); + if (matchNonContent(normFilePath)) { + VSearchResultItem *item = new VSearchResultItem(VSearchResultItem::Note, + VSearchResultItem::LineNumber, + name, + filePath); + QSharedPointer pitem(item); + emit resultItemAdded(pitem); + } + } + if (testObject(VSearchConfig::Outline)) { VSearchResultItem *item = searchForOutline(p_file); if (item) { @@ -190,16 +210,31 @@ void VSearch::searchFirstPhase(VDirectory *p_directory, return; } - if (testTarget(VSearchConfig::Folder) - && testObject(VSearchConfig::Name)) { - QString text = p_directory->getName(); - if (matchNonContent(text)) { - VSearchResultItem *item = new VSearchResultItem(VSearchResultItem::Folder, - VSearchResultItem::LineNumber, - text, - p_directory->fetchPath()); - QSharedPointer pitem(item); - emit resultItemAdded(pitem); + if (testTarget(VSearchConfig::Folder)) { + QString name = p_directory->getName(); + QString dirPath = p_directory->fetchPath(); + if (testObject(VSearchConfig::Name)) { + if (matchNonContent(name)) { + VSearchResultItem *item = new VSearchResultItem(VSearchResultItem::Folder, + VSearchResultItem::LineNumber, + name, + dirPath); + QSharedPointer pitem(item); + emit resultItemAdded(pitem); + } + } + + if (testObject(VSearchConfig::Path)) { + QString normPath(p_directory->fetchRelativePath()); + removeSlashFromPath(normPath); + if (matchNonContent(normPath)) { + VSearchResultItem *item = new VSearchResultItem(VSearchResultItem::Folder, + VSearchResultItem::LineNumber, + name, + dirPath); + QSharedPointer pitem(item); + emit resultItemAdded(pitem); + } } } diff --git a/src/vsearch.h b/src/vsearch.h index b8d0e220..bd9021d6 100644 --- a/src/vsearch.h +++ b/src/vsearch.h @@ -74,6 +74,8 @@ private: void searchSecondPhase(const QSharedPointer &p_result); + void removeSlashFromPath(QString &p_path); + bool m_askedToStop; QSharedPointer m_config; @@ -82,6 +84,9 @@ private: // Wildcard reg to for file name pattern. QRegExp m_patternReg; + + // Remove slashes. + QRegExp m_slashReg; }; inline bool VSearch::askedToStop() const @@ -129,4 +134,9 @@ inline bool VSearch::matchPattern(const QString &p_name) const return p_name.contains(m_patternReg); } + +inline void VSearch::removeSlashFromPath(QString &p_path) +{ + p_path.remove(m_slashReg); +} #endif // VSEARCH_H diff --git a/src/vsearchconfig.h b/src/vsearchconfig.h index 5bc16a71..6d944a4d 100644 --- a/src/vsearchconfig.h +++ b/src/vsearchconfig.h @@ -203,7 +203,8 @@ struct VSearchConfig Name = 0x1UL, Content = 0x2UL, Outline = 0x4UL, - Tag = 0x8UL + Tag = 0x8UL, + Path = 0x10UL }; enum Target diff --git a/src/vsearcher.cpp b/src/vsearcher.cpp index 6c2dcae4..63c693e6 100644 --- a/src/vsearcher.cpp +++ b/src/vsearcher.cpp @@ -313,9 +313,9 @@ void VSearcher::handleInputChanged() readyToSearch = !keyword.isEmpty(); if (readyToSearch) { - // Other targets are only available for Name. + // Other targets are only available for Name and Path. int obj = m_searchObjectCB->currentData().toInt(); - if (obj != VSearchConfig::Name) { + if (obj != VSearchConfig::Name && obj != VSearchConfig::Path) { int target = m_searchTargetCB->currentData().toInt(); if (!(target & VSearchConfig::Note)) { readyToSearch = false;