libgimp: support all GimpItem subclasses as argument and return values.

This commit is contained in:
Jehan 2019-08-14 14:56:28 +02:00
parent 75f8a3804d
commit a1eeca490f
2 changed files with 68 additions and 16 deletions

View file

@ -173,26 +173,26 @@ _gimp_param_spec_to_gp_param_def (GParamSpec *pspec,
* included from app/ which won't know of the types.
*/
if (g_strcmp0 (g_type_name (pspec->value_type), "GimpImage") == 0)
{
param_def->type_name = "GimpParamImageID";
param_def->param_def_type = GP_PARAM_DEF_TYPE_ID;
param_def->meta.m_id.none_ok = TRUE;
}
param_def->type_name = "GimpParamImageID";
if (g_strcmp0 (g_type_name (pspec->value_type), "GimpDisplay") == 0)
param_def->type_name = "GimpParamDisplayID";
else if (g_strcmp0 (g_type_name (pspec->value_type), "GimpItem") == 0)
{
param_def->type_name = "GimpParamItemID";
param_def->param_def_type = GP_PARAM_DEF_TYPE_ID;
param_def->meta.m_id.none_ok = TRUE;
}
param_def->type_name = "GimpParamItemID";
else if (g_strcmp0 (g_type_name (pspec->value_type), "GimpDrawable") == 0)
{
param_def->type_name = "GimpParamDrawableID";
param_def->param_def_type = GP_PARAM_DEF_TYPE_ID;
param_def->meta.m_id.none_ok = TRUE;
}
param_def->type_name = "GimpParamDrawableID";
else if (g_strcmp0 (g_type_name (pspec->value_type), "GimpLayer") == 0)
param_def->type_name = "GimpParamLayerID";
else if (g_strcmp0 (g_type_name (pspec->value_type), "GimpChannel") == 0)
param_def->type_name = "GimpParamChannelID";
else if (g_strcmp0 (g_type_name (pspec->value_type), "GimpLayerMask") == 0)
param_def->type_name = "GimpParamLayerMaskID";
else if (g_strcmp0 (g_type_name (pspec->value_type), "GimpSelection") == 0)
param_def->type_name = "GimpParamSelectionID";
else if (g_strcmp0 (g_type_name (pspec->value_type), "GimpVectors") == 0)
param_def->type_name = "GimpParamVectorsID";
if (G_PARAM_SPEC_TYPE_NAME (pspec) != param_def->type_name)
{
param_def->type_name = "GimpParamLayerID";
param_def->param_def_type = GP_PARAM_DEF_TYPE_ID;
param_def->meta.m_id.none_ok = TRUE;
}
@ -610,6 +610,56 @@ _gimp_value_to_gp_param (const GValue *value,
_gimp_param_spec_to_gp_param_def (g_value_get_param (value),
&param->data.d_param_def);
}
else if (G_VALUE_HOLDS_OBJECT (value))
{
#ifdef __LIBGIMP_GPPARAMS__
GObject *object = g_value_get_object (value);
const gchar *type_name = NULL;
if (full_copy)
g_clear_pointer (&param->type_name, g_free);
if (GIMP_IS_IMAGE (object))
{
type_name = "GimpImageID";
param->param_type = GP_PARAM_TYPE_INT;
param->data.d_int = gimp_image_get_id (GIMP_IMAGE (object));
}
if (GIMP_IS_DISPLAY (object))
{
type_name = "GimpDisplayID";
param->param_type = GP_PARAM_TYPE_INT;
param->data.d_int = gimp_display_get_id (GIMP_DISPLAY (object));
}
else if (GIMP_IS_ITEM (object))
{
param->param_type = GP_PARAM_TYPE_INT;
param->data.d_int = gimp_item_get_id (GIMP_ITEM (object));
if (GIMP_IS_LAYER (object))
type_name = "GimpLayerID";
else if (GIMP_IS_LAYER_MASK (object))
type_name = "GimpLayerMaskID";
else if (GIMP_IS_SELECTION (object))
type_name = "GimpSelectionID";
else if (GIMP_IS_VECTORS (object))
type_name = "GimpVectorsID";
else if (GIMP_IS_CHANNEL (object))
type_name = "GimpChannelID";
else if (GIMP_IS_DRAWABLE (object))
type_name = "GimpDrawableID";
else
type_name = "GimpItemID";
}
if (type_name)
{
if (full_copy)
param->type_name = g_strdup (type_name);
else
param->type_name = (gchar *) type_name;
}
#endif /* __LIBGIMP_GPPARAMS__ */
}
if (param->param_type == -1)
g_printerr ("%s: GValue contains unsupported type '%s'\n",

View file

@ -37,7 +37,9 @@
/* include the implementation, they are shared between app/ and
* libgimp/ but need different headers.
*/
#define __LIBGIMP_GPPARAMS__
#include "gimpgpparams-body.c"
#undef __LIBGIMP_GPPARAMS__
GParamSpec *
_gimp_gp_param_def_to_param_spec (gpointer gimp,