diff --git a/app/actions/gimpgeglprocedure.c b/app/actions/gimpgeglprocedure.c index d1b6956300..237bd88ffe 100644 --- a/app/actions/gimpgeglprocedure.c +++ b/app/actions/gimpgeglprocedure.c @@ -251,11 +251,15 @@ gimp_gegl_procedure_execute_async (GimpProcedure *procedure, GimpContainer *container; GimpTool *active_tool; - settings = gimp_operation_config_new (procedure->original_name, + settings = gimp_operation_config_new (gimp, + procedure->original_name, gimp_viewable_get_icon_name (GIMP_VIEWABLE (procedure)), GIMP_TYPE_SETTINGS); - container = gimp_operation_config_get_container (G_TYPE_FROM_INSTANCE (settings)); + container = + gimp_operation_config_get_container (gimp, + G_TYPE_FROM_INSTANCE (settings), + (GCompareFunc) gimp_settings_compare); g_object_unref (settings); @@ -263,10 +267,15 @@ gimp_gegl_procedure_execute_async (GimpProcedure *procedure, settings = gimp_container_get_child_by_index (container, 0); /* only use the settings if they are automatically created "last used" - * values, not if they were saved explicitly and have a zero timestamp + * values, not if they were saved explicitly and have a zero timestamp; + * and if they are not a separator. */ - if (settings && GIMP_SETTINGS (settings)->time == 0) - settings = NULL; + if (settings && + (GIMP_SETTINGS (settings)->time == 0 || + ! gimp_object_get_name (settings))) + { + settings = NULL; + } if (run_mode == GIMP_RUN_WITH_LAST_VALS) { diff --git a/app/gegl/gimp-gegl.c b/app/gegl/gimp-gegl.c index 0574ab0468..db6a3c1092 100644 --- a/app/gegl/gimp-gegl.c +++ b/app/gegl/gimp-gegl.c @@ -73,7 +73,7 @@ gimp_gegl_init (Gimp *gimp) gimp_babl_init (); - gimp_operations_init (); + gimp_operations_init (gimp); } static void diff --git a/app/operations/gimp-operation-config.c b/app/operations/gimp-operation-config.c index 3330c5fb84..6d0f01db12 100644 --- a/app/operations/gimp-operation-config.c +++ b/app/operations/gimp-operation-config.c @@ -23,11 +23,14 @@ #include #include +#include "libgimpbase/gimpbase.h" #include "libgimpcolor/gimpcolor.h" #include "libgimpconfig/gimpconfig.h" #include "operations-types.h" +#include "core/gimp.h" + #include "core/gimplist.h" #include "core/gimpparamspecs-duplicate.h" #include "core/gimpviewable.h" @@ -49,11 +52,14 @@ static void gimp_operation_config_node_notify (GeglNode *node, const GParamSpec *gegl_pspec, GObject *config); +static void gimp_operation_config_add_sep (GimpContainer *container); +static void gimp_operation_config_remove_sep (GimpContainer *container); + /* public functions */ static GHashTable * -gimp_operation_config_get_type_table (void) +gimp_operation_config_get_type_table (Gimp *gimp) { static GHashTable *config_types = NULL; @@ -67,7 +73,7 @@ gimp_operation_config_get_type_table (void) } static GHashTable * -gimp_operation_config_get_container_table (void) +gimp_operation_config_get_container_table (Gimp *gimp) { static GHashTable *config_containers = NULL; @@ -235,15 +241,17 @@ gimp_operation_config_config_iface_init (GimpConfigInterface *iface) /* public functions */ void -gimp_operation_config_register (const gchar *operation, +gimp_operation_config_register (Gimp *gimp, + const gchar *operation, GType config_type) { GHashTable *config_types; + g_return_if_fail (GIMP_IS_GIMP (gimp)); g_return_if_fail (operation != NULL); g_return_if_fail (g_type_is_a (config_type, GIMP_TYPE_OBJECT)); - config_types = gimp_operation_config_get_type_table (); + config_types = gimp_operation_config_get_type_table (gimp); g_hash_table_insert (config_types, g_strdup (operation), @@ -251,17 +259,19 @@ gimp_operation_config_register (const gchar *operation, } GimpObject * -gimp_operation_config_new (const gchar *operation, +gimp_operation_config_new (Gimp *gimp, + const gchar *operation, const gchar *icon_name, GType parent_type) { GHashTable *config_types; GType config_type; + g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL); g_return_val_if_fail (operation != NULL, NULL); g_return_val_if_fail (g_type_is_a (parent_type, GIMP_TYPE_OBJECT), NULL); - config_types = gimp_operation_config_get_type_table (); + config_types = gimp_operation_config_get_type_table (gimp); config_type = (GType) g_hash_table_lookup (config_types, operation); @@ -315,7 +325,7 @@ gimp_operation_config_new (const gchar *operation, g_type_class_unref (viewable_class); } - gimp_operation_config_register (operation, config_type); + gimp_operation_config_register (gimp, operation, config_type); } } @@ -323,28 +333,144 @@ gimp_operation_config_new (const gchar *operation, } GimpContainer * -gimp_operation_config_get_container (GType config_type) +gimp_operation_config_get_container (Gimp *gimp, + GType config_type, + GCompareFunc sort_func) { GHashTable *config_containers; GimpContainer *container; + g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL); g_return_val_if_fail (g_type_is_a (config_type, GIMP_TYPE_OBJECT), NULL); - config_containers = gimp_operation_config_get_container_table (); + config_containers = gimp_operation_config_get_container_table (gimp); container = g_hash_table_lookup (config_containers, (gpointer) config_type); if (! container) { container = gimp_list_new (config_type, TRUE); + gimp_list_set_sort_func (GIMP_LIST (container), sort_func); g_hash_table_insert (config_containers, (gpointer) config_type, container); + + gimp_operation_config_deserialize (gimp, container, NULL); + + if (gimp_container_get_n_children (container) == 0) + { + gchar *basename; + GFile *file; + + basename = g_strconcat (g_type_name (config_type), ".settings", NULL); + file = gimp_directory_file ("filters", basename, NULL); + g_free (basename); + + if (! g_file_query_exists (file, NULL)) + { + GQuark quark = g_quark_from_static_string ("compat-file"); + + g_object_unref (file); + + file = g_type_get_qdata (config_type, quark); + + if (file) + { + g_object_ref (file); + + gimp_operation_config_deserialize (gimp, container, file); + } + } + + g_object_unref (file); + } + + gimp_operation_config_add_sep (container); } return container; } +void +gimp_operation_config_serialize (Gimp *gimp, + GimpContainer *container, + GFile *file) +{ + GError *error = NULL; + + g_return_if_fail (GIMP_IS_GIMP (gimp)); + g_return_if_fail (GIMP_IS_CONTAINER (container)); + g_return_if_fail (file == NULL || G_IS_FILE (file)); + + if (! file) + { + GType config_type = gimp_container_get_children_type (container); + gchar *basename; + + basename = g_strconcat (g_type_name (config_type), ".settings", NULL); + file = gimp_directory_file ("filters", basename, NULL); + g_free (basename); + } + + if (gimp->be_verbose) + g_print ("Writing '%s'\n", gimp_file_get_utf8_name (file)); + + gimp_operation_config_remove_sep (container); + + if (! gimp_config_serialize_to_gfile (GIMP_CONFIG (container), + file, + "settings", + "end of settings", + NULL, &error)) + { + gimp_message_literal (gimp, NULL, GIMP_MESSAGE_ERROR, + error->message); + g_clear_error (&error); + } + + gimp_operation_config_add_sep (container); + + g_object_unref (file); +} + +void +gimp_operation_config_deserialize (Gimp *gimp, + GimpContainer *container, + GFile *file) +{ + GError *error = NULL; + + g_return_if_fail (GIMP_IS_GIMP (gimp)); + g_return_if_fail (GIMP_IS_CONTAINER (container)); + g_return_if_fail (file == NULL || G_IS_FILE (file)); + + if (! file) + { + GType config_type = gimp_container_get_children_type (container); + gchar *basename; + + basename = g_strconcat (g_type_name (config_type), ".settings", NULL); + file = gimp_directory_file ("filters", basename, NULL); + g_free (basename); + } + + if (gimp->be_verbose) + g_print ("Parsing '%s'\n", gimp_file_get_utf8_name (file)); + + if (! gimp_config_deserialize_gfile (GIMP_CONFIG (container), + file, + NULL, &error)) + { + if (error->code != GIMP_CONFIG_ERROR_OPEN_ENOENT) + gimp_message_literal (gimp, NULL, GIMP_MESSAGE_ERROR, + error->message); + + g_clear_error (&error); + } + + g_object_unref (file); +} + void gimp_operation_config_sync_node (GimpObject *config, GeglNode *node) @@ -611,3 +737,33 @@ gimp_operation_config_node_notify (GeglNode *node, g_signal_handler_unblock (config, handler); } } + +static void +gimp_operation_config_add_sep (GimpContainer *container) +{ + GimpObject *sep = g_object_get_data (G_OBJECT (container), "separator"); + + if (! sep) + { + sep = g_object_new (gimp_container_get_children_type (container), + NULL); + + gimp_container_add (container, sep); + g_object_unref (sep); + + g_object_set_data (G_OBJECT (container), "separator", sep); + } +} + +static void +gimp_operation_config_remove_sep (GimpContainer *container) +{ + GimpObject *sep = g_object_get_data (G_OBJECT (container), "separator"); + + if (sep) + { + gimp_container_remove (container, sep); + + g_object_set_data (G_OBJECT (container), "separator", NULL); + } +} diff --git a/app/operations/gimp-operation-config.h b/app/operations/gimp-operation-config.h index 2fe98733b9..f8471a28ee 100644 --- a/app/operations/gimp-operation-config.h +++ b/app/operations/gimp-operation-config.h @@ -19,18 +19,30 @@ #define __GIMP_OPERATION_CONFIG_H__ -void gimp_operation_config_register (const gchar *operation, - GType config_type); +void gimp_operation_config_register (Gimp *gimp, + const gchar *operation, + GType config_type); -GimpObject * gimp_operation_config_new (const gchar *operation, - const gchar *icon_name, - GType parent_type); -GimpContainer * gimp_operation_config_get_container (GType config_type); +GimpObject * gimp_operation_config_new (Gimp *gimp, + const gchar *operation, + const gchar *icon_name, + GType parent_type); -void gimp_operation_config_sync_node (GimpObject *config, - GeglNode *node); -void gimp_operation_config_connect_node (GimpObject *config, - GeglNode *node); +GimpContainer * gimp_operation_config_get_container (Gimp *gimp, + GType config_type, + GCompareFunc sort_func); + +void gimp_operation_config_serialize (Gimp *gimp, + GimpContainer *container, + GFile *file); +void gimp_operation_config_deserialize (Gimp *gimp, + GimpContainer *container, + GFile *file); + +void gimp_operation_config_sync_node (GimpObject *config, + GeglNode *node); +void gimp_operation_config_connect_node (GimpObject *config, + GeglNode *node); #endif /* __GIMP_OPERATION_CONFIG_H__ */ diff --git a/app/operations/gimp-operations.c b/app/operations/gimp-operations.c index 957659d902..26136a7da8 100644 --- a/app/operations/gimp-operations.c +++ b/app/operations/gimp-operations.c @@ -22,6 +22,8 @@ #include #include +#include "libgimpbase/gimpbase.h" + #include "operations-types.h" #include "core/gimp.h" @@ -94,9 +96,21 @@ #include "layer-modes/gimpoperationsplit.h" -void -gimp_operations_init (void) +static void +set_compat_file (GType type, + const gchar *basename) { + GFile *file = gimp_directory_file ("tool-options", basename, NULL); + GQuark quark = g_quark_from_static_string ("compat-file"); + + g_type_set_qdata (type, quark, file); +} + +void +gimp_operations_init (Gimp *gimp) +{ + g_return_if_fail (GIMP_IS_GIMP (gimp)); + gimp_layer_modes_init (); g_type_class_ref (GIMP_TYPE_OPERATION_BLEND); @@ -154,16 +168,39 @@ gimp_operations_init (void) g_type_class_ref (GIMP_TYPE_OPERATION_REPLACE); g_type_class_ref (GIMP_TYPE_OPERATION_ANTI_ERASE); - gimp_operation_config_register ("gimp:brightness-contrast", + gimp_operation_config_register (gimp, + "gimp:brightness-contrast", GIMP_TYPE_BRIGHTNESS_CONTRAST_CONFIG); - gimp_operation_config_register ("gimp:color-balance", + set_compat_file (GIMP_TYPE_BRIGHTNESS_CONTRAST_CONFIG, + "gimp-brightness-contrast-tool.settings"); + + gimp_operation_config_register (gimp, + "gimp:color-balance", GIMP_TYPE_COLOR_BALANCE_CONFIG); - gimp_operation_config_register ("gimp:colorize", + set_compat_file (GIMP_TYPE_COLOR_BALANCE_CONFIG, + "gimp-color-balance-tool.settings"); + + gimp_operation_config_register (gimp, + "gimp:colorize", GIMP_TYPE_COLORIZE_CONFIG); - gimp_operation_config_register ("gimp:curves", + set_compat_file (GIMP_TYPE_COLORIZE_CONFIG, + "gimp-colorize-tool.settings"); + + gimp_operation_config_register (gimp, + "gimp:curves", GIMP_TYPE_CURVES_CONFIG); - gimp_operation_config_register ("gimp:hue-saturation", + set_compat_file (GIMP_TYPE_CURVES_CONFIG, + "gimp-curves-tool.settings"); + + gimp_operation_config_register (gimp, + "gimp:hue-saturation", GIMP_TYPE_HUE_SATURATION_CONFIG); - gimp_operation_config_register ("gimp:levels", + set_compat_file (GIMP_TYPE_HUE_SATURATION_CONFIG, + "gimp-hue-saturation-tool.settings"); + + gimp_operation_config_register (gimp, + "gimp:levels", GIMP_TYPE_LEVELS_CONFIG); + set_compat_file (GIMP_TYPE_LEVELS_CONFIG, + "gimp-levels-tool.settings"); } diff --git a/app/operations/gimp-operations.h b/app/operations/gimp-operations.h index d1378d109f..8f116264e7 100644 --- a/app/operations/gimp-operations.h +++ b/app/operations/gimp-operations.h @@ -21,7 +21,7 @@ #define __GIMP_OPERATIONS_H__ -void gimp_operations_init (void); +void gimp_operations_init (Gimp *gimp); #endif /* __GIMP_OPERATIONS_H__ */ diff --git a/app/tools/gimpfiltertool-settings.c b/app/tools/gimpfiltertool-settings.c index e48bf5a6d4..0ea903726b 100644 --- a/app/tools/gimpfiltertool-settings.c +++ b/app/tools/gimpfiltertool-settings.c @@ -62,7 +62,6 @@ static gboolean gimp_filter_tool_settings_export (GimpSettingsBox *box, GtkWidget * gimp_filter_tool_real_get_settings_ui (GimpFilterTool *filter_tool, GimpContainer *settings, - GFile *settings_file, const gchar *import_dialog_title, const gchar *export_dialog_title, const gchar *file_dialog_help_id, @@ -85,7 +84,6 @@ gimp_filter_tool_real_get_settings_ui (GimpFilterTool *filter_tool, *settings_box = gimp_settings_box_new (tool_info->gimp, filter_tool->config, settings, - settings_file, import_dialog_title, export_dialog_title, file_dialog_help_id, diff --git a/app/tools/gimpfiltertool-settings.h b/app/tools/gimpfiltertool-settings.h index 8da042f87a..1976f863d4 100644 --- a/app/tools/gimpfiltertool-settings.h +++ b/app/tools/gimpfiltertool-settings.h @@ -23,7 +23,6 @@ GtkWidget * gimp_filter_tool_real_get_settings_ui (GimpFilterTool *filter_tool, GimpContainer *settings, - GFile *settings_file, const gchar *import_dialog_title, const gchar *export_dialog_title, const gchar *file_dialog_help_id, diff --git a/app/tools/gimpfiltertool.c b/app/tools/gimpfiltertool.c index de024a467a..85e07f821e 100644 --- a/app/tools/gimpfiltertool.c +++ b/app/tools/gimpfiltertool.c @@ -133,6 +133,9 @@ static void gimp_filter_tool_dialog (GimpFilterTool *filter_to static void gimp_filter_tool_dialog_unmap (GtkWidget *dialog, GimpFilterTool *filter_tool); static void gimp_filter_tool_reset (GimpFilterTool *filter_tool); +static GtkWidget * gimp_filter_tool_get_settings_ui + (GimpFilterTool *filter_tool); + static void gimp_filter_tool_create_filter (GimpFilterTool *filter_tool); static void gimp_filter_tool_flush (GimpDrawableFilter *filter, @@ -374,33 +377,9 @@ gimp_filter_tool_initialize (GimpTool *tool, if (filter_tool->config && klass->settings_name) { - GType type = G_TYPE_FROM_INSTANCE (filter_tool->config); - GimpContainer *settings; - GFile *settings_file; - GFile *default_folder; - GtkWidget *settings_ui; - - settings = gimp_operation_config_get_container (type); - if (! gimp_list_get_sort_func (GIMP_LIST (settings))) - gimp_list_set_sort_func (GIMP_LIST (settings), - (GCompareFunc) gimp_settings_compare); - - settings_file = gimp_tool_info_get_options_file (tool_info, - ".settings"); - default_folder = gimp_directory_file (klass->settings_name, NULL); - - settings_ui = klass->get_settings_ui (filter_tool, - settings, - settings_file, - klass->import_dialog_title, - klass->export_dialog_title, - filter_tool->help_id, - default_folder, - &filter_tool->settings_box); - - g_object_unref (default_folder); - g_object_unref (settings_file); + GtkWidget *settings_ui; + settings_ui = gimp_filter_tool_get_settings_ui (filter_tool); gtk_box_pack_start (GTK_BOX (vbox), settings_ui, FALSE, FALSE, 0); gtk_widget_show (settings_ui); } @@ -977,6 +956,36 @@ gimp_filter_tool_reset (GimpFilterTool *filter_tool) g_object_thaw_notify (filter_tool->config); } +static GtkWidget * +gimp_filter_tool_get_settings_ui (GimpFilterTool *filter_tool) +{ + GimpTool *tool = GIMP_TOOL (filter_tool); + GimpFilterToolClass *klass = GIMP_FILTER_TOOL_GET_CLASS (filter_tool); + GType type = G_TYPE_FROM_INSTANCE (filter_tool->config); + GimpContainer *settings; + GFile *default_folder; + GtkWidget *settings_ui; + + settings = + gimp_operation_config_get_container (tool->tool_info->gimp, + type, + (GCompareFunc) gimp_settings_compare); + + default_folder = gimp_directory_file (klass->settings_name, NULL); + + settings_ui = klass->get_settings_ui (filter_tool, + settings, + klass->import_dialog_title, + klass->export_dialog_title, + filter_tool->help_id, + default_folder, + &filter_tool->settings_box); + + g_object_unref (default_folder); + + return settings_ui; +} + static void gimp_filter_tool_create_filter (GimpFilterTool *filter_tool) { @@ -1313,7 +1322,8 @@ gimp_filter_tool_get_operation (GimpFilterTool *filter_tool) "operation", operation_name, NULL); filter_tool->config = - G_OBJECT (gimp_operation_config_new (operation_name, + G_OBJECT (gimp_operation_config_new (tool_info->gimp, + operation_name, filter_tool->icon_name, GIMP_TYPE_SETTINGS)); diff --git a/app/tools/gimpfiltertool.h b/app/tools/gimpfiltertool.h index fd726424d8..091d7be047 100644 --- a/app/tools/gimpfiltertool.h +++ b/app/tools/gimpfiltertool.h @@ -82,7 +82,6 @@ struct _GimpFilterToolClass GtkWidget * (* get_settings_ui) (GimpFilterTool *filter_tool, GimpContainer *settings, - GFile *settings_file, const gchar *import_dialog_title, const gchar *export_dialog_title, const gchar *file_dialog_help_id, diff --git a/app/tools/gimpoperationtool.c b/app/tools/gimpoperationtool.c index c9a1540d1d..7720bd79f9 100644 --- a/app/tools/gimpoperationtool.c +++ b/app/tools/gimpoperationtool.c @@ -88,7 +88,6 @@ static void gimp_operation_tool_dialog (GimpFilterTool *filte static void gimp_operation_tool_reset (GimpFilterTool *filter_tool); static GtkWidget * gimp_operation_tool_get_settings_ui (GimpFilterTool *filter_tool, GimpContainer *settings, - GFile *settings_file, const gchar *import_dialog_title, const gchar *export_dialog_title, const gchar *file_dialog_help_id, @@ -320,7 +319,6 @@ gimp_operation_tool_reset (GimpFilterTool *filter_tool) static GtkWidget * gimp_operation_tool_get_settings_ui (GimpFilterTool *filter_tool, GimpContainer *settings, - GFile *settings_file, const gchar *import_dialog_title, const gchar *export_dialog_title, const gchar *file_dialog_help_id, @@ -329,23 +327,15 @@ gimp_operation_tool_get_settings_ui (GimpFilterTool *filter_tool, { GimpOperationTool *tool = GIMP_OPERATION_TOOL (filter_tool); GtkWidget *widget; - gchar *basename; - GFile *file; gchar *import_title; gchar *export_title; - basename = g_strconcat (G_OBJECT_TYPE_NAME (filter_tool->config), - ".settings", NULL); - file = gimp_directory_file ("filters", basename, NULL); - g_free (basename); - import_title = g_strdup_printf (_("Import '%s' Settings"), tool->title); export_title = g_strdup_printf (_("Export '%s' Settings"), tool->title); widget = GIMP_FILTER_TOOL_CLASS (parent_class)->get_settings_ui (filter_tool, settings, - file, import_title, export_title, file_dialog_help_id, @@ -355,8 +345,6 @@ gimp_operation_tool_get_settings_ui (GimpFilterTool *filter_tool, g_free (import_title); g_free (export_title); - g_object_unref (file); - return widget; } diff --git a/app/widgets/gimpsettingsbox.c b/app/widgets/gimpsettingsbox.c index 6d11466216..6b16460985 100644 --- a/app/widgets/gimpsettingsbox.c +++ b/app/widgets/gimpsettingsbox.c @@ -2,7 +2,7 @@ * Copyright (C) 1995 Spencer Kimball and Peter Mattis * * gimpsettingsbox.c - * Copyright (C) 2008 Michael Natterer + * Copyright (C) 2008-2017 Michael Natterer * * 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 @@ -23,12 +23,13 @@ #include #include -#include "libgimpbase/gimpbase.h" #include "libgimpconfig/gimpconfig.h" #include "libgimpwidgets/gimpwidgets.h" #include "widgets-types.h" +#include "operations/gimp-operation-config.h" + #include "core/gimp.h" #include "core/gimplist.h" #include "core/gimpmarshal.h" @@ -56,8 +57,7 @@ enum PROP_0, PROP_GIMP, PROP_CONFIG, - PROP_CONTAINER, - PROP_FILE + PROP_CONTAINER }; @@ -75,7 +75,6 @@ struct _GimpSettingsBoxPrivate Gimp *gimp; GObject *config; GimpContainer *container; - GFile *file; gchar *import_dialog_title; gchar *export_dialog_title; @@ -100,8 +99,6 @@ static void gimp_settings_box_get_property (GObject *object, GValue *value, GParamSpec *pspec); -static void gimp_settings_box_deserialize (GimpSettingsBox *box); -static void gimp_settings_box_serialize (GimpSettingsBox *box); static GtkWidget * gimp_settings_box_menu_item_add (GimpSettingsBox *box, const gchar *icon_name, @@ -218,13 +215,6 @@ gimp_settings_box_class_init (GimpSettingsBoxClass *klass) GIMP_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); - g_object_class_install_property (object_class, PROP_FILE, - g_param_spec_object ("file", - NULL, NULL, - G_TYPE_FILE, - GIMP_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY)); - g_type_class_add_private (klass, sizeof (GimpSettingsBoxPrivate)); } @@ -252,10 +242,6 @@ gimp_settings_box_constructed (GObject *object) g_assert (GIMP_IS_GIMP (private->gimp)); g_assert (GIMP_IS_CONFIG (private->config)); g_assert (GIMP_IS_CONTAINER (private->container)); - g_assert (G_IS_FILE (private->file)); - - if (gimp_container_get_n_children (private->container) == 0) - gimp_settings_box_deserialize (box); private->combo = gimp_container_combo_box_new (private->container, gimp_get_user_context (private->gimp), @@ -352,12 +338,6 @@ gimp_settings_box_finalize (GObject *object) private->container = NULL; } - if (private->file) - { - g_object_unref (private->file); - private->file = NULL; - } - if (private->last_file) { g_object_unref (private->last_file); @@ -423,10 +403,6 @@ gimp_settings_box_set_property (GObject *object, private->container = g_value_dup_object (value); break; - case PROP_FILE: - private->file = g_value_dup_object (value); - break; - default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -455,86 +431,12 @@ gimp_settings_box_get_property (GObject *object, g_value_set_object (value, private->container); break; - case PROP_FILE: - g_value_set_object (value, private->file); - break; - default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } -static void -gimp_settings_box_separator_add (GimpContainer *container) -{ - GimpObject *sep = g_object_new (gimp_container_get_children_type (container), - NULL); - - gimp_container_add (container, sep); - g_object_unref (sep); - - g_object_set_data (G_OBJECT (container), "separator", sep); -} - -static void -gimp_settings_box_separator_remove (GimpContainer *container) -{ - GimpObject *sep = g_object_get_data (G_OBJECT (container), "separator"); - - gimp_container_remove (container, sep); - - g_object_set_data (G_OBJECT (container), "separator", NULL); -} - -static void -gimp_settings_box_deserialize (GimpSettingsBox *box) -{ - GimpSettingsBoxPrivate *private = GET_PRIVATE (box); - GError *error = NULL; - - if (private->gimp->be_verbose) - g_print ("Parsing '%s'\n", gimp_file_get_utf8_name (private->file)); - - if (! gimp_config_deserialize_gfile (GIMP_CONFIG (private->container), - private->file, - NULL, &error)) - { - if (error->code != GIMP_CONFIG_ERROR_OPEN_ENOENT) - gimp_message_literal (private->gimp, NULL, GIMP_MESSAGE_ERROR, - error->message); - - g_clear_error (&error); - } - - gimp_settings_box_separator_add (private->container); -} - -static void -gimp_settings_box_serialize (GimpSettingsBox *box) -{ - GimpSettingsBoxPrivate *private = GET_PRIVATE (box); - GError *error = NULL; - - gimp_settings_box_separator_remove (private->container); - - if (private->gimp->be_verbose) - g_print ("Writing '%s'\n", gimp_file_get_utf8_name (private->file)); - - if (! gimp_config_serialize_to_gfile (GIMP_CONFIG (private->container), - private->file, - "settings", - "end of settings", - NULL, &error)) - { - gimp_message_literal (private->gimp, NULL, GIMP_MESSAGE_ERROR, - error->message); - g_clear_error (&error); - } - - gimp_settings_box_separator_add (private->container); -} - static GtkWidget * gimp_settings_box_menu_item_add (GimpSettingsBox *box, const gchar *icon_name, @@ -735,7 +637,7 @@ gimp_settings_box_favorite_callback (GtkWidget *query_box, gimp_container_add (private->container, GIMP_OBJECT (config)); g_object_unref (config); - gimp_settings_box_serialize (box); + gimp_operation_config_serialize (private->gimp, private->container, NULL); } static void @@ -950,7 +852,6 @@ GtkWidget * gimp_settings_box_new (Gimp *gimp, GObject *config, GimpContainer *container, - GFile *file, const gchar *import_dialog_title, const gchar *export_dialog_title, const gchar *file_dialog_help_id, @@ -963,7 +864,6 @@ gimp_settings_box_new (Gimp *gimp, g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL); g_return_val_if_fail (GIMP_IS_CONFIG (config), NULL); g_return_val_if_fail (GIMP_IS_CONTAINER (container), NULL); - g_return_val_if_fail (G_IS_FILE (file), NULL); g_return_val_if_fail (default_folder == NULL || G_IS_FILE (default_folder), NULL); g_return_val_if_fail (last_file == NULL || G_IS_FILE (last_file), NULL); @@ -972,7 +872,6 @@ gimp_settings_box_new (Gimp *gimp, "gimp", gimp, "config", config, "container", container, - "file", file, NULL); private = GET_PRIVATE (box); @@ -1037,7 +936,7 @@ gimp_settings_box_add_current (GimpSettingsBox *box, gimp_settings_box_truncate_list (box, max_recent); - gimp_settings_box_serialize (box); + gimp_operation_config_serialize (private->gimp, private->container, NULL); } GtkWidget * diff --git a/app/widgets/gimpsettingsbox.h b/app/widgets/gimpsettingsbox.h index 3813b84ea6..7a1c4a92a9 100644 --- a/app/widgets/gimpsettingsbox.h +++ b/app/widgets/gimpsettingsbox.h @@ -57,7 +57,6 @@ GType gimp_settings_box_get_type (void) G_GNUC_CONST; GtkWidget * gimp_settings_box_new (Gimp *gimp, GObject *config, GimpContainer *container, - GFile *file, const gchar *import_dialog_title, const gchar *export_dialog_title, const gchar *file_dialog_help_id, diff --git a/app/widgets/gimpsettingseditor.c b/app/widgets/gimpsettingseditor.c index b6a7f54367..d7b2e52c06 100644 --- a/app/widgets/gimpsettingseditor.c +++ b/app/widgets/gimpsettingseditor.c @@ -2,7 +2,7 @@ * Copyright (C) 1995 Spencer Kimball and Peter Mattis * * gimpsettingseditor.c - * Copyright (C) 2008-2011 Michael Natterer + * Copyright (C) 2008-2017 Michael Natterer * * 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 @@ -31,8 +31,10 @@ #include "widgets-types.h" +#include "operations/gimp-operation-config.h" + #include "core/gimp.h" -#include "core/gimplist.h" +#include "core/gimpcontainer.h" #include "core/gimpviewable.h" #include "gimpcontainertreestore.h" @@ -360,6 +362,8 @@ gimp_settings_editor_delete_clicked (GtkWidget *widget, gimp_container_view_select_item (GIMP_CONTAINER_VIEW (private->view), GIMP_VIEWABLE (new)); + + gimp_operation_config_serialize (private->gimp, private->container, NULL); } } @@ -409,6 +413,9 @@ gimp_settings_editor_name_edited (GtkCellRendererText *cell, /* set name after time so the object is reordered correctly */ gimp_object_take_name (object, name); + + gimp_operation_config_serialize (private->gimp, private->container, + NULL); } else {