diff --git a/app/pdb/internal-procs.c b/app/pdb/internal-procs.c index b5b13f0fbc..eaae2fcf5d 100644 --- a/app/pdb/internal-procs.c +++ b/app/pdb/internal-procs.c @@ -28,7 +28,7 @@ #include "internal-procs.h" -/* 626 procedures registered total */ +/* 629 procedures registered total */ void internal_procs_init (GimpPDB *pdb) diff --git a/app/pdb/item-cmds.c b/app/pdb/item-cmds.c index 1a08df5695..81999d9bd7 100644 --- a/app/pdb/item-cmds.c +++ b/app/pdb/item-cmds.c @@ -26,6 +26,7 @@ #include "core/gimpimage.h" #include "core/gimpitem.h" #include "core/gimplayermask.h" +#include "core/gimplist.h" #include "core/gimpparamspecs.h" #include "core/gimpselection.h" #include "text/gimptextlayer.h" @@ -293,6 +294,120 @@ item_is_vectors_invoker (GimpProcedure *procedure, return return_vals; } +static GValueArray * +item_is_group_invoker (GimpProcedure *procedure, + Gimp *gimp, + GimpContext *context, + GimpProgress *progress, + const GValueArray *args, + GError **error) +{ + gboolean success = TRUE; + GValueArray *return_vals; + GimpItem *item; + gboolean group = FALSE; + + item = gimp_value_get_item (&args->values[0], gimp); + + if (success) + { + group = (gimp_viewable_get_children (GIMP_VIEWABLE (item)) != NULL); + } + + return_vals = gimp_procedure_get_return_values (procedure, success, + error ? *error : NULL); + + if (success) + g_value_set_boolean (&return_vals->values[1], group); + + return return_vals; +} + +static GValueArray * +item_get_parent_invoker (GimpProcedure *procedure, + Gimp *gimp, + GimpContext *context, + GimpProgress *progress, + const GValueArray *args, + GError **error) +{ + gboolean success = TRUE; + GValueArray *return_vals; + GimpItem *item; + GimpItem *parent = NULL; + + item = gimp_value_get_item (&args->values[0], gimp); + + if (success) + { + parent = gimp_item_get_parent (item); + } + + return_vals = gimp_procedure_get_return_values (procedure, success, + error ? *error : NULL); + + if (success) + gimp_value_set_item (&return_vals->values[1], parent); + + return return_vals; +} + +static GValueArray * +item_get_children_invoker (GimpProcedure *procedure, + Gimp *gimp, + GimpContext *context, + GimpProgress *progress, + const GValueArray *args, + GError **error) +{ + gboolean success = TRUE; + GValueArray *return_vals; + GimpItem *item; + gint32 num_children = 0; + gint32 *child_ids = NULL; + + item = gimp_value_get_item (&args->values[0], gimp); + + if (success) + { + GimpContainer *children = gimp_viewable_get_children (GIMP_VIEWABLE (item)); + + if (children) + { + num_children = gimp_container_get_n_children (children); + + if (num_children) + { + GList *list; + gint i; + + child_ids = g_new (gint32, num_children); + + for (list = GIMP_LIST (children)->list, i = 0; + list; + list = g_list_next (list), i++) + { + child_ids[i] = gimp_item_get_ID (GIMP_ITEM (list->data)); + } + } + } + else + success = FALSE; + + } + + return_vals = gimp_procedure_get_return_values (procedure, success, + error ? *error : NULL); + + if (success) + { + g_value_set_int (&return_vals->values[1], num_children); + gimp_value_take_int32array (&return_vals->values[2], child_ids, num_children); + } + + return return_vals; +} + static GValueArray * item_get_name_invoker (GimpProcedure *procedure, Gimp *gimp, @@ -821,6 +936,98 @@ register_item_procs (GimpPDB *pdb) gimp_pdb_register_procedure (pdb, procedure); g_object_unref (procedure); + /* + * gimp-item-is-group + */ + procedure = gimp_procedure_new (item_is_group_invoker); + gimp_object_set_static_name (GIMP_OBJECT (procedure), + "gimp-item-is-group"); + gimp_procedure_set_static_strings (procedure, + "gimp-item-is-group", + "Returns whether the item is a group item.", + "This procedure returns TRUE if the specified item is a group item which can have children.", + "Michael Natterer ", + "Michael Natterer", + "2010", + NULL); + gimp_procedure_add_argument (procedure, + gimp_param_spec_item_id ("item", + "item", + "The item", + pdb->gimp, FALSE, + GIMP_PARAM_READWRITE)); + gimp_procedure_add_return_value (procedure, + g_param_spec_boolean ("group", + "group", + "TRUE if the item is a group, FALSE otherwise", + FALSE, + GIMP_PARAM_READWRITE)); + gimp_pdb_register_procedure (pdb, procedure); + g_object_unref (procedure); + + /* + * gimp-item-get-parent + */ + procedure = gimp_procedure_new (item_get_parent_invoker); + gimp_object_set_static_name (GIMP_OBJECT (procedure), + "gimp-item-get-parent"); + gimp_procedure_set_static_strings (procedure, + "gimp-item-get-parent", + "Returns the item's parent item.", + "This procedure returns the item's parent item, if any.", + "Michael Natterer ", + "Michael Natterer", + "2010", + NULL); + gimp_procedure_add_argument (procedure, + gimp_param_spec_item_id ("item", + "item", + "The item", + pdb->gimp, FALSE, + GIMP_PARAM_READWRITE)); + gimp_procedure_add_return_value (procedure, + gimp_param_spec_item_id ("parent", + "parent", + "The item's parent item", + pdb->gimp, FALSE, + GIMP_PARAM_READWRITE)); + gimp_pdb_register_procedure (pdb, procedure); + g_object_unref (procedure); + + /* + * gimp-item-get-children + */ + procedure = gimp_procedure_new (item_get_children_invoker); + gimp_object_set_static_name (GIMP_OBJECT (procedure), + "gimp-item-get-children"); + gimp_procedure_set_static_strings (procedure, + "gimp-item-get-children", + "Returns the item's list of children.", + "This procedure returns the list of items which are children of the specified item. The order is topmost to bottommost.", + "Michael Natterer ", + "Michael Natterer", + "2010", + NULL); + gimp_procedure_add_argument (procedure, + gimp_param_spec_item_id ("item", + "item", + "The item", + pdb->gimp, FALSE, + GIMP_PARAM_READWRITE)); + gimp_procedure_add_return_value (procedure, + gimp_param_spec_int32 ("num-children", + "num children", + "The item's number of children", + 0, G_MAXINT32, 0, + GIMP_PARAM_READWRITE)); + gimp_procedure_add_return_value (procedure, + gimp_param_spec_int32_array ("child-ids", + "child ids", + "The item's list of children", + GIMP_PARAM_READWRITE)); + gimp_pdb_register_procedure (pdb, procedure); + g_object_unref (procedure); + /* * gimp-item-get-name */ diff --git a/libgimp/gimpitem_pdb.c b/libgimp/gimpitem_pdb.c index ed9d56d514..228a9b81be 100644 --- a/libgimp/gimpitem_pdb.c +++ b/libgimp/gimpitem_pdb.c @@ -22,6 +22,8 @@ #include "config.h" +#include + #include "gimp.h" @@ -326,6 +328,114 @@ gimp_item_is_vectors (gint32 item_ID) return vectors; } +/** + * gimp_item_is_group: + * @item_ID: The item. + * + * Returns whether the item is a group item. + * + * This procedure returns TRUE if the specified item is a group item + * which can have children. + * + * Returns: TRUE if the item is a group, FALSE otherwise. + * + * Since: GIMP 2.8 + */ +gboolean +gimp_item_is_group (gint32 item_ID) +{ + GimpParam *return_vals; + gint nreturn_vals; + gboolean group = FALSE; + + return_vals = gimp_run_procedure ("gimp-item-is-group", + &nreturn_vals, + GIMP_PDB_ITEM, item_ID, + GIMP_PDB_END); + + if (return_vals[0].data.d_status == GIMP_PDB_SUCCESS) + group = return_vals[1].data.d_int32; + + gimp_destroy_params (return_vals, nreturn_vals); + + return group; +} + +/** + * gimp_item_get_parent: + * @item_ID: The item. + * + * Returns the item's parent item. + * + * This procedure returns the item's parent item, if any. + * + * Returns: The item's parent item. + * + * Since: GIMP 2.8 + */ +gint32 +gimp_item_get_parent (gint32 item_ID) +{ + GimpParam *return_vals; + gint nreturn_vals; + gint32 parent_ID = -1; + + return_vals = gimp_run_procedure ("gimp-item-get-parent", + &nreturn_vals, + GIMP_PDB_ITEM, item_ID, + GIMP_PDB_END); + + if (return_vals[0].data.d_status == GIMP_PDB_SUCCESS) + parent_ID = return_vals[1].data.d_item; + + gimp_destroy_params (return_vals, nreturn_vals); + + return parent_ID; +} + +/** + * gimp_item_get_children: + * @item_ID: The item. + * @num_children: The item's number of children. + * + * Returns the item's list of children. + * + * This procedure returns the list of items which are children of the + * specified item. The order is topmost to bottommost. + * + * Returns: The item's list of children. + * + * Since: GIMP 2.8 + */ +gint * +gimp_item_get_children (gint32 item_ID, + gint *num_children) +{ + GimpParam *return_vals; + gint nreturn_vals; + gint *child_ids = NULL; + + return_vals = gimp_run_procedure ("gimp-item-get-children", + &nreturn_vals, + GIMP_PDB_ITEM, item_ID, + GIMP_PDB_END); + + *num_children = 0; + + if (return_vals[0].data.d_status == GIMP_PDB_SUCCESS) + { + *num_children = return_vals[1].data.d_int32; + child_ids = g_new (gint32, *num_children); + memcpy (child_ids, + return_vals[2].data.d_int32array, + *num_children * sizeof (gint32)); + } + + gimp_destroy_params (return_vals, nreturn_vals); + + return child_ids; +} + /** * gimp_item_get_name: * @item_ID: The item. diff --git a/libgimp/gimpitem_pdb.h b/libgimp/gimpitem_pdb.h index 1cbe246fcd..8396306fe9 100644 --- a/libgimp/gimpitem_pdb.h +++ b/libgimp/gimpitem_pdb.h @@ -37,6 +37,10 @@ gboolean gimp_item_is_channel (gint32 item_ID); gboolean gimp_item_is_layer_mask (gint32 item_ID); gboolean gimp_item_is_selection (gint32 item_ID); gboolean gimp_item_is_vectors (gint32 item_ID); +gboolean gimp_item_is_group (gint32 item_ID); +gint32 gimp_item_get_parent (gint32 item_ID); +gint* gimp_item_get_children (gint32 item_ID, + gint *num_children); gchar* gimp_item_get_name (gint32 item_ID); gboolean gimp_item_set_name (gint32 item_ID, const gchar *name); diff --git a/tools/pdbgen/pdb/item.pdb b/tools/pdbgen/pdb/item.pdb index d0cb287045..46e6a2a373 100644 --- a/tools/pdbgen/pdb/item.pdb +++ b/tools/pdbgen/pdb/item.pdb @@ -281,6 +281,117 @@ CODE ); } +sub item_is_group { + $blurb = 'Returns whether the item is a group item.'; + + $help = < 'item', type => 'item', + desc => 'The item' } + ); + + @outargs = ( + { name => 'group', type => 'boolean', + desc => 'TRUE if the item is a group, FALSE otherwise' } + ); + + %invoke = ( + code => <<'CODE' +{ + group = (gimp_viewable_get_children (GIMP_VIEWABLE (item)) != NULL); +} +CODE + ); +} + +sub item_get_parent { + $blurb = "Returns the item's parent item."; + + $help = < 'item', type => 'item', + desc => 'The item' } + ); + + @outargs = ( + { name => 'parent', type => 'item', + desc => "The item's parent item" } + ); + + %invoke = ( + code => <<'CODE' +{ + parent = gimp_item_get_parent (item); +} +CODE + ); +} + +sub item_get_children { + $blurb = "Returns the item's list of children."; + + $help = < 'item', type => 'item', + desc => 'The item' } + ); + + @outargs = ( + { name => 'child_ids', type => 'int32array', + desc => "The item's list of children", + array => { name => 'num_children', + desc => "The item's number of children" } } + ); + + %invoke = ( + code => <<'CODE' +{ + GimpContainer *children = gimp_viewable_get_children (GIMP_VIEWABLE (item)); + + if (children) + { + num_children = gimp_container_get_n_children (children); + + if (num_children) + { + GList *list; + gint i; + + child_ids = g_new (gint32, num_children); + + for (list = GIMP_LIST (children)->list, i = 0; + list; + list = g_list_next (list), i++) + { + child_ids[i] = gimp_item_get_ID (GIMP_ITEM (list->data)); + } + } + } + else + success = FALSE; + +} +CODE + ); +} + sub item_get_name { $blurb = "Get the name of the specified item."; @@ -544,6 +655,7 @@ CODE } @headers = qw("core/gimplayermask.h" + "core/gimplist.h" "core/gimpselection.h" "text/gimptextlayer.h" "vectors/gimpvectors.h" @@ -559,6 +671,9 @@ CODE item_is_layer_mask item_is_selection item_is_vectors + item_is_group + item_get_parent + item_get_children item_get_name item_set_name item_get_visible item_set_visible item_get_linked item_set_linked