From e63d59eb3450471b33a22efda6df8871818209b1 Mon Sep 17 00:00:00 2001 From: fiaxh Date: Sun, 11 Jun 2017 13:59:24 +0200 Subject: Muc Invite + Kick --- main/src/ui/occupant_menu/list.vala | 26 ++++++++--- main/src/ui/occupant_menu/list_row.vala | 9 ++-- main/src/ui/occupant_menu/view.vala | 76 ++++++++++++++++++++++++--------- 3 files changed, 79 insertions(+), 32 deletions(-) (limited to 'main/src/ui/occupant_menu') diff --git a/main/src/ui/occupant_menu/list.vala b/main/src/ui/occupant_menu/list.vala index ff30b180..50e6b300 100644 --- a/main/src/ui/occupant_menu/list.vala +++ b/main/src/ui/occupant_menu/list.vala @@ -35,7 +35,7 @@ public class List : Box { public void initialize_for_conversation(Conversation conversation) { this.conversation = conversation; - ArrayList? occupants = stream_interactor.get_module(MucManager.IDENTITY).get_occupants(conversation.counterpart, conversation.account); + Gee.List? occupants = stream_interactor.get_module(MucManager.IDENTITY).get_occupants(conversation.counterpart, conversation.account); if (occupants != null) { foreach (Jid occupant in occupants) { add_occupant(occupant); @@ -110,12 +110,24 @@ public class List : Box { default: aff_str = _("User"); break; } - Box box = new Box(Orientation.VERTICAL, 0) { visible=true }; - Label label = new Label("") { margin_left=10, margin_top=top?5:15, xalign=0, visible=true }; - label.set_markup(@"$(Markup.escape_text(aff_str))"); - box.add(label); - box.add(new Separator(Orientation.HORIZONTAL) { visible=true }); - return box; + + int count = 0; + foreach (ListRow row in rows.values) { + Xmpp.Xep.Muc.Affiliation aff = stream_interactor.get_module(MucManager.IDENTITY).get_affiliation(conversation.counterpart, row.jid, conversation.account); + if (aff == affiliation) count++; + } + + Label title_label = new Label("") { margin_left=10, xalign=0, visible=true }; + title_label.set_markup(@"$(Markup.escape_text(aff_str))"); + + Label count_label = new Label(@"$count") { xalign=0, margin_right=7, expand=true, visible=true }; + count_label.get_style_context().add_class("dim-label"); + + Grid grid = new Grid() { margin_top=top?5:15, column_spacing=5, hexpand=true, visible=true }; + grid.attach(title_label, 0, 0, 1, 1); + grid.attach(count_label, 1, 0, 1, 1); + grid.attach(new Separator(Orientation.HORIZONTAL) { expand=true, visible=true }, 0, 1, 2, 1); + return grid; } private bool filter(ListBoxRow r) { diff --git a/main/src/ui/occupant_menu/list_row.vala b/main/src/ui/occupant_menu/list_row.vala index b8b95758..f5776b4b 100644 --- a/main/src/ui/occupant_menu/list_row.vala +++ b/main/src/ui/occupant_menu/list_row.vala @@ -11,8 +11,8 @@ public class ListRow : ListBoxRow { [GtkChild] private Image image; [GtkChild] public Label name_label; - public Account account; - public Jid jid; + public Account? account; + public Jid? jid; public ListRow(StreamInteractor stream_interactor, Account account, Jid jid) { this.account = account; @@ -22,8 +22,9 @@ public class ListRow : ListBoxRow { Util.image_set_from_scaled_pixbuf(image, (new AvatarGenerator(30, 30, image.scale_factor)).draw_jid(stream_interactor, jid, account)); } - public void on_presence_received(Presence.Stanza presence) { - + public ListRow.label(string c, string text) { + name_label.label = text; + image.set_from_pixbuf((new AvatarGenerator(30, 30, 1)).set_greyscale(true).draw_text(c)); // why 1 } } diff --git a/main/src/ui/occupant_menu/view.vala b/main/src/ui/occupant_menu/view.vala index b6b25961..7918fe46 100644 --- a/main/src/ui/occupant_menu/view.vala +++ b/main/src/ui/occupant_menu/view.vala @@ -1,3 +1,4 @@ +using Gee; using Gtk; using Dino.Entities; @@ -10,22 +11,40 @@ public class View : Popover { private Stack stack = new Stack() { vhomogeneous=false, visible=true }; private List list; - private Label header_label = new Label("") { xalign=0.5f, hexpand=true, visible=true }; + private ListBox invite_list; - public View(StreamInteractor stream_interactor, Conversation conversation) { + public View(StreamInteractor stream_interactor, Window window, Conversation conversation) { this.stream_interactor = stream_interactor; this.conversation = conversation; + Box list_box = new Box(Orientation.VERTICAL, 1) { visible=true }; list = new List(stream_interactor, conversation) { visible=true }; - stack.add_named(list, "list"); - setup_menu(); + list_box.add(list); + + invite_list = new ListBox() { visible=true }; + invite_list.add(new ListRow.label("+", _("Invite")) {visible=true}); + list_box.add(invite_list); + invite_list.row_activated.connect((row) => { + hide(); + Gee.List acc_list = new ArrayList(Account.equals_func); + acc_list.add(conversation.account); + AddConversation.Chat.Dialog add_chat_dialog = new AddConversation.Chat.Dialog(stream_interactor, acc_list); + add_chat_dialog.set_transient_for(window); + add_chat_dialog.title = _("Invite to Conference"); + add_chat_dialog.ok_button.label = _("Invite"); + add_chat_dialog.selected.connect((account, jid) => { + stream_interactor.get_module(MucManager.IDENTITY).invite(conversation.account, conversation.counterpart, jid); + }); + add_chat_dialog.present(); + }); + + stack.add_named(list_box, "list"); add(stack); stack.visible_child_name = "list"; list.list_box.row_activated.connect((row) => { ListRow list_row = row as ListRow; - header_label.label = list_row.name_label.label; - show_menu(); + show_menu(list_row.jid, list_row.name_label.label); }); hide.connect(reset); @@ -35,35 +54,43 @@ public class View : Popover { stack.transition_type = StackTransitionType.NONE; stack.visible_child_name = "list"; list.list_box.unselect_all(); + invite_list.unselect_all(); + } + + private void show_list() { + list.list_box.unselect_all(); + stack.transition_type = StackTransitionType.SLIDE_RIGHT; + stack.visible_child_name = "list"; } - private void setup_menu() { + private void show_menu(Jid jid, string name_label) { + stack.transition_type = StackTransitionType.SLIDE_LEFT; + Box header_box = new Box(Orientation.HORIZONTAL, 5) { visible=true }; header_box.add(new Image.from_icon_name("pan-start-symbolic", IconSize.SMALL_TOOLBAR) { visible=true }); - header_box.add(header_label); + header_box.add(new Label(name_label) { xalign=0.5f, hexpand=true, visible=true }); Button header_button = new Button() { relief=ReliefStyle.NONE, visible=true }; header_button.add(header_box); - ModelButton private_button = new ModelButton() { active=true, text=_("Start private conversation"), visible=true }; - Box outer_box = new Box(Orientation.VERTICAL, 5) { margin=10, visible=true }; outer_box.add(header_button); - outer_box.add(private_button); - stack.add_named(outer_box, "menu"); - header_button.clicked.connect(show_list); + + ModelButton private_button = new ModelButton() { active=true, text=_("Start private conversation"), visible=true }; + outer_box.add(private_button); private_button.clicked.connect(private_conversation_button_clicked); - } - private void show_list() { - list.list_box.unselect_all(); - stack.transition_type = StackTransitionType.SLIDE_RIGHT; - stack.visible_child_name = "list"; - } + Jid? own_jid = stream_interactor.get_module(MucManager.IDENTITY).get_own_jid(conversation.counterpart, conversation.account); + Xmpp.Xep.Muc.Role? role = stream_interactor.get_module(MucManager.IDENTITY).get_role(own_jid, conversation.account); - private void show_menu() { - stack.transition_type = StackTransitionType.SLIDE_LEFT; + if (role == Xmpp.Xep.Muc.Role.MODERATOR && stream_interactor.get_module(MucManager.IDENTITY).kick_possible(conversation.account, jid)) { + ModelButton kick_button = new ModelButton() { active=true, text=_("Kick"), visible=true }; + outer_box.add(kick_button); + kick_button.clicked.connect(kick_button_clicked); + } + + stack.add_named(outer_box, "menu"); stack.visible_child_name = "menu"; } @@ -74,6 +101,13 @@ public class View : Popover { Conversation conversation = stream_interactor.get_module(ConversationManager.IDENTITY).create_conversation(list_row.jid, list_row.account, Conversation.Type.GROUPCHAT_PM); stream_interactor.get_module(ConversationManager.IDENTITY).start_conversation(conversation, true); } + + private void kick_button_clicked() { + ListRow? list_row = list.list_box.get_selected_row() as ListRow; + if (list_row == null) return; + + stream_interactor.get_module(MucManager.IDENTITY).kick(conversation.account, conversation.counterpart, list_row.jid.resourcepart); + } } } \ No newline at end of file -- cgit v1.2.3-70-g09d2