The UI department (er, me :) thinks this sounds like a nice, useful, logical change.
(I can't comment on the way it is implemented, of course, but I do think that the behavior it provides is desirable.) -Anna On Wed, 2003-01-22 at 14:51, Jeffrey Stedfast wrote: > http://bugzilla.ximian.com/show_bug.cgi?id=3862 > > This is now doable so I went ahead and implemented it. Ettore thought > that since this is a UI change that I should bring it up on the list, so > here we are. > > The other option, of course, is to just leave things sty the way they > are where the composer owns a "copy" of the accounts that existed at the > time that the composer was instantiated. > > Jeff > > ______________________________________________________________________ > > ? mail/accounts.xml > ? mail/evolution-mail-account.schemas > ? mail/fb.c > ? mail/mail-account-list.h > ? mail/mail-account.c > ? mail/mail-account.h > Index: composer/ChangeLog > =================================================================== > RCS file: /cvs/gnome/evolution/composer/ChangeLog,v > retrieving revision 1.486 > diff -u -r1.486 ChangeLog > --- composer/ChangeLog 17 Jan 2003 23:32:07 -0000 1.486 > +++ composer/ChangeLog 22 Jan 2003 19:41:40 -0000 > @@ -1,3 +1,17 @@ > +2003-01-22 Jeffrey Stedfast <[EMAIL PROTECTED]> > + > + * e-msg-composer-hdrs.c (init): Get the list of accounts here and > + ref the account-list. > + (destroy): Unref the accounts list here. > + (create_from_optionmenu): Connect to the added/changed/removed > + account-list signals here. > + (account_added_cb): New callback function that adds the newly > + added account to the from-dropdown menu. > + (account_changed_cb): New callback that changes the label for the > + account that got changed in the dropdown menu. > + (account_removed_cb): Removes the account from the from dropdown > + menu. > + > 2003-01-17 Jeffrey Stedfast <[EMAIL PROTECTED]> > > * evolution-composer.c (impl_Composer_set_headers): Updated to use > Index: composer/e-msg-composer-hdrs.c > =================================================================== > RCS file: /cvs/gnome/evolution/composer/e-msg-composer-hdrs.c,v > retrieving revision 1.103 > diff -u -r1.103 e-msg-composer-hdrs.c > --- composer/e-msg-composer-hdrs.c 17 Jan 2003 23:32:07 -0000 1.103 > +++ composer/e-msg-composer-hdrs.c 22 Jan 2003 19:41:40 -0000 > @@ -80,6 +80,7 @@ > /* The tooltips. */ > GtkTooltips *tooltips; > > + EAccountList *accounts; > GSList *from_options; > > /* Standard headers. */ > @@ -189,17 +190,115 @@ > g_signal_emit (hdrs, signals [FROM_CHANGED], 0); > } > > +static void > +account_added_cb (EAccountList *accounts, EAccount *account, EMsgComposerHdrs *hdrs) > +{ > + GtkWidget *item, *menu, *omenu, *toplevel; > + char *label; > + > + omenu = e_msg_composer_hdrs_get_from_omenu (hdrs); > + menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (omenu)); > + > + label = g_strdup_printf ("%s <%s>", account->id->name, account->id->address); > + item = gtk_menu_item_new_with_label (label); > + gtk_widget_show (item); > + g_free (label); > + > + g_object_ref (account); > + g_object_set_data ((GObject *) item, "account", account); > + g_signal_connect (item, "activate", G_CALLBACK (from_changed), hdrs); > + > + /* this is so we can later set which one we want */ > + hdrs->priv->from_options = g_slist_append (hdrs->priv->from_options, item); > + > + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); > + > + toplevel = gtk_widget_get_toplevel ((GtkWidget *) hdrs); > + gtk_widget_set_sensitive (toplevel, TRUE); > +} > + > +static void > +account_changed_cb (EAccountList *accounts, EAccount *account, EMsgComposerHdrs >*hdrs) > +{ > + GtkWidget *item, *label; > + EAccount *acnt; > + GSList *node; > + char *text; > + > + node = hdrs->priv->from_options; > + while (node != NULL) { > + item = node->data; > + acnt = g_object_get_data ((GObject *) item, "account"); > + if (acnt == account) { > + text = g_strdup_printf ("%s <%s>", account->id->name, >account->id->address); > + label = gtk_bin_get_child ((GtkBin *) item); > + gtk_label_set_text ((GtkLabel *) label, text); > + g_free (text); > + break; > + } > + > + node = node->next; > + } > +} > + > +static void > +account_removed_cb (EAccountList *accounts, EAccount *account, EMsgComposerHdrs >*hdrs) > +{ > + struct _EMsgComposerHdrsPrivate *priv = hdrs->priv; > + GtkWidget *item, *omenu, *toplevel, *dialog; > + EAccount *acnt; > + GSList *node; > + > + node = priv->from_options; > + while (node != NULL) { > + item = node->data; > + acnt = g_object_get_data ((GObject *) item, "account"); > + if (acnt == account) { > + if (hdrs->account == account) > + hdrs->account = NULL; > + > + priv->from_options = g_slist_remove_link (priv->from_options, >node); > + g_slist_free_1 (node); > + g_object_unref (account); > + gtk_widget_destroy (item); > + break; > + } > + > + node = node->next; > + } > + > + if (hdrs->account == NULL) { > + if (priv->from_options) { > + /* the previously selected account was removed, > + default the new selection to the first account in > + the menu list */ > + omenu = e_msg_composer_hdrs_get_from_omenu (hdrs); > + > + item = priv->from_options->data; > + gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), 0); > + g_signal_emit_by_name (item, "activate", hdrs); > + } else { > + toplevel = gtk_widget_get_toplevel ((GtkWidget *) hdrs); > + gtk_widget_set_sensitive (toplevel, FALSE); > + > + dialog = gtk_message_dialog_new ((GtkWindow *) toplevel, >GTK_DIALOG_MODAL | > + >GTK_DIALOG_DESTROY_WITH_PARENT, > + GTK_MESSAGE_WARNING, >GTK_BUTTONS_OK, "%s", > + _("Hey you, dunce. You need >an account to send mail doncha know.")); > + } > + } > +} > + > static GtkWidget * > create_from_optionmenu (EMsgComposerHdrs *hdrs) > { > - GtkWidget *omenu, *menu, *first = NULL; > - EAccountList *accounts; > - EAccount *account; > - EIterator *iter; > - GPtrArray *addresses; > - GtkWidget *item, *hbox; > + struct _EMsgComposerHdrsPrivate *priv = hdrs->priv; > + GtkWidget *hbox, *omenu, *menu, *item, *first = NULL; > int i = 0, history = 0, m, matches; > + GPtrArray *addresses; > GConfClient *gconf; > + EAccount *account; > + EIterator *iter; > int index; > > omenu = gtk_option_menu_new (); > @@ -210,8 +309,7 @@ > > /* Make list of account email addresses */ > addresses = g_ptr_array_new (); > - accounts = mail_config_get_accounts (); > - iter = e_list_get_iterator ((EList *) accounts); > + iter = e_list_get_iterator ((EList *) priv->accounts); > while (e_iterator_is_valid (iter)) { > account = (EAccount *) e_iterator_get (iter); > > @@ -290,6 +388,11 @@ > > g_object_set_data ((GObject *) hbox, "from_menu", omenu); > > + /* listen for changes to the account list so we can auto-update the from menu >*/ > + g_signal_connect (priv->accounts, "account-added", G_CALLBACK >(account_added_cb), hdrs); > + g_signal_connect (priv->accounts, "account-changed", G_CALLBACK >(account_changed_cb), hdrs); > + g_signal_connect (priv->accounts, "account-removed", G_CALLBACK >(account_removed_cb), hdrs); > + > return hbox; > } > > Index: mail/ChangeLog > =================================================================== > RCS file: /cvs/gnome/evolution/mail/ChangeLog,v > retrieving revision 1.2551 > diff -u -r1.2551 ChangeLog > --- mail/ChangeLog 22 Jan 2003 16:14:14 -0000 1.2551 > +++ mail/ChangeLog 22 Jan 2003 19:41:48 -0000 > @@ -1,3 +1,12 @@ > +2003-01-22 Jeffrey Stedfast <[EMAIL PROTECTED]> > + > + * mail-config.c (mail_config_add_account): Emit the account-added > + event. > + (mail_config_remove_account): Emit the account-removed event. > + > + * mail-account-gui.c (mail_account_gui_save): Emit the changed > + event on the account-list for the changed account. > + > 2003-01-22 Radek Doulik <[EMAIL PROTECTED]> > > * mail-callbacks.c (do_mail_print): put unrealized html widget > Index: mail/mail-account-gui.c > =================================================================== > RCS file: /cvs/gnome/evolution/mail/mail-account-gui.c,v > retrieving revision 1.121 > diff -u -r1.121 mail-account-gui.c > --- mail/mail-account-gui.c 17 Jan 2003 23:31:25 -0000 1.121 > +++ mail/mail-account-gui.c 22 Jan 2003 19:41:49 -0000 > @@ -1823,6 +1823,7 @@ > gboolean > mail_account_gui_save (MailAccountGui *gui) > { > + EAccountList *accounts; > EAccount *account, *new; > CamelProvider *provider = NULL; > CamelURL *source_url = NULL, *url; > @@ -1953,8 +1954,12 @@ > e_account_import (account, new); > g_object_unref (new); > > - if (is_new) > + if (is_new) { > mail_config_add_account (account); > + } else { > + accounts = mail_config_get_accounts (); > + g_signal_emit_by_name (accounts, "account-changed", account); > + } > > /* if the account provider is something we can stick > in the folder-tree and not added by some other > Index: mail/mail-config.c > =================================================================== > RCS file: /cvs/gnome/evolution/mail/mail-config.c,v > retrieving revision 1.260 > diff -u -r1.260 mail-config.c > --- mail/mail-config.c 21 Jan 2003 19:12:37 -0000 1.260 > +++ mail/mail-config.c 22 Jan 2003 19:41:50 -0000 > @@ -849,6 +849,7 @@ > mail_config_add_account (EAccount *account) > { > e_list_append ((EList *) config->accounts, account); > + g_signal_emit_by_name (config->accounts, "account-added", account); > > mail_config_save_accounts (); > } > @@ -885,7 +886,10 @@ > gconf_client_set_int (config->gconf, >"/apps/evolution/mail/default_account", cur - 1, NULL); > } > > + g_object_ref (account); > e_list_remove ((EList *) config->accounts, account); > + g_signal_emit_by_name (config->accounts, "account-removed", account); > + g_object_unref (account); > > mail_config_save_accounts (); > } -- Anna Marie Dirks <[EMAIL PROTECTED]> _______________________________________________ evolution-hackers maillist - [EMAIL PROTECTED] http://lists.ximian.com/mailman/listinfo/evolution-hackers
