1005
file_gif_toggle_button_init (GtkBuilder *builder,
1007
gboolean initial_value,
1008
gboolean *value_pointer)
1010
GtkWidget *toggle = NULL;
1012
toggle = GTK_WIDGET (gtk_builder_get_object (builder, name));
1013
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), initial_value);
1014
g_signal_connect (toggle, "toggled",
1015
G_CALLBACK (gimp_toggle_button_update),
1022
file_gif_spin_button_int_init (GtkBuilder *builder,
1027
GtkWidget *spin_button = NULL;
1028
GtkAdjustment *adjustment = NULL;
1030
spin_button = GTK_WIDGET (gtk_builder_get_object (builder, name));
1032
adjustment = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (spin_button));
1033
gtk_adjustment_set_value (adjustment, initial_value);
1034
g_signal_connect (adjustment, "value-changed",
1035
G_CALLBACK (gimp_int_adjustment_update),
1036
&gsvals.default_delay);
1042
file_gif_combo_box_int_update_value (GtkComboBox *combo,
1047
if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (combo), &iter))
1049
gtk_tree_model_get (gtk_combo_box_get_model (GTK_COMBO_BOX (combo)),
1051
DISPOSE_STORE_VALUE_COLUMN, value,
1057
file_gif_combo_box_int_init (GtkBuilder *builder,
1061
const gchar *first_label,
1065
GtkWidget *combo = NULL;
1066
GtkListStore *store = NULL;
1067
const gchar *label = NULL;
1069
GtkTreeIter iter = { 0, };
1072
combo = GTK_WIDGET (gtk_builder_get_object (builder, name));
1073
store = GTK_LIST_STORE (gtk_combo_box_get_model (GTK_COMBO_BOX (combo)));
1076
va_start (values, first_value);
1077
for (label = first_label, value = first_value;
1079
label = va_arg (values, const gchar *), value = va_arg (values, gint))
1081
gtk_list_store_append (store, &iter);
1082
gtk_list_store_set (store, &iter,
1083
DISPOSE_STORE_VALUE_COLUMN, value,
1084
DISPOSE_STORE_LABEL_COLUMN, label,
1089
/* Set initial value */
1090
gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store),
1094
gtk_combo_box_set_active_iter (GTK_COMBO_BOX (combo), &iter);
1096
/* Arrange update of value */
1097
g_signal_connect (combo, "changed",
1098
G_CALLBACK (file_gif_combo_box_int_update_value),
984
1105
save_dialog (gint32 image_ID)
1107
GtkBuilder *builder = NULL;
1108
gchar *ui_file = NULL;
1109
GError *error = NULL;
986
1110
GtkWidget *dialog;
987
GtkWidget *main_vbox;
990
GtkWidget *spinbutton;
992
1111
GtkWidget *text_view;
993
1112
GtkTextBuffer *text_buffer;
994
1114
GtkWidget *frame;
999
GtkWidget *scrolled_window;
1000
1115
#ifdef FACEHUGGERS
1001
1116
GimpParasite *GIF2_CMNT;
1003
1118
gint32 nlayers;
1119
gboolean animation_supported = FALSE;
1006
1122
gimp_image_get_layers (image_ID, &nlayers);
1008
dialog = gimp_dialog_new (_("Save as GIF"), PLUG_IN_BINARY,
1010
gimp_standard_help_func, SAVE_PROC,
1012
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
1013
GTK_STOCK_SAVE, GTK_RESPONSE_OK,
1017
gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
1019
GTK_RESPONSE_CANCEL,
1022
gimp_window_set_transient (GTK_WINDOW (dialog));
1024
main_vbox = gtk_vbox_new (FALSE, 12);
1025
gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 12);
1026
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), main_vbox);
1027
gtk_widget_show (main_vbox);
1123
animation_supported = nlayers > 1;
1125
dialog = gimp_export_dialog_new (_("GIF"), PLUG_IN_BINARY, SAVE_PROC);
1127
/* GtkBuilder init */
1128
builder = gtk_builder_new ();
1129
ui_file = g_build_filename (gimp_data_directory (),
1130
"ui/plug-ins/plug-in-file-gif.ui",
1132
if (! gtk_builder_add_from_file (builder, ui_file, &error))
1133
g_printerr (_("Error loading UI file '%s':\n%s"),
1134
ui_file, error ? error->message : "???");
1138
gtk_box_pack_start (GTK_BOX (gimp_export_dialog_get_content_area (dialog)),
1139
GTK_WIDGET (gtk_builder_get_object (builder, "main-vbox")),
1029
1142
/* regular gif parameter settings */
1030
frame = gimp_frame_new (_("GIF Options"));
1031
gtk_box_pack_start (GTK_BOX (main_vbox), frame, TRUE, TRUE, 0);
1033
vbox = gtk_vbox_new (FALSE, 6);
1034
gtk_container_add (GTK_CONTAINER (frame), vbox);
1036
toggle = gtk_check_button_new_with_mnemonic (_("I_nterlace"));
1037
gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
1038
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), gsvals.interlace);
1039
gtk_widget_show (toggle);
1041
g_signal_connect (toggle, "toggled",
1042
G_CALLBACK (gimp_toggle_button_update),
1045
hbox = gtk_hbox_new (FALSE, 6);
1046
gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
1048
align = gtk_alignment_new (0.0, 0.0, 0, 0);
1049
gtk_box_pack_start (GTK_BOX (hbox), align, FALSE, FALSE, 0);
1050
gtk_widget_show (align);
1052
toggle = gtk_check_button_new_with_mnemonic (_("_GIF comment:"));
1053
gtk_container_add (GTK_CONTAINER (align), toggle);
1054
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle),
1055
gsvals.save_comment);
1056
gtk_widget_show (toggle);
1058
g_signal_connect (toggle, "toggled",
1059
G_CALLBACK (gimp_toggle_button_update),
1060
&gsvals.save_comment);
1062
/* the comment text_view in a gtk_scrolled_window */
1063
scrolled_window = gtk_scrolled_window_new (NULL, NULL);
1064
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window),
1066
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
1067
GTK_POLICY_AUTOMATIC,
1068
GTK_POLICY_AUTOMATIC);
1069
gtk_box_pack_start (GTK_BOX (hbox), scrolled_window, TRUE, TRUE, 0);
1070
gtk_widget_show (scrolled_window);
1072
text_buffer = gtk_text_buffer_new (NULL);
1074
text_view = gtk_text_view_new_with_buffer (text_buffer);
1075
gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (text_view), GTK_WRAP_WORD);
1076
gtk_container_add (GTK_CONTAINER (scrolled_window), text_view);
1077
gtk_widget_show (text_view);
1079
g_object_unref (text_buffer);
1143
file_gif_toggle_button_init (builder, "interlace",
1144
gsvals.interlace, &gsvals.interlace);
1145
file_gif_toggle_button_init (builder, "save-comment",
1146
gsvals.save_comment, &gsvals.save_comment);
1147
file_gif_toggle_button_init (builder, "as-animation",
1148
gsvals.as_animation, &gsvals.as_animation);
1150
text_view = GTK_WIDGET (gtk_builder_get_object (builder, "comment"));
1151
text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view));
1081
1153
if (globalcomment)
1082
1154
g_free (globalcomment);
1084
1156
#ifdef FACEHUGGERS
1085
GIF2_CMNT = gimp_image_parasite_find (image_ID, "gimp-comment");
1157
GIF2_CMNT = gimp_image_get_parasite (image_ID, "gimp-comment");
1087
1159
globalcomment = g_strndup (gimp_parasite_data (GIF2_CMNT),
1088
1160
gimp_parasite_data_size (GIF2_CMNT));
1101
1173
G_CALLBACK (comment_entry_callback),
1104
gtk_widget_show (hbox);
1106
gtk_widget_show (vbox);
1107
gtk_widget_show (frame);
1109
1176
/* additional animated gif parameter settings */
1110
frame = gimp_frame_new (_("Animated GIF Options"));
1111
gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0);
1113
vbox = gtk_vbox_new (FALSE, 6);
1114
gtk_container_add (GTK_CONTAINER (frame), vbox);
1116
toggle = gtk_check_button_new_with_mnemonic (_("_Loop forever"));
1117
gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
1118
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), gsvals.loop);
1119
gtk_widget_show (toggle);
1121
g_signal_connect (toggle, "toggled",
1122
G_CALLBACK (gimp_toggle_button_update),
1177
file_gif_toggle_button_init (builder, "loop-forever",
1178
gsvals.loop, &gsvals.loop);
1125
1180
/* default_delay entry field */
1126
hbox = gtk_hbox_new (FALSE, 6);
1127
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
1129
label = gtk_label_new_with_mnemonic (_("_Delay between frames where unspecified:"));
1130
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
1131
gtk_widget_show (label);
1133
spinbutton = gimp_spin_button_new (&adj, gsvals.default_delay,
1134
0, 65000, 10, 100, 0, 1, 0);
1135
gtk_box_pack_start (GTK_BOX (hbox), spinbutton, FALSE, FALSE, 0);
1136
gtk_widget_show (spinbutton);
1138
gtk_label_set_mnemonic_widget (GTK_LABEL (label), spinbutton);
1140
g_signal_connect (adj, "value-changed",
1141
G_CALLBACK (gimp_int_adjustment_update),
1142
&gsvals.default_delay);
1144
label = gtk_label_new (_("milliseconds"));
1145
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
1146
gtk_widget_show (label);
1148
gtk_widget_show (hbox);
1181
file_gif_spin_button_int_init (builder, "delay-spin",
1182
gsvals.default_delay, &gsvals.default_delay);
1150
1184
/* Disposal selector */
1151
hbox = gtk_hbox_new (FALSE, 6);
1152
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
1154
label = gtk_label_new_with_mnemonic (_("_Frame disposal where unspecified:"));
1155
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
1156
gtk_widget_show (label);
1158
combo = gimp_int_combo_box_new (_("I don't care"),
1159
DISPOSE_UNSPECIFIED,
1160
_("Cumulative layers (combine)"),
1162
_("One frame per layer (replace)"),
1165
gimp_int_combo_box_set_active (GIMP_INT_COMBO_BOX (combo),
1166
gsvals.default_dispose);
1168
gtk_label_set_mnemonic_widget (GTK_LABEL (label), combo);
1170
g_signal_connect (combo, "changed",
1171
G_CALLBACK (gimp_int_combo_box_get_active),
1172
&gsvals.default_dispose);
1174
gtk_box_pack_start (GTK_BOX (hbox), combo, FALSE, FALSE, 0);
1175
gtk_widget_show (combo);
1185
file_gif_combo_box_int_init (builder, "dispose-combo",
1186
gsvals.default_dispose, &gsvals.default_dispose,
1188
DISPOSE_UNSPECIFIED,
1189
_("Cumulative layers (combine)"),
1191
_("One frame per layer (replace)"),
1177
1195
/* The "Always use default values" toggles */
1178
toggle = gtk_check_button_new_with_mnemonic (_("_Use delay entered above for all frames"));
1179
gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
1180
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle),
1181
gsvals.always_use_default_delay);
1182
gtk_widget_show (toggle);
1184
g_signal_connect (G_OBJECT (toggle), "toggled",
1185
G_CALLBACK (gimp_toggle_button_update),
1186
&gsvals.always_use_default_delay);
1188
toggle = gtk_check_button_new_with_mnemonic (_("U_se disposal entered above for all frames"));
1189
gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
1190
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle),
1191
gsvals.always_use_default_dispose);
1192
gtk_widget_show (toggle);
1194
g_signal_connect (G_OBJECT (toggle), "toggled",
1195
G_CALLBACK (gimp_toggle_button_update),
1196
&gsvals.always_use_default_dispose);
1198
gtk_widget_show (hbox);
1199
gtk_widget_show (vbox);
1201
/* If the image has only one layer it can't be animated, so
1202
desensitize the animation options. */
1205
gtk_widget_set_sensitive (frame, FALSE);
1207
gtk_widget_show (frame);
1196
file_gif_toggle_button_init (builder, "use-default-delay",
1197
gsvals.always_use_default_delay,
1198
&gsvals.always_use_default_delay);
1199
file_gif_toggle_button_init (builder, "use-default-dispose",
1200
gsvals.always_use_default_dispose,
1201
&gsvals.always_use_default_dispose);
1203
frame = GTK_WIDGET (gtk_builder_get_object (builder, "animation-frame"));
1204
toggle = GTK_WIDGET (gtk_builder_get_object (builder, "as-animation"));
1205
gtk_widget_set_sensitive (toggle, animation_supported);
1206
if (! animation_supported)
1207
gimp_help_set_help_data (toggle,
1208
_("You can only export as animation when the "
1209
"image has more than one layer. The image "
1210
"you are trying to export only has one "
1214
g_object_bind_property (toggle, "active",
1216
G_BINDING_SYNC_CREATE);
1208
1218
gtk_widget_show (dialog);
1210
1220
run = (gimp_dialog_run (GIMP_DIALOG (dialog)) == GTK_RESPONSE_OK);