static gchar * dump_describe_param (GParamSpec *param_spec) { const gchar *blurb = g_param_spec_get_blurb (param_spec); const gchar *values = NULL; if (!blurb) { g_warning ("FIXME: Property '%s' has no blurb.", param_spec->name); blurb = g_strdup_printf ("The %s property has no description.", param_spec->name); } if (GIMP_IS_PARAM_SPEC_RGB (param_spec)) { if (gimp_param_spec_rgb_has_alpha (param_spec)) values = "The color is specified in the form (color-rgba red green blue " "alpha) with channel values as floats in the range of 0.0 to 1.0."; else values = "The color is specified in the form (color-rgb red green blue) " "with channel values as floats in the range of 0.0 to 1.0."; } else if (GIMP_IS_PARAM_SPEC_MEMSIZE (param_spec)) { values = "The integer size can contain a suffix of 'B', 'K', 'M' or 'G' which " "makes GIMP interpret the size as being specified in bytes, kilobytes, " "megabytes or gigabytes. If no suffix is specified the size defaults " "to being specified in kilobytes."; } else if (GIMP_IS_PARAM_SPEC_CONFIG_PATH (param_spec)) { switch (gimp_param_spec_config_path_type (param_spec)) { case GIMP_CONFIG_PATH_FILE: values = "This is a single filename."; break; case GIMP_CONFIG_PATH_FILE_LIST: switch (G_SEARCHPATH_SEPARATOR) { case ':': values = "This is a colon-separated list of files."; break; case ';': values = "This is a semicolon-separated list of files."; break; default: g_warning ("unhandled G_SEARCHPATH_SEPARATOR value"); break; } break; case GIMP_CONFIG_PATH_DIR: values = "This is a single folder."; break; case GIMP_CONFIG_PATH_DIR_LIST: switch (G_SEARCHPATH_SEPARATOR) { case ':': values = "This is a colon-separated list of folders to search."; break; case ';': values = "This is a semicolon-separated list of folders to search."; break; default: g_warning ("unhandled G_SEARCHPATH_SEPARATOR value"); break; } break; } } else if (GIMP_IS_PARAM_SPEC_UNIT (param_spec)) { values = "The unit can be one inches, millimeters, points or picas plus " "those in your user units database."; } else if (g_type_is_a (param_spec->value_type, GIMP_TYPE_CONFIG)) { values = "This is a parameter list."; } else { switch (G_TYPE_FUNDAMENTAL (param_spec->value_type)) { case G_TYPE_BOOLEAN: values = "Possible values are yes and no."; break; case G_TYPE_INT: case G_TYPE_UINT: case G_TYPE_LONG: case G_TYPE_ULONG: values = "This is an integer value."; break; case G_TYPE_FLOAT: case G_TYPE_DOUBLE: values = "This is a float value."; break; case G_TYPE_STRING: /* eek */ if (strcmp (g_param_spec_get_name (param_spec), "image-title-format") && strcmp (g_param_spec_get_name (param_spec), "image-status-format")) { values = "This is a string value."; } else { values = display_format_description; } break; case G_TYPE_ENUM: { GEnumClass *enum_class; GEnumValue *enum_value; GString *str; gint i; enum_class = g_type_class_peek (param_spec->value_type); str = g_string_new (blurb); g_string_append (str, " Possible values are "); for (i = 0, enum_value = enum_class->values; i < enum_class->n_values; i++, enum_value++) { g_string_append (str, enum_value->value_nick); switch (enum_class->n_values - i) { case 1: g_string_append_c (str, '.'); break; case 2: g_string_append (str, " and "); break; default: g_string_append (str, ", "); break; } } return g_string_free (str, FALSE); } break; default: break; } } if (!values) g_warning ("FIXME: Can't tell anything about a %s.", g_type_name (param_spec->value_type)); if (strcmp (blurb, "") == 0) return g_strdup_printf ("%s", values); else return g_strdup_printf ("%s %s", blurb, values); }
GParamSpec * gimp_param_spec_duplicate (GParamSpec *pspec) { GParamSpec *copy = NULL; GParamFlags flags; g_return_val_if_fail (pspec != NULL, NULL); flags = pspec->flags | GIMP_CONFIG_PARAM_SERIALIZE; if (G_IS_PARAM_SPEC_STRING (pspec)) { GParamSpecString *spec = G_PARAM_SPEC_STRING (pspec); if (GEGL_IS_PARAM_SPEC_FILE_PATH (pspec)) { copy = gimp_param_spec_config_path (pspec->name, g_param_spec_get_nick (pspec), g_param_spec_get_blurb (pspec), GIMP_CONFIG_PATH_FILE, spec->default_value, flags); } else { static GQuark multiline_quark = 0; if (! multiline_quark) multiline_quark = g_quark_from_static_string ("multiline"); copy = g_param_spec_string (pspec->name, g_param_spec_get_nick (pspec), g_param_spec_get_blurb (pspec), spec->default_value, flags); if (GEGL_IS_PARAM_SPEC_MULTILINE (pspec)) { g_param_spec_set_qdata (copy, multiline_quark, GINT_TO_POINTER (TRUE)); } } } else if (G_IS_PARAM_SPEC_BOOLEAN (pspec)) { GParamSpecBoolean *spec = G_PARAM_SPEC_BOOLEAN (pspec); copy = g_param_spec_boolean (pspec->name, g_param_spec_get_nick (pspec), g_param_spec_get_blurb (pspec), spec->default_value, flags); } else if (G_IS_PARAM_SPEC_ENUM (pspec)) { GParamSpecEnum *spec = G_PARAM_SPEC_ENUM (pspec); copy = g_param_spec_enum (pspec->name, g_param_spec_get_nick (pspec), g_param_spec_get_blurb (pspec), G_TYPE_FROM_CLASS (spec->enum_class), spec->default_value, flags); } else if (GEGL_IS_PARAM_SPEC_DOUBLE (pspec)) { GeglParamSpecDouble *gspec = GEGL_PARAM_SPEC_DOUBLE (pspec); GParamSpecDouble *spec = G_PARAM_SPEC_DOUBLE (pspec); copy = gegl_param_spec_double (pspec->name, g_param_spec_get_nick (pspec), g_param_spec_get_blurb (pspec), spec->minimum, spec->maximum, spec->default_value, gspec->ui_minimum, gspec->ui_maximum, gspec->ui_gamma, flags); } else if (G_IS_PARAM_SPEC_DOUBLE (pspec)) { GParamSpecDouble *spec = G_PARAM_SPEC_DOUBLE (pspec); copy = g_param_spec_double (pspec->name, g_param_spec_get_nick (pspec), g_param_spec_get_blurb (pspec), spec->minimum, spec->maximum, spec->default_value, flags); } else if (G_IS_PARAM_SPEC_FLOAT (pspec)) { GParamSpecFloat *spec = G_PARAM_SPEC_FLOAT (pspec); copy = g_param_spec_float (pspec->name, g_param_spec_get_nick (pspec), g_param_spec_get_blurb (pspec), spec->minimum, spec->maximum, spec->default_value, flags); } else if (GEGL_IS_PARAM_SPEC_INT (pspec)) { GeglParamSpecInt *gspec = GEGL_PARAM_SPEC_INT (pspec); GParamSpecInt *spec = G_PARAM_SPEC_INT (pspec); copy = gegl_param_spec_int (pspec->name, g_param_spec_get_nick (pspec), g_param_spec_get_blurb (pspec), spec->minimum, spec->maximum, spec->default_value, gspec->ui_minimum, gspec->ui_maximum, gspec->ui_gamma, flags); } else if (GEGL_IS_PARAM_SPEC_SEED (pspec)) { copy = gegl_param_spec_seed (pspec->name, g_param_spec_get_nick (pspec), g_param_spec_get_blurb (pspec), pspec->flags | GIMP_CONFIG_PARAM_SERIALIZE); } else if (G_IS_PARAM_SPEC_INT (pspec)) { GParamSpecInt *spec = G_PARAM_SPEC_INT (pspec); copy = g_param_spec_int (pspec->name, g_param_spec_get_nick (pspec), g_param_spec_get_blurb (pspec), spec->minimum, spec->maximum, spec->default_value, flags); } else if (G_IS_PARAM_SPEC_UINT (pspec)) { GParamSpecUInt *spec = G_PARAM_SPEC_UINT (pspec); copy = g_param_spec_uint (pspec->name, g_param_spec_get_nick (pspec), g_param_spec_get_blurb (pspec), spec->minimum, spec->maximum, spec->default_value, flags); } else if (GIMP_IS_PARAM_SPEC_RGB (pspec)) { GValue value = G_VALUE_INIT; GimpRGB color; g_value_init (&value, GIMP_TYPE_RGB); g_param_value_set_default (pspec, &value); gimp_value_get_rgb (&value, &color); g_value_unset (&value); copy = gimp_param_spec_rgb (pspec->name, g_param_spec_get_nick (pspec), g_param_spec_get_blurb (pspec), gimp_param_spec_rgb_has_alpha (pspec), &color, flags); } else if (GEGL_IS_PARAM_SPEC_COLOR (pspec)) { GeglColor *gegl_color; GimpRGB gimp_color; gdouble r = 0.0; gdouble g = 0.0; gdouble b = 0.0; gdouble a = 1.0; GValue value = { 0, }; g_value_init (&value, GEGL_TYPE_COLOR); g_param_value_set_default (pspec, &value); gegl_color = g_value_get_object (&value); if (gegl_color) gegl_color_get_rgba (gegl_color, &r, &g, &b, &a); gimp_rgba_set (&gimp_color, r, g, b, a); g_value_unset (&value); copy = gimp_param_spec_rgb (pspec->name, g_param_spec_get_nick (pspec), g_param_spec_get_blurb (pspec), TRUE, &gimp_color, flags); } else if (G_IS_PARAM_SPEC_OBJECT (pspec) || G_IS_PARAM_SPEC_POINTER (pspec)) { /* silently ignore object properties */ } else { g_warning ("%s: not supported: %s (%s)\n", G_STRFUNC, g_type_name (G_TYPE_FROM_INSTANCE (pspec)), pspec->name); } if (copy) { GQuark quark = g_quark_from_static_string ("gegl-property-keys"); GHashTable *keys = g_param_spec_get_qdata (pspec, quark); if (keys) g_param_spec_set_qdata (copy, quark, g_hash_table_ref (keys)); } return copy; }