app/gimpcontainer.[ch] app/gimpcontainergridview.c

2001-02-17  Michael Natterer  <mitch@gimp.org>

	* app/gimpcontainer.[ch]
	* app/gimpcontainergridview.c
	* app/gimpcontainerlistview.c
	* app/gimpcontainerview.[ch]
	* app/gimplist.c
	* app/gimpmarshal.[ch]: the GimpContainer has a new virtual "reorder"
	method which is much more eficient then the current remove/add
	braindeadness when renaming data objects.
	Changed the views to connect to "reorder" and call the
	GimpContainerView's new "reorder_item" method which then does
	the right thing in the view subclasses.

	* app/gimpdatafactory.c
	* app/gimpdatafactoryview.c
	* app/gimpdatalist.[ch]: removed the data list loading and saving
	stuff from GimpDataList because that's the job of the
	GimpDataFactory.

	* app/brush_edit.[ch]
	* app/brush_select.c: cleanup.

	* app/gradient_editor.[ch]: changed it to work like the brush
	editor: return a GradientEditor pointer in the constructor
	and statically store this pointer in the gradient selection file.
	Removed the global "g_editor" variable and added tons of
	GradientEditor* variables to function calls so they know their
	context without the global variable.

	* app/gradient_select.c: changed accordingly.
This commit is contained in:
Michael Natterer 2001-02-17 21:20:10 +00:00 committed by Michael Natterer
parent 617985837c
commit 2f6f9bdd0b
43 changed files with 5499 additions and 5504 deletions

View File

@ -1,3 +1,35 @@
2001-02-17 Michael Natterer <mitch@gimp.org>
* app/gimpcontainer.[ch]
* app/gimpcontainergridview.c
* app/gimpcontainerlistview.c
* app/gimpcontainerview.[ch]
* app/gimplist.c
* app/gimpmarshal.[ch]: the GimpContainer has a new virtual "reorder"
method which is much more eficient then the current remove/add
braindeadness when renaming data objects.
Changed the views to connect to "reorder" and call the
GimpContainerView's new "reorder_item" method which then does
the right thing in the view subclasses.
* app/gimpdatafactory.c
* app/gimpdatafactoryview.c
* app/gimpdatalist.[ch]: removed the data list loading and saving
stuff from GimpDataList because that's the job of the
GimpDataFactory.
* app/brush_edit.[ch]
* app/brush_select.c: cleanup.
* app/gradient_editor.[ch]: changed it to work like the brush
editor: return a GradientEditor pointer in the constructor
and statically store this pointer in the gradient selection file.
Removed the global "g_editor" variable and added tons of
GradientEditor* variables to function calls so they know their
context without the global variable.
* app/gradient_select.c: changed accordingly.
2001-02-17 Seth Burgess <sjburges@gimp.org>
* app/tools/Makefile.am

View File

@ -36,16 +36,269 @@
#include "libgimp/gimpintl.h"
static void brush_edit_close_callback (GtkWidget *widget,
gpointer data);
static gint brush_edit_preview_resize (GtkWidget *widget,
GtkAllocation *allocation,
BrushEditGeneratedWindow *begw);
struct _BrushEditGeneratedWindow
{
GtkWidget *shell;
GtkWidget *frame;
GtkWidget *preview;
GtkWidget *scale_label;
GtkWidget *options_box;
GtkWidget *name;
GtkAdjustment *radius_data;
GtkAdjustment *hardness_data;
GtkAdjustment *angle_data;
GtkAdjustment *aspect_ratio_data;
/* Brush preview */
GtkWidget *brush_preview;
GimpBrushGenerated *brush;
gint scale;
};
static void brush_edit_close_callback (GtkWidget *widget,
gpointer data);
static void brush_edit_name_activate (GtkWidget *widget,
BrushEditGeneratedWindow *begw);
static void brush_edit_name_focus_out (GtkWidget *wid1,
GtkWidget *wid2,
BrushEditGeneratedWindow *begw);
static void brush_edit_update_brush (GtkAdjustment *adjustment,
BrushEditGeneratedWindow *begw);
static gint brush_edit_preview_resize (GtkWidget *widget,
GtkAllocation *allocation,
BrushEditGeneratedWindow *begw);
static void brush_edit_clear_preview (BrushEditGeneratedWindow *begw);
static gint brush_edit_brush_dirty (GimpBrush *brush,
BrushEditGeneratedWindow *begw);
static void brush_name_changed_callback (GtkWidget *widget,
BrushEditGeneratedWindow *begw);
/* public functions */
BrushEditGeneratedWindow *
brush_edit_generated_new (void)
{
BrushEditGeneratedWindow *begw;
GtkWidget *vbox;
GtkWidget *slider;
GtkWidget *table;
begw = g_new0 (BrushEditGeneratedWindow, 1);
begw->shell = gimp_dialog_new (_("Brush Editor"), "generated_brush_editor",
gimp_standard_help_func,
"dialogs/brush_editor.html",
GTK_WIN_POS_NONE,
FALSE, TRUE, FALSE,
"_delete_event_", brush_edit_close_callback,
begw, NULL, NULL, TRUE, TRUE,
NULL);
gtk_widget_hide (GTK_WIDGET (g_list_nth_data (gtk_container_children (GTK_CONTAINER (GTK_DIALOG (begw->shell)->vbox)), 0)));
gtk_widget_hide (GTK_DIALOG (begw->shell)->action_area);
vbox = gtk_vbox_new (FALSE, 1);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 2);
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (begw->shell)->vbox), vbox);
/* Brush's name */
begw->name = gtk_entry_new ();
gtk_box_pack_start (GTK_BOX (vbox), begw->name, FALSE, FALSE, 0);
gtk_widget_show (begw->name);
gtk_signal_connect (GTK_OBJECT (begw->name), "activate",
GTK_SIGNAL_FUNC (brush_edit_name_activate),
begw);
gtk_signal_connect (GTK_OBJECT (begw->name), "focus_out_event",
GTK_SIGNAL_FUNC (brush_edit_name_focus_out),
begw);
/* brush's preview widget w/frame */
begw->frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (begw->frame), GTK_SHADOW_IN);
gtk_box_pack_start (GTK_BOX (vbox), begw->frame, TRUE, TRUE, 0);
begw->preview = gtk_preview_new (GTK_PREVIEW_GRAYSCALE);
gtk_preview_size (GTK_PREVIEW (begw->preview), 125, 100);
gtk_signal_connect_after (GTK_OBJECT (begw->frame), "size_allocate",
GTK_SIGNAL_FUNC (brush_edit_preview_resize),
begw);
gtk_container_add (GTK_CONTAINER (begw->frame), begw->preview);
gtk_widget_show (begw->preview);
gtk_widget_show (begw->frame);
/* table for sliders/labels */
begw->scale_label = gtk_label_new ("-1:1");
gtk_box_pack_start (GTK_BOX (vbox), begw->scale_label, FALSE, FALSE, 0);
gtk_widget_show (begw->scale_label);
begw->scale = -1;
/* table for sliders/labels */
table = gtk_table_new (4, 2, FALSE);
gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
/* brush radius scale */
begw->radius_data =
GTK_ADJUSTMENT (gtk_adjustment_new (10.0, 0.0, 100.0, 0.1, 1.0, 0.0));
slider = gtk_hscale_new (begw->radius_data);
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
gtk_signal_connect (GTK_OBJECT (begw->radius_data), "value_changed",
GTK_SIGNAL_FUNC (brush_edit_update_brush),
begw);
gimp_table_attach_aligned (GTK_TABLE (table), 0, 0,
_("Radius:"), 1.0, 1.0,
slider, 1, FALSE);
/* brush hardness scale */
begw->hardness_data =
GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1.0, 0.01, 0.01, 0.0));
slider = gtk_hscale_new (begw->hardness_data);
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
gtk_signal_connect (GTK_OBJECT (begw->hardness_data), "value_changed",
GTK_SIGNAL_FUNC (brush_edit_update_brush),
begw);
gimp_table_attach_aligned (GTK_TABLE (table), 0, 1,
_("Hardness:"), 1.0, 1.0,
slider, 1, FALSE);
/* brush aspect ratio scale */
begw->aspect_ratio_data =
GTK_ADJUSTMENT (gtk_adjustment_new (1.0, 1.0, 20.0, 0.1, 1.0, 0.0));
slider = gtk_hscale_new (begw->aspect_ratio_data);
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
gtk_signal_connect (GTK_OBJECT (begw->aspect_ratio_data), "value_changed",
GTK_SIGNAL_FUNC (brush_edit_update_brush),
begw);
gimp_table_attach_aligned (GTK_TABLE (table), 0, 3,
_("Aspect Ratio:"), 1.0, 1.0,
slider, 1, FALSE);
/* brush angle scale */
begw->angle_data =
GTK_ADJUSTMENT (gtk_adjustment_new (00.0, 0.0, 180.0, 0.1, 1.0, 0.0));
slider = gtk_hscale_new (begw->angle_data);
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
gtk_signal_connect (GTK_OBJECT (begw->angle_data), "value_changed",
GTK_SIGNAL_FUNC (brush_edit_update_brush),
begw);
gimp_table_attach_aligned (GTK_TABLE (table), 0, 2,
_("Angle:"), 1.0, 1.0,
slider, 1, FALSE);
gtk_table_set_row_spacings (GTK_TABLE (table), 3);
gtk_table_set_col_spacing (GTK_TABLE (table), 0, 4);
gtk_widget_show (table);
gtk_widget_show (vbox);
gtk_widget_show (begw->shell);
return begw;
}
void
brush_edit_generated_set_brush (BrushEditGeneratedWindow *begw,
GimpBrush *gbrush)
{
GimpBrushGenerated *brush = NULL;
g_return_if_fail (begw != NULL);
if (begw->brush == (GimpBrushGenerated *) gbrush)
return;
if (begw->brush)
{
gtk_signal_disconnect_by_data (GTK_OBJECT (begw->brush), begw);
gtk_object_unref (GTK_OBJECT (begw->brush));
begw->brush = NULL;
}
if (!gbrush || !GIMP_IS_BRUSH_GENERATED (gbrush))
{
if (GTK_WIDGET_VISIBLE (begw->shell))
gtk_widget_hide (begw->shell);
return;
}
brush = GIMP_BRUSH_GENERATED (gbrush);
gtk_signal_connect (GTK_OBJECT (brush), "invalidate_preview",
GTK_SIGNAL_FUNC (brush_edit_brush_dirty),
begw);
gtk_signal_connect (GTK_OBJECT (brush), "name_changed",
GTK_SIGNAL_FUNC (brush_name_changed_callback),
begw);
gtk_adjustment_set_value (GTK_ADJUSTMENT (begw->radius_data),
gimp_brush_generated_get_radius (brush));
gtk_adjustment_set_value (GTK_ADJUSTMENT (begw->hardness_data),
gimp_brush_generated_get_hardness (brush));
gtk_adjustment_set_value (GTK_ADJUSTMENT (begw->angle_data),
gimp_brush_generated_get_angle (brush));
gtk_adjustment_set_value (GTK_ADJUSTMENT (begw->aspect_ratio_data),
gimp_brush_generated_get_aspect_ratio (brush));
gtk_entry_set_text (GTK_ENTRY (begw->name),
gimp_object_get_name (GIMP_OBJECT (gbrush)));
begw->brush = brush;
gtk_object_ref (GTK_OBJECT (begw->brush));
brush_edit_brush_dirty (GIMP_BRUSH (brush), begw);
if (! GTK_WIDGET_VISIBLE (begw->shell))
gtk_widget_show (begw->shell);
else
gdk_window_raise (begw->shell->window);
}
/* private functions */
static void
update_brush_callback (GtkAdjustment *adjustment,
BrushEditGeneratedWindow *begw)
brush_edit_close_callback (GtkWidget *widget,
gpointer data)
{
BrushEditGeneratedWindow *begw = (BrushEditGeneratedWindow *) data;
if (GTK_WIDGET_VISIBLE (begw->shell))
gtk_widget_hide (begw->shell);
}
static void
brush_edit_name_activate (GtkWidget *widget,
BrushEditGeneratedWindow *begw)
{
gchar *entry_text;
entry_text = gtk_entry_get_text (GTK_ENTRY (widget));
gimp_object_set_name (GIMP_OBJECT (begw->brush), entry_text);
}
static void
brush_edit_name_focus_out (GtkWidget *wid1,
GtkWidget *wid2,
BrushEditGeneratedWindow *begw)
{
brush_edit_name_activate (wid1, begw);
}
static void
brush_edit_update_brush (GtkAdjustment *adjustment,
BrushEditGeneratedWindow *begw)
{
if (begw->brush &&
((begw->radius_data->value
@ -70,6 +323,22 @@ update_brush_callback (GtkAdjustment *adjustment,
}
}
static gint
brush_edit_preview_resize (GtkWidget *widget,
GtkAllocation *allocation,
BrushEditGeneratedWindow *begw)
{
gtk_preview_size (GTK_PREVIEW (begw->preview),
widget->allocation.width - 4,
widget->allocation.height - 4);
/* update the display */
if (begw->brush)
brush_edit_brush_dirty (GIMP_BRUSH (begw->brush), begw);
return FALSE;
}
static void
brush_edit_clear_preview (BrushEditGeneratedWindow *begw)
{
@ -90,8 +359,8 @@ brush_edit_clear_preview (BrushEditGeneratedWindow *begw)
}
static gint
brush_edit_brush_dirty_callback (GimpBrush *brush,
BrushEditGeneratedWindow *begw)
brush_edit_brush_dirty (GimpBrush *brush,
BrushEditGeneratedWindow *begw)
{
gint x, y, width, yend, ystart, xo;
gint scale;
@ -144,225 +413,3 @@ brush_name_changed_callback (GtkWidget *widget,
gtk_entry_set_text (GTK_ENTRY (begw->name),
gimp_object_get_name (GIMP_OBJECT (begw->brush)));
}
void
brush_edit_generated_set_brush (BrushEditGeneratedWindow *begw,
GimpBrush *gbrush)
{
GimpBrushGenerated *brush = NULL;
g_return_if_fail (begw != NULL);
if (begw->brush == (GimpBrushGenerated *) gbrush)
return;
if (begw->brush)
{
gtk_signal_disconnect_by_data (GTK_OBJECT (begw->brush), begw);
gtk_object_unref (GTK_OBJECT (begw->brush));
begw->brush = NULL;
}
if (!gbrush || !GIMP_IS_BRUSH_GENERATED (gbrush))
{
begw->brush = NULL;
if (GTK_WIDGET_VISIBLE (begw->shell))
gtk_widget_hide (begw->shell);
return;
}
brush = GIMP_BRUSH_GENERATED (gbrush);
gtk_signal_connect (GTK_OBJECT (brush), "invalidate_preview",
GTK_SIGNAL_FUNC (brush_edit_brush_dirty_callback),
begw);
gtk_signal_connect (GTK_OBJECT (brush), "name_changed",
GTK_SIGNAL_FUNC (brush_name_changed_callback),
begw);
begw->brush = NULL;
gtk_adjustment_set_value (GTK_ADJUSTMENT (begw->radius_data),
gimp_brush_generated_get_radius (brush));
gtk_adjustment_set_value (GTK_ADJUSTMENT (begw->hardness_data),
gimp_brush_generated_get_hardness (brush));
gtk_adjustment_set_value (GTK_ADJUSTMENT (begw->angle_data),
gimp_brush_generated_get_angle (brush));
gtk_adjustment_set_value (GTK_ADJUSTMENT (begw->aspect_ratio_data),
gimp_brush_generated_get_aspect_ratio (brush));
gtk_entry_set_text (GTK_ENTRY (begw->name),
gimp_object_get_name (GIMP_OBJECT (gbrush)));
begw->brush = brush;
gtk_object_ref (GTK_OBJECT (begw->brush));
brush_edit_brush_dirty_callback (GIMP_BRUSH (brush), begw);
}
void
name_changed_func (GtkWidget *widget,
BrushEditGeneratedWindow *begw)
{
gchar *entry_text;
entry_text = gtk_entry_get_text (GTK_ENTRY (widget));
gimp_object_set_name (GIMP_OBJECT (begw->brush), entry_text);
}
void
focus_out_func (GtkWidget *wid1,
GtkWidget *wid2,
BrushEditGeneratedWindow *begw)
{
name_changed_func (wid1, begw);
}
BrushEditGeneratedWindow *
brush_edit_generated_new (void)
{
BrushEditGeneratedWindow *begw;
GtkWidget *vbox;
GtkWidget *slider;
GtkWidget *table;
begw = g_new0 (BrushEditGeneratedWindow, 1);
begw->shell = gimp_dialog_new (_("Brush Editor"), "generated_brush_editor",
gimp_standard_help_func,
"dialogs/brush_editor.html",
GTK_WIN_POS_NONE,
FALSE, TRUE, FALSE,
_("Close"), brush_edit_close_callback,
begw, NULL, NULL, TRUE, TRUE,
NULL);
vbox = gtk_vbox_new (FALSE, 1);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 2);
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (begw->shell)->vbox), vbox);
/* Brush's name */
begw->name = gtk_entry_new ();
gtk_box_pack_start (GTK_BOX (vbox), begw->name, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (begw->name), "activate",
GTK_SIGNAL_FUNC (name_changed_func),
begw);
gtk_signal_connect (GTK_OBJECT (begw->name), "focus_out_event",
GTK_SIGNAL_FUNC (focus_out_func),
begw);
gtk_widget_show (begw->name);
/* brush's preview widget w/frame */
begw->frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (begw->frame), GTK_SHADOW_IN);
gtk_box_pack_start (GTK_BOX (vbox), begw->frame, TRUE, TRUE, 0);
begw->preview = gtk_preview_new (GTK_PREVIEW_GRAYSCALE);
gtk_preview_size (GTK_PREVIEW (begw->preview), 125, 100);
gtk_signal_connect_after (GTK_OBJECT (begw->frame), "size_allocate",
GTK_SIGNAL_FUNC (brush_edit_preview_resize),
begw);
gtk_container_add (GTK_CONTAINER (begw->frame), begw->preview);
gtk_widget_show (begw->preview);
gtk_widget_show (begw->frame);
/* table for sliders/labels */
begw->scale_label = gtk_label_new ("-1:1");
gtk_box_pack_start (GTK_BOX (vbox), begw->scale_label, FALSE, FALSE, 0);
gtk_widget_show (begw->scale_label);
begw->scale = -1;
/* table for sliders/labels */
table = gtk_table_new (4, 2, FALSE);
gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
/* brush radius scale */
begw->radius_data =
GTK_ADJUSTMENT (gtk_adjustment_new (10.0, 0.0, 100.0, 0.1, 1.0, 0.0));
slider = gtk_hscale_new (begw->radius_data);
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
gtk_signal_connect (GTK_OBJECT (begw->radius_data), "value_changed",
GTK_SIGNAL_FUNC (update_brush_callback),
begw);
gimp_table_attach_aligned (GTK_TABLE (table), 0, 0,
_("Radius:"), 1.0, 1.0,
slider, 1, FALSE);
/* brush hardness scale */
begw->hardness_data =
GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1.0, 0.01, 0.01, 0.0));
slider = gtk_hscale_new (begw->hardness_data);
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
gtk_signal_connect (GTK_OBJECT (begw->hardness_data), "value_changed",
GTK_SIGNAL_FUNC (update_brush_callback),
begw);
gimp_table_attach_aligned (GTK_TABLE (table), 0, 1,
_("Hardness:"), 1.0, 1.0,
slider, 1, FALSE);
/* brush aspect ratio scale */
begw->aspect_ratio_data =
GTK_ADJUSTMENT (gtk_adjustment_new (1.0, 1.0, 20.0, 0.1, 1.0, 0.0));
slider = gtk_hscale_new (begw->aspect_ratio_data);
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
gtk_signal_connect (GTK_OBJECT (begw->aspect_ratio_data), "value_changed",
GTK_SIGNAL_FUNC (update_brush_callback),
begw);
gimp_table_attach_aligned (GTK_TABLE (table), 0, 3,
_("Aspect Ratio:"), 1.0, 1.0,
slider, 1, FALSE);
/* brush angle scale */
begw->angle_data =
GTK_ADJUSTMENT (gtk_adjustment_new (00.0, 0.0, 180.0, 0.1, 1.0, 0.0));
slider = gtk_hscale_new (begw->angle_data);
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
gtk_signal_connect (GTK_OBJECT (begw->angle_data), "value_changed",
GTK_SIGNAL_FUNC (update_brush_callback),
begw);
gimp_table_attach_aligned (GTK_TABLE (table), 0, 2,
_("Angle:"), 1.0, 1.0,
slider, 1, FALSE);
gtk_table_set_row_spacings (GTK_TABLE (table), 3);
gtk_table_set_col_spacing (GTK_TABLE (table), 0, 4);
gtk_widget_show (table);
gtk_widget_show (vbox);
gtk_widget_show (begw->shell);
return begw;
}
static gint
brush_edit_preview_resize (GtkWidget *widget,
GtkAllocation *allocation,
BrushEditGeneratedWindow *begw)
{
gtk_preview_size (GTK_PREVIEW (begw->preview),
widget->allocation.width - 4,
widget->allocation.height - 4);
/* update the display */
if (begw->brush)
brush_edit_brush_dirty_callback (GIMP_BRUSH (begw->brush), begw);
return FALSE;
}
static void
brush_edit_close_callback (GtkWidget *widget,
gpointer data)
{
BrushEditGeneratedWindow *begw = (BrushEditGeneratedWindow *) data;
if (GTK_WIDGET_VISIBLE (begw->shell))
gtk_widget_hide (begw->shell);
}

View File

@ -24,30 +24,12 @@
typedef struct _BrushEditGeneratedWindow BrushEditGeneratedWindow;
struct _BrushEditGeneratedWindow
{
GtkWidget *shell;
GtkWidget *frame;
GtkWidget *preview;
GtkWidget *scale_label;
GtkWidget *options_box;
GtkWidget *name;
GtkAdjustment *radius_data;
GtkAdjustment *hardness_data;
GtkAdjustment *angle_data;
GtkAdjustment *aspect_ratio_data;
/* Brush preview */
GtkWidget *brush_preview;
GimpBrushGenerated *brush;
gint scale;
};
BrushEditGeneratedWindow * brush_edit_generated_new (void);
void brush_edit_generated_set_brush (BrushEditGeneratedWindow *begw,
GimpBrush *brush);
void brush_edit_generated_free (BrushEditGeneratedWindow *begw);
#endif /* __BRUSH_EDIT_H__ */

View File

@ -87,16 +87,18 @@ static void brush_select_close_callback (GtkWidget *widget,
static void brush_select_edit_brush (GimpData *data);
/* The main brush selection dialog */
BrushSelect *brush_select_dialog = NULL;
/* List of active dialogs */
/* list of active dialogs */
GSList *brush_active_dialogs = NULL;
/* the main brush selection dialog */
BrushSelect *brush_select_dialog = NULL;
/* Brush editor dialog */
static BrushEditGeneratedWindow *brush_edit_generated_dialog;
/* public functions */
void
brush_dialog_create (void)
{
@ -697,16 +699,9 @@ brush_select_edit_brush (GimpData *data)
if (! brush_edit_generated_dialog)
{
brush_edit_generated_dialog = brush_edit_generated_new ();
}
brush_edit_generated_set_brush (brush_edit_generated_dialog, brush);
}
else
{
if (! GTK_WIDGET_VISIBLE (brush_edit_generated_dialog->shell))
gtk_widget_show (brush_edit_generated_dialog->shell);
else
gdk_window_raise (brush_edit_generated_dialog->shell->window);
}
brush_edit_generated_set_brush (brush_edit_generated_dialog, brush);
}
else
{

View File

@ -40,6 +40,7 @@ enum
{
ADD,
REMOVE,
REORDER,
HAVE,
FOREACH,
GET_CHILD_BY_NAME,
@ -130,6 +131,17 @@ gimp_container_class_init (GimpContainerClass* klass)
GTK_TYPE_NONE, 1,
GIMP_TYPE_OBJECT);
container_signals[REORDER] =
gtk_signal_new ("reorder",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (GimpContainerClass,
reorder),
gimp_marshal_NONE__OBJECT_INT,
GTK_TYPE_NONE, 2,
GIMP_TYPE_OBJECT,
GTK_TYPE_INT);
container_signals[HAVE] =
gtk_signal_new ("have",
GTK_RUN_LAST,
@ -205,6 +217,7 @@ gimp_container_class_init (GimpContainerClass* klass)
klass->add = NULL;
klass->remove = NULL;
klass->reorder = NULL;
klass->have = NULL;
klass->foreach = NULL;
klass->get_child_by_name = NULL;
@ -380,6 +393,34 @@ gimp_container_remove (GimpContainer *container,
return TRUE;
}
gboolean
gimp_container_reorder (GimpContainer *container,
GimpObject *object,
gint new_index)
{
g_return_val_if_fail (container, FALSE);
g_return_val_if_fail (GIMP_IS_CONTAINER (container), FALSE);
g_return_val_if_fail (object != NULL, FALSE);
g_return_val_if_fail (GTK_CHECK_TYPE (object, container->children_type),
FALSE);
g_return_val_if_fail (new_index >= -1 &&
new_index < container->num_children, FALSE);
if (! gimp_container_have (container, object))
{
g_warning ("%s(): container does not contains object %p",
G_GNUC_FUNCTION, object);
return FALSE;
}
gtk_signal_emit (GTK_OBJECT (container), container_signals[REORDER],
object, new_index);
return TRUE;
}
gboolean
gimp_container_have (GimpContainer *container,
GimpObject *object)

View File

@ -61,6 +61,9 @@ struct _GimpContainerClass
GimpObject *object);
void (* remove) (GimpContainer *container,
GimpObject *object);
void (* reorder) (GimpContainer *container,
GimpObject *object,
gint new_index);
gboolean (* have) (GimpContainer *container,
GimpObject *object);
void (* foreach) (GimpContainer *container,
@ -87,6 +90,9 @@ gboolean gimp_container_add (GimpContainer *container,
GimpObject *object);
gboolean gimp_container_remove (GimpContainer *container,
GimpObject *object);
gboolean gimp_container_reorder (GimpContainer *container,
GimpObject *object,
gint new_index);
gboolean gimp_container_have (GimpContainer *container,
GimpObject *object);

View File

@ -165,13 +165,9 @@ gimp_data_factory_data_init (GimpDataFactory *factory,
void
gimp_data_factory_data_save (GimpDataFactory *factory)
{
g_return_if_fail (factory != NULL);
g_return_if_fail (GIMP_IS_DATA_FACTORY (factory));
}
GimpList *gimp_list;
GList *list;
void
gimp_data_factory_data_free (GimpDataFactory *factory)
{
g_return_if_fail (factory != NULL);
g_return_if_fail (GIMP_IS_DATA_FACTORY (factory));
@ -181,8 +177,52 @@ gimp_data_factory_data_free (GimpDataFactory *factory)
if (! (factory->data_path && *factory->data_path))
return;
gimp_data_list_save_and_clear (GIMP_DATA_LIST (factory->container),
*factory->data_path);
gimp_list = GIMP_LIST (factory->container);
gimp_container_freeze (factory->container);
for (list = gimp_list->list; list; list = g_list_next (list))
{
GimpData *data;
data = GIMP_DATA (list->data);
if (! data->filename)
gimp_data_create_filename (data,
GIMP_OBJECT (data)->name,
*factory->data_path);
if (data->dirty)
gimp_data_save (data);
}
gimp_container_thaw (factory->container);
}
void
gimp_data_factory_data_free (GimpDataFactory *factory)
{
GimpList *list;
g_return_if_fail (factory != NULL);
g_return_if_fail (GIMP_IS_DATA_FACTORY (factory));
if (gimp_container_num_children (factory->container) == 0)
return;
list = GIMP_LIST (factory->container);
gimp_container_freeze (factory->container);
gimp_data_factory_data_save (factory);
while (list->list)
{
gimp_container_remove (factory->container,
GIMP_OBJECT (list->list->data));
}
gimp_container_thaw (factory->container);
}
GimpData *
@ -207,20 +247,6 @@ gimp_data_factory_data_new (GimpDataFactory *factory,
return NULL;
}
GimpData *
gimp_data_factory_data_duplicate (GimpDataFactory *factory,
GimpData *data,
const gchar *name)
{
g_return_val_if_fail (factory != NULL, NULL);
g_return_val_if_fail (GIMP_IS_DATA_FACTORY (factory), NULL);
g_return_val_if_fail (data != NULL, NULL);
g_return_val_if_fail (GIMP_IS_DATA (data), NULL);
g_return_val_if_fail (name != NULL, NULL);
return NULL;
}
GimpData *
gimp_data_factory_data_get_standard (GimpDataFactory *factory)
{

View File

@ -28,7 +28,6 @@
#include "apptypes.h"
#include "appenv.h"
#include "datafiles.h"
#include "gimpdata.h"
#include "gimpdatalist.h"
@ -44,7 +43,7 @@ static void gimp_data_list_remove (GimpContainer *container,
static void gimp_data_list_uniquefy_data_name (GimpDataList *data_list,
GimpObject *object);
static void gimp_data_list_object_renamed_callabck (GimpObject *object,
static void gimp_data_list_object_renamed_callback (GimpObject *object,
GimpDataList *data_list);
static gint gimp_data_list_data_compare_func (gconstpointer first,
gconstpointer second);
@ -110,7 +109,7 @@ gimp_data_list_add (GimpContainer *container,
gimp_data_list_data_compare_func);
gtk_signal_connect (GTK_OBJECT (object), "name_changed",
GTK_SIGNAL_FUNC (gimp_data_list_object_renamed_callabck),
GTK_SIGNAL_FUNC (gimp_data_list_object_renamed_callback),
container);
}
@ -123,7 +122,7 @@ gimp_data_list_remove (GimpContainer *container,
list = GIMP_LIST (container);
gtk_signal_disconnect_by_func (GTK_OBJECT (object),
gimp_data_list_object_renamed_callabck,
gimp_data_list_object_renamed_callback,
container);
list->list = g_list_remove (list->list, object);
@ -145,157 +144,6 @@ gimp_data_list_new (GtkType children_type)
return list;
}
typedef struct _GimpDataListLoaderData GimpDataListLoaderData;
struct _GimpDataListLoaderData
{
GimpDataList *data_list;
GSList *loader_funcs;
GSList *extensions;
};
void
gimp_data_list_load_callback (const gchar *filename,
gpointer callback_data)
{
GimpDataListLoaderData *loader_data;
GSList *func_list;
GSList *ext_list;
GimpDataObjectLoaderFunc loader_func;
const gchar *extension;
loader_data = (GimpDataListLoaderData *) callback_data;
for (func_list = loader_data->loader_funcs, ext_list = loader_data->extensions;
func_list && ext_list;
func_list = func_list->next, ext_list = ext_list->next)
{
loader_func = (GimpDataObjectLoaderFunc) func_list->data;
extension = (const gchar *) ext_list->data;
if (extension)
{
if (datafiles_check_extension (filename, extension))
{
goto insert;
}
}
else
{
g_warning ("%s(): trying legacy loader on file with unknown "
"extension: %s",
G_GNUC_FUNCTION, filename);
goto insert;
}
}
return;
insert:
{
GimpData *data;
data = (GimpData *) (* loader_func) (filename);
if (! data)
g_message (_("Warning: Failed to load data from\n\"%s\""), filename);
else
gimp_container_add (GIMP_CONTAINER (loader_data->data_list),
GIMP_OBJECT (data));
}
}
void
gimp_data_list_load (GimpDataList *data_list,
const gchar *data_path,
GimpDataObjectLoaderFunc loader_func,
const gchar *extension,
...)
{
GimpDataListLoaderData *loader_data;
va_list args;
g_return_if_fail (data_list != NULL);
g_return_if_fail (GIMP_IS_DATA_LIST (data_list));
g_return_if_fail (data_path != NULL);
g_return_if_fail (loader_func != NULL);
loader_data = g_new0 (GimpDataListLoaderData, 1);
loader_data->data_list = data_list;
loader_data->loader_funcs = g_slist_append (loader_data->loader_funcs,
loader_func);
loader_data->extensions = g_slist_append (loader_data->extensions,
(gpointer) extension);
va_start (args, extension);
while (extension)
{
loader_func = va_arg (args, GimpDataObjectLoaderFunc);
if (loader_func)
{
extension = va_arg (args, const gchar *);
loader_data->loader_funcs = g_slist_append (loader_data->loader_funcs,
loader_func);
loader_data->extensions = g_slist_append (loader_data->extensions,
(gpointer) extension);
}
else
{
extension = NULL;
}
}
va_end (args);
gimp_container_freeze (GIMP_CONTAINER (data_list));
datafiles_read_directories (data_path, 0,
gimp_data_list_load_callback, loader_data);
gimp_container_thaw (GIMP_CONTAINER (data_list));
g_slist_free (loader_data->loader_funcs);
g_slist_free (loader_data->extensions);
g_free (loader_data);
}
void
gimp_data_list_save_and_clear (GimpDataList *data_list,
const gchar *data_path)
{
GimpList *list;
g_return_if_fail (data_list != NULL);
g_return_if_fail (GIMP_IS_DATA_LIST (data_list));
list = GIMP_LIST (data_list);
gimp_container_freeze (GIMP_CONTAINER (data_list));
while (list->list)
{
GimpData *data;
data = GIMP_DATA (list->list->data);
if (! data->filename)
gimp_data_create_filename (data,
GIMP_OBJECT (data)->name,
data_path);
if (data->dirty)
gimp_data_save (data);
gimp_container_remove (GIMP_CONTAINER (data_list), GIMP_OBJECT (data));
}
gimp_container_thaw (GIMP_CONTAINER (data_list));
}
static void
gimp_data_list_uniquefy_data_name (GimpDataList *data_list,
GimpObject *object)
@ -307,12 +155,15 @@ gimp_data_list_uniquefy_data_name (GimpDataList *data_list,
gint unique_ext = 0;
gchar *new_name = NULL;
gchar *ext;
gboolean have;
g_return_if_fail (GIMP_IS_DATA_LIST (data_list));
g_return_if_fail (GIMP_IS_OBJECT (object));
base_list = GIMP_LIST (data_list)->list;
have = gimp_container_have (GIMP_CONTAINER (data_list), object);
for (list = base_list; list; list = g_list_next (list))
{
object2 = GIMP_OBJECT (list->data);
@ -321,7 +172,7 @@ gimp_data_list_uniquefy_data_name (GimpDataList *data_list,
strcmp (gimp_object_get_name (GIMP_OBJECT (object)),
gimp_object_get_name (GIMP_OBJECT (object2))) == 0)
{
ext = strrchr (GIMP_OBJECT (object)->name, '#');
ext = strrchr (object->name, '#');
if (ext)
{
@ -354,9 +205,7 @@ gimp_data_list_uniquefy_data_name (GimpDataList *data_list,
g_free (new_name);
new_name = g_strdup_printf ("%s#%d",
GIMP_OBJECT (object)->name,
unique_ext);
new_name = g_strdup_printf ("%s#%d", object->name, unique_ext);
for (list2 = base_list; list2; list2 = g_list_next (list2))
{
@ -365,32 +214,62 @@ gimp_data_list_uniquefy_data_name (GimpDataList *data_list,
if (object == object2)
continue;
if (! strcmp (GIMP_OBJECT (object2)->name, new_name))
{
break;
}
if (! strcmp (object2->name, new_name))
break;
}
}
while (list2);
gimp_object_set_name (GIMP_OBJECT (object), new_name);
if (have)
gtk_signal_handler_block_by_func
(GTK_OBJECT (object),
gimp_data_list_object_renamed_callback,
data_list);
gimp_object_set_name (object, new_name);
if (have)
gtk_signal_handler_unblock_by_func
(GTK_OBJECT (object),
gimp_data_list_object_renamed_callback,
data_list);
g_free (new_name);
if (gimp_container_have (GIMP_CONTAINER (data_list), object))
{
gtk_object_ref (GTK_OBJECT (object));
gimp_container_remove (GIMP_CONTAINER (data_list), object);
gimp_container_add (GIMP_CONTAINER (data_list), object);
gtk_object_unref (GTK_OBJECT (object));
}
break;
}
}
if (have)
{
gint old_index;
gint new_index = 0;
old_index = g_list_index (base_list, object);
for (list2 = base_list; list2; list2 = g_list_next (list2))
{
object2 = GIMP_OBJECT (list2->data);
if (object == object2)
continue;
if (strcmp (object->name, object2->name) > 0)
new_index++;
else
break;
}
if (new_index != old_index)
{
gimp_container_reorder (GIMP_CONTAINER (data_list),
object, new_index);
}
}
}
static void
gimp_data_list_object_renamed_callabck (GimpObject *object,
gimp_data_list_object_renamed_callback (GimpObject *object,
GimpDataList *data_list)
{
gimp_data_list_uniquefy_data_name (data_list, object);

View File

@ -44,16 +44,7 @@ struct _GimpDataListClass
GtkType gimp_data_list_get_type (void);
GimpDataList * gimp_data_list_new (GtkType children_type);
void gimp_data_list_load (GimpDataList *data_list,
const gchar *data_path,
GimpDataObjectLoaderFunc loader_func,
const gchar *extension,
...);
void gimp_data_list_save_and_clear (GimpDataList *data_list,
const gchar *data_path);
GimpDataList * gimp_data_list_new (GtkType children_type);
#endif /* __GIMP_DATA_LIST_H__ */

View File

@ -33,6 +33,9 @@ static void gimp_list_add (GimpContainer *container,
GimpObject *object);
static void gimp_list_remove (GimpContainer *container,
GimpObject *object);
static void gimp_list_reorder (GimpContainer *container,
GimpObject *object,
gint new_index);
static gboolean gimp_list_have (GimpContainer *container,
GimpObject *object);
static void gimp_list_foreach (GimpContainer *container,
@ -89,6 +92,7 @@ gimp_list_class_init (GimpListClass *klass)
container_class->add = gimp_list_add;
container_class->remove = gimp_list_remove;
container_class->reorder = gimp_list_reorder;
container_class->have = gimp_list_have;
container_class->foreach = gimp_list_foreach;
container_class->get_child_by_name = gimp_list_get_child_by_name;
@ -141,6 +145,23 @@ gimp_list_remove (GimpContainer *container,
list->list = g_list_remove (list->list, object);
}
static void
gimp_list_reorder (GimpContainer *container,
GimpObject *object,
gint new_index)
{
GimpList *list;
list = GIMP_LIST (container);
list->list = g_list_remove (list->list, object);
if (new_index == -1 || new_index == container->num_children - 1)
list->list = g_list_append (list->list, object);
else
list->list = g_list_insert (list->list, object, new_index);
}
static gboolean
gimp_list_have (GimpContainer *container,
GimpObject *object)

View File

@ -85,6 +85,24 @@ gimp_marshal_NONE__INT_POINTER_POINTER (GtkObject *object,
}
typedef void (* GimpSignal_NONE__OBJECT_INT) (GtkObject *object,
GtkObject *arg1,
gint arg2,
gpointer user_data);
void
gimp_marshal_NONE__OBJECT_INT (GtkObject *object,
GtkSignalFunc func,
gpointer func_data,
GtkArg *args)
{
(* (GimpSignal_NONE__OBJECT_INT) func) (object,
GTK_VALUE_OBJECT (args[0]),
GTK_VALUE_INT (args[1]),
func_data);
}
typedef void (* GimpSignal_NONE__DOUBLE) (GtkObject *object,
gdouble arg1,
gpointer user_data);

View File

@ -35,6 +35,11 @@ void gimp_marshal_NONE__INT_POINTER_POINTER (GtkObject *object,
gpointer func_data,
GtkArg *args);
void gimp_marshal_NONE__OBJECT_INT (GtkObject *object,
GtkSignalFunc func,
gpointer func_data,
GtkArg *args);
void gimp_marshal_NONE__DOUBLE (GtkObject *object,
GtkSignalFunc func,
gpointer func_data,

View File

@ -40,6 +40,7 @@ enum
{
ADD,
REMOVE,
REORDER,
HAVE,
FOREACH,
GET_CHILD_BY_NAME,
@ -130,6 +131,17 @@ gimp_container_class_init (GimpContainerClass* klass)
GTK_TYPE_NONE, 1,
GIMP_TYPE_OBJECT);
container_signals[REORDER] =
gtk_signal_new ("reorder",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (GimpContainerClass,
reorder),
gimp_marshal_NONE__OBJECT_INT,
GTK_TYPE_NONE, 2,
GIMP_TYPE_OBJECT,
GTK_TYPE_INT);
container_signals[HAVE] =
gtk_signal_new ("have",
GTK_RUN_LAST,
@ -205,6 +217,7 @@ gimp_container_class_init (GimpContainerClass* klass)
klass->add = NULL;
klass->remove = NULL;
klass->reorder = NULL;
klass->have = NULL;
klass->foreach = NULL;
klass->get_child_by_name = NULL;
@ -380,6 +393,34 @@ gimp_container_remove (GimpContainer *container,
return TRUE;
}
gboolean
gimp_container_reorder (GimpContainer *container,
GimpObject *object,
gint new_index)
{
g_return_val_if_fail (container, FALSE);
g_return_val_if_fail (GIMP_IS_CONTAINER (container), FALSE);
g_return_val_if_fail (object != NULL, FALSE);
g_return_val_if_fail (GTK_CHECK_TYPE (object, container->children_type),
FALSE);
g_return_val_if_fail (new_index >= -1 &&
new_index < container->num_children, FALSE);
if (! gimp_container_have (container, object))
{
g_warning ("%s(): container does not contains object %p",
G_GNUC_FUNCTION, object);
return FALSE;
}
gtk_signal_emit (GTK_OBJECT (container), container_signals[REORDER],
object, new_index);
return TRUE;
}
gboolean
gimp_container_have (GimpContainer *container,
GimpObject *object)

View File

@ -61,6 +61,9 @@ struct _GimpContainerClass
GimpObject *object);
void (* remove) (GimpContainer *container,
GimpObject *object);
void (* reorder) (GimpContainer *container,
GimpObject *object,
gint new_index);
gboolean (* have) (GimpContainer *container,
GimpObject *object);
void (* foreach) (GimpContainer *container,
@ -87,6 +90,9 @@ gboolean gimp_container_add (GimpContainer *container,
GimpObject *object);
gboolean gimp_container_remove (GimpContainer *container,
GimpObject *object);
gboolean gimp_container_reorder (GimpContainer *container,
GimpObject *object,
gint new_index);
gboolean gimp_container_have (GimpContainer *container,
GimpObject *object);

View File

@ -43,6 +43,10 @@ static gpointer gimp_container_grid_view_insert_item (GimpContainerView *v
static void gimp_container_grid_view_remove_item (GimpContainerView *view,
GimpViewable *viewable,
gpointer insert_data);
static void gimp_container_grid_view_reorder_item (GimpContainerView *view,
GimpViewable *viewable,
gint new_index,
gpointer insert_data);
static void gimp_container_grid_view_select_item (GimpContainerView *view,
GimpViewable *viewable,
gpointer insert_data);
@ -99,6 +103,7 @@ gimp_container_grid_view_class_init (GimpContainerGridViewClass *klass)
container_view_class->insert_item = gimp_container_grid_view_insert_item;
container_view_class->remove_item = gimp_container_grid_view_remove_item;
container_view_class->reorder_item = gimp_container_grid_view_reorder_item;
container_view_class->select_item = gimp_container_grid_view_select_item;
container_view_class->clear_items = gimp_container_grid_view_clear_items;
container_view_class->set_preview_size = gimp_container_grid_view_set_preview_size;
@ -258,6 +263,22 @@ gimp_container_grid_view_remove_item (GimpContainerView *view,
}
}
static void
gimp_container_grid_view_reorder_item (GimpContainerView *view,
GimpViewable *viewable,
gint new_index,
gpointer insert_data)
{
GimpContainerGridView *grid_view;
GtkWidget *preview;
grid_view = GIMP_CONTAINER_GRID_VIEW (view);
preview = GTK_WIDGET (insert_data);
gtk_wrap_box_reorder_child (GTK_WRAP_BOX (grid_view->wrap_box),
preview, new_index);
}
static void
gimp_container_grid_view_select_item (GimpContainerView *view,
GimpViewable *viewable,

View File

@ -42,6 +42,10 @@ static gpointer gimp_container_list_view_insert_item (GimpContainerView *v
static void gimp_container_list_view_remove_item (GimpContainerView *view,
GimpViewable *viewable,
gpointer insert_data);
static void gimp_container_list_view_reorder_item (GimpContainerView *view,
GimpViewable *viewable,
gint new_index,
gpointer insert_data);
static void gimp_container_list_view_select_item (GimpContainerView *view,
GimpViewable *viewable,
gpointer insert_data);
@ -99,6 +103,7 @@ gimp_container_list_view_class_init (GimpContainerListViewClass *klass)
container_view_class->insert_item = gimp_container_list_view_insert_item;
container_view_class->remove_item = gimp_container_list_view_remove_item;
container_view_class->reorder_item = gimp_container_list_view_reorder_item;
container_view_class->select_item = gimp_container_list_view_select_item;
container_view_class->clear_items = gimp_container_list_view_clear_items;
container_view_class->set_preview_size = gimp_container_list_view_set_preview_size;
@ -268,6 +273,47 @@ gimp_container_list_view_remove_item (GimpContainerView *view,
}
}
static void
gimp_container_list_view_reorder_item (GimpContainerView *view,
GimpViewable *viewable,
gint new_index,
gpointer insert_data)
{
GimpContainerListView *list_view;
GtkWidget *list_item;
gboolean selected;
list_view = GIMP_CONTAINER_LIST_VIEW (view);
if (insert_data)
list_item = GTK_WIDGET (insert_data);
else
list_item = NULL;
if (list_item)
{
GList *list;
list = g_list_prepend (NULL, list_item);
selected = GTK_WIDGET_STATE (list_item) == GTK_STATE_SELECTED;
gtk_object_ref (GTK_OBJECT (list_item));
gtk_list_remove_items (GTK_LIST (list_view->gtk_list), list);
if (new_index == -1 || new_index == view->container->num_children - 1)
gtk_list_append_items (GTK_LIST (list_view->gtk_list), list);
else
gtk_list_insert_items (GTK_LIST (list_view->gtk_list), list, new_index);
if (selected)
gtk_list_select_child (GTK_LIST (list_view->gtk_list), list_item);
gtk_object_unref (GTK_OBJECT (list_item));
}
}
static void
gimp_container_list_view_select_item (GimpContainerView *view,
GimpViewable *viewable,

View File

@ -33,6 +33,7 @@ enum
{
INSERT_ITEM,
REMOVE_ITEM,
REORDER_ITEM,
SELECT_ITEM,
CLEAR_ITEMS,
SET_PREVIEW_SIZE,
@ -55,6 +56,10 @@ static void gimp_container_view_add (GimpContainerView *view,
static void gimp_container_view_remove (GimpContainerView *view,
GimpViewable *viewable,
GimpContainer *container);
static void gimp_container_view_reorder (GimpContainerView *view,
GimpViewable *viewable,
gint new_index,
GimpContainer *container);
static void gimp_container_view_context_changed (GimpContext *context,
GimpViewable *viewable,
@ -122,6 +127,18 @@ gimp_container_view_class_init (GimpContainerViewClass *klass)
GIMP_TYPE_OBJECT,
GTK_TYPE_POINTER);
view_signals[REORDER_ITEM] =
gtk_signal_new ("reorder_item",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (GimpContainerViewClass,
reorder_item),
gtk_marshal_NONE__POINTER_INT_POINTER,
GTK_TYPE_NONE, 3,
GIMP_TYPE_OBJECT,
GTK_TYPE_INT,
GTK_TYPE_POINTER);
view_signals[SELECT_ITEM] =
gtk_signal_new ("select_item",
GTK_RUN_FIRST,
@ -157,6 +174,7 @@ gimp_container_view_class_init (GimpContainerViewClass *klass)
klass->insert_item = NULL;
klass->remove_item = NULL;
klass->reorder_item = NULL;
klass->select_item = NULL;
klass->clear_items = gimp_container_view_real_clear_items;
klass->set_preview_size = NULL;
@ -165,12 +183,12 @@ gimp_container_view_class_init (GimpContainerViewClass *klass)
static void
gimp_container_view_init (GimpContainerView *view)
{
view->container = NULL;
view->context = NULL;
view->container = NULL;
view->context = NULL;
view->hash_table = g_hash_table_new (g_direct_hash, g_direct_equal);
view->hash_table = g_hash_table_new (g_direct_hash, g_direct_equal);
view->preview_size = 0;
view->preview_size = 0;
}
static void
@ -213,6 +231,9 @@ gimp_container_view_set_container (GimpContainerView *view,
gtk_signal_disconnect_by_func (GTK_OBJECT (view->container),
gimp_container_view_remove,
view);
gtk_signal_disconnect_by_func (GTK_OBJECT (view->container),
gimp_container_view_reorder,
view);
g_hash_table_destroy (view->hash_table);
@ -242,6 +263,10 @@ gimp_container_view_set_container (GimpContainerView *view,
GTK_SIGNAL_FUNC (gimp_container_view_remove),
GTK_OBJECT (view));
gtk_signal_connect_object (GTK_OBJECT (view->container), "reorder",
GTK_SIGNAL_FUNC (gimp_container_view_reorder),
GTK_OBJECT (view));
if (view->context)
{
GimpObject *object;
@ -411,6 +436,23 @@ gimp_container_view_remove (GimpContainerView *view,
}
}
static void
gimp_container_view_reorder (GimpContainerView *view,
GimpViewable *viewable,
gint new_index,
GimpContainer *container)
{
gpointer insert_data;
insert_data = g_hash_table_lookup (view->hash_table, viewable);
if (insert_data)
{
gtk_signal_emit (GTK_OBJECT (view), view_signals[REORDER_ITEM],
viewable, new_index, insert_data);
}
}
static void
gimp_container_view_context_changed (GimpContext *context,
GimpViewable *viewable,

View File

@ -54,6 +54,10 @@ struct _GimpContainerViewClass
void (* remove_item) (GimpContainerView *view,
GimpViewable *object,
gpointer insert_data);
void (* reorder_item) (GimpContainerView *view,
GimpViewable *object,
gint new_index,
gpointer insert_data);
void (* select_item) (GimpContainerView *view,
GimpViewable *object,
gpointer insert_data);

View File

@ -165,13 +165,9 @@ gimp_data_factory_data_init (GimpDataFactory *factory,
void
gimp_data_factory_data_save (GimpDataFactory *factory)
{
g_return_if_fail (factory != NULL);
g_return_if_fail (GIMP_IS_DATA_FACTORY (factory));
}
GimpList *gimp_list;
GList *list;
void
gimp_data_factory_data_free (GimpDataFactory *factory)
{
g_return_if_fail (factory != NULL);
g_return_if_fail (GIMP_IS_DATA_FACTORY (factory));
@ -181,8 +177,52 @@ gimp_data_factory_data_free (GimpDataFactory *factory)
if (! (factory->data_path && *factory->data_path))
return;
gimp_data_list_save_and_clear (GIMP_DATA_LIST (factory->container),
*factory->data_path);
gimp_list = GIMP_LIST (factory->container);
gimp_container_freeze (factory->container);
for (list = gimp_list->list; list; list = g_list_next (list))
{
GimpData *data;
data = GIMP_DATA (list->data);
if (! data->filename)
gimp_data_create_filename (data,
GIMP_OBJECT (data)->name,
*factory->data_path);
if (data->dirty)
gimp_data_save (data);
}
gimp_container_thaw (factory->container);
}
void
gimp_data_factory_data_free (GimpDataFactory *factory)
{
GimpList *list;
g_return_if_fail (factory != NULL);
g_return_if_fail (GIMP_IS_DATA_FACTORY (factory));
if (gimp_container_num_children (factory->container) == 0)
return;
list = GIMP_LIST (factory->container);
gimp_container_freeze (factory->container);
gimp_data_factory_data_save (factory);
while (list->list)
{
gimp_container_remove (factory->container,
GIMP_OBJECT (list->list->data));
}
gimp_container_thaw (factory->container);
}
GimpData *
@ -207,20 +247,6 @@ gimp_data_factory_data_new (GimpDataFactory *factory,
return NULL;
}
GimpData *
gimp_data_factory_data_duplicate (GimpDataFactory *factory,
GimpData *data,
const gchar *name)
{
g_return_val_if_fail (factory != NULL, NULL);
g_return_val_if_fail (GIMP_IS_DATA_FACTORY (factory), NULL);
g_return_val_if_fail (data != NULL, NULL);
g_return_val_if_fail (GIMP_IS_DATA (data), NULL);
g_return_val_if_fail (name != NULL, NULL);
return NULL;
}
GimpData *
gimp_data_factory_data_get_standard (GimpDataFactory *factory)
{

View File

@ -340,6 +340,8 @@ gimp_data_factory_view_duplicate_clicked (GtkWidget *widget,
gimp_context_set_by_type (view->view->context,
view->factory->container->children_type,
GIMP_OBJECT (new_data));
gimp_data_factory_view_edit_clicked (NULL, view);
}
}
}
@ -363,6 +365,38 @@ gimp_data_factory_view_edit_clicked (GtkWidget *widget,
}
}
typedef struct _GimpDataDeleteData GimpDataDeleteData;
struct _GimpDataDeleteData
{
GimpDataFactory *factory;
GimpData *data;
};
static void
gimp_data_factory_view_delete_callback (GtkWidget *widget,
gboolean delete,
gpointer data)
{
GimpDataDeleteData *delete_data;
delete_data = (GimpDataDeleteData *) data;
if (! delete)
return;
if (gimp_container_have (delete_data->factory->container,
GIMP_OBJECT (delete_data->data)))
{
if (delete_data->data->filename)
gimp_data_delete_from_disk (delete_data->data);
gimp_container_remove (delete_data->factory->container,
GIMP_OBJECT (delete_data->data));
}
}
static void
gimp_data_factory_view_delete_clicked (GtkWidget *widget,
GimpDataFactoryView *view)
@ -376,10 +410,37 @@ gimp_data_factory_view_delete_clicked (GtkWidget *widget,
if (data && gimp_container_have (view->factory->container,
GIMP_OBJECT (data)))
{
if (data->filename)
gimp_data_delete_from_disk (data);
GimpDataDeleteData *delete_data;
GtkWidget *dialog;
gchar *str;
gimp_container_remove (view->factory->container, GIMP_OBJECT (data));
delete_data = g_new0 (GimpDataDeleteData, 1);
delete_data->factory = view->factory;
delete_data->data = data;
str = g_strdup_printf (_("Are you sure you want to delete\n"
"\"%s\" from the list and from disk?"),
GIMP_OBJECT (data)->name);
dialog =
gimp_query_boolean_box (_("Delete Data Object"),
gimp_standard_help_func, NULL,
FALSE,
str,
_("Delete"), _("Cancel"),
GTK_OBJECT (data),
"destroy",
gimp_data_factory_view_delete_callback,
delete_data);
gtk_signal_connect_object (GTK_OBJECT (dialog), "destroy",
GTK_SIGNAL_FUNC (g_free),
(GtkObject *) delete_data);
g_free (str);
gtk_widget_show (dialog);
}
}

View File

@ -28,7 +28,6 @@
#include "apptypes.h"
#include "appenv.h"
#include "datafiles.h"
#include "gimpdata.h"
#include "gimpdatalist.h"
@ -44,7 +43,7 @@ static void gimp_data_list_remove (GimpContainer *container,
static void gimp_data_list_uniquefy_data_name (GimpDataList *data_list,
GimpObject *object);
static void gimp_data_list_object_renamed_callabck (GimpObject *object,
static void gimp_data_list_object_renamed_callback (GimpObject *object,
GimpDataList *data_list);
static gint gimp_data_list_data_compare_func (gconstpointer first,
gconstpointer second);
@ -110,7 +109,7 @@ gimp_data_list_add (GimpContainer *container,
gimp_data_list_data_compare_func);
gtk_signal_connect (GTK_OBJECT (object), "name_changed",
GTK_SIGNAL_FUNC (gimp_data_list_object_renamed_callabck),
GTK_SIGNAL_FUNC (gimp_data_list_object_renamed_callback),
container);
}
@ -123,7 +122,7 @@ gimp_data_list_remove (GimpContainer *container,
list = GIMP_LIST (container);
gtk_signal_disconnect_by_func (GTK_OBJECT (object),
gimp_data_list_object_renamed_callabck,
gimp_data_list_object_renamed_callback,
container);
list->list = g_list_remove (list->list, object);
@ -145,157 +144,6 @@ gimp_data_list_new (GtkType children_type)
return list;
}
typedef struct _GimpDataListLoaderData GimpDataListLoaderData;
struct _GimpDataListLoaderData
{
GimpDataList *data_list;
GSList *loader_funcs;
GSList *extensions;
};
void
gimp_data_list_load_callback (const gchar *filename,
gpointer callback_data)
{
GimpDataListLoaderData *loader_data;
GSList *func_list;
GSList *ext_list;
GimpDataObjectLoaderFunc loader_func;
const gchar *extension;
loader_data = (GimpDataListLoaderData *) callback_data;
for (func_list = loader_data->loader_funcs, ext_list = loader_data->extensions;
func_list && ext_list;
func_list = func_list->next, ext_list = ext_list->next)
{
loader_func = (GimpDataObjectLoaderFunc) func_list->data;
extension = (const gchar *) ext_list->data;
if (extension)
{
if (datafiles_check_extension (filename, extension))
{
goto insert;
}
}
else
{
g_warning ("%s(): trying legacy loader on file with unknown "
"extension: %s",
G_GNUC_FUNCTION, filename);
goto insert;
}
}
return;
insert:
{
GimpData *data;
data = (GimpData *) (* loader_func) (filename);
if (! data)
g_message (_("Warning: Failed to load data from\n\"%s\""), filename);
else
gimp_container_add (GIMP_CONTAINER (loader_data->data_list),
GIMP_OBJECT (data));
}
}
void
gimp_data_list_load (GimpDataList *data_list,
const gchar *data_path,
GimpDataObjectLoaderFunc loader_func,
const gchar *extension,
...)
{
GimpDataListLoaderData *loader_data;
va_list args;
g_return_if_fail (data_list != NULL);
g_return_if_fail (GIMP_IS_DATA_LIST (data_list));
g_return_if_fail (data_path != NULL);
g_return_if_fail (loader_func != NULL);
loader_data = g_new0 (GimpDataListLoaderData, 1);
loader_data->data_list = data_list;
loader_data->loader_funcs = g_slist_append (loader_data->loader_funcs,
loader_func);
loader_data->extensions = g_slist_append (loader_data->extensions,
(gpointer) extension);
va_start (args, extension);
while (extension)
{
loader_func = va_arg (args, GimpDataObjectLoaderFunc);
if (loader_func)
{
extension = va_arg (args, const gchar *);
loader_data->loader_funcs = g_slist_append (loader_data->loader_funcs,
loader_func);
loader_data->extensions = g_slist_append (loader_data->extensions,
(gpointer) extension);
}
else
{
extension = NULL;
}
}
va_end (args);
gimp_container_freeze (GIMP_CONTAINER (data_list));
datafiles_read_directories (data_path, 0,
gimp_data_list_load_callback, loader_data);
gimp_container_thaw (GIMP_CONTAINER (data_list));
g_slist_free (loader_data->loader_funcs);
g_slist_free (loader_data->extensions);
g_free (loader_data);
}
void
gimp_data_list_save_and_clear (GimpDataList *data_list,
const gchar *data_path)
{
GimpList *list;
g_return_if_fail (data_list != NULL);
g_return_if_fail (GIMP_IS_DATA_LIST (data_list));
list = GIMP_LIST (data_list);
gimp_container_freeze (GIMP_CONTAINER (data_list));
while (list->list)
{
GimpData *data;
data = GIMP_DATA (list->list->data);
if (! data->filename)
gimp_data_create_filename (data,
GIMP_OBJECT (data)->name,
data_path);
if (data->dirty)
gimp_data_save (data);
gimp_container_remove (GIMP_CONTAINER (data_list), GIMP_OBJECT (data));
}
gimp_container_thaw (GIMP_CONTAINER (data_list));
}
static void
gimp_data_list_uniquefy_data_name (GimpDataList *data_list,
GimpObject *object)
@ -307,12 +155,15 @@ gimp_data_list_uniquefy_data_name (GimpDataList *data_list,
gint unique_ext = 0;
gchar *new_name = NULL;
gchar *ext;
gboolean have;
g_return_if_fail (GIMP_IS_DATA_LIST (data_list));
g_return_if_fail (GIMP_IS_OBJECT (object));
base_list = GIMP_LIST (data_list)->list;
have = gimp_container_have (GIMP_CONTAINER (data_list), object);
for (list = base_list; list; list = g_list_next (list))
{
object2 = GIMP_OBJECT (list->data);
@ -321,7 +172,7 @@ gimp_data_list_uniquefy_data_name (GimpDataList *data_list,
strcmp (gimp_object_get_name (GIMP_OBJECT (object)),
gimp_object_get_name (GIMP_OBJECT (object2))) == 0)
{
ext = strrchr (GIMP_OBJECT (object)->name, '#');
ext = strrchr (object->name, '#');
if (ext)
{
@ -354,9 +205,7 @@ gimp_data_list_uniquefy_data_name (GimpDataList *data_list,
g_free (new_name);
new_name = g_strdup_printf ("%s#%d",
GIMP_OBJECT (object)->name,
unique_ext);
new_name = g_strdup_printf ("%s#%d", object->name, unique_ext);
for (list2 = base_list; list2; list2 = g_list_next (list2))
{
@ -365,32 +214,62 @@ gimp_data_list_uniquefy_data_name (GimpDataList *data_list,
if (object == object2)
continue;
if (! strcmp (GIMP_OBJECT (object2)->name, new_name))
{
break;
}
if (! strcmp (object2->name, new_name))
break;
}
}
while (list2);
gimp_object_set_name (GIMP_OBJECT (object), new_name);
if (have)
gtk_signal_handler_block_by_func
(GTK_OBJECT (object),
gimp_data_list_object_renamed_callback,
data_list);
gimp_object_set_name (object, new_name);
if (have)
gtk_signal_handler_unblock_by_func
(GTK_OBJECT (object),
gimp_data_list_object_renamed_callback,
data_list);
g_free (new_name);
if (gimp_container_have (GIMP_CONTAINER (data_list), object))
{
gtk_object_ref (GTK_OBJECT (object));
gimp_container_remove (GIMP_CONTAINER (data_list), object);
gimp_container_add (GIMP_CONTAINER (data_list), object);
gtk_object_unref (GTK_OBJECT (object));
}
break;
}
}
if (have)
{
gint old_index;
gint new_index = 0;
old_index = g_list_index (base_list, object);
for (list2 = base_list; list2; list2 = g_list_next (list2))
{
object2 = GIMP_OBJECT (list2->data);
if (object == object2)
continue;
if (strcmp (object->name, object2->name) > 0)
new_index++;
else
break;
}
if (new_index != old_index)
{
gimp_container_reorder (GIMP_CONTAINER (data_list),
object, new_index);
}
}
}
static void
gimp_data_list_object_renamed_callabck (GimpObject *object,
gimp_data_list_object_renamed_callback (GimpObject *object,
GimpDataList *data_list)
{
gimp_data_list_uniquefy_data_name (data_list, object);

View File

@ -44,16 +44,7 @@ struct _GimpDataListClass
GtkType gimp_data_list_get_type (void);
GimpDataList * gimp_data_list_new (GtkType children_type);
void gimp_data_list_load (GimpDataList *data_list,
const gchar *data_path,
GimpDataObjectLoaderFunc loader_func,
const gchar *extension,
...);
void gimp_data_list_save_and_clear (GimpDataList *data_list,
const gchar *data_path);
GimpDataList * gimp_data_list_new (GtkType children_type);
#endif /* __GIMP_DATA_LIST_H__ */

View File

@ -33,6 +33,9 @@ static void gimp_list_add (GimpContainer *container,
GimpObject *object);
static void gimp_list_remove (GimpContainer *container,
GimpObject *object);
static void gimp_list_reorder (GimpContainer *container,
GimpObject *object,
gint new_index);
static gboolean gimp_list_have (GimpContainer *container,
GimpObject *object);
static void gimp_list_foreach (GimpContainer *container,
@ -89,6 +92,7 @@ gimp_list_class_init (GimpListClass *klass)
container_class->add = gimp_list_add;
container_class->remove = gimp_list_remove;
container_class->reorder = gimp_list_reorder;
container_class->have = gimp_list_have;
container_class->foreach = gimp_list_foreach;
container_class->get_child_by_name = gimp_list_get_child_by_name;
@ -141,6 +145,23 @@ gimp_list_remove (GimpContainer *container,
list->list = g_list_remove (list->list, object);
}
static void
gimp_list_reorder (GimpContainer *container,
GimpObject *object,
gint new_index)
{
GimpList *list;
list = GIMP_LIST (container);
list->list = g_list_remove (list->list, object);
if (new_index == -1 || new_index == container->num_children - 1)
list->list = g_list_append (list->list, object);
else
list->list = g_list_insert (list->list, object, new_index);
}
static gboolean
gimp_list_have (GimpContainer *container,
GimpObject *object)

View File

@ -85,6 +85,24 @@ gimp_marshal_NONE__INT_POINTER_POINTER (GtkObject *object,
}
typedef void (* GimpSignal_NONE__OBJECT_INT) (GtkObject *object,
GtkObject *arg1,
gint arg2,
gpointer user_data);
void
gimp_marshal_NONE__OBJECT_INT (GtkObject *object,
GtkSignalFunc func,
gpointer func_data,
GtkArg *args)
{
(* (GimpSignal_NONE__OBJECT_INT) func) (object,
GTK_VALUE_OBJECT (args[0]),
GTK_VALUE_INT (args[1]),
func_data);
}
typedef void (* GimpSignal_NONE__DOUBLE) (GtkObject *object,
gdouble arg1,
gpointer user_data);

View File

@ -35,6 +35,11 @@ void gimp_marshal_NONE__INT_POINTER_POINTER (GtkObject *object,
gpointer func_data,
GtkArg *args);
void gimp_marshal_NONE__OBJECT_INT (GtkObject *object,
GtkSignalFunc func,
gpointer func_data,
GtkArg *args);
void gimp_marshal_NONE__DOUBLE (GtkObject *object,
GtkSignalFunc func,
gpointer func_data,

File diff suppressed because it is too large Load Diff

View File

@ -23,8 +23,14 @@
#define __GRADIENT_EDITOR_H__
void gradient_editor_set_gradient (GimpGradient *gradient);
void gradient_editor_free (void);
typedef struct _GradientEditor GradientEditor;
GradientEditor * gradient_editor_new (void);
void gradient_editor_set_gradient (GradientEditor *gradient_editor,
GimpGradient *gradient);
void gradient_editor_free (GradientEditor *gradient_editor);
#endif /* __GRADIENT_EDITOR_H__ */

View File

@ -55,14 +55,20 @@ static void gradient_select_gradient_changed (GimpContext *context,
GradientSelect *gsp);
static void gradient_select_close_callback (GtkWidget *widget,
gpointer data);
static void gradient_select_edit_gradient (GimpData *data);
/* list of active dialogs */
GSList *gradient_active_dialogs = NULL;
GSList *gradient_active_dialogs = NULL;
/* the main gradient selection dialog */
GradientSelect *gradient_select_dialog = NULL;
/* gradient editor dialog */
static GradientEditor *gradient_editor_dialog;
/* public functions */
void
gradient_dialog_create (void)
@ -92,8 +98,6 @@ gradient_dialog_free (void)
gradient_select_dialog = NULL;
}
gradient_editor_free ();
}
/* If title == NULL then it is the main gradient select dialog */
@ -168,7 +172,7 @@ gradient_select_new (gchar *title,
/* The Gradient List */
gsp->view = gimp_data_factory_view_new (GIMP_VIEW_TYPE_LIST,
global_gradient_factory,
gradient_editor_set_gradient,
gradient_select_edit_gradient,
gsp->context,
16,
10, 10);
@ -361,3 +365,18 @@ gradient_select_close_callback (GtkWidget *widget,
gradient_select_free (gsp);
}
}
static void
gradient_select_edit_gradient (GimpData *data)
{
GimpGradient *gradient;
gradient = GIMP_GRADIENT (data);
if (! gradient_editor_dialog)
{
gradient_editor_dialog = gradient_editor_new ();
}
gradient_editor_set_gradient (gradient_editor_dialog, gradient);
}

View File

@ -36,16 +36,269 @@
#include "libgimp/gimpintl.h"
static void brush_edit_close_callback (GtkWidget *widget,
gpointer data);
static gint brush_edit_preview_resize (GtkWidget *widget,
GtkAllocation *allocation,
BrushEditGeneratedWindow *begw);
struct _BrushEditGeneratedWindow
{
GtkWidget *shell;
GtkWidget *frame;
GtkWidget *preview;
GtkWidget *scale_label;
GtkWidget *options_box;
GtkWidget *name;
GtkAdjustment *radius_data;
GtkAdjustment *hardness_data;
GtkAdjustment *angle_data;
GtkAdjustment *aspect_ratio_data;
/* Brush preview */
GtkWidget *brush_preview;
GimpBrushGenerated *brush;
gint scale;
};
static void brush_edit_close_callback (GtkWidget *widget,
gpointer data);
static void brush_edit_name_activate (GtkWidget *widget,
BrushEditGeneratedWindow *begw);
static void brush_edit_name_focus_out (GtkWidget *wid1,
GtkWidget *wid2,
BrushEditGeneratedWindow *begw);
static void brush_edit_update_brush (GtkAdjustment *adjustment,
BrushEditGeneratedWindow *begw);
static gint brush_edit_preview_resize (GtkWidget *widget,
GtkAllocation *allocation,
BrushEditGeneratedWindow *begw);
static void brush_edit_clear_preview (BrushEditGeneratedWindow *begw);
static gint brush_edit_brush_dirty (GimpBrush *brush,
BrushEditGeneratedWindow *begw);
static void brush_name_changed_callback (GtkWidget *widget,
BrushEditGeneratedWindow *begw);
/* public functions */
BrushEditGeneratedWindow *
brush_edit_generated_new (void)
{
BrushEditGeneratedWindow *begw;
GtkWidget *vbox;
GtkWidget *slider;
GtkWidget *table;
begw = g_new0 (BrushEditGeneratedWindow, 1);
begw->shell = gimp_dialog_new (_("Brush Editor"), "generated_brush_editor",
gimp_standard_help_func,
"dialogs/brush_editor.html",
GTK_WIN_POS_NONE,
FALSE, TRUE, FALSE,
"_delete_event_", brush_edit_close_callback,
begw, NULL, NULL, TRUE, TRUE,
NULL);
gtk_widget_hide (GTK_WIDGET (g_list_nth_data (gtk_container_children (GTK_CONTAINER (GTK_DIALOG (begw->shell)->vbox)), 0)));
gtk_widget_hide (GTK_DIALOG (begw->shell)->action_area);
vbox = gtk_vbox_new (FALSE, 1);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 2);
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (begw->shell)->vbox), vbox);
/* Brush's name */
begw->name = gtk_entry_new ();
gtk_box_pack_start (GTK_BOX (vbox), begw->name, FALSE, FALSE, 0);
gtk_widget_show (begw->name);
gtk_signal_connect (GTK_OBJECT (begw->name), "activate",
GTK_SIGNAL_FUNC (brush_edit_name_activate),
begw);
gtk_signal_connect (GTK_OBJECT (begw->name), "focus_out_event",
GTK_SIGNAL_FUNC (brush_edit_name_focus_out),
begw);
/* brush's preview widget w/frame */
begw->frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (begw->frame), GTK_SHADOW_IN);
gtk_box_pack_start (GTK_BOX (vbox), begw->frame, TRUE, TRUE, 0);
begw->preview = gtk_preview_new (GTK_PREVIEW_GRAYSCALE);
gtk_preview_size (GTK_PREVIEW (begw->preview), 125, 100);
gtk_signal_connect_after (GTK_OBJECT (begw->frame), "size_allocate",
GTK_SIGNAL_FUNC (brush_edit_preview_resize),
begw);
gtk_container_add (GTK_CONTAINER (begw->frame), begw->preview);
gtk_widget_show (begw->preview);
gtk_widget_show (begw->frame);
/* table for sliders/labels */
begw->scale_label = gtk_label_new ("-1:1");
gtk_box_pack_start (GTK_BOX (vbox), begw->scale_label, FALSE, FALSE, 0);
gtk_widget_show (begw->scale_label);
begw->scale = -1;
/* table for sliders/labels */
table = gtk_table_new (4, 2, FALSE);
gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
/* brush radius scale */
begw->radius_data =
GTK_ADJUSTMENT (gtk_adjustment_new (10.0, 0.0, 100.0, 0.1, 1.0, 0.0));
slider = gtk_hscale_new (begw->radius_data);
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
gtk_signal_connect (GTK_OBJECT (begw->radius_data), "value_changed",
GTK_SIGNAL_FUNC (brush_edit_update_brush),
begw);
gimp_table_attach_aligned (GTK_TABLE (table), 0, 0,
_("Radius:"), 1.0, 1.0,
slider, 1, FALSE);
/* brush hardness scale */
begw->hardness_data =
GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1.0, 0.01, 0.01, 0.0));
slider = gtk_hscale_new (begw->hardness_data);
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
gtk_signal_connect (GTK_OBJECT (begw->hardness_data), "value_changed",
GTK_SIGNAL_FUNC (brush_edit_update_brush),
begw);
gimp_table_attach_aligned (GTK_TABLE (table), 0, 1,
_("Hardness:"), 1.0, 1.0,
slider, 1, FALSE);
/* brush aspect ratio scale */
begw->aspect_ratio_data =
GTK_ADJUSTMENT (gtk_adjustment_new (1.0, 1.0, 20.0, 0.1, 1.0, 0.0));
slider = gtk_hscale_new (begw->aspect_ratio_data);
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
gtk_signal_connect (GTK_OBJECT (begw->aspect_ratio_data), "value_changed",
GTK_SIGNAL_FUNC (brush_edit_update_brush),
begw);
gimp_table_attach_aligned (GTK_TABLE (table), 0, 3,
_("Aspect Ratio:"), 1.0, 1.0,
slider, 1, FALSE);
/* brush angle scale */
begw->angle_data =
GTK_ADJUSTMENT (gtk_adjustment_new (00.0, 0.0, 180.0, 0.1, 1.0, 0.0));
slider = gtk_hscale_new (begw->angle_data);
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
gtk_signal_connect (GTK_OBJECT (begw->angle_data), "value_changed",
GTK_SIGNAL_FUNC (brush_edit_update_brush),
begw);
gimp_table_attach_aligned (GTK_TABLE (table), 0, 2,
_("Angle:"), 1.0, 1.0,
slider, 1, FALSE);
gtk_table_set_row_spacings (GTK_TABLE (table), 3);
gtk_table_set_col_spacing (GTK_TABLE (table), 0, 4);
gtk_widget_show (table);
gtk_widget_show (vbox);
gtk_widget_show (begw->shell);
return begw;
}
void
brush_edit_generated_set_brush (BrushEditGeneratedWindow *begw,
GimpBrush *gbrush)
{
GimpBrushGenerated *brush = NULL;
g_return_if_fail (begw != NULL);
if (begw->brush == (GimpBrushGenerated *) gbrush)
return;
if (begw->brush)
{
gtk_signal_disconnect_by_data (GTK_OBJECT (begw->brush), begw);
gtk_object_unref (GTK_OBJECT (begw->brush));
begw->brush = NULL;
}
if (!gbrush || !GIMP_IS_BRUSH_GENERATED (gbrush))
{
if (GTK_WIDGET_VISIBLE (begw->shell))
gtk_widget_hide (begw->shell);
return;
}
brush = GIMP_BRUSH_GENERATED (gbrush);
gtk_signal_connect (GTK_OBJECT (brush), "invalidate_preview",
GTK_SIGNAL_FUNC (brush_edit_brush_dirty),
begw);
gtk_signal_connect (GTK_OBJECT (brush), "name_changed",
GTK_SIGNAL_FUNC (brush_name_changed_callback),
begw);
gtk_adjustment_set_value (GTK_ADJUSTMENT (begw->radius_data),
gimp_brush_generated_get_radius (brush));
gtk_adjustment_set_value (GTK_ADJUSTMENT (begw->hardness_data),
gimp_brush_generated_get_hardness (brush));
gtk_adjustment_set_value (GTK_ADJUSTMENT (begw->angle_data),
gimp_brush_generated_get_angle (brush));
gtk_adjustment_set_value (GTK_ADJUSTMENT (begw->aspect_ratio_data),
gimp_brush_generated_get_aspect_ratio (brush));
gtk_entry_set_text (GTK_ENTRY (begw->name),
gimp_object_get_name (GIMP_OBJECT (gbrush)));
begw->brush = brush;
gtk_object_ref (GTK_OBJECT (begw->brush));
brush_edit_brush_dirty (GIMP_BRUSH (brush), begw);
if (! GTK_WIDGET_VISIBLE (begw->shell))
gtk_widget_show (begw->shell);
else
gdk_window_raise (begw->shell->window);
}
/* private functions */
static void
update_brush_callback (GtkAdjustment *adjustment,
BrushEditGeneratedWindow *begw)
brush_edit_close_callback (GtkWidget *widget,
gpointer data)
{
BrushEditGeneratedWindow *begw = (BrushEditGeneratedWindow *) data;
if (GTK_WIDGET_VISIBLE (begw->shell))
gtk_widget_hide (begw->shell);
}
static void
brush_edit_name_activate (GtkWidget *widget,
BrushEditGeneratedWindow *begw)
{
gchar *entry_text;
entry_text = gtk_entry_get_text (GTK_ENTRY (widget));
gimp_object_set_name (GIMP_OBJECT (begw->brush), entry_text);
}
static void
brush_edit_name_focus_out (GtkWidget *wid1,
GtkWidget *wid2,
BrushEditGeneratedWindow *begw)
{
brush_edit_name_activate (wid1, begw);
}
static void
brush_edit_update_brush (GtkAdjustment *adjustment,
BrushEditGeneratedWindow *begw)
{
if (begw->brush &&
((begw->radius_data->value
@ -70,6 +323,22 @@ update_brush_callback (GtkAdjustment *adjustment,
}
}
static gint
brush_edit_preview_resize (GtkWidget *widget,
GtkAllocation *allocation,
BrushEditGeneratedWindow *begw)
{
gtk_preview_size (GTK_PREVIEW (begw->preview),
widget->allocation.width - 4,
widget->allocation.height - 4);
/* update the display */
if (begw->brush)
brush_edit_brush_dirty (GIMP_BRUSH (begw->brush), begw);
return FALSE;
}
static void
brush_edit_clear_preview (BrushEditGeneratedWindow *begw)
{
@ -90,8 +359,8 @@ brush_edit_clear_preview (BrushEditGeneratedWindow *begw)
}
static gint
brush_edit_brush_dirty_callback (GimpBrush *brush,
BrushEditGeneratedWindow *begw)
brush_edit_brush_dirty (GimpBrush *brush,
BrushEditGeneratedWindow *begw)
{
gint x, y, width, yend, ystart, xo;
gint scale;
@ -144,225 +413,3 @@ brush_name_changed_callback (GtkWidget *widget,
gtk_entry_set_text (GTK_ENTRY (begw->name),
gimp_object_get_name (GIMP_OBJECT (begw->brush)));
}
void
brush_edit_generated_set_brush (BrushEditGeneratedWindow *begw,
GimpBrush *gbrush)
{
GimpBrushGenerated *brush = NULL;
g_return_if_fail (begw != NULL);
if (begw->brush == (GimpBrushGenerated *) gbrush)
return;
if (begw->brush)
{
gtk_signal_disconnect_by_data (GTK_OBJECT (begw->brush), begw);
gtk_object_unref (GTK_OBJECT (begw->brush));
begw->brush = NULL;
}
if (!gbrush || !GIMP_IS_BRUSH_GENERATED (gbrush))
{
begw->brush = NULL;
if (GTK_WIDGET_VISIBLE (begw->shell))
gtk_widget_hide (begw->shell);
return;
}
brush = GIMP_BRUSH_GENERATED (gbrush);
gtk_signal_connect (GTK_OBJECT (brush), "invalidate_preview",
GTK_SIGNAL_FUNC (brush_edit_brush_dirty_callback),
begw);
gtk_signal_connect (GTK_OBJECT (brush), "name_changed",
GTK_SIGNAL_FUNC (brush_name_changed_callback),
begw);
begw->brush = NULL;
gtk_adjustment_set_value (GTK_ADJUSTMENT (begw->radius_data),
gimp_brush_generated_get_radius (brush));
gtk_adjustment_set_value (GTK_ADJUSTMENT (begw->hardness_data),
gimp_brush_generated_get_hardness (brush));
gtk_adjustment_set_value (GTK_ADJUSTMENT (begw->angle_data),
gimp_brush_generated_get_angle (brush));
gtk_adjustment_set_value (GTK_ADJUSTMENT (begw->aspect_ratio_data),
gimp_brush_generated_get_aspect_ratio (brush));
gtk_entry_set_text (GTK_ENTRY (begw->name),
gimp_object_get_name (GIMP_OBJECT (gbrush)));
begw->brush = brush;
gtk_object_ref (GTK_OBJECT (begw->brush));
brush_edit_brush_dirty_callback (GIMP_BRUSH (brush), begw);
}
void
name_changed_func (GtkWidget *widget,
BrushEditGeneratedWindow *begw)
{
gchar *entry_text;
entry_text = gtk_entry_get_text (GTK_ENTRY (widget));
gimp_object_set_name (GIMP_OBJECT (begw->brush), entry_text);
}
void
focus_out_func (GtkWidget *wid1,
GtkWidget *wid2,
BrushEditGeneratedWindow *begw)
{
name_changed_func (wid1, begw);
}
BrushEditGeneratedWindow *
brush_edit_generated_new (void)
{
BrushEditGeneratedWindow *begw;
GtkWidget *vbox;
GtkWidget *slider;
GtkWidget *table;
begw = g_new0 (BrushEditGeneratedWindow, 1);
begw->shell = gimp_dialog_new (_("Brush Editor"), "generated_brush_editor",
gimp_standard_help_func,
"dialogs/brush_editor.html",
GTK_WIN_POS_NONE,
FALSE, TRUE, FALSE,
_("Close"), brush_edit_close_callback,
begw, NULL, NULL, TRUE, TRUE,
NULL);
vbox = gtk_vbox_new (FALSE, 1);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 2);
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (begw->shell)->vbox), vbox);
/* Brush's name */
begw->name = gtk_entry_new ();
gtk_box_pack_start (GTK_BOX (vbox), begw->name, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (begw->name), "activate",
GTK_SIGNAL_FUNC (name_changed_func),
begw);
gtk_signal_connect (GTK_OBJECT (begw->name), "focus_out_event",
GTK_SIGNAL_FUNC (focus_out_func),
begw);
gtk_widget_show (begw->name);
/* brush's preview widget w/frame */
begw->frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (begw->frame), GTK_SHADOW_IN);
gtk_box_pack_start (GTK_BOX (vbox), begw->frame, TRUE, TRUE, 0);
begw->preview = gtk_preview_new (GTK_PREVIEW_GRAYSCALE);
gtk_preview_size (GTK_PREVIEW (begw->preview), 125, 100);
gtk_signal_connect_after (GTK_OBJECT (begw->frame), "size_allocate",
GTK_SIGNAL_FUNC (brush_edit_preview_resize),
begw);
gtk_container_add (GTK_CONTAINER (begw->frame), begw->preview);
gtk_widget_show (begw->preview);
gtk_widget_show (begw->frame);
/* table for sliders/labels */
begw->scale_label = gtk_label_new ("-1:1");
gtk_box_pack_start (GTK_BOX (vbox), begw->scale_label, FALSE, FALSE, 0);
gtk_widget_show (begw->scale_label);
begw->scale = -1;
/* table for sliders/labels */
table = gtk_table_new (4, 2, FALSE);
gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
/* brush radius scale */
begw->radius_data =
GTK_ADJUSTMENT (gtk_adjustment_new (10.0, 0.0, 100.0, 0.1, 1.0, 0.0));
slider = gtk_hscale_new (begw->radius_data);
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
gtk_signal_connect (GTK_OBJECT (begw->radius_data), "value_changed",
GTK_SIGNAL_FUNC (update_brush_callback),
begw);
gimp_table_attach_aligned (GTK_TABLE (table), 0, 0,
_("Radius:"), 1.0, 1.0,
slider, 1, FALSE);
/* brush hardness scale */
begw->hardness_data =
GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1.0, 0.01, 0.01, 0.0));
slider = gtk_hscale_new (begw->hardness_data);
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
gtk_signal_connect (GTK_OBJECT (begw->hardness_data), "value_changed",
GTK_SIGNAL_FUNC (update_brush_callback),
begw);
gimp_table_attach_aligned (GTK_TABLE (table), 0, 1,
_("Hardness:"), 1.0, 1.0,
slider, 1, FALSE);
/* brush aspect ratio scale */
begw->aspect_ratio_data =
GTK_ADJUSTMENT (gtk_adjustment_new (1.0, 1.0, 20.0, 0.1, 1.0, 0.0));
slider = gtk_hscale_new (begw->aspect_ratio_data);
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
gtk_signal_connect (GTK_OBJECT (begw->aspect_ratio_data), "value_changed",
GTK_SIGNAL_FUNC (update_brush_callback),
begw);
gimp_table_attach_aligned (GTK_TABLE (table), 0, 3,
_("Aspect Ratio:"), 1.0, 1.0,
slider, 1, FALSE);
/* brush angle scale */
begw->angle_data =
GTK_ADJUSTMENT (gtk_adjustment_new (00.0, 0.0, 180.0, 0.1, 1.0, 0.0));
slider = gtk_hscale_new (begw->angle_data);
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
gtk_signal_connect (GTK_OBJECT (begw->angle_data), "value_changed",
GTK_SIGNAL_FUNC (update_brush_callback),
begw);
gimp_table_attach_aligned (GTK_TABLE (table), 0, 2,
_("Angle:"), 1.0, 1.0,
slider, 1, FALSE);
gtk_table_set_row_spacings (GTK_TABLE (table), 3);
gtk_table_set_col_spacing (GTK_TABLE (table), 0, 4);
gtk_widget_show (table);
gtk_widget_show (vbox);
gtk_widget_show (begw->shell);
return begw;
}
static gint
brush_edit_preview_resize (GtkWidget *widget,
GtkAllocation *allocation,
BrushEditGeneratedWindow *begw)
{
gtk_preview_size (GTK_PREVIEW (begw->preview),
widget->allocation.width - 4,
widget->allocation.height - 4);
/* update the display */
if (begw->brush)
brush_edit_brush_dirty_callback (GIMP_BRUSH (begw->brush), begw);
return FALSE;
}
static void
brush_edit_close_callback (GtkWidget *widget,
gpointer data)
{
BrushEditGeneratedWindow *begw = (BrushEditGeneratedWindow *) data;
if (GTK_WIDGET_VISIBLE (begw->shell))
gtk_widget_hide (begw->shell);
}

View File

@ -24,30 +24,12 @@
typedef struct _BrushEditGeneratedWindow BrushEditGeneratedWindow;
struct _BrushEditGeneratedWindow
{
GtkWidget *shell;
GtkWidget *frame;
GtkWidget *preview;
GtkWidget *scale_label;
GtkWidget *options_box;
GtkWidget *name;
GtkAdjustment *radius_data;
GtkAdjustment *hardness_data;
GtkAdjustment *angle_data;
GtkAdjustment *aspect_ratio_data;
/* Brush preview */
GtkWidget *brush_preview;
GimpBrushGenerated *brush;
gint scale;
};
BrushEditGeneratedWindow * brush_edit_generated_new (void);
void brush_edit_generated_set_brush (BrushEditGeneratedWindow *begw,
GimpBrush *brush);
void brush_edit_generated_free (BrushEditGeneratedWindow *begw);
#endif /* __BRUSH_EDIT_H__ */

View File

@ -87,16 +87,18 @@ static void brush_select_close_callback (GtkWidget *widget,
static void brush_select_edit_brush (GimpData *data);
/* The main brush selection dialog */
BrushSelect *brush_select_dialog = NULL;
/* List of active dialogs */
/* list of active dialogs */
GSList *brush_active_dialogs = NULL;
/* the main brush selection dialog */
BrushSelect *brush_select_dialog = NULL;
/* Brush editor dialog */
static BrushEditGeneratedWindow *brush_edit_generated_dialog;
/* public functions */
void
brush_dialog_create (void)
{
@ -697,16 +699,9 @@ brush_select_edit_brush (GimpData *data)
if (! brush_edit_generated_dialog)
{
brush_edit_generated_dialog = brush_edit_generated_new ();
}
brush_edit_generated_set_brush (brush_edit_generated_dialog, brush);
}
else
{
if (! GTK_WIDGET_VISIBLE (brush_edit_generated_dialog->shell))
gtk_widget_show (brush_edit_generated_dialog->shell);
else
gdk_window_raise (brush_edit_generated_dialog->shell->window);
}
brush_edit_generated_set_brush (brush_edit_generated_dialog, brush);
}
else
{

File diff suppressed because it is too large Load Diff

View File

@ -23,8 +23,14 @@
#define __GRADIENT_EDITOR_H__
void gradient_editor_set_gradient (GimpGradient *gradient);
void gradient_editor_free (void);
typedef struct _GradientEditor GradientEditor;
GradientEditor * gradient_editor_new (void);
void gradient_editor_set_gradient (GradientEditor *gradient_editor,
GimpGradient *gradient);
void gradient_editor_free (GradientEditor *gradient_editor);
#endif /* __GRADIENT_EDITOR_H__ */

View File

@ -55,14 +55,20 @@ static void gradient_select_gradient_changed (GimpContext *context,
GradientSelect *gsp);
static void gradient_select_close_callback (GtkWidget *widget,
gpointer data);
static void gradient_select_edit_gradient (GimpData *data);
/* list of active dialogs */
GSList *gradient_active_dialogs = NULL;
GSList *gradient_active_dialogs = NULL;
/* the main gradient selection dialog */
GradientSelect *gradient_select_dialog = NULL;
/* gradient editor dialog */
static GradientEditor *gradient_editor_dialog;
/* public functions */
void
gradient_dialog_create (void)
@ -92,8 +98,6 @@ gradient_dialog_free (void)
gradient_select_dialog = NULL;
}
gradient_editor_free ();
}
/* If title == NULL then it is the main gradient select dialog */
@ -168,7 +172,7 @@ gradient_select_new (gchar *title,
/* The Gradient List */
gsp->view = gimp_data_factory_view_new (GIMP_VIEW_TYPE_LIST,
global_gradient_factory,
gradient_editor_set_gradient,
gradient_select_edit_gradient,
gsp->context,
16,
10, 10);
@ -361,3 +365,18 @@ gradient_select_close_callback (GtkWidget *widget,
gradient_select_free (gsp);
}
}
static void
gradient_select_edit_gradient (GimpData *data)
{
GimpGradient *gradient;
gradient = GIMP_GRADIENT (data);
if (! gradient_editor_dialog)
{
gradient_editor_dialog = gradient_editor_new ();
}
gradient_editor_set_gradient (gradient_editor_dialog, gradient);
}

View File

@ -36,16 +36,269 @@
#include "libgimp/gimpintl.h"
static void brush_edit_close_callback (GtkWidget *widget,
gpointer data);
static gint brush_edit_preview_resize (GtkWidget *widget,
GtkAllocation *allocation,
BrushEditGeneratedWindow *begw);
struct _BrushEditGeneratedWindow
{
GtkWidget *shell;
GtkWidget *frame;
GtkWidget *preview;
GtkWidget *scale_label;
GtkWidget *options_box;
GtkWidget *name;
GtkAdjustment *radius_data;
GtkAdjustment *hardness_data;
GtkAdjustment *angle_data;
GtkAdjustment *aspect_ratio_data;
/* Brush preview */
GtkWidget *brush_preview;
GimpBrushGenerated *brush;
gint scale;
};
static void brush_edit_close_callback (GtkWidget *widget,
gpointer data);
static void brush_edit_name_activate (GtkWidget *widget,
BrushEditGeneratedWindow *begw);
static void brush_edit_name_focus_out (GtkWidget *wid1,
GtkWidget *wid2,
BrushEditGeneratedWindow *begw);
static void brush_edit_update_brush (GtkAdjustment *adjustment,
BrushEditGeneratedWindow *begw);
static gint brush_edit_preview_resize (GtkWidget *widget,
GtkAllocation *allocation,
BrushEditGeneratedWindow *begw);
static void brush_edit_clear_preview (BrushEditGeneratedWindow *begw);
static gint brush_edit_brush_dirty (GimpBrush *brush,
BrushEditGeneratedWindow *begw);
static void brush_name_changed_callback (GtkWidget *widget,
BrushEditGeneratedWindow *begw);
/* public functions */
BrushEditGeneratedWindow *
brush_edit_generated_new (void)
{
BrushEditGeneratedWindow *begw;
GtkWidget *vbox;
GtkWidget *slider;
GtkWidget *table;
begw = g_new0 (BrushEditGeneratedWindow, 1);
begw->shell = gimp_dialog_new (_("Brush Editor"), "generated_brush_editor",
gimp_standard_help_func,
"dialogs/brush_editor.html",
GTK_WIN_POS_NONE,
FALSE, TRUE, FALSE,
"_delete_event_", brush_edit_close_callback,
begw, NULL, NULL, TRUE, TRUE,
NULL);
gtk_widget_hide (GTK_WIDGET (g_list_nth_data (gtk_container_children (GTK_CONTAINER (GTK_DIALOG (begw->shell)->vbox)), 0)));
gtk_widget_hide (GTK_DIALOG (begw->shell)->action_area);
vbox = gtk_vbox_new (FALSE, 1);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 2);
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (begw->shell)->vbox), vbox);
/* Brush's name */
begw->name = gtk_entry_new ();
gtk_box_pack_start (GTK_BOX (vbox), begw->name, FALSE, FALSE, 0);
gtk_widget_show (begw->name);
gtk_signal_connect (GTK_OBJECT (begw->name), "activate",
GTK_SIGNAL_FUNC (brush_edit_name_activate),
begw);
gtk_signal_connect (GTK_OBJECT (begw->name), "focus_out_event",
GTK_SIGNAL_FUNC (brush_edit_name_focus_out),
begw);
/* brush's preview widget w/frame */
begw->frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (begw->frame), GTK_SHADOW_IN);
gtk_box_pack_start (GTK_BOX (vbox), begw->frame, TRUE, TRUE, 0);
begw->preview = gtk_preview_new (GTK_PREVIEW_GRAYSCALE);
gtk_preview_size (GTK_PREVIEW (begw->preview), 125, 100);
gtk_signal_connect_after (GTK_OBJECT (begw->frame), "size_allocate",
GTK_SIGNAL_FUNC (brush_edit_preview_resize),
begw);
gtk_container_add (GTK_CONTAINER (begw->frame), begw->preview);
gtk_widget_show (begw->preview);
gtk_widget_show (begw->frame);
/* table for sliders/labels */
begw->scale_label = gtk_label_new ("-1:1");
gtk_box_pack_start (GTK_BOX (vbox), begw->scale_label, FALSE, FALSE, 0);
gtk_widget_show (begw->scale_label);
begw->scale = -1;
/* table for sliders/labels */
table = gtk_table_new (4, 2, FALSE);
gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
/* brush radius scale */
begw->radius_data =
GTK_ADJUSTMENT (gtk_adjustment_new (10.0, 0.0, 100.0, 0.1, 1.0, 0.0));
slider = gtk_hscale_new (begw->radius_data);
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
gtk_signal_connect (GTK_OBJECT (begw->radius_data), "value_changed",
GTK_SIGNAL_FUNC (brush_edit_update_brush),
begw);
gimp_table_attach_aligned (GTK_TABLE (table), 0, 0,
_("Radius:"), 1.0, 1.0,
slider, 1, FALSE);
/* brush hardness scale */
begw->hardness_data =
GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1.0, 0.01, 0.01, 0.0));
slider = gtk_hscale_new (begw->hardness_data);
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
gtk_signal_connect (GTK_OBJECT (begw->hardness_data), "value_changed",
GTK_SIGNAL_FUNC (brush_edit_update_brush),
begw);
gimp_table_attach_aligned (GTK_TABLE (table), 0, 1,
_("Hardness:"), 1.0, 1.0,
slider, 1, FALSE);
/* brush aspect ratio scale */
begw->aspect_ratio_data =
GTK_ADJUSTMENT (gtk_adjustment_new (1.0, 1.0, 20.0, 0.1, 1.0, 0.0));
slider = gtk_hscale_new (begw->aspect_ratio_data);
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
gtk_signal_connect (GTK_OBJECT (begw->aspect_ratio_data), "value_changed",
GTK_SIGNAL_FUNC (brush_edit_update_brush),
begw);
gimp_table_attach_aligned (GTK_TABLE (table), 0, 3,
_("Aspect Ratio:"), 1.0, 1.0,
slider, 1, FALSE);
/* brush angle scale */
begw->angle_data =
GTK_ADJUSTMENT (gtk_adjustment_new (00.0, 0.0, 180.0, 0.1, 1.0, 0.0));
slider = gtk_hscale_new (begw->angle_data);
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
gtk_signal_connect (GTK_OBJECT (begw->angle_data), "value_changed",
GTK_SIGNAL_FUNC (brush_edit_update_brush),
begw);
gimp_table_attach_aligned (GTK_TABLE (table), 0, 2,
_("Angle:"), 1.0, 1.0,
slider, 1, FALSE);
gtk_table_set_row_spacings (GTK_TABLE (table), 3);
gtk_table_set_col_spacing (GTK_TABLE (table), 0, 4);
gtk_widget_show (table);
gtk_widget_show (vbox);
gtk_widget_show (begw->shell);
return begw;
}
void
brush_edit_generated_set_brush (BrushEditGeneratedWindow *begw,
GimpBrush *gbrush)
{
GimpBrushGenerated *brush = NULL;
g_return_if_fail (begw != NULL);
if (begw->brush == (GimpBrushGenerated *) gbrush)
return;
if (begw->brush)
{
gtk_signal_disconnect_by_data (GTK_OBJECT (begw->brush), begw);
gtk_object_unref (GTK_OBJECT (begw->brush));
begw->brush = NULL;
}
if (!gbrush || !GIMP_IS_BRUSH_GENERATED (gbrush))
{
if (GTK_WIDGET_VISIBLE (begw->shell))
gtk_widget_hide (begw->shell);
return;
}
brush = GIMP_BRUSH_GENERATED (gbrush);
gtk_signal_connect (GTK_OBJECT (brush), "invalidate_preview",
GTK_SIGNAL_FUNC (brush_edit_brush_dirty),
begw);
gtk_signal_connect (GTK_OBJECT (brush), "name_changed",
GTK_SIGNAL_FUNC (brush_name_changed_callback),
begw);
gtk_adjustment_set_value (GTK_ADJUSTMENT (begw->radius_data),
gimp_brush_generated_get_radius (brush));
gtk_adjustment_set_value (GTK_ADJUSTMENT (begw->hardness_data),
gimp_brush_generated_get_hardness (brush));
gtk_adjustment_set_value (GTK_ADJUSTMENT (begw->angle_data),
gimp_brush_generated_get_angle (brush));
gtk_adjustment_set_value (GTK_ADJUSTMENT (begw->aspect_ratio_data),
gimp_brush_generated_get_aspect_ratio (brush));
gtk_entry_set_text (GTK_ENTRY (begw->name),
gimp_object_get_name (GIMP_OBJECT (gbrush)));
begw->brush = brush;
gtk_object_ref (GTK_OBJECT (begw->brush));
brush_edit_brush_dirty (GIMP_BRUSH (brush), begw);
if (! GTK_WIDGET_VISIBLE (begw->shell))
gtk_widget_show (begw->shell);
else
gdk_window_raise (begw->shell->window);
}
/* private functions */
static void
update_brush_callback (GtkAdjustment *adjustment,
BrushEditGeneratedWindow *begw)
brush_edit_close_callback (GtkWidget *widget,
gpointer data)
{
BrushEditGeneratedWindow *begw = (BrushEditGeneratedWindow *) data;
if (GTK_WIDGET_VISIBLE (begw->shell))
gtk_widget_hide (begw->shell);
}
static void
brush_edit_name_activate (GtkWidget *widget,
BrushEditGeneratedWindow *begw)
{
gchar *entry_text;
entry_text = gtk_entry_get_text (GTK_ENTRY (widget));
gimp_object_set_name (GIMP_OBJECT (begw->brush), entry_text);
}
static void
brush_edit_name_focus_out (GtkWidget *wid1,
GtkWidget *wid2,
BrushEditGeneratedWindow *begw)
{
brush_edit_name_activate (wid1, begw);
}
static void
brush_edit_update_brush (GtkAdjustment *adjustment,
BrushEditGeneratedWindow *begw)
{
if (begw->brush &&
((begw->radius_data->value
@ -70,6 +323,22 @@ update_brush_callback (GtkAdjustment *adjustment,
}
}
static gint
brush_edit_preview_resize (GtkWidget *widget,
GtkAllocation *allocation,
BrushEditGeneratedWindow *begw)
{
gtk_preview_size (GTK_PREVIEW (begw->preview),
widget->allocation.width - 4,
widget->allocation.height - 4);
/* update the display */
if (begw->brush)
brush_edit_brush_dirty (GIMP_BRUSH (begw->brush), begw);
return FALSE;
}
static void
brush_edit_clear_preview (BrushEditGeneratedWindow *begw)
{
@ -90,8 +359,8 @@ brush_edit_clear_preview (BrushEditGeneratedWindow *begw)
}
static gint
brush_edit_brush_dirty_callback (GimpBrush *brush,
BrushEditGeneratedWindow *begw)
brush_edit_brush_dirty (GimpBrush *brush,
BrushEditGeneratedWindow *begw)
{
gint x, y, width, yend, ystart, xo;
gint scale;
@ -144,225 +413,3 @@ brush_name_changed_callback (GtkWidget *widget,
gtk_entry_set_text (GTK_ENTRY (begw->name),
gimp_object_get_name (GIMP_OBJECT (begw->brush)));
}
void
brush_edit_generated_set_brush (BrushEditGeneratedWindow *begw,
GimpBrush *gbrush)
{
GimpBrushGenerated *brush = NULL;
g_return_if_fail (begw != NULL);
if (begw->brush == (GimpBrushGenerated *) gbrush)
return;
if (begw->brush)
{
gtk_signal_disconnect_by_data (GTK_OBJECT (begw->brush), begw);
gtk_object_unref (GTK_OBJECT (begw->brush));
begw->brush = NULL;
}
if (!gbrush || !GIMP_IS_BRUSH_GENERATED (gbrush))
{
begw->brush = NULL;
if (GTK_WIDGET_VISIBLE (begw->shell))
gtk_widget_hide (begw->shell);
return;
}
brush = GIMP_BRUSH_GENERATED (gbrush);
gtk_signal_connect (GTK_OBJECT (brush), "invalidate_preview",
GTK_SIGNAL_FUNC (brush_edit_brush_dirty_callback),
begw);
gtk_signal_connect (GTK_OBJECT (brush), "name_changed",
GTK_SIGNAL_FUNC (brush_name_changed_callback),
begw);
begw->brush = NULL;
gtk_adjustment_set_value (GTK_ADJUSTMENT (begw->radius_data),
gimp_brush_generated_get_radius (brush));
gtk_adjustment_set_value (GTK_ADJUSTMENT (begw->hardness_data),
gimp_brush_generated_get_hardness (brush));
gtk_adjustment_set_value (GTK_ADJUSTMENT (begw->angle_data),
gimp_brush_generated_get_angle (brush));
gtk_adjustment_set_value (GTK_ADJUSTMENT (begw->aspect_ratio_data),
gimp_brush_generated_get_aspect_ratio (brush));
gtk_entry_set_text (GTK_ENTRY (begw->name),
gimp_object_get_name (GIMP_OBJECT (gbrush)));
begw->brush = brush;
gtk_object_ref (GTK_OBJECT (begw->brush));
brush_edit_brush_dirty_callback (GIMP_BRUSH (brush), begw);
}
void
name_changed_func (GtkWidget *widget,
BrushEditGeneratedWindow *begw)
{
gchar *entry_text;
entry_text = gtk_entry_get_text (GTK_ENTRY (widget));
gimp_object_set_name (GIMP_OBJECT (begw->brush), entry_text);
}
void
focus_out_func (GtkWidget *wid1,
GtkWidget *wid2,
BrushEditGeneratedWindow *begw)
{
name_changed_func (wid1, begw);
}
BrushEditGeneratedWindow *
brush_edit_generated_new (void)
{
BrushEditGeneratedWindow *begw;
GtkWidget *vbox;
GtkWidget *slider;
GtkWidget *table;
begw = g_new0 (BrushEditGeneratedWindow, 1);
begw->shell = gimp_dialog_new (_("Brush Editor"), "generated_brush_editor",
gimp_standard_help_func,
"dialogs/brush_editor.html",
GTK_WIN_POS_NONE,
FALSE, TRUE, FALSE,
_("Close"), brush_edit_close_callback,
begw, NULL, NULL, TRUE, TRUE,
NULL);
vbox = gtk_vbox_new (FALSE, 1);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 2);
gtk_container_add (GTK_CONTAINER (GTK_DIALOG (begw->shell)->vbox), vbox);
/* Brush's name */
begw->name = gtk_entry_new ();
gtk_box_pack_start (GTK_BOX (vbox), begw->name, FALSE, FALSE, 0);
gtk_signal_connect (GTK_OBJECT (begw->name), "activate",
GTK_SIGNAL_FUNC (name_changed_func),
begw);
gtk_signal_connect (GTK_OBJECT (begw->name), "focus_out_event",
GTK_SIGNAL_FUNC (focus_out_func),
begw);
gtk_widget_show (begw->name);
/* brush's preview widget w/frame */
begw->frame = gtk_frame_new (NULL);
gtk_frame_set_shadow_type (GTK_FRAME (begw->frame), GTK_SHADOW_IN);
gtk_box_pack_start (GTK_BOX (vbox), begw->frame, TRUE, TRUE, 0);
begw->preview = gtk_preview_new (GTK_PREVIEW_GRAYSCALE);
gtk_preview_size (GTK_PREVIEW (begw->preview), 125, 100);
gtk_signal_connect_after (GTK_OBJECT (begw->frame), "size_allocate",
GTK_SIGNAL_FUNC (brush_edit_preview_resize),
begw);
gtk_container_add (GTK_CONTAINER (begw->frame), begw->preview);
gtk_widget_show (begw->preview);
gtk_widget_show (begw->frame);
/* table for sliders/labels */
begw->scale_label = gtk_label_new ("-1:1");
gtk_box_pack_start (GTK_BOX (vbox), begw->scale_label, FALSE, FALSE, 0);
gtk_widget_show (begw->scale_label);
begw->scale = -1;
/* table for sliders/labels */
table = gtk_table_new (4, 2, FALSE);
gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
/* brush radius scale */
begw->radius_data =
GTK_ADJUSTMENT (gtk_adjustment_new (10.0, 0.0, 100.0, 0.1, 1.0, 0.0));
slider = gtk_hscale_new (begw->radius_data);
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
gtk_signal_connect (GTK_OBJECT (begw->radius_data), "value_changed",
GTK_SIGNAL_FUNC (update_brush_callback),
begw);
gimp_table_attach_aligned (GTK_TABLE (table), 0, 0,
_("Radius:"), 1.0, 1.0,
slider, 1, FALSE);
/* brush hardness scale */
begw->hardness_data =
GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 1.0, 0.01, 0.01, 0.0));
slider = gtk_hscale_new (begw->hardness_data);
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
gtk_signal_connect (GTK_OBJECT (begw->hardness_data), "value_changed",
GTK_SIGNAL_FUNC (update_brush_callback),
begw);
gimp_table_attach_aligned (GTK_TABLE (table), 0, 1,
_("Hardness:"), 1.0, 1.0,
slider, 1, FALSE);
/* brush aspect ratio scale */
begw->aspect_ratio_data =
GTK_ADJUSTMENT (gtk_adjustment_new (1.0, 1.0, 20.0, 0.1, 1.0, 0.0));
slider = gtk_hscale_new (begw->aspect_ratio_data);
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
gtk_signal_connect (GTK_OBJECT (begw->aspect_ratio_data), "value_changed",
GTK_SIGNAL_FUNC (update_brush_callback),
begw);
gimp_table_attach_aligned (GTK_TABLE (table), 0, 3,
_("Aspect Ratio:"), 1.0, 1.0,
slider, 1, FALSE);
/* brush angle scale */
begw->angle_data =
GTK_ADJUSTMENT (gtk_adjustment_new (00.0, 0.0, 180.0, 0.1, 1.0, 0.0));
slider = gtk_hscale_new (begw->angle_data);
gtk_scale_set_value_pos (GTK_SCALE (slider), GTK_POS_TOP);
gtk_range_set_update_policy (GTK_RANGE (slider), GTK_UPDATE_DELAYED);
gtk_signal_connect (GTK_OBJECT (begw->angle_data), "value_changed",
GTK_SIGNAL_FUNC (update_brush_callback),
begw);
gimp_table_attach_aligned (GTK_TABLE (table), 0, 2,
_("Angle:"), 1.0, 1.0,
slider, 1, FALSE);
gtk_table_set_row_spacings (GTK_TABLE (table), 3);
gtk_table_set_col_spacing (GTK_TABLE (table), 0, 4);
gtk_widget_show (table);
gtk_widget_show (vbox);
gtk_widget_show (begw->shell);
return begw;
}
static gint
brush_edit_preview_resize (GtkWidget *widget,
GtkAllocation *allocation,
BrushEditGeneratedWindow *begw)
{
gtk_preview_size (GTK_PREVIEW (begw->preview),
widget->allocation.width - 4,
widget->allocation.height - 4);
/* update the display */
if (begw->brush)
brush_edit_brush_dirty_callback (GIMP_BRUSH (begw->brush), begw);
return FALSE;
}
static void
brush_edit_close_callback (GtkWidget *widget,
gpointer data)
{
BrushEditGeneratedWindow *begw = (BrushEditGeneratedWindow *) data;
if (GTK_WIDGET_VISIBLE (begw->shell))
gtk_widget_hide (begw->shell);
}

View File

@ -24,30 +24,12 @@
typedef struct _BrushEditGeneratedWindow BrushEditGeneratedWindow;
struct _BrushEditGeneratedWindow
{
GtkWidget *shell;
GtkWidget *frame;
GtkWidget *preview;
GtkWidget *scale_label;
GtkWidget *options_box;
GtkWidget *name;
GtkAdjustment *radius_data;
GtkAdjustment *hardness_data;
GtkAdjustment *angle_data;
GtkAdjustment *aspect_ratio_data;
/* Brush preview */
GtkWidget *brush_preview;
GimpBrushGenerated *brush;
gint scale;
};
BrushEditGeneratedWindow * brush_edit_generated_new (void);
void brush_edit_generated_set_brush (BrushEditGeneratedWindow *begw,
GimpBrush *brush);
void brush_edit_generated_free (BrushEditGeneratedWindow *begw);
#endif /* __BRUSH_EDIT_H__ */

View File

@ -43,6 +43,10 @@ static gpointer gimp_container_grid_view_insert_item (GimpContainerView *v
static void gimp_container_grid_view_remove_item (GimpContainerView *view,
GimpViewable *viewable,
gpointer insert_data);
static void gimp_container_grid_view_reorder_item (GimpContainerView *view,
GimpViewable *viewable,
gint new_index,
gpointer insert_data);
static void gimp_container_grid_view_select_item (GimpContainerView *view,
GimpViewable *viewable,
gpointer insert_data);
@ -99,6 +103,7 @@ gimp_container_grid_view_class_init (GimpContainerGridViewClass *klass)
container_view_class->insert_item = gimp_container_grid_view_insert_item;
container_view_class->remove_item = gimp_container_grid_view_remove_item;
container_view_class->reorder_item = gimp_container_grid_view_reorder_item;
container_view_class->select_item = gimp_container_grid_view_select_item;
container_view_class->clear_items = gimp_container_grid_view_clear_items;
container_view_class->set_preview_size = gimp_container_grid_view_set_preview_size;
@ -258,6 +263,22 @@ gimp_container_grid_view_remove_item (GimpContainerView *view,
}
}
static void
gimp_container_grid_view_reorder_item (GimpContainerView *view,
GimpViewable *viewable,
gint new_index,
gpointer insert_data)
{
GimpContainerGridView *grid_view;
GtkWidget *preview;
grid_view = GIMP_CONTAINER_GRID_VIEW (view);
preview = GTK_WIDGET (insert_data);
gtk_wrap_box_reorder_child (GTK_WRAP_BOX (grid_view->wrap_box),
preview, new_index);
}
static void
gimp_container_grid_view_select_item (GimpContainerView *view,
GimpViewable *viewable,

View File

@ -42,6 +42,10 @@ static gpointer gimp_container_list_view_insert_item (GimpContainerView *v
static void gimp_container_list_view_remove_item (GimpContainerView *view,
GimpViewable *viewable,
gpointer insert_data);
static void gimp_container_list_view_reorder_item (GimpContainerView *view,
GimpViewable *viewable,
gint new_index,
gpointer insert_data);
static void gimp_container_list_view_select_item (GimpContainerView *view,
GimpViewable *viewable,
gpointer insert_data);
@ -99,6 +103,7 @@ gimp_container_list_view_class_init (GimpContainerListViewClass *klass)
container_view_class->insert_item = gimp_container_list_view_insert_item;
container_view_class->remove_item = gimp_container_list_view_remove_item;
container_view_class->reorder_item = gimp_container_list_view_reorder_item;
container_view_class->select_item = gimp_container_list_view_select_item;
container_view_class->clear_items = gimp_container_list_view_clear_items;
container_view_class->set_preview_size = gimp_container_list_view_set_preview_size;
@ -268,6 +273,47 @@ gimp_container_list_view_remove_item (GimpContainerView *view,
}
}
static void
gimp_container_list_view_reorder_item (GimpContainerView *view,
GimpViewable *viewable,
gint new_index,
gpointer insert_data)
{
GimpContainerListView *list_view;
GtkWidget *list_item;
gboolean selected;
list_view = GIMP_CONTAINER_LIST_VIEW (view);
if (insert_data)
list_item = GTK_WIDGET (insert_data);
else
list_item = NULL;
if (list_item)
{
GList *list;
list = g_list_prepend (NULL, list_item);
selected = GTK_WIDGET_STATE (list_item) == GTK_STATE_SELECTED;
gtk_object_ref (GTK_OBJECT (list_item));
gtk_list_remove_items (GTK_LIST (list_view->gtk_list), list);
if (new_index == -1 || new_index == view->container->num_children - 1)
gtk_list_append_items (GTK_LIST (list_view->gtk_list), list);
else
gtk_list_insert_items (GTK_LIST (list_view->gtk_list), list, new_index);
if (selected)
gtk_list_select_child (GTK_LIST (list_view->gtk_list), list_item);
gtk_object_unref (GTK_OBJECT (list_item));
}
}
static void
gimp_container_list_view_select_item (GimpContainerView *view,
GimpViewable *viewable,

View File

@ -33,6 +33,7 @@ enum
{
INSERT_ITEM,
REMOVE_ITEM,
REORDER_ITEM,
SELECT_ITEM,
CLEAR_ITEMS,
SET_PREVIEW_SIZE,
@ -55,6 +56,10 @@ static void gimp_container_view_add (GimpContainerView *view,
static void gimp_container_view_remove (GimpContainerView *view,
GimpViewable *viewable,
GimpContainer *container);
static void gimp_container_view_reorder (GimpContainerView *view,
GimpViewable *viewable,
gint new_index,
GimpContainer *container);
static void gimp_container_view_context_changed (GimpContext *context,
GimpViewable *viewable,
@ -122,6 +127,18 @@ gimp_container_view_class_init (GimpContainerViewClass *klass)
GIMP_TYPE_OBJECT,
GTK_TYPE_POINTER);
view_signals[REORDER_ITEM] =
gtk_signal_new ("reorder_item",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (GimpContainerViewClass,
reorder_item),
gtk_marshal_NONE__POINTER_INT_POINTER,
GTK_TYPE_NONE, 3,
GIMP_TYPE_OBJECT,
GTK_TYPE_INT,
GTK_TYPE_POINTER);
view_signals[SELECT_ITEM] =
gtk_signal_new ("select_item",
GTK_RUN_FIRST,
@ -157,6 +174,7 @@ gimp_container_view_class_init (GimpContainerViewClass *klass)
klass->insert_item = NULL;
klass->remove_item = NULL;
klass->reorder_item = NULL;
klass->select_item = NULL;
klass->clear_items = gimp_container_view_real_clear_items;
klass->set_preview_size = NULL;
@ -165,12 +183,12 @@ gimp_container_view_class_init (GimpContainerViewClass *klass)
static void
gimp_container_view_init (GimpContainerView *view)
{
view->container = NULL;
view->context = NULL;
view->container = NULL;
view->context = NULL;
view->hash_table = g_hash_table_new (g_direct_hash, g_direct_equal);
view->hash_table = g_hash_table_new (g_direct_hash, g_direct_equal);
view->preview_size = 0;
view->preview_size = 0;
}
static void
@ -213,6 +231,9 @@ gimp_container_view_set_container (GimpContainerView *view,
gtk_signal_disconnect_by_func (GTK_OBJECT (view->container),
gimp_container_view_remove,
view);
gtk_signal_disconnect_by_func (GTK_OBJECT (view->container),
gimp_container_view_reorder,
view);
g_hash_table_destroy (view->hash_table);
@ -242,6 +263,10 @@ gimp_container_view_set_container (GimpContainerView *view,
GTK_SIGNAL_FUNC (gimp_container_view_remove),
GTK_OBJECT (view));
gtk_signal_connect_object (GTK_OBJECT (view->container), "reorder",
GTK_SIGNAL_FUNC (gimp_container_view_reorder),
GTK_OBJECT (view));
if (view->context)
{
GimpObject *object;
@ -411,6 +436,23 @@ gimp_container_view_remove (GimpContainerView *view,
}
}
static void
gimp_container_view_reorder (GimpContainerView *view,
GimpViewable *viewable,
gint new_index,
GimpContainer *container)
{
gpointer insert_data;
insert_data = g_hash_table_lookup (view->hash_table, viewable);
if (insert_data)
{
gtk_signal_emit (GTK_OBJECT (view), view_signals[REORDER_ITEM],
viewable, new_index, insert_data);
}
}
static void
gimp_container_view_context_changed (GimpContext *context,
GimpViewable *viewable,

View File

@ -54,6 +54,10 @@ struct _GimpContainerViewClass
void (* remove_item) (GimpContainerView *view,
GimpViewable *object,
gpointer insert_data);
void (* reorder_item) (GimpContainerView *view,
GimpViewable *object,
gint new_index,
gpointer insert_data);
void (* select_item) (GimpContainerView *view,
GimpViewable *object,
gpointer insert_data);

View File

@ -340,6 +340,8 @@ gimp_data_factory_view_duplicate_clicked (GtkWidget *widget,
gimp_context_set_by_type (view->view->context,
view->factory->container->children_type,
GIMP_OBJECT (new_data));
gimp_data_factory_view_edit_clicked (NULL, view);
}
}
}
@ -363,6 +365,38 @@ gimp_data_factory_view_edit_clicked (GtkWidget *widget,
}
}
typedef struct _GimpDataDeleteData GimpDataDeleteData;
struct _GimpDataDeleteData
{
GimpDataFactory *factory;
GimpData *data;
};
static void
gimp_data_factory_view_delete_callback (GtkWidget *widget,
gboolean delete,
gpointer data)
{
GimpDataDeleteData *delete_data;
delete_data = (GimpDataDeleteData *) data;
if (! delete)
return;
if (gimp_container_have (delete_data->factory->container,
GIMP_OBJECT (delete_data->data)))
{
if (delete_data->data->filename)
gimp_data_delete_from_disk (delete_data->data);
gimp_container_remove (delete_data->factory->container,
GIMP_OBJECT (delete_data->data));
}
}
static void
gimp_data_factory_view_delete_clicked (GtkWidget *widget,
GimpDataFactoryView *view)
@ -376,10 +410,37 @@ gimp_data_factory_view_delete_clicked (GtkWidget *widget,
if (data && gimp_container_have (view->factory->container,
GIMP_OBJECT (data)))
{
if (data->filename)
gimp_data_delete_from_disk (data);
GimpDataDeleteData *delete_data;
GtkWidget *dialog;
gchar *str;
gimp_container_remove (view->factory->container, GIMP_OBJECT (data));
delete_data = g_new0 (GimpDataDeleteData, 1);
delete_data->factory = view->factory;
delete_data->data = data;
str = g_strdup_printf (_("Are you sure you want to delete\n"
"\"%s\" from the list and from disk?"),
GIMP_OBJECT (data)->name);
dialog =
gimp_query_boolean_box (_("Delete Data Object"),
gimp_standard_help_func, NULL,
FALSE,
str,
_("Delete"), _("Cancel"),
GTK_OBJECT (data),
"destroy",
gimp_data_factory_view_delete_callback,
delete_data);
gtk_signal_connect_object (GTK_OBJECT (dialog), "destroy",
GTK_SIGNAL_FUNC (g_free),
(GtkObject *) delete_data);
g_free (str);
gtk_widget_show (dialog);
}
}

File diff suppressed because it is too large Load Diff

View File

@ -23,8 +23,14 @@
#define __GRADIENT_EDITOR_H__
void gradient_editor_set_gradient (GimpGradient *gradient);
void gradient_editor_free (void);
typedef struct _GradientEditor GradientEditor;
GradientEditor * gradient_editor_new (void);
void gradient_editor_set_gradient (GradientEditor *gradient_editor,
GimpGradient *gradient);
void gradient_editor_free (GradientEditor *gradient_editor);
#endif /* __GRADIENT_EDITOR_H__ */