1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
using Dino.Entities;
using Xmpp;
using Xmpp.Xep;
using Gee;
public class Dino.Ui.ViewModel.PreferencesWindow : Object {
public signal void update();
public HashMap<Account, AccountDetails> account_details = new HashMap<Account, AccountDetails>(Account.hash_func, Account.equals_func);
public AccountDetails selected_account { get; set; }
public Gtk.SingleSelection active_accounts_selection { get; default=new Gtk.SingleSelection(new GLib.ListStore(typeof(ViewModel.AccountDetails))); }
public StreamInteractor stream_interactor;
public Database db;
public GeneralPreferencesPage general_page { get; set; default=new GeneralPreferencesPage(); }
public void populate(Database db, StreamInteractor stream_interactor) {
this.db = db;
this.stream_interactor = stream_interactor;
stream_interactor.connection_manager.connection_error.connect((account, error) => {
var account_detail = account_details[account];
if (account_details != null) {
account_detail.connection_error = error;
}
});
stream_interactor.connection_manager.connection_state_changed.connect((account, state) => {
var account_detail = account_details[account];
if (account_details != null) {
account_detail.connection_state = state;
account_detail.connection_error = stream_interactor.connection_manager.get_error(account);
}
});
stream_interactor.account_added.connect(update_data);
stream_interactor.account_removed.connect(update_data);
bind_general_page();
update_data();
}
private void update_data() {
// account_details should hold the correct set of accounts (add or remove some if needed), but do not override remaining ones (would destroy bindings)
var current_accounts = db.get_accounts();
var remove_accounts = new ArrayList<Account>();
foreach (var account in account_details.keys) {
if (!current_accounts.contains(account)) remove_accounts.add(account);
}
foreach (var account in remove_accounts) {
account_details.unset(account);
}
foreach (var account in current_accounts) {
if (!account_details.has_key(account)) {
account_details[account] = new AccountDetails(account, stream_interactor);
}
if (selected_account == null && account.enabled) selected_account = account_details[account];
}
// Update account picker model with currently active accounts
var list_model = (GLib.ListStore) active_accounts_selection.model;
list_model.remove_all();
foreach (var account in stream_interactor.get_accounts()) {
list_model.append(new ViewModel.AccountDetails(account, stream_interactor));
}
update();
}
public void set_avatar_uri(Account account, string uri) {
stream_interactor.get_module(AvatarManager.IDENTITY).publish(account, uri);
}
public void remove_avatar(Account account) {
stream_interactor.get_module(AvatarManager.IDENTITY).unset_avatar(account);
}
public void remove_account(Account account) {
stream_interactor.disconnect_account.begin(account, () => {
account.remove();
update_data();
});
}
public void reconnect_account(Account account) {
stream_interactor.disconnect_account.begin(account, () => {
stream_interactor.connect_account(account);
});
}
public void enable_disable_account(Account account) {
if (account.enabled) {
account.enabled = false;
stream_interactor.disconnect_account.begin(account);
} else {
account.enabled = true;
stream_interactor.connect_account(account);
}
update_data();
}
public ChangePasswordDialog get_change_password_dialog_model() {
return new ChangePasswordDialog() {
account = selected_account.account,
stream_interactor = stream_interactor
};
}
private void bind_general_page() {
var settings = Dino.Application.get_default().settings;
settings.bind_property("send-typing", general_page, "send-typing", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
settings.bind_property("send-marker", general_page, "send-marker", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
settings.bind_property("notifications", general_page, "notifications", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
settings.bind_property("convert-utf8-smileys", general_page, "convert-emojis", BindingFlags.SYNC_CREATE | BindingFlags.BIDIRECTIONAL);
}
}
public class Dino.Ui.ViewModel.ChangePasswordDialog : Object {
public Entities.Account account { get; set; }
public StreamInteractor stream_interactor { get; set; }
public async string? change_password(string new_password) {
var res = yield stream_interactor.get_module(Register.IDENTITY).change_password(account, new_password);
if (res == null) {
account.password = new_password;
}
return res;
}
}
|