summaryrefslogtreecommitdiffstats
path: root/app/core/gimpcontainer-filter.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 18:30:19 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 18:30:19 +0000
commit5c1676dfe6d2f3c837a5e074117b45613fd29a72 (patch)
treecbffb45144febf451e54061db2b21395faf94bfe /app/core/gimpcontainer-filter.c
parentInitial commit. (diff)
downloadgimp-5c1676dfe6d2f3c837a5e074117b45613fd29a72.tar.xz
gimp-5c1676dfe6d2f3c837a5e074117b45613fd29a72.zip
Adding upstream version 2.10.34.upstream/2.10.34upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'app/core/gimpcontainer-filter.c')
-rw-r--r--app/core/gimpcontainer-filter.c174
1 files changed, 174 insertions, 0 deletions
diff --git a/app/core/gimpcontainer-filter.c b/app/core/gimpcontainer-filter.c
new file mode 100644
index 0000000..956a4a0
--- /dev/null
+++ b/app/core/gimpcontainer-filter.c
@@ -0,0 +1,174 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995-1997 Spencer Kimball and Peter Mattis
+ *
+ * gimpcontainer-filter.c
+ * Copyright (C) 2003 Sven Neumann <sven@gimp.org>
+ *
+ * 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 <string.h>
+
+#include <glib-object.h>
+
+#include "core-types.h"
+
+#include "gimpcontainer.h"
+#include "gimpcontainer-filter.h"
+#include "gimplist.h"
+
+
+typedef struct
+{
+ GimpObjectFilterFunc filter;
+ GimpContainer *container;
+ gpointer user_data;
+} GimpContainerFilterContext;
+
+
+static void
+gimp_container_filter_foreach_func (GimpObject *object,
+ GimpContainerFilterContext *context)
+{
+ if (context->filter (object, context->user_data))
+ gimp_container_add (context->container, object);
+}
+
+/**
+ * gimp_container_filter:
+ * @container: a #GimpContainer to filter
+ * @filter: a #GimpObjectFilterFunc
+ * @user_data: a pointer passed to @filter
+ *
+ * Calls the supplied @filter function on each object in @container.
+ * A return value of %TRUE is interpreted as a match.
+ *
+ * Returns: a weak #GimpContainer filled with matching objects.
+ **/
+GimpContainer *
+gimp_container_filter (GimpContainer *container,
+ GimpObjectFilterFunc filter,
+ gpointer user_data)
+{
+ GimpContainer *result;
+ GimpContainerFilterContext context;
+
+ g_return_val_if_fail (GIMP_IS_CONTAINER (container), NULL);
+ g_return_val_if_fail (filter != NULL, NULL);
+
+ result =
+ g_object_new (G_TYPE_FROM_INSTANCE (container),
+ "children-type", gimp_container_get_children_type (container),
+ "policy", GIMP_CONTAINER_POLICY_WEAK,
+ NULL);
+
+ context.filter = filter;
+ context.container = result;
+ context.user_data = user_data;
+
+ gimp_container_foreach (container,
+ (GFunc) gimp_container_filter_foreach_func,
+ &context);
+
+ /* This is somewhat ugly, but it keeps lists in the same order. */
+ if (GIMP_IS_LIST (result))
+ gimp_list_reverse (GIMP_LIST (result));
+
+
+ return result;
+}
+
+
+static gboolean
+gimp_object_filter_by_name (GimpObject *object,
+ const GRegex *regex)
+{
+ return g_regex_match (regex, gimp_object_get_name (object), 0, NULL);
+}
+
+/**
+ * gimp_container_filter_by_name:
+ * @container: a #GimpContainer to filter
+ * @regexp: a regular expression (as a %NULL-terminated string)
+ * @error: error location to report errors or %NULL
+ *
+ * This function performs a case-insensitive regular expression search
+ * on the names of the GimpObjects in @container.
+ *
+ * Returns: a weak #GimpContainer filled with matching objects.
+ **/
+GimpContainer *
+gimp_container_filter_by_name (GimpContainer *container,
+ const gchar *regexp,
+ GError **error)
+{
+ GimpContainer *result;
+ GRegex *regex;
+
+ g_return_val_if_fail (GIMP_IS_CONTAINER (container), NULL);
+ g_return_val_if_fail (regexp != NULL, NULL);
+ g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+ regex = g_regex_new (regexp, G_REGEX_CASELESS | G_REGEX_OPTIMIZE, 0,
+ error);
+
+ if (! regex)
+ return NULL;
+
+ result =
+ gimp_container_filter (container,
+ (GimpObjectFilterFunc) gimp_object_filter_by_name,
+ regex);
+
+ g_regex_unref (regex);
+
+ return result;
+}
+
+
+gchar **
+gimp_container_get_filtered_name_array (GimpContainer *container,
+ const gchar *regexp,
+ gint *length)
+{
+ GimpContainer *weak;
+ GError *error = NULL;
+
+ g_return_val_if_fail (GIMP_IS_CONTAINER (container), NULL);
+ g_return_val_if_fail (length != NULL, NULL);
+
+ if (regexp == NULL || strlen (regexp) == 0)
+ return (gimp_container_get_name_array (container, length));
+
+ weak = gimp_container_filter_by_name (container, regexp, &error);
+
+ if (weak)
+ {
+ gchar **retval = gimp_container_get_name_array (weak, length);
+
+ g_object_unref (weak);
+
+ return retval;
+ }
+ else
+ {
+ g_warning ("%s", error->message);
+ g_error_free (error);
+
+ *length = 0;
+ return NULL;
+ }
+}