gimp/plug-ins/script-fu/libscriptfu/script-fu-resource.c

193 lines
6.0 KiB
C

/* 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 <https://www.gnu.org/licenses/>.
*/
#include "config.h"
#include <libgimp/gimp.h>
#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;
}