# HG changeset patch # User Mark Doliner # Date 1130220913 0 # Node ID 924c6ba240e68f09b90f8a1b2c3916467846bad7 # Parent 42b5b3015d9e76db3fb7e76fd6bd27aec840f07d [gaim-migrate @ 14102] sf patch #1335954, from Sadrul Habib Chowdhury Add "Apply" button the Saved-status dialog Is this good? committer: Tailor Script diff -r 42b5b3015d9e -r 924c6ba240e6 src/gtkprefs.c --- a/src/gtkprefs.c Tue Oct 25 05:34:13 2005 +0000 +++ b/src/gtkprefs.c Tue Oct 25 06:15:13 2005 +0000 @@ -1663,11 +1663,11 @@ "/gaim/gtk/idle/report", vbox); vbox = gaim_gtk_make_frame (ret, _("Auto-away")); - button = gaim_gtk_prefs_checkbox(_("Set away _when idle"), + button = gaim_gtk_prefs_checkbox(_("Change status when _idle"), "/core/away/away_when_idle", vbox); select = gaim_gtk_prefs_labeled_spin_button(vbox, - _("_Minutes before setting away:"), "/core/away/mins_before_away", + _("_Minutes before changing status:"), "/core/away/mins_before_away", 1, 24 * 60, sg); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(gaim_gtk_toggle_sensitive), select); @@ -1675,13 +1675,19 @@ hbox = gtk_hbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(vbox), hbox); - label = gtk_label_new_with_mnemonic(_("Away m_essage:")); + label = gtk_label_new_with_mnemonic(_("Change _status to:")); gtk_size_group_add_widget(sg, label); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(gaim_gtk_toggle_sensitive), label); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); + /* + * TODO: Need to allow users to choose a GaimSavedStatus + * to use when going idle-away. Or figure out a + * better UI for this. + */ + if (!gaim_prefs_get_bool("/core/away/away_when_idle")) { gtk_widget_set_sensitive(GTK_WIDGET(select), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(label), FALSE); diff -r 42b5b3015d9e -r 924c6ba240e6 src/gtksavedstatuses.c --- a/src/gtksavedstatuses.c Tue Oct 25 05:34:13 2005 +0000 +++ b/src/gtksavedstatuses.c Tue Oct 25 06:15:13 2005 +0000 @@ -42,6 +42,9 @@ enum { + /* A hidden column containing a pointer to the GaimStatusType */ + STATUS_WINDOW_COLUMN_STATUS, + STATUS_WINDOW_COLUMN_TITLE, STATUS_WINDOW_COLUMN_TYPE, STATUS_WINDOW_COLUMN_MESSAGE, @@ -61,6 +64,7 @@ GtkWidget *window; GtkListStore *model; GtkWidget *treeview; + GtkWidget *use_button; GtkWidget *modify_button; GtkWidget *delete_button; } StatusWindow; @@ -128,6 +132,39 @@ } static void +status_window_use_cb(GtkButton *button, StatusWindow *dialog) +{ + GtkTreeSelection *selection; + GtkTreeIter iter; + GaimSavedStatus *saved_status; + GList *list; + + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dialog->treeview)); + + if (gtk_tree_selection_count_selected_rows(selection) != 1) + /* + * This shouldn't happen because the "Use" button should have + * been grayed out. Oh well. + */ + return; + + list = gtk_tree_selection_get_selected_rows(selection, NULL); + + if (gtk_tree_model_get_iter(GTK_TREE_MODEL(dialog->model), + &iter, list->data)) + { + gtk_tree_model_get(GTK_TREE_MODEL(dialog->model), &iter, + STATUS_WINDOW_COLUMN_STATUS, &saved_status, + -1); + + gaim_savedstatus_activate(saved_status); + } + + g_list_foreach(list, (GFunc)gtk_tree_path_free, NULL); + g_list_free(list); +} + +static void status_window_add_cb(GtkButton *button, gpointer user_data) { gaim_gtk_status_editor_show(NULL); @@ -137,13 +174,9 @@ status_window_modify_foreach(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data) { - char *title; GaimSavedStatus *status; - gtk_tree_model_get(model, iter, STATUS_WINDOW_COLUMN_TITLE, &title, -1); - - status = gaim_savedstatus_find(title); - g_free(title); + gtk_tree_model_get(model, iter, STATUS_WINDOW_COLUMN_STATUS, &status, -1); gaim_gtk_status_editor_show(status); } @@ -211,7 +244,7 @@ get_selected_helper(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data) { - *((gboolean *)user_data) = TRUE; + *((gboolean *)user_data)++; } #endif @@ -219,16 +252,17 @@ status_selected_cb(GtkTreeSelection *sel, gpointer user_data) { StatusWindow *dialog = user_data; - gboolean selected = FALSE; + int num_selected; #if GTK_CHECK_VERSION(2,2,0) - selected = (gtk_tree_selection_count_selected_rows(sel) > 0); + num_selected = gtk_tree_selection_count_selected_rows(sel); #else - gtk_tree_selection_selected_foreach(sel, get_selected_helper, &selected); + gtk_tree_selection_selected_foreach(sel, get_selected_helper, &num_selected); #endif - gtk_widget_set_sensitive(dialog->modify_button, selected); - gtk_widget_set_sensitive(dialog->delete_button, selected); + gtk_widget_set_sensitive(dialog->use_button, (num_selected == 1)); + gtk_widget_set_sensitive(dialog->modify_button, (num_selected > 0)); + gtk_widget_set_sensitive(dialog->delete_button, (num_selected > 0)); } static void @@ -248,6 +282,7 @@ gtk_list_store_append(model, &iter); gtk_list_store_set(model, &iter, + STATUS_WINDOW_COLUMN_STATUS, saved_status, STATUS_WINDOW_COLUMN_TITLE, title, STATUS_WINDOW_COLUMN_TYPE, type, STATUS_WINDOW_COLUMN_MESSAGE, message, @@ -304,6 +339,7 @@ /* Create the list model */ dialog->model = gtk_list_store_new(STATUS_WINDOW_NUM_COLUMNS, + G_TYPE_POINTER, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); @@ -436,6 +472,17 @@ gtk_box_pack_end(GTK_BOX(vbox), bbox, FALSE, TRUE, 0); gtk_widget_show(bbox); + /* Use button */ + /* TODO: It might be better if the button said "Use" or "Activate" */ + button = gtk_button_new_from_stock(GTK_STOCK_APPLY); + dialog->use_button = button; + gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0); + gtk_widget_set_sensitive(button, FALSE); + gtk_widget_show(button); + + g_signal_connect(G_OBJECT(button), "clicked", + G_CALLBACK(status_window_use_cb), dialog); + /* Add button */ button = gtk_button_new_from_stock(GTK_STOCK_ADD); gtk_box_pack_start(GTK_BOX(bbox), button, FALSE, FALSE, 0);