aboutsummaryrefslogtreecommitdiff
path: root/main/src/ui/call_window/call_window_controller.vala
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/ui/call_window/call_window_controller.vala')
-rw-r--r--main/src/ui/call_window/call_window_controller.vala41
1 files changed, 23 insertions, 18 deletions
diff --git a/main/src/ui/call_window/call_window_controller.vala b/main/src/ui/call_window/call_window_controller.vala
index e482e3aa..445f88ea 100644
--- a/main/src/ui/call_window/call_window_controller.vala
+++ b/main/src/ui/call_window/call_window_controller.vala
@@ -16,12 +16,12 @@ public class Dino.Ui.CallWindowController : Object {
private HashMap<string, Plugins.VideoCallWidget> participant_videos = new HashMap<string, Plugins.VideoCallWidget>();
private HashMap<string, ParticipantWidget> participant_widgets = new HashMap<string, ParticipantWidget>();
private HashMap<string, PeerState> peer_states = new HashMap<string, PeerState>();
+ private HashMap<string, ulong> invite_handler_ids = new HashMap<string, ulong>();
private int window_height = -1;
private int window_width = -1;
private bool window_size_changed = false;
private ulong[] call_window_handler_ids = new ulong[0];
private ulong[] bottom_bar_handler_ids = new ulong[0];
- private ulong[] invite_handler_ids = new ulong[0];
public CallWindowController(CallWindow call_window, CallState call_state, StreamInteractor stream_interactor) {
this.call_window = call_window;
@@ -93,18 +93,6 @@ public class Dino.Ui.CallWindowController : Object {
call_window_handler_ids += call_window.realize.connect(() => {
capture_window_size();
});
- invite_handler_ids += call_window.invite_button.clicked.connect(() => {
- Gee.List<Account> acc_list = new ArrayList<Account>(Account.equals_func);
- acc_list.add(call.account);
- SelectContactDialog add_chat_dialog = new SelectContactDialog(stream_interactor, acc_list);
- add_chat_dialog.set_transient_for((Window) call_window.get_toplevel());
- add_chat_dialog.title = _("Invite to Call");
- add_chat_dialog.ok_button.label = _("Invite");
- add_chat_dialog.selected.connect((account, jid) => {
- call_state.invite_to_call.begin(jid);
- });
- add_chat_dialog.present();
- });
calls.conference_info_received.connect((call, conference_info) => {
if (!this.call.equals(call)) return;
@@ -129,6 +117,19 @@ public class Dino.Ui.CallWindowController : Object {
update_own_video();
}
+ private void invite_button_clicked() {
+ Gee.List<Account> acc_list = new ArrayList<Account>(Account.equals_func);
+ acc_list.add(call.account);
+ SelectContactDialog add_chat_dialog = new SelectContactDialog(stream_interactor, acc_list);
+ add_chat_dialog.set_transient_for((Window) call_window.get_toplevel());
+ add_chat_dialog.title = _("Invite to Call");
+ add_chat_dialog.ok_button.label = _("Invite");
+ add_chat_dialog.selected.connect((account, jid) => {
+ call_state.invite_to_call.begin(jid);
+ });
+ add_chat_dialog.present();
+ }
+
private void connect_peer_signals(PeerState peer_state) {
string peer_id = peer_state.internal_id;
Jid peer_jid = peer_state.jid;
@@ -149,7 +150,7 @@ public class Dino.Ui.CallWindowController : Object {
call_state.can_convert_into_groupcall.begin((_, res) => {
bool can_convert = call_state.can_convert_into_groupcall.end(res);
- call_window.invite_button_revealer.visible = can_convert;
+ participant_widgets.values.@foreach((widget) => widget.may_show_invite_button = true);
});
call_plugin.devices_changed.connect((media, incoming) => {
@@ -160,7 +161,7 @@ public class Dino.Ui.CallWindowController : Object {
update_audio_device_choices();
update_video_device_choices();
} else if (participant_widgets.size >= 1) {
- call_window.invite_button_revealer.visible = true;
+ participant_widgets.values.@foreach((widget) => widget.may_show_invite_button = true);
}
});
peer_state.counterpart_sends_video_updated.connect((mute) => {
@@ -215,7 +216,8 @@ public class Dino.Ui.CallWindowController : Object {
string participant_name = conversation != null ? Util.get_conversation_display_name(stream_interactor, conversation) : jid.bare_jid.to_string();
ParticipantWidget participant_widget = new ParticipantWidget(participant_name);
- participant_widget.menu_button.clicked.connect((event) => {
+ participant_widget.may_show_invite_button = !participant_widgets.is_empty;
+ participant_widget.debug_information_clicked.connect(() => {
var conn_details_window = new CallConnectionDetailsWindow() { title=participant_name, visible=true };
conn_details_window.update_content(peer_states[participant_id].get_info());
uint timeout_handle_id = Timeout.add_seconds(1, () => {
@@ -227,6 +229,7 @@ public class Dino.Ui.CallWindowController : Object {
conn_details_window.present();
this.call_window.destroy.connect(() => conn_details_window.close() );
});
+ invite_handler_ids[participant_id] += participant_widget.invite_button_clicked.connect(() => invite_button_clicked());
participant_widgets[participant_id] = participant_widget;
call_window.add_participant(participant_id, participant_widget);
@@ -256,7 +259,9 @@ public class Dino.Ui.CallWindowController : Object {
if (peer_states.has_key(participant_id)) debug(@"[%s] Call window controller | Remove participant: %s", call.account.bare_jid.to_string(), peer_states[participant_id].jid.to_string());
participant_videos.unset(participant_id);
+ participant_widgets[participant_id].disconnect(invite_handler_ids[participant_id]);
participant_widgets.unset(participant_id);
+ invite_handler_ids.unset(participant_id);
peer_states.unset(participant_id);
call_window.remove_participant(participant_id);
}
@@ -337,9 +342,9 @@ public class Dino.Ui.CallWindowController : Object {
public override void dispose() {
foreach (ulong handler_id in call_window_handler_ids) call_window.disconnect(handler_id);
foreach (ulong handler_id in bottom_bar_handler_ids) call_window.bottom_bar.disconnect(handler_id);
- foreach (ulong handler_id in invite_handler_ids) call_window.invite_button.disconnect(handler_id);
+ participant_widgets.keys.@foreach((peer_id) => { remove_participant(peer_id); return true; });
- call_window_handler_ids = bottom_bar_handler_ids = invite_handler_ids = new ulong[0];
+ call_window_handler_ids = bottom_bar_handler_ids = new ulong[0];
base.dispose();
}