aboutsummaryrefslogtreecommitdiff
path: root/main/src/ui/add_conversation
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/ui/add_conversation')
-rw-r--r--main/src/ui/add_conversation/add_conference_dialog.vala89
-rw-r--r--main/src/ui/add_conversation/conference_list.vala1
-rw-r--r--main/src/ui/add_conversation/list_row.vala57
-rw-r--r--main/src/ui/add_conversation/roster_list.vala18
-rw-r--r--main/src/ui/add_conversation/select_contact_dialog.vala22
5 files changed, 89 insertions, 98 deletions
diff --git a/main/src/ui/add_conversation/add_conference_dialog.vala b/main/src/ui/add_conversation/add_conference_dialog.vala
index 551f6713..ac721a63 100644
--- a/main/src/ui/add_conversation/add_conference_dialog.vala
+++ b/main/src/ui/add_conversation/add_conference_dialog.vala
@@ -21,7 +21,7 @@ public class AddConferenceDialog : Gtk.Dialog {
private StreamInteractor stream_interactor;
public AddConferenceDialog(StreamInteractor stream_interactor) {
- Object(use_header_bar : Util.use_csd() ? 1 : 0);
+ Object(use_header_bar : 1);
this.title = _("Join Channel");
this.modal = true;
this.default_width = 460;
@@ -39,36 +39,30 @@ public class AddConferenceDialog : Gtk.Dialog {
}
private void show_jid_add_view() {
- // Rewire headerbar (if CSD)
- if (Util.use_csd()) {
- cancel_button.set_label(_("Cancel"));
- cancel_button.clicked.disconnect(show_jid_add_view);
- cancel_button.clicked.connect(on_cancel);
- ok_button.label = _("Next");
- ok_button.sensitive = select_fragment.done;
- ok_button.clicked.connect(on_next_button_clicked);
- details_fragment.fragment_active = false;
- details_fragment.notify["done"].disconnect(set_ok_sensitive_from_details);
- select_fragment.notify["done"].connect(set_ok_sensitive_from_select);
- }
+ cancel_button.set_label(_("Cancel"));
+ cancel_button.clicked.disconnect(show_jid_add_view);
+ cancel_button.clicked.connect(on_cancel);
+ ok_button.label = _("Next");
+ ok_button.sensitive = select_fragment.done;
+ ok_button.clicked.connect(on_next_button_clicked);
+ details_fragment.fragment_active = false;
+ details_fragment.notify["done"].disconnect(set_ok_sensitive_from_details);
+ select_fragment.notify["done"].connect(set_ok_sensitive_from_select);
stack.transition_type = StackTransitionType.SLIDE_RIGHT;
stack.set_visible_child_name("select");
}
private void show_conference_details_view() {
- // Rewire headerbar (if CSD)
- if (Util.use_csd()) {
- cancel_button.set_icon_name("go-previous-symbolic");
- cancel_button.clicked.disconnect(on_cancel);
- cancel_button.clicked.connect(show_jid_add_view);
- ok_button.label = _("Join");
- ok_button.sensitive = details_fragment.done;
- ok_button.clicked.disconnect(on_next_button_clicked);
- details_fragment.fragment_active = true;
- select_fragment.notify["done"].disconnect(set_ok_sensitive_from_select);
- details_fragment.notify["done"].connect(set_ok_sensitive_from_details);
- }
+ cancel_button.set_icon_name("go-previous-symbolic");
+ cancel_button.clicked.disconnect(on_cancel);
+ cancel_button.clicked.connect(show_jid_add_view);
+ ok_button.label = _("Join");
+ ok_button.sensitive = details_fragment.done;
+ ok_button.clicked.disconnect(on_next_button_clicked);
+ details_fragment.fragment_active = true;
+ select_fragment.notify["done"].disconnect(set_ok_sensitive_from_select);
+ details_fragment.notify["done"].connect(set_ok_sensitive_from_details);
stack.transition_type = StackTransitionType.SLIDE_LEFT;
stack.set_visible_child_name("details");
@@ -79,15 +73,11 @@ public class AddConferenceDialog : Gtk.Dialog {
ok_button = new Button() { can_focus=true };
ok_button.add_css_class("suggested-action");
- if (Util.use_csd()) {
- HeaderBar header_bar = get_header_bar() as HeaderBar;
- header_bar.show_title_buttons = false;
+ HeaderBar header_bar = get_header_bar() as HeaderBar;
+ header_bar.show_title_buttons = false;
- header_bar.pack_start(cancel_button);
- header_bar.pack_end(ok_button);
-
-// ok_button.has_default = true;
- }
+ header_bar.pack_start(cancel_button);
+ header_bar.pack_end(ok_button);
}
private void setup_jid_add_view() {
@@ -110,22 +100,6 @@ public class AddConferenceDialog : Gtk.Dialog {
Box wrap_box = new Box(Orientation.VERTICAL, 0);
wrap_box.append(select_fragment);
stack.add_named(wrap_box, "select");
-
- if (!Util.use_csd()) {
- Box box = new Box(Orientation.HORIZONTAL, 5) { halign=Align.END, margin_bottom=15, margin_start=80, margin_end=80 };
-
- Button ok_button = new Button.with_label(_("Next")) { sensitive=false, halign = Align.END, can_focus=true };
- ok_button.add_css_class("suggested-action");
- ok_button.clicked.connect(on_next_button_clicked);
- select_fragment.notify["done"].connect(() => { ok_button.sensitive = select_fragment.done; });
- Button cancel_button = new Button.with_label(_("Cancel")) { halign=Align.START };
- cancel_button.clicked.connect(on_cancel);
- box.append(cancel_button);
- box.append(ok_button);
- wrap_box.append(box);
-
-// ok_button.has_default = true;
- }
}
private void setup_conference_details_view() {
@@ -135,21 +109,6 @@ public class AddConferenceDialog : Gtk.Dialog {
Box wrap_box = new Box(Orientation.VERTICAL, 0);
wrap_box.append(details_fragment);
- if (!Util.use_csd()) {
- Box box = new Box(Orientation.HORIZONTAL, 5) { halign=Align.END, margin_bottom=15, margin_start=80, margin_end=80 };
-
- Button ok_button = new Button.with_label(_("Join")) { halign = Align.END, can_focus=true };
- ok_button.add_css_class("suggested-action");
- details_fragment.notify["done"].connect(() => { ok_button.sensitive = select_fragment.done; });
- details_fragment.ok_button = ok_button;
-
- Button cancel_button = new Button.with_label(_("Back")) { halign=Align.START };
- cancel_button.clicked.connect(show_jid_add_view);
- box.append(cancel_button);
- box.append(ok_button);
-
- wrap_box.append(box);
- }
stack.add_named(wrap_box, "details");
}
@@ -165,7 +124,7 @@ public class AddConferenceDialog : Gtk.Dialog {
details_fragment.clear();
ListRow? row = conference_list_box.get_selected_row() != null ? conference_list_box.get_selected_row().get_child() as ListRow : null;
- ConferenceListRow? conference_row = conference_list_box.get_selected_row() != null ? conference_list_box.get_selected_row() as ConferenceListRow : null;
+ ConferenceListRow? conference_row = conference_list_box.get_selected_row() != null ? conference_list_box.get_selected_row().get_child() as ConferenceListRow : null;
if (conference_row != null) {
details_fragment.account = conference_row.account;
details_fragment.jid = conference_row.bookmark.jid.to_string();
diff --git a/main/src/ui/add_conversation/conference_list.vala b/main/src/ui/add_conversation/conference_list.vala
index 0b630ae4..bf6191fa 100644
--- a/main/src/ui/add_conversation/conference_list.vala
+++ b/main/src/ui/add_conversation/conference_list.vala
@@ -103,6 +103,7 @@ internal class ConferenceListRow : ListRow {
this.account = account;
this.bookmark = bookmark;
+ status_dot.visible = false;
name_label.label = bookmark.name != null && bookmark.name != "" ? bookmark.name : bookmark.jid.to_string();
if (stream_interactor.get_accounts().size > 1) {
via_label.label = "via " + account.bare_jid.to_string();
diff --git a/main/src/ui/add_conversation/list_row.vala b/main/src/ui/add_conversation/list_row.vala
index c5e344d0..c489aa13 100644
--- a/main/src/ui/add_conversation/list_row.vala
+++ b/main/src/ui/add_conversation/list_row.vala
@@ -8,28 +8,54 @@ 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");
via_label = (Label) builder.get_object("via_label");
+
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;
+
+ Gee.List<Jid>? full_jids = stream_interactor.get_module(PresenceManager.IDENTITY).get_full_jids(jid, account);
+ 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");
+ }
+ }
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;
@@ -46,10 +72,27 @@ public class ListRow : Widget {
}
name_label.label = display_name;
picture.model = new ViewModel.CompatAvatarPictureModel(stream_interactor).set_conversation(conv);
+
+ 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);
+ }
}
}
diff --git a/main/src/ui/add_conversation/roster_list.vala b/main/src/ui/add_conversation/roster_list.vala
index bb338ce5..080d7f93 100644
--- a/main/src/ui/add_conversation/roster_list.vala
+++ b/main/src/ui/add_conversation/roster_list.vala
@@ -20,14 +20,14 @@ protected class RosterList {
this.stream_interactor = stream_interactor;
this.accounts = accounts;
- handler_ids += stream_interactor.get_module(RosterManager.IDENTITY).removed_roster_item.connect( (account, jid, roster_item) => {
+ handler_ids += stream_interactor.get_module(RosterManager.IDENTITY).removed_roster_item.connect( (account, jid) => {
if (accounts.contains(account)) {
- on_removed_roster_item(account, jid, roster_item);
+ remove_row(account, jid);
}
});
- handler_ids += stream_interactor.get_module(RosterManager.IDENTITY).updated_roster_item.connect( (account, jid, roster_item) => {
+ handler_ids += stream_interactor.get_module(RosterManager.IDENTITY).updated_roster_item.connect( (account, jid) => {
if (accounts.contains(account)) {
- on_updated_roster_item(account, jid, roster_item);
+ update_row(account, jid);
}
});
list_box.destroy.connect(() => {
@@ -37,16 +37,16 @@ protected class RosterList {
foreach (Account a in accounts) fetch_roster_items(a);
}
- private void on_removed_roster_item(Account account, Jid jid, Roster.Item roster_item) {
+ private void remove_row(Account account, Jid jid) {
if (rows.has_key(account) && rows[account].has_key(jid)) {
list_box.remove(rows[account][jid]);
rows[account].unset(jid);
}
}
- private void on_updated_roster_item(Account account, Jid jid, Roster.Item roster_item) {
- on_removed_roster_item(account, jid, roster_item);
- ListRow row = new ListRow.from_jid(stream_interactor, roster_item.jid, account, accounts.size > 1);
+ private void update_row(Account account, Jid jid) {
+ remove_row(account, jid);
+ ListRow row = new ListRow.from_jid(stream_interactor, jid, account, accounts.size > 1);
ListBoxRow list_box_row = new ListBoxRow() { child=row };
rows[account][jid] = list_box_row;
list_box.append(list_box_row);
@@ -57,7 +57,7 @@ protected class RosterList {
private void fetch_roster_items(Account account) {
rows[account] = new HashMap<Jid, ListBoxRow>(Jid.hash_func, Jid.equals_func);
foreach (Roster.Item roster_item in stream_interactor.get_module(RosterManager.IDENTITY).get_roster(account)) {
- on_updated_roster_item(account, roster_item.jid, roster_item);
+ update_row(account, roster_item.jid);
}
}
diff --git a/main/src/ui/add_conversation/select_contact_dialog.vala b/main/src/ui/add_conversation/select_contact_dialog.vala
index fb69257e..c0e5140a 100644
--- a/main/src/ui/add_conversation/select_contact_dialog.vala
+++ b/main/src/ui/add_conversation/select_contact_dialog.vala
@@ -20,7 +20,7 @@ public class SelectContactDialog : Gtk.Dialog {
private Gee.List<Account> accounts;
public SelectContactDialog(StreamInteractor stream_interactor, Gee.List<Account> accounts) {
- Object(use_header_bar : Util.use_csd() ? 1 : 0);
+ Object(use_header_bar : 1);
modal = true;
this.default_width = 460;
this.default_height = 550;
@@ -46,22 +46,10 @@ public class SelectContactDialog : Gtk.Dialog {
ok_button.sensitive = false;
ok_button.visible = true;
- if (Util.use_csd()) {
- HeaderBar header_bar = get_header_bar() as HeaderBar;
- header_bar.show_title_buttons = false;
-
- header_bar.pack_start(cancel_button);
- header_bar.pack_end(ok_button);
- } else {
- Box box = new Box(Orientation.HORIZONTAL, 5) { halign=Align.END, margin_bottom=15, margin_start=80, margin_end=80 };
-
- cancel_button.halign = Align.START;
- ok_button.halign = Align.END;
- box.append(cancel_button);
- box.append(ok_button);
-
- get_content_area().append(box);
- }
+ HeaderBar header_bar = get_header_bar() as HeaderBar;
+ header_bar.show_title_buttons = false;
+ header_bar.pack_start(cancel_button);
+ header_bar.pack_end(ok_button);
cancel_button.clicked.connect(() => { close(); });
ok_button.clicked.connect(() => {