From ef9b04c5350a58646f19feea86f5f401b600c576 Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Tue, 27 Dec 2005 18:57:01 +0000 Subject: [PATCH] Fixed incomplete core/ui separation of paint tools and paint methods: 2005-12-27 Michael Natterer Fixed incomplete core/ui separation of paint tools and paint methods: * app/core/core-enums.h * app/core/gimpcontext.[ch]: added a "paint-info" property and API so the current paint method can be selected without the need for an active tool. (gimp_context_real_set_tool): set the paint-info to tool_info->paint_info so the paint method follows the active tool just as the active image follows the active display. * app/core/gimp.h (struct Gimp) * app/core/gimppaintinfo.[ch]: added "standard_paint_info" API and stuff to be consistent with other context object properties. * app/paint/gimp-paint.c: set the paintbrush as standard_paint_info. * app/core/gimpstrokedesc.c (gimp_stroke_desc_new): removed the hack of falling back to the paintbrush when there is no active tool and use the active paint method instead. Fall back to the standard paint method if there is no active one. (nothing in the core uses the active tool any more now). * app/widgets/gimpdeviceinfo.h: add the paint info to the properties which are saved in devicerc. Added identifiers (names) and stock-ids to GimpPaintInfo: * app/core/gimppaintinfo.[ch] (gimp_paint_info_new): added identifier and stock-id parameters. * app/core/gimptoolinfo.c (gimp_tool_info_new): removed the hack of setting the paint-info stock-id from the tool-info stock-id. * app/paint/paint-types.h * app/paint/gimp-paint.c: changed GimpPaintRegisterCallback accordingly. * app/tools/gimp-tools.c (gimp_tools_register): changed paint info names accordingly. * app/paint/*.c (gimp_*_register): pass identifier and stock-id accordingly. --- ChangeLog | 48 +++++++ app/core/core-enums.h | 51 ++++---- app/core/gimp.h | 1 + app/core/gimpcontext.c | 237 ++++++++++++++++++++++++++++++++--- app/core/gimpcontext.h | 12 ++ app/core/gimppaintinfo.c | 36 +++++- app/core/gimppaintinfo.h | 18 ++- app/core/gimpstrokedesc.c | 17 +-- app/core/gimptoolinfo.c | 2 - app/paint/gimp-paint.c | 21 +++- app/paint/gimpairbrush.c | 4 +- app/paint/gimpclone.c | 4 +- app/paint/gimpconvolve.c | 4 +- app/paint/gimpdodgeburn.c | 4 +- app/paint/gimperaser.c | 4 +- app/paint/gimpink.c | 4 +- app/paint/gimppaintbrush.c | 4 +- app/paint/gimppencil.c | 4 +- app/paint/gimpsmudge.c | 4 +- app/paint/gimpsourcecore.c | 4 +- app/paint/paint-types.h | 4 +- app/tools/gimp-tools.c | 20 +-- app/widgets/gimpdeviceinfo.h | 1 + 23 files changed, 422 insertions(+), 86 deletions(-) diff --git a/ChangeLog b/ChangeLog index 75d204f80e..c054e2a57c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,51 @@ +2005-12-27 Michael Natterer + + Fixed incomplete core/ui separation of paint tools and paint + methods: + + * app/core/core-enums.h + * app/core/gimpcontext.[ch]: added a "paint-info" property and API + so the current paint method can be selected without the need for + an active tool. + + (gimp_context_real_set_tool): set the paint-info to + tool_info->paint_info so the paint method follows the active tool + just as the active image follows the active display. + + * app/core/gimp.h (struct Gimp) + * app/core/gimppaintinfo.[ch]: added "standard_paint_info" API + and stuff to be consistent with other context object properties. + + * app/paint/gimp-paint.c: set the paintbrush as + standard_paint_info. + + * app/core/gimpstrokedesc.c (gimp_stroke_desc_new): removed the + hack of falling back to the paintbrush when there is no active + tool and use the active paint method instead. Fall back to the + standard paint method if there is no active one. + (nothing in the core uses the active tool any more now). + + * app/widgets/gimpdeviceinfo.h: add the paint info to the + properties which are saved in devicerc. + + Added identifiers (names) and stock-ids to GimpPaintInfo: + + * app/core/gimppaintinfo.[ch] (gimp_paint_info_new): added + identifier and stock-id parameters. + + * app/core/gimptoolinfo.c (gimp_tool_info_new): removed the hack + of setting the paint-info stock-id from the tool-info stock-id. + + * app/paint/paint-types.h + * app/paint/gimp-paint.c: changed GimpPaintRegisterCallback + accordingly. + + * app/tools/gimp-tools.c (gimp_tools_register): changed paint + info names accordingly. + + * app/paint/*.c (gimp_*_register): pass identifier and stock-id + accordingly. + 2005-12-27 Sven Neumann * plug-ins/common/unsharp.c (query): fixed type of threshold diff --git a/app/core/core-enums.h b/app/core/core-enums.h index 11bf8d1e3c..44765540e0 100644 --- a/app/core/core-enums.h +++ b/app/core/core-enums.h @@ -449,18 +449,19 @@ typedef enum /*< pdb-skip, skip >*/ GIMP_CONTEXT_PROP_IMAGE = GIMP_CONTEXT_FIRST_PROP, GIMP_CONTEXT_PROP_DISPLAY = 3, GIMP_CONTEXT_PROP_TOOL = 4, - GIMP_CONTEXT_PROP_FOREGROUND = 5, - GIMP_CONTEXT_PROP_BACKGROUND = 6, - GIMP_CONTEXT_PROP_OPACITY = 7, - GIMP_CONTEXT_PROP_PAINT_MODE = 8, - GIMP_CONTEXT_PROP_BRUSH = 9, - GIMP_CONTEXT_PROP_PATTERN = 10, - GIMP_CONTEXT_PROP_GRADIENT = 11, - GIMP_CONTEXT_PROP_PALETTE = 12, - GIMP_CONTEXT_PROP_FONT = 13, - GIMP_CONTEXT_PROP_BUFFER = 14, - GIMP_CONTEXT_PROP_IMAGEFILE = 15, - GIMP_CONTEXT_PROP_TEMPLATE = 16, + GIMP_CONTEXT_PROP_PAINT_INFO = 5, + GIMP_CONTEXT_PROP_FOREGROUND = 6, + GIMP_CONTEXT_PROP_BACKGROUND = 7, + GIMP_CONTEXT_PROP_OPACITY = 8, + GIMP_CONTEXT_PROP_PAINT_MODE = 9, + GIMP_CONTEXT_PROP_BRUSH = 10, + GIMP_CONTEXT_PROP_PATTERN = 11, + GIMP_CONTEXT_PROP_GRADIENT = 12, + GIMP_CONTEXT_PROP_PALETTE = 13, + GIMP_CONTEXT_PROP_FONT = 14, + GIMP_CONTEXT_PROP_BUFFER = 15, + GIMP_CONTEXT_PROP_IMAGEFILE = 16, + GIMP_CONTEXT_PROP_TEMPLATE = 17, GIMP_CONTEXT_LAST_PROP = GIMP_CONTEXT_PROP_TEMPLATE } GimpContextPropType; @@ -470,18 +471,19 @@ typedef enum /*< pdb-skip, skip >*/ GIMP_CONTEXT_IMAGE_MASK = 1 << 2, GIMP_CONTEXT_DISPLAY_MASK = 1 << 3, GIMP_CONTEXT_TOOL_MASK = 1 << 4, - GIMP_CONTEXT_FOREGROUND_MASK = 1 << 5, - GIMP_CONTEXT_BACKGROUND_MASK = 1 << 6, - GIMP_CONTEXT_OPACITY_MASK = 1 << 7, - GIMP_CONTEXT_PAINT_MODE_MASK = 1 << 8, - GIMP_CONTEXT_BRUSH_MASK = 1 << 9, - GIMP_CONTEXT_PATTERN_MASK = 1 << 10, - GIMP_CONTEXT_GRADIENT_MASK = 1 << 11, - GIMP_CONTEXT_PALETTE_MASK = 1 << 12, - GIMP_CONTEXT_FONT_MASK = 1 << 13, - GIMP_CONTEXT_BUFFER_MASK = 1 << 14, - GIMP_CONTEXT_IMAGEFILE_MASK = 1 << 15, - GIMP_CONTEXT_TEMPLATE_MASK = 1 << 16, + GIMP_CONTEXT_PAINT_INFO_MASK = 1 << 5, + GIMP_CONTEXT_FOREGROUND_MASK = 1 << 6, + GIMP_CONTEXT_BACKGROUND_MASK = 1 << 7, + GIMP_CONTEXT_OPACITY_MASK = 1 << 8, + GIMP_CONTEXT_PAINT_MODE_MASK = 1 << 9, + GIMP_CONTEXT_BRUSH_MASK = 1 << 10, + GIMP_CONTEXT_PATTERN_MASK = 1 << 11, + GIMP_CONTEXT_GRADIENT_MASK = 1 << 12, + GIMP_CONTEXT_PALETTE_MASK = 1 << 13, + GIMP_CONTEXT_FONT_MASK = 1 << 14, + GIMP_CONTEXT_BUFFER_MASK = 1 << 15, + GIMP_CONTEXT_IMAGEFILE_MASK = 1 << 16, + GIMP_CONTEXT_TEMPLATE_MASK = 1 << 17, /* aliases */ GIMP_CONTEXT_PAINT_PROPS_MASK = (GIMP_CONTEXT_FOREGROUND_MASK | @@ -494,6 +496,7 @@ typedef enum /*< pdb-skip, skip >*/ GIMP_CONTEXT_ALL_PROPS_MASK = (GIMP_CONTEXT_IMAGE_MASK | GIMP_CONTEXT_DISPLAY_MASK | GIMP_CONTEXT_TOOL_MASK | + GIMP_CONTEXT_PAINT_INFO_MASK | GIMP_CONTEXT_PALETTE_MASK | GIMP_CONTEXT_FONT_MASK | GIMP_CONTEXT_BUFFER_MASK | diff --git a/app/core/gimp.h b/app/core/gimp.h index 0d79279ecd..64b9f977bd 100644 --- a/app/core/gimp.h +++ b/app/core/gimp.h @@ -64,6 +64,7 @@ struct _Gimp GimpParasiteList *parasites; GimpContainer *paint_info_list; + GimpPaintInfo *standard_paint_info; GimpModuleDB *module_db; gboolean write_modulerc; diff --git a/app/core/gimpcontext.c b/app/core/gimpcontext.c index 9cefd5d358..8e5450111b 100644 --- a/app/core/gimpcontext.c +++ b/app/core/gimpcontext.c @@ -43,6 +43,7 @@ #include "gimpgradient.h" #include "gimpimage.h" #include "gimpmarshal.h" +#include "gimppaintinfo.h" #include "gimppalette.h" #include "gimppattern.h" #include "gimptemplate.h" @@ -122,6 +123,17 @@ static void gimp_context_tool_list_thaw (GimpContainer *container, static void gimp_context_real_set_tool (GimpContext *context, GimpToolInfo *tool_info); +/* paint info */ +static void gimp_context_paint_info_dirty (GimpPaintInfo *paint_info, + GimpContext *context); +static void gimp_context_paint_info_removed (GimpContainer *container, + GimpPaintInfo *paint_info, + GimpContext *context); +static void gimp_context_paint_info_list_thaw(GimpContainer *container, + GimpContext *context); +static void gimp_context_real_set_paint_info (GimpContext *context, + GimpPaintInfo *paint_info); + /* foreground */ static void gimp_context_real_set_foreground (GimpContext *context, const GimpRGB *color); @@ -251,6 +263,7 @@ enum IMAGE_CHANGED, DISPLAY_CHANGED, TOOL_CHANGED, + PAINT_INFO_CHANGED, FOREGROUND_CHANGED, BACKGROUND_CHANGED, OPACITY_CHANGED, @@ -273,6 +286,7 @@ static gchar *gimp_context_prop_names[] = "image", "display", "tool", + "paint-info", "foreground", "background", "opacity", @@ -294,6 +308,7 @@ static GType gimp_context_prop_types[] = 0, G_TYPE_NONE, 0, + 0, G_TYPE_NONE, G_TYPE_NONE, G_TYPE_NONE, @@ -317,12 +332,13 @@ G_DEFINE_TYPE_WITH_CODE (GimpContext, gimp_context, GIMP_TYPE_OBJECT, static guint gimp_context_signals[LAST_SIGNAL] = { 0 }; -static GimpToolInfo *standard_tool_info = NULL; -static GimpBrush *standard_brush = NULL; -static GimpPattern *standard_pattern = NULL; -static GimpGradient *standard_gradient = NULL; -static GimpPalette *standard_palette = NULL; -static GimpFont *standard_font = NULL; +static GimpToolInfo *standard_tool_info = NULL; +static GimpPaintInfo *standard_paint_info = NULL; +static GimpBrush *standard_brush = NULL; +static GimpPattern *standard_pattern = NULL; +static GimpGradient *standard_gradient = NULL; +static GimpPalette *standard_palette = NULL; +static GimpFont *standard_font = NULL; static void @@ -366,6 +382,16 @@ gimp_context_class_init (GimpContextClass *klass) G_TYPE_NONE, 1, GIMP_TYPE_TOOL_INFO); + gimp_context_signals[PAINT_INFO_CHANGED] = + g_signal_new ("paint-info-changed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (GimpContextClass, paint_info_changed), + NULL, NULL, + gimp_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + GIMP_TYPE_PAINT_INFO); + gimp_context_signals[FOREGROUND_CHANGED] = g_signal_new ("foreground-changed", G_TYPE_FROM_CLASS (klass), @@ -497,6 +523,7 @@ gimp_context_class_init (GimpContextClass *klass) klass->image_changed = NULL; klass->display_changed = NULL; klass->tool_changed = NULL; + klass->paint_info_changed = NULL; klass->foreground_changed = NULL; klass->background_changed = NULL; klass->opacity_changed = NULL; @@ -510,16 +537,17 @@ gimp_context_class_init (GimpContextClass *klass) klass->imagefile_changed = NULL; klass->template_changed = NULL; - gimp_context_prop_types[GIMP_CONTEXT_PROP_IMAGE] = GIMP_TYPE_IMAGE; - gimp_context_prop_types[GIMP_CONTEXT_PROP_TOOL] = GIMP_TYPE_TOOL_INFO; - gimp_context_prop_types[GIMP_CONTEXT_PROP_BRUSH] = GIMP_TYPE_BRUSH; - gimp_context_prop_types[GIMP_CONTEXT_PROP_PATTERN] = GIMP_TYPE_PATTERN; - gimp_context_prop_types[GIMP_CONTEXT_PROP_GRADIENT] = GIMP_TYPE_GRADIENT; - gimp_context_prop_types[GIMP_CONTEXT_PROP_PALETTE] = GIMP_TYPE_PALETTE; - gimp_context_prop_types[GIMP_CONTEXT_PROP_FONT] = GIMP_TYPE_FONT; - gimp_context_prop_types[GIMP_CONTEXT_PROP_BUFFER] = GIMP_TYPE_BUFFER; - gimp_context_prop_types[GIMP_CONTEXT_PROP_IMAGEFILE] = GIMP_TYPE_IMAGEFILE; - gimp_context_prop_types[GIMP_CONTEXT_PROP_TEMPLATE] = GIMP_TYPE_TEMPLATE; + gimp_context_prop_types[GIMP_CONTEXT_PROP_IMAGE] = GIMP_TYPE_IMAGE; + gimp_context_prop_types[GIMP_CONTEXT_PROP_TOOL] = GIMP_TYPE_TOOL_INFO; + gimp_context_prop_types[GIMP_CONTEXT_PROP_PAINT_INFO] = GIMP_TYPE_PAINT_INFO; + gimp_context_prop_types[GIMP_CONTEXT_PROP_BRUSH] = GIMP_TYPE_BRUSH; + gimp_context_prop_types[GIMP_CONTEXT_PROP_PATTERN] = GIMP_TYPE_PATTERN; + gimp_context_prop_types[GIMP_CONTEXT_PROP_GRADIENT] = GIMP_TYPE_GRADIENT; + gimp_context_prop_types[GIMP_CONTEXT_PROP_PALETTE] = GIMP_TYPE_PALETTE; + gimp_context_prop_types[GIMP_CONTEXT_PROP_FONT] = GIMP_TYPE_FONT; + gimp_context_prop_types[GIMP_CONTEXT_PROP_BUFFER] = GIMP_TYPE_BUFFER; + gimp_context_prop_types[GIMP_CONTEXT_PROP_IMAGEFILE] = GIMP_TYPE_IMAGEFILE; + gimp_context_prop_types[GIMP_CONTEXT_PROP_TEMPLATE] = GIMP_TYPE_TEMPLATE; g_object_class_install_property (object_class, GIMP_CONTEXT_PROP_GIMP, g_param_spec_object ("gimp", @@ -545,6 +573,11 @@ gimp_context_class_init (GimpContextClass *klass) GIMP_TYPE_TOOL_INFO, 0); + GIMP_CONFIG_INSTALL_PROP_OBJECT (object_class, GIMP_CONTEXT_PROP_PAINT_INFO, + gimp_context_prop_names[GIMP_CONTEXT_PROP_PAINT_INFO], NULL, + GIMP_TYPE_PAINT_INFO, + 0); + GIMP_CONFIG_INSTALL_PROP_RGB (object_class, GIMP_CONTEXT_PROP_FOREGROUND, gimp_context_prop_names[GIMP_CONTEXT_PROP_FOREGROUND], NULL, @@ -637,6 +670,9 @@ gimp_context_init (GimpContext *context) context->tool_info = NULL; context->tool_name = NULL; + context->paint_info = NULL; + context->paint_name = NULL; + context->brush = NULL; context->brush_name = NULL; @@ -700,6 +736,13 @@ gimp_context_constructor (GType type, G_CALLBACK (gimp_context_tool_list_thaw), object, 0); + g_signal_connect_object (gimp->paint_info_list, "remove", + G_CALLBACK (gimp_context_paint_info_removed), + object, 0); + g_signal_connect_object (gimp->paint_info_list, "thaw", + G_CALLBACK (gimp_context_paint_info_list_thaw), + object, 0); + g_signal_connect_object (gimp->brush_factory->container, "remove", G_CALLBACK (gimp_context_brush_removed), object, 0); @@ -794,6 +837,17 @@ gimp_context_finalize (GObject *object) context->tool_name = NULL; } + if (context->paint_info) + { + g_object_unref (context->paint_info); + context->paint_info = NULL; + } + if (context->paint_name) + { + g_free (context->paint_name); + context->paint_name = NULL; + } + if (context->brush) { g_object_unref (context->brush); @@ -907,6 +961,9 @@ gimp_context_set_property (GObject *object, case GIMP_CONTEXT_PROP_TOOL: gimp_context_set_tool (context, g_value_get_object (value)); break; + case GIMP_CONTEXT_PROP_PAINT_INFO: + gimp_context_set_paint_info (context, g_value_get_object (value)); + break; case GIMP_CONTEXT_PROP_FOREGROUND: gimp_context_set_foreground (context, g_value_get_boxed (value)); break; @@ -971,6 +1028,9 @@ gimp_context_get_property (GObject *object, case GIMP_CONTEXT_PROP_TOOL: g_value_set_object (value, gimp_context_get_tool (context)); break; + case GIMP_CONTEXT_PROP_PAINT_INFO: + g_value_set_object (value, gimp_context_get_paint_info (context)); + break; case GIMP_CONTEXT_PROP_FOREGROUND: { GimpRGB color; @@ -1033,6 +1093,9 @@ gimp_context_get_memsize (GimpObject *object, if (context->tool_name) memsize += strlen (context->tool_name) + 1; + if (context->paint_name) + memsize += strlen (context->paint_name) + 1; + if (context->brush_name) memsize += strlen (context->brush_name) + 1; @@ -1083,6 +1146,7 @@ gimp_context_serialize_property (GimpConfig *config, switch (property_id) { case GIMP_CONTEXT_PROP_TOOL: + case GIMP_CONTEXT_PROP_PAINT_INFO: case GIMP_CONTEXT_PROP_BRUSH: case GIMP_CONTEXT_PROP_PATTERN: case GIMP_CONTEXT_PROP_GRADIENT: @@ -1131,6 +1195,13 @@ gimp_context_deserialize_property (GimpConfig *object, no_data = TRUE; break; + case GIMP_CONTEXT_PROP_PAINT_INFO: + container = context->gimp->paint_info_list; + current = (GimpObject *) context->paint_info; + name_loc = &context->paint_name; + no_data = TRUE; + break; + case GIMP_CONTEXT_PROP_BRUSH: container = context->gimp->brush_factory->container; current = (GimpObject *) context->brush; @@ -1425,6 +1496,14 @@ gimp_context_copy_property (GimpContext *src, dest_name_loc = &dest->tool_name; break; + case GIMP_CONTEXT_PROP_PAINT_INFO: + gimp_context_real_set_paint_info (dest, src->paint_info); + object = src->paint_info; + standard_object = standard_paint_info; + src_name = src->paint_name; + dest_name_loc = &dest->paint_name; + break; + case GIMP_CONTEXT_PROP_FOREGROUND: gimp_context_real_set_foreground (dest, &src->foreground); break; @@ -1862,6 +1941,9 @@ gimp_context_real_set_tool (GimpContext *context, if (tool_info != standard_tool_info) context->tool_name = g_strdup (GIMP_OBJECT (tool_info)->name); + + if (tool_info->paint_info) + gimp_context_real_set_paint_info (context, tool_info->paint_info); } g_object_notify (G_OBJECT (context), "tool"); @@ -1869,6 +1951,129 @@ gimp_context_real_set_tool (GimpContext *context, } +/*****************************************************************************/ +/* paint info **************************************************************/ + +GimpPaintInfo * +gimp_context_get_paint_info (GimpContext *context) +{ + g_return_val_if_fail (GIMP_IS_CONTEXT (context), NULL); + + return context->paint_info; +} + +void +gimp_context_set_paint_info (GimpContext *context, + GimpPaintInfo *paint_info) +{ + g_return_if_fail (GIMP_IS_CONTEXT (context)); + g_return_if_fail (! paint_info || GIMP_IS_PAINT_INFO (paint_info)); + context_find_defined (context, GIMP_CONTEXT_PROP_PAINT_INFO); + + gimp_context_real_set_paint_info (context, paint_info); +} + +void +gimp_context_paint_info_changed (GimpContext *context) +{ + g_return_if_fail (GIMP_IS_CONTEXT (context)); + + g_signal_emit (context, + gimp_context_signals[PAINT_INFO_CHANGED], 0, + context->paint_info); +} + +/* the active paint info was modified */ +static void +gimp_context_paint_info_dirty (GimpPaintInfo *paint_info, + GimpContext *context) +{ + g_free (context->paint_name); + context->paint_name = g_strdup (GIMP_OBJECT (paint_info)->name); +} + +/* the global paint info list is there again after refresh */ +static void +gimp_context_paint_info_list_thaw (GimpContainer *container, + GimpContext *context) +{ + GimpPaintInfo *paint_info; + + if (! context->paint_name) + context->paint_name = g_strdup ("GimpPaintbrush"); + + paint_info = gimp_context_find_object (context, container, + context->paint_name, + gimp_paint_info_get_standard (context->gimp)); + + gimp_context_real_set_paint_info (context, paint_info); +} + +/* the active paint info disappeared */ +static void +gimp_context_paint_info_removed (GimpContainer *container, + GimpPaintInfo *paint_info, + GimpContext *context) +{ + if (paint_info == context->paint_info) + { + context->paint_info = NULL; + + g_signal_handlers_disconnect_by_func (paint_info, + gimp_context_paint_info_dirty, + context); + g_object_unref (paint_info); + + if (! gimp_container_frozen (container)) + gimp_context_paint_info_list_thaw (container, context); + } +} + +static void +gimp_context_real_set_paint_info (GimpContext *context, + GimpPaintInfo *paint_info) +{ + if (! standard_paint_info) + standard_paint_info = gimp_paint_info_get_standard (context->gimp); + + if (context->paint_info == paint_info) + return; + + if (context->paint_name && paint_info != standard_paint_info) + { + g_free (context->paint_name); + context->paint_name = NULL; + } + + /* disconnect from the old paint info's signals */ + if (context->paint_info) + { + g_signal_handlers_disconnect_by_func (context->paint_info, + gimp_context_paint_info_dirty, + context); + g_object_unref (context->paint_info); + } + + context->paint_info = paint_info; + + if (paint_info) + { + g_object_ref (paint_info); + + g_signal_connect_object (paint_info, "name-changed", + G_CALLBACK (gimp_context_paint_info_dirty), + context, + 0); + + if (paint_info != standard_paint_info) + context->paint_name = g_strdup (GIMP_OBJECT (paint_info)->name); + } + + g_object_notify (G_OBJECT (context), "paint-info"); + gimp_context_paint_info_changed (context); +} + + /*****************************************************************************/ /* foreground color ********************************************************/ diff --git a/app/core/gimpcontext.h b/app/core/gimpcontext.h index 8823957513..8cea76a0ee 100644 --- a/app/core/gimpcontext.h +++ b/app/core/gimpcontext.h @@ -53,6 +53,9 @@ struct _GimpContext GimpToolInfo *tool_info; gchar *tool_name; + GimpPaintInfo *paint_info; + gchar *paint_name; + GimpRGB foreground; GimpRGB background; @@ -95,6 +98,8 @@ struct _GimpContextClass void (* tool_changed) (GimpContext *context, GimpToolInfo *tool_info); + void (* paint_info_changed) (GimpContext *context, + GimpPaintInfo *paint_info); void (* foreground_changed) (GimpContext *context, GimpRGB *color); @@ -208,6 +213,13 @@ void gimp_context_set_tool (GimpContext *context, void gimp_context_tool_changed (GimpContext *context); +/* paint info */ +GimpPaintInfo * gimp_context_get_paint_info (GimpContext *context); +void gimp_context_set_paint_info (GimpContext *context, + GimpPaintInfo *paint_info); +void gimp_context_paint_info_changed (GimpContext *context); + + /* foreground color */ void gimp_context_get_foreground (GimpContext *context, GimpRGB *color); diff --git a/app/core/gimppaintinfo.c b/app/core/gimppaintinfo.c index 1d44b76b43..0db3d7b477 100644 --- a/app/core/gimppaintinfo.c +++ b/app/core/gimppaintinfo.c @@ -91,15 +91,20 @@ GimpPaintInfo * gimp_paint_info_new (Gimp *gimp, GType paint_type, GType paint_options_type, - const gchar *blurb) + const gchar *identifier, + const gchar *blurb, + const gchar *stock_id) { GimpPaintInfo *paint_info; g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL); + g_return_val_if_fail (identifier != NULL, NULL); g_return_val_if_fail (blurb != NULL, NULL); + g_return_val_if_fail (stock_id != NULL, NULL); paint_info = g_object_new (GIMP_TYPE_PAINT_INFO, - "name", g_type_name (paint_type), + "name", identifier, + "stock-id", stock_id, NULL); paint_info->gimp = gimp; @@ -111,3 +116,30 @@ gimp_paint_info_new (Gimp *gimp, return paint_info; } + +void +gimp_paint_info_set_standard (Gimp *gimp, + GimpPaintInfo *paint_info) +{ + g_return_if_fail (GIMP_IS_GIMP (gimp)); + g_return_if_fail (! paint_info || GIMP_IS_PAINT_INFO (paint_info)); + + if (paint_info != gimp->standard_paint_info) + { + if (gimp->standard_paint_info) + g_object_unref (gimp->standard_paint_info); + + gimp->standard_paint_info = paint_info; + + if (gimp->standard_paint_info) + g_object_ref (gimp->standard_paint_info); + } +} + +GimpPaintInfo * +gimp_paint_info_get_standard (Gimp *gimp) +{ + g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL); + + return gimp->standard_paint_info; +} diff --git a/app/core/gimppaintinfo.h b/app/core/gimppaintinfo.h index f02e3b297e..41f2d1f8a3 100644 --- a/app/core/gimppaintinfo.h +++ b/app/core/gimppaintinfo.h @@ -53,12 +53,18 @@ struct _GimpPaintInfoClass }; -GType gimp_paint_info_get_type (void) G_GNUC_CONST; - -GimpPaintInfo * gimp_paint_info_new (Gimp *gimp, - GType paint_type, - GType paint_options_type, - const gchar *blurb); +GType gimp_paint_info_get_type (void) G_GNUC_CONST; + +GimpPaintInfo * gimp_paint_info_new (Gimp *gimp, + GType paint_type, + GType paint_options_type, + const gchar *identifier, + const gchar *blurb, + const gchar *stock_id); + +void gimp_paint_info_set_standard (Gimp *gimp, + GimpPaintInfo *paint_info); +GimpPaintInfo * gimp_paint_info_get_standard (Gimp *gimp); #endif /* __GIMP_PAINT_INFO_H__ */ diff --git a/app/core/gimpstrokedesc.c b/app/core/gimpstrokedesc.c index bd1ec81cd7..9e5bbfbb0f 100644 --- a/app/core/gimpstrokedesc.c +++ b/app/core/gimpstrokedesc.c @@ -30,11 +30,9 @@ #include "config/gimpcoreconfig.h" -#include "core/gimp.h" -#include "core/gimpcontainer.h" -#include "core/gimpcontext.h" -#include "core/gimptoolinfo.h" - +#include "gimp.h" +#include "gimpcontainer.h" +#include "gimpcontext.h" #include "gimppaintinfo.h" #include "gimpstrokedesc.h" #include "gimpstrokeoptions.h" @@ -247,15 +245,10 @@ gimp_stroke_desc_new (Gimp *gimp, if (context) { - GimpToolInfo *tool_info = gimp_context_get_tool (context); - - if (tool_info) - paint_info = tool_info->paint_info; + paint_info = gimp_context_get_paint_info (context); if (! paint_info) - paint_info = (GimpPaintInfo *) - gimp_container_get_child_by_name (gimp->paint_info_list, - "GimpPaintbrush"); + paint_info = gimp_paint_info_get_standard (gimp); } desc = g_object_new (GIMP_TYPE_STROKE_DESC, diff --git a/app/core/gimptoolinfo.c b/app/core/gimptoolinfo.c index d9d25d13d0..3682d651a6 100644 --- a/app/core/gimptoolinfo.c +++ b/app/core/gimptoolinfo.c @@ -256,8 +256,6 @@ gimp_tool_info_new (Gimp *gimp, if (tool_info->tool_options_type == paint_info->paint_options_type) { - gimp_viewable_set_stock_id (GIMP_VIEWABLE (paint_info), stock_id); - tool_info->tool_options = g_object_ref (paint_info->paint_options); } else diff --git a/app/paint/gimp-paint.c b/app/paint/gimp-paint.c index 74dd37b56a..fb8b0a632a 100644 --- a/app/paint/gimp-paint.c +++ b/app/paint/gimp-paint.c @@ -44,7 +44,9 @@ static void gimp_paint_register (Gimp *gimp, GType paint_type, GType paint_options_type, - const gchar *blurb); + const gchar *identifier, + const gchar *blurb, + const gchar *stock_id); /* public functions */ @@ -72,10 +74,14 @@ gimp_paint_init (Gimp *gimp) gimp->paint_info_list = gimp_list_new (GIMP_TYPE_PAINT_INFO, FALSE); gimp_object_set_name (GIMP_OBJECT (gimp->paint_info_list), "paint infos"); + gimp_container_freeze (gimp->paint_info_list); + for (i = 0; i < G_N_ELEMENTS (register_funcs); i++) { register_funcs[i] (gimp, gimp_paint_register); } + + gimp_container_thaw (gimp->paint_info_list); } void @@ -83,6 +89,8 @@ gimp_paint_exit (Gimp *gimp) { g_return_if_fail (GIMP_IS_GIMP (gimp)); + gimp_paint_info_set_standard (gimp, NULL); + if (gimp->paint_info_list) { g_object_unref (gimp->paint_info_list); @@ -97,7 +105,9 @@ static void gimp_paint_register (Gimp *gimp, GType paint_type, GType paint_options_type, - const gchar *blurb) + const gchar *identifier, + const gchar *blurb, + const gchar *stock_id) { GimpPaintInfo *paint_info; @@ -109,8 +119,13 @@ gimp_paint_register (Gimp *gimp, paint_info = gimp_paint_info_new (gimp, paint_type, paint_options_type, - blurb); + identifier, + blurb, + stock_id); gimp_container_add (gimp->paint_info_list, GIMP_OBJECT (paint_info)); g_object_unref (paint_info); + + if (paint_type == GIMP_TYPE_PAINTBRUSH) + gimp_paint_info_set_standard (gimp, paint_info); } diff --git a/app/paint/gimpairbrush.c b/app/paint/gimpairbrush.c index e82a25be91..c5873edb55 100644 --- a/app/paint/gimpairbrush.c +++ b/app/paint/gimpairbrush.c @@ -65,7 +65,9 @@ gimp_airbrush_register (Gimp *gimp, (* callback) (gimp, GIMP_TYPE_AIRBRUSH, GIMP_TYPE_AIRBRUSH_OPTIONS, - _("Airbrush")); + "gimp-airbrush", + _("Airbrush"), + "gimp-tool-airbrush"); } static void diff --git a/app/paint/gimpclone.c b/app/paint/gimpclone.c index c8110b724b..39c138fa8e 100644 --- a/app/paint/gimpclone.c +++ b/app/paint/gimpclone.c @@ -85,7 +85,9 @@ gimp_clone_register (Gimp *gimp, (* callback) (gimp, GIMP_TYPE_CLONE, GIMP_TYPE_CLONE_OPTIONS, - _("Clone")); + "gimp-clone", + _("Clone"), + "gimp-tool-clone"); } static void diff --git a/app/paint/gimpconvolve.c b/app/paint/gimpconvolve.c index 18e2fd24ef..684845a26d 100644 --- a/app/paint/gimpconvolve.c +++ b/app/paint/gimpconvolve.c @@ -115,7 +115,9 @@ gimp_convolve_register (Gimp *gimp, (* callback) (gimp, GIMP_TYPE_CONVOLVE, GIMP_TYPE_CONVOLVE_OPTIONS, - _("Convolve")); + "gimp-convolve", + _("Convolve"), + "gimp-tool-convolve"); } static void diff --git a/app/paint/gimpdodgeburn.c b/app/paint/gimpdodgeburn.c index 3267c606fe..45e51a0dde 100644 --- a/app/paint/gimpdodgeburn.c +++ b/app/paint/gimpdodgeburn.c @@ -83,7 +83,9 @@ gimp_dodge_burn_register (Gimp *gimp, (* callback) (gimp, GIMP_TYPE_DODGE_BURN, GIMP_TYPE_DODGE_BURN_OPTIONS, - _("Dodge/Burn")); + "gimp-dodge-burn", + _("Dodge/Burn"), + "gimp-tool-dodge-burn"); } static void diff --git a/app/paint/gimperaser.c b/app/paint/gimperaser.c index a09bed6507..fde3b05390 100644 --- a/app/paint/gimperaser.c +++ b/app/paint/gimperaser.c @@ -58,7 +58,9 @@ gimp_eraser_register (Gimp *gimp, (* callback) (gimp, GIMP_TYPE_ERASER, GIMP_TYPE_ERASER_OPTIONS, - _("Eraser")); + "gimp-eraser", + _("Eraser"), + "gimp-tool-eraser"); } static void diff --git a/app/paint/gimpink.c b/app/paint/gimpink.c index 65eea3ca29..9b0065b539 100644 --- a/app/paint/gimpink.c +++ b/app/paint/gimpink.c @@ -99,7 +99,9 @@ gimp_ink_register (Gimp *gimp, (* callback) (gimp, GIMP_TYPE_INK, GIMP_TYPE_INK_OPTIONS, - _("Ink")); + "gimp-ink", + _("Ink"), + "gimp-tool-ink"); } static void diff --git a/app/paint/gimppaintbrush.c b/app/paint/gimppaintbrush.c index bffead17b8..079a24036e 100644 --- a/app/paint/gimppaintbrush.c +++ b/app/paint/gimppaintbrush.c @@ -59,7 +59,9 @@ gimp_paintbrush_register (Gimp *gimp, (* callback) (gimp, GIMP_TYPE_PAINTBRUSH, GIMP_TYPE_PAINT_OPTIONS, - _("Paintbrush")); + "gimp-paintbrush", + _("Paintbrush"), + "gimp-tool-paintbrush"); } static void diff --git a/app/paint/gimppencil.c b/app/paint/gimppencil.c index 73cbf5e75c..aee56f8721 100644 --- a/app/paint/gimppencil.c +++ b/app/paint/gimppencil.c @@ -38,7 +38,9 @@ gimp_pencil_register (Gimp *gimp, (* callback) (gimp, GIMP_TYPE_PENCIL, GIMP_TYPE_PENCIL_OPTIONS, - _("Pencil")); + "gimp-pencil", + _("Pencil"), + "gimp-tool-pencil"); } static void diff --git a/app/paint/gimpsmudge.c b/app/paint/gimpsmudge.c index 996055ed79..feb68ca0e9 100644 --- a/app/paint/gimpsmudge.c +++ b/app/paint/gimpsmudge.c @@ -74,7 +74,9 @@ gimp_smudge_register (Gimp *gimp, (* callback) (gimp, GIMP_TYPE_SMUDGE, GIMP_TYPE_SMUDGE_OPTIONS, - _("Smudge")); + "gimp-smudge", + _("Smudge"), + "gimp-tool-smudge"); } static void diff --git a/app/paint/gimpsourcecore.c b/app/paint/gimpsourcecore.c index c8110b724b..39c138fa8e 100644 --- a/app/paint/gimpsourcecore.c +++ b/app/paint/gimpsourcecore.c @@ -85,7 +85,9 @@ gimp_clone_register (Gimp *gimp, (* callback) (gimp, GIMP_TYPE_CLONE, GIMP_TYPE_CLONE_OPTIONS, - _("Clone")); + "gimp-clone", + _("Clone"), + "gimp-tool-clone"); } static void diff --git a/app/paint/paint-types.h b/app/paint/paint-types.h index 2f3cc0b2d7..6350d1afb3 100644 --- a/app/paint/paint-types.h +++ b/app/paint/paint-types.h @@ -36,7 +36,9 @@ typedef struct _GimpPaintOptions GimpPaintOptions; typedef void (* GimpPaintRegisterCallback) (Gimp *gimp, GType paint_type, GType paint_options_type, - const gchar *blurb); + const gchar *identifier, + const gchar *blurb, + const gchar *stock_id); typedef void (* GimpPaintRegisterFunc) (Gimp *gimp, GimpPaintRegisterCallback callback); diff --git a/app/tools/gimp-tools.c b/app/tools/gimp-tools.c index 6bf01f6f54..e0fd8bba67 100644 --- a/app/tools/gimp-tools.c +++ b/app/tools/gimp-tools.c @@ -488,43 +488,43 @@ gimp_tools_register (GType tool_type, if (tool_type == GIMP_TYPE_PENCIL_TOOL) { - paint_core_name = "GimpPencil"; + paint_core_name = "gimp-pencil"; } else if (tool_type == GIMP_TYPE_PAINTBRUSH_TOOL) { - paint_core_name = "GimpPaintbrush"; + paint_core_name = "gimp-paintbrush"; } else if (tool_type == GIMP_TYPE_ERASER_TOOL) { - paint_core_name = "GimpEraser"; + paint_core_name = "gimp-eraser"; } else if (tool_type == GIMP_TYPE_AIRBRUSH_TOOL) { - paint_core_name = "GimpAirbrush"; + paint_core_name = "gimp-airbrush"; } else if (tool_type == GIMP_TYPE_CLONE_TOOL) { - paint_core_name = "GimpClone"; + paint_core_name = "gimp-clone"; } else if (tool_type == GIMP_TYPE_CONVOLVE_TOOL) { - paint_core_name = "GimpConvolve"; + paint_core_name = "gimp-convolve"; } else if (tool_type == GIMP_TYPE_SMUDGE_TOOL) { - paint_core_name = "GimpSmudge"; + paint_core_name = "gimp-smudge"; } else if (tool_type == GIMP_TYPE_DODGE_BURN_TOOL) { - paint_core_name = "GimpDodgeBurn"; + paint_core_name = "gimp-dodge-burn"; } else if (tool_type == GIMP_TYPE_INK_TOOL) { - paint_core_name = "GimpInk"; + paint_core_name = "gimp-ink"; } else { - paint_core_name = "GimpPaintbrush"; + paint_core_name = "gimp-paintbrush"; } tool_info = gimp_tool_info_new (gimp, diff --git a/app/widgets/gimpdeviceinfo.h b/app/widgets/gimpdeviceinfo.h index 46900e4c1a..e02bd38c45 100644 --- a/app/widgets/gimpdeviceinfo.h +++ b/app/widgets/gimpdeviceinfo.h @@ -29,6 +29,7 @@ G_BEGIN_DECLS #define GIMP_DEVICE_INFO_CONTEXT_MASK (GIMP_CONTEXT_TOOL_MASK | \ + GIMP_CONTEXT_PAINT_INFO_MASK | \ GIMP_CONTEXT_FOREGROUND_MASK | \ GIMP_CONTEXT_BACKGROUND_MASK | \ GIMP_CONTEXT_BRUSH_MASK | \ -- GitLab