blob: 6aa48177a8405a3d02c93a55a3d1d59007fded7d [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>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Stepan Salenikovich61cbab02015-03-16 18:35:10 -040018 */
19
20#include "accountgeneraltab.h"
21
22#include <gtk/gtk.h>
Stepan Salenikovicha1b8cb32015-09-11 14:58:35 -040023#include <glib/gi18n.h>
Stepan Salenikovich61cbab02015-03-16 18:35:10 -040024#include <account.h>
aviau9bbb19b2016-05-16 15:53:44 -040025#include "defines.h"
26#include "utils/models.h"
aviau2da3d9c2016-09-06 11:28:36 -040027#include "usernameregistrationbox.h"
Stepan Salenikovich61cbab02015-03-16 18:35:10 -040028
29struct _AccountGeneralTab
30{
31 GtkBox parent;
32};
33
34struct _AccountGeneralTabClass
35{
36 GtkBoxClass parent_class;
37};
38
39typedef struct _AccountGeneralTabPrivate AccountGeneralTabPrivate;
40
41struct _AccountGeneralTabPrivate
42{
43 Account *account;
44 GtkWidget *grid_account;
45 GtkWidget *grid_parameters;
Stepan Salenikovichbd029582015-03-24 11:00:56 -040046
Sébastien Blinc50a8a32017-09-22 10:13:12 -040047 GtkWidget* entry_current_password;
48 GtkWidget* entry_new_password;
49 GtkWidget* entry_confirm_password;
50 GtkWidget* button_validate_password;
51 GtkWidget* label_error_change_passowrd;
52
Sébastien Blinb5da5ab2018-02-27 16:46:20 -050053 GtkWidget* button_choose_file;
54 GtkWidget* label_export_informations;
55
Stepan Salenikovichbd029582015-03-24 11:00:56 -040056 QMetaObject::Connection account_updated;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -040057};
58
59G_DEFINE_TYPE_WITH_PRIVATE(AccountGeneralTab, account_general_tab, GTK_TYPE_BOX);
60
61#define ACCOUNT_GENERAL_TAB_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), ACCOUNT_GENERAL_TAB_TYPE, AccountGeneralTabPrivate))
62
63static void
64account_general_tab_dispose(GObject *object)
65{
Stepan Salenikovichbd029582015-03-24 11:00:56 -040066 AccountGeneralTab *view = ACCOUNT_GENERAL_TAB(object);
67 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
68
69 QObject::disconnect(priv->account_updated);
70
Stepan Salenikovich61cbab02015-03-16 18:35:10 -040071 G_OBJECT_CLASS(account_general_tab_parent_class)->dispose(object);
72}
73
74static void
75account_general_tab_init(AccountGeneralTab *view)
76{
77 gtk_widget_init_template(GTK_WIDGET(view));
78}
79
80static void
81account_general_tab_class_init(AccountGeneralTabClass *klass)
82{
83 G_OBJECT_CLASS(klass)->dispose = account_general_tab_dispose;
84
85 gtk_widget_class_set_template_from_resource(GTK_WIDGET_CLASS (klass),
86 "/cx/ring/RingGnome/accountgeneraltab.ui");
87
88 gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), AccountGeneralTab, grid_account);
89 gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), AccountGeneralTab, grid_parameters);
Sébastien Blinc50a8a32017-09-22 10:13:12 -040090
91 /* change password view */
92 gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), AccountGeneralTab, entry_current_password);
93 gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), AccountGeneralTab, entry_new_password);
94 gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), AccountGeneralTab, entry_confirm_password);
95 gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), AccountGeneralTab, button_validate_password);
96 gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), AccountGeneralTab, label_error_change_passowrd);
97
Sébastien Blinb5da5ab2018-02-27 16:46:20 -050098 /* export account */
99 gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), AccountGeneralTab, button_choose_file);
100 gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), AccountGeneralTab, label_export_informations);
101
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400102}
103
104static void
105account_alias_changed(GtkEditable *entry, AccountGeneralTab *view)
106{
107 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
108 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
109 priv->account->setAlias(QString(gtk_editable_get_chars(entry, 0, -1)));
Stepan Salenikovich75a39172015-07-10 13:21:08 -0400110 if (priv->account->protocol() == Account::Protocol::RING)
111 priv->account->setDisplayName(gtk_entry_get_text(GTK_ENTRY(entry)));
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400112}
113
114static void
aviau2da3d9c2016-09-06 11:28:36 -0400115entry_name_service_url_changed(GtkEditable *entry, AccountGeneralTab *view)
116{
117 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
118 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
119 priv->account->setNameServiceURL(QString(gtk_editable_get_chars(entry, 0, -1)));
120}
121
122static void
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400123account_hostname_changed(GtkEditable *entry, AccountGeneralTab *view)
124{
125 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
126 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
127 priv->account->setHostname(QString(gtk_editable_get_chars(entry, 0, -1)));
128}
129
130static void
131account_username_changed(GtkEditable *entry, AccountGeneralTab *view)
132{
133 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
134 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
135 priv->account->setUsername(QString(gtk_editable_get_chars(entry, 0, -1)));
136}
137
138static void
139account_password_changed(GtkEditable *entry, AccountGeneralTab *view)
140{
141 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
142 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
143 priv->account->setPassword(QString(gtk_editable_get_chars(entry, 0, -1)));
144}
145
146static void
147show_password(GtkToggleButton *checkbutton, GtkEntry *entry)
148{
149 gtk_entry_set_visibility(GTK_ENTRY(entry), gtk_toggle_button_get_active(checkbutton));
150}
151
152static void
153account_proxy_changed(GtkEditable *entry, AccountGeneralTab *view)
154{
155 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
156 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
157 priv->account->setProxy(QString(gtk_editable_get_chars(entry, 0, -1)));
158}
159
160static void
161account_mailbox_changed(GtkEditable *entry, AccountGeneralTab *view)
162{
163 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
164 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
165 priv->account->setMailbox(QString(gtk_editable_get_chars(entry, 0, -1)));
166}
167
168static void
169auto_answer(GtkToggleButton *checkbutton, AccountGeneralTab *view)
170{
171 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
172 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
173 priv->account->setAutoAnswer(gtk_toggle_button_get_active(checkbutton));
174}
175
176static void
177upnp_enabled(GtkToggleButton *checkbutton, AccountGeneralTab *view)
178{
179 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
180 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
181 priv->account->setUpnpEnabled(gtk_toggle_button_get_active(checkbutton));
182}
183
Stepan Salenikovich96ee9a02015-04-28 10:23:13 -0400184static void
Sébastien Blinc50a8a32017-09-22 10:13:12 -0400185reset_change_password(AccountGeneralTab *view)
186{
187 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
188 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
189 gtk_label_set_text(GTK_LABEL(priv->label_error_change_passowrd), "");
190 gtk_button_set_label(GTK_BUTTON(priv->button_validate_password), _("Change password"));
191}
192
Sébastien Blinb5da5ab2018-02-27 16:46:20 -0500193
194static void
195choose_export_file(AccountGeneralTab *view)
196{
197 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
198 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
199 // Sauvegarder path
200 GtkWidget* dialog;
201 GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_SAVE;
202 gint res;
203 gchar* filename = nullptr;
204
205 dialog = gtk_file_chooser_dialog_new(_("Save File"),
206 GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(view))),
207 action,
208 _("_Cancel"),
209 GTK_RESPONSE_CANCEL,
210 _("_Save"),
211 GTK_RESPONSE_ACCEPT,
212 nullptr);
213
214 std::string alias = priv->account->alias().toLocal8Bit().constData();
215 std::string uri = alias.empty()? "export.gz" : alias + ".gz";
216 gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), uri.c_str());
217 res = gtk_dialog_run (GTK_DIALOG(dialog));
218
219 if (res == GTK_RESPONSE_ACCEPT) {
220 auto chooser = GTK_FILE_CHOOSER(dialog);
221 filename = gtk_file_chooser_get_filename(chooser);
222 }
223 gtk_widget_destroy (dialog);
224
225 if (!filename) return;
226
227 // export account
228 priv->account->exportToFile(filename);
229 // Set informations label
230 std::string label = std::string(_("File exported to destination: ")) + std::string(filename);
231 gtk_label_set_text(GTK_LABEL(priv->label_export_informations), label.c_str());
232}
233
Sébastien Blinc50a8a32017-09-22 10:13:12 -0400234static void
235change_password(AccountGeneralTab *view)
236{
237 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
238 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
239
240 std::string current_password = gtk_entry_get_text(GTK_ENTRY(priv->entry_current_password));
241 std::string new_password = gtk_entry_get_text(GTK_ENTRY(priv->entry_new_password));
242 std::string confirm_password = gtk_entry_get_text(GTK_ENTRY(priv->entry_confirm_password));
243 if (new_password != confirm_password) {
244 gtk_label_set_text(GTK_LABEL(priv->label_error_change_passowrd), _("New password and its confirmation are different"));
245 return;
246 }
247 if (priv->account->changePassword(current_password.c_str(), new_password.c_str())) {
248 gtk_label_set_text(GTK_LABEL(priv->label_error_change_passowrd), "");
249 gtk_entry_set_text(GTK_ENTRY(priv->entry_current_password), "");
250 gtk_entry_set_text(GTK_ENTRY(priv->entry_new_password), "");
251 gtk_entry_set_text(GTK_ENTRY(priv->entry_confirm_password), "");
252 // NOTE: can't use account->archiveHasPassword here, because the account is not updated.
253 gtk_widget_set_visible(priv->entry_current_password, !new_password.empty());
254 gtk_button_set_label(GTK_BUTTON(priv->button_validate_password), _("Password changed!"));
255 } else {
256 gtk_button_set_label(GTK_BUTTON(priv->button_validate_password), _("Change password"));
257 gtk_label_set_text(GTK_LABEL(priv->label_error_change_passowrd), _("Incorrect password"));
258 }
259
260}
261
262static void
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400263build_tab_view(AccountGeneralTab *view)
264{
265 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
266 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
267
268 int grid_row = 0;
269 GtkWidget *label = NULL;
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400270
271 /* separate pointers for each so that we reference them in the account changed callback */
272 GtkWidget *entry_alias = NULL;
273 GtkWidget *entry_username = NULL;
274 GtkWidget *entry_hostname = NULL;
275 GtkWidget *entry_password = NULL;
276 GtkWidget *entry_proxy = NULL;
277 GtkWidget *entry_voicemail = NULL;
278 GtkWidget *checkbutton_autoanswer = NULL;
279 GtkWidget *checkbutton_upnp = NULL;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400280
281 /* build account grid */
282
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400283 /* account alias */
284 label = gtk_label_new(_("Alias"));
285 gtk_widget_set_halign(label, GTK_ALIGN_START);
286 gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1);
287 entry_alias = gtk_entry_new();
288 gtk_entry_set_text(GTK_ENTRY(entry_alias), priv->account->alias().toLocal8Bit().constData());
289 gtk_widget_set_halign(entry_alias, GTK_ALIGN_START);
290 g_signal_connect(entry_alias, "changed", G_CALLBACK(account_alias_changed), view);
291 gtk_grid_attach(GTK_GRID(priv->grid_account), entry_alias, 1, grid_row, 1, 1);
292 ++grid_row;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400293
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400294 /* account type */
295 label = gtk_label_new(_("Type"));
296 gtk_widget_set_halign(label, GTK_ALIGN_START);
297 gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400298
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400299 label = gtk_label_new("");
300 gtk_widget_set_halign(label, GTK_ALIGN_START);
301 switch (priv->account->protocol()) {
302 case Account::Protocol::SIP:
303 gtk_label_set_text(GTK_LABEL(label), "SIP");
304 break;
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400305 case Account::Protocol::RING:
306 gtk_label_set_text(GTK_LABEL(label), "RING");
307 break;
308 case Account::Protocol::COUNT__:
309 break;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400310 }
311
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400312 gtk_grid_attach(GTK_GRID(priv->grid_account), label, 1, grid_row, 1, 1);
313 ++grid_row;
314
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400315 if (priv->account->protocol() == Account::Protocol::RING) {
Stepan Salenikovicha1b8cb32015-09-11 14:58:35 -0400316 label = gtk_label_new("RingID");
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400317 gtk_widget_set_halign(label, GTK_ALIGN_START);
318 gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1);
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400319 entry_username = gtk_entry_new();
aviau2da3d9c2016-09-06 11:28:36 -0400320 gtk_widget_set_halign(entry_username, GTK_ALIGN_START);
Stepan Salenikovicha1b8cb32015-09-11 14:58:35 -0400321 gtk_entry_set_placeholder_text(GTK_ENTRY(entry_username), _("auto-generating..."));
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400322 gtk_entry_set_text(GTK_ENTRY(entry_username), priv->account->username().toLocal8Bit().constData());
323 g_object_set(G_OBJECT(entry_username), "editable", FALSE, NULL);
324 g_object_set(G_OBJECT(entry_username), "max-width-chars", 50, NULL);
Houmin68293822017-05-16 12:13:55 +0800325 PangoAttrList *attrs = pango_attr_list_new();
326 PangoAttribute *font_desc = pango_attr_font_desc_new(pango_font_description_from_string("monospace"));
327 pango_attr_list_insert(attrs, font_desc);
328 gtk_entry_set_attributes(GTK_ENTRY(entry_username), attrs);
329 pango_attr_list_unref(attrs);
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400330 gtk_entry_set_alignment(GTK_ENTRY(entry_username), 0.5);
331 gtk_grid_attach(GTK_GRID(priv->grid_account), entry_username, 1, grid_row, 1, 1);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400332 ++grid_row;
aviau2da3d9c2016-09-06 11:28:36 -0400333
aviauaf7d6bb2016-11-09 16:41:53 -0500334 label = gtk_label_new(_("Username"));
aviau2da3d9c2016-09-06 11:28:36 -0400335 gtk_widget_set_halign(label, GTK_ALIGN_START);
336 gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1);
337 auto username_registration_box = username_registration_box_new(priv->account, TRUE);
338 gtk_grid_attach(GTK_GRID(priv->grid_account), username_registration_box, 1, grid_row, 2, 2);
339 grid_row+=2;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400340 }
341
342 gtk_widget_show_all(priv->grid_account);
343
344 /* build parameters grid */
345 grid_row = 0;
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400346 if (priv->account->protocol() != Account::Protocol::RING) {
Stepan Salenikovich1a468b92016-06-30 10:46:21 -0400347 /* SIP account */
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400348
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400349 /* host name */
350 label = gtk_label_new(_("Hostname"));
351 gtk_widget_set_halign(label, GTK_ALIGN_START);
352 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
353 entry_hostname = gtk_entry_new();
354 gtk_entry_set_text(GTK_ENTRY(entry_hostname), priv->account->hostname().toLocal8Bit().constData());
355 g_signal_connect(entry_hostname, "changed", G_CALLBACK(account_hostname_changed), view);
356 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_hostname, 1, grid_row, 1, 1);
357 ++grid_row;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400358
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400359 /* user name */
360 label = gtk_label_new(_("Username"));
361 gtk_widget_set_halign(label, GTK_ALIGN_START);
362 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
363 entry_username = gtk_entry_new();
364 gtk_entry_set_text(GTK_ENTRY(entry_username), priv->account->username().toLocal8Bit().constData());
365 g_signal_connect(entry_username, "changed", G_CALLBACK(account_username_changed), view);
366 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_username, 1, grid_row, 1, 1);
367 ++grid_row;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400368
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400369 /* password */
370 label = gtk_label_new(_("Password"));
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_password = gtk_entry_new();
374 gtk_entry_set_input_purpose(GTK_ENTRY(entry_password), GTK_INPUT_PURPOSE_PASSWORD);
375 gtk_entry_set_icon_from_icon_name(GTK_ENTRY(entry_password), GTK_ENTRY_ICON_PRIMARY, "dialog-password");
376 gtk_entry_set_visibility(GTK_ENTRY(entry_password), FALSE);
377 gtk_entry_set_text(GTK_ENTRY(entry_password), priv->account->password().toLocal8Bit().constData());
378 g_signal_connect(entry_password, "changed", G_CALLBACK(account_password_changed), view);
379 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_password, 1, grid_row, 1, 1);
380 ++grid_row;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400381
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400382 /* show password */
383 GtkWidget *checkbutton = gtk_check_button_new_with_label(_("Show password"));
384 gtk_grid_attach(GTK_GRID(priv->grid_parameters), checkbutton, 1, grid_row, 1, 1);
385 g_signal_connect(checkbutton, "toggled", G_CALLBACK(show_password), entry_password);
386 ++grid_row;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400387
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400388 /* proxy */
389 label = gtk_label_new(_("Proxy"));
390 gtk_widget_set_halign(label, GTK_ALIGN_START);
391 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
392 entry_proxy = gtk_entry_new();
393 gtk_entry_set_text(GTK_ENTRY(entry_proxy), priv->account->proxy().toLocal8Bit().constData());
394 g_signal_connect(entry_proxy, "changed", G_CALLBACK(account_proxy_changed), view);
395 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_proxy, 1, grid_row, 1, 1);
396 ++grid_row;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400397
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400398 /* voicemail number */
399 label = gtk_label_new(_("Voicemail number"));
400 gtk_widget_set_halign(label, GTK_ALIGN_START);
401 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
402 entry_voicemail = gtk_entry_new();
403 gtk_entry_set_text(GTK_ENTRY(entry_voicemail), priv->account->mailbox().toLocal8Bit().constData());
404 g_signal_connect(entry_voicemail, "changed", G_CALLBACK(account_mailbox_changed), view);
405 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_voicemail, 1, grid_row, 1, 1);
406 ++grid_row;
407 } else {
408 /* RING account */
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400409
aviau2da3d9c2016-09-06 11:28:36 -0400410 /* Name service */
411 label = gtk_label_new(_("Name service URL"));
412 gtk_widget_set_halign(label, GTK_ALIGN_START);
413 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
414 GtkWidget* entry_name_service_url = gtk_entry_new();
415 gtk_widget_set_halign(entry_name_service_url, GTK_ALIGN_START);
416 gtk_entry_set_text(GTK_ENTRY(entry_name_service_url), priv->account->nameServiceURL().toLocal8Bit().constData());
417 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_name_service_url, 1, grid_row, 1, 1);
418 g_signal_connect(entry_name_service_url, "changed", G_CALLBACK(entry_name_service_url_changed), view);
419 ++grid_row;
420
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400421 }
422
423 /* auto answer */
Stepan Salenikovicha1b8cb32015-09-11 14:58:35 -0400424 checkbutton_autoanswer = gtk_check_button_new_with_label(_("Auto-answer calls"));
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400425 gtk_widget_set_halign(checkbutton_autoanswer, GTK_ALIGN_START);
426 gtk_grid_attach(GTK_GRID(priv->grid_parameters), checkbutton_autoanswer, 0, grid_row, 1, 1);
427 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_autoanswer), priv->account->isAutoAnswer());
428 g_signal_connect(checkbutton_autoanswer, "toggled", G_CALLBACK(auto_answer), view);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400429 ++grid_row;
430
431 /* upnp */
Stepan Salenikovicha1b8cb32015-09-11 14:58:35 -0400432 checkbutton_upnp = gtk_check_button_new_with_label(_("UPnP enabled"));
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400433 gtk_widget_set_halign(checkbutton_upnp, GTK_ALIGN_START);
434 gtk_grid_attach(GTK_GRID(priv->grid_parameters), checkbutton_upnp, 0, grid_row, 1, 1);
435 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_upnp), priv->account->isUpnpEnabled());
436 g_signal_connect(checkbutton_upnp, "toggled", G_CALLBACK(upnp_enabled), view);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400437 ++grid_row;
438
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400439 /* update account parameters if model is updated */
440 priv->account_updated = QObject::connect(
441 priv->account,
442 &Account::changed,
443 [=] () {
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400444 gtk_entry_set_text(GTK_ENTRY(entry_alias), priv->account->alias().toLocal8Bit().constData());
445 gtk_entry_set_text(GTK_ENTRY(entry_username), priv->account->username().toLocal8Bit().constData());
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400446
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400447 if (priv->account->protocol() != Account::Protocol::RING) {
aviau9bbb19b2016-05-16 15:53:44 -0400448 gtk_entry_set_text(GTK_ENTRY(entry_hostname), priv->account->hostname().toLocal8Bit().constData());
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400449 gtk_entry_set_text(GTK_ENTRY(entry_password), priv->account->password().toLocal8Bit().constData());
450 gtk_entry_set_text(GTK_ENTRY(entry_proxy), priv->account->proxy().toLocal8Bit().constData());
451 gtk_entry_set_text(GTK_ENTRY(entry_voicemail), priv->account->mailbox().toLocal8Bit().constData());
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400452 }
453
454 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_autoanswer), priv->account->isAutoAnswer());
455 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_upnp), priv->account->isUpnpEnabled());
456 }
457 );
458
Sébastien Blinc50a8a32017-09-22 10:13:12 -0400459 g_signal_connect_swapped(priv->button_validate_password, "clicked", G_CALLBACK(change_password), view);
460 g_signal_connect_swapped(priv->entry_current_password, "changed", G_CALLBACK(reset_change_password), view);
461 g_signal_connect_swapped(priv->entry_new_password, "changed", G_CALLBACK(reset_change_password), view);
462 g_signal_connect_swapped(priv->entry_confirm_password, "changed", G_CALLBACK(reset_change_password), view);
Sébastien Blinb5da5ab2018-02-27 16:46:20 -0500463 g_signal_connect_swapped(priv->button_choose_file, "clicked", G_CALLBACK(choose_export_file), view);
Sébastien Blinc50a8a32017-09-22 10:13:12 -0400464 gtk_widget_set_visible(priv->entry_current_password, priv->account->archiveHasPassword());
465
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400466 gtk_widget_show_all(priv->grid_parameters);
467
468}
469
470GtkWidget *
471account_general_tab_new(Account *account)
472{
473 g_return_val_if_fail(account != NULL, NULL);
474
475 gpointer view = g_object_new(ACCOUNT_GENERAL_TAB_TYPE, NULL);
476
477 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
478 priv->account = account;
479
480 build_tab_view(ACCOUNT_GENERAL_TAB(view));
481
482 return (GtkWidget *)view;
483}