summaryrefslogtreecommitdiffstats
path: root/app/tools/gimpfiltertool-settings.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/tools/gimpfiltertool-settings.c')
-rw-r--r--app/tools/gimpfiltertool-settings.c252
1 files changed, 252 insertions, 0 deletions
diff --git a/app/tools/gimpfiltertool-settings.c b/app/tools/gimpfiltertool-settings.c
new file mode 100644
index 0000000..c8364ff
--- /dev/null
+++ b/app/tools/gimpfiltertool-settings.c
@@ -0,0 +1,252 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * gimpfiltertool-settings.c
+ *
+ * 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 <gegl.h>
+#include <gtk/gtk.h>
+
+#include "libgimpbase/gimpbase.h"
+#include "libgimpconfig/gimpconfig.h"
+#include "libgimpwidgets/gimpwidgets.h"
+
+#include "tools-types.h"
+
+#include "core/gimp.h"
+#include "core/gimptoolinfo.h"
+
+#include "widgets/gimpsettingsbox.h"
+
+#include "display/gimptoolgui.h"
+
+#include "gimpfiltertool.h"
+#include "gimpfiltertool-settings.h"
+
+#include "gimp-intl.h"
+
+
+/* local function prototypes */
+
+static gboolean gimp_filter_tool_settings_import (GimpSettingsBox *box,
+ GFile *file,
+ GimpFilterTool *filter_tool);
+static gboolean gimp_filter_tool_settings_export (GimpSettingsBox *box,
+ GFile *file,
+ GimpFilterTool *filter_tool);
+
+
+/* public functions */
+
+GtkWidget *
+gimp_filter_tool_get_settings_box (GimpFilterTool *filter_tool)
+{
+ GimpToolInfo *tool_info = GIMP_TOOL (filter_tool)->tool_info;
+ GQuark quark = g_quark_from_static_string ("settings-folder");
+ GType type = G_TYPE_FROM_INSTANCE (filter_tool->config);
+ GFile *settings_folder;
+ GtkWidget *box;
+ GtkWidget *label;
+ GtkWidget *combo;
+ gchar *import_title;
+ gchar *export_title;
+
+ settings_folder = g_type_get_qdata (type, quark);
+
+ import_title = g_strdup_printf (_("Import '%s' Settings"),
+ gimp_tool_get_label (GIMP_TOOL (filter_tool)));
+ export_title = g_strdup_printf (_("Export '%s' Settings"),
+ gimp_tool_get_label (GIMP_TOOL (filter_tool)));
+
+ box = gimp_settings_box_new (tool_info->gimp,
+ filter_tool->config,
+ filter_tool->settings,
+ import_title,
+ export_title,
+ gimp_tool_get_help_id (GIMP_TOOL (filter_tool)),
+ settings_folder,
+ NULL);
+
+ g_free (import_title);
+ g_free (export_title);
+
+ g_signal_connect (box, "import",
+ G_CALLBACK (gimp_filter_tool_settings_import),
+ filter_tool);
+
+ g_signal_connect (box, "export",
+ G_CALLBACK (gimp_filter_tool_settings_export),
+ filter_tool);
+
+ g_signal_connect_swapped (box, "selected",
+ G_CALLBACK (gimp_filter_tool_set_config),
+ filter_tool);
+
+ label = gtk_label_new_with_mnemonic (_("Pre_sets:"));
+ gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
+ gtk_box_reorder_child (GTK_BOX (box), label, 0);
+ gtk_widget_show (label);
+
+ combo = gimp_settings_box_get_combo (GIMP_SETTINGS_BOX (box));
+ gtk_label_set_mnemonic_widget (GTK_LABEL (label), combo);
+
+ return box;
+}
+
+gboolean
+gimp_filter_tool_real_settings_import (GimpFilterTool *filter_tool,
+ GInputStream *input,
+ GError **error)
+{
+ return gimp_config_deserialize_stream (GIMP_CONFIG (filter_tool->config),
+ input,
+ NULL, error);
+}
+
+gboolean
+gimp_filter_tool_real_settings_export (GimpFilterTool *filter_tool,
+ GOutputStream *output,
+ GError **error)
+{
+ GimpTool *tool = GIMP_TOOL (filter_tool);
+ gchar *header;
+ gchar *footer;
+ gboolean success;
+
+ header = g_strdup_printf ("GIMP '%s' settings",
+ gimp_tool_get_label (tool));
+ footer = g_strdup_printf ("end of '%s' settings",
+ gimp_tool_get_label (tool));
+
+ success = gimp_config_serialize_to_stream (GIMP_CONFIG (filter_tool->config),
+ output,
+ header, footer,
+ NULL, error);
+
+ g_free (header);
+ g_free (footer);
+
+ return success;
+}
+
+
+/* private functions */
+
+static gboolean
+gimp_filter_tool_settings_import (GimpSettingsBox *box,
+ GFile *file,
+ GimpFilterTool *filter_tool)
+{
+ GimpFilterToolClass *tool_class = GIMP_FILTER_TOOL_GET_CLASS (filter_tool);
+ GInputStream *input;
+ GError *error = NULL;
+
+ g_return_val_if_fail (tool_class->settings_import != NULL, FALSE);
+
+ if (GIMP_TOOL (filter_tool)->tool_info->gimp->be_verbose)
+ g_print ("Parsing '%s'\n", gimp_file_get_utf8_name (file));
+
+ input = G_INPUT_STREAM (g_file_read (file, NULL, &error));
+ if (! input)
+ {
+ gimp_message (GIMP_TOOL (filter_tool)->tool_info->gimp,
+ G_OBJECT (gimp_tool_gui_get_dialog (filter_tool->gui)),
+ GIMP_MESSAGE_ERROR,
+ _("Could not open '%s' for reading: %s"),
+ gimp_file_get_utf8_name (file),
+ error->message);
+ g_clear_error (&error);
+ return FALSE;
+ }
+
+ if (! tool_class->settings_import (filter_tool, input, &error))
+ {
+ gimp_message (GIMP_TOOL (filter_tool)->tool_info->gimp,
+ G_OBJECT (gimp_tool_gui_get_dialog (filter_tool->gui)),
+ GIMP_MESSAGE_ERROR,
+ _("Error reading '%s': %s"),
+ gimp_file_get_utf8_name (file),
+ error->message);
+ g_clear_error (&error);
+ g_object_unref (input);
+ return FALSE;
+ }
+
+ g_object_unref (input);
+
+ return TRUE;
+}
+
+static gboolean
+gimp_filter_tool_settings_export (GimpSettingsBox *box,
+ GFile *file,
+ GimpFilterTool *filter_tool)
+{
+ GimpFilterToolClass *tool_class = GIMP_FILTER_TOOL_GET_CLASS (filter_tool);
+ GOutputStream *output;
+ GError *error = NULL;
+
+ g_return_val_if_fail (tool_class->settings_export != NULL, FALSE);
+
+ if (GIMP_TOOL (filter_tool)->tool_info->gimp->be_verbose)
+ g_print ("Writing '%s'\n", gimp_file_get_utf8_name (file));
+
+ output = G_OUTPUT_STREAM (g_file_replace (file,
+ NULL, FALSE, G_FILE_CREATE_NONE,
+ NULL, &error));
+ if (! output)
+ {
+ gimp_message_literal (GIMP_TOOL (filter_tool)->tool_info->gimp,
+ G_OBJECT (gimp_tool_gui_get_dialog (filter_tool->gui)),
+ GIMP_MESSAGE_ERROR,
+ error->message);
+ g_clear_error (&error);
+ return FALSE;
+ }
+
+ if (! tool_class->settings_export (filter_tool, output, &error))
+ {
+ GCancellable *cancellable = g_cancellable_new ();
+
+ gimp_message (GIMP_TOOL (filter_tool)->tool_info->gimp,
+ G_OBJECT (gimp_tool_gui_get_dialog (filter_tool->gui)),
+ GIMP_MESSAGE_ERROR,
+ _("Error writing '%s': %s"),
+ gimp_file_get_utf8_name (file),
+ error->message);
+ g_clear_error (&error);
+
+ /* Cancel the overwrite initiated by g_file_replace(). */
+ g_cancellable_cancel (cancellable);
+ g_output_stream_close (output, cancellable, NULL);
+ g_object_unref (cancellable);
+ g_object_unref (output);
+
+ return FALSE;
+ }
+
+ g_object_unref (output);
+
+ gimp_message (GIMP_TOOL (filter_tool)->tool_info->gimp,
+ G_OBJECT (GIMP_TOOL (filter_tool)->display),
+ GIMP_MESSAGE_INFO,
+ _("Settings saved to '%s'"),
+ gimp_file_get_utf8_name (file));
+
+ return TRUE;
+}