From ac3b9960c824c1b61b6baf868aef033daf6ffde8 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Sun, 20 Feb 2022 18:39:26 +0100 Subject: [PATCH] save queries --- src/plugins/krowlog/Tab.py | 4 +++ src/plugins/logfile/filterwidget.py | 39 +++++++++++++++++++++++++--- src/plugins/logfile/fulltabwidget.py | 4 +++ src/plugins/logfileplugin.py | 15 +++++++++++ src/ui/tabs.py | 1 + 5 files changed, 59 insertions(+), 4 deletions(-) diff --git a/src/plugins/krowlog/Tab.py b/src/plugins/krowlog/Tab.py index b47759b..6085c14 100644 --- a/src/plugins/krowlog/Tab.py +++ b/src/plugins/krowlog/Tab.py @@ -21,3 +21,7 @@ class Tab(QWidget): @abstractmethod def destruct(self): pass + + @abstractmethod + def on_reveal(self): + pass diff --git a/src/plugins/logfile/filterwidget.py b/src/plugins/logfile/filterwidget.py index 51d976e..0b4e792 100644 --- a/src/plugins/logfile/filterwidget.py +++ b/src/plugins/logfile/filterwidget.py @@ -5,7 +5,9 @@ import threading from typing import Optional, Callable from PySide6.QtCore import QRunnable, QThreadPool, Signal -from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QLineEdit, QCheckBox, QPushButton +from PySide6.QtGui import QIcon +from PySide6.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QLineEdit, QCheckBox, QPushButton, QComboBox, \ + QSizePolicy from src.ui.bigtext.bigtext import BigText from src.ui.bigtext.logFileModel import LogFileModel @@ -96,14 +98,23 @@ class FilterWidget(QWidget): self.layout = QVBoxLayout(self) self.layout.setContentsMargins(0, 0, 0, 0) - self.query_field = QLineEdit() - self.query_field.textChanged.connect(self.filter_changed) + self.query_field = QComboBox() + self.query_field.setEditable(True) + self.query_field.addItem("") + self.query_field.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) + self.query_field.lineEdit().textChanged.connect(self.filter_changed) + self.query_field.lineEdit().returnPressed.connect(self.filter_changed) + self.query_field.setInsertPolicy(QComboBox.NoInsert) self.btn_cancel_search = QPushButton(_("Cancel")) self.btn_cancel_search.setVisible(False) self.btn_cancel_search.pressed.connect(self._cancel_search) self.search_is_running.connect(lambda is_running: self.btn_cancel_search.setVisible(is_running)) + self.btn_bookmark = QPushButton(QIcon("icons/ionicons/star.svg"), "") + self.btn_bookmark.setToolTip(_("save query")) + self.btn_bookmark.pressed.connect(self._save_query) + self.ignore_case = QCheckBox(_("ignore case")) self.ignore_case.setChecked(True) self.ignore_case.stateChanged.connect(self.filter_changed) @@ -117,6 +128,7 @@ class FilterWidget(QWidget): filter_bar.layout.setContentsMargins(0, 0, 0, 0) filter_bar.layout.addWidget(self.query_field) filter_bar.layout.addWidget(self.btn_cancel_search) + filter_bar.layout.addWidget(self.btn_bookmark) filter_bar.layout.addWidget(self.ignore_case) filter_bar.layout.addWidget(self.is_regex) @@ -130,12 +142,31 @@ class FilterWidget(QWidget): self.filter_match_found_listeners: [Callable[[int], None]] = [] + def on_reveal(self): + self._reload_save_queries() + + def _reload_save_queries(self): + current_text = self.query_field.currentText() + self.query_field.clear() + saved_queries = PluginRegistry.execute_single("saved_queries") + self.query_field.addItem("") + for saved_query in saved_queries: + self.query_field.addItem(saved_query) + + self.query_field.setCurrentText(current_text) + def add_line_click_listener(self, listener: Callable[[int], None]): self.hits_view.add_line_click_listener(listener) def add_filter_match_found_listener(self, listener: Callable[[int], None]): self.filter_match_found_listeners.append(listener) + def _save_query(self): + query = self.query_field.currentText() + if len(query) > 0: + PluginRegistry.execute("save_query", query) + self._reload_save_queries() + def destruct(self): # print("cleanup: ", self.tmpfilename) self._cancel_search() @@ -156,7 +187,7 @@ class FilterWidget(QWidget): PluginRegistry.execute("update_ui") def filter_changed(self): - query = self.query_field.text() + query = self.query_field.currentText() ignore_case = self.ignore_case.isChecked() is_regex = self.is_regex.isChecked() diff --git a/src/plugins/logfile/fulltabwidget.py b/src/plugins/logfile/fulltabwidget.py index 929b81f..08fff5d 100644 --- a/src/plugins/logfile/fulltabwidget.py +++ b/src/plugins/logfile/fulltabwidget.py @@ -45,3 +45,7 @@ class FullTabWidget(Tab): file = self._model.get_file() file_size = humanbytes(self._model.byte_count()) return "%s - %s" % (file_size, file) + + # overriding abstract method + def on_reveal(self): + self.filter_hit_view.on_reveal() diff --git a/src/plugins/logfileplugin.py b/src/plugins/logfileplugin.py index 2c802c7..1694d95 100644 --- a/src/plugins/logfileplugin.py +++ b/src/plugins/logfileplugin.py @@ -34,3 +34,18 @@ class LogFilePlugin(PluginBase): tab = FullTabWidget(model, unique_id=realpath, title=filename) return tab + + def saved_queries(self) -> [str]: + saved_queries = self.settings.get_session("general", "saved_queries", "").splitlines() + if "" in saved_queries: + saved_queries.remove("") + saved_queries.sort() + return saved_queries + + def save_query(self, query: str): + saved_queries = self.settings.get_session("general", "saved_queries", "").splitlines() + if "" in saved_queries: + saved_queries.remove("") + if not query in saved_queries: + saved_queries.append(query) + self.settings.set_session("general", "saved_queries", "\n".join(saved_queries)) diff --git a/src/ui/tabs.py b/src/ui/tabs.py index 465462c..dbc4a7c 100644 --- a/src/ui/tabs.py +++ b/src/ui/tabs.py @@ -40,6 +40,7 @@ class Tabs(QWidget): if tab: PluginRegistry.execute("update_window_title", tab.title) PluginRegistry.execute("update_status_bar", tab.get_status_text()) + tab.on_reveal() else: PluginRegistry.execute("update_window_title", "") PluginRegistry.execute("update_status_bar", "")