/* GIMP - The GNU Image Manipulation Program * Copyright (C) 1995 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 "script-fu-types.h" #include "script-fu-resource.h" /* This encapsulates the implementation of the SFResourceType. * It knows how to manipulate a SFArg of that type. * * Separate because it is likely to change: * when the old-style GUI of script-fu-interface is obsoleted. */ static gint32 sf_resource_arg_get_ID_from_context (SFArg *arg); /* Called at registration time. * The name may be empty i.e. NULL, the special value "from context", * a name that matches a resource, or an invalid name of a resource. * We can't check for validity now because Gimp is not done initializing resources. */ void sf_resource_arg_set_name_default (SFArg *arg, GType resource_type, gchar *name_of_default) { /* Store the name and later put to ParamSpecResource.name_of_default.*/ arg->default_value.sfa_resource.declared_name_of_default = g_strdup (name_of_default); arg->default_value.sfa_resource.resource_type = resource_type; /* Init current value to unknown. */ sf_resource_arg_set (arg, -1); } /* Return the name stored at registration time. */ gchar * sf_resource_arg_get_name_default (SFArg *arg) { return arg->default_value.sfa_resource.declared_name_of_default; } /* Return a default value from the declared name of default. * Ensure the value is acceptable by a ResourceChooser widget. * Returns NULL when the name_of_default is not the name of a resource. * A NULL will make a ResourceChooser widget get from context. * * This does not increase the reference count. * ScriptFu does not keep a reference, * only passes the reference when declaring args to PDB procedure. */ GimpResource* sf_resource_arg_get_default (SFArg *arg) { GimpResource *result; result = gimp_resource_get_by_name ( arg->default_value.sfa_resource.resource_type, sf_resource_arg_get_name_default (arg)); g_debug ("%s name %s result %p", G_STRFUNC, sf_resource_arg_get_name_default (arg), result); return result; } /* Return the current value. */ GimpResource *sf_resource_arg_get_value (SFArg *arg) { return gimp_resource_get_by_id (arg->value.sfa_resource.history); } /* Sets the arg's internal value. * * FUTURE: Deprecated when script-fu-interface is deleted. */ void sf_resource_arg_set (SFArg *arg, gint32 ID) { g_debug ("%s ID: %d", G_STRFUNC, ID); arg->value.sfa_resource.history = ID; } /* Free allocated memory of an SFArg. */ void sf_resource_arg_free (SFArg *arg) { g_free (arg->default_value.sfa_resource.declared_name_of_default); } /* Reset the current value to the default value. * FUTURE: obsolete with script-fu-interface. */ void sf_resource_arg_reset (SFArg *arg) { /* Copy the whole struct. * This copies a gchar * but we don't need to free it. */ arg->value.sfa_resource = arg->default_value.sfa_resource; } /* Return representation of the current value. * Representation in Scheme language: a literal numeric for the ID. * Transfer full, caller must free. */ gchar* sf_resource_arg_get_repr (SFArg *arg) { return g_strdup_printf ("%d", arg->value.sfa_resource.history); } /* Init the current value of an SFArg that is a resource * when it is not already set, i.e. -1. * Init to default value, either the declared named resource, or from context. * * !!! The current value is traditionally called "history" * because it persists across runs of the plugin. * * For old-style interface, where the data flow is different, * from the arg to the widget then back, * but not automatic via a bound property. * Must initialize inc case user does not touch a widget. * * Cannot be called at registration time. * * FUTURE: obsolete with script-fu-interface. */ void sf_resource_arg_init_current_value (SFArg *arg) { if (arg->value.sfa_resource.history < 1) { /* The ID has not flowed from a widget in a prior run of plugin. */ GimpResource *default_resource = sf_resource_arg_get_default (arg); if (default_resource != NULL) sf_resource_arg_set (arg, gimp_resource_get_id (default_resource)); else /* The author declared default is not valid. */ sf_resource_arg_set (arg, sf_resource_arg_get_ID_from_context (arg)); } /* Else the current value is positive int, a resource ID from prior run. */ g_debug ("%s %i", G_STRFUNC, arg->value.sfa_resource.history); } /* FUTURE: obsolete with script-fu-interface. */ static gint32 sf_resource_arg_get_ID_from_context (SFArg *arg) { GimpResource *resource = NULL; gint32 result_ID; GType resource_type = arg->default_value.sfa_resource.resource_type; if (resource_type == GIMP_TYPE_BRUSH) resource = GIMP_RESOURCE (gimp_context_get_brush ()); else if (resource_type == GIMP_TYPE_FONT) resource = GIMP_RESOURCE (gimp_context_get_font ()); else if (resource_type == GIMP_TYPE_GRADIENT) resource = GIMP_RESOURCE (gimp_context_get_gradient ()); else if (resource_type == GIMP_TYPE_PALETTE) resource = GIMP_RESOURCE (gimp_context_get_palette ()); else if (resource_type == GIMP_TYPE_PATTERN) resource = GIMP_RESOURCE (gimp_context_get_pattern ()); if (resource == NULL) { g_warning ("%s: Failed get resource from context", G_STRFUNC); result_ID = -1; } else { result_ID = gimp_resource_get_id (resource); } return result_ID; }