diff options
| author | frosty <gabriel@bwaaa.monster> | 2026-08-18 12:59:50 -0400 |
|---|---|---|
| committer | frosty <gabriel@bwaaa.monster> | 2026-08-18 12:59:50 -0400 |
| commit | d2c69cfb544c23042652dee9ebf0e7031d6c2b29 (patch) | |
| tree | ff4e6d6d9ef398e55d0b9c9b0c2ca8bb4ac5c42d /main/src/ui | |
| parent | 35108fe1936a280318ad8935b89277f049a6428e (diff) | |
Add conversation search and change window decorations
Diffstat (limited to 'main/src/ui')
| -rw-r--r-- | main/src/ui/conversation_selector/conversation_selector.vala | 12 | ||||
| -rw-r--r-- | main/src/ui/conversation_selector/conversation_selector_row.vala | 6 | ||||
| -rw-r--r-- | main/src/ui/main_window.vala | 21 |
3 files changed, 29 insertions, 10 deletions
diff --git a/main/src/ui/conversation_selector/conversation_selector.vala b/main/src/ui/conversation_selector/conversation_selector.vala index 5d88c540..c11eea82 100644 --- a/main/src/ui/conversation_selector/conversation_selector.vala +++ b/main/src/ui/conversation_selector/conversation_selector.vala @@ -14,6 +14,7 @@ public class ConversationSelector : Widget { ListBox list_box = new ListBox() { hexpand=true }; private StreamInteractor stream_interactor; + private string search_text = ""; private HashMap<Conversation, ConversationSelectorRow> rows = new HashMap<Conversation, ConversationSelectorRow>(Conversation.hash_func, Conversation.equals_func); public ConversationSelector init(StreamInteractor stream_interactor) { @@ -37,6 +38,7 @@ public class ConversationSelector : Widget { } construct { + list_box.set_filter_func(filter); list_box.set_sort_func(sort); realize.connect(() => { @@ -52,6 +54,16 @@ public class ConversationSelector : Widget { check_widget_leak(this); } + public void set_search_text(string text) { + search_text = text.strip().casefold(); + list_box.invalidate_filter(); + } + + private bool filter(ListBoxRow list_box_row) { + ConversationSelectorRow? row = list_box_row as ConversationSelectorRow; + return row != null && (search_text == "" || row.matches_search(search_text)); + } + public void row_activated(ListBoxRow r) { ConversationSelectorRow? row = r as ConversationSelectorRow; if (row != null) { diff --git a/main/src/ui/conversation_selector/conversation_selector_row.vala b/main/src/ui/conversation_selector/conversation_selector_row.vala index 11107c57..82c96fdc 100644 --- a/main/src/ui/conversation_selector/conversation_selector_row.vala +++ b/main/src/ui/conversation_selector/conversation_selector_row.vala @@ -43,6 +43,7 @@ public class ConversationSelectorRow : ListBoxRow { var display_name_model = stream_interactor.get_module(ContactModels.IDENTITY).get_display_name_model(conversation); display_name_model.bind_property("display-name", name_label, "label", BindingFlags.SYNC_CREATE); + name_label.notify["label"].connect(changed); // Set tooltip switch (conversation.type_) { @@ -179,6 +180,11 @@ public class ConversationSelectorRow : ListBoxRow { name_label.label = Util.get_conversation_display_name(stream_interactor, conversation); } + public bool matches_search(string search_text) { + return name_label.label.casefold().contains(search_text) || + conversation.counterpart.bare_jid.to_string().casefold().contains(search_text); + } + private void update_pinned_icon() { pinned_image.visible = conversation.pinned != 0; } diff --git a/main/src/ui/main_window.vala b/main/src/ui/main_window.vala index 6cabfea7..e18e0de3 100644 --- a/main/src/ui/main_window.vala +++ b/main/src/ui/main_window.vala @@ -7,14 +7,14 @@ using Dino.Entities; namespace Dino.Ui { [GtkTemplate (ui = "/im/dino/Dino/main_window.ui")] -public class MainWindow : Adw.ApplicationWindow { +public class MainWindow : Gtk.ApplicationWindow { public signal void conversation_selected(Conversation conversation); [GtkChild] public Stack stack; [GtkChild] public Adw.NavigationSplitView navigation_split_view; - [GtkChild] public MenuButton add_button; + [GtkChild] public SearchEntry conversation_search_entry; [GtkChild] public MenuButton menu_button; [GtkChild] public Adw.HeaderBar conversation_headerbar; @@ -57,11 +57,17 @@ public class MainWindow : Adw.ApplicationWindow { conversation_selector.init(stream_interactor); conversation_selector.conversation_selected.connect_after(() => { navigation_split_view.show_content = true; }); + conversation_search_entry.search_changed.connect(() => { + conversation_selector.set_search_text(conversation_search_entry.text); + }); + conversation_search_entry.stop_search.connect(() => { + conversation_search_entry.text = ""; + }); global_search = new GlobalSearch(stream_interactor); search_frame.set_child(global_search.get_widget()); - create_add_menu(add_button, menu_button); + create_menu(menu_button); stack.add_named(welcome_placeholder, "welcome_placeholder"); stack.add_named(accounts_placeholder, "accounts_placeholder"); @@ -134,13 +140,8 @@ public class MainWindow : Adw.ApplicationWindow { } } - private static void create_add_menu(MenuButton add_button, MenuButton menu_button) { - add_button.tooltip_text = Util.string_if_tooltips_active(_("Start Conversation")); - - Builder add_builder = new Builder.from_resource("/im/dino/Dino/menu_add.ui"); - MenuModel add_menu_model = add_builder.get_object("menu_add") as MenuModel; - add_button.set_menu_model(add_menu_model); - + private static void create_menu(MenuButton menu_button) { + menu_button.tooltip_text = Util.string_if_tooltips_active(_("Main Menu")); Builder menu_builder = new Builder.from_resource("/im/dino/Dino/menu_app.ui"); MenuModel menu_menu_model = menu_builder.get_object("menu_app") as MenuModel; menu_button.set_menu_model(menu_menu_model); |
