Show contact status in "Start chat" window

- should close https://github.com/dino/dino/issues/139
This commit is contained in:
Miquel Lionel 2024-06-16 00:28:13 +02:00
parent 036d17df97
commit 08d9ba3c44
No known key found for this signature in database
GPG key ID: 9AB16B2385E9EEAB
3 changed files with 71 additions and 27 deletions

View file

@ -1,12 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<requires lib="gtk" version="4.0"/> <requires lib="gtk" version="4.0"/>
<object class="GtkGrid" id="outer_grid"> <object class="GtkBox" id="outer_box">
<property name="margin-start">3</property> <property name="orientation">horizontal</property>
<property name="margin-end">3</property> <property name="spacing">8</property>
<property name="margin-top">3</property> <property name="margin-start">6</property>
<property name="margin-bottom">3</property> <property name="margin-end">6</property>
<property name="column-spacing">10</property> <property name="margin-top">6</property>
<property name="margin-bottom">6</property>
<child> <child>
<object class="DinoUiAvatarPicture" id="picture"> <object class="DinoUiAvatarPicture" id="picture">
<property name="height-request">30</property> <property name="height-request">30</property>
@ -15,34 +16,33 @@
</object> </object>
</child> </child>
<child> <child>
<object class="GtkGrid"> <object class="GtkBox">
<property name="valign">center</property>
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="valign">center</property>
<child>
<object class="GtkBox">
<property name="orientation">horizontal</property>
<property name="spacing">6</property>
<child> <child>
<object class="GtkLabel" id="name_label"> <object class="GtkLabel" id="name_label">
<property name="max_width_chars">1</property>
<property name="ellipsize">end</property> <property name="ellipsize">end</property>
<property name="hexpand">1</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<layout> </object>
<property name="column">0</property> </child>
<property name="row">0</property> <child>
</layout> <object class="GtkImage" id="status_dot">
<property name="pixel-size">8</property>
</object>
</child>
</object> </object>
</child> </child>
<child> <child>
<object class="GtkLabel" id="via_label"> <object class="GtkLabel" id="via_label">
<property name="max_width_chars">1</property>
<property name="ellipsize">end</property> <property name="ellipsize">end</property>
<property name="hexpand">1</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<attributes> <attributes>
<attribute name="scale" value="0.8"></attribute> <attribute name="scale" value="0.8"></attribute>
</attributes> </attributes>
<layout>
<property name="column">0</property>
<property name="row">1</property>
</layout>
</object> </object>
</child> </child>
</object> </object>

View file

@ -103,6 +103,7 @@ internal class ConferenceListRow : ListRow {
this.account = account; this.account = account;
this.bookmark = bookmark; this.bookmark = bookmark;
status_dot.visible = false;
name_label.label = bookmark.name != null && bookmark.name != "" ? bookmark.name : bookmark.jid.to_string(); name_label.label = bookmark.name != null && bookmark.name != "" ? bookmark.name : bookmark.jid.to_string();
if (stream_interactor.get_accounts().size > 1) { if (stream_interactor.get_accounts().size > 1) {
via_label.label = "via " + account.bare_jid.to_string(); via_label.label = "via " + account.bare_jid.to_string();

View file

@ -8,27 +8,69 @@ namespace Dino.Ui {
public class ListRow : Widget { public class ListRow : Widget {
public Grid outer_grid; public Box outer_box;
public AvatarPicture picture; public AvatarPicture picture;
public Label name_label; public Label name_label;
public Image status_dot;
public Label via_label; public Label via_label;
public string? status_str;
public Jid? jid; public Jid? jid;
public Account? account; public Account? account;
construct { construct {
Builder builder = new Builder.from_resource("/im/dino/Dino/add_conversation/list_row.ui"); 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"); picture = (AvatarPicture) builder.get_object("picture");
name_label = (Label) builder.get_object("name_label"); name_label = (Label) builder.get_object("name_label");
status_dot = (Image) builder.get_object("status_dot");
via_label = (Label) builder.get_object("via_label"); via_label = (Label) builder.get_object("via_label");
this.layout_manager = new BinLayout(); this.layout_manager = new BinLayout();
outer_grid.set_parent(this); outer_box.set_parent(this);
} }
public ListRow() {} public ListRow() {}
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 presences = "";
if (full_jids != null) {
for (int i = 0; i < full_jids.size; i++) {
Jid full_jid = full_jids[i];
string presence = stream_interactor.get_module(PresenceManager.IDENTITY).get_last_show(full_jid, account);
presences += presence + " ";
}
} else presences = null;
if (presences == null) {
status_dot.set_from_icon_name("dino-status-offline");
return;
}
// Do not disturb > Interested in Chatting > Online > Away = Extended Away
if(presences.contains(Presence.Stanza.SHOW_DND)) {
status_dot.set_from_icon_name("dino-status-dnd");
return;
}
if(presences.contains(Presence.Stanza.SHOW_CHAT)) {
status_dot.set_from_icon_name("dino-status-chat");
return;
}
if(presences.contains(Presence.Stanza.SHOW_ONLINE)) {
status_dot.set_from_icon_name("dino-status-online");
return;
}
if(presences.contains(Presence.Stanza.SHOW_AWAY) || presences.contains(Presence.Stanza.SHOW_XA)) {
status_dot.set_from_icon_name("dino-status-away");
return;
}
}
public ListRow.from_jid(StreamInteractor stream_interactor, Jid jid, Account account, bool show_account) { public ListRow.from_jid(StreamInteractor stream_interactor, Jid jid, Account account, bool show_account) {
this.jid = jid; this.jid = jid;
this.account = account; this.account = account;
@ -46,10 +88,11 @@ public class ListRow : Widget {
} }
name_label.label = display_name; name_label.label = display_name;
picture.model = new ViewModel.CompatAvatarPictureModel(stream_interactor).set_conversation(conv); picture.model = new ViewModel.CompatAvatarPictureModel(stream_interactor).set_conversation(conv);
set_status_dot(stream_interactor, jid, account);
} }
public override void dispose() { public override void dispose() {
outer_grid.unparent(); outer_box.unparent();
} }
} }