7624f349de
fixes #661
207 lines
8.2 KiB
Vala
207 lines
8.2 KiB
Vala
using Gee;
|
|
using Gtk;
|
|
|
|
using Dino.Entities;
|
|
using Xmpp;
|
|
using Xmpp.Xep;
|
|
|
|
namespace Dino.Ui {
|
|
|
|
public class AddConferenceDialog : Gtk.Dialog {
|
|
|
|
public signal void conversation_opened(Conversation conversation);
|
|
|
|
private Stack stack = new Stack();
|
|
private Button cancel_button;
|
|
private Button ok_button;
|
|
private Label cancel_label = new Label(_("Cancel")) {visible=true};
|
|
private Image cancel_image = new Image.from_icon_name("go-previous-symbolic", IconSize.MENU) {visible=true};
|
|
|
|
private SelectJidFragment select_fragment;
|
|
private ConferenceDetailsFragment details_fragment;
|
|
private ConferenceList conference_list;
|
|
|
|
private StreamInteractor stream_interactor;
|
|
|
|
public AddConferenceDialog(StreamInteractor stream_interactor) {
|
|
Object(use_header_bar : Util.use_csd() ? 1 : 0);
|
|
this.title = _("Join Channel");
|
|
this.modal = true;
|
|
this.stream_interactor = stream_interactor;
|
|
|
|
stack.visible = true;
|
|
stack.vhomogeneous = false;
|
|
get_content_area().add(stack);
|
|
|
|
setup_headerbar();
|
|
setup_jid_add_view();
|
|
setup_conference_details_view();
|
|
show_jid_add_view();
|
|
}
|
|
|
|
private void show_jid_add_view() {
|
|
// Rewire headerbar (if CSD)
|
|
if (Util.use_csd()) {
|
|
if (cancel_image.get_parent() != null) cancel_button.remove(cancel_image);
|
|
cancel_button.add(cancel_label);
|
|
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()) {
|
|
if (cancel_label.get_parent() != null) cancel_button.remove(cancel_label);
|
|
cancel_button.add(cancel_image);
|
|
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");
|
|
animate_window_resize();
|
|
}
|
|
|
|
private void setup_headerbar() {
|
|
cancel_button = new Button() { visible=true };
|
|
|
|
ok_button = new Button() { can_focus=true, can_default=true, visible=true };
|
|
ok_button.get_style_context().add_class("suggested-action");
|
|
|
|
if (Util.use_csd()) {
|
|
HeaderBar header_bar = get_header_bar() as HeaderBar;
|
|
header_bar.show_close_button = false;
|
|
|
|
header_bar.pack_start(cancel_button);
|
|
header_bar.pack_end(ok_button);
|
|
|
|
ok_button.has_default = true;
|
|
}
|
|
}
|
|
|
|
private void setup_jid_add_view() {
|
|
conference_list = new ConferenceList(stream_interactor);
|
|
conference_list.row_activated.connect(() => { ok_button.clicked(); });
|
|
|
|
select_fragment = new SelectJidFragment(stream_interactor, conference_list, stream_interactor.get_accounts());
|
|
select_fragment.add_jid.connect((row) => {
|
|
AddGroupchatDialog dialog = new AddGroupchatDialog(stream_interactor);
|
|
dialog.set_transient_for(this);
|
|
dialog.present();
|
|
});
|
|
select_fragment.remove_jid.connect((row) => {
|
|
ConferenceListRow conference_row = row as ConferenceListRow;
|
|
stream_interactor.get_module(MucManager.IDENTITY).remove_bookmark(conference_row.account, conference_row.bookmark);
|
|
});
|
|
|
|
Box wrap_box = new Box(Orientation.VERTICAL, 0) { visible=true };
|
|
wrap_box.add(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, visible=true };
|
|
|
|
Button ok_button = new Button() { label=_("Next"), sensitive=false, halign = Align.END, can_focus=true, can_default=true, visible=true };
|
|
ok_button.get_style_context().add_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() { label=_("Cancel"), halign=Align.START, visible=true };
|
|
cancel_button.clicked.connect(on_cancel);
|
|
box.add(cancel_button);
|
|
box.add(ok_button);
|
|
wrap_box.add(box);
|
|
|
|
ok_button.has_default = true;
|
|
}
|
|
}
|
|
|
|
private void setup_conference_details_view() {
|
|
details_fragment = new ConferenceDetailsFragment(stream_interactor) { ok_button=ok_button };
|
|
details_fragment.joined.connect(() => this.close());
|
|
|
|
Box wrap_box = new Box(Orientation.VERTICAL, 0) { visible=true };
|
|
wrap_box.add(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, visible=true };
|
|
|
|
Button ok_button = new Button() { label=_("Join"), halign = Align.END, can_focus=true, can_default=true, visible=true };
|
|
ok_button.get_style_context().add_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() { label=_("Back"), halign=Align.START, visible=true };
|
|
cancel_button.clicked.connect(show_jid_add_view);
|
|
box.add(cancel_button);
|
|
box.add(ok_button);
|
|
|
|
wrap_box.add(box);
|
|
}
|
|
stack.add_named(wrap_box, "details");
|
|
}
|
|
|
|
private void set_ok_sensitive_from_select() {
|
|
ok_button.sensitive = select_fragment.done;
|
|
}
|
|
|
|
private void set_ok_sensitive_from_details() {
|
|
ok_button.sensitive = select_fragment.done;
|
|
}
|
|
|
|
private void on_next_button_clicked() {
|
|
details_fragment.clear();
|
|
ListRow? row = conference_list.get_selected_row() as ListRow;
|
|
ConferenceListRow? conference_row = conference_list.get_selected_row() as ConferenceListRow;
|
|
if (conference_row != null) {
|
|
details_fragment.account = conference_row.account;
|
|
details_fragment.jid = conference_row.bookmark.jid.to_string();
|
|
details_fragment.nick = conference_row.bookmark.nick;
|
|
if (conference_row.bookmark.password != null) details_fragment.password = conference_row.bookmark.password;
|
|
ok_button.grab_focus();
|
|
} else if (row != null) {
|
|
details_fragment.account = row.account;
|
|
details_fragment.jid = row.jid.to_string();
|
|
}
|
|
show_conference_details_view();
|
|
}
|
|
|
|
private void on_cancel() {
|
|
close();
|
|
}
|
|
|
|
private void animate_window_resize() {
|
|
int def_height, curr_width, curr_height;
|
|
get_size(out curr_width, out curr_height);
|
|
stack.get_preferred_height(null, out def_height);
|
|
int difference = def_height - curr_height;
|
|
Timer timer = new Timer();
|
|
Timeout.add((int) (stack.transition_duration / 30),
|
|
() => {
|
|
ulong microsec;
|
|
timer.elapsed(out microsec);
|
|
ulong millisec = microsec / 1000;
|
|
double partial = double.min(1, (double) millisec / stack.transition_duration);
|
|
resize(curr_width, (int) (curr_height + difference * partial));
|
|
return millisec < stack.transition_duration;
|
|
});
|
|
}
|
|
}
|
|
|
|
}
|