Esempio n. 1
0
//Connect popup, no cancel button and not always in front
extern void popup_connect(const char *msg)
{
	GtkWidget *dialog_content_area = NULL,
			*msg_label = NULL,
			*addr_grid = NULL,
			*addr_label = NULL,
			*address_entry_field = NULL,
			*port_grid = NULL,
			*port_label = NULL,
			*port_entry_field = NULL;

	/*dialog*/
	dialog_connect = gtk_dialog_new();
	gtk_window_set_title(GTK_WINDOW(dialog_connect), "Connect to server");

	//set it to transient (belongs to window below, may not outlast it and is always on top)
	gtk_window_set_transient_for(GTK_WINDOW(dialog_connect), GTK_WINDOW(window) );
	dialog_content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog_connect));

	/*message label*/
	msg_label = gtk_label_new(msg);

	/*address grid*/
	addr_grid = gtk_grid_new();
	gtk_grid_set_column_spacing(GTK_GRID(addr_grid), 10);

	/*address label*/
	addr_label = gtk_label_new("Address:");
	gtk_widget_set_hexpand(addr_label, TRUE);
	gtk_widget_set_halign(addr_label, GTK_ALIGN_START);

	/*address entry*/
	address_entry_field = gtk_entry_new();

	/*port grid*/
	port_grid = gtk_grid_new();
	gtk_grid_set_column_spacing(GTK_GRID(port_grid), 10);

	/*port label*/
	port_label = gtk_label_new("Port:");
	gtk_widget_set_hexpand(port_label, TRUE);
	gtk_widget_set_halign(port_label, GTK_ALIGN_START);

	/*port entry*/
	port_entry_field = gtk_entry_new();
	gtk_entry_set_input_purpose(GTK_ENTRY(port_entry_field), GTK_INPUT_PURPOSE_DIGITS);	//help the onscreen keyboards

	/*pack message and address and port inputs*/
	gtk_box_pack_start( GTK_BOX(dialog_content_area), msg_label, FALSE, FALSE, 0 );
	gtk_grid_attach(GTK_GRID(addr_grid), addr_label, 0, 0, 1, 1);
	gtk_grid_attach(GTK_GRID(addr_grid), address_entry_field, 1, 0, 1, 1);
	gtk_box_pack_start( GTK_BOX(dialog_content_area), addr_grid, FALSE, FALSE, 0 );
	gtk_grid_attach(GTK_GRID(port_grid), port_label, 0, 0, 1, 1);
	gtk_grid_attach(GTK_GRID(port_grid), port_entry_field, 1, 0, 1, 1);
	gtk_box_pack_start( GTK_BOX(dialog_content_area), port_grid, FALSE, FALSE, 0 );
	gtk_dialog_add_button( GTK_DIALOG(dialog_connect),  "Connect", GTK_RESPONSE_OK );

	/*connect the "response" signal*/
	g_signal_connect( GTK_DIALOG(dialog_connect), "response", G_CALLBACK(connect_cb), NULL);
	g_signal_connect_swapped( GTK_DIALOG(dialog_connect), "response", G_CALLBACK(gtk_widget_destroy), dialog_connect);

	//show
	gtk_widget_show(msg_label);
	gtk_widget_show(addr_grid);
	gtk_widget_show(addr_label);
	gtk_widget_show(address_entry_field);
	gtk_widget_show(port_grid);
	gtk_widget_show(port_label);
	gtk_widget_show(port_entry_field);
	gtk_widget_show(dialog_connect);

	//we no longer need the pointer to the dialog, the callbacks have it if they need it
	dialog_connect = NULL;

	return;
}
static void
build_tab_view(AccountGeneralTab *view)
{
    g_return_if_fail(IS_ACCOUNT_GENERAL_TAB(view));
    AccountGeneralTabPrivate *priv = ACCOUNT_GENERAL_TAB_GET_PRIVATE(view);

    int grid_row = 0;
    GtkWidget *label = NULL;

    /* separate pointers for each so that we reference them in the account changed callback */
    GtkWidget *entry_alias = NULL;
    GtkWidget *entry_username = NULL;
    GtkWidget *entry_hostname = NULL;
    GtkWidget *entry_password = NULL;
    GtkWidget *entry_proxy = NULL;
    GtkWidget *entry_voicemail = NULL;
    GtkWidget *checkbutton_autoanswer = NULL;
    GtkWidget *checkbutton_upnp = NULL;
    GtkWidget *radiobutton_dtmf_rtp = NULL;
    GtkWidget *radiobutton_dtmf_sip = NULL;

    /* build account grid */

    /* check if its ip2ip account */
    const QByteArray& alias = priv->account->alias().toLocal8Bit();

    if (strcmp(alias.constData(), "IP2IP") == 0) {
        label = gtk_label_new("IP2IP");
        gtk_widget_set_halign(label, GTK_ALIGN_START);
        gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1);
        ++grid_row;
    } else {
        /* account alias */
        label = gtk_label_new(_("Alias"));
        gtk_widget_set_halign(label, GTK_ALIGN_START);
        gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1);
        entry_alias = gtk_entry_new();
        gtk_entry_set_text(GTK_ENTRY(entry_alias), alias.constData());
        gtk_widget_set_halign(entry_alias, GTK_ALIGN_START);
        g_signal_connect(entry_alias, "changed", G_CALLBACK(account_alias_changed), view);
        gtk_grid_attach(GTK_GRID(priv->grid_account), entry_alias, 1, grid_row, 1, 1);
        ++grid_row;

        /* account type */
        label = gtk_label_new(_("Type"));
        gtk_widget_set_halign(label, GTK_ALIGN_START);
        gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1);

        label = gtk_label_new("");
        gtk_widget_set_halign(label, GTK_ALIGN_START);
        switch (priv->account->protocol()) {
            case Account::Protocol::SIP:
                gtk_label_set_text(GTK_LABEL(label), "SIP");
                break;
            case Account::Protocol::IAX:
                gtk_label_set_text(GTK_LABEL(label), "IAX");
                break;
            case Account::Protocol::RING:
                gtk_label_set_text(GTK_LABEL(label), "RING");
                break;
            case Account::Protocol::COUNT__:
                break;
        }

        gtk_grid_attach(GTK_GRID(priv->grid_account), label, 1, grid_row, 1, 1);
        ++grid_row;
    }

    if (priv->account->protocol() == Account::Protocol::RING) {
        label = gtk_label_new("RingID");
        gtk_widget_set_halign(label, GTK_ALIGN_START);
        gtk_grid_attach(GTK_GRID(priv->grid_account), label, 0, grid_row, 1, 1);
        entry_username = gtk_entry_new();
        gtk_entry_set_placeholder_text(GTK_ENTRY(entry_username), _("auto-generating..."));
        gtk_entry_set_text(GTK_ENTRY(entry_username), priv->account->username().toLocal8Bit().constData());
        g_object_set(G_OBJECT(entry_username), "editable", FALSE, NULL);
        g_object_set(G_OBJECT(entry_username), "max-width-chars", 50, NULL);
        gtk_widget_override_font(entry_username, pango_font_description_from_string("monospace"));
        gtk_entry_set_alignment(GTK_ENTRY(entry_username), 0.5);
        gtk_grid_attach(GTK_GRID(priv->grid_account), entry_username, 1, grid_row, 1, 1);
        ++grid_row;
    }

    gtk_widget_show_all(priv->grid_account);

    /* build parameters grid */
    grid_row = 0;
    if (strcmp(alias.constData(), "IP2IP") != 0) {
        if (priv->account->protocol() != Account::Protocol::RING) {
            /* SIP and IAX have the same params */

            /* host name */
            label = gtk_label_new(_("Hostname"));
            gtk_widget_set_halign(label, GTK_ALIGN_START);
            gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
            entry_hostname = gtk_entry_new();
            gtk_entry_set_text(GTK_ENTRY(entry_hostname), priv->account->hostname().toLocal8Bit().constData());
            g_signal_connect(entry_hostname, "changed", G_CALLBACK(account_hostname_changed), view);
            gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_hostname, 1, grid_row, 1, 1);
            ++grid_row;

            /* user name */
            label = gtk_label_new(_("Username"));
            gtk_widget_set_halign(label, GTK_ALIGN_START);
            gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
            entry_username = gtk_entry_new();
            gtk_entry_set_text(GTK_ENTRY(entry_username), priv->account->username().toLocal8Bit().constData());
            g_signal_connect(entry_username, "changed", G_CALLBACK(account_username_changed), view);
            gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_username, 1, grid_row, 1, 1);
            ++grid_row;

            /* password */
            label = gtk_label_new(_("Password"));
            gtk_widget_set_halign(label, GTK_ALIGN_START);
            gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
            entry_password = gtk_entry_new();
            gtk_entry_set_input_purpose(GTK_ENTRY(entry_password), GTK_INPUT_PURPOSE_PASSWORD);
            gtk_entry_set_icon_from_icon_name(GTK_ENTRY(entry_password), GTK_ENTRY_ICON_PRIMARY, "dialog-password");
            gtk_entry_set_visibility(GTK_ENTRY(entry_password), FALSE);
            gtk_entry_set_text(GTK_ENTRY(entry_password), priv->account->password().toLocal8Bit().constData());
            g_signal_connect(entry_password, "changed", G_CALLBACK(account_password_changed), view);
            gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_password, 1, grid_row, 1, 1);
            ++grid_row;

            /* show password */
            GtkWidget *checkbutton = gtk_check_button_new_with_label(_("Show password"));
            gtk_grid_attach(GTK_GRID(priv->grid_parameters), checkbutton, 1, grid_row, 1, 1);
            g_signal_connect(checkbutton, "toggled", G_CALLBACK(show_password), entry_password);
            ++grid_row;

            /* proxy */
            label = gtk_label_new(_("Proxy"));
            gtk_widget_set_halign(label, GTK_ALIGN_START);
            gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
            entry_proxy = gtk_entry_new();
            gtk_entry_set_text(GTK_ENTRY(entry_proxy), priv->account->proxy().toLocal8Bit().constData());
            g_signal_connect(entry_proxy, "changed", G_CALLBACK(account_proxy_changed), view);
            gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_proxy, 1, grid_row, 1, 1);
            ++grid_row;

            /* voicemail number */
            label = gtk_label_new(_("Voicemail number"));
            gtk_widget_set_halign(label, GTK_ALIGN_START);
            gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
            entry_voicemail = gtk_entry_new();
            gtk_entry_set_text(GTK_ENTRY(entry_voicemail), priv->account->mailbox().toLocal8Bit().constData());
            g_signal_connect(entry_voicemail, "changed", G_CALLBACK(account_mailbox_changed), view);
            gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_voicemail, 1, grid_row, 1, 1);
            ++grid_row;
        } else {
            /* RING accoutn */

            /* bootstrap */
            label = gtk_label_new(C_("The DHT bootstrap server url", "Bootstrap"));
            gtk_widget_set_halign(label, GTK_ALIGN_START);
            gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);
            entry_hostname = gtk_entry_new();
            gtk_entry_set_text(GTK_ENTRY(entry_hostname), priv->account->hostname().toLocal8Bit().constData());
            g_signal_connect(entry_hostname, "changed", G_CALLBACK(account_hostname_changed), view);
            gtk_grid_attach(GTK_GRID(priv->grid_parameters), entry_hostname, 1, grid_row, 1, 1);
            ++grid_row;
        }
    }

    /* auto answer */
    checkbutton_autoanswer = gtk_check_button_new_with_label(_("Auto-answer calls"));
    gtk_widget_set_halign(checkbutton_autoanswer, GTK_ALIGN_START);
    gtk_grid_attach(GTK_GRID(priv->grid_parameters), checkbutton_autoanswer, 0, grid_row, 1, 1);
    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_autoanswer), priv->account->isAutoAnswer());
    g_signal_connect(checkbutton_autoanswer, "toggled", G_CALLBACK(auto_answer), view);
    ++grid_row;

    /* upnp */
    checkbutton_upnp = gtk_check_button_new_with_label(_("UPnP enabled"));
    gtk_widget_set_halign(checkbutton_upnp, GTK_ALIGN_START);
    gtk_grid_attach(GTK_GRID(priv->grid_parameters), checkbutton_upnp, 0, grid_row, 1, 1);
    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_upnp), priv->account->isUpnpEnabled());
    g_signal_connect(checkbutton_upnp, "toggled", G_CALLBACK(upnp_enabled), view);
    ++grid_row;

    /* DTMF tone type */
    label = gtk_label_new(_("DTMF tone type:"));
    gtk_widget_set_halign(label, GTK_ALIGN_START);
    gtk_grid_attach(GTK_GRID(priv->grid_parameters), label, 0, grid_row, 1, 1);

    GtkWidget *dtmf_box = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
    gtk_button_box_set_layout(GTK_BUTTON_BOX(dtmf_box), GTK_BUTTONBOX_START);
    gtk_box_set_spacing(GTK_BOX(dtmf_box), 10);
    radiobutton_dtmf_rtp = gtk_radio_button_new_with_label(NULL, "RTP");
    radiobutton_dtmf_sip = gtk_radio_button_new_with_label_from_widget(
        GTK_RADIO_BUTTON(radiobutton_dtmf_rtp),
        "SIP");
    gtk_toggle_button_set_active(
        priv->account->DTMFType() == DtmfType::OverRtp ?
            GTK_TOGGLE_BUTTON(radiobutton_dtmf_rtp) : GTK_TOGGLE_BUTTON(radiobutton_dtmf_sip),
        TRUE);
    g_signal_connect(radiobutton_dtmf_rtp, "toggled", G_CALLBACK(dtmf_set_rtp), view);
    gtk_box_pack_start(GTK_BOX(dtmf_box),
                       radiobutton_dtmf_rtp,
                       FALSE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(dtmf_box),
                       radiobutton_dtmf_sip,
                       FALSE, TRUE, 0);
    gtk_grid_attach(GTK_GRID(priv->grid_parameters), dtmf_box, 1, grid_row, 1, 1);
    ++grid_row;

    /* update account parameters if model is updated */
    priv->account_updated = QObject::connect(
        priv->account,
        &Account::changed,
        [=] () {
            if (strcmp(alias.constData(), "IP2IP") != 0) {
                gtk_entry_set_text(GTK_ENTRY(entry_alias), priv->account->alias().toLocal8Bit().constData());
                gtk_entry_set_text(GTK_ENTRY(entry_username), priv->account->username().toLocal8Bit().constData());
                gtk_entry_set_text(GTK_ENTRY(entry_hostname), priv->account->hostname().toLocal8Bit().constData());

                if (priv->account->protocol() != Account::Protocol::RING) {
                    gtk_entry_set_text(GTK_ENTRY(entry_password), priv->account->password().toLocal8Bit().constData());
                    gtk_entry_set_text(GTK_ENTRY(entry_proxy), priv->account->proxy().toLocal8Bit().constData());
                    gtk_entry_set_text(GTK_ENTRY(entry_voicemail), priv->account->mailbox().toLocal8Bit().constData());
                }
            }

            gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_autoanswer), priv->account->isAutoAnswer());
            gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_upnp), priv->account->isUpnpEnabled());
             gtk_toggle_button_set_active(
                priv->account->DTMFType() == DtmfType::OverRtp ?
                    GTK_TOGGLE_BUTTON(radiobutton_dtmf_rtp) : GTK_TOGGLE_BUTTON(radiobutton_dtmf_sip),
                TRUE);
        }
    );

    gtk_widget_show_all(priv->grid_parameters);

}