aboutsummaryrefslogtreecommitdiff
path: root/main/src/ui/add_conversation/list_row.vala
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/ui/add_conversation/list_row.vala')
-rw-r--r--main/src/ui/add_conversation/list_row.vala68
1 files changed, 42 insertions, 26 deletions
diff --git a/main/src/ui/add_conversation/list_row.vala b/main/src/ui/add_conversation/list_row.vala
index 8e4cbb9b..c489aa13 100644
--- a/main/src/ui/add_conversation/list_row.vala
+++ b/main/src/ui/add_conversation/list_row.vala
@@ -8,18 +8,21 @@ namespace Dino.Ui {
public class ListRow : Widget {
- public Grid outer_grid;
+ public Box outer_box;
public AvatarPicture picture;
public Label name_label;
public Image status_dot;
public Label via_label;
- public Jid? jid;
- public Account? account;
+ public StreamInteractor stream_interactor;
+ public Jid jid;
+ public Account account;
+
+ private ulong[] handler_ids = new ulong[0];
construct {
Builder builder = new Builder.from_resource("/im/dino/Dino/add_conversation/list_row.ui");
- outer_grid = (Grid) builder.get_object("outer_grid");
+ outer_box = (Box) builder.get_object("outer_box");
picture = (AvatarPicture) builder.get_object("picture");
name_label = (Label) builder.get_object("name_label");
status_dot = (Image) builder.get_object("status_dot");
@@ -27,35 +30,32 @@ public class ListRow : Widget {
this.layout_manager = new BinLayout();
- outer_grid.set_parent(this);
+ outer_box.set_parent(this);
}
- public ListRow() {}
+ private void set_status_dot(StreamInteractor stream_interactor){
+ status_dot.visible = stream_interactor.connection_manager.get_state(account) == ConnectionManager.ConnectionState.CONNECTED;
- private void set_status_dot(StreamInteractor stream_interactor, Jid jid, Account account){
Gee.List<Jid>? full_jids = stream_interactor.get_module(PresenceManager.IDENTITY).get_full_jids(jid, account);
- string presence_str = null;
- if (full_jids != null){
- int devices = 0;
- string newline_if_more_devices;
- for (int i = 0; i < full_jids.size; i++) {
- Jid full_jid = full_jids[i];
- presence_str = stream_interactor.get_module(PresenceManager.IDENTITY).get_last_show(full_jid, account);
- if(presence_str != null) devices += 1;
- newline_if_more_devices = devices > 1 ? "\r\n" : "";
- switch(presence_str){
- case "dnd": this.status_dot.set_from_icon_name("dino-status-dnd"); i = full_jids.size; break; // dnd detected = marked as dnd for all devices
- case "online": this.status_dot.set_from_icon_name("dino-status-online"); i = full_jids.size; break;
- case "away": this.status_dot.set_from_icon_name("dino-status-away"); break;
- case "xa": this.status_dot.set_from_icon_name("dino-status-away"); break;
- case "chat": this.status_dot.set_from_icon_name("dino-status-chat"); break;
- }
+ if (full_jids != null) {
+ var statuses = new ArrayList<string>();
+ foreach (var full_jid in full_jids) {
+ statuses.add(stream_interactor.get_module(PresenceManager.IDENTITY).get_last_show(full_jid, account));
}
+
+ if (statuses.contains(Xmpp.Presence.Stanza.SHOW_DND)) status_dot.set_from_icon_name("dino-status-dnd");
+ else if (statuses.contains(Xmpp.Presence.Stanza.SHOW_CHAT)) status_dot.set_from_icon_name("dino-status-chat");
+ else if (statuses.contains(Xmpp.Presence.Stanza.SHOW_ONLINE)) status_dot.set_from_icon_name("dino-status-online");
+ else if (statuses.contains(Xmpp.Presence.Stanza.SHOW_AWAY)) status_dot.set_from_icon_name("dino-status-away");
+ else if (statuses.contains(Xmpp.Presence.Stanza.SHOW_XA)) status_dot.set_from_icon_name("dino-status-away");
+ else status_dot.set_from_icon_name("dino-status-offline");
+ } else {
+ status_dot.set_from_icon_name("dino-status-offline");
}
- else status_dot.set_from_icon_name("dino-status-offline");
}
public ListRow.from_jid(StreamInteractor stream_interactor, Jid jid, Account account, bool show_account) {
+ this.stream_interactor = stream_interactor;
this.jid = jid;
this.account = account;
@@ -72,11 +72,27 @@ public class ListRow : Widget {
}
name_label.label = display_name;
picture.model = new ViewModel.CompatAvatarPictureModel(stream_interactor).set_conversation(conv);
- set_status_dot(stream_interactor, jid, account);
+
+ handler_ids += stream_interactor.get_module(PresenceManager.IDENTITY).show_received.connect((jid, account) => {
+ if (account.equals(this.account) && jid.equals_bare(this.jid)) {
+ set_status_dot(stream_interactor);
+ }
+ });
+ handler_ids += stream_interactor.get_module(PresenceManager.IDENTITY).received_offline_presence.connect((jid, account) => {
+ if (account.equals(this.account) && jid.equals_bare(this.jid)) {
+ set_status_dot(stream_interactor);
+ }
+ });
+
+ set_status_dot(stream_interactor);
}
public override void dispose() {
- outer_grid.unparent();
+ outer_box.unparent();
+
+ foreach (var handler_id in handler_ids) {
+ stream_interactor.get_module(PresenceManager.IDENTITY).disconnect(handler_id);
+ }
}
}