def __init__(self, options, db, initial_filter=None): self._filter_text = "" if initial_filter: self._filter_text = initial_filter self._db = db self._frontend_status = None self._backend_status = DBStatus() self._can_process_queries = False self._db_is_up_to_date = True self._last_search_query = None self._pending_search = None self._options = options self._print_results_cb = None if initial_filter: self.should_position_cursor_for_replace = False else: self.should_position_cursor_for_replace = True # First tick should be fast. message_loop.post_delayed_task(self.on_tick, 0)
def __init__(self, settings, options, db, initial_filter = None): settings.register("filter_text", str, "") settings.register("query_log", str, "") if initial_filter: settings.filter_text = initial_filter else: had_position = False self._filter_text = settings.filter_text self._settings = settings self._db = db self._can_process_queries = False self._last_search_query = None self._pending_search = None self._options = options if initial_filter: self.should_position_cursor_for_replace = False else: self.should_position_cursor_for_replace = True message_loop.post_delayed_task(self.on_tick, 0.1)
def on_tick(self, *args): @traced def begin_search(): self.frontend_status = "searching" q = self._create_query() self._pending_search = self._db.search_async(q) self._last_search_query = q @traced def on_ready(): try: res = self._pending_search.result except db_proxy.AsyncSearchError: res = None self.frontend_status = None self._pending_search = None trace_begin("update_results_list") if res: self.update_results_list(res.filenames, res.ranks) else: self.update_results_list([], []) trace_end("update_results_list") self._pending_search = None @traced def update_backend_status(): self.backend_status = self._db.status() if self._pending_search: if self._pending_search.ready: on_ready() # re-check the self._pending_search since we might have cleared it if not self._pending_search: # kick off a query if self._last_search_query: need_to_begin_search = self._filter_text != self._last_search_query.text else: need_to_begin_search = True if need_to_begin_search and self._can_process_queries: begin_search() else: # poll backend status update_backend_status() # renew the tick if self._pending_search: message_loop.post_delayed_task(self.on_tick, TICK_RATE_WHEN_SEARCHING) elif self._db_is_up_to_date: message_loop.post_delayed_task(self.on_tick, TICK_RATE_WHEN_UP_TO_DATE) else: message_loop.post_delayed_task(self.on_tick, TICK_RATE_WHEN_NOT_UP_TO_DATE)
def test_post_delayed_task(self): def step2(): message_loop.quit_main_loop() message_loop.post_delayed_task(step2, 0.1)
def _invalidate(self): if self._refresh_pending: return self._refresh_pending = True message_loop.post_delayed_task(self._refresh, 0.005)
class OpenDialogBase(object): def __init__(self, settings, options, db, initial_filter = None): settings.register("filter_text", str, "") settings.register("query_log", str, "") if initial_filter: settings.filter_text = initial_filter else: had_position = False self._filter_text = settings.filter_text self._settings = settings self._db = db self._can_process_queries = False self._last_search_query = None self._pending_search = None self._options = options if initial_filter: self.should_position_cursor_for_replace = False else: self.should_position_cursor_for_replace = True message_loop.post_delayed_task(self.on_tick, 0.1) def set_can_process_queries(self, can_process): could_process = self._can_process_queries self._can_process_queries = can_process self.set_results_enabled(can_process) @trace def set_filter_text(self, text): self._filter_text = text if self._settings.query_log != "": try: f = open(os.path.expanduser(self._settings.query_log), 'a') f.write(json.dumps({"ts": time.time(), "query": text})) f.write("\n"); f.close() except IOError: import traceback; traceback.print_exc() pass def on_reindex_clicked(self): self._db.begin_reindex() def on_tick(self,*args): def begin_search(): self.set_status("DB Status: %s" % "searching") self._last_search_query = self._filter_text self._pending_search = self._db.search_async(self._last_search_query) def on_ready(): try: res = self._pending_search.result except db_proxy.AsyncSearchError: res = None self._pending_search = None if res: self.update_results_list(res.hits,res.ranks) else: self.update_results_list([],[]) self._pending_search = None def check_status(): try: stat = self._db.status() status = stat.status enabled = stat.has_index except Exception, ex: status = "quickopend not running" enabled = False self.set_status("DB Status: %s" % status) self.set_can_process_queries(enabled) if self._pending_search: self.set_status("DB Status: %s" % "searching") if self._pending_search.ready: on_ready() # re-check the self._pending_search since we might have cleared it if not self._pending_search: # kick off a query if self._filter_text != self._last_search_query and self._can_process_queries: begin_search() else: # poll status check_status() # renew the tick message_loop.post_delayed_task(self.on_tick, 0.1)