mirror of https://github.com/GNOME/gimp.git
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:
parent
617985837c
commit
2f6f9bdd0b
32
ChangeLog
32
ChangeLog
|
@ -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
|
||||
|
|
509
app/brush_edit.c
509
app/brush_edit.c
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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__ */
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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__ */
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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__ */
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
@ -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__ */
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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__ */
|
||||
|
|
|
@ -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
|
@ -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__ */
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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__ */
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
@ -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__ */
|
||||
|
|
Loading…
Reference in New Issue