diff options
Diffstat (limited to 'main/src/ui/add_conversation')
-rw-r--r-- | main/src/ui/add_conversation/add_conference_dialog.vala | 89 | ||||
-rw-r--r-- | main/src/ui/add_conversation/conference_list.vala | 1 | ||||
-rw-r--r-- | main/src/ui/add_conversation/list_row.vala | 57 | ||||
-rw-r--r-- | main/src/ui/add_conversation/roster_list.vala | 18 | ||||
-rw-r--r-- | main/src/ui/add_conversation/select_contact_dialog.vala | 22 |
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(() => { |