show how many lines match

This commit is contained in:
2022-08-25 19:15:30 +02:00
parent 7732d95626
commit fcc570d75f

View File

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