diff --git a/src/plugins/logfile/filterwidget.py b/src/plugins/logfile/filterwidget.py index 5edae1d..f3d7925 100644 --- a/src/plugins/logfile/filterwidget.py +++ b/src/plugins/logfile/filterwidget.py @@ -18,6 +18,7 @@ from src.ui.bigtext.logFileModel import LogFileModel from src.i18n import _ from src.pluginregistry import PluginRegistry from src.ui.hbox import HBox +from src.ui.label import Label from src.zonedpluginregistry import ZonedPluginRegistry @@ -33,6 +34,7 @@ class FilterTask(QRunnable): filter_match_found_listeners: Callable[[int], None], pre_process_lines_hooks: [PreProcessLinesHook], progress_handler: Callable[[float], None], + update_hits_handler: Callable[[int], None], on_before: Callable[[], None], on_finish: Callable[[], None] ): @@ -41,6 +43,7 @@ class FilterTask(QRunnable): self.filter_model = filter_model self.regex = regex self.progress_handler = progress_handler + self.update_hits_handler = update_hits_handler self.pre_process_lines_hooks = pre_process_lines_hooks self.on_before = on_before self.on_finish = on_finish @@ -61,6 +64,7 @@ class FilterTask(QRunnable): for listener in self.filter_match_found_listeners: listener(-1, -1) # notify listeners that a new search started + hits_count = 0 last_progress_report = time.time() try: with open(self.source_model.get_file(), "rb") as source: @@ -83,6 +87,7 @@ class FilterTask(QRunnable): line = h.pre_process_line(line, target) target.write(line.encode("utf8")) + hits_count = hits_count + 1 # sometime buffering can hide results for a while # We force a flush periodically. @@ -95,12 +100,15 @@ class FilterTask(QRunnable): if now - last_progress_report > 0.2: progress = source.tell() / os.stat(self.source_model.get_file()).st_size self.progress_handler(progress) + self.update_hits_handler(hits_count) last_progress_report = now if self.aborted: + self.update_hits_handler(hits_count) # print("aborted ", time.time()) break finally: + self.update_hits_handler(hits_count) self.on_finish() # print("dome thread ", threading.currentThread()) @@ -110,6 +118,7 @@ class FilterWidget(QWidget): filter_task: Optional[FilterTask] = None search_is_running = Signal(bool) signal_update_progress = Signal(float) + signal_update_hits = Signal(int) def __init__(self, source_model: LogFileModel, zoned_plugin_registry: ZonedPluginRegistry): super(FilterWidget, self).__init__() @@ -129,6 +138,9 @@ class FilterWidget(QWidget): self.query_field.lineEdit().returnPressed.connect(self.filter_changed) self.query_field.setInsertPolicy(QComboBox.NoInsert) + self.hits_field = Label("") + self.signal_update_hits.connect(self._update_hits) + self.progress_bar = QProgressBar() self.progress_bar.setVisible(False) self.progress_bar.setMaximumWidth(50) @@ -157,9 +169,10 @@ class FilterWidget(QWidget): filter_bar.layout = QHBoxLayout(filter_bar) filter_bar.layout.setContentsMargins(0, 0, 0, 0) filter_bar.layout.addWidget(self.query_field) + filter_bar.layout.addWidget(self.btn_bookmark) + filter_bar.layout.addWidget(self.hits_field) filter_bar.layout.addWidget(self.progress_bar) filter_bar.layout.addWidget(self.btn_cancel_search) - filter_bar.layout.addWidget(self.btn_bookmark) filter_bar.layout.addWidget(self.menu) filter_bar.layout.addWidget(self.ignore_case) filter_bar.layout.addWidget(self.is_regex) @@ -224,6 +237,7 @@ class FilterWidget(QWidget): self.filter_model.truncate() self.source_model.clear_query_highlight() self.filter_model.clear_query_highlight() + self._update_hits(-1) PluginRegistry.execute("update_ui") def search_running_status_changed(self, is_running: bool): @@ -233,9 +247,18 @@ class FilterWidget(QWidget): def update_progress(self, progress: float): self.progress_bar.setValue(progress * 100) + def _update_hits(self, hits: int): + if hits >= 0: + self.hits_field.setText("({0} lines)".format(hits)) + else: + self.hits_field.setText("") + def progress_handler(self, progress: float): self.signal_update_progress.emit(progress) + def update_hits_handler(self, hits: int): + self.signal_update_hits.emit(hits) + def filter_changed(self): query = self.query_field.currentText() ignore_case = self.ignore_case.isChecked() @@ -260,6 +283,7 @@ class FilterWidget(QWidget): return self.progress_bar.setValue(0) + self._update_hits(-1) self.source_model.set_query_highlight(query, ignore_case, is_regex) self.filter_model.set_query_highlight(query, ignore_case, is_regex) @@ -274,6 +298,7 @@ class FilterWidget(QWidget): self.filter_match_found_listeners, pre_process_lines_hooks, self.progress_handler, + self.update_hits_handler, lambda: self.search_is_running.emit(True), lambda: self.search_is_running.emit(False) )