diff options
Diffstat (limited to 'mail/em-mailer-prefs.c')
-rw-r--r-- | mail/em-mailer-prefs.c | 308 |
1 files changed, 246 insertions, 62 deletions
diff --git a/mail/em-mailer-prefs.c b/mail/em-mailer-prefs.c index b8c3d7fb59..991c684d10 100644 --- a/mail/em-mailer-prefs.c +++ b/mail/em-mailer-prefs.c @@ -54,6 +54,8 @@ #include <gtk/gtkoptionmenu.h> #include <gtk/gtkmenuitem.h> +#include "libedataserverui/e-cell-renderer-color.h" + #include "e-util/e-util-private.h" #include "mail-config.h" @@ -182,57 +184,254 @@ citation_color_set (GtkColorButton *color_button, EMMailerPrefs *prefs) spec, NULL); } +enum { + LABEL_LIST_COLUMN_COLOR, + LABEL_LIST_COLUMN_TAG, + LABEL_LIST_COLUMN_NAME +}; + static void -labels_changed (EMMailerPrefs *prefs) +label_name_edited_cb (GtkCellRendererText *cell, gchar *path_string, gchar *new_text, EMMailerPrefs *prefs) { - GSList *l, *n, *list = NULL; - const char *cstring; - char *string; - int i; + GtkTreeModel *model; + GtkTreeIter iter; - for (i = 4; i >= 0; i--) { - GdkColor color; + model = gtk_tree_view_get_model (GTK_TREE_VIEW (prefs->label_tree)); + + gtk_tree_model_get_iter_from_string (model, &iter, path_string); + + g_strstrip (new_text); + + /* allow only nonempty texts and always strip spaces there */ + if (new_text && *new_text) { + gchar *tag = NULL; + + gtk_tree_model_get (model, &iter, LABEL_LIST_COLUMN_TAG, &tag, -1); + + gtk_list_store_set (GTK_LIST_STORE (model), &iter, LABEL_LIST_COLUMN_NAME, new_text, -1); + mail_config_set_label_name (tag, new_text); - cstring = gtk_entry_get_text (prefs->labels[i].name); - gtk_color_button_get_color (prefs->labels[i].color, &color); - string = g_strdup_printf ("%s:#%04x%04x%04x", cstring, - color.red, color.green, color.blue); - list = g_slist_prepend (list, string); + g_free (tag); } +} + +static void +label_sensitive_buttons (EMMailerPrefs *prefs) +{ + gboolean can_remove = FALSE, have_selected = FALSE, locked; + + g_return_if_fail (prefs); + + /* it's not sensitive if it's locked for updates */ + locked = !GTK_WIDGET_IS_SENSITIVE (prefs->label_tree); - gconf_client_set_list (prefs->gconf, "/apps/evolution/mail/labels", GCONF_VALUE_STRING, list, NULL); + if (!locked) { + GtkTreeSelection *selection; + GtkTreeModel *model; + GtkTreeIter iter; - l = list; - while (l != NULL) { - n = l->next; - g_free (l->data); - g_slist_free_1 (l); - l = n; + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (prefs->label_tree)); + if (gtk_tree_selection_get_selected (selection, &model, &iter)) { + gchar *tag = NULL; + + gtk_tree_model_get (model, &iter, LABEL_LIST_COLUMN_TAG, &tag, -1); + + can_remove = tag && !mail_config_is_system_label (tag); + have_selected = TRUE; + + g_free (tag); + } } + + gtk_widget_set_sensitive (prefs->label_remove, !locked && can_remove); + gtk_widget_set_sensitive (prefs->label_color, !locked && have_selected); } static void -label_color_set (GtkWidget *widget, EMMailerPrefs *prefs) +label_tree_cursor_changed (GtkWidget *widget, gpointer user_data) { - labels_changed (prefs); + label_sensitive_buttons (user_data); +} + +static GtkListStore * +init_label_tree (GtkWidget *label_tree, EMMailerPrefs *prefs, gboolean locked) +{ + GtkListStore *store; + GSList *labels; + GtkCellRenderer *renderer; + gint col; + + g_return_val_if_fail (label_tree != NULL, NULL); + g_return_val_if_fail (prefs != NULL, NULL); + + store = gtk_list_store_new (3, GDK_TYPE_COLOR, G_TYPE_STRING, G_TYPE_STRING); + gtk_tree_view_set_model (GTK_TREE_VIEW (label_tree), GTK_TREE_MODEL (store)); + + renderer = e_cell_renderer_color_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (label_tree), -1, _("Color"), renderer, "color", LABEL_LIST_COLUMN_COLOR, NULL); + + renderer = gtk_cell_renderer_text_new (); + col = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (label_tree), -1, _("Tag"), renderer, "text", LABEL_LIST_COLUMN_TAG, NULL); + g_object_set (G_OBJECT (renderer), "editable", FALSE, NULL); + gtk_tree_view_column_set_visible (gtk_tree_view_get_column (GTK_TREE_VIEW (label_tree), col - 1), FALSE); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (label_tree), -1, _("Name"), renderer, "text", LABEL_LIST_COLUMN_NAME, NULL); + g_object_set (G_OBJECT (renderer), "editable", !locked, NULL); + + if (!locked) { + g_signal_connect (renderer, "edited", G_CALLBACK (label_name_edited_cb), prefs); + g_signal_connect (label_tree, "cursor-changed", G_CALLBACK (label_tree_cursor_changed), prefs); + } + + for (labels = mail_config_get_labels (); labels; labels = labels->next) { + GdkColor color; + GtkTreeIter iter; + MailConfigLabel *label = labels->data; + + if (label->colour) + gdk_color_parse (label->colour, &color); + + gtk_list_store_append (store, &iter); + gtk_list_store_set ( + store, &iter, + LABEL_LIST_COLUMN_COLOR, label->colour ? &color : NULL, + LABEL_LIST_COLUMN_NAME, label->name, + LABEL_LIST_COLUMN_TAG, label->tag, + -1); + } + + label_sensitive_buttons (prefs); + + return store; } static void -label_entry_changed (GtkEntry *entry, EMMailerPrefs *prefs) +label_add_cb (GtkWidget *widget, gpointer user_data) { - labels_changed (prefs); + EMMailerPrefs *prefs = user_data; + GtkTreeModel *model; + GtkTreeIter iter; + char *tag, *name; + int tagid; + GtkTreePath *path; + GdkColor gray; + + g_return_if_fail (prefs != NULL); + + tag = mail_config_get_next_label_tag (&tagid); + + if (!tag) + return; + + memset (&gray, 0xCD, sizeof (GdkColor)); + name = g_strdup_printf ("%s %d", _("Label"), tagid); + model = gtk_tree_view_get_model (GTK_TREE_VIEW (prefs->label_tree)); + + if (mail_config_add_label (tag, name, &gray)) { + gtk_list_store_append (GTK_LIST_STORE (model), &iter); + gtk_list_store_set (GTK_LIST_STORE (model), &iter, + LABEL_LIST_COLUMN_COLOR, &gray, + LABEL_LIST_COLUMN_NAME, name, + LABEL_LIST_COLUMN_TAG, tag, + -1); + + path = gtk_tree_model_get_path (model, &iter); + if (path) { + GtkTreeViewColumn *focus_col = gtk_tree_view_get_column (GTK_TREE_VIEW (prefs->label_tree), LABEL_LIST_COLUMN_NAME); + + gtk_tree_view_set_cursor (GTK_TREE_VIEW (prefs->label_tree), path, focus_col, TRUE); + gtk_tree_view_row_activated (GTK_TREE_VIEW (prefs->label_tree), path, focus_col); + gtk_tree_path_free (path); + } + } + + g_free (tag); + g_free (name); } static void -restore_labels_clicked (GtkWidget *widget, gpointer user_data) +label_remove_cb (GtkWidget *widget, gpointer user_data) { - EMMailerPrefs *prefs = (EMMailerPrefs *) user_data; - int i; + EMMailerPrefs *prefs = user_data; + GtkTreeSelection *selection; + GtkTreeModel *model; + GtkTreeIter iter; + + g_return_if_fail (prefs != NULL); + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (prefs->label_tree)); + if (gtk_tree_selection_get_selected (selection, &model, &iter)) { + gchar *tag = NULL; + + gtk_tree_model_get (model, &iter, LABEL_LIST_COLUMN_TAG, &tag, -1); + + if (tag && !mail_config_is_system_label (tag)) { + gint children; + + gtk_list_store_remove (GTK_LIST_STORE (model), &iter); + mail_config_remove_label (tag); + + children = gtk_tree_model_iter_n_children (model, NULL); + if (children > 0) { + GtkTreePath *path; + + if (!gtk_list_store_iter_is_valid (GTK_LIST_STORE (model), &iter)) + gtk_tree_model_iter_nth_child (model, &iter, NULL, children - 1); + + path = gtk_tree_model_get_path (model, &iter); + if (path) { + GtkTreeViewColumn *focus_col = gtk_tree_view_get_column (GTK_TREE_VIEW (prefs->label_tree), LABEL_LIST_COLUMN_NAME); + + gtk_tree_view_set_cursor (GTK_TREE_VIEW (prefs->label_tree), path, focus_col, FALSE); + gtk_tree_view_row_activated (GTK_TREE_VIEW (prefs->label_tree), path, focus_col); + gtk_tree_path_free (path); + } + } + } + + g_free (tag); + } +} - for (i = 0; i < 5; i++) { - gtk_entry_set_text (prefs->labels[i].name, _(label_defaults[i].name)); - color_button_set_color (prefs->labels[i].color, label_defaults[i].colour); - atk_object_set_name(gtk_widget_get_accessible((GtkWidget *)prefs->labels[i].color), _(label_defaults[i].name)); +static void +label_color_cb (GtkWidget *widget, gpointer user_data) +{ + EMMailerPrefs *prefs = user_data; + GtkTreeSelection *selection; + GtkTreeModel *model; + GtkTreeIter iter; + + g_return_if_fail (prefs != NULL); + + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (prefs->label_tree)); + if (gtk_tree_selection_get_selected (selection, &model, &iter)) { + GtkWidget *dialog; + GdkColor *color = NULL, color2; + + gtk_tree_model_get (model, &iter, LABEL_LIST_COLUMN_COLOR, &color, -1); + + dialog = gtk_color_selection_dialog_new (_("Select color for label...")); + gtk_color_selection_set_current_color (GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (dialog)->colorsel), color); + + if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) { + gtk_color_selection_get_current_color (GTK_COLOR_SELECTION (GTK_COLOR_SELECTION_DIALOG (dialog)->colorsel), &color2); + + if (!color || memcmp (color, &color2, sizeof(GdkColor)) != 0) { + gchar *tag = NULL; + + gtk_tree_model_get (model, &iter, LABEL_LIST_COLUMN_TAG, &tag, -1); + gtk_list_store_set (GTK_LIST_STORE (model), &iter, LABEL_LIST_COLUMN_COLOR, &color2, -1); + + mail_config_set_label_color (tag, &color2); + + g_free (tag); + } + } + + gtk_widget_destroy (dialog); + if (color) + gdk_color_free (color); } } @@ -842,7 +1041,7 @@ create_combo_text_widget (void) { static void em_mailer_prefs_construct (EMMailerPrefs *prefs) { - GSList *list, *header_config_list, *header_add_list, *p; + GSList *header_config_list, *header_add_list, *p; GHashTable *default_header_hash; GtkWidget *toplevel; GtkTreeSelection *selection; @@ -1005,39 +1204,24 @@ em_mailer_prefs_construct (EMMailerPrefs *prefs) /* Labels... */ locked = !gconf_client_key_is_writable (prefs->gconf, "/apps/evolution/mail/labels", NULL); - i = 0; - list = mail_config_get_labels (); - while (list != NULL && i < 5) { - MailConfigLabel *label; - char *widget_name; - label = list->data; - - widget_name = g_strdup_printf ("txtLabel%d", i); - prefs->labels[i].name = GTK_ENTRY (glade_xml_get_widget (gui, widget_name)); - gtk_widget_set_sensitive ((GtkWidget *) prefs->labels[i].name, !locked); - g_free (widget_name); - - widget_name = g_strdup_printf ("colorLabel%d", i); - prefs->labels[i].color = GTK_COLOR_BUTTON (glade_xml_get_widget (gui, widget_name)); - gtk_widget_set_sensitive ((GtkWidget *) prefs->labels[i].color, !locked); - g_free (widget_name); - - gtk_entry_set_text (prefs->labels[i].name, label->name); - g_signal_connect (prefs->labels[i].name, "changed", G_CALLBACK (label_entry_changed), prefs); - - color_button_set_color (prefs->labels[i].color, label->colour); - g_signal_connect (prefs->labels[i].color, "color-set", G_CALLBACK (label_color_set), prefs); - - atk_object_set_name(gtk_widget_get_accessible((GtkWidget *)prefs->labels[i].color), label->name); - - i++; - list = list->next; + prefs->label_add = glade_xml_get_widget (gui, "labelAdd"); + prefs->label_remove = glade_xml_get_widget (gui, "labelRemove"); + prefs->label_color = glade_xml_get_widget (gui, "labelColor"); + prefs->label_tree = glade_xml_get_widget (gui, "labelTree"); + + gtk_widget_set_sensitive (prefs->label_add, !locked); + gtk_widget_set_sensitive (prefs->label_remove, !locked); + gtk_widget_set_sensitive (prefs->label_color, !locked); + gtk_widget_set_sensitive (prefs->label_tree, !locked); + + prefs->label_list_store = init_label_tree (prefs->label_tree, prefs, locked); + + if (!locked) { + g_signal_connect (G_OBJECT (prefs->label_add), "clicked", G_CALLBACK (label_add_cb), prefs); + g_signal_connect (G_OBJECT (prefs->label_remove), "clicked", G_CALLBACK (label_remove_cb), prefs); + g_signal_connect (G_OBJECT (prefs->label_color), "clicked", G_CALLBACK (label_color_cb), prefs); } - prefs->restore_labels = GTK_BUTTON (glade_xml_get_widget (gui, "cmdRestoreLabels")); - gtk_widget_set_sensitive ((GtkWidget *) prefs->restore_labels, !locked); - g_signal_connect (prefs->restore_labels, "clicked", G_CALLBACK (restore_labels_clicked), prefs); - /* headers */ locked = !gconf_client_key_is_writable (prefs->gconf, "/apps/evolution/mail/display/headers", NULL); |