
... for "Edit/Preferences/Default Image"
In GimpTemplateEditor, don't use gimp_prop_enum_combo_box_new() for
the "Precision" combo-box, and rather synchronize the combo-box and
the template manually, since we only want to update the "Gamma"
combo-box according to the precision when it changes through the
UI, and not when the template's precision otherwise changes.
This fixes an issue where we'd always set the default gamma value
when resetting the editor's template, overwriting the template's
original gamma value.
(cherry picked from commit 033082dd9a
)
874 lines
32 KiB
C
874 lines
32 KiB
C
/* 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 <https://www.gnu.org/licenses/>.
|
||
*/
|
||
|
||
#include "config.h"
|
||
|
||
#include <string.h>
|
||
|
||
#include <gegl.h>
|
||
#include <gtk/gtk.h>
|
||
|
||
#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 ("<b>%s</b>", _("_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 ("<expander>");
|
||
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);
|
||
}
|
||
}
|