Fix crashes and warning in Join Conference dialog

fixes #1262
This commit is contained in:
fiaxh 2022-08-22 13:08:31 +02:00
parent 14bc3d6717
commit 117f193812
2 changed files with 25 additions and 7 deletions

View file

@ -15,12 +15,14 @@ protected class ConferenceList {
private ListBox list_box = new ListBox(); private ListBox list_box = new ListBox();
private HashMap<Account, Set<Conference>> lists = new HashMap<Account, Set<Conference>>(Account.hash_func, Account.equals_func); private HashMap<Account, Set<Conference>> lists = new HashMap<Account, Set<Conference>>(Account.hash_func, Account.equals_func);
private HashMap<Account, HashMap<Jid, Widget>> widgets = new HashMap<Account, HashMap<Jid, Widget>>(Account.hash_func, Account.equals_func); private HashMap<Account, HashMap<Jid, ListBoxRow>> widgets = new HashMap<Account, HashMap<Jid, ListBoxRow>>(Account.hash_func, Account.equals_func);
ulong bookmarks_updated_handler_id = -1;
public ConferenceList(StreamInteractor stream_interactor) { public ConferenceList(StreamInteractor stream_interactor) {
this.stream_interactor = stream_interactor; this.stream_interactor = stream_interactor;
stream_interactor.get_module(MucManager.IDENTITY).bookmarks_updated.connect((account, conferences) => { bookmarks_updated_handler_id = stream_interactor.get_module(MucManager.IDENTITY).bookmarks_updated.connect((account, conferences) => {
lists[account] = conferences; lists[account] = conferences;
refresh_conferences(); refresh_conferences();
}); });
@ -36,13 +38,21 @@ protected class ConferenceList {
stream_interactor.get_module(MucManager.IDENTITY).conference_removed.connect(remove_conference); stream_interactor.get_module(MucManager.IDENTITY).conference_removed.connect(remove_conference);
} }
~ConferenceList() {
stream_interactor.get_module(MucManager.IDENTITY).disconnect(bookmarks_updated_handler_id);
stream_interactor.get_module(MucManager.IDENTITY).conference_added.disconnect(add_conference);
stream_interactor.get_module(MucManager.IDENTITY).conference_removed.disconnect(remove_conference);
}
private void add_conference(Account account, Conference conference) { private void add_conference(Account account, Conference conference) {
if (!widgets.has_key(account)) { if (!widgets.has_key(account)) {
widgets[account] = new HashMap<Jid, Widget>(Jid.hash_func, Jid.equals_func); widgets[account] = new HashMap<Jid, ListBoxRow>(Jid.hash_func, Jid.equals_func);
} }
var widget = new ConferenceListRow(stream_interactor, conference, account); var widget = new ConferenceListRow(stream_interactor, conference, account);
widgets[account][conference.jid] = widget; var list_box_row = new ListBoxRow();
list_box.append(widget); list_box_row.set_child(widget);
widgets[account][conference.jid] = list_box_row;
list_box.append(list_box_row);
} }
private void remove_conference(Account account, Jid jid) { private void remove_conference(Account account, Jid jid) {
@ -54,7 +64,11 @@ protected class ConferenceList {
public void refresh_conferences() { public void refresh_conferences() {
foreach (Account account in widgets.keys) { foreach (Account account in widgets.keys) {
foreach (Jid jid in widgets[account].keys) {
var account_widgets_cpy = new HashMap<Jid, ListBoxRow>();
account_widgets_cpy.set_all(widgets[account]);
foreach (Jid jid in account_widgets_cpy.keys) {
remove_conference(account, jid); remove_conference(account, jid);
} }
} }

View file

@ -44,7 +44,11 @@ public class SelectJidFragment : Gtk.Box {
list.row_selected.connect(() => { done = true; }); // just for notifying list.row_selected.connect(() => { done = true; }); // just for notifying
entry.changed.connect(() => { set_filter(entry.text); }); entry.changed.connect(() => { set_filter(entry.text); });
add_button.clicked.connect(() => { add_jid(); }); add_button.clicked.connect(() => { add_jid(); });
remove_button.clicked.connect(() => { remove_jid(list.get_selected_row() as ListRow); }); remove_button.clicked.connect(() => {
var list_row = list.get_selected_row();
if (list_row == null) return;
remove_jid(list_row.child as ListRow);
});
} }
public void set_filter(string str) { public void set_filter(string str) {