aboutsummaryrefslogtreecommitdiff
path: root/main/src/ui/conversation_selector
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/ui/conversation_selector')
-rw-r--r--main/src/ui/conversation_selector/conversation_selector.vala12
-rw-r--r--main/src/ui/conversation_selector/conversation_selector_row.vala31
2 files changed, 43 insertions, 0 deletions
diff --git a/main/src/ui/conversation_selector/conversation_selector.vala b/main/src/ui/conversation_selector/conversation_selector.vala
index 70e192b7..25ea1b1e 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) {
@@ -38,6 +39,7 @@ public class ConversationSelector : Widget {
}
construct {
+ list_box.set_filter_func(filter);
list_box.set_sort_func(sort);
realize.connect(() => {
@@ -53,6 +55,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 0e565c84..95384a5e 100644
--- a/main/src/ui/conversation_selector/conversation_selector_row.vala
+++ b/main/src/ui/conversation_selector/conversation_selector_row.vala
@@ -13,6 +13,7 @@ namespace Dino.Ui {
public class ConversationSelectorRow : ListBoxRow {
[GtkChild] protected unowned AvatarPicture picture;
+ [GtkChild] protected unowned DrawingArea account_color_indicator;
[GtkChild] protected unowned Label name_label;
[GtkChild] protected unowned Label time_label;
[GtkChild] protected unowned Label nick_label;
@@ -42,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_) {
@@ -63,6 +65,7 @@ public class ConversationSelectorRow : ListBoxRow {
last_content_item = stream_interactor.get_module(ContentItemStore.IDENTITY).get_latest(conversation);
picture.model = new ViewModel.CompatAvatarPictureModel(stream_interactor).set_conversation(conversation);
+ account_color_indicator.set_draw_func(draw_account_color);
conversation.notify["read-up-to-item"].connect(() => update_read());
conversation.notify["pinned"].connect(() => { update_pinned_icon(); });
@@ -73,9 +76,31 @@ public class ConversationSelectorRow : ListBoxRow {
connect_signals_weak(this);
}
+ private static void draw_account_color(DrawingArea area, Cairo.Context context, int width, int height) {
+ ConversationSelectorRow? row = area.get_ancestor(typeof(ConversationSelectorRow)) as ConversationSelectorRow;
+ if (row == null) return;
+
+ Gdk.RGBA color = Gdk.RGBA();
+ if (!color.parse(Dino.Application.get_default().settings.get_account_color(row.conversation.account))) return;
+
+ Gdk.cairo_set_source_rgba(context, color);
+ context.rectangle(0, 0, width, height);
+ context.fill();
+ }
+
private static void connect_signals_weak(ConversationSelectorRow local_self) {
var self_weak = WeakRef(local_self);
+ var settings = Dino.Application.get_default().settings;
+ ulong account_color_changed_handler_id = 0;
+ account_color_changed_handler_id = settings.account_color_changed.connect((account, color) => {
+ ConversationSelectorRow? self = self_weak.get() as ConversationSelectorRow?;
+ if (self == null) return;
+ if (self.conversation.account.equals(account)) {
+ self.account_color_indicator.queue_draw();
+ }
+ });
+
ulong room_info_updated_handler_id = 0;
if (local_self.conversation.type_ == Conversation.Type.GROUPCHAT) {
room_info_updated_handler_id = local_self.stream_interactor.get_module(MucManager.IDENTITY).room_info_updated.connect((account, jid) => {
@@ -116,6 +141,7 @@ public class ConversationSelectorRow : ListBoxRow {
local_self.weak_ref((self_obj) => {
ConversationSelectorRow self = (ConversationSelectorRow) self_obj;
+ settings.disconnect(account_color_changed_handler_id);
if (room_info_updated_handler_id != 0) {
self.stream_interactor.get_module(MucManager.IDENTITY).disconnect(room_info_updated_handler_id);
}
@@ -154,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;
}