Add dynamics context and factory data and functions (need debugging).

This commit is contained in:
zhenfeng zhao 2009-08-17 23:47:26 -03:00
parent 3a78004757
commit f48a7e4a8b
7 changed files with 259 additions and 16 deletions

View File

@ -75,6 +75,8 @@
#include "gimptemplate.h"
#include "gimptoolinfo.h"
#include "paint/gimpdynamicsoptions.h"
#include "gimp-intl.h"
@ -238,6 +240,7 @@ gimp_init (Gimp *gimp)
gimp->fonts = NULL;
gimp->brush_factory = NULL;
gimp->dynamics_factory = NULL;
gimp->pattern_factory = NULL;
gimp->gradient_factory = NULL;
gimp->palette_factory = NULL;
@ -277,6 +280,9 @@ gimp_dispose (GObject *object)
if (gimp->brush_factory)
gimp_data_factory_data_free (gimp->brush_factory);
if (gimp->dynamics_factory)
gimp_data_factory_data_free (gimp->dynamics_factory);
if (gimp->pattern_factory)
gimp_data_factory_data_free (gimp->pattern_factory);
@ -339,6 +345,12 @@ gimp_finalize (GObject *object)
gimp->brush_factory = NULL;
}
if (gimp->dynamics_factory)
{
g_object_unref (gimp->dynamics_factory);
gimp->dynamics_factory = NULL;
}
if (gimp->pattern_factory)
{
g_object_unref (gimp->pattern_factory);
@ -478,6 +490,8 @@ gimp_get_memsize (GimpObject *object,
gui_size);
memsize += gimp_object_get_memsize (GIMP_OBJECT (gimp->brush_factory),
gui_size);
memsize += gimp_object_get_memsize (GIMP_OBJECT (gimp->dynamics_factory),
gui_size);
memsize += gimp_object_get_memsize (GIMP_OBJECT (gimp->pattern_factory),
gui_size);
memsize += gimp_object_get_memsize (GIMP_OBJECT (gimp->gradient_factory),
@ -526,6 +540,12 @@ gimp_real_initialize (Gimp *gimp,
{ gimp_brush_pipe_load, GIMP_BRUSH_PIPE_FILE_EXTENSION, FALSE }
};
static const GimpDataFactoryLoaderEntry dynamics_loader_entries[] =
{
{ gimp_pattern_load, GIMP_PATTERN_FILE_EXTENSION, FALSE },
{ gimp_pattern_load_pixbuf, NULL, FALSE }
};
static const GimpDataFactoryLoaderEntry pattern_loader_entries[] =
{
{ gimp_pattern_load, GIMP_PATTERN_FILE_EXTENSION, FALSE },
@ -566,6 +586,18 @@ gimp_real_initialize (Gimp *gimp,
gimp_object_set_static_name (GIMP_OBJECT (gimp->brush_factory),
"brush factory");
gimp->dynamics_factory =
gimp_data_factory_new (gimp,
GIMP_TYPE_DYNAMICS_OPTIONS,
"dynamics-path", "dynamics-path-writable",
dynamics_loader_entries,
G_N_ELEMENTS (dynamics_loader_entries),
gimp_dynamics_options_new,
gimp_dynamics_get_standard);
gimp_object_set_static_name (GIMP_OBJECT (gimp->dynamics_factory),
"dynamics factory");
gimp->pattern_factory =
gimp_data_factory_new (gimp,
GIMP_TYPE_PATTERN,

View File

@ -90,6 +90,7 @@ struct _Gimp
GimpContainer *fonts;
GimpDataFactory *brush_factory;
GimpDataFactory *dynamics_factory;
GimpDataFactory *pattern_factory;
GimpDataFactory *gradient_factory;
GimpDataFactory *palette_factory;

View File

@ -47,6 +47,7 @@
#include "gimptemplate.h"
#include "gimptoolinfo.h"
#include "paint/gimpdynamicsoptions.h"
#include "text/gimpfont.h"
#include "gimp-intl.h"
@ -156,9 +157,22 @@ static void gimp_context_brush_removed (GimpContainer *brush_list,
GimpContext *context);
static void gimp_context_brush_list_thaw (GimpContainer *container,
GimpContext *context);
static void gimp_context_real_set_brush (GimpContext *context,
GimpBrush *brush);
/* dynamics */
static void gimp_context_dynamics_dirty (GimpDynamicsOptions *dynamics,
GimpContext *context);
static void gimp_context_dynamics_removed (GimpContainer *dynamics_list,
GimpDynamicsOptions *dynamics,
GimpContext *context);
static void gimp_context_dynamics_list_thaw (GimpContainer *container,
GimpContext *context);
static void gimp_context_real_set_dynamics (GimpContext *context,
GimpDynamicsOptions *dynamics);
/* pattern */
static void gimp_context_pattern_dirty (GimpPattern *pattern,
GimpContext *context);
@ -267,6 +281,7 @@ enum
OPACITY_CHANGED,
PAINT_MODE_CHANGED,
BRUSH_CHANGED,
DYNAMICS_CHANGED,
PATTERN_CHANGED,
GRADIENT_CHANGED,
PALETTE_CHANGED,
@ -440,6 +455,16 @@ gimp_context_class_init (GimpContextClass *klass)
G_TYPE_NONE, 1,
GIMP_TYPE_BRUSH);
gimp_context_signals[DYNAMICS_CHANGED] =
g_signal_new ("dynamics-changed",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (GimpContextClass, dynamics_changed),
NULL, NULL,
gimp_marshal_VOID__OBJECT,
G_TYPE_NONE, 1,
GIMP_TYPE_DYNAMICS_OPTIONS);
gimp_context_signals[PATTERN_CHANGED] =
g_signal_new ("pattern-changed",
G_TYPE_FROM_CLASS (klass),
@ -527,6 +552,7 @@ gimp_context_class_init (GimpContextClass *klass)
klass->opacity_changed = NULL;
klass->paint_mode_changed = NULL;
klass->brush_changed = NULL;
klass->dynamics_changed = NULL;
klass->pattern_changed = NULL;
klass->gradient_changed = NULL;
klass->palette_changed = NULL;
@ -539,6 +565,7 @@ gimp_context_class_init (GimpContextClass *klass)
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_DYNAMICS] = GIMP_TYPE_DYNAMICS_OPTIONS;
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;
@ -609,6 +636,12 @@ gimp_context_class_init (GimpContextClass *klass)
GIMP_TYPE_BRUSH,
GIMP_PARAM_STATIC_STRINGS);
GIMP_CONFIG_INSTALL_PROP_OBJECT (object_class, GIMP_CONTEXT_PROP_DYNAMICS,
gimp_context_prop_names[GIMP_CONTEXT_PROP_DYNAMICS],
NULL,
GIMP_TYPE_DYNAMICS_OPTIONS,
GIMP_PARAM_STATIC_STRINGS);
GIMP_CONFIG_INSTALL_PROP_OBJECT (object_class, GIMP_CONTEXT_PROP_PATTERN,
gimp_context_prop_names[GIMP_CONTEXT_PROP_PATTERN],
NULL,
@ -748,6 +781,13 @@ gimp_context_constructor (GType type,
G_CALLBACK (gimp_context_brush_list_thaw),
object, 0);
g_signal_connect_object (gimp_data_factory_get_container (gimp->dynamics_factory), "remove",
G_CALLBACK (gimp_context_dynamics_removed),
object, 0);
g_signal_connect_object (gimp_data_factory_get_container (gimp->dynamics_factory), "thaw",
G_CALLBACK (gimp_context_dynamics_list_thaw),
object, 0);
g_signal_connect_object (gimp_data_factory_get_container (gimp->pattern_factory), "remove",
G_CALLBACK (gimp_context_pattern_removed),
object, 0);
@ -977,6 +1017,9 @@ gimp_context_set_property (GObject *object,
case GIMP_CONTEXT_PROP_BRUSH:
gimp_context_set_brush (context, g_value_get_object (value));
break;
case GIMP_CONTEXT_PROP_DYNAMICS:
gimp_context_set_dynamics (context, g_value_get_object (value));
break;
case GIMP_CONTEXT_PROP_PATTERN:
gimp_context_set_pattern (context, g_value_get_object (value));
break;
@ -1054,6 +1097,9 @@ gimp_context_get_property (GObject *object,
case GIMP_CONTEXT_PROP_BRUSH:
g_value_set_object (value, gimp_context_get_brush (context));
break;
case GIMP_CONTEXT_PROP_DYNAMICS:
g_value_set_object (value, gimp_context_get_dynamics (context));
break;
case GIMP_CONTEXT_PROP_PATTERN:
g_value_set_object (value, gimp_context_get_pattern (context));
break;
@ -1129,6 +1175,7 @@ gimp_context_serialize_property (GimpConfig *config,
case GIMP_CONTEXT_PROP_TOOL:
case GIMP_CONTEXT_PROP_PAINT_INFO:
case GIMP_CONTEXT_PROP_BRUSH:
case GIMP_CONTEXT_PROP_DYNAMICS:
case GIMP_CONTEXT_PROP_PATTERN:
case GIMP_CONTEXT_PROP_GRADIENT:
case GIMP_CONTEXT_PROP_PALETTE:
@ -1189,6 +1236,12 @@ gimp_context_deserialize_property (GimpConfig *object,
name_loc = &context->brush_name;
break;
case GIMP_CONTEXT_PROP_DYNAMICS:
container = gimp_data_factory_get_container (context->gimp->dynamics_factory);
current = (GimpObject *) context->dynamics;
name_loc = &context->dynamics_name;
break;
case GIMP_CONTEXT_PROP_PATTERN:
container = gimp_data_factory_get_container (context->gimp->pattern_factory);
current = (GimpObject *) context->pattern;
@ -1492,6 +1545,14 @@ gimp_context_copy_property (GimpContext *src,
dest_name_loc = &dest->brush_name;
break;
case GIMP_CONTEXT_PROP_DYNAMICS:
gimp_context_real_set_dynamics (dest, src->dynamics);
object = src->dynamics;
standard_object = standard_dynamics;
src_name = src->dynamics_name;
dest_name_loc = &dest->dynamics_name;
break;
case GIMP_CONTEXT_PROP_PATTERN:
gimp_context_real_set_pattern (dest, src->pattern);
object = src->pattern;
@ -2404,6 +2465,127 @@ gimp_context_real_set_brush (GimpContext *context,
}
/*****************************************************************************/
/* dynamics *****************************************************************/
GimpBrush *
gimp_context_get_dynamics (GimpContext *context)
{
g_return_val_if_fail (GIMP_IS_CONTEXT (context), NULL);
return context->dynamics;
}
void
gimp_context_set_dynamics (GimpContext *context,
GimpDynamicsOptions *dynamics)
{
g_return_if_fail (GIMP_IS_CONTEXT (context));
g_return_if_fail (! dynamics || GIMP_IS_DYNAMICS (dynamics));
context_find_defined (context, GIMP_CONTEXT_PROP_DYNAMICS);
gimp_context_real_set_dynamics (context, dynamics);
}
void
gimp_context_dynamics_changed (GimpContext *context)
{
g_return_if_fail (GIMP_IS_CONTEXT (context));
g_signal_emit (context,
gimp_context_signals[DYNAMICS_CHANGED], 0,
context->dynamics);
}
static void
gimp_context_dynamics_dirty (GimpDynamicsOptions *dynamics,
GimpContext *context)
{
g_free (context->dynamics_name);
context->dynamics_name = g_strdup (GIMP_OBJECT (dynamics)->name);
}
static void gimp_context_dynamics_removed (GimpContainer *dynamics_list,
GimpDynamicsOptions *dynamics,
GimpContext *context);
{
if (dynamics == context->dynamics)
{
context->dynamics = NULL;
g_signal_handlers_disconnect_by_func (dynamics,
gimp_context_dynamics_dirty,
context);
g_object_unref (dynamics);
if (! gimp_container_frozen (container))
gimp_context_dynamics_list_thaw (container, context);
}
}
static void gimp_context_dynamics_list_thaw (GimpContainer *container,
GimpContext *context);
{
GimpDynamicsOptions *dynamics;
/*
if (! context->dynamics_name)
context->dynamics_name = g_strdup (context->gimp->config->default_dynamics);
*/
dynamics = gimp_context_find_object (context, container,
context->dynamics_name,
gimp_dynamics_get_standard ());
gimp_context_real_set_dynamics (context, dynamics);
}
static void
gimp_context_real_set_dynamics (GimpContext *context,
GimpDynamicsOptions *dynamics)
{
/* if (! standard_dynamics)
standard_dynamics = GIMP_BRUSH (gimp_dynamics_get_standard ());
*/
if (context->dynamics == dynamics)
return;
if (context->dynamics_name && dynamics != standard_dynamics)
{
g_free (context->dynamics_name);
context->dynamics_name = NULL;
}
/* disconnect from the old brush's signals */
if (context->dynamics)
{
g_signal_handlers_disconnect_by_func (context->dynamics,
gimp_context_dynamics_dirty,
context);
g_object_unref (context->dynamics);
}
context->dynamics = dynamics;
if (dynamics)
{
g_object_ref (dynamics);
g_signal_connect_object (dynamics, "name-changed",
G_CALLBACK (gimp_context_dynamics_dirty),
context,
0);
if (dynamics != standard_dynamics)
context->dynamics_name = g_strdup (GIMP_OBJECT (dynamics)->name);
}
g_object_notify (G_OBJECT (context), "dynamics");
gimp_context_dynamics_changed (context);
}
/*****************************************************************************/
/* pattern *****************************************************************/

View File

@ -64,6 +64,9 @@ struct _GimpContext
GimpBrush *brush;
gchar *brush_name;
GimpDynamicsOptions *dynamics;
gchar *dynamics_name;
GimpPattern *pattern;
gchar *pattern_name;
@ -110,6 +113,8 @@ struct _GimpContextClass
GimpLayerModeEffects paint_mode);
void (* brush_changed) (GimpContext *context,
GimpBrush *brush);
void (* dynamics_changed) (GimpContext *context,
GimpDynamicsOptions *dynamics);
void (* pattern_changed) (GimpContext *context,
GimpPattern *pattern);
void (* gradient_changed) (GimpContext *context,
@ -257,6 +262,20 @@ void gimp_context_set_brush (GimpContext *context,
GimpBrush *brush);
void gimp_context_brush_changed (GimpContext *context);
/* brush */
GimpBrush * gimp_context_get_brush (GimpContext *context);
void gimp_context_set_brush (GimpContext *context,
GimpBrush *brush);
void gimp_context_brush_changed (GimpContext *context);
/* dynamics */
GimpDynamicsOptions * gimp_context_get_dynamics (GimpContext *context);
void gimp_context_set_dynamics (GimpContext *context,
GimpDynamicsOptions *dynamics);
void gimp_context_dynamics_changed (GimpContext *context);
/* pattern */
GimpPattern * gimp_context_get_pattern (GimpContext *context);

View File

@ -1023,6 +1023,26 @@ gimp_dynamics_options_new (GimpPaintInfo *dynamics_info)
}
GimpData *
gimp_dynamics_get_standard (void)
{
static GimpData *standard_dynamics = NULL;
if (! standard_dynamics)
{
standard_dynamics = gimp_dynamics_options_new ("Standard");
standard_dynamics->dirty = FALSE;
gimp_data_make_internal (standard_dynamics,
"gimp-dynamics-standard");
g_object_ref (standard_dynamics);
}
return standard_dynamics;
}
/* Calculates dynamics mix to be used for same parameter
* (velocity/pressure/direction/tilt/random) mix Needed in may places and tools.
*

View File

@ -98,6 +98,6 @@ GType gimp_dynamics_options_get_type (void) G_GNUC_CONST;
GimpData * gimp_dynamics_options_new (GimpPaintInfo *dynamics_info);
GimpData * gimp_dynamics_get_standard (void);
#endif /* __GIMP_DYNAMICS_OPTIONS_H__ */

View File

@ -201,8 +201,8 @@ gimp_dynamics_editor_init (GimpDynamicsEditor *editor)
gtk_container_add (GTK_CONTAINER (frame), data_editor->view);
gtk_widget_show (data_editor->view);
/*
//editor->shape_group = NULL;
/* table for sliders/labels */
editor->options_vbox = gtk_table_new (4, 3, FALSE);
gtk_table_set_row_spacings (GTK_TABLE (editor->options_vbox), 2);
gtk_table_set_col_spacings (GTK_TABLE (editor->options_vbox), 2);
@ -214,7 +214,7 @@ gimp_dynamics_editor_init (GimpDynamicsEditor *editor)
gtk_table_set_row_spacings (GTK_TABLE (table), 2);
gtk_box_pack_start (GTK_BOX (editor->options_vbox), table, FALSE, FALSE, 0);
gtk_widget_show (table);
*/
/*
g_object_set_data (G_OBJECT (vbox), "set_options", table);
@ -279,9 +279,9 @@ gimp_dynamics_editor_new (GimpContext *context,
"menu-factory", menu_factory,
"menu-identifier", "<DynamicsEditor>",
"ui-path", "/dynamics-editor-popup",
"data-factory", context->gimp->brush_factory,
"data-factory", context->gimp->dynamics_factory,
"context", context,
"data", gimp_context_get_brush (context),
"data", gimp_context_get_dynamics (context),*/
NULL);
GtkWidget *vbox;
@ -297,17 +297,6 @@ gimp_dynamics_editor_new (GimpContext *context,
//tool_type = tool_options->tool_info->tool_type;
/* the main table */
/*
return g_object_new (GIMP_TYPE_DYNAMICS_EDITOR,
"menu-factory", menu_factory,
"menu-identifier", "<DynamicsEditor>",
"ui-path", "/dynamics-editor-popup",
"data-factory", context->gimp->brush_factory,
"context", context,
"data", gimp_context_get_brush (context),
NULL);
*/
}