/* GIMP - The GNU Image Manipulation Program * Copyright (C) 1995-1999 Spencer Kimball and Peter Mattis * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "config.h" #include #include #include #include "libgimpmath/gimpmath.h" #include "libgimpbase/gimpbase.h" #include "libgimpconfig/gimpconfig.h" #include "libgimpwidgets/gimpwidgets.h" #include "widgets-types.h" #include "config/gimpcoreconfig.h" #include "gegl/gimp-babl.h" #include "core/gimp.h" #include "core/gimptemplate.h" #include "gimppropwidgets.h" #include "gimptemplateeditor.h" #include "gimpwidgets-utils.h" #include "gimp-intl.h" #define SB_WIDTH 8 #define MAX_COMMENT_LENGTH 512 /* arbitrary */ enum { PROP_0, PROP_GIMP, PROP_TEMPLATE }; typedef struct _GimpTemplateEditorPrivate GimpTemplateEditorPrivate; struct _GimpTemplateEditorPrivate { Gimp *gimp; GimpTemplate *template; GtkWidget *aspect_button; gboolean block_aspect; GtkWidget *expander; GtkWidget *size_se; GtkWidget *memsize_label; GtkWidget *pixel_label; GtkWidget *more_label; GtkWidget *resolution_se; GtkWidget *chain_button; GtkWidget *precision_combo; GtkWidget *profile_combo; }; #define GET_PRIVATE(editor) \ ((GimpTemplateEditorPrivate *) gimp_template_editor_get_instance_private ((GimpTemplateEditor *) (editor))) static void gimp_template_editor_constructed (GObject *object); static void gimp_template_editor_finalize (GObject *object); static void gimp_template_editor_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec); static void gimp_template_editor_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec); static void gimp_template_editor_precision_changed (GtkWidget *widget, GimpTemplateEditor *editor); static void gimp_template_editor_aspect_callback (GtkWidget *widget, GimpTemplateEditor *editor); static void gimp_template_editor_template_notify (GimpTemplate *template, GParamSpec *param_spec, GimpTemplateEditor *editor); G_DEFINE_TYPE_WITH_PRIVATE (GimpTemplateEditor, gimp_template_editor, GTK_TYPE_BOX) #define parent_class gimp_template_editor_parent_class static void gimp_template_editor_class_init (GimpTemplateEditorClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->constructed = gimp_template_editor_constructed; object_class->finalize = gimp_template_editor_finalize; object_class->set_property = gimp_template_editor_set_property; object_class->get_property = gimp_template_editor_get_property; g_object_class_install_property (object_class, PROP_GIMP, g_param_spec_object ("gimp", NULL, NULL, GIMP_TYPE_GIMP, GIMP_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); g_object_class_install_property (object_class, PROP_TEMPLATE, g_param_spec_object ("template", NULL, NULL, GIMP_TYPE_TEMPLATE, GIMP_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); } static void gimp_template_editor_init (GimpTemplateEditor *editor) { gtk_orientable_set_orientation (GTK_ORIENTABLE (editor), GTK_ORIENTATION_VERTICAL); gtk_box_set_spacing (GTK_BOX (editor), 12); } static void gimp_template_editor_constructed (GObject *object) { GimpTemplateEditor *editor = GIMP_TEMPLATE_EDITOR (object); GimpTemplateEditorPrivate *private = GET_PRIVATE (object); GimpTemplate *template; GtkWidget *aspect_box; GtkWidget *frame; GtkWidget *hbox; GtkWidget *vbox; GtkWidget *table; GtkWidget *label; GtkAdjustment *adjustment; GtkWidget *width; GtkWidget *height; GtkWidget *xres; GtkWidget *yres; GtkWidget *combo; GtkWidget *toggle; GtkWidget *scrolled_window; GtkWidget *text_view; GtkTextBuffer *text_buffer; GtkListStore *store; GList *focus_chain = NULL; gchar *text; gint row; G_OBJECT_CLASS (parent_class)->constructed (object); gimp_assert (private->gimp != NULL); gimp_assert (private->template != NULL); template = private->template; /* Image size frame */ frame = gimp_frame_new (_("Image Size")); gtk_box_pack_start (GTK_BOX (editor), frame, FALSE, FALSE, 0); gtk_widget_show (frame); table = gtk_table_new (3, 2, FALSE); gtk_table_set_col_spacing (GTK_TABLE (table), 0, 6); gtk_table_set_row_spacings (GTK_TABLE (table), 6); gtk_table_set_row_spacing (GTK_TABLE (table), 0, 2); gtk_container_add (GTK_CONTAINER (frame), table); gtk_widget_show (table); adjustment = (GtkAdjustment *) gtk_adjustment_new (1, 1, 1, 1, 10, 0); width = gimp_spin_button_new (adjustment, 1.0, 2); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (width), TRUE); gtk_entry_set_width_chars (GTK_ENTRY (width), SB_WIDTH); adjustment = (GtkAdjustment *) gtk_adjustment_new (1, 1, 1, 1, 10, 0); height = gimp_spin_button_new (adjustment, 1.0, 2); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (height), TRUE); gtk_entry_set_width_chars (GTK_ENTRY (height), SB_WIDTH); /* the image size labels */ label = gtk_label_new_with_mnemonic (_("_Width:")); gtk_label_set_xalign (GTK_LABEL (label), 0.0); gtk_label_set_mnemonic_widget (GTK_LABEL (label), width); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0); gtk_widget_show (label); label = gtk_label_new_with_mnemonic (_("H_eight:")); gtk_label_set_xalign (GTK_LABEL (label), 0.0); gtk_label_set_mnemonic_widget (GTK_LABEL (label), height); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2, GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0); gtk_widget_show (label); /* create the sizeentry which keeps it all together */ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); gtk_table_attach_defaults (GTK_TABLE (table), hbox, 1, 2, 0, 2); gtk_widget_show (hbox); private->size_se = gimp_size_entry_new (0, gimp_template_get_unit (template), _("%p"), TRUE, FALSE, FALSE, SB_WIDTH, GIMP_SIZE_ENTRY_UPDATE_SIZE); gtk_table_set_row_spacing (GTK_TABLE (private->size_se), 0, 2); gtk_table_set_col_spacing (GTK_TABLE (private->size_se), 1, 6); gtk_box_pack_start (GTK_BOX (hbox), private->size_se, FALSE, FALSE, 0); gtk_widget_show (private->size_se); gimp_size_entry_add_field (GIMP_SIZE_ENTRY (private->size_se), GTK_SPIN_BUTTON (height), NULL); gtk_table_attach_defaults (GTK_TABLE (private->size_se), height, 0, 1, 1, 2); gtk_widget_show (height); gimp_size_entry_add_field (GIMP_SIZE_ENTRY (private->size_se), GTK_SPIN_BUTTON (width), NULL); gtk_table_attach_defaults (GTK_TABLE (private->size_se), width, 0, 1, 0, 1); gtk_widget_show (width); gimp_prop_coordinates_connect (G_OBJECT (template), "width", "height", "unit", private->size_se, NULL, gimp_template_get_resolution_x (template), gimp_template_get_resolution_y (template)); hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12); gtk_table_attach_defaults (GTK_TABLE (table), hbox, 1, 3, 2, 3); gtk_widget_show (hbox); vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0); gtk_widget_show (vbox); aspect_box = gimp_enum_icon_box_new (GIMP_TYPE_ASPECT_TYPE, "gimp", GTK_ICON_SIZE_MENU, G_CALLBACK (gimp_template_editor_aspect_callback), editor, &private->aspect_button); gtk_widget_hide (private->aspect_button); /* hide "square" */ gtk_box_pack_start (GTK_BOX (vbox), aspect_box, FALSE, FALSE, 0); gtk_widget_show (aspect_box); vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2); gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0); gtk_widget_show (vbox); private->pixel_label = gtk_label_new (NULL); gimp_label_set_attributes (GTK_LABEL (private->pixel_label), PANGO_ATTR_SCALE, PANGO_SCALE_SMALL, -1); gtk_label_set_xalign (GTK_LABEL (private->pixel_label), 0.0); gtk_box_pack_start (GTK_BOX (vbox), private->pixel_label, FALSE, FALSE, 0); gtk_widget_show (private->pixel_label); private->more_label = gtk_label_new (NULL); gimp_label_set_attributes (GTK_LABEL (private->more_label), PANGO_ATTR_SCALE, PANGO_SCALE_SMALL, -1); gtk_label_set_xalign (GTK_LABEL (private->more_label), 0.0); gtk_box_pack_start (GTK_BOX (vbox), private->more_label, FALSE, FALSE, 0); gtk_widget_show (private->more_label); #ifdef ENABLE_MEMSIZE_LABEL private->memsize_label = gtk_label_new (NULL); gimp_label_set_attributes (GTK_LABEL (private->memsize_label), PANGO_ATTR_SCALE, PANGO_SCALE_SMALL, PANGO_ATTR_WEIGHT, PANGO_WEIGHT_BOLD, -1); gtk_label_set_xalign (GTK_LABEL (private->memsize_label), 0.0); gtk_box_pack_start (GTK_BOX (vbox), private->memsize_label, FALSE, FALSE, 0); gtk_widget_show (private->memsize_label); #endif text = g_strdup_printf ("%s", _("_Advanced Options")); private->expander = g_object_new (GTK_TYPE_EXPANDER, "label", text, "use-markup", TRUE, "use-underline", TRUE, NULL); g_free (text); gtk_box_pack_start (GTK_BOX (editor), private->expander, TRUE, TRUE, 0); gtk_widget_show (private->expander); frame = gimp_frame_new (""); gtk_container_add (GTK_CONTAINER (private->expander), frame); gtk_widget_show (frame); table = gtk_table_new (9, 2, FALSE); gtk_table_set_col_spacing (GTK_TABLE (table), 0, 6); gtk_table_set_row_spacings (GTK_TABLE (table), 6); gtk_table_set_row_spacing (GTK_TABLE (table), 0, 2); gtk_container_add (GTK_CONTAINER (frame), table); gtk_widget_show (table); adjustment = (GtkAdjustment *) gtk_adjustment_new (1, 1, 1, 1, 10, 0); xres = gimp_spin_button_new (adjustment, 1.0, 2); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (xres), TRUE); gtk_entry_set_width_chars (GTK_ENTRY (xres), SB_WIDTH); adjustment = (GtkAdjustment *) gtk_adjustment_new (1, 1, 1, 1, 10, 0); yres = gimp_spin_button_new (adjustment, 1.0, 2); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (yres), TRUE); gtk_entry_set_width_chars (GTK_ENTRY (yres), SB_WIDTH); /* the resolution labels */ label = gtk_label_new_with_mnemonic (_("_X resolution:")); gtk_label_set_xalign (GTK_LABEL (label), 0.0); gtk_label_set_mnemonic_widget (GTK_LABEL (label), xres); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0); gtk_widget_show (label); label = gtk_label_new_with_mnemonic (_("_Y resolution:")); gtk_label_set_xalign (GTK_LABEL (label), 0.0); gtk_label_set_mnemonic_widget (GTK_LABEL (label), yres); gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2, GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0); gtk_widget_show (label); /* the resolution sizeentry */ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); gtk_table_attach_defaults (GTK_TABLE (table), hbox, 1, 2, 0, 2); gtk_widget_show (hbox); private->resolution_se = gimp_size_entry_new (0, gimp_template_get_resolution_unit (template), _("pixels/%s"), FALSE, FALSE, FALSE, SB_WIDTH, GIMP_SIZE_ENTRY_UPDATE_RESOLUTION); gtk_table_set_row_spacing (GTK_TABLE (private->resolution_se), 0, 2); gtk_table_set_col_spacing (GTK_TABLE (private->resolution_se), 1, 2); gtk_table_set_col_spacing (GTK_TABLE (private->resolution_se), 2, 2); gtk_box_pack_start (GTK_BOX (hbox), private->resolution_se, FALSE, FALSE, 0); gtk_widget_show (private->resolution_se); gimp_size_entry_add_field (GIMP_SIZE_ENTRY (private->resolution_se), GTK_SPIN_BUTTON (yres), NULL); gtk_table_attach_defaults (GTK_TABLE (private->resolution_se), yres, 0, 1, 1, 2); gtk_widget_show (yres); gimp_size_entry_add_field (GIMP_SIZE_ENTRY (private->resolution_se), GTK_SPIN_BUTTON (xres), NULL); gtk_table_attach_defaults (GTK_TABLE (private->resolution_se), xres, 0, 1, 0, 1); gtk_widget_show (xres); gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (private->size_se), 0, gimp_template_get_resolution_x (template), FALSE); gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (private->size_se), 1, gimp_template_get_resolution_y (template), FALSE); /* the resolution chainbutton */ private->chain_button = gimp_chain_button_new (GIMP_CHAIN_RIGHT); gtk_table_attach_defaults (GTK_TABLE (private->resolution_se), private->chain_button, 1, 2, 0, 2); gtk_widget_show (private->chain_button); gimp_prop_coordinates_connect (G_OBJECT (template), "xresolution", "yresolution", "resolution-unit", private->resolution_se, private->chain_button, 1.0, 1.0); focus_chain = g_list_prepend (focus_chain, GIMP_SIZE_ENTRY (private->resolution_se)->unitmenu); focus_chain = g_list_prepend (focus_chain, private->chain_button); focus_chain = g_list_prepend (focus_chain, yres); focus_chain = g_list_prepend (focus_chain, xres); gtk_container_set_focus_chain (GTK_CONTAINER (private->resolution_se), focus_chain); g_list_free (focus_chain); row = 2; combo = gimp_prop_enum_combo_box_new (G_OBJECT (template), "image-type", GIMP_RGB, GIMP_GRAY); gimp_table_attach_aligned (GTK_TABLE (table), 0, row++, _("Color _space:"), 0.0, 0.5, combo, 1, FALSE); /* construct the precision combo manually, instead of using * gimp_prop_enum_combo_box_new(), so that we only reset the gamma combo when * the precision is changed through the ui. see issue #3025. */ store = gimp_enum_store_new_with_range (GIMP_TYPE_COMPONENT_TYPE, GIMP_COMPONENT_TYPE_U8, GIMP_COMPONENT_TYPE_FLOAT); private->precision_combo = g_object_new (GIMP_TYPE_ENUM_COMBO_BOX, "model", store, NULL); g_object_unref (store); gimp_table_attach_aligned (GTK_TABLE (table), 0, row++, _("_Precision:"), 0.0, 0.5, private->precision_combo, 1, FALSE); gimp_int_combo_box_set_active (GIMP_INT_COMBO_BOX (private->precision_combo), gimp_babl_component_type ( gimp_template_get_precision (template))); g_signal_connect (private->precision_combo, "changed", G_CALLBACK (gimp_template_editor_precision_changed), editor); combo = gimp_prop_boolean_combo_box_new (G_OBJECT (template), "linear", _("Linear light"), _("Perceptual gamma (sRGB)")); gimp_table_attach_aligned (GTK_TABLE (table), 0, row++, _("_Gamma:"), 0.0, 0.5, combo, 1, FALSE); toggle = gimp_prop_check_button_new (G_OBJECT (template), "color-managed", _("Color _manage this image")); gimp_table_attach_aligned (GTK_TABLE (table), 0, row++, NULL, 0.0, 0.5, toggle, 1, FALSE); private->profile_combo = gimp_prop_profile_combo_box_new (G_OBJECT (template), "color-profile", NULL, _("Choose A Color Profile"), G_OBJECT (private->gimp->config), "color-profile-path"); gimp_table_attach_aligned (GTK_TABLE (table), 0, row++, _("Co_lor profile:"), 0.0, 0.5, private->profile_combo, 1, FALSE); combo = gimp_prop_enum_combo_box_new (G_OBJECT (template), "fill-type", 0, 0); gimp_table_attach_aligned (GTK_TABLE (table), 0, row++, _("_Fill with:"), 0.0, 0.5, combo, 1, FALSE); scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_IN); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); label = gimp_table_attach_aligned (GTK_TABLE (table), 0, row++, _("Comme_nt:"), 0.0, 0.0, scrolled_window, 1, FALSE); text_buffer = gimp_prop_text_buffer_new (G_OBJECT (template), "comment", MAX_COMMENT_LENGTH); text_view = gtk_text_view_new_with_buffer (text_buffer); g_object_unref (text_buffer); gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (text_view), GTK_WRAP_WORD); gtk_container_add (GTK_CONTAINER (scrolled_window), text_view); gtk_widget_show (text_view); gtk_label_set_mnemonic_widget (GTK_LABEL (label), text_view); g_signal_connect_object (template, "notify", G_CALLBACK (gimp_template_editor_template_notify), editor, 0); /* call the notify callback once to get the labels set initially */ gimp_template_editor_template_notify (template, NULL, editor); } static void gimp_template_editor_finalize (GObject *object) { GimpTemplateEditorPrivate *private = GET_PRIVATE (object); g_clear_object (&private->template); G_OBJECT_CLASS (parent_class)->finalize (object); } static void gimp_template_editor_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { GimpTemplateEditorPrivate *private = GET_PRIVATE (object); switch (property_id) { case PROP_GIMP: private->gimp = g_value_get_object (value); /* don't ref */ break; case PROP_TEMPLATE: private->template = g_value_dup_object (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void gimp_template_editor_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { GimpTemplateEditorPrivate *private = GET_PRIVATE (object); switch (property_id) { case PROP_GIMP: g_value_set_object (value, private->gimp); break; case PROP_TEMPLATE: g_value_set_object (value, private->template); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } GtkWidget * gimp_template_editor_new (GimpTemplate *template, Gimp *gimp, gboolean edit_template) { GimpTemplateEditor *editor; GimpTemplateEditorPrivate *private; g_return_val_if_fail (GIMP_IS_TEMPLATE (template), NULL); g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL); editor = g_object_new (GIMP_TYPE_TEMPLATE_EDITOR, "gimp", gimp, "template", template, NULL); private = GET_PRIVATE (editor); if (edit_template) { GtkWidget *table; GtkWidget *entry; GtkWidget *icon_picker; table = gtk_table_new (2, 2, FALSE); gtk_table_set_col_spacings (GTK_TABLE (table), 6); gtk_table_set_row_spacings (GTK_TABLE (table), 6); gtk_box_pack_start (GTK_BOX (editor), table, FALSE, FALSE, 0); gtk_box_reorder_child (GTK_BOX (editor), table, 0); gtk_widget_show (table); entry = gimp_prop_entry_new (G_OBJECT (private->template), "name", 128); gimp_table_attach_aligned (GTK_TABLE (table), 0, 0, _("_Name:"), 1.0, 0.5, entry, 1, FALSE); icon_picker = gimp_prop_icon_picker_new (GIMP_VIEWABLE (private->template), gimp); gimp_table_attach_aligned (GTK_TABLE (table), 0, 1, _("_Icon:"), 1.0, 0.5, icon_picker, 1, TRUE); } return GTK_WIDGET (editor); } GimpTemplate * gimp_template_editor_get_template (GimpTemplateEditor *editor) { g_return_val_if_fail (GIMP_IS_TEMPLATE_EDITOR (editor), NULL); return GET_PRIVATE (editor)->template; } void gimp_template_editor_show_advanced (GimpTemplateEditor *editor, gboolean expanded) { GimpTemplateEditorPrivate *private; g_return_if_fail (GIMP_IS_TEMPLATE_EDITOR (editor)); private = GET_PRIVATE (editor); gtk_expander_set_expanded (GTK_EXPANDER (private->expander), expanded); } GtkWidget * gimp_template_editor_get_size_se (GimpTemplateEditor *editor) { g_return_val_if_fail (GIMP_IS_TEMPLATE_EDITOR (editor), NULL); return GET_PRIVATE (editor)->size_se; } GtkWidget * gimp_template_editor_get_resolution_se (GimpTemplateEditor *editor) { g_return_val_if_fail (GIMP_IS_TEMPLATE_EDITOR (editor), NULL); return GET_PRIVATE (editor)->resolution_se; } GtkWidget * gimp_template_editor_get_resolution_chain (GimpTemplateEditor *editor) { g_return_val_if_fail (GIMP_IS_TEMPLATE_EDITOR (editor), NULL); return GET_PRIVATE (editor)->chain_button; } /* private functions */ static void gimp_template_editor_precision_changed (GtkWidget *widget, GimpTemplateEditor *editor) { GimpTemplateEditorPrivate *private = GET_PRIVATE (editor); GimpComponentType component_type; gimp_int_combo_box_get_active (GIMP_INT_COMBO_BOX (widget), (gint *) &component_type); g_object_set (private->template, "component-type", component_type, NULL); /* when changing this logic, also change the same switch() * in convert-precision-dialog.c */ switch (component_type) { case GIMP_COMPONENT_TYPE_U8: /* default to gamma for 8 bit */ g_object_set (private->template, "linear", FALSE, NULL); break; case GIMP_COMPONENT_TYPE_U16: case GIMP_COMPONENT_TYPE_U32: default: /* leave gamma alone by default for 16/32 bit int */ break; case GIMP_COMPONENT_TYPE_HALF: case GIMP_COMPONENT_TYPE_FLOAT: case GIMP_COMPONENT_TYPE_DOUBLE: /* default to linear for floating point */ g_object_set (private->template, "linear", TRUE, NULL); break; } } static void gimp_template_editor_set_pixels (GimpTemplateEditor *editor, GimpTemplate *template) { GimpTemplateEditorPrivate *private = GET_PRIVATE (editor); gchar *text; text = g_strdup_printf (ngettext ("%d × %d pixel", "%d × %d pixels", gimp_template_get_height (template)), gimp_template_get_width (template), gimp_template_get_height (template)); gtk_label_set_text (GTK_LABEL (private->pixel_label), text); g_free (text); } static void gimp_template_editor_aspect_callback (GtkWidget *widget, GimpTemplateEditor *editor) { GimpTemplateEditorPrivate *private = GET_PRIVATE (editor); if (! private->block_aspect && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget))) { GimpTemplate *template = private->template; gint width = gimp_template_get_width (template); gint height = gimp_template_get_height (template); gdouble xresolution = gimp_template_get_resolution_x (template); gdouble yresolution = gimp_template_get_resolution_y (template); if (width == height) { private->block_aspect = TRUE; gimp_int_radio_group_set_active (GTK_RADIO_BUTTON (private->aspect_button), GIMP_ASPECT_SQUARE); private->block_aspect = FALSE; return; } g_signal_handlers_block_by_func (template, gimp_template_editor_template_notify, editor); gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (private->size_se), 0, yresolution, FALSE); gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (private->size_se), 1, xresolution, FALSE); g_object_set (template, "width", height, "height", width, "xresolution", yresolution, "yresolution", xresolution, NULL); g_signal_handlers_unblock_by_func (template, gimp_template_editor_template_notify, editor); gimp_template_editor_set_pixels (editor, template); } } static void gimp_template_editor_template_notify (GimpTemplate *template, GParamSpec *param_spec, GimpTemplateEditor *editor) { GimpTemplateEditorPrivate *private = GET_PRIVATE (editor); GimpAspectType aspect; const gchar *desc; gchar *text; gint width; gint height; gint xres; gint yres; if (param_spec) { if (! strcmp (param_spec->name, "xresolution")) { gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (private->size_se), 0, gimp_template_get_resolution_x (template), FALSE); } else if (! strcmp (param_spec->name, "yresolution")) { gimp_size_entry_set_resolution (GIMP_SIZE_ENTRY (private->size_se), 1, gimp_template_get_resolution_y (template), FALSE); } else if (! strcmp (param_spec->name, "component-type")) { g_signal_handlers_block_by_func (private->precision_combo, gimp_template_editor_precision_changed, editor); gimp_int_combo_box_set_active ( GIMP_INT_COMBO_BOX (private->precision_combo), gimp_babl_component_type (gimp_template_get_precision (template))); g_signal_handlers_unblock_by_func (private->precision_combo, gimp_template_editor_precision_changed, editor); } } #ifdef ENABLE_MEMSIZE_LABEL text = g_format_size (gimp_template_get_initial_size (template)); gtk_label_set_text (GTK_LABEL (private->memsize_label), text); g_free (text); #endif gimp_template_editor_set_pixels (editor, template); width = gimp_template_get_width (template); height = gimp_template_get_height (template); if (width > height) aspect = GIMP_ASPECT_LANDSCAPE; else if (height > width) aspect = GIMP_ASPECT_PORTRAIT; else aspect = GIMP_ASPECT_SQUARE; private->block_aspect = TRUE; gimp_int_radio_group_set_active (GTK_RADIO_BUTTON (private->aspect_button), aspect); private->block_aspect = FALSE; gimp_enum_get_value (GIMP_TYPE_IMAGE_BASE_TYPE, gimp_template_get_base_type (template), NULL, NULL, &desc, NULL); xres = ROUND (gimp_template_get_resolution_x (template)); yres = ROUND (gimp_template_get_resolution_y (template)); if (xres != yres) text = g_strdup_printf (_("%d × %d ppi, %s"), xres, yres, desc); else text = g_strdup_printf (_("%d ppi, %s"), yres, desc); gtk_label_set_text (GTK_LABEL (private->more_label), text); g_free (text); if (! param_spec || ! strcmp (param_spec->name, "image-type") || ! strcmp (param_spec->name, "precision")) { GtkListStore *profile_store; GFile *profile; gchar *filename; filename = gimp_personal_rc_file ("profilerc"); profile_store = gimp_color_profile_store_new (filename); g_free (filename); gimp_color_profile_store_add_defaults (GIMP_COLOR_PROFILE_STORE (profile_store), private->gimp->config->color_management, gimp_template_get_base_type (template), gimp_template_get_precision (template), NULL); gtk_combo_box_set_model (GTK_COMBO_BOX (private->profile_combo), GTK_TREE_MODEL (profile_store)); g_object_unref (profile_store); g_object_get (template, "color-profile", &profile, NULL); gimp_color_profile_combo_box_set_active_file (GIMP_COLOR_PROFILE_COMBO_BOX (private->profile_combo), profile, NULL); if (profile) g_object_unref (profile); } }