aboutsummaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorfrosty <gabriel@bwaaa.monster>2026-08-18 12:59:50 -0400
committerfrosty <gabriel@bwaaa.monster>2026-08-18 12:59:50 -0400
commitd2c69cfb544c23042652dee9ebf0e7031d6c2b29 (patch)
treeff4e6d6d9ef398e55d0b9c9b0c2ca8bb4ac5c42d /main
parent35108fe1936a280318ad8935b89277f049a6428e (diff)
Add conversation search and change window decorations
Diffstat (limited to 'main')
-rw-r--r--main/data/gresource.xml1
-rw-r--r--main/data/main_window.ui54
-rw-r--r--main/data/main_window_placeholder.ui5
-rw-r--r--main/data/menu_add.ui15
-rw-r--r--main/data/menu_app.ui10
-rw-r--r--main/data/style.css16
-rw-r--r--main/src/main.vala1
-rw-r--r--main/src/ui/conversation_selector/conversation_selector.vala12
-rw-r--r--main/src/ui/conversation_selector/conversation_selector_row.vala6
-rw-r--r--main/src/ui/main_window.vala21
10 files changed, 79 insertions, 62 deletions
diff --git a/main/data/gresource.xml b/main/data/gresource.xml
index 2e38153b..b1dc2c40 100644
--- a/main/data/gresource.xml
+++ b/main/data/gresource.xml
@@ -98,7 +98,6 @@
<file>join_room_dialog2.ui</file>
<file>main_window.ui</file>
<file>main_window_placeholder.ui</file>
- <file>menu_add.ui</file>
<file>menu_app.ui</file>
<file>menu_conversation.ui</file>
<file>menu_encryption.ui</file>
diff --git a/main/data/main_window.ui b/main/data/main_window.ui
index 6ca4e915..8ca1b704 100644
--- a/main/data/main_window.ui
+++ b/main/data/main_window.ui
@@ -2,15 +2,19 @@
<interface>
<requires lib="gtk" version="4.0"/>
<requires lib="libadwaita" version="1.4"/>
- <template class="DinoUiMainWindow" parent="AdwApplicationWindow">
- <child>
- <object class="AdwBreakpoint">
- <condition>max-width: 600sp</condition>
- <setter object="navigation_split_view" property="collapsed">True</setter>
- </object>
- </child>
- <property name="content">
- <object class="GtkStack" id="stack">
+ <template class="DinoUiMainWindow" parent="GtkApplicationWindow">
+ <property name="child">
+ <object class="AdwBreakpointBin">
+ <property name="width-request">360</property>
+ <property name="height-request">320</property>
+ <child>
+ <object class="AdwBreakpoint">
+ <condition>max-width: 600sp</condition>
+ <setter object="navigation_split_view" property="collapsed">True</setter>
+ </object>
+ </child>
+ <property name="child">
+ <object class="GtkStack" id="stack">
<child>
<object class="GtkStackPage">
<property name="name">main</property>
@@ -24,24 +28,21 @@
<property name="child">
<object class="AdwToolbarView">
<child type="top">
- <object class="AdwHeaderBar" id="header_bar">
- <property name="show-title">False</property>
- <property name="hexpand">False</property>
+ <object class="GtkBox">
+ <property name="spacing">6</property>
+ <property name="margin-start">6</property>
+ <property name="margin-end">6</property>
<style>
- <class name="dino-left"/>
+ <class name="toolbar"/>
+ <class name="dino-conversation-list-toolbar"/>
</style>
<child>
- <object class="GtkMenuButton" id="add_button">
- <property name="has-frame">False</property>
- <child>
- <object class="GtkImage">
- <property name="icon-name">dino-list-add-symbolic</property>
- <property name="icon-size">normal</property>
- </object>
- </child>
+ <object class="GtkSearchEntry" id="conversation_search_entry">
+ <property name="hexpand">True</property>
+ <property name="placeholder-text" translatable="yes">Search conversations</property>
</object>
</child>
- <child type="end">
+ <child>
<object class="GtkMenuButton" id="menu_button">
<property name="has-frame">False</property>
<child>
@@ -87,7 +88,7 @@
<property name="width_request">260</property>
<property name="title" translatable="yes">You have no open chats</property>
- <property name="description" translatable="yes">Click + to start a chat or join a channel</property>
+ <property name="description" translatable="yes">Use the menu to start a chat or join a channel</property>
</object>
</property>
</object>
@@ -108,6 +109,11 @@
<object class="AdwToolbarView">
<child type="top">
<object class="AdwHeaderBar" id="conversation_headerbar">
+ <property name="show-start-title-buttons">False</property>
+ <property name="show-end-title-buttons">False</property>
+ <style>
+ <class name="dino-chat-headerbar"/>
+ </style>
<property name="title-widget">
<object class="AdwWindowTitle" id="conversation_window_title" />
</property>
@@ -185,6 +191,8 @@
</property>
</object>
</child>
+ </object>
+ </property>
</object>
</property>
</template>
diff --git a/main/data/main_window_placeholder.ui b/main/data/main_window_placeholder.ui
index 123920fe..b9b72820 100644
--- a/main/data/main_window_placeholder.ui
+++ b/main/data/main_window_placeholder.ui
@@ -8,11 +8,6 @@
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<child>
- <object class="GtkHeaderBar">
- <property name="show-title-buttons">true</property>
- </object>
- </child>
- <child>
<object class="GtkBox">
<property name="orientation">vertical</property>
<property name="valign">center</property>
diff --git a/main/data/menu_add.ui b/main/data/menu_add.ui
deleted file mode 100644
index c984e081..00000000
--- a/main/data/menu_add.ui
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<interface>
- <menu id="menu_add">
- <section>
- <item>
- <attribute name="action">app.add_chat</attribute>
- <attribute name="label" translatable="yes">Start Conversation</attribute>
- </item>
- <item>
- <attribute name="action">app.add_conference</attribute>
- <attribute name="label" translatable="yes">Join Channel</attribute>
- </item>
- </section>
- </menu>
-</interface>
diff --git a/main/data/menu_app.ui b/main/data/menu_app.ui
index 9b85634d..bbcddb6d 100644
--- a/main/data/menu_app.ui
+++ b/main/data/menu_app.ui
@@ -3,6 +3,16 @@
<menu id="menu_app">
<section>
<item>
+ <attribute name="action">app.add_chat</attribute>
+ <attribute name="label" translatable="yes">Start Conversation</attribute>
+ </item>
+ <item>
+ <attribute name="action">app.add_conference</attribute>
+ <attribute name="label" translatable="yes">Join Channel</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
<attribute name="action">app.preferences</attribute>
<attribute name="label" translatable="yes">Preferences</attribute>
</item>
diff --git a/main/data/style.css b/main/data/style.css
index fc5915fb..64394cae 100644
--- a/main/data/style.css
+++ b/main/data/style.css
@@ -9,18 +9,18 @@ statuspage {
opacity: 0.5;
}
-window.dino-main .dino-header-right {
- background: @theme_base_color;
+window.dino-main headerbar.dino-chat-headerbar {
+ min-height: 44px;
}
-window.dino-main .dino-header-left {
- background: @insensitive_bg_color;
+window.dino-main headerbar.dino-chat-headerbar > windowhandle > box {
+ padding-top: 5px;
+ padding-bottom: 5px;
}
-window.dino-main headerbar.dino-left label.title {
- opacity: 0;
- font-size: 0;
- color: transparent;
+window.dino-main .dino-conversation-list-toolbar {
+ padding-top: 5px;
+ padding-bottom: 5px;
}
window.dino-main .dino-conversation undershoot,
diff --git a/main/src/main.vala b/main/src/main.vala
index bf8759b6..4a6d31c7 100644
--- a/main/src/main.vala
+++ b/main/src/main.vala
@@ -14,6 +14,7 @@ void main(string[] args) {
Intl.textdomain(GETTEXT_PACKAGE);
internationalize(GETTEXT_PACKAGE, search_path_generator.get_locale_path(GETTEXT_PACKAGE, LOCALE_INSTALL_DIR));
+ Environment.set_variable("GTK_CSD", "0", true);
Gtk.init();
Dino.Ui.Application app = new Dino.Ui.Application() { search_path_generator=search_path_generator };
Plugins.Loader loader = new Plugins.Loader(app);
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);