aboutsummaryrefslogtreecommitdiff
path: root/lumina-search/Worker.cpp
diff options
context:
space:
mode:
authorKen Moore <ken@pcbsd.org>2014-11-05 13:16:58 -0500
committerKen Moore <ken@pcbsd.org>2014-11-05 13:16:58 -0500
commitcb7ac8c92b68b2229e8d1759bbce3d0e2b597c17 (patch)
tree447b20ba91f0171b989e444e20162d03a2dba102 /lumina-search/Worker.cpp
parentMerge branch 'master' of github.com:pcbsd/lumina (diff)
downloadlumina-cb7ac8c92b68b2229e8d1759bbce3d0e2b597c17.tar.gz
lumina-cb7ac8c92b68b2229e8d1759bbce3d0e2b597c17.tar.bz2
lumina-cb7ac8c92b68b2229e8d1759bbce3d0e2b597c17.zip
Add a new utility: lumina-search
This utility provides quick searching for applications (the default), or for searching the entire user's home directory. The file search also supports the "*" wildcard for the search terms.
Diffstat (limited to 'lumina-search/Worker.cpp')
-rw-r--r--lumina-search/Worker.cpp102
1 files changed, 102 insertions, 0 deletions
diff --git a/lumina-search/Worker.cpp b/lumina-search/Worker.cpp
new file mode 100644
index 00000000..6dc750cb
--- /dev/null
+++ b/lumina-search/Worker.cpp
@@ -0,0 +1,102 @@
+#include "Worker.h"
+
+#include <QTimer>
+#include <LuminaXDG.h>
+
+Worker::Worker(QObject *parent) : QObject(parent){
+ //Get the list of all applications and save them in an easily-searchable form
+ QList<XDGDesktop> apps = LXDG::systemDesktopFiles();
+ for(int i=0; i<apps.length(); i++){
+ applist << ":::1:::"+apps[i].name+":::2:::"+apps[i].genericName+":::3:::"+apps[i].comment+":::4:::"+apps[i].filePath;
+ }
+ stopsearch = false;
+}
+
+Worker::~Worker(){
+ stopsearch = true;
+}
+
+void Worker::StartSearch(QString term, bool isApp){
+ sterm=term; sapp=isApp;
+ if(stopsearch){
+ //Need to stop the current search first - give it a moment first
+ QTimer::singleShot(100,this, SLOT(beginsearch()) );
+ }else{
+ //Start immediately
+ QTimer::singleShot(0,this, SLOT(beginsearch()) );
+ }
+}
+
+void Worker::StopSearch(){
+ stopsearch = true;
+}
+
+bool Worker::searchDir(QString dirpath){
+ //This is a recursive search algorithm for scanning a directory
+ QDir dir(dirpath);
+ //First look for files that match the search term
+ if(stopsearch){ return true; }
+ emit SearchUpdate( QString(tr("Searching: %1")).arg(dirpath.replace(QDir::homePath(),"~")) );
+ QStringList tmp;
+ if(sterm.startsWith(".")){ tmp = dir.entryList(QStringList(sterm), QDir::AllEntries | QDir::NoDotAndDotDot | QDir::Hidden, QDir::Name); }
+ else{ tmp = dir.entryList(QStringList(sterm), QDir::AllEntries | QDir::NoDotAndDotDot , QDir::Name); }
+ for(int i=0; i<tmp.length(); i++){
+ if(stopsearch){ return true; }
+ emit FoundItem( dir.absoluteFilePath(tmp[i]) );
+ }
+ if(stopsearch){ return true; }
+ //Now recursively scan the sub directories
+ tmp = dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot , QDir::Name);
+ for(int i=0; i<tmp.length(); i++){
+ if(stopsearch){ return true; }
+ if( searchDir(dir.absoluteFilePath(tmp[i])) ){ return true; }
+ }
+ return false;
+}
+
+void Worker::beginsearch(){
+ stopsearch = false; //just starting search - always set this to false initially
+ emit SearchUpdate( QString(tr("Starting Search: %1")).arg(sterm) );
+ //Now Perform the search
+ if(sapp){
+ //First try to match based on the name
+ QStringList tmp = applist.filter(":::1:::"+sterm, Qt::CaseInsensitive);
+ tmp.sort();
+ for(int i=0; i<tmp.length(); i++){
+ if(stopsearch){ return; }
+ emit FoundItem( tmp[i].section(":::4:::",1,1) );
+ }
+ //If items found, go ahead and stop now
+ if(stopsearch){ return; }
+ if(tmp.length()<1){
+ //Now try to match based on the generic name
+ tmp = applist.filter(":::2:::"+sterm, Qt::CaseInsensitive);
+ tmp.sort();
+ for(int i=0; i<tmp.length(); i++){
+ if(stopsearch){ return; }
+ emit FoundItem( tmp[i].section(":::4:::",1,1) );
+ }
+ }
+ //If items found, go ahead and stop now
+ if(stopsearch){ return; }
+ if(tmp.length()<1){
+ //Now try to match based on anything (name/genericname/comment)
+ tmp = applist.filter(sterm, Qt::CaseInsensitive);
+ tmp.sort();
+ for(int i=0; i<tmp.length(); i++){
+ if(stopsearch){ return; }
+ emit FoundItem( tmp[i].section(":::4:::",1,1) );
+ }
+ }
+ }else{
+ emit SearchUpdate( "File Search not implemented yet" );
+ //Search through the user's home directory and look for a file/dir starting with that term
+ if(!sterm.contains("*")){
+ sterm.prepend("*"); sterm.append("*"); //make sure it is a search glob pattern
+ }
+ searchDir(QDir::homePath());
+
+ }
+ emit SearchUpdate( tr("Search Finished") );
+ emit SearchDone();
+} \ No newline at end of file
bgstack15