mirror of https://github.com/TakeV-Lambda/dino.git
232 lines
8.7 KiB
Vala
232 lines
8.7 KiB
Vala
using Gdk;
|
|
using Gtk;
|
|
|
|
using Dino.Entities;
|
|
using Xmpp;
|
|
using Xmpp.Xep;
|
|
|
|
namespace Dino.Ui {
|
|
|
|
[GtkTemplate (ui = "/im/dino/Dino/add_conversation/conference_details_fragment.ui")]
|
|
protected class ConferenceDetailsFragment : Box {
|
|
|
|
public signal void joined();
|
|
|
|
public bool done { get; private set; }
|
|
|
|
public Account account {
|
|
owned get { return account_combobox.selected; }
|
|
set {
|
|
accounts_label.label = value.bare_jid.to_string();
|
|
account_combobox.selected = value;
|
|
if (nick == null && value.alias != null) {
|
|
nick = value.alias;
|
|
}
|
|
accounts_stack.set_visible_child_name("label");
|
|
}
|
|
}
|
|
public string jid {
|
|
get { return jid_entry.text; }
|
|
set {
|
|
jid_label.label = value;
|
|
jid_entry.text = value;
|
|
jid_stack.set_visible_child_name("label");
|
|
check_if_done();
|
|
}
|
|
}
|
|
public string? nick {
|
|
get { return nick_entry.text != "" ? nick_entry.text : null; }
|
|
set {
|
|
nick_label.label = value ?? "";
|
|
nick_entry.text = value ?? "";
|
|
nick_stack.set_visible_child_name("label");
|
|
check_if_done();
|
|
}
|
|
}
|
|
public string? password {
|
|
get { return password_entry.text == "" ? null : password_entry.text; }
|
|
set {
|
|
password_label.label = value;
|
|
password_entry.text = value;
|
|
nick_stack.set_visible_child_name("label");
|
|
}
|
|
}
|
|
|
|
public bool fragment_active { get; set; default=true; }
|
|
|
|
[GtkChild] private unowned Stack accounts_stack;
|
|
[GtkChild] private unowned Button accounts_button;
|
|
[GtkChild] private unowned Label accounts_label;
|
|
[GtkChild] private unowned AccountComboBox account_combobox;
|
|
|
|
[GtkChild] private unowned Stack jid_stack;
|
|
[GtkChild] private unowned Button jid_button;
|
|
[GtkChild] private unowned Label jid_label;
|
|
[GtkChild] private unowned Entry jid_entry;
|
|
|
|
[GtkChild] private unowned Stack nick_stack;
|
|
[GtkChild] private unowned Button nick_button;
|
|
[GtkChild] private unowned Label nick_label;
|
|
[GtkChild] private unowned Entry nick_entry;
|
|
|
|
[GtkChild] private unowned Stack password_stack;
|
|
[GtkChild] private unowned Button password_button;
|
|
[GtkChild] private unowned Label password_label;
|
|
[GtkChild] private unowned Label password_text_label;
|
|
[GtkChild] private unowned Entry password_entry;
|
|
|
|
[GtkChild] private unowned Revealer notification_revealer;
|
|
[GtkChild] private unowned Button notification_button;
|
|
[GtkChild] private unowned Label notification_label;
|
|
|
|
private StreamInteractor stream_interactor;
|
|
private Button ok_button_;
|
|
public Button ok_button {
|
|
get { return ok_button_; }
|
|
set {
|
|
if (value != null) {
|
|
value.clicked.connect(() => {
|
|
on_ok_button_clicked.begin();
|
|
});
|
|
|
|
ok_button_ = value;
|
|
}
|
|
}
|
|
}
|
|
|
|
public ConferenceDetailsFragment(StreamInteractor stream_interactor) {
|
|
this.stream_interactor = stream_interactor;
|
|
|
|
account_combobox.initialize(stream_interactor);
|
|
|
|
accounts_button.clicked.connect(() => { set_active_stack(accounts_stack); });
|
|
jid_button.clicked.connect(() => { set_active_stack(jid_stack); });
|
|
nick_button.clicked.connect(() => { set_active_stack(nick_stack); });
|
|
password_button.clicked.connect(() => { set_active_stack(password_stack); });
|
|
|
|
account_combobox.changed.connect(() => { accounts_label.label = account_combobox.selected.bare_jid.to_string(); });
|
|
accounts_label.label = account_combobox.selected.bare_jid.to_string();
|
|
// jid_entry.key_release_event.connect(on_jid_key_release_event);
|
|
// nick_entry.key_release_event.connect(on_nick_key_release_event);
|
|
// password_entry.key_release_event.connect(on_password_key_release_event);
|
|
|
|
jid_entry.changed.connect(() => { check_if_done(); });
|
|
nick_entry.changed.connect(() => { check_if_done(); });
|
|
|
|
check_if_done();
|
|
|
|
notification_button.clicked.connect(() => { notification_revealer.set_reveal_child(false); });
|
|
|
|
clear();
|
|
}
|
|
|
|
public void clear() {
|
|
jid = "";
|
|
nick = "";
|
|
password = "";
|
|
password_text_label.visible = false;
|
|
password_stack.visible = false;
|
|
notification_revealer.set_reveal_child(false);
|
|
reset_editable();
|
|
}
|
|
|
|
public void reset_editable() {
|
|
jid_stack.set_visible_child_name("entry");
|
|
accounts_stack.set_visible_child_name("entry");
|
|
nick_stack.set_visible_child_name("entry");
|
|
password_stack.set_visible_child_name("entry");
|
|
}
|
|
|
|
private async void on_ok_button_clicked() {
|
|
if (!fragment_active) return;
|
|
|
|
ok_button.label = _("Joining…");
|
|
ok_button.sensitive = false;
|
|
|
|
string label_text = "";
|
|
try {
|
|
Jid parsed_jid = new Jid(jid);
|
|
Muc.JoinResult? join_result = yield stream_interactor.get_module(MucManager.IDENTITY).join(account, parsed_jid, nick, password);
|
|
|
|
ok_button.label = _("Join");
|
|
ok_button.sensitive = true;
|
|
if (join_result == null || join_result.nick != null) {
|
|
Conversation conversation = stream_interactor.get_module(ConversationManager.IDENTITY).create_conversation(parsed_jid, account, Conversation.Type.GROUPCHAT);
|
|
Application app = GLib.Application.get_default() as Application;
|
|
app.controller.select_conversation(conversation);
|
|
joined();
|
|
return;
|
|
}
|
|
|
|
if (join_result.muc_error != null) {
|
|
switch (join_result.muc_error) {
|
|
case Muc.MucEnterError.PASSWORD_REQUIRED:
|
|
label_text = _("Password required to enter room");
|
|
password_text_label.visible = true;
|
|
password_stack.visible = true;
|
|
break;
|
|
case Muc.MucEnterError.BANNED:
|
|
label_text = _("Banned from joining or creating conference"); break;
|
|
case Muc.MucEnterError.ROOM_DOESNT_EXIST:
|
|
label_text = _("Room does not exist"); break;
|
|
case Muc.MucEnterError.CREATION_RESTRICTED:
|
|
label_text = _("Not allowed to create room"); break;
|
|
case Muc.MucEnterError.NOT_IN_MEMBER_LIST:
|
|
label_text = _("Members-only room"); break;
|
|
case Muc.MucEnterError.USE_RESERVED_ROOMNICK:
|
|
case Muc.MucEnterError.NICK_CONFLICT:
|
|
label_text = _("Choose a different nick"); break;
|
|
case Muc.MucEnterError.OCCUPANT_LIMIT_REACHED:
|
|
label_text = _("Too many occupants in room"); break;
|
|
}
|
|
} else if (join_result.stanza_error != null) {
|
|
label_text = _("Could not connect to %s").printf((new Jid(jid)).domainpart);
|
|
}
|
|
} catch (InvalidJidError e) {
|
|
label_text = _("Invalid address");
|
|
}
|
|
notification_label.label = label_text;
|
|
notification_revealer.set_reveal_child(true);
|
|
}
|
|
|
|
private void check_if_done() {
|
|
try {
|
|
Jid parsed_jid = new Jid(jid);
|
|
done = parsed_jid.localpart != null && parsed_jid.resourcepart == null && nick != null;
|
|
} catch (InvalidJidError e) {
|
|
done = false;
|
|
}
|
|
}
|
|
|
|
// private bool on_jid_key_release_event(EventKey event) {
|
|
// jid_label.label = jid_entry.text;
|
|
// if (event.keyval == Key.Return) jid_stack.set_visible_child_name("label");
|
|
// return false;
|
|
// }
|
|
//
|
|
// private bool on_nick_key_release_event(EventKey event) {
|
|
// nick_label.label = nick_entry.text;
|
|
// if (event.keyval == Key.Return) nick_stack.set_visible_child_name("label");
|
|
// return false;
|
|
// }
|
|
//
|
|
// private bool on_password_key_release_event(EventKey event) {
|
|
// string filler = "";
|
|
// for (int i = 0; i < password_entry.text.length; i++) filler += password_entry.get_invisible_char().to_string();
|
|
// password_label.label = filler;
|
|
// if (event.keyval == Key.Return) password_stack.set_visible_child_name("label");
|
|
// return false;
|
|
// }
|
|
|
|
private void set_active_stack(Stack stack) {
|
|
stack.set_visible_child_name("entry");
|
|
if (stack != accounts_stack) accounts_stack.set_visible_child_name("label");
|
|
if (stack != jid_stack) jid_stack.set_visible_child_name("label");
|
|
if (stack != nick_stack) nick_stack.set_visible_child_name("label");
|
|
if (stack != password_stack) password_stack.set_visible_child_name("label");
|
|
}
|
|
|
|
}
|
|
|
|
}
|