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

Reply via email to