From 5150fd769aef10b9d28e951ad696f977f1fa39eb Mon Sep 17 00:00:00 2001 From: jeffser Date: Sat, 21 Sep 2024 15:50:38 -0600 Subject: [PATCH] Message search (yeah finally) --- src/custom_widgets/chat_widget.py | 7 ++++++- src/window.py | 29 +++++++++++++++++++++++++++-- src/window.ui | 26 ++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 3 deletions(-) diff --git a/src/custom_widgets/chat_widget.py b/src/custom_widgets/chat_widget.py index 322598f..63b5102 100644 --- a/src/custom_widgets/chat_widget.py +++ b/src/custom_widgets/chat_widget.py @@ -72,7 +72,8 @@ class chat(Gtk.ScrolledWindow): self.welcome_screen = None self.regenerate_button = None self.busy = False - self.get_vadjustment().connect('notify::page-size', lambda va, *_: va.set_value(va.get_upper() - va.get_page_size()) if va.get_value() == 0 else None) + #self.get_vadjustment().connect('notify::page-size', lambda va, *_: va.set_value(va.get_upper() - va.get_page_size()) if va.get_value() == 0 else None) + ##TODO Figure out how to do this with the search thing def stop_message(self): self.busy = False @@ -436,6 +437,10 @@ class chat_list(Gtk.ListBox): if row: current_tab_i = next((i for i, t in enumerate(self.tab_list) if t.chat_window == window.chat_stack.get_visible_child()), -1) if self.tab_list.index(row) != current_tab_i: + if window.searchentry_messages.get_text() != '': + window.searchentry_messages.set_text('') + window.message_search_changed(window.searchentry_messages, window.chat_stack.get_visible_child()) + window.message_searchbar.set_search_mode(False) window.chat_stack.set_transition_type(4 if self.tab_list.index(row) > current_tab_i else 5) window.chat_stack.set_visible_child(row.chat_window) window.switch_send_stop_button(not row.chat_window.busy) diff --git a/src/window.py b/src/window.py index 858862d..d751c06 100644 --- a/src/window.py +++ b/src/window.py @@ -92,6 +92,9 @@ class AlpacaWindow(Adw.ApplicationWindow): file_preview_remove_button = Gtk.Template.Child() secondary_menu_button = Gtk.Template.Child() model_searchbar = Gtk.Template.Child() + message_searchbar = Gtk.Template.Child() + message_search_button = Gtk.Template.Child() + searchentry_messages = Gtk.Template.Child() no_results_page = Gtk.Template.Child() model_link_button = Gtk.Template.Child() title_stack = Gtk.Template.Child() @@ -321,6 +324,10 @@ class AlpacaWindow(Adw.ApplicationWindow): self.model_manager.pulling_list.set_visible(not button.get_active() and len(list(self.model_manager.pulling_list)) > 0) self.model_manager.local_list.set_visible(not button.get_active() and len(list(self.model_manager.local_list)) > 0) + @Gtk.Template.Callback() + def message_search_toggle(self, button): + self.message_searchbar.set_search_mode(button.get_active()) + @Gtk.Template.Callback() def model_search_changed(self, entry): results = 0 @@ -336,6 +343,23 @@ class AlpacaWindow(Adw.ApplicationWindow): self.model_scroller.set_visible(True) self.no_results_page.set_visible(False) + @Gtk.Template.Callback() + def message_search_changed(self, entry, current_chat=None): + search_term=entry.get_text() + results = 0 + if not current_chat: + current_chat = self.chat_list_box.get_current_chat() + if current_chat: + for key, message in current_chat.messages.items(): + message.set_visible(re.search(search_term, message.text, re.IGNORECASE)) + for block in message.content_children: + if isinstance(block, message_widget.text_block): + if search_term: + highlighted_text = re.sub(f"({re.escape(search_term)})", r"\1", block.get_text(),flags=re.IGNORECASE) + block.set_markup(highlighted_text) + else: + block.set_markup(block.get_text()) + @Gtk.Template.Callback() def on_clipboard_paste(self, textview): logger.debug("Pasting from clipboard") @@ -827,7 +851,7 @@ Generate a title following these rules: def __init__(self, **kwargs): super().__init__(**kwargs) - + self.message_searchbar.connect('notify::search-mode-enabled', lambda *_: self.message_search_button.set_active(self.message_searchbar.get_search_mode())) message_widget.window = self chat_widget.window = self model_widget.window = self @@ -864,7 +888,8 @@ Generate a title following these rules: 'export_chat': [self.chat_actions], 'export_current_chat': [self.current_chat_actions], 'toggle_sidebar': [lambda *_: self.split_view_overlay.set_show_sidebar(not self.split_view_overlay.get_show_sidebar()), ['F9']], - 'manage_models': [lambda *_: self.manage_models_dialog.present(self), ['m']] + 'manage_models': [lambda *_: self.manage_models_dialog.present(self), ['m']], + 'search_messages': [lambda *_: self.message_searchbar.set_search_mode(not self.message_searchbar.get_search_mode()), ['f']] } for action_name, data in universal_actions.items(): diff --git a/src/window.ui b/src/window.ui index 6d77fe5..fecde44 100644 --- a/src/window.ui +++ b/src/window.ui @@ -54,6 +54,7 @@ + 140 @@ -63,6 +64,13 @@ + + + edit-find-symbolic + Search Messages + + + 100 @@ -100,6 +108,24 @@ + + + + Message search bar + + AlpacaWindow + + + + 200 + Search messages + + Search messages + + + + + 1