Almost completed account creation process

This commit is contained in:
Pierre Pronchery 2006-11-05 22:10:54 +00:00
parent a0367b6ed1
commit f6685deaf9
3 changed files with 91 additions and 34 deletions

View File

@ -49,6 +49,7 @@ Account * account_new(char const * type, char const * name)
} }
free(filename); free(filename);
account->title = NULL; account->title = NULL;
account->identity = NULL;
return account; return account;
} }

View File

@ -8,6 +8,12 @@
/* types */ /* types */
typedef struct _AccountIdentity
{
char * from;
char * email;
} AccountIdentity;
typedef enum _AccountConfigType typedef enum _AccountConfigType
{ {
ACT_NONE = 0, ACT_NONE = 0,
@ -46,10 +52,12 @@ typedef struct _AccountPlugin
AccountConfig * config; AccountConfig * config;
AccountFolder ** (*folders)(void); AccountFolder ** (*folders)(void);
} AccountPlugin; } AccountPlugin;
typedef struct _Account typedef struct _Account
{ {
char * name; char * name;
char * title; char * title;
AccountIdentity * identity;
void * handle; void * handle;
AccountPlugin * plugin; AccountPlugin * plugin;
} Account; } Account;

View File

@ -27,7 +27,7 @@ static char const _license[] = "GPLv2";
const char * title[3] = const char * title[3] =
{ {
"Account type", "Account settings", "Account confirmation" "New account", "Account settings", "Account confirmation"
}; };
@ -298,6 +298,8 @@ void on_preferences_cancel(GtkWidget * widget, gpointer data)
typedef struct _AccountData typedef struct _AccountData
{ {
Mailer * mailer; Mailer * mailer;
char * title;
AccountIdentity identity;
unsigned int available; unsigned int available;
Account * account; Account * account;
GtkWidget * settings; GtkWidget * settings;
@ -333,13 +335,16 @@ static void _on_assistant_close(GtkWidget * widget, gpointer data);
static void _on_assistant_apply(GtkWidget * widget, gpointer data); static void _on_assistant_apply(GtkWidget * widget, gpointer data);
static void _on_assistant_prepare(GtkWidget * widget, GtkWidget * page, static void _on_assistant_prepare(GtkWidget * widget, GtkWidget * page,
gpointer data); gpointer data);
static void _on_account_type_change(GtkWidget * widget, gpointer data); static void _on_entry_changed(GtkWidget * widget, gpointer data);
static void _on_account_type_changed(GtkWidget * widget, gpointer data);
void on_account_new(GtkWidget * widget, gpointer data) void on_account_new(GtkWidget * widget, gpointer data)
{ {
Mailer * mailer = data; Mailer * mailer = data;
AccountData * ad; AccountData * ad;
GtkWidget * assistant; GtkWidget * assistant;
GtkWidget * vbox; GtkWidget * vbox;
GtkWidget * hbox;
GtkSizeGroup * group;
unsigned int i; unsigned int i;
if(mailer->available_cnt == 0) if(mailer->available_cnt == 0)
@ -353,6 +358,8 @@ void on_account_new(GtkWidget * widget, gpointer data)
return; return;
} }
ad->mailer = mailer; ad->mailer = mailer;
ad->title = NULL;
memset(&ad->identity, 0, sizeof(ad->identity));
ad->available = 0; ad->available = 0;
ad->account = NULL; ad->account = NULL;
assistant = gtk_assistant_new(); assistant = gtk_assistant_new();
@ -367,11 +374,43 @@ void on_account_new(GtkWidget * widget, gpointer data)
/* plug-in selection */ /* plug-in selection */
vbox = gtk_vbox_new(FALSE, 4); vbox = gtk_vbox_new(FALSE, 4);
gtk_container_set_border_width(GTK_CONTAINER(vbox), 4); gtk_container_set_border_width(GTK_CONTAINER(vbox), 4);
widget = gtk_label_new("Please select the type of account\n" group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
"you want to create now:"), hbox = gtk_hbox_new(FALSE, 4);
widget = gtk_label_new("Account title:");
gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5);
gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
widget = gtk_entry_new();
g_signal_connect(G_OBJECT(widget), "changed", G_CALLBACK(
_on_entry_changed), &ad->title);
gtk_size_group_add_widget(group, widget);
gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
hbox = gtk_hbox_new(FALSE, 4);
widget = gtk_label_new("Your name:");
gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5);
gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
widget = gtk_entry_new();
g_signal_connect(G_OBJECT(widget), "changed", G_CALLBACK(
_on_entry_changed), &(ad->identity.from));
gtk_size_group_add_widget(group, widget);
gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
hbox = gtk_hbox_new(FALSE, 4);
widget = gtk_label_new("e-mail address:");
gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5);
gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
widget = gtk_entry_new();
g_signal_connect(G_OBJECT(widget), "changed", G_CALLBACK(
_on_entry_changed), &ad->identity.email);
gtk_size_group_add_widget(group, widget);
gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
hbox = gtk_hbox_new(FALSE, 4);
widget = gtk_label_new("Type of account:");
gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5);
gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
widget = gtk_combo_box_new_text(); widget = gtk_combo_box_new_text();
gtk_size_group_add_widget(group, widget);
/* XXX this works because there is no plug-in list reload /* XXX this works because there is no plug-in list reload
* would it be implemented this will need validation later */ * would it be implemented this will need validation later */
for(i = 0; i < mailer->available_cnt; i++) for(i = 0; i < mailer->available_cnt; i++)
@ -379,8 +418,9 @@ void on_account_new(GtkWidget * widget, gpointer data)
mailer->available[i].title); mailer->available[i].title);
gtk_combo_box_set_active(GTK_COMBO_BOX(widget), 0); gtk_combo_box_set_active(GTK_COMBO_BOX(widget), 0);
g_signal_connect(G_OBJECT(widget), "changed", G_CALLBACK( g_signal_connect(G_OBJECT(widget), "changed", G_CALLBACK(
_on_account_type_change), ad); _on_account_type_changed), ad);
gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
gtk_widget_show_all(vbox); gtk_widget_show_all(vbox);
gtk_assistant_append_page(GTK_ASSISTANT(assistant), vbox); gtk_assistant_append_page(GTK_ASSISTANT(assistant), vbox);
gtk_assistant_set_page_title(GTK_ASSISTANT(assistant), vbox, title[0]); gtk_assistant_set_page_title(GTK_ASSISTANT(assistant), vbox, title[0]);
@ -599,7 +639,7 @@ static void _on_assistant_apply(GtkWidget * widget, gpointer data)
} }
static GtkWidget * _account_config_update(AccountConfig * config); static GtkWidget * _account_config_update(AccountConfig * config);
static GtkWidget * _account_config_display(AccountConfig * config); static GtkWidget * _account_display(Account * account);
static void _on_assistant_prepare(GtkWidget * widget, GtkWidget * page, static void _on_assistant_prepare(GtkWidget * widget, GtkWidget * page,
gpointer data) gpointer data)
{ {
@ -619,6 +659,7 @@ static void _on_assistant_prepare(GtkWidget * widget, GtkWidget * page,
account_delete(ad->account); account_delete(ad->account);
ac = &ad->mailer->available[ad->available]; ac = &ad->mailer->available[ad->available];
ad->account = account_new("account", ac->name); ad->account = account_new("account", ac->name);
account_set_title(ad->account, ad->title);
} }
if(ad->account == NULL) if(ad->account == NULL)
ad->settings = gtk_label_new("Could not load plug-in"); ad->settings = gtk_label_new("Could not load plug-in");
@ -626,15 +667,13 @@ static void _on_assistant_prepare(GtkWidget * widget, GtkWidget * page,
{ {
ad->settings = _account_config_update( ad->settings = _account_config_update(
ad->account->plugin->config); ad->account->plugin->config);
account_set_title(ad->account, ac->title);
} }
gtk_container_add(GTK_CONTAINER(page), ad->settings); gtk_container_add(GTK_CONTAINER(page), ad->settings);
} }
else if(i == 2) else if(i == 2)
{ {
gtk_container_remove(GTK_CONTAINER(page), ad->confirm); gtk_container_remove(GTK_CONTAINER(page), ad->confirm);
ad->confirm = _account_config_display( ad->confirm = _account_display(ad->account);
ad->account->plugin->config);
gtk_container_add(GTK_CONTAINER(page), ad->confirm); gtk_container_add(GTK_CONTAINER(page), ad->confirm);
} }
old = i; old = i;
@ -648,8 +687,6 @@ static GtkWidget * _update_uint16(AccountConfig * config, GtkSizeGroup * group);
static GtkWidget * _update_boolean(AccountConfig * config); static GtkWidget * _update_boolean(AccountConfig * config);
static GtkWidget * _account_config_update(AccountConfig * config) static GtkWidget * _account_config_update(AccountConfig * config)
/* FIXME append ":" to labels */ /* FIXME append ":" to labels */
/* FIXME consider working on a temporary plug-in instance instead
* of the available ones */
{ {
GtkWidget * vbox; GtkWidget * vbox;
GtkSizeGroup * group; GtkSizeGroup * group;
@ -680,6 +717,8 @@ static GtkWidget * _account_config_update(AccountConfig * config)
case ACT_BOOLEAN: case ACT_BOOLEAN:
widget = _update_boolean(&config[i]); widget = _update_boolean(&config[i]);
break; break;
default: /* should not happen */
continue;
} }
gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, TRUE, 0);
} }
@ -687,7 +726,6 @@ static GtkWidget * _account_config_update(AccountConfig * config)
return vbox; return vbox;
} }
static void _on_string_changed(GtkWidget * widget, gpointer data);
static GtkWidget * _update_string(AccountConfig * config, GtkSizeGroup * group) static GtkWidget * _update_string(AccountConfig * config, GtkSizeGroup * group)
{ {
GtkWidget * hbox; GtkWidget * hbox;
@ -702,27 +740,11 @@ static GtkWidget * _update_string(AccountConfig * config, GtkSizeGroup * group)
gtk_entry_set_text(GTK_ENTRY(widget), config->value); gtk_entry_set_text(GTK_ENTRY(widget), config->value);
gtk_size_group_add_widget(group, widget); gtk_size_group_add_widget(group, widget);
g_signal_connect(G_OBJECT(widget), "changed", G_CALLBACK( g_signal_connect(G_OBJECT(widget), "changed", G_CALLBACK(
_on_string_changed), &config->value); _on_entry_changed), &config->value);
gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0);
return hbox; return hbox;
} }
static void _on_string_changed(GtkWidget * widget, gpointer data)
{
const char * text;
char ** value = data;
char * p;
text = gtk_entry_get_text(GTK_ENTRY(widget));
if((p = realloc(*value, strlen(text)+1)) == NULL)
{
mailer_error(NULL, strerror(errno), 0);
return;
}
*value = p;
strcpy(p, text);
}
static GtkWidget * _update_password(AccountConfig * config, static GtkWidget * _update_password(AccountConfig * config,
GtkSizeGroup * group) GtkSizeGroup * group)
{ {
@ -739,7 +761,7 @@ static GtkWidget * _update_password(AccountConfig * config,
gtk_entry_set_text(GTK_ENTRY(widget), config->value); gtk_entry_set_text(GTK_ENTRY(widget), config->value);
gtk_size_group_add_widget(group, widget); gtk_size_group_add_widget(group, widget);
g_signal_connect(G_OBJECT(widget), "changed", G_CALLBACK( g_signal_connect(G_OBJECT(widget), "changed", G_CALLBACK(
_on_string_changed), &config->value); _on_entry_changed), &config->value);
gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0);
return hbox; return hbox;
} }
@ -757,6 +779,7 @@ static GtkWidget * _update_file(AccountConfig * config, GtkSizeGroup * group)
GTK_FILE_CHOOSER_ACTION_OPEN); GTK_FILE_CHOOSER_ACTION_OPEN);
gtk_file_chooser_button_set_title(GTK_FILE_CHOOSER_BUTTON(widget), gtk_file_chooser_button_set_title(GTK_FILE_CHOOSER_BUTTON(widget),
config->title); config->title);
/* FIXME implement signal handler */
gtk_size_group_add_widget(group, widget); gtk_size_group_add_widget(group, widget);
gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0);
return hbox; return hbox;
@ -816,9 +839,11 @@ static GtkWidget * _display_uint16(AccountConfig * config,
GtkSizeGroup * group); GtkSizeGroup * group);
static GtkWidget * _display_boolean(AccountConfig * config, static GtkWidget * _display_boolean(AccountConfig * config,
GtkSizeGroup * group); GtkSizeGroup * group);
static GtkWidget * _account_config_display(AccountConfig * config) static GtkWidget * _account_display(Account * account)
/* FIXME append ":" to labels */ /* FIXME append ":" to labels */
{ {
AccountConfig * config = account->plugin->config;
AccountConfig p;
GtkWidget * vbox; GtkWidget * vbox;
GtkSizeGroup * group; GtkSizeGroup * group;
GtkWidget * widget; GtkWidget * widget;
@ -827,6 +852,11 @@ static GtkWidget * _account_config_display(AccountConfig * config)
vbox = gtk_vbox_new(FALSE, 4); vbox = gtk_vbox_new(FALSE, 4);
gtk_container_set_border_width(GTK_CONTAINER(vbox), 4); gtk_container_set_border_width(GTK_CONTAINER(vbox), 4);
group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
p.name = NULL;
p.title = "Account title";
p.value = account->title;
widget = _display_string(&p, group);
gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, TRUE, 0);
for(i = 0; config[i].name != NULL; i++) for(i = 0; config[i].name != NULL; i++)
{ {
switch(config[i].type) switch(config[i].type)
@ -848,6 +878,8 @@ static GtkWidget * _account_config_display(AccountConfig * config)
case ACT_BOOLEAN: case ACT_BOOLEAN:
widget = _display_boolean(&config[i], group); widget = _display_boolean(&config[i], group);
break; break;
default: /* should not happen */
continue;
} }
gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, TRUE, 0);
} }
@ -931,7 +963,23 @@ static GtkWidget * _display_boolean(AccountConfig * config,
return hbox; return hbox;
} }
static void _on_account_type_change(GtkWidget * widget, gpointer data) static void _on_entry_changed(GtkWidget * widget, gpointer data)
{
const char * text;
char ** value = data;
char * p;
text = gtk_entry_get_text(GTK_ENTRY(widget));
if((p = realloc(*value, strlen(text)+1)) == NULL)
{
mailer_error(NULL, strerror(errno), 0);
return;
}
*value = p;
strcpy(p, text);
}
static void _on_account_type_changed(GtkWidget * widget, gpointer data)
{ {
AccountData * ad = data; AccountData * ad = data;