blob: ce3733e00dc12a3d15abd301b96df8375b468e3c [file] [log] [blame]
Stepan Salenikovich61cbab02015-03-16 18:35:10 -04001/*
Guillaume Roguez77c579d2018-01-30 15:54:02 -05002 * Copyright (C) 2015-2018 Savoir-faire Linux Inc.
Stepan Salenikovich61cbab02015-03-16 18:35:10 -04003 * Author: Stepan Salenikovich <stepan.salenikovich@savoirfairelinux.com>
Sébastien Blin276202f2018-05-11 09:37:34 -04004 * Author: Sebastien Blin <sebastien.blin@savoirfairelinux.com>
Stepan Salenikovich61cbab02015-03-16 18:35:10 -04005 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Stepan Salenikovich61cbab02015-03-16 18:35:10 -040019 */
20
21#include "accountgeneraltab.h"
22
23#include <gtk/gtk.h>
Stepan Salenikovicha1b8cb32015-09-11 14:58:35 -040024#include <glib/gi18n.h>
Stepan Salenikovich61cbab02015-03-16 18:35:10 -040025#include <account.h>
aviau9bbb19b2016-05-16 15:53:44 -040026#include "defines.h"
27#include "utils/models.h"
aviau2da3d9c2016-09-06 11:28:36 -040028#include "usernameregistrationbox.h"
Stepan Salenikovich61cbab02015-03-16 18:35:10 -040029
Sébastien Blin276202f2018-05-11 09:37:34 -040030#include <api/newaccountmodel.h>
31
Stepan Salenikovich61cbab02015-03-16 18:35:10 -040032struct _AccountGeneralTab
33{
34 GtkBox parent;
35};
36
37struct _AccountGeneralTabClass
38{
39 GtkBoxClass parent_class;
40};
41
42typedef struct _AccountGeneralTabPrivate AccountGeneralTabPrivate;
43
44struct _AccountGeneralTabPrivate
45{
46 Account *account;
Sébastien Blin276202f2018-05-11 09:37:34 -040047 AccountInfoPointer const *accountInfo_;
48
Stepan Salenikovich61cbab02015-03-16 18:35:10 -040049 GtkWidget *grid_account;
Sébastien Blin1e191dc2018-02-28 11:14:34 -050050 GtkWidget* frame_parameters;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -040051 GtkWidget *grid_parameters;
Stepan Salenikovichbd029582015-03-24 11:00:56 -040052
Sébastien Blinc50a8a32017-09-22 10:13:12 -040053 GtkWidget* entry_current_password;
54 GtkWidget* entry_new_password;
55 GtkWidget* entry_confirm_password;
56 GtkWidget* button_validate_password;
57 GtkWidget* label_error_change_passowrd;
58
Sébastien Blinb5da5ab2018-02-27 16:46:20 -050059 GtkWidget* button_choose_file;
60 GtkWidget* label_export_informations;
61
Stepan Salenikovichbd029582015-03-24 11:00:56 -040062 QMetaObject::Connection account_updated;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -040063};
64
65G_DEFINE_TYPE_WITH_PRIVATE(AccountGeneralTab, account_general_tab, GTK_TYPE_BOX);
66
67#define ACCOUNT_GENERAL_TAB_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), ACCOUNT_GENERAL_TAB_TYPE, AccountGeneralTabPrivate))
68
69static void
70account_general_tab_dispose(GObject *object)
71{
Stepan Salenikovichbd029582015-03-24 11:00:56 -040072 AccountGeneralTab *view = ACCOUNT_GENERAL_TAB(object);
73 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
74
75 QObject::disconnect(priv->account_updated);
76
Stepan Salenikovich61cbab02015-03-16 18:35:10 -040077 G_OBJECT_CLASS(account_general_tab_parent_class)->dispose(object);
78}
79
80static void
81account_general_tab_init(AccountGeneralTab *view)
82{
83 gtk_widget_init_template(GTK_WIDGET(view));
84}
85
86static void
87account_general_tab_class_init(AccountGeneralTabClass *klass)
88{
89 G_OBJECT_CLASS(klass)->dispose = account_general_tab_dispose;
90
91 gtk_widget_class_set_template_from_resource(GTK_WIDGET_CLASS (klass),
92 "/cx/ring/RingGnome/accountgeneraltab.ui");
93
94 gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), AccountGeneralTab, grid_account);
Sébastien Blin1e191dc2018-02-28 11:14:34 -050095 gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), AccountGeneralTab, frame_parameters);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -040096 gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), AccountGeneralTab, grid_parameters);
Sébastien Blinc50a8a32017-09-22 10:13:12 -040097
98 /* change password view */
99 gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), AccountGeneralTab, entry_current_password);
100 gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), AccountGeneralTab, entry_new_password);
101 gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), AccountGeneralTab, entry_confirm_password);
102 gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), AccountGeneralTab, button_validate_password);
103 gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), AccountGeneralTab, label_error_change_passowrd);
104
Sébastien Blinb5da5ab2018-02-27 16:46:20 -0500105 /* export account */
106 gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), AccountGeneralTab, button_choose_file);
107 gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), AccountGeneralTab, label_export_informations);
108
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400109}
110
111static void
112account_alias_changed(GtkEditable *entry, AccountGeneralTab *view)
113{
114 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
115 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
116 priv->account->setAlias(QString(gtk_editable_get_chars(entry, 0, -1)));
Stepan Salenikovich75a39172015-07-10 13:21:08 -0400117 if (priv->account->protocol() == Account::Protocol::RING)
118 priv->account->setDisplayName(gtk_entry_get_text(GTK_ENTRY(entry)));
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400119}
120
121static void
122account_hostname_changed(GtkEditable *entry, AccountGeneralTab *view)
123{
124 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
125 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
126 priv->account->setHostname(QString(gtk_editable_get_chars(entry, 0, -1)));
127}
128
129static void
130account_username_changed(GtkEditable *entry, AccountGeneralTab *view)
131{
132 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
133 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
134 priv->account->setUsername(QString(gtk_editable_get_chars(entry, 0, -1)));
135}
136
137static void
138account_password_changed(GtkEditable *entry, AccountGeneralTab *view)
139{
140 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
141 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
142 priv->account->setPassword(QString(gtk_editable_get_chars(entry, 0, -1)));
143}
144
145static void
146show_password(GtkToggleButton *checkbutton, GtkEntry *entry)
147{
148 gtk_entry_set_visibility(GTK_ENTRY(entry), gtk_toggle_button_get_active(checkbutton));
149}
150
151static void
152account_proxy_changed(GtkEditable *entry, AccountGeneralTab *view)
153{
154 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
155 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
156 priv->account->setProxy(QString(gtk_editable_get_chars(entry, 0, -1)));
157}
158
159static void
160account_mailbox_changed(GtkEditable *entry, AccountGeneralTab *view)
161{
162 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
163 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
164 priv->account->setMailbox(QString(gtk_editable_get_chars(entry, 0, -1)));
165}
166
167static void
Sébastien Blinc50a8a32017-09-22 10:13:12 -0400168reset_change_password(AccountGeneralTab *view)
169{
170 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
171 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
172 gtk_label_set_text(GTK_LABEL(priv->label_error_change_passowrd), "");
173 gtk_button_set_label(GTK_BUTTON(priv->button_validate_password), _("Change password"));
174}
175
Sébastien Blinb5da5ab2018-02-27 16:46:20 -0500176
177static void
178choose_export_file(AccountGeneralTab *view)
179{
180 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
181 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
182 // Sauvegarder path
183 GtkWidget* dialog;
184 GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_SAVE;
185 gint res;
186 gchar* filename = nullptr;
187
188 dialog = gtk_file_chooser_dialog_new(_("Save File"),
189 GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(view))),
190 action,
191 _("_Cancel"),
192 GTK_RESPONSE_CANCEL,
193 _("_Save"),
194 GTK_RESPONSE_ACCEPT,
195 nullptr);
196
197 std::string alias = priv->account->alias().toLocal8Bit().constData();
198 std::string uri = alias.empty()? "export.gz" : alias + ".gz";
199 gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), uri.c_str());
200 res = gtk_dialog_run (GTK_DIALOG(dialog));
201
202 if (res == GTK_RESPONSE_ACCEPT) {
203 auto chooser = GTK_FILE_CHOOSER(dialog);
204 filename = gtk_file_chooser_get_filename(chooser);
205 }
206 gtk_widget_destroy (dialog);
207
208 if (!filename) return;
209
210 // export account
211 priv->account->exportToFile(filename);
212 // Set informations label
213 std::string label = std::string(_("File exported to destination: ")) + std::string(filename);
214 gtk_label_set_text(GTK_LABEL(priv->label_export_informations), label.c_str());
215}
216
Sébastien Blinc50a8a32017-09-22 10:13:12 -0400217static void
218change_password(AccountGeneralTab *view)
219{
220 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
221 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
222
223 std::string current_password = gtk_entry_get_text(GTK_ENTRY(priv->entry_current_password));
224 std::string new_password = gtk_entry_get_text(GTK_ENTRY(priv->entry_new_password));
225 std::string confirm_password = gtk_entry_get_text(GTK_ENTRY(priv->entry_confirm_password));
226 if (new_password != confirm_password) {
227 gtk_label_set_text(GTK_LABEL(priv->label_error_change_passowrd), _("New password and its confirmation are different"));
228 return;
229 }
230 if (priv->account->changePassword(current_password.c_str(), new_password.c_str())) {
231 gtk_label_set_text(GTK_LABEL(priv->label_error_change_passowrd), "");
232 gtk_entry_set_text(GTK_ENTRY(priv->entry_current_password), "");
233 gtk_entry_set_text(GTK_ENTRY(priv->entry_new_password), "");
234 gtk_entry_set_text(GTK_ENTRY(priv->entry_confirm_password), "");
235 // NOTE: can't use account->archiveHasPassword here, because the account is not updated.
236 gtk_widget_set_visible(priv->entry_current_password, !new_password.empty());
237 gtk_button_set_label(GTK_BUTTON(priv->button_validate_password), _("Password changed!"));
238 } else {
239 gtk_button_set_label(GTK_BUTTON(priv->button_validate_password), _("Change password"));
240 gtk_label_set_text(GTK_LABEL(priv->label_error_change_passowrd), _("Incorrect password"));
241 }
242
243}
244
245static void
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400246build_tab_view(AccountGeneralTab *view)
247{
248 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
249 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
250
251 int grid_row = 0;
252 GtkWidget *label = NULL;
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400253
254 /* separate pointers for each so that we reference them in the account changed callback */
255 GtkWidget *entry_alias = NULL;
256 GtkWidget *entry_username = NULL;
257 GtkWidget *entry_hostname = NULL;
258 GtkWidget *entry_password = NULL;
259 GtkWidget *entry_proxy = NULL;
260 GtkWidget *entry_voicemail = NULL;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400261
262 /* build account grid */
263
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400264 /* account alias */
265 label = gtk_label_new(_("Alias"));
266 gtk_widget_set_halign(label, GTK_ALIGN_START);
267 gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1);
268 entry_alias = gtk_entry_new();
269 gtk_entry_set_text(GTK_ENTRY(entry_alias), priv->account->alias().toLocal8Bit().constData());
270 gtk_widget_set_halign(entry_alias, GTK_ALIGN_START);
271 g_signal_connect(entry_alias, "changed", G_CALLBACK(account_alias_changed), view);
272 gtk_grid_attach(GTK_GRID(priv->grid_account), entry_alias, 1, grid_row, 1, 1);
273 ++grid_row;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400274
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400275 /* account type */
276 label = gtk_label_new(_("Type"));
277 gtk_widget_set_halign(label, GTK_ALIGN_START);
278 gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400279
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400280 label = gtk_label_new("");
281 gtk_widget_set_halign(label, GTK_ALIGN_START);
282 switch (priv->account->protocol()) {
283 case Account::Protocol::SIP:
284 gtk_label_set_text(GTK_LABEL(label), "SIP");
285 break;
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400286 case Account::Protocol::RING:
287 gtk_label_set_text(GTK_LABEL(label), "RING");
288 break;
289 case Account::Protocol::COUNT__:
290 break;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400291 }
292
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400293 gtk_grid_attach(GTK_GRID(priv->grid_account), label, 1, grid_row, 1, 1);
294 ++grid_row;
295
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400296 if (priv->account->protocol() == Account::Protocol::RING) {
Stepan Salenikovicha1b8cb32015-09-11 14:58:35 -0400297 label = gtk_label_new("RingID");
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400298 gtk_widget_set_halign(label, GTK_ALIGN_START);
299 gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1);
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400300 entry_username = gtk_entry_new();
aviau2da3d9c2016-09-06 11:28:36 -0400301 gtk_widget_set_halign(entry_username, GTK_ALIGN_START);
Stepan Salenikovicha1b8cb32015-09-11 14:58:35 -0400302 gtk_entry_set_placeholder_text(GTK_ENTRY(entry_username), _("auto-generating..."));
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400303 gtk_entry_set_text(GTK_ENTRY(entry_username), priv->account->username().toLocal8Bit().constData());
304 g_object_set(G_OBJECT(entry_username), "editable", FALSE, NULL);
305 g_object_set(G_OBJECT(entry_username), "max-width-chars", 50, NULL);
Houmin68293822017-05-16 12:13:55 +0800306 PangoAttrList *attrs = pango_attr_list_new();
307 PangoAttribute *font_desc = pango_attr_font_desc_new(pango_font_description_from_string("monospace"));
308 pango_attr_list_insert(attrs, font_desc);
309 gtk_entry_set_attributes(GTK_ENTRY(entry_username), attrs);
310 pango_attr_list_unref(attrs);
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400311 gtk_entry_set_alignment(GTK_ENTRY(entry_username), 0.5);
312 gtk_grid_attach(GTK_GRID(priv->grid_account), entry_username, 1, grid_row, 1, 1);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400313 ++grid_row;
aviau2da3d9c2016-09-06 11:28:36 -0400314
aviauaf7d6bb2016-11-09 16:41:53 -0500315 label = gtk_label_new(_("Username"));
aviau2da3d9c2016-09-06 11:28:36 -0400316 gtk_widget_set_halign(label, GTK_ALIGN_START);
317 gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1);
318 auto username_registration_box = username_registration_box_new(priv->account, TRUE);
319 gtk_grid_attach(GTK_GRID(priv->grid_account), username_registration_box, 1, grid_row, 2, 2);
320 grid_row+=2;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400321 }
322
323 gtk_widget_show_all(priv->grid_account);
324
325 /* build parameters grid */
326 grid_row = 0;
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400327 if (priv->account->protocol() != Account::Protocol::RING) {
Stepan Salenikovich1a468b92016-06-30 10:46:21 -0400328 /* SIP account */
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400329
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400330 /* host name */
331 label = gtk_label_new(_("Hostname"));
332 gtk_widget_set_halign(label, GTK_ALIGN_START);
333 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
334 entry_hostname = gtk_entry_new();
335 gtk_entry_set_text(GTK_ENTRY(entry_hostname), priv->account->hostname().toLocal8Bit().constData());
336 g_signal_connect(entry_hostname, "changed", G_CALLBACK(account_hostname_changed), view);
337 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_hostname, 1, grid_row, 1, 1);
338 ++grid_row;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400339
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400340 /* user name */
341 label = gtk_label_new(_("Username"));
342 gtk_widget_set_halign(label, GTK_ALIGN_START);
343 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
344 entry_username = gtk_entry_new();
345 gtk_entry_set_text(GTK_ENTRY(entry_username), priv->account->username().toLocal8Bit().constData());
346 g_signal_connect(entry_username, "changed", G_CALLBACK(account_username_changed), view);
347 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_username, 1, grid_row, 1, 1);
348 ++grid_row;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400349
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400350 /* password */
351 label = gtk_label_new(_("Password"));
352 gtk_widget_set_halign(label, GTK_ALIGN_START);
353 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
354 entry_password = gtk_entry_new();
355 gtk_entry_set_input_purpose(GTK_ENTRY(entry_password), GTK_INPUT_PURPOSE_PASSWORD);
356 gtk_entry_set_icon_from_icon_name(GTK_ENTRY(entry_password), GTK_ENTRY_ICON_PRIMARY, "dialog-password");
357 gtk_entry_set_visibility(GTK_ENTRY(entry_password), FALSE);
358 gtk_entry_set_text(GTK_ENTRY(entry_password), priv->account->password().toLocal8Bit().constData());
359 g_signal_connect(entry_password, "changed", G_CALLBACK(account_password_changed), view);
360 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_password, 1, grid_row, 1, 1);
361 ++grid_row;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400362
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400363 /* show password */
364 GtkWidget *checkbutton = gtk_check_button_new_with_label(_("Show password"));
365 gtk_grid_attach(GTK_GRID(priv->grid_parameters), checkbutton, 1, grid_row, 1, 1);
366 g_signal_connect(checkbutton, "toggled", G_CALLBACK(show_password), entry_password);
367 ++grid_row;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400368
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400369 /* proxy */
370 label = gtk_label_new(_("Proxy"));
371 gtk_widget_set_halign(label, GTK_ALIGN_START);
372 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
373 entry_proxy = gtk_entry_new();
374 gtk_entry_set_text(GTK_ENTRY(entry_proxy), priv->account->proxy().toLocal8Bit().constData());
375 g_signal_connect(entry_proxy, "changed", G_CALLBACK(account_proxy_changed), view);
376 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_proxy, 1, grid_row, 1, 1);
377 ++grid_row;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400378
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400379 /* voicemail number */
380 label = gtk_label_new(_("Voicemail number"));
381 gtk_widget_set_halign(label, GTK_ALIGN_START);
382 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
383 entry_voicemail = gtk_entry_new();
384 gtk_entry_set_text(GTK_ENTRY(entry_voicemail), priv->account->mailbox().toLocal8Bit().constData());
385 g_signal_connect(entry_voicemail, "changed", G_CALLBACK(account_mailbox_changed), view);
386 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_voicemail, 1, grid_row, 1, 1);
387 ++grid_row;
Sébastien Blin1e191dc2018-02-28 11:14:34 -0500388
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400389 } else {
Sébastien Blin1e191dc2018-02-28 11:14:34 -0500390 gtk_widget_hide(priv->frame_parameters);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400391 }
Sébastien Blin1e191dc2018-02-28 11:14:34 -0500392 gtk_widget_show_all(priv->grid_parameters);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400393
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400394 /* update account parameters if model is updated */
395 priv->account_updated = QObject::connect(
396 priv->account,
397 &Account::changed,
398 [=] () {
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400399 gtk_entry_set_text(GTK_ENTRY(entry_alias), priv->account->alias().toLocal8Bit().constData());
400 gtk_entry_set_text(GTK_ENTRY(entry_username), priv->account->username().toLocal8Bit().constData());
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400401
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400402 if (priv->account->protocol() != Account::Protocol::RING) {
aviau9bbb19b2016-05-16 15:53:44 -0400403 gtk_entry_set_text(GTK_ENTRY(entry_hostname), priv->account->hostname().toLocal8Bit().constData());
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400404 gtk_entry_set_text(GTK_ENTRY(entry_password), priv->account->password().toLocal8Bit().constData());
405 gtk_entry_set_text(GTK_ENTRY(entry_proxy), priv->account->proxy().toLocal8Bit().constData());
406 gtk_entry_set_text(GTK_ENTRY(entry_voicemail), priv->account->mailbox().toLocal8Bit().constData());
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400407 }
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400408 }
409 );
410
Sébastien Blinc50a8a32017-09-22 10:13:12 -0400411 g_signal_connect_swapped(priv->button_validate_password, "clicked", G_CALLBACK(change_password), view);
412 g_signal_connect_swapped(priv->entry_current_password, "changed", G_CALLBACK(reset_change_password), view);
413 g_signal_connect_swapped(priv->entry_new_password, "changed", G_CALLBACK(reset_change_password), view);
414 g_signal_connect_swapped(priv->entry_confirm_password, "changed", G_CALLBACK(reset_change_password), view);
Sébastien Blinb5da5ab2018-02-27 16:46:20 -0500415 g_signal_connect_swapped(priv->button_choose_file, "clicked", G_CALLBACK(choose_export_file), view);
Sébastien Blinc50a8a32017-09-22 10:13:12 -0400416 gtk_widget_set_visible(priv->entry_current_password, priv->account->archiveHasPassword());
417
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400418}
419
420GtkWidget *
Sébastien Blin276202f2018-05-11 09:37:34 -0400421account_general_tab_new(Account *account, AccountInfoPointer const & accountInfo)
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400422{
423 g_return_val_if_fail(account != NULL, NULL);
424
425 gpointer view = g_object_new(ACCOUNT_GENERAL_TAB_TYPE, NULL);
426
427 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
428 priv->account = account;
Sébastien Blin276202f2018-05-11 09:37:34 -0400429 priv->accountInfo_ = &accountInfo;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400430
431 build_tab_view(ACCOUNT_GENERAL_TAB(view));
432
433 return (GtkWidget *)view;
434}