app: various tool options and tool preset fixes
- move the code that sets the tool options' "defined" and "serialize" properties from GimpToolInto to GimpToolOptions so they are always set correctly. - make GimpToolOptions fix broken serialized NULL tools automatically. - make sure a GimpToolPreset's tool options always has a tool set. If all fails, set a NULL tool explicitly and let the logic in GimpToolOptions find the right tool. - set GimpToolPreset's "use" booleans to FALSE for context properties that have no effect on the tool. - set GimpToolPresetEditor's toggle insensitive for these properties.
This commit is contained in:
@ -292,15 +292,6 @@ gimp_tool_info_new (Gimp *gimp,
|
||||
"tool", tool_info,
|
||||
"tool-info", tool_info, NULL);
|
||||
|
||||
if (tool_info->context_props)
|
||||
{
|
||||
gimp_context_define_properties (GIMP_CONTEXT (tool_info->tool_options),
|
||||
tool_info->context_props, FALSE);
|
||||
}
|
||||
|
||||
gimp_context_set_serialize_properties (GIMP_CONTEXT (tool_info->tool_options),
|
||||
tool_info->context_props);
|
||||
|
||||
if (tool_info->tool_options_type != GIMP_TYPE_TOOL_OPTIONS)
|
||||
{
|
||||
GimpContainer *presets;
|
||||
|
@ -137,7 +137,7 @@ gimp_tool_options_check_tool_info (GimpToolOptions *options,
|
||||
GimpToolInfo *tool_info,
|
||||
gboolean warn)
|
||||
{
|
||||
if (G_OBJECT_TYPE (options) == tool_info->tool_options_type)
|
||||
if (tool_info && G_OBJECT_TYPE (options) == tool_info->tool_options_type)
|
||||
{
|
||||
return tool_info;
|
||||
}
|
||||
@ -145,7 +145,7 @@ gimp_tool_options_check_tool_info (GimpToolOptions *options,
|
||||
{
|
||||
GList *list;
|
||||
|
||||
for (list = gimp_get_tool_info_iter (tool_info->gimp);
|
||||
for (list = gimp_get_tool_info_iter (GIMP_CONTEXT (options)->gimp);
|
||||
list;
|
||||
list = g_list_next (list))
|
||||
{
|
||||
@ -157,7 +157,7 @@ gimp_tool_options_check_tool_info (GimpToolOptions *options,
|
||||
g_printerr ("%s: correcting bogus deserialized tool "
|
||||
"type '%s' with right type '%s'\n",
|
||||
g_type_name (G_OBJECT_TYPE (options)),
|
||||
gimp_object_get_name (tool_info),
|
||||
tool_info ? gimp_object_get_name (tool_info) : "NULL",
|
||||
gimp_object_get_name (new_info));
|
||||
|
||||
return new_info;
|
||||
@ -205,7 +205,16 @@ gimp_tool_options_set_property (GObject *object,
|
||||
tool_info = gimp_tool_options_check_tool_info (options, tool_info, TRUE);
|
||||
|
||||
if (! options->tool_info)
|
||||
options->tool_info = g_value_dup_object (value);
|
||||
{
|
||||
options->tool_info = g_object_ref (tool_info);
|
||||
|
||||
if (tool_info->context_props)
|
||||
gimp_context_define_properties (GIMP_CONTEXT (options),
|
||||
tool_info->context_props, FALSE);
|
||||
|
||||
gimp_context_set_serialize_properties (GIMP_CONTEXT (options),
|
||||
tool_info->context_props);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -335,9 +335,10 @@ gimp_tool_preset_deserialize_property (GimpConfig *config,
|
||||
{
|
||||
case PROP_TOOL_OPTIONS:
|
||||
{
|
||||
GObject *options;
|
||||
gchar *type_name;
|
||||
GType type;
|
||||
GObject *options;
|
||||
gchar *type_name;
|
||||
GType type;
|
||||
GimpContextPropMask serialize_props;
|
||||
|
||||
if (! gimp_scanner_parse_string (scanner, &type_name))
|
||||
{
|
||||
@ -381,10 +382,37 @@ gimp_tool_preset_deserialize_property (GimpConfig *config,
|
||||
break;
|
||||
}
|
||||
|
||||
/* this is a hack */
|
||||
g_object_set (options,
|
||||
"tool-info", gimp_context_get_tool (GIMP_CONTEXT (options)),
|
||||
NULL);
|
||||
/* we need both tool and tool-info on the options */
|
||||
if (gimp_context_get_tool (GIMP_CONTEXT (options)))
|
||||
{
|
||||
g_object_set (options,
|
||||
"tool-info",
|
||||
gimp_context_get_tool (GIMP_CONTEXT (options)),
|
||||
NULL);
|
||||
}
|
||||
else if (GIMP_TOOL_OPTIONS (options)->tool_info)
|
||||
{
|
||||
g_object_set (options,
|
||||
"tool", GIMP_TOOL_OPTIONS (options)->tool_info,
|
||||
NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* if we have none, the options set_property() logic will
|
||||
* replace the NULL with its best guess
|
||||
*/
|
||||
g_object_set (options,
|
||||
"tool", NULL,
|
||||
"tool-info", NULL,
|
||||
NULL);
|
||||
}
|
||||
|
||||
serialize_props =
|
||||
gimp_context_get_serialize_properties (GIMP_CONTEXT (options));
|
||||
|
||||
gimp_context_set_serialize_properties (GIMP_CONTEXT (options),
|
||||
serialize_props |
|
||||
GIMP_CONTEXT_TOOL_MASK);
|
||||
|
||||
g_value_take_object (value, options);
|
||||
}
|
||||
@ -413,9 +441,39 @@ gimp_tool_preset_set_options (GimpToolPreset *preset,
|
||||
|
||||
if (options)
|
||||
{
|
||||
GimpContextPropMask serialize_props;
|
||||
|
||||
preset->tool_options =
|
||||
GIMP_TOOL_OPTIONS (gimp_config_duplicate (GIMP_CONFIG (options)));
|
||||
|
||||
serialize_props =
|
||||
gimp_context_get_serialize_properties (GIMP_CONTEXT (preset->tool_options));
|
||||
|
||||
gimp_context_set_serialize_properties (GIMP_CONTEXT (preset->tool_options),
|
||||
serialize_props |
|
||||
GIMP_CONTEXT_TOOL_MASK);
|
||||
|
||||
if (! (serialize_props & GIMP_CONTEXT_FOREGROUND_MASK))
|
||||
g_object_set (preset, "use-fg-bg", FALSE, NULL);
|
||||
|
||||
if (! (serialize_props & GIMP_CONTEXT_BRUSH_MASK))
|
||||
g_object_set (preset, "use-brush", FALSE, NULL);
|
||||
|
||||
if (! (serialize_props & GIMP_CONTEXT_DYNAMICS_MASK))
|
||||
g_object_set (preset, "use-dynamics", FALSE, NULL);
|
||||
|
||||
if (! (serialize_props & GIMP_CONTEXT_GRADIENT_MASK))
|
||||
g_object_set (preset, "use-gradient", FALSE, NULL);
|
||||
|
||||
if (! (serialize_props & GIMP_CONTEXT_PATTERN_MASK))
|
||||
g_object_set (preset, "use-pattern", FALSE, NULL);
|
||||
|
||||
if (! (serialize_props & GIMP_CONTEXT_PALETTE_MASK))
|
||||
g_object_set (preset, "use-palette", FALSE, NULL);
|
||||
|
||||
if (! (serialize_props & GIMP_CONTEXT_FONT_MASK))
|
||||
g_object_set (preset, "use-font", FALSE, NULL);
|
||||
|
||||
g_signal_connect (preset->tool_options, "notify",
|
||||
G_CALLBACK (gimp_tool_preset_options_notify),
|
||||
preset);
|
||||
@ -461,27 +519,37 @@ gimp_tool_preset_new (GimpContext *context,
|
||||
GimpContextPropMask
|
||||
gimp_tool_preset_get_prop_mask (GimpToolPreset *preset)
|
||||
{
|
||||
GimpContextPropMask use_props = 0;
|
||||
GimpContextPropMask serialize_props;
|
||||
GimpContextPropMask use_props = 0;
|
||||
|
||||
g_return_val_if_fail (GIMP_IS_TOOL_PRESET (preset), 0);
|
||||
|
||||
serialize_props =
|
||||
gimp_context_get_serialize_properties (GIMP_CONTEXT (preset->tool_options));
|
||||
|
||||
if (preset->use_fg_bg)
|
||||
{
|
||||
use_props |= GIMP_CONTEXT_FOREGROUND_MASK;
|
||||
use_props |= GIMP_CONTEXT_BACKGROUND_MASK;
|
||||
use_props |= (GIMP_CONTEXT_FOREGROUND_MASK & serialize_props);
|
||||
use_props |= (GIMP_CONTEXT_BACKGROUND_MASK & serialize_props);
|
||||
}
|
||||
|
||||
if (preset->use_brush)
|
||||
use_props |= GIMP_CONTEXT_BRUSH_MASK;
|
||||
use_props |= (GIMP_CONTEXT_BRUSH_MASK & serialize_props);
|
||||
|
||||
if (preset->use_dynamics)
|
||||
use_props |= GIMP_CONTEXT_DYNAMICS_MASK;
|
||||
use_props |= (GIMP_CONTEXT_DYNAMICS_MASK & serialize_props);
|
||||
|
||||
if (preset->use_pattern)
|
||||
use_props |= GIMP_CONTEXT_PATTERN_MASK;
|
||||
use_props |= (GIMP_CONTEXT_PATTERN_MASK & serialize_props);
|
||||
|
||||
if (preset->use_palette)
|
||||
use_props |= GIMP_CONTEXT_PALETTE_MASK;
|
||||
use_props |= (GIMP_CONTEXT_PALETTE_MASK & serialize_props);
|
||||
|
||||
if (preset->use_gradient)
|
||||
use_props |= GIMP_CONTEXT_GRADIENT_MASK;
|
||||
use_props |= (GIMP_CONTEXT_GRADIENT_MASK & serialize_props);
|
||||
|
||||
if (preset->use_font)
|
||||
use_props |= GIMP_CONTEXT_FONT_MASK;
|
||||
use_props |= (GIMP_CONTEXT_FONT_MASK & serialize_props);
|
||||
|
||||
return use_props;
|
||||
}
|
||||
|
@ -43,6 +43,14 @@ struct _GimpToolPresetEditorPrivate
|
||||
|
||||
GtkWidget *tool_icon;
|
||||
GtkWidget *tool_label;
|
||||
|
||||
GtkWidget *fg_bg_toggle;
|
||||
GtkWidget *brush_toggle;
|
||||
GtkWidget *dynamics_toggle;
|
||||
GtkWidget *gradient_toggle;
|
||||
GtkWidget *pattern_toggle;
|
||||
GtkWidget *palette_toggle;
|
||||
GtkWidget *font_toggle;
|
||||
};
|
||||
|
||||
|
||||
@ -146,38 +154,45 @@ gimp_tool_preset_editor_constructed (GObject *object)
|
||||
gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
|
||||
gtk_widget_show (button);
|
||||
|
||||
button = gimp_prop_check_button_new (G_OBJECT (preset), "use-fg-bg",
|
||||
_("Apply stored FG/BG"));
|
||||
button = editor->priv->fg_bg_toggle =
|
||||
gimp_prop_check_button_new (G_OBJECT (preset), "use-fg-bg",
|
||||
_("Apply stored FG/BG"));
|
||||
gtk_box_pack_start (GTK_BOX (data_editor), button, FALSE, FALSE, 0);
|
||||
gtk_widget_show (button);
|
||||
|
||||
button = gimp_prop_check_button_new (G_OBJECT (preset), "use-brush",
|
||||
_("Apply stored brush"));
|
||||
button = editor->priv->brush_toggle =
|
||||
gimp_prop_check_button_new (G_OBJECT (preset), "use-brush",
|
||||
_("Apply stored brush"));
|
||||
gtk_box_pack_start (GTK_BOX (data_editor), button, FALSE, FALSE, 0);
|
||||
gtk_widget_show (button);
|
||||
|
||||
button = gimp_prop_check_button_new (G_OBJECT (preset), "use-dynamics",
|
||||
_("Apply stored dynamics"));
|
||||
button = editor->priv->dynamics_toggle =
|
||||
gimp_prop_check_button_new (G_OBJECT (preset), "use-dynamics",
|
||||
_("Apply stored dynamics"));
|
||||
gtk_box_pack_start (GTK_BOX (data_editor), button, FALSE, FALSE, 0);
|
||||
gtk_widget_show (button);
|
||||
|
||||
button = gimp_prop_check_button_new (G_OBJECT (preset), "use-gradient",
|
||||
_("Apply stored gradient"));
|
||||
button = editor->priv->gradient_toggle =
|
||||
gimp_prop_check_button_new (G_OBJECT (preset), "use-gradient",
|
||||
_("Apply stored gradient"));
|
||||
gtk_box_pack_start (GTK_BOX (data_editor), button, FALSE, FALSE, 0);
|
||||
gtk_widget_show (button);
|
||||
|
||||
button = gimp_prop_check_button_new (G_OBJECT (preset), "use-pattern",
|
||||
_("Apply stored pattern"));
|
||||
button = editor->priv->pattern_toggle =
|
||||
gimp_prop_check_button_new (G_OBJECT (preset), "use-pattern",
|
||||
_("Apply stored pattern"));
|
||||
gtk_box_pack_start (GTK_BOX (data_editor), button, FALSE, FALSE, 0);
|
||||
gtk_widget_show (button);
|
||||
|
||||
button = gimp_prop_check_button_new (G_OBJECT (preset), "use-palette",
|
||||
_("Apply stored palette"));
|
||||
button = editor->priv->palette_toggle =
|
||||
gimp_prop_check_button_new (G_OBJECT (preset), "use-palette",
|
||||
_("Apply stored palette"));
|
||||
gtk_box_pack_start (GTK_BOX (data_editor), button, FALSE, FALSE, 0);
|
||||
gtk_widget_show (button);
|
||||
|
||||
button = gimp_prop_check_button_new (G_OBJECT (preset), "use-font",
|
||||
_("Apply stored font"));
|
||||
button = editor->priv->font_toggle =
|
||||
gimp_prop_check_button_new (G_OBJECT (preset), "use-font",
|
||||
_("Apply stored font"));
|
||||
gtk_box_pack_start (GTK_BOX (data_editor), button, FALSE, FALSE, 0);
|
||||
gtk_widget_show (button);
|
||||
|
||||
@ -249,33 +264,56 @@ gimp_tool_preset_editor_new (GimpContext *context,
|
||||
static void
|
||||
gimp_tool_preset_editor_sync_data (GimpToolPresetEditor *editor)
|
||||
{
|
||||
GimpDataEditor *data_editor = GIMP_DATA_EDITOR (editor);
|
||||
GimpToolInfo *tool_info;
|
||||
const gchar *stock_id;
|
||||
gchar *label;
|
||||
GimpToolPresetEditorPrivate *priv = editor->priv;
|
||||
GimpDataEditor *data_editor = GIMP_DATA_EDITOR (editor);
|
||||
GimpToolPreset *preset;
|
||||
GimpToolInfo *tool_info;
|
||||
GimpContextPropMask serialize_props;
|
||||
const gchar *stock_id;
|
||||
gchar *label;
|
||||
|
||||
g_signal_handlers_block_by_func (editor->priv->tool_preset_model,
|
||||
g_signal_handlers_block_by_func (priv->tool_preset_model,
|
||||
gimp_tool_preset_editor_notify_model,
|
||||
editor);
|
||||
|
||||
gimp_config_copy (GIMP_CONFIG (data_editor->data),
|
||||
GIMP_CONFIG (editor->priv->tool_preset_model),
|
||||
GIMP_CONFIG (priv->tool_preset_model),
|
||||
GIMP_CONFIG_PARAM_SERIALIZE);
|
||||
|
||||
g_signal_handlers_unblock_by_func (editor->priv->tool_preset_model,
|
||||
g_signal_handlers_unblock_by_func (priv->tool_preset_model,
|
||||
gimp_tool_preset_editor_notify_model,
|
||||
editor);
|
||||
|
||||
tool_info = editor->priv->tool_preset_model->tool_options->tool_info;
|
||||
tool_info = priv->tool_preset_model->tool_options->tool_info;
|
||||
|
||||
stock_id = gimp_viewable_get_stock_id (GIMP_VIEWABLE (tool_info));
|
||||
label = g_strdup_printf (_("%s Preset"), tool_info->blurb);
|
||||
|
||||
gtk_image_set_from_stock (GTK_IMAGE (editor->priv->tool_icon),
|
||||
gtk_image_set_from_stock (GTK_IMAGE (priv->tool_icon),
|
||||
stock_id, GTK_ICON_SIZE_MENU);
|
||||
gtk_label_set_text (GTK_LABEL (editor->priv->tool_label), label);
|
||||
gtk_label_set_text (GTK_LABEL (priv->tool_label), label);
|
||||
|
||||
g_free (label);
|
||||
|
||||
preset = GIMP_TOOL_PRESET (data_editor->data);
|
||||
|
||||
serialize_props =
|
||||
gimp_context_get_serialize_properties (GIMP_CONTEXT (preset->tool_options));
|
||||
|
||||
gtk_widget_set_sensitive (priv->fg_bg_toggle,
|
||||
(serialize_props & GIMP_CONTEXT_FOREGROUND_MASK) != 0);
|
||||
gtk_widget_set_sensitive (priv->brush_toggle,
|
||||
(serialize_props & GIMP_CONTEXT_BRUSH_MASK) != 0);
|
||||
gtk_widget_set_sensitive (priv->dynamics_toggle,
|
||||
(serialize_props & GIMP_CONTEXT_DYNAMICS_MASK) != 0);
|
||||
gtk_widget_set_sensitive (priv->gradient_toggle,
|
||||
(serialize_props & GIMP_CONTEXT_GRADIENT_MASK) != 0);
|
||||
gtk_widget_set_sensitive (priv->pattern_toggle,
|
||||
(serialize_props & GIMP_CONTEXT_PATTERN_MASK) != 0);
|
||||
gtk_widget_set_sensitive (priv->palette_toggle,
|
||||
(serialize_props & GIMP_CONTEXT_PALETTE_MASK) != 0);
|
||||
gtk_widget_set_sensitive (priv->font_toggle,
|
||||
(serialize_props & GIMP_CONTEXT_FONT_MASK) != 0);
|
||||
}
|
||||
|
||||
static void
|
||||
|
Reference in New Issue
Block a user