--- a/src/desktop/unity-lens-recoll/recollscope/rclsearch.py
+++ b/src/desktop/unity-lens-recoll/recollscope/rclsearch.py
@@ -1,5 +1,7 @@
import sys
+import subprocess
+
from gi.repository import GLib, GObject, Gio
from gi.repository import Dee
from gi.repository import Unity
@@ -20,168 +22,195 @@
class Scope (Unity.Scope):
- def __init__ (self):
- Unity.Scope.__init__ (self, dbus_path=BUS_PATH)
-
- # Listen for changes and requests
- if Unity._version == "4.0":
- #print "Setting up for Unity 4.0"
- self.connect("notify::active-search",
- self._on_search_changed)
- self.connect("notify::active-global-search",
- self._on_global_search_changed)
- self.connect("filters-changed",
- self._on_search_changed);
- else:
- #print "Setting up for Unity 5.0+"
- self.connect ("search-changed", self._on_search_changed)
- self.connect ("filters-changed",
- self._on_filters_changed)
-
-
- # Connect to the index
- self.db = recoll.connect()
-
- self.db.setAbstractParams(maxchars=200,
- contextwords=4)
-
- self.timeout_id = None
-
- def get_search_string (self):
- search = self.props.active_search
- return search.props.search_string if search else None
-
- def get_global_search_string (self):
- search = self.props.active_global_search
- return search.props.search_string if search else None
-
- def search_finished (self):
- search = self.props.active_search
- if search:
- search.emit("finished")
-
- def global_search_finished (self):
- search = self.props.active_global_search
- if search:
- search.emit("finished")
- def reset (self):
- self._do_browse (self.props.results_model)
- self._do_browse (self.props.global_results_model)
-
- def _on_filters_changed (self, scope):
-# print "_on_filters_changed()"
- self.queue_search_changed(Unity.SearchType.DEFAULT)
-
+ def __init__ (self):
+ Unity.Scope.__init__ (self, dbus_path=BUS_PATH)
+
+ # Listen for changes and requests
+ self.connect ("activate-uri", self.activate_uri)
if Unity._version == "4.0":
- def _on_search_changed (self, scope, param_spec=None):
- search_string = self.get_search_string()
- results = scope.props.results_model
-# print "Search 4.0 changed to: '%s'" % search_string
-
- self._update_results_model (search_string, results)
- else:
- def _on_search_changed (self, scope, search, search_type, cancellable):
- search_string = search.props.search_string
- results = search.props.results_model
-# print "Search 5.0 changed to: '%s'" % search_string
-
- self._update_results_model (search_string, results)
-
- def _on_global_search_changed (self, scope, param_spec):
- search = self.get_global_search_string()
- results = scope.props.global_results_model
-
-# print "Global search changed to: '%s'" % search
-
- self._update_results_model (search, results)
-
- def _update_results_model (self, search_string, model):
- if search_string:
- self._do_search (search_string, model)
- else:
- self._do_browse (model)
-
- def _do_browse (self, model):
- if self.timeout_id is not None:
- GObject.source_remove(self.timeout_id)
- model.clear ()
-
- if model is self.props.results_model:
- self.search_finished()
- else:
- self.global_search_finished()
-
- def _on_timeout(self, search_string, model):
- if self.timeout_id is not None:
- GObject.source_remove(self.timeout_id)
- self.timeout_id = None
- self._really_do_search(search_string, model)
- if model is self.props.results_model:
- self.search_finished()
- else:
- self.global_search_finished()
-
- def _do_search (self, search_string, model):
- if TYPING_TIMEOUT == 0:
- self._really_do_search(search_string, model)
- return True
-
- if self.timeout_id is not None:
- GObject.source_remove(self.timeout_id)
- self.timeout_id = \
- GObject.timeout_add(TYPING_TIMEOUT, self._on_timeout,
- search_string, model)
-
- def _really_do_search(self, search_string, model):
-# print "really_do_search:[", search_string, "]"
-
- model.clear ()
- if search_string == "":
- return True
-
- fcat = self.get_filter("rclcat")
- for option in fcat.options:
- if option.props.active:
- search_string += " rclcat:" + option.props.id
-
- # Do the recoll thing
- query = self.db.query()
- try:
- nres = query.execute(search_string)
- except:
- return
-
- actual_results = 0
- while query.next >= 0 and query.next < nres:
- try:
- doc = query.fetchone()
- except:
- break
-
- # No sense in returning unusable results (until
- # I get an idea of what to do with them)
- if doc.ipath != "":
- continue
-
- titleorfilename = doc.title
- if titleorfilename == "":
- titleorfilename = doc.filename
-
- icon = Gio.content_type_get_icon(doc.mimetype)
- if icon:
- iconname = icon.get_names()[0]
-
- abstract = self.db.makeDocAbstract(doc, query).encode('utf-8')
-
- model.append (doc.url,
- iconname,
- CATEGORY_ALL,
- doc.mimetype,
- titleorfilename,
- abstract,
- doc.url)
-
- actual_results += 1
- if actual_results >= 20:
- break
-
+ #print "Setting up for Unity 4.0"
+ self.connect("notify::active-search",
+ self._on_search_changed)
+ self.connect("notify::active-global-search",
+ self._on_global_search_changed)
+ self.connect("filters-changed",
+ self._on_search_changed);
+ else:
+ #print "Setting up for Unity 5.0+"
+ self.connect ("search-changed", self._on_search_changed)
+ self.connect ("filters-changed",
+ self._on_filters_changed)
+
+
+ # Connect to the index
+ self.db = recoll.connect()
+
+ self.db.setAbstractParams(maxchars=200,
+ contextwords=4)
+
+ self.timeout_id = None
+
+ def get_search_string (self):
+ search = self.props.active_search
+ return search.props.search_string if search else None
+
+ def get_global_search_string (self):
+ search = self.props.active_global_search
+ return search.props.search_string if search else None
+
+ def search_finished (self):
+ search = self.props.active_search
+ if search:
+ search.emit("finished")
+
+ def global_search_finished (self):
+ search = self.props.active_global_search
+ if search:
+ search.emit("finished")
+ def reset (self):
+ self._do_browse (self.props.results_model)
+ self._do_browse (self.props.global_results_model)
+
+ def _on_filters_changed (self, scope):
+# print "_on_filters_changed()"
+ self.queue_search_changed(Unity.SearchType.DEFAULT)
+
+ if Unity._version == "4.0":
+ def _on_search_changed (self, scope, param_spec=None):
+ search_string = self.get_search_string()
+ results = scope.props.results_model
+# print "Search 4.0 changed to: '%s'" % search_string
+
+ self._update_results_model (search_string, results)
+ else:
+ def _on_search_changed (self, scope, search, search_type, cancellable):
+ search_string = search.props.search_string
+ results = search.props.results_model
+# print "Search 5.0 changed to: '%s'" % search_string
+
+ self._update_results_model (search_string, results)
+
+ def _on_global_search_changed (self, scope, param_spec):
+ search = self.get_global_search_string()
+ results = scope.props.global_results_model
+
+# print "Global search changed to: '%s'" % search
+
+ self._update_results_model (search, results)
+
+ def _update_results_model (self, search_string, model):
+ if search_string:
+ self._do_search (search_string, model)
+ else:
+ self._do_browse (model)
+
+ def _do_browse (self, model):
+ if self.timeout_id is not None:
+ GObject.source_remove(self.timeout_id)
+ model.clear ()
+
+ if model is self.props.results_model:
+ self.search_finished()
+ else:
+ self.global_search_finished()
+
+ def _on_timeout(self, search_string, model):
+ if self.timeout_id is not None:
+ GObject.source_remove(self.timeout_id)
+ self.timeout_id = None
+ self._really_do_search(search_string, model)
+ if model is self.props.results_model:
+ self.search_finished()
+ else:
+ self.global_search_finished()
+
+ def _do_search (self, search_string, model):
+ if TYPING_TIMEOUT == 0:
+ self._really_do_search(search_string, model)
+ return True
+
+ if self.timeout_id is not None:
+ GObject.source_remove(self.timeout_id)
+ self.timeout_id = \
+ GObject.timeout_add(TYPING_TIMEOUT, self._on_timeout,
+ search_string, model)
+
+ def _really_do_search(self, search_string, model):
+# print "really_do_search:[", search_string, "]"
+
+ model.clear ()
+ if search_string == "":
+ return True
+
+ fcat = self.get_filter("rclcat")
+ for option in fcat.options:
+ if option.props.active:
+ search_string += " rclcat:" + option.props.id
+
+ # Do the recoll thing
+ query = self.db.query()
+ try:
+ nres = query.execute(search_string)
+ except:
+ return
+
+ actual_results = 0
+ while query.next >= 0 and query.next < nres:
+ try:
+ doc = query.fetchone()
+ except:
+ break
+
+ # No sense in returning unusable results (until
+ # I get an idea of what to do with them)
+ if doc.ipath != "":
+ mimetype = "application/x-recoll"
+ url = doc.url + "#" + doc.ipath
+ else:
+ mimetype = doc.mimetype
+ url = doc.url
+
+ print "Recoll Lens: Using MIMETYPE", mimetype, \
+ " URL", url
+
+ titleorfilename = doc.title
+ if titleorfilename == "":
+ titleorfilename = doc.filename
+
+ icon = Gio.content_type_get_icon(doc.mimetype)
+ if icon:
+ iconname = icon.get_names()[0]
+
+ abstract = self.db.makeDocAbstract(doc, query).encode('utf-8')
+
+ model.append (url,
+ iconname,
+ CATEGORY_ALL,
+ mimetype,
+ titleorfilename,
+ abstract,
+ doc.url)
+
+ actual_results += 1
+ if actual_results >= 20:
+ break
+
+
+ def activate_uri (self, scope, uri):
+ """Activation handler for uri"""
+
+ print "Activate: %s" % uri
+
+ # Pass all uri without fragments to the desktop handler
+ if uri.find("#") == -1:
+ # Reset browsing state when an app is launched
+ self.reset ()
+ return Unity.ActivationResponse.new(Unity.HandledType.NOT_HANDLED,
+ uri)
+
+ # Pass all others to recoll
+ proc = subprocess.Popen(["recoll", uri])
+ print "Subprocess returned, going back to unity"
+ return Unity.ActivationResponse.new(Unity.HandledType.HIDE_DASH, "baduri")
+
+