app: add gimp_container_search()
Add a new GimpContainer::search() virtual function, and a
corresponding gimp_container_search() function, which works
similarly to gimp_container_foreach(), except that the callback
returns a boolean. When the callback returns TRUE, the search is
stopped, and the current object is returned.
Implement GimpContainer::search() in GimpList.
(cherry picked from commit c4cc015c43
)
This commit is contained in:
@ -195,6 +195,7 @@ gimp_container_class_init (GimpContainerClass *klass)
|
||||
klass->clear = NULL;
|
||||
klass->have = NULL;
|
||||
klass->foreach = NULL;
|
||||
klass->search = NULL;
|
||||
klass->get_unique_names = NULL;
|
||||
klass->get_child_by_name = NULL;
|
||||
klass->get_child_by_index = NULL;
|
||||
@ -821,6 +822,23 @@ gimp_container_foreach (GimpContainer *container,
|
||||
GIMP_CONTAINER_GET_CLASS (container)->foreach (container, func, user_data);
|
||||
}
|
||||
|
||||
GimpObject *
|
||||
gimp_container_search (GimpContainer *container,
|
||||
GimpContainerSearchFunc func,
|
||||
gpointer user_data)
|
||||
{
|
||||
g_return_val_if_fail (GIMP_IS_CONTAINER (container), NULL);
|
||||
g_return_val_if_fail (func != NULL, NULL);
|
||||
|
||||
if (container->priv->n_children > 0)
|
||||
{
|
||||
return GIMP_CONTAINER_GET_CLASS (container)->search (container,
|
||||
func, user_data);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
gboolean
|
||||
gimp_container_get_unique_names (GimpContainer *container)
|
||||
{
|
||||
|
@ -33,6 +33,10 @@
|
||||
#define GIMP_CONTAINER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_CONTAINER, GimpContainerClass))
|
||||
|
||||
|
||||
typedef gboolean (* GimpContainerSearchFunc) (GimpObject *object,
|
||||
gpointer user_data);
|
||||
|
||||
|
||||
typedef struct _GimpContainerClass GimpContainerClass;
|
||||
typedef struct _GimpContainerPrivate GimpContainerPrivate;
|
||||
|
||||
@ -48,86 +52,92 @@ struct _GimpContainerClass
|
||||
GimpObjectClass parent_class;
|
||||
|
||||
/* signals */
|
||||
void (* add) (GimpContainer *container,
|
||||
GimpObject *object);
|
||||
void (* remove) (GimpContainer *container,
|
||||
GimpObject *object);
|
||||
void (* reorder) (GimpContainer *container,
|
||||
GimpObject *object,
|
||||
gint new_index);
|
||||
void (* freeze) (GimpContainer *container);
|
||||
void (* thaw) (GimpContainer *container);
|
||||
void (* add) (GimpContainer *container,
|
||||
GimpObject *object);
|
||||
void (* remove) (GimpContainer *container,
|
||||
GimpObject *object);
|
||||
void (* reorder) (GimpContainer *container,
|
||||
GimpObject *object,
|
||||
gint new_index);
|
||||
void (* freeze) (GimpContainer *container);
|
||||
void (* thaw) (GimpContainer *container);
|
||||
|
||||
/* virtual functions */
|
||||
void (* clear) (GimpContainer *container);
|
||||
gboolean (* have) (GimpContainer *container,
|
||||
GimpObject *object);
|
||||
void (* foreach) (GimpContainer *container,
|
||||
GFunc func,
|
||||
gpointer user_data);
|
||||
gboolean (* get_unique_names) (GimpContainer *container);
|
||||
GimpObject * (* get_child_by_name) (GimpContainer *container,
|
||||
const gchar *name);
|
||||
GimpObject * (* get_child_by_index) (GimpContainer *container,
|
||||
gint index);
|
||||
gint (* get_child_index) (GimpContainer *container,
|
||||
GimpObject *object);
|
||||
void (* clear) (GimpContainer *container);
|
||||
gboolean (* have) (GimpContainer *container,
|
||||
GimpObject *object);
|
||||
void (* foreach) (GimpContainer *container,
|
||||
GFunc func,
|
||||
gpointer user_data);
|
||||
GimpObject * (* search) (GimpContainer *container,
|
||||
GimpContainerSearchFunc func,
|
||||
gpointer user_data);
|
||||
gboolean (* get_unique_names) (GimpContainer *container);
|
||||
GimpObject * (* get_child_by_name) (GimpContainer *container,
|
||||
const gchar *name);
|
||||
GimpObject * (* get_child_by_index) (GimpContainer *container,
|
||||
gint index);
|
||||
gint (* get_child_index) (GimpContainer *container,
|
||||
GimpObject *object);
|
||||
};
|
||||
|
||||
|
||||
GType gimp_container_get_type (void) G_GNUC_CONST;
|
||||
|
||||
GType gimp_container_get_children_type (GimpContainer *container);
|
||||
GimpContainerPolicy gimp_container_get_policy (GimpContainer *container);
|
||||
gint gimp_container_get_n_children (GimpContainer *container);
|
||||
GType gimp_container_get_children_type (GimpContainer *container);
|
||||
GimpContainerPolicy gimp_container_get_policy (GimpContainer *container);
|
||||
gint gimp_container_get_n_children (GimpContainer *container);
|
||||
|
||||
gboolean gimp_container_add (GimpContainer *container,
|
||||
GimpObject *object);
|
||||
gboolean gimp_container_remove (GimpContainer *container,
|
||||
GimpObject *object);
|
||||
gboolean gimp_container_insert (GimpContainer *container,
|
||||
GimpObject *object,
|
||||
gint new_index);
|
||||
gboolean gimp_container_reorder (GimpContainer *container,
|
||||
GimpObject *object,
|
||||
gint new_index);
|
||||
gboolean gimp_container_add (GimpContainer *container,
|
||||
GimpObject *object);
|
||||
gboolean gimp_container_remove (GimpContainer *container,
|
||||
GimpObject *object);
|
||||
gboolean gimp_container_insert (GimpContainer *container,
|
||||
GimpObject *object,
|
||||
gint new_index);
|
||||
gboolean gimp_container_reorder (GimpContainer *container,
|
||||
GimpObject *object,
|
||||
gint new_index);
|
||||
|
||||
void gimp_container_freeze (GimpContainer *container);
|
||||
void gimp_container_thaw (GimpContainer *container);
|
||||
gboolean gimp_container_frozen (GimpContainer *container);
|
||||
gint gimp_container_freeze_count (GimpContainer *container);
|
||||
void gimp_container_freeze (GimpContainer *container);
|
||||
void gimp_container_thaw (GimpContainer *container);
|
||||
gboolean gimp_container_frozen (GimpContainer *container);
|
||||
gint gimp_container_freeze_count (GimpContainer *container);
|
||||
|
||||
void gimp_container_clear (GimpContainer *container);
|
||||
gboolean gimp_container_is_empty (GimpContainer *container);
|
||||
gboolean gimp_container_have (GimpContainer *container,
|
||||
GimpObject *object);
|
||||
void gimp_container_foreach (GimpContainer *container,
|
||||
GFunc func,
|
||||
gpointer user_data);
|
||||
void gimp_container_clear (GimpContainer *container);
|
||||
gboolean gimp_container_is_empty (GimpContainer *container);
|
||||
gboolean gimp_container_have (GimpContainer *container,
|
||||
GimpObject *object);
|
||||
void gimp_container_foreach (GimpContainer *container,
|
||||
GFunc func,
|
||||
gpointer user_data);
|
||||
GimpObject * gimp_container_search (GimpContainer *container,
|
||||
GimpContainerSearchFunc func,
|
||||
gpointer user_data);
|
||||
|
||||
gboolean gimp_container_get_unique_names (GimpContainer *container);
|
||||
gboolean gimp_container_get_unique_names (GimpContainer *container);
|
||||
|
||||
GimpObject * gimp_container_get_child_by_name (GimpContainer *container,
|
||||
const gchar *name);
|
||||
GimpObject * gimp_container_get_child_by_index (GimpContainer *container,
|
||||
gint index);
|
||||
GimpObject * gimp_container_get_first_child (GimpContainer *container);
|
||||
GimpObject * gimp_container_get_last_child (GimpContainer *container);
|
||||
gint gimp_container_get_child_index (GimpContainer *container,
|
||||
GimpObject *object);
|
||||
GimpObject * gimp_container_get_child_by_name (GimpContainer *container,
|
||||
const gchar *name);
|
||||
GimpObject * gimp_container_get_child_by_index (GimpContainer *container,
|
||||
gint index);
|
||||
GimpObject * gimp_container_get_first_child (GimpContainer *container);
|
||||
GimpObject * gimp_container_get_last_child (GimpContainer *container);
|
||||
gint gimp_container_get_child_index (GimpContainer *container,
|
||||
GimpObject *object);
|
||||
|
||||
GimpObject * gimp_container_get_neighbor_of (GimpContainer *container,
|
||||
GimpObject *object);
|
||||
GimpObject * gimp_container_get_neighbor_of (GimpContainer *container,
|
||||
GimpObject *object);
|
||||
|
||||
gchar ** gimp_container_get_name_array (GimpContainer *container,
|
||||
gint *length);
|
||||
gchar ** gimp_container_get_name_array (GimpContainer *container,
|
||||
gint *length);
|
||||
|
||||
GQuark gimp_container_add_handler (GimpContainer *container,
|
||||
const gchar *signame,
|
||||
GCallback callback,
|
||||
gpointer callback_data);
|
||||
void gimp_container_remove_handler (GimpContainer *container,
|
||||
GQuark id);
|
||||
GQuark gimp_container_add_handler (GimpContainer *container,
|
||||
const gchar *signame,
|
||||
GCallback callback,
|
||||
gpointer callback_data);
|
||||
void gimp_container_remove_handler (GimpContainer *container,
|
||||
GQuark id);
|
||||
|
||||
|
||||
#endif /* __GIMP_CONTAINER_H__ */
|
||||
|
@ -40,44 +40,47 @@ enum
|
||||
};
|
||||
|
||||
|
||||
static void gimp_list_finalize (GObject *object);
|
||||
static void gimp_list_set_property (GObject *object,
|
||||
guint property_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec);
|
||||
static void gimp_list_get_property (GObject *object,
|
||||
guint property_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec);
|
||||
static void gimp_list_finalize (GObject *object);
|
||||
static void gimp_list_set_property (GObject *object,
|
||||
guint property_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec);
|
||||
static void gimp_list_get_property (GObject *object,
|
||||
guint property_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec);
|
||||
|
||||
static gint64 gimp_list_get_memsize (GimpObject *object,
|
||||
gint64 *gui_size);
|
||||
static gint64 gimp_list_get_memsize (GimpObject *object,
|
||||
gint64 *gui_size);
|
||||
|
||||
static void gimp_list_add (GimpContainer *container,
|
||||
GimpObject *object);
|
||||
static void gimp_list_remove (GimpContainer *container,
|
||||
GimpObject *object);
|
||||
static void gimp_list_reorder (GimpContainer *container,
|
||||
GimpObject *object,
|
||||
gint new_index);
|
||||
static void gimp_list_clear (GimpContainer *container);
|
||||
static gboolean gimp_list_have (GimpContainer *container,
|
||||
GimpObject *object);
|
||||
static void gimp_list_foreach (GimpContainer *container,
|
||||
GFunc func,
|
||||
gpointer user_data);
|
||||
static gboolean gimp_list_get_unique_names (GimpContainer *container);
|
||||
static GimpObject * gimp_list_get_child_by_name (GimpContainer *container,
|
||||
const gchar *name);
|
||||
static GimpObject * gimp_list_get_child_by_index (GimpContainer *container,
|
||||
gint index);
|
||||
static gint gimp_list_get_child_index (GimpContainer *container,
|
||||
GimpObject *object);
|
||||
static void gimp_list_add (GimpContainer *container,
|
||||
GimpObject *object);
|
||||
static void gimp_list_remove (GimpContainer *container,
|
||||
GimpObject *object);
|
||||
static void gimp_list_reorder (GimpContainer *container,
|
||||
GimpObject *object,
|
||||
gint new_index);
|
||||
static void gimp_list_clear (GimpContainer *container);
|
||||
static gboolean gimp_list_have (GimpContainer *container,
|
||||
GimpObject *object);
|
||||
static void gimp_list_foreach (GimpContainer *container,
|
||||
GFunc func,
|
||||
gpointer user_data);
|
||||
static GimpObject * gimp_list_search (GimpContainer *container,
|
||||
GimpContainerSearchFunc func,
|
||||
gpointer user_data);
|
||||
static gboolean gimp_list_get_unique_names (GimpContainer *container);
|
||||
static GimpObject * gimp_list_get_child_by_name (GimpContainer *container,
|
||||
const gchar *name);
|
||||
static GimpObject * gimp_list_get_child_by_index (GimpContainer *container,
|
||||
gint index);
|
||||
static gint gimp_list_get_child_index (GimpContainer *container,
|
||||
GimpObject *object);
|
||||
|
||||
static void gimp_list_uniquefy_name (GimpList *gimp_list,
|
||||
GimpObject *object);
|
||||
static void gimp_list_object_renamed (GimpObject *object,
|
||||
GimpList *list);
|
||||
static void gimp_list_uniquefy_name (GimpList *gimp_list,
|
||||
GimpObject *object);
|
||||
static void gimp_list_object_renamed (GimpObject *object,
|
||||
GimpList *list);
|
||||
|
||||
|
||||
G_DEFINE_TYPE (GimpList, gimp_list, GIMP_TYPE_CONTAINER)
|
||||
@ -104,6 +107,7 @@ gimp_list_class_init (GimpListClass *klass)
|
||||
container_class->clear = gimp_list_clear;
|
||||
container_class->have = gimp_list_have;
|
||||
container_class->foreach = gimp_list_foreach;
|
||||
container_class->search = gimp_list_search;
|
||||
container_class->get_unique_names = gimp_list_get_unique_names;
|
||||
container_class->get_child_by_name = gimp_list_get_child_by_name;
|
||||
container_class->get_child_by_index = gimp_list_get_child_by_index;
|
||||
@ -328,6 +332,29 @@ gimp_list_foreach (GimpContainer *container,
|
||||
g_queue_foreach (list->queue, func, user_data);
|
||||
}
|
||||
|
||||
static GimpObject *
|
||||
gimp_list_search (GimpContainer *container,
|
||||
GimpContainerSearchFunc func,
|
||||
gpointer user_data)
|
||||
{
|
||||
GimpList *list = GIMP_LIST (container);
|
||||
GList *iter;
|
||||
|
||||
iter = list->queue->head;
|
||||
|
||||
while (iter)
|
||||
{
|
||||
GimpObject *object = iter->data;
|
||||
|
||||
iter = g_list_next (iter);
|
||||
|
||||
if (func (object, user_data))
|
||||
return object;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gimp_list_get_unique_names (GimpContainer *container)
|
||||
{
|
||||
|
Reference in New Issue
Block a user