blob: 2a32135f4af1a76a712073fcb908195f9b48ab65 [file] [log] [blame]
Stepan Salenikovich61cbab02015-03-16 18:35:10 -04001/*
Stepan Salenikovichbe87d2c2016-01-25 14:14:34 -05002 * Copyright (C) 2015-2016 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>
aviau9bbb19b2016-05-16 15:53:44 -040024#include "models/gtkqtreemodel.h"
Stepan Salenikovich61cbab02015-03-16 18:35:10 -040025#include <account.h>
aviau9bbb19b2016-05-16 15:53:44 -040026#include <bootstrapmodel.h>
27#include "defines.h"
aviau2da3d9c2016-09-06 11:28:36 -040028#include "namedirectory.h"
aviau9bbb19b2016-05-16 15:53:44 -040029#include "utils/models.h"
aviau2da3d9c2016-09-06 11:28:36 -040030#include "usernameregistrationbox.h"
Stepan Salenikovich61cbab02015-03-16 18:35:10 -040031
32struct _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;
47 GtkWidget *grid_account;
48 GtkWidget *grid_parameters;
aviau9bbb19b2016-05-16 15:53:44 -040049 GtkWidget *treeview_bootstrap_servers;
Stepan Salenikovichbd029582015-03-24 11:00:56 -040050
51 QMetaObject::Connection account_updated;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -040052};
53
54G_DEFINE_TYPE_WITH_PRIVATE(AccountGeneralTab, account_general_tab, GTK_TYPE_BOX);
55
56#define ACCOUNT_GENERAL_TAB_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), ACCOUNT_GENERAL_TAB_TYPE, AccountGeneralTabPrivate))
57
58static void
59account_general_tab_dispose(GObject *object)
60{
Stepan Salenikovichbd029582015-03-24 11:00:56 -040061 AccountGeneralTab *view = ACCOUNT_GENERAL_TAB(object);
62 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
63
64 QObject::disconnect(priv->account_updated);
65
Stepan Salenikovich61cbab02015-03-16 18:35:10 -040066 G_OBJECT_CLASS(account_general_tab_parent_class)->dispose(object);
67}
68
69static void
70account_general_tab_init(AccountGeneralTab *view)
71{
72 gtk_widget_init_template(GTK_WIDGET(view));
73}
74
75static void
76account_general_tab_class_init(AccountGeneralTabClass *klass)
77{
78 G_OBJECT_CLASS(klass)->dispose = account_general_tab_dispose;
79
80 gtk_widget_class_set_template_from_resource(GTK_WIDGET_CLASS (klass),
81 "/cx/ring/RingGnome/accountgeneraltab.ui");
82
83 gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), AccountGeneralTab, grid_account);
84 gtk_widget_class_bind_template_child_private(GTK_WIDGET_CLASS (klass), AccountGeneralTab, grid_parameters);
85}
86
87static void
aviau9bbb19b2016-05-16 15:53:44 -040088remove_bootstrap_server(GtkWidget *item, AccountGeneralTab *view)
89{
90 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
91 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
92 auto row = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(item), "bootstrap-server-row"));
93 priv->account->bootstrapModel()->removeRows(row, 1);
94}
95
96static void
Stepan Salenikovich61cbab02015-03-16 18:35:10 -040097account_alias_changed(GtkEditable *entry, AccountGeneralTab *view)
98{
99 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
100 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
101 priv->account->setAlias(QString(gtk_editable_get_chars(entry, 0, -1)));
Stepan Salenikovich75a39172015-07-10 13:21:08 -0400102 if (priv->account->protocol() == Account::Protocol::RING)
103 priv->account->setDisplayName(gtk_entry_get_text(GTK_ENTRY(entry)));
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400104}
105
106static void
aviau2da3d9c2016-09-06 11:28:36 -0400107entry_name_service_url_changed(GtkEditable *entry, AccountGeneralTab *view)
108{
109 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
110 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
111 priv->account->setNameServiceURL(QString(gtk_editable_get_chars(entry, 0, -1)));
112}
113
114static void
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400115account_hostname_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->setHostname(QString(gtk_editable_get_chars(entry, 0, -1)));
120}
121
122static void
123account_username_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->setUsername(QString(gtk_editable_get_chars(entry, 0, -1)));
128}
129
130static void
131account_password_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->setPassword(QString(gtk_editable_get_chars(entry, 0, -1)));
136}
137
138static void
139show_password(GtkToggleButton *checkbutton, GtkEntry *entry)
140{
141 gtk_entry_set_visibility(GTK_ENTRY(entry), gtk_toggle_button_get_active(checkbutton));
142}
143
144static void
145account_proxy_changed(GtkEditable *entry, AccountGeneralTab *view)
146{
147 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
148 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
149 priv->account->setProxy(QString(gtk_editable_get_chars(entry, 0, -1)));
150}
151
152static void
153account_mailbox_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->setMailbox(QString(gtk_editable_get_chars(entry, 0, -1)));
158}
159
160static void
161auto_answer(GtkToggleButton *checkbutton, 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->setAutoAnswer(gtk_toggle_button_get_active(checkbutton));
166}
167
168static void
169upnp_enabled(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->setUpnpEnabled(gtk_toggle_button_get_active(checkbutton));
174}
175
Stepan Salenikovich96ee9a02015-04-28 10:23:13 -0400176static void
177dtmf_set_rtp(GtkToggleButton *toggle_rtp, AccountGeneralTab *view)
178{
179 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
180 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
181 if (gtk_toggle_button_get_active(toggle_rtp)) {
182 g_debug("set DTMF over RTP");
183 priv->account->setDTMFType(DtmfType::OverRtp);
184 } else {
185 g_debug("set DTMF over SIP");
186 priv->account->setDTMFType(DtmfType::OverSip);
187 }
188}
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400189
aviau9bbb19b2016-05-16 15:53:44 -0400190
191static void
192bootstrap_server_edited(GtkCellRendererText *renderer, gchar *path, gchar *new_text, AccountGeneralTab *view)
193{
194 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
195 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
196
197 /* get iter which was clicked */
198 GtkTreePath *tree_path = gtk_tree_path_new_from_string(path);
199 GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(priv->treeview_bootstrap_servers));
200 GtkTreeIter iter;
201 gtk_tree_model_get_iter(model, &iter, tree_path);
202
203 /* get qmodelindex from iter and set the model data */
204 auto column = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(renderer), "model-column"));
205 QModelIndex idx = gtk_q_tree_model_get_source_idx(GTK_Q_TREE_MODEL(model), &iter);
206 if (idx.isValid()) {
207 priv->account->bootstrapModel()->setData(
208 idx.sibling(idx.row(), column),
209 QVariant(new_text),
210 Qt::EditRole
211 );
212 }
213}
214
215static gboolean
216bootstrap_servers_popup_menu(G_GNUC_UNUSED GtkWidget *widget, GdkEventButton *event, AccountGeneralTab *view)
217{
218 g_return_val_if_fail(IS_ACCOUNT_GENERAL_TAB(view), FALSE);
219 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
220
221 /* check for right click */
222 if (event->button != BUTTON_RIGHT_CLICK || event->type != GDK_BUTTON_PRESS)
223 return FALSE;
224
225 GtkTreeIter iter;
226 GtkTreeModel *model;
227 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->treeview_bootstrap_servers));
228 if (!gtk_tree_selection_get_selected(selection, &model, &iter))
229 return FALSE;
230
231 GtkWidget *menu = gtk_menu_new();
232 QModelIndex idx = get_index_from_selection(selection);
233
234 GtkWidget *remove_server_item = gtk_menu_item_new_with_mnemonic(_("_Remove server"));
235 gtk_menu_shell_append(GTK_MENU_SHELL(menu), remove_server_item);
236 g_object_set_data(G_OBJECT(remove_server_item), "bootstrap-server-row", GUINT_TO_POINTER(idx.row()));
237 g_signal_connect(remove_server_item,
238 "activate",
239 G_CALLBACK(remove_bootstrap_server),
240 view);
241
242 /* show menu */
243 gtk_widget_show_all(menu);
244 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, event->button, event->time);
245
246 return TRUE; /* we handled the event */
247}
248
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400249static void
250build_tab_view(AccountGeneralTab *view)
251{
252 g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
253 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
254
255 int grid_row = 0;
256 GtkWidget *label = NULL;
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400257
258 /* separate pointers for each so that we reference them in the account changed callback */
259 GtkWidget *entry_alias = NULL;
260 GtkWidget *entry_username = NULL;
261 GtkWidget *entry_hostname = NULL;
262 GtkWidget *entry_password = NULL;
263 GtkWidget *entry_proxy = NULL;
264 GtkWidget *entry_voicemail = NULL;
265 GtkWidget *checkbutton_autoanswer = NULL;
266 GtkWidget *checkbutton_upnp = NULL;
Stepan Salenikovich96ee9a02015-04-28 10:23:13 -0400267 GtkWidget *radiobutton_dtmf_rtp = NULL;
268 GtkWidget *radiobutton_dtmf_sip = NULL;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400269
270 /* build account grid */
271
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400272 /* account alias */
273 label = gtk_label_new(_("Alias"));
274 gtk_widget_set_halign(label, GTK_ALIGN_START);
275 gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1);
276 entry_alias = gtk_entry_new();
277 gtk_entry_set_text(GTK_ENTRY(entry_alias), priv->account->alias().toLocal8Bit().constData());
278 gtk_widget_set_halign(entry_alias, GTK_ALIGN_START);
279 g_signal_connect(entry_alias, "changed", G_CALLBACK(account_alias_changed), view);
280 gtk_grid_attach(GTK_GRID(priv->grid_account), entry_alias, 1, grid_row, 1, 1);
281 ++grid_row;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400282
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400283 /* account type */
284 label = gtk_label_new(_("Type"));
285 gtk_widget_set_halign(label, GTK_ALIGN_START);
286 gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400287
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400288 label = gtk_label_new("");
289 gtk_widget_set_halign(label, GTK_ALIGN_START);
290 switch (priv->account->protocol()) {
291 case Account::Protocol::SIP:
292 gtk_label_set_text(GTK_LABEL(label), "SIP");
293 break;
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400294 case Account::Protocol::RING:
295 gtk_label_set_text(GTK_LABEL(label), "RING");
296 break;
297 case Account::Protocol::COUNT__:
298 break;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400299 }
300
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400301 gtk_grid_attach(GTK_GRID(priv->grid_account), label, 1, grid_row, 1, 1);
302 ++grid_row;
303
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400304 if (priv->account->protocol() == Account::Protocol::RING) {
Stepan Salenikovicha1b8cb32015-09-11 14:58:35 -0400305 label = gtk_label_new("RingID");
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400306 gtk_widget_set_halign(label, GTK_ALIGN_START);
307 gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1);
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400308 entry_username = gtk_entry_new();
aviau2da3d9c2016-09-06 11:28:36 -0400309 gtk_widget_set_halign(entry_username, GTK_ALIGN_START);
Stepan Salenikovicha1b8cb32015-09-11 14:58:35 -0400310 gtk_entry_set_placeholder_text(GTK_ENTRY(entry_username), _("auto-generating..."));
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400311 gtk_entry_set_text(GTK_ENTRY(entry_username), priv->account->username().toLocal8Bit().constData());
312 g_object_set(G_OBJECT(entry_username), "editable", FALSE, NULL);
313 g_object_set(G_OBJECT(entry_username), "max-width-chars", 50, NULL);
314 gtk_widget_override_font(entry_username, pango_font_description_from_string("monospace"));
315 gtk_entry_set_alignment(GTK_ENTRY(entry_username), 0.5);
316 gtk_grid_attach(GTK_GRID(priv->grid_account), entry_username, 1, grid_row, 1, 1);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400317 ++grid_row;
aviau2da3d9c2016-09-06 11:28:36 -0400318
319 label = gtk_label_new("Ring username");
320 gtk_widget_set_halign(label, GTK_ALIGN_START);
321 gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1);
322 auto username_registration_box = username_registration_box_new(priv->account, TRUE);
323 gtk_grid_attach(GTK_GRID(priv->grid_account), username_registration_box, 1, grid_row, 2, 2);
324 grid_row+=2;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400325 }
326
327 gtk_widget_show_all(priv->grid_account);
328
329 /* build parameters grid */
330 grid_row = 0;
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400331 if (priv->account->protocol() != Account::Protocol::RING) {
Stepan Salenikovich1a468b92016-06-30 10:46:21 -0400332 /* SIP account */
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400333
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400334 /* host name */
335 label = gtk_label_new(_("Hostname"));
336 gtk_widget_set_halign(label, GTK_ALIGN_START);
337 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
338 entry_hostname = gtk_entry_new();
339 gtk_entry_set_text(GTK_ENTRY(entry_hostname), priv->account->hostname().toLocal8Bit().constData());
340 g_signal_connect(entry_hostname, "changed", G_CALLBACK(account_hostname_changed), view);
341 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_hostname, 1, grid_row, 1, 1);
342 ++grid_row;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400343
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400344 /* user name */
345 label = gtk_label_new(_("Username"));
346 gtk_widget_set_halign(label, GTK_ALIGN_START);
347 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
348 entry_username = gtk_entry_new();
349 gtk_entry_set_text(GTK_ENTRY(entry_username), priv->account->username().toLocal8Bit().constData());
350 g_signal_connect(entry_username, "changed", G_CALLBACK(account_username_changed), view);
351 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_username, 1, grid_row, 1, 1);
352 ++grid_row;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400353
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400354 /* password */
355 label = gtk_label_new(_("Password"));
356 gtk_widget_set_halign(label, GTK_ALIGN_START);
357 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
358 entry_password = gtk_entry_new();
359 gtk_entry_set_input_purpose(GTK_ENTRY(entry_password), GTK_INPUT_PURPOSE_PASSWORD);
360 gtk_entry_set_icon_from_icon_name(GTK_ENTRY(entry_password), GTK_ENTRY_ICON_PRIMARY, "dialog-password");
361 gtk_entry_set_visibility(GTK_ENTRY(entry_password), FALSE);
362 gtk_entry_set_text(GTK_ENTRY(entry_password), priv->account->password().toLocal8Bit().constData());
363 g_signal_connect(entry_password, "changed", G_CALLBACK(account_password_changed), view);
364 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_password, 1, grid_row, 1, 1);
365 ++grid_row;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400366
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400367 /* show password */
368 GtkWidget *checkbutton = gtk_check_button_new_with_label(_("Show password"));
369 gtk_grid_attach(GTK_GRID(priv->grid_parameters), checkbutton, 1, grid_row, 1, 1);
370 g_signal_connect(checkbutton, "toggled", G_CALLBACK(show_password), entry_password);
371 ++grid_row;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400372
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400373 /* proxy */
374 label = gtk_label_new(_("Proxy"));
375 gtk_widget_set_halign(label, GTK_ALIGN_START);
376 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
377 entry_proxy = gtk_entry_new();
378 gtk_entry_set_text(GTK_ENTRY(entry_proxy), priv->account->proxy().toLocal8Bit().constData());
379 g_signal_connect(entry_proxy, "changed", G_CALLBACK(account_proxy_changed), view);
380 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_proxy, 1, grid_row, 1, 1);
381 ++grid_row;
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400382
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400383 /* voicemail number */
384 label = gtk_label_new(_("Voicemail number"));
385 gtk_widget_set_halign(label, GTK_ALIGN_START);
386 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
387 entry_voicemail = gtk_entry_new();
388 gtk_entry_set_text(GTK_ENTRY(entry_voicemail), priv->account->mailbox().toLocal8Bit().constData());
389 g_signal_connect(entry_voicemail, "changed", G_CALLBACK(account_mailbox_changed), view);
390 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_voicemail, 1, grid_row, 1, 1);
391 ++grid_row;
392 } else {
393 /* RING account */
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400394
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400395 /* bootstrap */
aviau9bbb19b2016-05-16 15:53:44 -0400396 label = gtk_label_new(C_("The DHT bootstrap server url", "Bootstrap Servers"));
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400397 gtk_widget_set_halign(label, GTK_ALIGN_START);
398 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
aviau9bbb19b2016-05-16 15:53:44 -0400399 ++grid_row;
400
401 priv->treeview_bootstrap_servers = gtk_tree_view_new();
402 g_signal_connect(GTK_WIDGET(priv->treeview_bootstrap_servers),
403 "button-press-event",
404 G_CALLBACK(bootstrap_servers_popup_menu),
405 GTK_WIDGET(view));
406
407 auto bootstrap_servers_frame = gtk_frame_new(NULL);
408 gtk_container_add(GTK_CONTAINER(bootstrap_servers_frame), GTK_WIDGET(priv->treeview_bootstrap_servers));
409
410 auto bootstrap_servers_scrolled_window = gtk_scrolled_window_new(NULL, NULL);
411 gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(bootstrap_servers_scrolled_window), 200);
412 gtk_container_add(GTK_CONTAINER(bootstrap_servers_scrolled_window), bootstrap_servers_frame);
413
414 gtk_grid_attach(GTK_GRID(priv->grid_parameters), bootstrap_servers_scrolled_window, 0, grid_row, 2, 1);
415
416 auto *bootstrap_model = gtk_q_tree_model_new(
417 (QAbstractItemModel*) priv->account->bootstrapModel(),
418 2,
419 BootstrapModel::Columns::HOSTNAME, Qt::DisplayRole, G_TYPE_STRING,
420 BootstrapModel::Columns::PORT, Qt::DisplayRole, G_TYPE_STRING);
421
422 gtk_tree_view_set_model(GTK_TREE_VIEW(priv->treeview_bootstrap_servers), GTK_TREE_MODEL(bootstrap_model));
423
424 GtkCellRenderer *renderer;
425 GtkTreeViewColumn *column;
426
427 renderer = gtk_cell_renderer_text_new();
428 g_object_set(renderer, "editable", true, NULL);
429 column = gtk_tree_view_column_new_with_attributes(_("Hostname"), renderer, "text", 0, NULL);
430 gtk_tree_view_column_set_expand(column, TRUE);
431 gtk_tree_view_append_column(GTK_TREE_VIEW(priv->treeview_bootstrap_servers), column);
432 g_object_set_data(G_OBJECT(renderer), "model-column", GUINT_TO_POINTER(BootstrapModel::Columns::HOSTNAME));
433 g_signal_connect(renderer, "edited", G_CALLBACK(bootstrap_server_edited), view);
434
435 renderer = gtk_cell_renderer_text_new();
436 g_object_set(renderer, "editable", true, NULL);
437 column = gtk_tree_view_column_new_with_attributes(_("Port"), renderer, "text", 1, NULL);
438 gtk_tree_view_column_set_expand(column, TRUE);
439 gtk_tree_view_append_column(GTK_TREE_VIEW(priv->treeview_bootstrap_servers), column);
440 g_object_set_data(G_OBJECT(renderer), "model-column", GUINT_TO_POINTER(BootstrapModel::Columns::PORT));
441 g_signal_connect(renderer, "edited", G_CALLBACK(bootstrap_server_edited), view);
442
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400443 ++grid_row;
aviau2da3d9c2016-09-06 11:28:36 -0400444
445 /* Name service */
446 label = gtk_label_new(_("Name service URL"));
447 gtk_widget_set_halign(label, GTK_ALIGN_START);
448 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
449 GtkWidget* entry_name_service_url = gtk_entry_new();
450 gtk_widget_set_halign(entry_name_service_url, GTK_ALIGN_START);
451 gtk_entry_set_text(GTK_ENTRY(entry_name_service_url), priv->account->nameServiceURL().toLocal8Bit().constData());
452 gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_name_service_url, 1, grid_row, 1, 1);
453 g_signal_connect(entry_name_service_url, "changed", G_CALLBACK(entry_name_service_url_changed), view);
454 ++grid_row;
455
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400456 }
457
458 /* auto answer */
Stepan Salenikovicha1b8cb32015-09-11 14:58:35 -0400459 checkbutton_autoanswer = gtk_check_button_new_with_label(_("Auto-answer calls"));
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400460 gtk_widget_set_halign(checkbutton_autoanswer, GTK_ALIGN_START);
461 gtk_grid_attach(GTK_GRID(priv->grid_parameters), checkbutton_autoanswer, 0, grid_row, 1, 1);
462 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_autoanswer), priv->account->isAutoAnswer());
463 g_signal_connect(checkbutton_autoanswer, "toggled", G_CALLBACK(auto_answer), view);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400464 ++grid_row;
465
466 /* upnp */
Stepan Salenikovicha1b8cb32015-09-11 14:58:35 -0400467 checkbutton_upnp = gtk_check_button_new_with_label(_("UPnP enabled"));
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400468 gtk_widget_set_halign(checkbutton_upnp, GTK_ALIGN_START);
469 gtk_grid_attach(GTK_GRID(priv->grid_parameters), checkbutton_upnp, 0, grid_row, 1, 1);
470 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_upnp), priv->account->isUpnpEnabled());
471 g_signal_connect(checkbutton_upnp, "toggled", G_CALLBACK(upnp_enabled), view);
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400472 ++grid_row;
473
Stepan Salenikovich96ee9a02015-04-28 10:23:13 -0400474 /* DTMF tone type */
Stepan Salenikovicha1b8cb32015-09-11 14:58:35 -0400475 label = gtk_label_new(_("DTMF tone type:"));
Stepan Salenikovich96ee9a02015-04-28 10:23:13 -0400476 gtk_widget_set_halign(label, GTK_ALIGN_START);
477 gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
478
479 GtkWidget *dtmf_box = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
480 gtk_button_box_set_layout(GTK_BUTTON_BOX(dtmf_box), GTK_BUTTONBOX_START);
481 gtk_box_set_spacing(GTK_BOX(dtmf_box), 10);
482 radiobutton_dtmf_rtp = gtk_radio_button_new_with_label(NULL, "RTP");
483 radiobutton_dtmf_sip = gtk_radio_button_new_with_label_from_widget(
484 GTK_RADIO_BUTTON(radiobutton_dtmf_rtp),
485 "SIP");
486 gtk_toggle_button_set_active(
487 priv->account->DTMFType() == DtmfType::OverRtp ?
488 GTK_TOGGLE_BUTTON(radiobutton_dtmf_rtp) : GTK_TOGGLE_BUTTON(radiobutton_dtmf_sip),
489 TRUE);
490 g_signal_connect(radiobutton_dtmf_rtp, "toggled", G_CALLBACK(dtmf_set_rtp), view);
491 gtk_box_pack_start(GTK_BOX(dtmf_box),
492 radiobutton_dtmf_rtp,
493 FALSE, TRUE, 0);
494 gtk_box_pack_start(GTK_BOX(dtmf_box),
495 radiobutton_dtmf_sip,
496 FALSE, TRUE, 0);
497 gtk_grid_attach(GTK_GRID(priv->grid_parameters), dtmf_box, 1, grid_row, 1, 1);
498 ++grid_row;
499
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400500 /* update account parameters if model is updated */
501 priv->account_updated = QObject::connect(
502 priv->account,
503 &Account::changed,
504 [=] () {
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400505 gtk_entry_set_text(GTK_ENTRY(entry_alias), priv->account->alias().toLocal8Bit().constData());
506 gtk_entry_set_text(GTK_ENTRY(entry_username), priv->account->username().toLocal8Bit().constData());
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400507
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400508 if (priv->account->protocol() != Account::Protocol::RING) {
aviau9bbb19b2016-05-16 15:53:44 -0400509 gtk_entry_set_text(GTK_ENTRY(entry_hostname), priv->account->hostname().toLocal8Bit().constData());
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400510 gtk_entry_set_text(GTK_ENTRY(entry_password), priv->account->password().toLocal8Bit().constData());
511 gtk_entry_set_text(GTK_ENTRY(entry_proxy), priv->account->proxy().toLocal8Bit().constData());
512 gtk_entry_set_text(GTK_ENTRY(entry_voicemail), priv->account->mailbox().toLocal8Bit().constData());
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400513 }
514
515 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_autoanswer), priv->account->isAutoAnswer());
516 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_upnp), priv->account->isUpnpEnabled());
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400517 gtk_toggle_button_set_active(
Stepan Salenikovich96ee9a02015-04-28 10:23:13 -0400518 priv->account->DTMFType() == DtmfType::OverRtp ?
519 GTK_TOGGLE_BUTTON(radiobutton_dtmf_rtp) : GTK_TOGGLE_BUTTON(radiobutton_dtmf_sip),
Stepan Salenikovichfea84052016-05-13 16:32:51 -0400520 TRUE);
Stepan Salenikovichbd029582015-03-24 11:00:56 -0400521 }
522 );
523
Stepan Salenikovich61cbab02015-03-16 18:35:10 -0400524 gtk_widget_show_all(priv->grid_parameters);
525
526}
527
528GtkWidget *
529account_general_tab_new(Account *account)
530{
531 g_return_val_if_fail(account != NULL, NULL);
532
533 gpointer view = g_object_new(ACCOUNT_GENERAL_TAB_TYPE, NULL);
534
535 AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);
536 priv->account = account;
537
538 build_tab_view(ACCOUNT_GENERAL_TAB(view));
539
540 return (GtkWidget *)view;
541}