removed the layer mask functions.

2001-03-06  Michael Natterer  <mitch@gimp.org>

	* app/gimage.[ch]: removed the layer mask functions.

	* app/gimpchannel.[ch]: added a boolean "dummy" parameter to
	gimp_channel_copy() so it has the same signature as
	gimp_layer_copy() and can be used by the GimpDrawableListView to
	generically duplicate drawables.

	* app/gimpcontainerview.c: call "select_item" with a NULL item
	before changing the underlying GimpContainer so subclasses have
	a chance to update (e.g. set button sensitivity).

	* app/gimpdnd.c: folded all the GtkType comparing code into a
	utility function (much more readable now).

	* app/gimpdrawablelistview.[ch]: activated the "raise", "lower",
	"duplicate" and "delete". I'm not really happy with all those
	function pointers passed to the constructor (and the dummy
	parameters I've added to some GimpChannel functions) -- OTOH the
	generic view maybe worth the "gboolean dummy" cruft hanging around
	in the channel class.

	* app/gimplayer.[ch]: removed the "apply_mask", "edit_mask" and
	"show_mask" booleans ...

	* app/gimplayermask.[ch]: .. and added them here together with
	proper accessors and "*_changed" signals.

	This also makes the layer mask undo code much clearer as we don't
	have to store the booleans separately.

	* app/gimplayerlistitem.c: badly hacked to acheive the correct
	indicator being drawn around the active drawable. This needs
	a new GimpPreview function for setting the border color.

	* app/gimplistitem.c: smaller horizontal spacing.

	* app/gimppreview.[ch]: added the "border_width" parameter also to
	gimp_preview_set_size() so we can modify all previews the same way
	after creation.

	* app/layers_dialog.c: no need to push an undo group around
	the "duplicate layer" code. Was this an artefact or did I miss
	something here ???

	* app/channel_ops.c
	* app/channels_dialog.c
	* app/gimage_mask.c
	* app/gimpcontainergridview.c
	* app/gimpcontainerlistview.c
	* app/gimpdrawablelistitem.c
	* app/gimpimage.[ch]
	* app/qmask.c
	* app/test_commands.c
	* app/undo.c
	* app/xcf.c
	* app/pdb/channel_cmds.c
	* tools/pdbgen/pdb/channel.pdb
	* app/pdb/selection_cmds.c
	* tools/pdbgen/pdb/selection.pdb: changed accordingly.

	* app/pdb/internal_procs.c
	* app/pdb/layer_cmds.c
	* libgimp/gimplayer_pdb.[ch]
	* tools/pdbgen/pdb/layer.pdb: commented out the layer mask accessors
	from the perl code, so the functions temporarily disappeared all
	over the place.

	* plug-ins/Makefile.am: don't build XJT until the layer mask stuff
	is back.

	* pixmaps/eye.xpm: cropped it to it's minimal size.
This commit is contained in:
Michael Natterer 2001-03-06 13:28:39 +00:00 committed by Michael Natterer
parent 75e8e3877c
commit af76f2bbb8
102 changed files with 2386 additions and 2003 deletions

View file

@ -1,3 +1,77 @@
2001-03-06 Michael Natterer <mitch@gimp.org>
* app/gimage.[ch]: removed the layer mask functions.
* app/gimpchannel.[ch]: added a boolean "dummy" parameter to
gimp_channel_copy() so it has the same signature as
gimp_layer_copy() and can be used by the GimpDrawableListView to
generically duplicate drawables.
* app/gimpcontainerview.c: call "select_item" with a NULL item
before changing the underlying GimpContainer so subclasses have
a chance to update (e.g. set button sensitivity).
* app/gimpdnd.c: folded all the GtkType comparing code into a
utility function (much more readable now).
* app/gimpdrawablelistview.[ch]: activated the "raise", "lower",
"duplicate" and "delete" buttons. I'm not really happy with all
those function pointers passed to the constructor (and the dummy
parameters I've added to some GimpChannel functions) -- OTOH the
generic view maybe worth the "gboolean dummy" cruft hanging around
in the channel class.
* app/gimplayer.[ch]: removed the "apply_mask", "edit_mask" and
"show_mask" booleans ...
* app/gimplayermask.[ch]: .. and added them here together with
proper accessors and "*_changed" signals.
This also makes the layer mask undo code much clearer as we don't
have to store the booleans separately.
* app/gimplayerlistitem.c: badly hacked to acheive the correct
indicator being drawn around the active drawable. This needs
a new GimpPreview function for setting the border color.
* app/gimplistitem.c: smaller horizontal spacing.
* app/gimppreview.[ch]: added the "border_width" parameter also to
gimp_preview_set_size() so we can modify all previews the same way
after creation.
* app/layers_dialog.c: no need to push an undo group around
the "duplicate layer" code. Was this an artefact or did I miss
something here ???
* app/channel_ops.c
* app/channels_dialog.c
* app/gimage_mask.c
* app/gimpcontainergridview.c
* app/gimpcontainerlistview.c
* app/gimpdrawablelistitem.c
* app/gimpimage.[ch]
* app/qmask.c
* app/test_commands.c
* app/undo.c
* app/xcf.c
* app/pdb/channel_cmds.c
* tools/pdbgen/pdb/channel.pdb
* app/pdb/selection_cmds.c
* tools/pdbgen/pdb/selection.pdb: changed accordingly.
* app/pdb/internal_procs.c
* app/pdb/layer_cmds.c
* libgimp/gimplayer_pdb.[ch]
* tools/pdbgen/pdb/layer.pdb: commented out the layer mask accessors
from the perl code, so the functions temporarily disappeared all
over the place.
* plug-ins/Makefile.am: don't build XJT until the layer mask stuff
is back.
* pixmaps/eye.xpm: cropped it to it's minimal size.
2001-03-05 Sven Neumann <sven@gimp.org>
* app/Makefile.am

View file

@ -244,7 +244,7 @@ qmask_activate (GtkWidget *widget,
{
/* if selection */
gmask = gimp_channel_copy (gimp_image_get_mask (gimg));
gmask = gimp_channel_copy (gimp_image_get_mask (gimg), TRUE);
gimp_image_add_channel (gimg, gmask, 0);
gimp_channel_set_color (gmask, &color);
gimp_object_set_name (GIMP_OBJECT (gmask), "Qmask");

View file

@ -244,7 +244,7 @@ qmask_activate (GtkWidget *widget,
{
/* if selection */
gmask = gimp_channel_copy (gimp_image_get_mask (gimg));
gmask = gimp_channel_copy (gimp_image_get_mask (gimg), TRUE);
gimp_image_add_channel (gimg, gmask, 0);
gimp_channel_set_color (gmask, &color);
gimp_object_set_name (GIMP_OBJECT (gmask), "Qmask");

View file

@ -648,7 +648,7 @@ duplicate (GimpImage *gimage)
{
channel = (GimpChannel *) list->data;
new_channel = gimp_channel_copy (channel);
new_channel = gimp_channel_copy (channel, TRUE);
gimp_drawable_set_gimage (GIMP_DRAWABLE (new_channel), new_gimage);

View file

@ -1076,7 +1076,7 @@ channels_dialog_duplicate_channel_callback (GtkWidget *widget,
if ((active_channel = gimp_image_get_active_channel (gimage)))
{
new_channel = gimp_channel_copy (active_channel);
new_channel = gimp_channel_copy (active_channel, TRUE);
gimp_image_add_channel (gimage, new_channel, -1);
gdisplays_flush ();
}
@ -1129,7 +1129,7 @@ channels_dialog_add_channel_to_sel_callback (GtkWidget *widget,
if ((active_channel = gimp_image_get_active_channel (gimage)))
{
new_channel = gimp_channel_copy (gimp_image_get_mask (gimage));
new_channel = gimp_channel_copy (gimp_image_get_mask (gimage), TRUE);
gimp_channel_combine_mask (new_channel,
active_channel,
CHANNEL_OP_ADD,
@ -1153,7 +1153,7 @@ channels_dialog_sub_channel_from_sel_callback (GtkWidget *widget,
if ((active_channel = gimp_image_get_active_channel (gimage)))
{
new_channel = gimp_channel_copy (gimp_image_get_mask (gimage));
new_channel = gimp_channel_copy (gimp_image_get_mask (gimage), TRUE);
gimp_channel_combine_mask (new_channel,
active_channel,
CHANNEL_OP_SUB,
@ -1177,7 +1177,7 @@ channels_dialog_intersect_channel_with_sel_callback (GtkWidget *widget,
if ((active_channel = gimp_image_get_active_channel (gimage)))
{
new_channel = gimp_channel_copy (gimp_image_get_mask (gimage));
new_channel = gimp_channel_copy (gimp_image_get_mask (gimage), TRUE);
gimp_channel_combine_mask (new_channel,
active_channel,
CHANNEL_OP_INTERSECT,
@ -1675,7 +1675,7 @@ channel_widget_idle_drop_channel (gpointer data)
cd = (ChannelDrop *) data;
gimp_image_position_channel (cd->gimage, cd->channel, cd->dest_index);
gimp_image_position_channel (cd->gimage, cd->channel, cd->dest_index, TRUE);
gdisplays_flush ();
g_free (cd);

View file

@ -174,7 +174,13 @@ gimp_channel_new (GimpImage *gimage,
}
GimpChannel *
gimp_channel_copy (const GimpChannel *channel)
gimp_channel_copy (const GimpChannel *channel,
gboolean dummy) /* the dummy is for symmetry with
* gimp_layer_copy() because
* both functions are used as
* function pointers in
* GimpDrawableListView --Mitch
*/
{
gchar *channel_name;
GimpChannel *new_channel;

View file

@ -90,7 +90,8 @@ GimpChannel * gimp_channel_new (GimpImage *gimage,
gint height,
const gchar *name,
const GimpRGB *color);
GimpChannel * gimp_channel_copy (const GimpChannel *channel);
GimpChannel * gimp_channel_copy (const GimpChannel *channel,
gboolean dummy);
gint gimp_channel_get_opacity (const GimpChannel *channel);
void gimp_channel_set_opacity (GimpChannel *channel,

View file

@ -174,7 +174,13 @@ gimp_channel_new (GimpImage *gimage,
}
GimpChannel *
gimp_channel_copy (const GimpChannel *channel)
gimp_channel_copy (const GimpChannel *channel,
gboolean dummy) /* the dummy is for symmetry with
* gimp_layer_copy() because
* both functions are used as
* function pointers in
* GimpDrawableListView --Mitch
*/
{
gchar *channel_name;
GimpChannel *new_channel;

View file

@ -90,7 +90,8 @@ GimpChannel * gimp_channel_new (GimpImage *gimage,
gint height,
const gchar *name,
const GimpRGB *color);
GimpChannel * gimp_channel_copy (const GimpChannel *channel);
GimpChannel * gimp_channel_copy (const GimpChannel *channel,
gboolean dummy);
gint gimp_channel_get_opacity (const GimpChannel *channel);
void gimp_channel_set_opacity (GimpChannel *channel,

View file

@ -648,7 +648,7 @@ duplicate (GimpImage *gimage)
{
channel = (GimpChannel *) list->data;
new_channel = gimp_channel_copy (channel);
new_channel = gimp_channel_copy (channel, TRUE);
gimp_drawable_set_gimage (GIMP_DRAWABLE (new_channel), new_gimage);

View file

@ -648,7 +648,7 @@ duplicate (GimpImage *gimage)
{
channel = (GimpChannel *) list->data;
new_channel = gimp_channel_copy (channel);
new_channel = gimp_channel_copy (channel, TRUE);
gimp_drawable_set_gimage (GIMP_DRAWABLE (new_channel), new_gimage);

View file

@ -1727,7 +1727,7 @@ gimp_image_construct_layers (GimpImage *gimage,
TRUE);
/* If we're showing the layer mask instead of the layer... */
if (layer->mask && layer->show_mask)
if (layer->mask && layer->mask->show_mask)
{
pixel_region_init (&src2PR,
gimp_drawable_data (GIMP_DRAWABLE (layer->mask)),
@ -1744,7 +1744,7 @@ gimp_image_construct_layers (GimpImage *gimage,
(x1 - off_x), (y1 - off_y),
(x2 - x1), (y2 - y1), FALSE);
if (layer->mask && layer->apply_mask)
if (layer->mask && layer->mask->apply_mask)
{
pixel_region_init (&maskPR,
gimp_drawable_data (GIMP_DRAWABLE (layer->mask)),
@ -3091,7 +3091,7 @@ gimp_image_merge_layers (GimpImage *gimage,
(x4 - x3), (y4 - y3),
FALSE);
if (layer->mask && layer->apply_mask)
if (layer->mask && layer->mask->apply_mask)
{
pixel_region_init (&maskPR,
gimp_drawable_data (GIMP_DRAWABLE (layer->mask)),
@ -3336,7 +3336,7 @@ gimp_image_raise_channel (GimpImage *gimage,
return FALSE;
}
return gimp_image_position_channel (gimage, channel, index - 1);
return gimp_image_position_channel (gimage, channel, index - 1, TRUE);
}
gboolean
@ -3359,13 +3359,14 @@ gimp_image_lower_channel (GimpImage *gimage,
return FALSE;
}
return gimp_image_position_channel (gimage, channel, index + 1);
return gimp_image_position_channel (gimage, channel, index + 1, TRUE);
}
gboolean
gimp_image_position_channel (GimpImage *gimage,
GimpChannel *channel,
gint new_index)
gint new_index,
gboolean push_undo /* FIXME unused */)
{
gint index;
gint num_channels;
@ -3383,11 +3384,7 @@ gimp_image_position_channel (GimpImage *gimage,
num_channels = gimp_container_num_children (gimage->channels);
if (new_index < 0)
new_index = 0;
if (new_index >= num_channels)
new_index = num_channels - 1;
new_index = CLAMP (new_index, 0, num_channels - 1);
if (new_index == index)
return TRUE;
@ -3530,7 +3527,7 @@ gimp_image_active_drawable (const GimpImage *gimage)
layer = gimage->active_layer;
if (layer->mask && layer->edit_mask)
if (layer->mask && layer->mask->edit_mask)
return GIMP_DRAWABLE (layer->mask);
else
return GIMP_DRAWABLE (layer);
@ -3941,7 +3938,7 @@ gimp_image_get_new_preview (GimpViewable *viewable,
src2PR.data = temp_buf_data (layer_buf) +
(y1 - y) * src2PR.rowstride + (x1 - x) * src2PR.bytes;
if (layer->mask && layer->apply_mask)
if (layer->mask && layer->mask->apply_mask)
{
mask_buf = gimp_viewable_get_preview (GIMP_VIEWABLE (layer->mask),
w, h);

View file

@ -367,7 +367,8 @@ gboolean gimp_image_lower_channel (GimpImage *gimage,
GimpChannel *channel);
gboolean gimp_image_position_channel (GimpImage *gimage,
GimpChannel *channel,
gint position);
gint new_index,
gboolean push_undo);
gboolean gimp_image_add_channel (GimpImage *gimage,
GimpChannel *channel,
gint position);

View file

@ -553,7 +553,7 @@ gimage_mask_save (GImage *gimage)
{
GimpChannel *new_channel;
new_channel = gimp_channel_copy (gimp_image_get_mask (gimage));
new_channel = gimp_channel_copy (gimp_image_get_mask (gimage), TRUE);
/* saved selections are not visible by default */
gimp_drawable_set_visible (GIMP_DRAWABLE (new_channel), FALSE);

View file

@ -1727,7 +1727,7 @@ gimp_image_construct_layers (GimpImage *gimage,
TRUE);
/* If we're showing the layer mask instead of the layer... */
if (layer->mask && layer->show_mask)
if (layer->mask && layer->mask->show_mask)
{
pixel_region_init (&src2PR,
gimp_drawable_data (GIMP_DRAWABLE (layer->mask)),
@ -1744,7 +1744,7 @@ gimp_image_construct_layers (GimpImage *gimage,
(x1 - off_x), (y1 - off_y),
(x2 - x1), (y2 - y1), FALSE);
if (layer->mask && layer->apply_mask)
if (layer->mask && layer->mask->apply_mask)
{
pixel_region_init (&maskPR,
gimp_drawable_data (GIMP_DRAWABLE (layer->mask)),
@ -3091,7 +3091,7 @@ gimp_image_merge_layers (GimpImage *gimage,
(x4 - x3), (y4 - y3),
FALSE);
if (layer->mask && layer->apply_mask)
if (layer->mask && layer->mask->apply_mask)
{
pixel_region_init (&maskPR,
gimp_drawable_data (GIMP_DRAWABLE (layer->mask)),
@ -3336,7 +3336,7 @@ gimp_image_raise_channel (GimpImage *gimage,
return FALSE;
}
return gimp_image_position_channel (gimage, channel, index - 1);
return gimp_image_position_channel (gimage, channel, index - 1, TRUE);
}
gboolean
@ -3359,13 +3359,14 @@ gimp_image_lower_channel (GimpImage *gimage,
return FALSE;
}
return gimp_image_position_channel (gimage, channel, index + 1);
return gimp_image_position_channel (gimage, channel, index + 1, TRUE);
}
gboolean
gimp_image_position_channel (GimpImage *gimage,
GimpChannel *channel,
gint new_index)
gint new_index,
gboolean push_undo /* FIXME unused */)
{
gint index;
gint num_channels;
@ -3383,11 +3384,7 @@ gimp_image_position_channel (GimpImage *gimage,
num_channels = gimp_container_num_children (gimage->channels);
if (new_index < 0)
new_index = 0;
if (new_index >= num_channels)
new_index = num_channels - 1;
new_index = CLAMP (new_index, 0, num_channels - 1);
if (new_index == index)
return TRUE;
@ -3530,7 +3527,7 @@ gimp_image_active_drawable (const GimpImage *gimage)
layer = gimage->active_layer;
if (layer->mask && layer->edit_mask)
if (layer->mask && layer->mask->edit_mask)
return GIMP_DRAWABLE (layer->mask);
else
return GIMP_DRAWABLE (layer);
@ -3941,7 +3938,7 @@ gimp_image_get_new_preview (GimpViewable *viewable,
src2PR.data = temp_buf_data (layer_buf) +
(y1 - y) * src2PR.rowstride + (x1 - x) * src2PR.bytes;
if (layer->mask && layer->apply_mask)
if (layer->mask && layer->mask->apply_mask)
{
mask_buf = gimp_viewable_get_preview (GIMP_VIEWABLE (layer->mask),
w, h);

View file

@ -367,7 +367,8 @@ gboolean gimp_image_lower_channel (GimpImage *gimage,
GimpChannel *channel);
gboolean gimp_image_position_channel (GimpImage *gimage,
GimpChannel *channel,
gint position);
gint new_index,
gboolean push_undo);
gboolean gimp_image_add_channel (GimpImage *gimage,
GimpChannel *channel,
gint position);

View file

@ -1727,7 +1727,7 @@ gimp_image_construct_layers (GimpImage *gimage,
TRUE);
/* If we're showing the layer mask instead of the layer... */
if (layer->mask && layer->show_mask)
if (layer->mask && layer->mask->show_mask)
{
pixel_region_init (&src2PR,
gimp_drawable_data (GIMP_DRAWABLE (layer->mask)),
@ -1744,7 +1744,7 @@ gimp_image_construct_layers (GimpImage *gimage,
(x1 - off_x), (y1 - off_y),
(x2 - x1), (y2 - y1), FALSE);
if (layer->mask && layer->apply_mask)
if (layer->mask && layer->mask->apply_mask)
{
pixel_region_init (&maskPR,
gimp_drawable_data (GIMP_DRAWABLE (layer->mask)),
@ -3091,7 +3091,7 @@ gimp_image_merge_layers (GimpImage *gimage,
(x4 - x3), (y4 - y3),
FALSE);
if (layer->mask && layer->apply_mask)
if (layer->mask && layer->mask->apply_mask)
{
pixel_region_init (&maskPR,
gimp_drawable_data (GIMP_DRAWABLE (layer->mask)),
@ -3336,7 +3336,7 @@ gimp_image_raise_channel (GimpImage *gimage,
return FALSE;
}
return gimp_image_position_channel (gimage, channel, index - 1);
return gimp_image_position_channel (gimage, channel, index - 1, TRUE);
}
gboolean
@ -3359,13 +3359,14 @@ gimp_image_lower_channel (GimpImage *gimage,
return FALSE;
}
return gimp_image_position_channel (gimage, channel, index + 1);
return gimp_image_position_channel (gimage, channel, index + 1, TRUE);
}
gboolean
gimp_image_position_channel (GimpImage *gimage,
GimpChannel *channel,
gint new_index)
gint new_index,
gboolean push_undo /* FIXME unused */)
{
gint index;
gint num_channels;
@ -3383,11 +3384,7 @@ gimp_image_position_channel (GimpImage *gimage,
num_channels = gimp_container_num_children (gimage->channels);
if (new_index < 0)
new_index = 0;
if (new_index >= num_channels)
new_index = num_channels - 1;
new_index = CLAMP (new_index, 0, num_channels - 1);
if (new_index == index)
return TRUE;
@ -3530,7 +3527,7 @@ gimp_image_active_drawable (const GimpImage *gimage)
layer = gimage->active_layer;
if (layer->mask && layer->edit_mask)
if (layer->mask && layer->mask->edit_mask)
return GIMP_DRAWABLE (layer->mask);
else
return GIMP_DRAWABLE (layer);
@ -3941,7 +3938,7 @@ gimp_image_get_new_preview (GimpViewable *viewable,
src2PR.data = temp_buf_data (layer_buf) +
(y1 - y) * src2PR.rowstride + (x1 - x) * src2PR.bytes;
if (layer->mask && layer->apply_mask)
if (layer->mask && layer->mask->apply_mask)
{
mask_buf = gimp_viewable_get_preview (GIMP_VIEWABLE (layer->mask),
w, h);

View file

@ -367,7 +367,8 @@ gboolean gimp_image_lower_channel (GimpImage *gimage,
GimpChannel *channel);
gboolean gimp_image_position_channel (GimpImage *gimage,
GimpChannel *channel,
gint position);
gint new_index,
gboolean push_undo);
gboolean gimp_image_add_channel (GimpImage *gimage,
GimpChannel *channel,
gint position);

View file

@ -244,7 +244,7 @@ qmask_activate (GtkWidget *widget,
{
/* if selection */
gmask = gimp_channel_copy (gimp_image_get_mask (gimg));
gmask = gimp_channel_copy (gimp_image_get_mask (gimg), TRUE);
gimp_image_add_channel (gimg, gmask, 0);
gimp_channel_set_color (gmask, &color);
gimp_object_set_name (GIMP_OBJECT (gmask), "Qmask");

View file

@ -244,7 +244,7 @@ qmask_activate (GtkWidget *widget,
{
/* if selection */
gmask = gimp_channel_copy (gimp_image_get_mask (gimg));
gmask = gimp_channel_copy (gimp_image_get_mask (gimg), TRUE);
gimp_image_add_channel (gimg, gmask, 0);
gimp_channel_set_color (gmask, &color);
gimp_object_set_name (GIMP_OBJECT (gmask), "Qmask");

View file

@ -1727,7 +1727,7 @@ gimp_image_construct_layers (GimpImage *gimage,
TRUE);
/* If we're showing the layer mask instead of the layer... */
if (layer->mask && layer->show_mask)
if (layer->mask && layer->mask->show_mask)
{
pixel_region_init (&src2PR,
gimp_drawable_data (GIMP_DRAWABLE (layer->mask)),
@ -1744,7 +1744,7 @@ gimp_image_construct_layers (GimpImage *gimage,
(x1 - off_x), (y1 - off_y),
(x2 - x1), (y2 - y1), FALSE);
if (layer->mask && layer->apply_mask)
if (layer->mask && layer->mask->apply_mask)
{
pixel_region_init (&maskPR,
gimp_drawable_data (GIMP_DRAWABLE (layer->mask)),
@ -3091,7 +3091,7 @@ gimp_image_merge_layers (GimpImage *gimage,
(x4 - x3), (y4 - y3),
FALSE);
if (layer->mask && layer->apply_mask)
if (layer->mask && layer->mask->apply_mask)
{
pixel_region_init (&maskPR,
gimp_drawable_data (GIMP_DRAWABLE (layer->mask)),
@ -3336,7 +3336,7 @@ gimp_image_raise_channel (GimpImage *gimage,
return FALSE;
}
return gimp_image_position_channel (gimage, channel, index - 1);
return gimp_image_position_channel (gimage, channel, index - 1, TRUE);
}
gboolean
@ -3359,13 +3359,14 @@ gimp_image_lower_channel (GimpImage *gimage,
return FALSE;
}
return gimp_image_position_channel (gimage, channel, index + 1);
return gimp_image_position_channel (gimage, channel, index + 1, TRUE);
}
gboolean
gimp_image_position_channel (GimpImage *gimage,
GimpChannel *channel,
gint new_index)
gint new_index,
gboolean push_undo /* FIXME unused */)
{
gint index;
gint num_channels;
@ -3383,11 +3384,7 @@ gimp_image_position_channel (GimpImage *gimage,
num_channels = gimp_container_num_children (gimage->channels);
if (new_index < 0)
new_index = 0;
if (new_index >= num_channels)
new_index = num_channels - 1;
new_index = CLAMP (new_index, 0, num_channels - 1);
if (new_index == index)
return TRUE;
@ -3530,7 +3527,7 @@ gimp_image_active_drawable (const GimpImage *gimage)
layer = gimage->active_layer;
if (layer->mask && layer->edit_mask)
if (layer->mask && layer->mask->edit_mask)
return GIMP_DRAWABLE (layer->mask);
else
return GIMP_DRAWABLE (layer);
@ -3941,7 +3938,7 @@ gimp_image_get_new_preview (GimpViewable *viewable,
src2PR.data = temp_buf_data (layer_buf) +
(y1 - y) * src2PR.rowstride + (x1 - x) * src2PR.bytes;
if (layer->mask && layer->apply_mask)
if (layer->mask && layer->mask->apply_mask)
{
mask_buf = gimp_viewable_get_preview (GIMP_VIEWABLE (layer->mask),
w, h);

View file

@ -367,7 +367,8 @@ gboolean gimp_image_lower_channel (GimpImage *gimage,
GimpChannel *channel);
gboolean gimp_image_position_channel (GimpImage *gimage,
GimpChannel *channel,
gint position);
gint new_index,
gboolean push_undo);
gboolean gimp_image_add_channel (GimpImage *gimage,
GimpChannel *channel,
gint position);

View file

@ -1727,7 +1727,7 @@ gimp_image_construct_layers (GimpImage *gimage,
TRUE);
/* If we're showing the layer mask instead of the layer... */
if (layer->mask && layer->show_mask)
if (layer->mask && layer->mask->show_mask)
{
pixel_region_init (&src2PR,
gimp_drawable_data (GIMP_DRAWABLE (layer->mask)),
@ -1744,7 +1744,7 @@ gimp_image_construct_layers (GimpImage *gimage,
(x1 - off_x), (y1 - off_y),
(x2 - x1), (y2 - y1), FALSE);
if (layer->mask && layer->apply_mask)
if (layer->mask && layer->mask->apply_mask)
{
pixel_region_init (&maskPR,
gimp_drawable_data (GIMP_DRAWABLE (layer->mask)),
@ -3091,7 +3091,7 @@ gimp_image_merge_layers (GimpImage *gimage,
(x4 - x3), (y4 - y3),
FALSE);
if (layer->mask && layer->apply_mask)
if (layer->mask && layer->mask->apply_mask)
{
pixel_region_init (&maskPR,
gimp_drawable_data (GIMP_DRAWABLE (layer->mask)),
@ -3336,7 +3336,7 @@ gimp_image_raise_channel (GimpImage *gimage,
return FALSE;
}
return gimp_image_position_channel (gimage, channel, index - 1);
return gimp_image_position_channel (gimage, channel, index - 1, TRUE);
}
gboolean
@ -3359,13 +3359,14 @@ gimp_image_lower_channel (GimpImage *gimage,
return FALSE;
}
return gimp_image_position_channel (gimage, channel, index + 1);
return gimp_image_position_channel (gimage, channel, index + 1, TRUE);
}
gboolean
gimp_image_position_channel (GimpImage *gimage,
GimpChannel *channel,
gint new_index)
gint new_index,
gboolean push_undo /* FIXME unused */)
{
gint index;
gint num_channels;
@ -3383,11 +3384,7 @@ gimp_image_position_channel (GimpImage *gimage,
num_channels = gimp_container_num_children (gimage->channels);
if (new_index < 0)
new_index = 0;
if (new_index >= num_channels)
new_index = num_channels - 1;
new_index = CLAMP (new_index, 0, num_channels - 1);
if (new_index == index)
return TRUE;
@ -3530,7 +3527,7 @@ gimp_image_active_drawable (const GimpImage *gimage)
layer = gimage->active_layer;
if (layer->mask && layer->edit_mask)
if (layer->mask && layer->mask->edit_mask)
return GIMP_DRAWABLE (layer->mask);
else
return GIMP_DRAWABLE (layer);
@ -3941,7 +3938,7 @@ gimp_image_get_new_preview (GimpViewable *viewable,
src2PR.data = temp_buf_data (layer_buf) +
(y1 - y) * src2PR.rowstride + (x1 - x) * src2PR.bytes;
if (layer->mask && layer->apply_mask)
if (layer->mask && layer->mask->apply_mask)
{
mask_buf = gimp_viewable_get_preview (GIMP_VIEWABLE (layer->mask),
w, h);

View file

@ -367,7 +367,8 @@ gboolean gimp_image_lower_channel (GimpImage *gimage,
GimpChannel *channel);
gboolean gimp_image_position_channel (GimpImage *gimage,
GimpChannel *channel,
gint position);
gint new_index,
gboolean push_undo);
gboolean gimp_image_add_channel (GimpImage *gimage,
GimpChannel *channel,
gint position);

View file

@ -1708,12 +1708,6 @@ undo_pop_layer_mask (GimpImage *gimage,
else
{
gimp_layer_add_mask (lmu->layer, lmu->mask, FALSE);
lmu->layer->apply_mask = lmu->apply_mask;
lmu->layer->edit_mask = lmu->edit_mask;
lmu->layer->show_mask = lmu->show_mask;
gimage_set_layer_mask_edit (gimage, lmu->layer, lmu->edit_mask);
}
return TRUE;

View file

@ -1727,7 +1727,7 @@ gimp_image_construct_layers (GimpImage *gimage,
TRUE);
/* If we're showing the layer mask instead of the layer... */
if (layer->mask && layer->show_mask)
if (layer->mask && layer->mask->show_mask)
{
pixel_region_init (&src2PR,
gimp_drawable_data (GIMP_DRAWABLE (layer->mask)),
@ -1744,7 +1744,7 @@ gimp_image_construct_layers (GimpImage *gimage,
(x1 - off_x), (y1 - off_y),
(x2 - x1), (y2 - y1), FALSE);
if (layer->mask && layer->apply_mask)
if (layer->mask && layer->mask->apply_mask)
{
pixel_region_init (&maskPR,
gimp_drawable_data (GIMP_DRAWABLE (layer->mask)),
@ -3091,7 +3091,7 @@ gimp_image_merge_layers (GimpImage *gimage,
(x4 - x3), (y4 - y3),
FALSE);
if (layer->mask && layer->apply_mask)
if (layer->mask && layer->mask->apply_mask)
{
pixel_region_init (&maskPR,
gimp_drawable_data (GIMP_DRAWABLE (layer->mask)),
@ -3336,7 +3336,7 @@ gimp_image_raise_channel (GimpImage *gimage,
return FALSE;
}
return gimp_image_position_channel (gimage, channel, index - 1);
return gimp_image_position_channel (gimage, channel, index - 1, TRUE);
}
gboolean
@ -3359,13 +3359,14 @@ gimp_image_lower_channel (GimpImage *gimage,
return FALSE;
}
return gimp_image_position_channel (gimage, channel, index + 1);
return gimp_image_position_channel (gimage, channel, index + 1, TRUE);
}
gboolean
gimp_image_position_channel (GimpImage *gimage,
GimpChannel *channel,
gint new_index)
gint new_index,
gboolean push_undo /* FIXME unused */)
{
gint index;
gint num_channels;
@ -3383,11 +3384,7 @@ gimp_image_position_channel (GimpImage *gimage,
num_channels = gimp_container_num_children (gimage->channels);
if (new_index < 0)
new_index = 0;
if (new_index >= num_channels)
new_index = num_channels - 1;
new_index = CLAMP (new_index, 0, num_channels - 1);
if (new_index == index)
return TRUE;
@ -3530,7 +3527,7 @@ gimp_image_active_drawable (const GimpImage *gimage)
layer = gimage->active_layer;
if (layer->mask && layer->edit_mask)
if (layer->mask && layer->mask->edit_mask)
return GIMP_DRAWABLE (layer->mask);
else
return GIMP_DRAWABLE (layer);
@ -3941,7 +3938,7 @@ gimp_image_get_new_preview (GimpViewable *viewable,
src2PR.data = temp_buf_data (layer_buf) +
(y1 - y) * src2PR.rowstride + (x1 - x) * src2PR.bytes;
if (layer->mask && layer->apply_mask)
if (layer->mask && layer->mask->apply_mask)
{
mask_buf = gimp_viewable_get_preview (GIMP_VIEWABLE (layer->mask),
w, h);

View file

@ -367,7 +367,8 @@ gboolean gimp_image_lower_channel (GimpImage *gimage,
GimpChannel *channel);
gboolean gimp_image_position_channel (GimpImage *gimage,
GimpChannel *channel,
gint position);
gint new_index,
gboolean push_undo);
gboolean gimp_image_add_channel (GimpImage *gimage,
GimpChannel *channel,
gint position);

View file

@ -138,9 +138,6 @@ gimp_layer_init (GimpLayer *layer)
layer->preserve_trans = FALSE;
layer->mask = NULL;
layer->apply_mask = FALSE;
layer->edit_mask = FALSE;
layer->show_mask = FALSE;
layer->opacity = 100;
layer->mode = NORMAL_MODE;
@ -350,15 +347,11 @@ gimp_layer_copy (GimpLayer *layer,
/* duplicate the layer mask if necessary */
if (layer->mask)
{
new_layer->mask = gimp_layer_mask_copy (layer->mask);
new_layer->mask = gimp_layer_mask_copy (layer->mask);
gtk_object_ref (GTK_OBJECT (new_layer->mask));
gtk_object_sink (GTK_OBJECT (new_layer->mask));
new_layer->apply_mask = layer->apply_mask;
new_layer->edit_mask = layer->edit_mask;
new_layer->show_mask = layer->show_mask;
gimp_layer_mask_set_layer (new_layer->mask, new_layer);
}
@ -501,11 +494,6 @@ gimp_layer_add_mask (GimpLayer *layer,
gimp_layer_mask_set_layer (mask, layer);
/* Set the application mode in the layer to "apply" */
layer->apply_mask = TRUE;
layer->edit_mask = TRUE;
layer->show_mask = FALSE;
drawable_update (GIMP_DRAWABLE (layer),
0, 0,
GIMP_DRAWABLE (layer)->width,
@ -514,12 +502,9 @@ gimp_layer_add_mask (GimpLayer *layer,
if (push_undo)
{
/* Prepare a layer undo and push it */
lmu = g_new (LayerMaskUndo, 1);
lmu->layer = layer;
lmu->mask = mask;
lmu->apply_mask = layer->apply_mask;
lmu->edit_mask = layer->edit_mask;
lmu->show_mask = layer->show_mask;
lmu = g_new0 (LayerMaskUndo, 1);
lmu->layer = layer;
lmu->mask = mask;
undo_push_layer_mask (gimage, LAYER_MASK_ADD_UNDO, lmu);
}
@ -673,14 +658,11 @@ gimp_layer_apply_mask (GimpLayer *layer,
lmu->layer = layer;
lmu->mask = layer->mask;
lmu->mode = mode;
lmu->apply_mask = layer->apply_mask;
lmu->edit_mask = layer->edit_mask;
lmu->show_mask = layer->show_mask;
}
/* check if applying the mask changes the projection */
if ((mode == APPLY && (!layer->apply_mask || layer->show_mask)) ||
(mode == DISCARD && ( layer->apply_mask || layer->show_mask)))
if ((mode == APPLY && (!layer->mask->apply_mask || layer->mask->show_mask)) ||
(mode == DISCARD && ( layer->mask->apply_mask || layer->mask->show_mask)))
{
view_changed = TRUE;
}
@ -713,10 +695,7 @@ gimp_layer_apply_mask (GimpLayer *layer,
GIMP_DRAWABLE (layer)->preview_valid = FALSE;
}
layer->mask = NULL;
layer->apply_mask = FALSE;
layer->edit_mask = FALSE;
layer->show_mask = FALSE;
layer->mask = NULL;
if (push_undo)
{

View file

@ -40,9 +40,6 @@ struct _GimpLayer
gboolean preserve_trans; /* preserve transparency */
GimpLayerMask *mask; /* possible layer mask */
gint apply_mask; /* controls mask application */
gboolean edit_mask; /* edit mask or layer? */
gboolean show_mask; /* show mask or layer? */
gint opacity; /* layer opacity */
LayerModeEffects mode; /* layer combination mode */

View file

@ -28,6 +28,7 @@
#include "apptypes.h"
#include "boundary.h"
#include "drawable.h"
#include "gimplayermask.h"
#include "paint_funcs.h"
#include "pixel_region.h"
@ -41,12 +42,23 @@
#include "libgimp/gimpintl.h"
enum
{
APPLY_CHANGED,
EDIT_CHANGED,
SHOW_CHANGED,
LAST_SIGNAL
};
static void gimp_layer_mask_class_init (GimpLayerMaskClass *klass);
static void gimp_layer_mask_init (GimpLayerMask *layermask);
static void gimp_layer_mask_destroy (GtkObject *object);
static GimpChannelClass *parent_class = NULL;
static guint layer_mask_signals[LAST_SIGNAL] = { 0 };
static GimpChannelClass *parent_class = NULL;
GtkType
@ -83,9 +95,34 @@ gimp_layer_mask_class_init (GimpLayerMaskClass *klass)
parent_class = gtk_type_class (GIMP_TYPE_CHANNEL);
/*
layer_mask_signals[APPLY_CHANGED] =
gtk_signal_new ("apply_changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (GimpLayerMaskClass,
apply_changed),
gtk_signal_default_marshaller,
GTK_TYPE_NONE, 0);
layer_mask_signals[EDIT_CHANGED] =
gtk_signal_new ("edit_changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (GimpLayerMaskClass,
edit_changed),
gtk_signal_default_marshaller,
GTK_TYPE_NONE, 0);
layer_mask_signals[SHOW_CHANGED] =
gtk_signal_new ("show_changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (GimpLayerMaskClass,
show_changed),
gtk_signal_default_marshaller,
GTK_TYPE_NONE, 0);
gtk_object_class_add_signals (object_class, layer_mask_signals, LAST_SIGNAL);
*/
object_class->destroy = gimp_layer_mask_destroy;
}
@ -93,7 +130,11 @@ gimp_layer_mask_class_init (GimpLayerMaskClass *klass)
static void
gimp_layer_mask_init (GimpLayerMask *layer_mask)
{
layer_mask->layer = NULL;
layer_mask->layer = NULL;
layer_mask->apply_mask = TRUE;
layer_mask->edit_mask = TRUE;
layer_mask->show_mask = FALSE;
}
static void
@ -163,14 +204,15 @@ gimp_layer_mask_copy (GimpLayerMask *layer_mask)
GIMP_DRAWABLE (layer_mask)->height,
layer_mask_name,
&GIMP_CHANNEL (layer_mask)->color);
GIMP_DRAWABLE(new_layer_mask)->visible =
GIMP_DRAWABLE(layer_mask)->visible;
GIMP_DRAWABLE(new_layer_mask)->offset_x =
GIMP_DRAWABLE(layer_mask)->offset_x;
GIMP_DRAWABLE(new_layer_mask)->offset_y =
GIMP_DRAWABLE(layer_mask)->offset_y;
GIMP_CHANNEL(new_layer_mask)->show_masked =
GIMP_CHANNEL(layer_mask)->show_masked;
GIMP_DRAWABLE (new_layer_mask)->visible = GIMP_DRAWABLE (layer_mask)->visible;
GIMP_DRAWABLE (new_layer_mask)->offset_x = GIMP_DRAWABLE (layer_mask)->offset_x;
GIMP_DRAWABLE (new_layer_mask)->offset_y = GIMP_DRAWABLE (layer_mask)->offset_y;
GIMP_CHANNEL (new_layer_mask)->show_masked = GIMP_CHANNEL (layer_mask)->show_masked;
new_layer_mask->apply_mask = layer_mask->apply_mask;
new_layer_mask->edit_mask = layer_mask->edit_mask;
new_layer_mask->show_mask = layer_mask->show_mask;
/* copy the contents across layer masks */
pixel_region_init (&srcPR, GIMP_DRAWABLE (layer_mask)->tiles,
@ -203,3 +245,102 @@ gimp_layer_mask_get_layer (GimpLayerMask *mask)
{
return mask->layer;
}
void
gimp_layer_mask_set_apply (GimpLayerMask *layer_mask,
gboolean apply)
{
g_return_if_fail (layer_mask != NULL);
g_return_if_fail (GIMP_IS_LAYER_MASK (layer_mask));
if (layer_mask->apply_mask != apply)
{
layer_mask->apply_mask = apply;
if (layer_mask->layer)
{
GimpDrawable *drawable;
drawable = GIMP_DRAWABLE (layer_mask->layer);
drawable_update (drawable,
0, 0,
gimp_drawable_width (drawable),
gimp_drawable_height (drawable));
}
gtk_signal_emit (GTK_OBJECT (layer_mask),
layer_mask_signals[APPLY_CHANGED]);
}
}
gboolean
gimp_layer_mask_get_apply (GimpLayerMask *layer_mask)
{
g_return_val_if_fail (layer_mask != NULL, FALSE);
g_return_val_if_fail (GIMP_IS_LAYER_MASK (layer_mask), FALSE);
return layer_mask->apply_mask;
}
void
gimp_layer_mask_set_edit (GimpLayerMask *layer_mask,
gboolean edit)
{
g_return_if_fail (layer_mask != NULL);
g_return_if_fail (GIMP_IS_LAYER_MASK (layer_mask));
if (layer_mask->edit_mask != edit)
{
layer_mask->edit_mask = edit;
gtk_signal_emit (GTK_OBJECT (layer_mask),
layer_mask_signals[EDIT_CHANGED]);
}
}
gboolean
gimp_layer_mask_get_edit (GimpLayerMask *layer_mask)
{
g_return_val_if_fail (layer_mask != NULL, FALSE);
g_return_val_if_fail (GIMP_IS_LAYER_MASK (layer_mask), FALSE);
return layer_mask->edit_mask;
}
void
gimp_layer_mask_set_show (GimpLayerMask *layer_mask,
gboolean show)
{
g_return_if_fail (layer_mask != NULL);
g_return_if_fail (GIMP_IS_LAYER_MASK (layer_mask));
if (layer_mask->show_mask != show)
{
layer_mask->show_mask = show;
if (layer_mask->layer)
{
GimpDrawable *drawable;
drawable = GIMP_DRAWABLE (layer_mask->layer);
drawable_update (drawable,
0, 0,
gimp_drawable_width (drawable),
gimp_drawable_height (drawable));
}
gtk_signal_emit (GTK_OBJECT (layer_mask),
layer_mask_signals[SHOW_CHANGED]);
}
}
gboolean
gimp_layer_mask_get_show (GimpLayerMask *layer_mask)
{
g_return_val_if_fail (layer_mask != NULL, FALSE);
g_return_val_if_fail (GIMP_IS_LAYER_MASK (layer_mask), FALSE);
return layer_mask->show_mask;
}

View file

@ -37,11 +37,19 @@ struct _GimpLayerMask
GimpChannel parent_instance;
GimpLayer *layer;
gboolean apply_mask; /* controls mask application */
gboolean edit_mask; /* edit mask or layer? */
gboolean show_mask; /* show mask or layer? */
};
struct _GimpLayerMaskClass
{
GimpChannelClass parent_class;
void (* apply_changed) (GimpLayerMask *layer_mask);
void (* edit_changed) (GimpLayerMask *layer_mask);
void (* show_changed) (GimpLayerMask *layer_mask);
};
@ -49,12 +57,9 @@ struct _GimpLayerMaskClass
struct _LayerMaskUndo
{
GimpLayer *layer; /* the layer */
gboolean apply_mask; /* apply mask? */
gboolean edit_mask; /* edit mask or layer? */
gboolean show_mask; /* show the mask? */
GimpLayerMask *mask; /* the layer mask */
gint mode; /* the application mode */
GimpLayer *layer; /* the layer */
GimpLayerMask *mask; /* the layer mask */
gint mode; /* the application mode */
};
@ -73,5 +78,17 @@ void gimp_layer_mask_set_layer (GimpLayerMask *layer_mask,
GimpLayer *layer);
GimpLayer * gimp_layer_mask_get_layer (GimpLayerMask *layer_mask);
void gimp_layer_mask_set_apply (GimpLayerMask *layer_mask,
gboolean apply);
gboolean gimp_layer_mask_get_apply (GimpLayerMask *layer_mask);
void gimp_layer_mask_set_edit (GimpLayerMask *layer_mask,
gboolean apply);
gboolean gimp_layer_mask_get_edit (GimpLayerMask *layer_mask);
void gimp_layer_mask_set_show (GimpLayerMask *layer_mask,
gboolean show);
gboolean gimp_layer_mask_get_show (GimpLayerMask *layer_mask);
#endif /* __GIMP_LAYER_MASK_H__ */

View file

@ -1727,7 +1727,7 @@ gimp_image_construct_layers (GimpImage *gimage,
TRUE);
/* If we're showing the layer mask instead of the layer... */
if (layer->mask && layer->show_mask)
if (layer->mask && layer->mask->show_mask)
{
pixel_region_init (&src2PR,
gimp_drawable_data (GIMP_DRAWABLE (layer->mask)),
@ -1744,7 +1744,7 @@ gimp_image_construct_layers (GimpImage *gimage,
(x1 - off_x), (y1 - off_y),
(x2 - x1), (y2 - y1), FALSE);
if (layer->mask && layer->apply_mask)
if (layer->mask && layer->mask->apply_mask)
{
pixel_region_init (&maskPR,
gimp_drawable_data (GIMP_DRAWABLE (layer->mask)),
@ -3091,7 +3091,7 @@ gimp_image_merge_layers (GimpImage *gimage,
(x4 - x3), (y4 - y3),
FALSE);
if (layer->mask && layer->apply_mask)
if (layer->mask && layer->mask->apply_mask)
{
pixel_region_init (&maskPR,
gimp_drawable_data (GIMP_DRAWABLE (layer->mask)),
@ -3336,7 +3336,7 @@ gimp_image_raise_channel (GimpImage *gimage,
return FALSE;
}
return gimp_image_position_channel (gimage, channel, index - 1);
return gimp_image_position_channel (gimage, channel, index - 1, TRUE);
}
gboolean
@ -3359,13 +3359,14 @@ gimp_image_lower_channel (GimpImage *gimage,
return FALSE;
}
return gimp_image_position_channel (gimage, channel, index + 1);
return gimp_image_position_channel (gimage, channel, index + 1, TRUE);
}
gboolean
gimp_image_position_channel (GimpImage *gimage,
GimpChannel *channel,
gint new_index)
gint new_index,
gboolean push_undo /* FIXME unused */)
{
gint index;
gint num_channels;
@ -3383,11 +3384,7 @@ gimp_image_position_channel (GimpImage *gimage,
num_channels = gimp_container_num_children (gimage->channels);
if (new_index < 0)
new_index = 0;
if (new_index >= num_channels)
new_index = num_channels - 1;
new_index = CLAMP (new_index, 0, num_channels - 1);
if (new_index == index)
return TRUE;
@ -3530,7 +3527,7 @@ gimp_image_active_drawable (const GimpImage *gimage)
layer = gimage->active_layer;
if (layer->mask && layer->edit_mask)
if (layer->mask && layer->mask->edit_mask)
return GIMP_DRAWABLE (layer->mask);
else
return GIMP_DRAWABLE (layer);
@ -3941,7 +3938,7 @@ gimp_image_get_new_preview (GimpViewable *viewable,
src2PR.data = temp_buf_data (layer_buf) +
(y1 - y) * src2PR.rowstride + (x1 - x) * src2PR.bytes;
if (layer->mask && layer->apply_mask)
if (layer->mask && layer->mask->apply_mask)
{
mask_buf = gimp_viewable_get_preview (GIMP_VIEWABLE (layer->mask),
w, h);

View file

@ -367,7 +367,8 @@ gboolean gimp_image_lower_channel (GimpImage *gimage,
GimpChannel *channel);
gboolean gimp_image_position_channel (GimpImage *gimage,
GimpChannel *channel,
gint position);
gint new_index,
gboolean push_undo);
gboolean gimp_image_add_channel (GimpImage *gimage,
GimpChannel *channel,
gint position);

View file

@ -244,7 +244,7 @@ qmask_activate (GtkWidget *widget,
{
/* if selection */
gmask = gimp_channel_copy (gimp_image_get_mask (gimg));
gmask = gimp_channel_copy (gimp_image_get_mask (gimg), TRUE);
gimp_image_add_channel (gimg, gmask, 0);
gimp_channel_set_color (gmask, &color);
gimp_object_set_name (GIMP_OBJECT (gmask), "Qmask");

View file

@ -33,6 +33,7 @@
#include "gimpdrawable.h"
#include "gimpimage.h"
#include "gimplayer.h"
#include "gimplayermask.h"
#include "lc_dialog.h"
#include "paint_funcs.h"
#include "palette_import.h"
@ -184,57 +185,3 @@ gimage_repaint_handler (GimpImage *gimage,
{
gdisplays_update_area (gimage, x, y, w, h);
}
/* These really belong in the layer class */
void
gimage_set_layer_mask_apply (GimpImage *gimage,
GimpLayer *layer)
{
gint off_x, off_y;
g_return_if_fail (gimage);
g_return_if_fail (layer);
if (! layer->mask)
return;
layer->apply_mask = ! layer->apply_mask;
gimp_drawable_offsets (GIMP_DRAWABLE (layer), &off_x, &off_y);
gdisplays_update_area (gimage, off_x, off_y,
gimp_drawable_width (GIMP_DRAWABLE (layer)),
gimp_drawable_height (GIMP_DRAWABLE (layer)));
}
void
gimage_set_layer_mask_edit (GimpImage *gimage,
GimpLayer *layer,
gboolean edit)
{
/* find the layer */
if (!layer)
return;
if (layer->mask)
layer->edit_mask = edit;
}
void
gimage_set_layer_mask_show (GimpImage *gimage,
GimpLayer *layer)
{
gint off_x, off_y;
g_return_if_fail (gimage);
g_return_if_fail (layer);
if (! layer->mask)
return;
layer->show_mask = ! layer->show_mask;
gimp_drawable_offsets (GIMP_DRAWABLE (layer), &off_x, &off_y);
gdisplays_update_area (gimage, off_x, off_y,
gimp_drawable_width (GIMP_DRAWABLE (layer)),
gimp_drawable_height (GIMP_DRAWABLE (layer)));
}

View file

@ -27,14 +27,6 @@ GImage * gimage_new (gint width,
gint height,
GimpImageBaseType base_type);
void gimage_set_layer_mask_apply (GImage *gimage,
GimpLayer *layer);
void gimage_set_layer_mask_edit (GImage *gimage,
GimpLayer *layer,
gboolean edit);
void gimage_set_layer_mask_show (GImage *gimage,
GimpLayer *layer);
extern guint32 next_guide_id;

View file

@ -553,7 +553,7 @@ gimage_mask_save (GImage *gimage)
{
GimpChannel *new_channel;
new_channel = gimp_channel_copy (gimp_image_get_mask (gimage));
new_channel = gimp_channel_copy (gimp_image_get_mask (gimage), TRUE);
/* saved selections are not visible by default */
gimp_drawable_set_visible (GIMP_DRAWABLE (new_channel), FALSE);

View file

@ -174,7 +174,13 @@ gimp_channel_new (GimpImage *gimage,
}
GimpChannel *
gimp_channel_copy (const GimpChannel *channel)
gimp_channel_copy (const GimpChannel *channel,
gboolean dummy) /* the dummy is for symmetry with
* gimp_layer_copy() because
* both functions are used as
* function pointers in
* GimpDrawableListView --Mitch
*/
{
gchar *channel_name;
GimpChannel *new_channel;

View file

@ -90,7 +90,8 @@ GimpChannel * gimp_channel_new (GimpImage *gimage,
gint height,
const gchar *name,
const GimpRGB *color);
GimpChannel * gimp_channel_copy (const GimpChannel *channel);
GimpChannel * gimp_channel_copy (const GimpChannel *channel,
gboolean dummy);
gint gimp_channel_get_opacity (const GimpChannel *channel);
void gimp_channel_set_opacity (GimpChannel *channel,

View file

@ -326,7 +326,7 @@ gimp_container_grid_view_set_preview_size (GimpContainerView *view)
preview = GIMP_PREVIEW (child->widget);
gimp_preview_set_size (preview, view->preview_size);
gimp_preview_set_size (preview, view->preview_size, preview->border_width);
}
gtk_widget_queue_resize (grid_view->wrap_box);

View file

@ -289,7 +289,7 @@ gimp_container_list_view_reorder_item (GimpContainerView *view,
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);
gimp_container_view_select_item (view, viewable);
gtk_object_unref (GTK_OBJECT (list_item));
}
@ -319,7 +319,7 @@ gimp_container_list_view_select_item (GimpContainerView *view,
adj = gtk_scrolled_window_get_vadjustment
(GTK_SCROLLED_WINDOW (list_view->scrolled_win));
item_height = list_item->allocation.height;
item_height = list_item->requisition.height;
index = gimp_container_get_child_index (view->container,
GIMP_OBJECT (viewable));
@ -330,6 +330,10 @@ gimp_container_list_view_select_item (GimpContainerView *view,
gtk_list_select_child (GTK_LIST (list_view->gtk_list), list_item);
gtk_signal_handler_unblock_by_func (GTK_OBJECT (list_view->gtk_list),
gimp_container_list_view_item_selected,
list_view);
if (index * item_height < adj->value)
{
gtk_adjustment_set_value (adj, index * item_height);
@ -339,10 +343,6 @@ gimp_container_list_view_select_item (GimpContainerView *view,
gtk_adjustment_set_value (adj,
(index + 1) * item_height - adj->page_size);
}
gtk_signal_handler_unblock_by_func (GTK_OBJECT (list_view->gtk_list),
gimp_container_list_view_item_selected,
list_view);
}
else
{
@ -379,7 +379,7 @@ gimp_container_list_view_set_preview_size (GimpContainerView *view)
preview = GIMP_PREVIEW (GIMP_LIST_ITEM (list->data)->preview);
gimp_preview_set_size (preview, view->preview_size);
gimp_preview_set_size (preview, view->preview_size, preview->border_width);
}
gtk_widget_queue_resize (list_view->gtk_list);

View file

@ -240,6 +240,8 @@ gimp_container_view_set_container (GimpContainerView *view,
if (view->container)
{
gimp_container_view_select_item (view, NULL);
gimp_container_view_clear_items (view);
gtk_signal_disconnect_by_func (GTK_OBJECT (view->container),

View file

@ -59,7 +59,8 @@
typedef enum
{
GIMP_DND_DATA_COLOR = 1,
GIMP_DND_DATA_NONE,
GIMP_DND_DATA_COLOR,
GIMP_DND_DATA_LAYER,
GIMP_DND_DATA_CHANNEL,
GIMP_DND_DATA_LAYER_MASK,
@ -686,222 +687,23 @@ gimp_dnd_get_viewable_icon (GtkWidget *widget,
return preview;
}
static const GtkTargetEntry layer_target_table[] =
static GimpDndDataType
gimp_dnd_data_type_get_by_gtk_type (GtkType type)
{
GIMP_TARGET_LAYER
};
static const guint layer_n_targets = (sizeof (layer_target_table) /
sizeof (layer_target_table[0]));
static const GtkTargetEntry channel_target_table[] =
{
GIMP_TARGET_CHANNEL
};
static const guint channel_n_targets = (sizeof (channel_target_table) /
sizeof (layer_target_table[0]));
static const GtkTargetEntry layer_mask_target_table[] =
{
GIMP_TARGET_LAYER_MASK
};
static const guint layer_mask_n_targets = (sizeof (layer_mask_target_table) /
sizeof (layer_mask_target_table[0]));
static const GtkTargetEntry brush_target_table[] =
{
GIMP_TARGET_BRUSH
};
static const guint brush_n_targets = (sizeof (brush_target_table) /
sizeof (brush_target_table[0]));
static const GtkTargetEntry pattern_target_table[] =
{
GIMP_TARGET_PATTERN
};
static const guint pattern_n_targets = (sizeof (pattern_target_table) /
sizeof (pattern_target_table[0]));
static const GtkTargetEntry gradient_target_table[] =
{
GIMP_TARGET_GRADIENT
};
static const guint gradient_n_targets = (sizeof (gradient_target_table) /
sizeof (gradient_target_table[0]));
static const GtkTargetEntry palette_target_table[] =
{
GIMP_TARGET_PALETTE
};
static const guint palette_n_targets = (sizeof (palette_target_table) /
sizeof (palette_target_table[0]));
static const GtkTargetEntry tool_target_table[] =
{
GIMP_TARGET_TOOL
};
static const guint tool_n_targets = (sizeof (tool_target_table) /
sizeof (tool_target_table[0]));
void
gimp_gtk_drag_source_set_by_type (GtkWidget *widget,
GdkModifierType start_button_mask,
GtkType type,
GdkDragAction actions)
{
const GtkTargetEntry *target_table = NULL;
guint n_targets = 0;
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_WIDGET (widget));
if (gtk_type_is_a (type, GIMP_TYPE_LAYER))
{
target_table = layer_target_table;
n_targets = layer_n_targets;
}
else if (gtk_type_is_a (type, GIMP_TYPE_CHANNEL))
{
target_table = channel_target_table;
n_targets = channel_n_targets;
}
else if (gtk_type_is_a (type, GIMP_TYPE_LAYER_MASK))
{
target_table = layer_mask_target_table;
n_targets = layer_mask_n_targets;
}
else if (gtk_type_is_a (type, GIMP_TYPE_BRUSH))
{
target_table = brush_target_table;
n_targets = brush_n_targets;
}
else if (gtk_type_is_a (type, GIMP_TYPE_PATTERN))
{
target_table = pattern_target_table;
n_targets = pattern_n_targets;
}
else if (gtk_type_is_a (type, GIMP_TYPE_GRADIENT))
{
target_table = gradient_target_table;
n_targets = gradient_n_targets;
}
else if (gtk_type_is_a (type, GIMP_TYPE_PALETTE))
{
target_table = palette_target_table;
n_targets = palette_n_targets;
}
else if (gtk_type_is_a (type, GIMP_TYPE_TOOL_INFO))
{
target_table = tool_target_table;
n_targets = tool_n_targets;
}
else
{
g_warning ("%s(): unsupported GtkType \"%s\"",
G_GNUC_FUNCTION, gtk_type_name (type));
}
if (target_table && n_targets)
{
gtk_drag_source_set (widget, start_button_mask,
target_table,
n_targets,
actions);
}
}
void
gimp_gtk_drag_dest_set_by_type (GtkWidget *widget,
GtkDestDefaults flags,
GtkType type,
GdkDragAction actions)
{
const GtkTargetEntry *target_table = NULL;
guint n_targets = 0;
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_WIDGET (widget));
if (gtk_type_is_a (type, GIMP_TYPE_LAYER))
{
target_table = layer_target_table;
n_targets = layer_n_targets;
}
else if (gtk_type_is_a (type, GIMP_TYPE_CHANNEL))
{
target_table = channel_target_table;
n_targets = channel_n_targets;
}
else if (gtk_type_is_a (type, GIMP_TYPE_LAYER_MASK))
{
target_table = layer_mask_target_table;
n_targets = layer_mask_n_targets;
}
else if (gtk_type_is_a (type, GIMP_TYPE_BRUSH))
{
target_table = brush_target_table;
n_targets = brush_n_targets;
}
else if (gtk_type_is_a (type, GIMP_TYPE_PATTERN))
{
target_table = pattern_target_table;
n_targets = pattern_n_targets;
}
else if (gtk_type_is_a (type, GIMP_TYPE_GRADIENT))
{
target_table = gradient_target_table;
n_targets = gradient_n_targets;
}
else if (gtk_type_is_a (type, GIMP_TYPE_PALETTE))
{
target_table = palette_target_table;
n_targets = palette_n_targets;
}
else if (gtk_type_is_a (type, GIMP_TYPE_TOOL_INFO))
{
target_table = tool_target_table;
n_targets = tool_n_targets;
}
else
{
g_warning ("%s(): unsupported GtkType \"%s\"",
G_GNUC_FUNCTION, gtk_type_name (type));
}
if (target_table && n_targets)
{
gtk_drag_dest_set (widget, flags,
target_table,
n_targets,
actions);
}
}
void
gimp_dnd_viewable_source_set (GtkWidget *widget,
GtkType type,
GimpDndDragViewableFunc get_viewable_func,
gpointer data)
{
GimpDndDataType dnd_type;
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_WIDGET (widget));
g_return_if_fail (get_viewable_func != NULL);
GimpDndDataType dnd_type = GIMP_DND_DATA_NONE;
if (gtk_type_is_a (type, GIMP_TYPE_LAYER))
{
dnd_type = GIMP_DND_DATA_LAYER;
}
else if (gtk_type_is_a (type, GIMP_TYPE_CHANNEL))
{
dnd_type = GIMP_DND_DATA_CHANNEL;
}
else if (gtk_type_is_a (type, GIMP_TYPE_LAYER_MASK))
{
dnd_type = GIMP_DND_DATA_LAYER_MASK;
}
else if (gtk_type_is_a (type, GIMP_TYPE_CHANNEL))
{
dnd_type = GIMP_DND_DATA_CHANNEL;
}
else if (gtk_type_is_a (type, GIMP_TYPE_BRUSH))
{
dnd_type = GIMP_DND_DATA_BRUSH;
@ -926,9 +728,72 @@ gimp_dnd_viewable_source_set (GtkWidget *widget,
{
g_warning ("%s(): unsupported GtkType \"%s\"",
G_GNUC_FUNCTION, gtk_type_name (type));
return;
}
return dnd_type;
}
void
gimp_gtk_drag_source_set_by_type (GtkWidget *widget,
GdkModifierType start_button_mask,
GtkType type,
GdkDragAction actions)
{
GimpDndDataType dnd_type;
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_WIDGET (widget));
dnd_type = gimp_dnd_data_type_get_by_gtk_type (type);
if (dnd_type == GIMP_DND_DATA_NONE)
return;
gtk_drag_source_set (widget, start_button_mask,
&dnd_data_defs[dnd_type].target_entry,
1,
actions);
}
void
gimp_gtk_drag_dest_set_by_type (GtkWidget *widget,
GtkDestDefaults flags,
GtkType type,
GdkDragAction actions)
{
GimpDndDataType dnd_type;
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_WIDGET (widget));
dnd_type = gimp_dnd_data_type_get_by_gtk_type (type);
if (dnd_type == GIMP_DND_DATA_NONE)
return;
gtk_drag_dest_set (widget, flags,
&dnd_data_defs[dnd_type].target_entry,
1,
actions);
}
void
gimp_dnd_viewable_source_set (GtkWidget *widget,
GtkType type,
GimpDndDragViewableFunc get_viewable_func,
gpointer data)
{
GimpDndDataType dnd_type;
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_WIDGET (widget));
g_return_if_fail (get_viewable_func != NULL);
dnd_type = gimp_dnd_data_type_get_by_gtk_type (type);
if (dnd_type == GIMP_DND_DATA_NONE)
return;
gimp_dnd_data_source_set (dnd_type, widget,
GTK_SIGNAL_FUNC (get_viewable_func),
data);
@ -943,44 +808,10 @@ gimp_dnd_viewable_source_unset (GtkWidget *widget,
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_WIDGET (widget));
if (gtk_type_is_a (type, GIMP_TYPE_LAYER))
{
dnd_type = GIMP_DND_DATA_LAYER;
}
else if (gtk_type_is_a (type, GIMP_TYPE_CHANNEL))
{
dnd_type = GIMP_DND_DATA_CHANNEL;
}
else if (gtk_type_is_a (type, GIMP_TYPE_LAYER_MASK))
{
dnd_type = GIMP_DND_DATA_LAYER_MASK;
}
else if (gtk_type_is_a (type, GIMP_TYPE_BRUSH))
{
dnd_type = GIMP_DND_DATA_BRUSH;
}
else if (gtk_type_is_a (type, GIMP_TYPE_PATTERN))
{
dnd_type = GIMP_DND_DATA_PATTERN;
}
else if (gtk_type_is_a (type, GIMP_TYPE_GRADIENT))
{
dnd_type = GIMP_DND_DATA_GRADIENT;
}
else if (gtk_type_is_a (type, GIMP_TYPE_PALETTE))
{
dnd_type = GIMP_DND_DATA_PALETTE;
}
else if (gtk_type_is_a (type, GIMP_TYPE_TOOL_INFO))
{
dnd_type = GIMP_DND_DATA_TOOL;
}
else
{
g_warning ("%s(): unsupported GtkType \"%s\"",
G_GNUC_FUNCTION, gtk_type_name (type));
return;
}
dnd_type = gimp_dnd_data_type_get_by_gtk_type (type);
if (dnd_type == GIMP_DND_DATA_NONE)
return;
gimp_dnd_data_source_unset (widget);
}
@ -997,44 +828,10 @@ gimp_dnd_viewable_dest_set (GtkWidget *widget,
g_return_if_fail (GTK_IS_WIDGET (widget));
g_return_if_fail (set_viewable_func != NULL);
if (gtk_type_is_a (type, GIMP_TYPE_LAYER))
{
dnd_type = GIMP_DND_DATA_LAYER;
}
else if (gtk_type_is_a (type, GIMP_TYPE_CHANNEL))
{
dnd_type = GIMP_DND_DATA_CHANNEL;
}
else if (gtk_type_is_a (type, GIMP_TYPE_LAYER_MASK))
{
dnd_type = GIMP_DND_DATA_LAYER_MASK;
}
else if (gtk_type_is_a (type, GIMP_TYPE_BRUSH))
{
dnd_type = GIMP_DND_DATA_BRUSH;
}
else if (gtk_type_is_a (type, GIMP_TYPE_PATTERN))
{
dnd_type = GIMP_DND_DATA_PATTERN;
}
else if (gtk_type_is_a (type, GIMP_TYPE_GRADIENT))
{
dnd_type = GIMP_DND_DATA_GRADIENT;
}
else if (gtk_type_is_a (type, GIMP_TYPE_PALETTE))
{
dnd_type = GIMP_DND_DATA_PALETTE;
}
else if (gtk_type_is_a (type, GIMP_TYPE_TOOL_INFO))
{
dnd_type = GIMP_DND_DATA_TOOL;
}
else
{
g_warning ("%s(): unsupported GtkType \"%s\"",
G_GNUC_FUNCTION, gtk_type_name (type));
return;
}
dnd_type = gimp_dnd_data_type_get_by_gtk_type (type);
if (dnd_type == GIMP_DND_DATA_NONE)
return;
gimp_dnd_data_dest_set (dnd_type, widget,
GTK_SIGNAL_FUNC (set_viewable_func),
@ -1047,44 +844,13 @@ gimp_dnd_viewable_dest_unset (GtkWidget *widget,
{
GimpDndDataType dnd_type;
if (gtk_type_is_a (type, GIMP_TYPE_LAYER))
{
dnd_type = GIMP_DND_DATA_LAYER;
}
else if (gtk_type_is_a (type, GIMP_TYPE_CHANNEL))
{
dnd_type = GIMP_DND_DATA_CHANNEL;
}
else if (gtk_type_is_a (type, GIMP_TYPE_LAYER_MASK))
{
dnd_type = GIMP_DND_DATA_LAYER_MASK;
}
else if (gtk_type_is_a (type, GIMP_TYPE_BRUSH))
{
dnd_type = GIMP_DND_DATA_BRUSH;
}
else if (gtk_type_is_a (type, GIMP_TYPE_PATTERN))
{
dnd_type = GIMP_DND_DATA_PATTERN;
}
else if (gtk_type_is_a (type, GIMP_TYPE_GRADIENT))
{
dnd_type = GIMP_DND_DATA_GRADIENT;
}
else if (gtk_type_is_a (type, GIMP_TYPE_PALETTE))
{
dnd_type = GIMP_DND_DATA_PALETTE;
}
else if (gtk_type_is_a (type, GIMP_TYPE_TOOL_INFO))
{
dnd_type = GIMP_DND_DATA_TOOL;
}
else
{
g_warning ("%s(): unsupported GtkType \"%s\"",
G_GNUC_FUNCTION, gtk_type_name (type));
return;
}
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_WIDGET (widget));
dnd_type = gimp_dnd_data_type_get_by_gtk_type (type);
if (dnd_type == GIMP_DND_DATA_NONE)
return;
gimp_dnd_data_dest_unset (dnd_type, widget);
}

View file

@ -648,7 +648,7 @@ duplicate (GimpImage *gimage)
{
channel = (GimpChannel *) list->data;
new_channel = gimp_channel_copy (channel);
new_channel = gimp_channel_copy (channel, TRUE);
gimp_drawable_set_gimage (GIMP_DRAWABLE (new_channel), new_gimage);

View file

@ -258,7 +258,8 @@ gimp_drawable_list_item_drag_drop (GtkWidget *widget,
{
gimp_image_position_channel (gimp_drawable_gimage (GIMP_DRAWABLE (src_viewable)),
GIMP_CHANNEL (src_viewable),
dest_index);
dest_index,
TRUE);
gdisplays_flush ();
}
}

View file

@ -25,6 +25,7 @@
#include "apptypes.h"
#include "gdisplay.h"
#include "gimpcontainer.h"
#include "gimpdrawable.h"
#include "gimpdrawablelistview.h"
@ -59,6 +60,8 @@ static void gimp_drawable_list_view_activate_item (GimpContainerView *v
GimpViewable *item,
gpointer insert_data);
static void gimp_drawable_list_view_new_drawable (GimpDrawableListView *view,
GimpDrawable *drawable);
static void gimp_drawable_list_view_new_clicked (GtkWidget *widget,
GimpDrawableListView *view);
static void gimp_drawable_list_view_new_dropped (GtkWidget *widget,
@ -68,16 +71,22 @@ static void gimp_drawable_list_view_raise_clicked (GtkWidget *w
GimpDrawableListView *view);
static void gimp_drawable_list_view_lower_clicked (GtkWidget *widget,
GimpDrawableListView *view);
static void gimp_drawable_list_view_duplicate_drawable (GimpDrawableListView *view,
GimpDrawable *drawable);
static void gimp_drawable_list_view_duplicate_clicked (GtkWidget *widget,
GimpDrawableListView *view);
static void gimp_drawable_list_view_duplicate_dropped (GtkWidget *widget,
GimpViewable *viewable,
gpointer drawable);
static void gimp_drawable_list_view_edit_drawable (GimpDrawableListView *view,
GimpDrawable *drawable);
static void gimp_drawable_list_view_edit_clicked (GtkWidget *widget,
GimpDrawableListView *view);
static void gimp_drawable_list_view_edit_dropped (GtkWidget *widget,
GimpViewable *viewable,
gpointer drawable);
static void gimp_drawable_list_view_delete_drawable (GimpDrawableListView *view,
GimpDrawable *drawable);
static void gimp_drawable_list_view_delete_clicked (GtkWidget *widget,
GimpDrawableListView *view);
static void gimp_drawable_list_view_delete_dropped (GtkWidget *widget,
@ -251,10 +260,12 @@ gimp_drawable_list_view_init (GimpDrawableListView *view)
gtk_container_add (GTK_CONTAINER (view->delete_button), pixmap);
gtk_widget_show (pixmap);
gtk_widget_set_sensitive (view->raise_button, FALSE);
gtk_widget_set_sensitive (view->lower_button, FALSE);
gtk_widget_set_sensitive (view->new_button, FALSE);
gtk_widget_set_sensitive (view->raise_button, FALSE);
gtk_widget_set_sensitive (view->lower_button, FALSE);
gtk_widget_set_sensitive (view->duplicate_button, FALSE);
gtk_widget_set_sensitive (view->delete_button, FALSE);
gtk_widget_set_sensitive (view->edit_button, FALSE);
gtk_widget_set_sensitive (view->delete_button, FALSE);
}
static void
@ -290,12 +301,16 @@ gimp_drawable_list_view_insert_item (GimpContainerView *view,
}
GtkWidget *
gimp_drawable_list_view_new (GimpImage *gimage,
GtkType drawable_type,
const gchar *signal_name,
GimpGetContainerFunc get_container_func,
GimpGetDrawableFunc get_drawable_func,
GimpSetDrawableFunc set_drawable_func)
gimp_drawable_list_view_new (GimpImage *gimage,
GtkType drawable_type,
const gchar *signal_name,
GimpGetContainerFunc get_container_func,
GimpGetDrawableFunc get_drawable_func,
GimpSetDrawableFunc set_drawable_func,
GimpReorderDrawableFunc reorder_drawable_func,
GimpAddDrawableFunc add_drawable_func,
GimpRemoveDrawableFunc remove_drawable_func,
GimpCopyDrawableFunc copy_drawable_func)
{
GimpDrawableListView *list_view;
GimpContainerView *view;
@ -305,6 +320,10 @@ gimp_drawable_list_view_new (GimpImage *gimage,
g_return_val_if_fail (get_container_func != NULL, NULL);
g_return_val_if_fail (get_drawable_func != NULL, NULL);
g_return_val_if_fail (get_drawable_func != NULL, NULL);
g_return_val_if_fail (reorder_drawable_func != NULL, NULL);
g_return_val_if_fail (add_drawable_func != NULL, NULL);
g_return_val_if_fail (remove_drawable_func != NULL, NULL);
g_return_val_if_fail (copy_drawable_func != NULL, NULL);
list_view = gtk_type_new (GIMP_TYPE_DRAWABLE_LIST_VIEW);
@ -312,11 +331,15 @@ gimp_drawable_list_view_new (GimpImage *gimage,
view->preview_size = preview_size;
list_view->drawable_type = drawable_type;
list_view->signal_name = g_strdup (signal_name);
list_view->get_container_func = get_container_func;
list_view->get_drawable_func = get_drawable_func;
list_view->set_drawable_func = set_drawable_func;
list_view->drawable_type = drawable_type;
list_view->signal_name = g_strdup (signal_name);
list_view->get_container_func = get_container_func;
list_view->get_drawable_func = get_drawable_func;
list_view->set_drawable_func = set_drawable_func;
list_view->reorder_drawable_func = reorder_drawable_func;
list_view->add_drawable_func = add_drawable_func;
list_view->remove_drawable_func = remove_drawable_func;
list_view->copy_drawable_func = copy_drawable_func;
/* drop to "new" */
gimp_gtk_drag_dest_set_by_type (GTK_WIDGET (list_view->new_button),
@ -398,6 +421,8 @@ gimp_drawable_list_view_set_image (GimpDrawableListView *view,
GTK_SIGNAL_FUNC (gimp_drawable_list_view_drawable_changed),
view);
}
gtk_widget_set_sensitive (view->new_button, (view->gimage != NULL));
}
static void
@ -405,12 +430,57 @@ gimp_drawable_list_view_select_item (GimpContainerView *view,
GimpViewable *item,
gpointer insert_data)
{
GimpDrawableListView *list_view;
gboolean raise_sensitive = FALSE;
gboolean lower_sensitive = FALSE;
gboolean duplicate_sensitive = FALSE;
gboolean edit_sensitive = FALSE;
gboolean delete_sensitive = FALSE;
list_view = GIMP_DRAWABLE_LIST_VIEW (view);
if (GIMP_CONTAINER_VIEW_CLASS (parent_class)->select_item)
GIMP_CONTAINER_VIEW_CLASS (parent_class)->select_item (view,
item,
insert_data);
g_print ("select item\n");
if (item)
{
GimpDrawable *drawable;
gint index;
drawable = list_view->get_drawable_func (list_view->gimage);
if (drawable != GIMP_DRAWABLE (item))
{
list_view->set_drawable_func (list_view->gimage,
GIMP_DRAWABLE (item));
gdisplays_flush ();
}
index = gimp_container_get_child_index (view->container,
GIMP_OBJECT (item));
if (view->container->num_children > 1)
{
if (index > 0)
raise_sensitive = TRUE;
if (index < (view->container->num_children - 1))
lower_sensitive = TRUE;
}
duplicate_sensitive = TRUE;
edit_sensitive = TRUE;
delete_sensitive = TRUE;
}
gtk_widget_set_sensitive (list_view->raise_button, raise_sensitive);
gtk_widget_set_sensitive (list_view->lower_button, lower_sensitive);
gtk_widget_set_sensitive (list_view->duplicate_button, duplicate_sensitive);
gtk_widget_set_sensitive (list_view->edit_button, edit_sensitive);
gtk_widget_set_sensitive (list_view->delete_button, delete_sensitive);
}
static void
@ -423,14 +493,25 @@ gimp_drawable_list_view_activate_item (GimpContainerView *view,
item,
insert_data);
g_print ("activate item\n");
gimp_drawable_list_view_edit_drawable (GIMP_DRAWABLE_LIST_VIEW (view),
GIMP_DRAWABLE (item));
}
static void
gimp_drawable_list_view_new_drawable (GimpDrawableListView *view,
GimpDrawable *drawable)
{
if (drawable)
g_print ("new with \"%s\"'s properties\n", GIMP_OBJECT (drawable)->name);
else
g_print ("new default\n");
}
static void
gimp_drawable_list_view_new_clicked (GtkWidget *widget,
GimpDrawableListView *view)
{
g_print ("new clicked\n");
gimp_drawable_list_view_new_drawable (view, NULL);
}
static void
@ -442,19 +523,34 @@ gimp_drawable_list_view_new_dropped (GtkWidget *widget,
view = (GimpDrawableListView *) data;
g_print ("new dropped\n");
if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container,
GIMP_OBJECT (viewable)))
{
gimp_drawable_list_view_new_drawable (view, GIMP_DRAWABLE (viewable));
}
}
static void
gimp_drawable_list_view_duplicate_drawable (GimpDrawableListView *view,
GimpDrawable *drawable)
{
GimpDrawable *new_drawable;
new_drawable = view->copy_drawable_func (drawable, TRUE);
view->add_drawable_func (view->gimage, new_drawable, -1);
gdisplays_flush ();
}
static void
gimp_drawable_list_view_duplicate_clicked (GtkWidget *widget,
GimpDrawableListView *view)
{
g_print ("duplicate clicked\n");
GimpDrawable *drawable;
drawable = view->get_drawable_func (view->gimage);
gimp_drawable_list_view_duplicate_drawable (view, drawable);
}
static void
@ -466,12 +562,11 @@ gimp_drawable_list_view_duplicate_dropped (GtkWidget *widget,
view = (GimpDrawableListView *) data;
g_print ("duplicate dropped\n");
if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container,
GIMP_OBJECT (viewable)))
{
gimp_drawable_list_view_duplicate_clicked (NULL, data);
gimp_drawable_list_view_duplicate_drawable (view,
GIMP_DRAWABLE (viewable));
}
}
@ -479,21 +574,60 @@ static void
gimp_drawable_list_view_raise_clicked (GtkWidget *widget,
GimpDrawableListView *view)
{
g_print ("raise clicked\n");
GimpContainer *container;
GimpDrawable *drawable;
gint index;
container = GIMP_CONTAINER_VIEW (view)->container;
drawable = view->get_drawable_func (view->gimage);
index = gimp_container_get_child_index (container, GIMP_OBJECT (drawable));
if (index > 0)
{
view->reorder_drawable_func (view->gimage, drawable, index - 1, TRUE);
gdisplays_flush ();
}
}
static void
gimp_drawable_list_view_lower_clicked (GtkWidget *widget,
GimpDrawableListView *view)
{
g_print ("lower clicked\n");
GimpContainer *container;
GimpDrawable *drawable;
gint index;
container = GIMP_CONTAINER_VIEW (view)->container;
drawable = view->get_drawable_func (view->gimage);
index = gimp_container_get_child_index (container, GIMP_OBJECT (drawable));
if (index < container->num_children - 1)
{
view->reorder_drawable_func (view->gimage, drawable, index + 1, TRUE);
gdisplays_flush ();
}
}
static void
gimp_drawable_list_view_edit_drawable (GimpDrawableListView *view,
GimpDrawable *drawable)
{
g_print ("edit \"%s\"\n", GIMP_OBJECT (drawable)->name);
}
static void
gimp_drawable_list_view_edit_clicked (GtkWidget *widget,
GimpDrawableListView *view)
{
g_print ("edit clicked\n");
GimpDrawable *drawable;
drawable = view->get_drawable_func (view->gimage);
gimp_drawable_list_view_edit_drawable (view, drawable);
}
static void
@ -505,20 +639,31 @@ gimp_drawable_list_view_edit_dropped (GtkWidget *widget,
view = (GimpDrawableListView *) data;
g_print ("edit dropped\n");
if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container,
GIMP_OBJECT (viewable)))
{
gimp_drawable_list_view_edit_clicked (NULL, data);
gimp_drawable_list_view_edit_drawable (view, GIMP_DRAWABLE (viewable));
}
}
static void
gimp_drawable_list_view_delete_drawable (GimpDrawableListView *view,
GimpDrawable *drawable)
{
view->remove_drawable_func (view->gimage, drawable);
gdisplays_flush ();
}
static void
gimp_drawable_list_view_delete_clicked (GtkWidget *widget,
GimpDrawableListView *view)
{
g_print ("delete clicked\n");
GimpDrawable *drawable;
drawable = view->get_drawable_func (view->gimage);
gimp_drawable_list_view_delete_drawable (view, drawable);
}
static void
@ -530,12 +675,10 @@ gimp_drawable_list_view_delete_dropped (GtkWidget *widget,
view = (GimpDrawableListView *) data;
g_print ("delete dropped\n");
if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container,
GIMP_OBJECT (viewable)))
{
gimp_drawable_list_view_delete_clicked (NULL, data);
gimp_drawable_list_view_delete_drawable (view, GIMP_DRAWABLE (viewable));
}
}

View file

@ -23,10 +23,21 @@
#include "gimpcontainerlistview.h"
typedef GimpContainer * (* GimpGetContainerFunc) (const GimpImage *gimage);
typedef GimpDrawable * (* GimpGetDrawableFunc) (const GimpImage *gimage);
typedef void (* GimpSetDrawableFunc) (GimpImage *gimage,
GimpDrawable *drawable);
typedef GimpContainer * (* GimpGetContainerFunc) (const GimpImage *gimage);
typedef GimpDrawable * (* GimpGetDrawableFunc) (const GimpImage *gimage);
typedef void (* GimpSetDrawableFunc) (GimpImage *gimage,
GimpDrawable *drawable);
typedef void (* GimpReorderDrawableFunc) (GimpImage *gimage,
GimpDrawable *drawable,
gint new_index,
gboolean push_undo);
typedef void (* GimpAddDrawableFunc) (GimpImage *gimage,
GimpDrawable *drawable,
gint index);
typedef void (* GimpRemoveDrawableFunc) (GimpImage *gimage,
GimpDrawable *drawable);
typedef GimpDrawable * (* GimpCopyDrawableFunc) (GimpDrawable *drawable,
gboolean add_alpha);
#define GIMP_TYPE_DRAWABLE_LIST_VIEW (gimp_drawable_list_view_get_type ())
@ -40,25 +51,29 @@ typedef struct _GimpDrawableListViewClass GimpDrawableListViewClass;
struct _GimpDrawableListView
{
GimpContainerListView parent_instance;
GimpContainerListView parent_instance;
GimpImage *gimage;
GimpImage *gimage;
GtkType drawable_type;
gchar *signal_name;
GtkType drawable_type;
gchar *signal_name;
GimpGetContainerFunc get_container_func;
GimpGetDrawableFunc get_drawable_func;
GimpSetDrawableFunc set_drawable_func;
GimpGetContainerFunc get_container_func;
GimpGetDrawableFunc get_drawable_func;
GimpSetDrawableFunc set_drawable_func;
GimpReorderDrawableFunc reorder_drawable_func;
GimpAddDrawableFunc add_drawable_func;
GimpRemoveDrawableFunc remove_drawable_func;
GimpCopyDrawableFunc copy_drawable_func;
GtkWidget *button_box;
GtkWidget *button_box;
GtkWidget *new_button;
GtkWidget *raise_button;
GtkWidget *lower_button;
GtkWidget *duplicate_button;
GtkWidget *edit_button;
GtkWidget *delete_button;
GtkWidget *new_button;
GtkWidget *raise_button;
GtkWidget *lower_button;
GtkWidget *duplicate_button;
GtkWidget *edit_button;
GtkWidget *delete_button;
};
struct _GimpDrawableListViewClass
@ -69,12 +84,16 @@ struct _GimpDrawableListViewClass
GtkType gimp_drawable_list_view_get_type (void);
GtkWidget * gimp_drawable_list_view_new (GimpImage *gimage,
GtkType drawable_type,
const gchar *signal_name,
GimpGetContainerFunc get_container_func,
GimpGetDrawableFunc get_drawable_func,
GimpSetDrawableFunc set_drawable_func);
GtkWidget * gimp_drawable_list_view_new (GimpImage *gimage,
GtkType drawable_type,
const gchar *signal_name,
GimpGetContainerFunc get_container_func,
GimpGetDrawableFunc get_drawable_func,
GimpSetDrawableFunc set_drawable_func,
GimpReorderDrawableFunc reorder_drawable_func,
GimpAddDrawableFunc add_drawable_func,
GimpRemoveDrawableFunc remove_drawable_func,
GimpCopyDrawableFunc copy_drawable_func);
void gimp_drawable_list_view_set_image (GimpDrawableListView *view,
GimpImage *gimage);

View file

@ -648,7 +648,7 @@ duplicate (GimpImage *gimage)
{
channel = (GimpChannel *) list->data;
new_channel = gimp_channel_copy (channel);
new_channel = gimp_channel_copy (channel, TRUE);
gimp_drawable_set_gimage (GIMP_DRAWABLE (new_channel), new_gimage);

View file

@ -1727,7 +1727,7 @@ gimp_image_construct_layers (GimpImage *gimage,
TRUE);
/* If we're showing the layer mask instead of the layer... */
if (layer->mask && layer->show_mask)
if (layer->mask && layer->mask->show_mask)
{
pixel_region_init (&src2PR,
gimp_drawable_data (GIMP_DRAWABLE (layer->mask)),
@ -1744,7 +1744,7 @@ gimp_image_construct_layers (GimpImage *gimage,
(x1 - off_x), (y1 - off_y),
(x2 - x1), (y2 - y1), FALSE);
if (layer->mask && layer->apply_mask)
if (layer->mask && layer->mask->apply_mask)
{
pixel_region_init (&maskPR,
gimp_drawable_data (GIMP_DRAWABLE (layer->mask)),
@ -3091,7 +3091,7 @@ gimp_image_merge_layers (GimpImage *gimage,
(x4 - x3), (y4 - y3),
FALSE);
if (layer->mask && layer->apply_mask)
if (layer->mask && layer->mask->apply_mask)
{
pixel_region_init (&maskPR,
gimp_drawable_data (GIMP_DRAWABLE (layer->mask)),
@ -3336,7 +3336,7 @@ gimp_image_raise_channel (GimpImage *gimage,
return FALSE;
}
return gimp_image_position_channel (gimage, channel, index - 1);
return gimp_image_position_channel (gimage, channel, index - 1, TRUE);
}
gboolean
@ -3359,13 +3359,14 @@ gimp_image_lower_channel (GimpImage *gimage,
return FALSE;
}
return gimp_image_position_channel (gimage, channel, index + 1);
return gimp_image_position_channel (gimage, channel, index + 1, TRUE);
}
gboolean
gimp_image_position_channel (GimpImage *gimage,
GimpChannel *channel,
gint new_index)
gint new_index,
gboolean push_undo /* FIXME unused */)
{
gint index;
gint num_channels;
@ -3383,11 +3384,7 @@ gimp_image_position_channel (GimpImage *gimage,
num_channels = gimp_container_num_children (gimage->channels);
if (new_index < 0)
new_index = 0;
if (new_index >= num_channels)
new_index = num_channels - 1;
new_index = CLAMP (new_index, 0, num_channels - 1);
if (new_index == index)
return TRUE;
@ -3530,7 +3527,7 @@ gimp_image_active_drawable (const GimpImage *gimage)
layer = gimage->active_layer;
if (layer->mask && layer->edit_mask)
if (layer->mask && layer->mask->edit_mask)
return GIMP_DRAWABLE (layer->mask);
else
return GIMP_DRAWABLE (layer);
@ -3941,7 +3938,7 @@ gimp_image_get_new_preview (GimpViewable *viewable,
src2PR.data = temp_buf_data (layer_buf) +
(y1 - y) * src2PR.rowstride + (x1 - x) * src2PR.bytes;
if (layer->mask && layer->apply_mask)
if (layer->mask && layer->mask->apply_mask)
{
mask_buf = gimp_viewable_get_preview (GIMP_VIEWABLE (layer->mask),
w, h);

View file

@ -367,7 +367,8 @@ gboolean gimp_image_lower_channel (GimpImage *gimage,
GimpChannel *channel);
gboolean gimp_image_position_channel (GimpImage *gimage,
GimpChannel *channel,
gint position);
gint new_index,
gboolean push_undo);
gboolean gimp_image_add_channel (GimpImage *gimage,
GimpChannel *channel,
gint position);

View file

@ -138,9 +138,6 @@ gimp_layer_init (GimpLayer *layer)
layer->preserve_trans = FALSE;
layer->mask = NULL;
layer->apply_mask = FALSE;
layer->edit_mask = FALSE;
layer->show_mask = FALSE;
layer->opacity = 100;
layer->mode = NORMAL_MODE;
@ -350,15 +347,11 @@ gimp_layer_copy (GimpLayer *layer,
/* duplicate the layer mask if necessary */
if (layer->mask)
{
new_layer->mask = gimp_layer_mask_copy (layer->mask);
new_layer->mask = gimp_layer_mask_copy (layer->mask);
gtk_object_ref (GTK_OBJECT (new_layer->mask));
gtk_object_sink (GTK_OBJECT (new_layer->mask));
new_layer->apply_mask = layer->apply_mask;
new_layer->edit_mask = layer->edit_mask;
new_layer->show_mask = layer->show_mask;
gimp_layer_mask_set_layer (new_layer->mask, new_layer);
}
@ -501,11 +494,6 @@ gimp_layer_add_mask (GimpLayer *layer,
gimp_layer_mask_set_layer (mask, layer);
/* Set the application mode in the layer to "apply" */
layer->apply_mask = TRUE;
layer->edit_mask = TRUE;
layer->show_mask = FALSE;
drawable_update (GIMP_DRAWABLE (layer),
0, 0,
GIMP_DRAWABLE (layer)->width,
@ -514,12 +502,9 @@ gimp_layer_add_mask (GimpLayer *layer,
if (push_undo)
{
/* Prepare a layer undo and push it */
lmu = g_new (LayerMaskUndo, 1);
lmu->layer = layer;
lmu->mask = mask;
lmu->apply_mask = layer->apply_mask;
lmu->edit_mask = layer->edit_mask;
lmu->show_mask = layer->show_mask;
lmu = g_new0 (LayerMaskUndo, 1);
lmu->layer = layer;
lmu->mask = mask;
undo_push_layer_mask (gimage, LAYER_MASK_ADD_UNDO, lmu);
}
@ -673,14 +658,11 @@ gimp_layer_apply_mask (GimpLayer *layer,
lmu->layer = layer;
lmu->mask = layer->mask;
lmu->mode = mode;
lmu->apply_mask = layer->apply_mask;
lmu->edit_mask = layer->edit_mask;
lmu->show_mask = layer->show_mask;
}
/* check if applying the mask changes the projection */
if ((mode == APPLY && (!layer->apply_mask || layer->show_mask)) ||
(mode == DISCARD && ( layer->apply_mask || layer->show_mask)))
if ((mode == APPLY && (!layer->mask->apply_mask || layer->mask->show_mask)) ||
(mode == DISCARD && ( layer->mask->apply_mask || layer->mask->show_mask)))
{
view_changed = TRUE;
}
@ -713,10 +695,7 @@ gimp_layer_apply_mask (GimpLayer *layer,
GIMP_DRAWABLE (layer)->preview_valid = FALSE;
}
layer->mask = NULL;
layer->apply_mask = FALSE;
layer->edit_mask = FALSE;
layer->show_mask = FALSE;
layer->mask = NULL;
if (push_undo)
{

View file

@ -40,9 +40,6 @@ struct _GimpLayer
gboolean preserve_trans; /* preserve transparency */
GimpLayerMask *mask; /* possible layer mask */
gint apply_mask; /* controls mask application */
gboolean edit_mask; /* edit mask or layer? */
gboolean show_mask; /* show mask or layer? */
gint opacity; /* layer opacity */
LayerModeEffects mode; /* layer combination mode */

View file

@ -35,6 +35,7 @@
#include "gimplayerlistitem.h"
#include "gimpimage.h"
#include "gimplayer.h"
#include "gimplayermask.h"
#include "gimppreview.h"
#include "gimpviewable.h"
@ -55,8 +56,12 @@ static gboolean gimp_layer_list_item_drag_drop (GtkWidget *widget,
gint x,
gint y,
guint time);
static void gimp_layer_list_item_state_changed (GtkWidget *widget,
GtkStateType old_state);
static void gimp_layer_list_item_mask_changed (GimpLayer *layer,
GimpLayerListItem *layer_item);
static void gimp_layer_list_item_update_state (GtkWidget *widget);
static GimpDrawableListItemClass *parent_class = NULL;
@ -103,6 +108,7 @@ gimp_layer_list_item_class_init (GimpLayerListItemClass *klass)
widget_class->drag_motion = gimp_layer_list_item_drag_motion;
widget_class->drag_drop = gimp_layer_list_item_drag_drop;
widget_class->state_changed = gimp_layer_list_item_state_changed;
list_item_class->set_viewable = gimp_layer_list_item_set_viewable;
}
@ -123,6 +129,9 @@ gimp_layer_list_item_set_viewable (GimpListItem *list_item,
if (GIMP_LIST_ITEM_CLASS (parent_class)->set_viewable)
GIMP_LIST_ITEM_CLASS (parent_class)->set_viewable (list_item, viewable);
gimp_preview_set_size (GIMP_PREVIEW (list_item->preview),
list_item->preview_size, 2);
layer_item = GIMP_LAYER_LIST_ITEM (list_item);
layer = GIMP_LAYER (GIMP_PREVIEW (list_item->preview)->viewable);
@ -225,6 +234,16 @@ gimp_layer_list_item_drag_drop (GtkWidget *widget,
return return_val;
}
static void
gimp_layer_list_item_state_changed (GtkWidget *widget,
GtkStateType old_state)
{
if (GTK_WIDGET_CLASS (parent_class)->state_changed)
GTK_WIDGET_CLASS (parent_class)->state_changed (widget, old_state);
gimp_layer_list_item_update_state (widget);
}
static void
gimp_layer_list_item_mask_changed (GimpLayer *layer,
GimpLayerListItem *layer_item)
@ -239,18 +258,104 @@ gimp_layer_list_item_mask_changed (GimpLayer *layer,
{
layer_item->mask_preview = gimp_preview_new (GIMP_VIEWABLE (mask),
list_item->preview_size,
1, FALSE);
2, FALSE);
GIMP_PREVIEW (layer_item->mask_preview)->clickable = TRUE;
gtk_box_pack_start (GTK_BOX (list_item->hbox), layer_item->mask_preview,
FALSE, FALSE, 0);
gtk_box_reorder_child (GTK_BOX (list_item->hbox),
layer_item->mask_preview, 2);
gtk_widget_show (layer_item->mask_preview);
gtk_signal_connect_object
(GTK_OBJECT (mask), "apply_changed",
GTK_SIGNAL_FUNC (gimp_layer_list_item_update_state),
GTK_OBJECT (layer_item));
gtk_signal_connect_object_while_alive
(GTK_OBJECT (mask), "edit_changed",
GTK_SIGNAL_FUNC (gimp_layer_list_item_update_state),
GTK_OBJECT (layer_item));
gtk_signal_connect_object_while_alive
(GTK_OBJECT (mask), "show_changed",
GTK_SIGNAL_FUNC (gimp_layer_list_item_update_state),
GTK_OBJECT (layer_item));
}
else if (! mask && layer_item->mask_preview)
{
gtk_widget_destroy (layer_item->mask_preview);
layer_item->mask_preview = NULL;
}
gimp_layer_list_item_update_state (GTK_WIDGET (layer_item));
}
static void
gimp_layer_list_item_update_state (GtkWidget *widget)
{
GimpLayerListItem *layer_item;
GimpListItem *list_item;
GimpLayer *layer;
GimpLayerMask *mask;
GimpPreview *preview;
guchar layer_color[3] = { 0, 0, 0 };
guchar mask_color[3] = { 0, 0, 0 };
layer_item = GIMP_LAYER_LIST_ITEM (widget);
list_item = GIMP_LIST_ITEM (widget);
layer = GIMP_LAYER (GIMP_PREVIEW (list_item->preview)->viewable);
mask = gimp_layer_get_mask (layer);
switch (widget->state)
{
case GTK_STATE_NORMAL:
break;
case GTK_STATE_SELECTED:
if (! mask || (mask && ! gimp_layer_mask_get_edit (mask)))
{
layer_color[0] = 255;
layer_color[1] = 255;
layer_color[2] = 255;
}
else
{
mask_color[0] = 255;
mask_color[1] = 255;
mask_color[2] = 255;
}
break;
default:
g_print ("%s(): unhandled state\n", G_GNUC_FUNCTION);
}
preview = GIMP_PREVIEW (list_item->preview);
if (preview->border_color[0] != layer_color[0] ||
preview->border_color[1] != layer_color[1] ||
preview->border_color[2] != layer_color[2])
{
preview->border_color[0] = layer_color[0];
preview->border_color[1] = layer_color[1];
preview->border_color[2] = layer_color[2];
gimp_preview_render (preview);
}
if (mask)
{
preview = GIMP_PREVIEW (layer_item->mask_preview);
if (preview->border_color[0] != mask_color[0] ||
preview->border_color[1] != mask_color[1] ||
preview->border_color[2] != mask_color[2])
{
preview->border_color[0] = mask_color[0];
preview->border_color[1] = mask_color[1];
preview->border_color[2] = mask_color[2];
gimp_preview_render (preview);
}
}
}

View file

@ -28,6 +28,7 @@
#include "apptypes.h"
#include "boundary.h"
#include "drawable.h"
#include "gimplayermask.h"
#include "paint_funcs.h"
#include "pixel_region.h"
@ -41,12 +42,23 @@
#include "libgimp/gimpintl.h"
enum
{
APPLY_CHANGED,
EDIT_CHANGED,
SHOW_CHANGED,
LAST_SIGNAL
};
static void gimp_layer_mask_class_init (GimpLayerMaskClass *klass);
static void gimp_layer_mask_init (GimpLayerMask *layermask);
static void gimp_layer_mask_destroy (GtkObject *object);
static GimpChannelClass *parent_class = NULL;
static guint layer_mask_signals[LAST_SIGNAL] = { 0 };
static GimpChannelClass *parent_class = NULL;
GtkType
@ -83,9 +95,34 @@ gimp_layer_mask_class_init (GimpLayerMaskClass *klass)
parent_class = gtk_type_class (GIMP_TYPE_CHANNEL);
/*
layer_mask_signals[APPLY_CHANGED] =
gtk_signal_new ("apply_changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (GimpLayerMaskClass,
apply_changed),
gtk_signal_default_marshaller,
GTK_TYPE_NONE, 0);
layer_mask_signals[EDIT_CHANGED] =
gtk_signal_new ("edit_changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (GimpLayerMaskClass,
edit_changed),
gtk_signal_default_marshaller,
GTK_TYPE_NONE, 0);
layer_mask_signals[SHOW_CHANGED] =
gtk_signal_new ("show_changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (GimpLayerMaskClass,
show_changed),
gtk_signal_default_marshaller,
GTK_TYPE_NONE, 0);
gtk_object_class_add_signals (object_class, layer_mask_signals, LAST_SIGNAL);
*/
object_class->destroy = gimp_layer_mask_destroy;
}
@ -93,7 +130,11 @@ gimp_layer_mask_class_init (GimpLayerMaskClass *klass)
static void
gimp_layer_mask_init (GimpLayerMask *layer_mask)
{
layer_mask->layer = NULL;
layer_mask->layer = NULL;
layer_mask->apply_mask = TRUE;
layer_mask->edit_mask = TRUE;
layer_mask->show_mask = FALSE;
}
static void
@ -163,14 +204,15 @@ gimp_layer_mask_copy (GimpLayerMask *layer_mask)
GIMP_DRAWABLE (layer_mask)->height,
layer_mask_name,
&GIMP_CHANNEL (layer_mask)->color);
GIMP_DRAWABLE(new_layer_mask)->visible =
GIMP_DRAWABLE(layer_mask)->visible;
GIMP_DRAWABLE(new_layer_mask)->offset_x =
GIMP_DRAWABLE(layer_mask)->offset_x;
GIMP_DRAWABLE(new_layer_mask)->offset_y =
GIMP_DRAWABLE(layer_mask)->offset_y;
GIMP_CHANNEL(new_layer_mask)->show_masked =
GIMP_CHANNEL(layer_mask)->show_masked;
GIMP_DRAWABLE (new_layer_mask)->visible = GIMP_DRAWABLE (layer_mask)->visible;
GIMP_DRAWABLE (new_layer_mask)->offset_x = GIMP_DRAWABLE (layer_mask)->offset_x;
GIMP_DRAWABLE (new_layer_mask)->offset_y = GIMP_DRAWABLE (layer_mask)->offset_y;
GIMP_CHANNEL (new_layer_mask)->show_masked = GIMP_CHANNEL (layer_mask)->show_masked;
new_layer_mask->apply_mask = layer_mask->apply_mask;
new_layer_mask->edit_mask = layer_mask->edit_mask;
new_layer_mask->show_mask = layer_mask->show_mask;
/* copy the contents across layer masks */
pixel_region_init (&srcPR, GIMP_DRAWABLE (layer_mask)->tiles,
@ -203,3 +245,102 @@ gimp_layer_mask_get_layer (GimpLayerMask *mask)
{
return mask->layer;
}
void
gimp_layer_mask_set_apply (GimpLayerMask *layer_mask,
gboolean apply)
{
g_return_if_fail (layer_mask != NULL);
g_return_if_fail (GIMP_IS_LAYER_MASK (layer_mask));
if (layer_mask->apply_mask != apply)
{
layer_mask->apply_mask = apply;
if (layer_mask->layer)
{
GimpDrawable *drawable;
drawable = GIMP_DRAWABLE (layer_mask->layer);
drawable_update (drawable,
0, 0,
gimp_drawable_width (drawable),
gimp_drawable_height (drawable));
}
gtk_signal_emit (GTK_OBJECT (layer_mask),
layer_mask_signals[APPLY_CHANGED]);
}
}
gboolean
gimp_layer_mask_get_apply (GimpLayerMask *layer_mask)
{
g_return_val_if_fail (layer_mask != NULL, FALSE);
g_return_val_if_fail (GIMP_IS_LAYER_MASK (layer_mask), FALSE);
return layer_mask->apply_mask;
}
void
gimp_layer_mask_set_edit (GimpLayerMask *layer_mask,
gboolean edit)
{
g_return_if_fail (layer_mask != NULL);
g_return_if_fail (GIMP_IS_LAYER_MASK (layer_mask));
if (layer_mask->edit_mask != edit)
{
layer_mask->edit_mask = edit;
gtk_signal_emit (GTK_OBJECT (layer_mask),
layer_mask_signals[EDIT_CHANGED]);
}
}
gboolean
gimp_layer_mask_get_edit (GimpLayerMask *layer_mask)
{
g_return_val_if_fail (layer_mask != NULL, FALSE);
g_return_val_if_fail (GIMP_IS_LAYER_MASK (layer_mask), FALSE);
return layer_mask->edit_mask;
}
void
gimp_layer_mask_set_show (GimpLayerMask *layer_mask,
gboolean show)
{
g_return_if_fail (layer_mask != NULL);
g_return_if_fail (GIMP_IS_LAYER_MASK (layer_mask));
if (layer_mask->show_mask != show)
{
layer_mask->show_mask = show;
if (layer_mask->layer)
{
GimpDrawable *drawable;
drawable = GIMP_DRAWABLE (layer_mask->layer);
drawable_update (drawable,
0, 0,
gimp_drawable_width (drawable),
gimp_drawable_height (drawable));
}
gtk_signal_emit (GTK_OBJECT (layer_mask),
layer_mask_signals[SHOW_CHANGED]);
}
}
gboolean
gimp_layer_mask_get_show (GimpLayerMask *layer_mask)
{
g_return_val_if_fail (layer_mask != NULL, FALSE);
g_return_val_if_fail (GIMP_IS_LAYER_MASK (layer_mask), FALSE);
return layer_mask->show_mask;
}

View file

@ -37,11 +37,19 @@ struct _GimpLayerMask
GimpChannel parent_instance;
GimpLayer *layer;
gboolean apply_mask; /* controls mask application */
gboolean edit_mask; /* edit mask or layer? */
gboolean show_mask; /* show mask or layer? */
};
struct _GimpLayerMaskClass
{
GimpChannelClass parent_class;
void (* apply_changed) (GimpLayerMask *layer_mask);
void (* edit_changed) (GimpLayerMask *layer_mask);
void (* show_changed) (GimpLayerMask *layer_mask);
};
@ -49,12 +57,9 @@ struct _GimpLayerMaskClass
struct _LayerMaskUndo
{
GimpLayer *layer; /* the layer */
gboolean apply_mask; /* apply mask? */
gboolean edit_mask; /* edit mask or layer? */
gboolean show_mask; /* show the mask? */
GimpLayerMask *mask; /* the layer mask */
gint mode; /* the application mode */
GimpLayer *layer; /* the layer */
GimpLayerMask *mask; /* the layer mask */
gint mode; /* the application mode */
};
@ -73,5 +78,17 @@ void gimp_layer_mask_set_layer (GimpLayerMask *layer_mask,
GimpLayer *layer);
GimpLayer * gimp_layer_mask_get_layer (GimpLayerMask *layer_mask);
void gimp_layer_mask_set_apply (GimpLayerMask *layer_mask,
gboolean apply);
gboolean gimp_layer_mask_get_apply (GimpLayerMask *layer_mask);
void gimp_layer_mask_set_edit (GimpLayerMask *layer_mask,
gboolean apply);
gboolean gimp_layer_mask_get_edit (GimpLayerMask *layer_mask);
void gimp_layer_mask_set_show (GimpLayerMask *layer_mask,
gboolean show);
gboolean gimp_layer_mask_get_show (GimpLayerMask *layer_mask);
#endif /* __GIMP_LAYER_MASK_H__ */

View file

@ -137,7 +137,7 @@ gimp_list_item_class_init (GimpListItemClass *klass)
static void
gimp_list_item_init (GimpListItem *list_item)
{
list_item->hbox = gtk_hbox_new (FALSE, 8);
list_item->hbox = gtk_hbox_new (FALSE, 6);
gtk_container_set_border_width (GTK_CONTAINER (list_item->hbox), 2);
gtk_container_add (GTK_CONTAINER (list_item), list_item->hbox);
gtk_widget_show (list_item->hbox);

View file

@ -411,20 +411,22 @@ gimp_preview_new_full (GimpViewable *viewable,
void
gimp_preview_set_size (GimpPreview *preview,
gint preview_size)
gint preview_size,
gint border_width)
{
gint width, height;
g_return_if_fail (preview != NULL);
g_return_if_fail (GIMP_IS_PREVIEW (preview));
g_return_if_fail (preview_size > 0 && preview_size <= 256);
g_return_if_fail (border_width >= 0 && border_width <= 16);
gimp_preview_get_size (preview, preview_size, &width, &height);
gimp_preview_set_size_full (preview,
width,
height,
preview->border_width);
border_width);
}
void

View file

@ -95,7 +95,8 @@ GtkWidget * gimp_preview_new_full (GimpViewable *viewable,
gboolean show_popup);
void gimp_preview_set_size (GimpPreview *preview,
gint size);
gint size,
gint border_width);
void gimp_preview_set_size_full (GimpPreview *preview,
gint width,
gint height,

View file

@ -1076,7 +1076,7 @@ channels_dialog_duplicate_channel_callback (GtkWidget *widget,
if ((active_channel = gimp_image_get_active_channel (gimage)))
{
new_channel = gimp_channel_copy (active_channel);
new_channel = gimp_channel_copy (active_channel, TRUE);
gimp_image_add_channel (gimage, new_channel, -1);
gdisplays_flush ();
}
@ -1129,7 +1129,7 @@ channels_dialog_add_channel_to_sel_callback (GtkWidget *widget,
if ((active_channel = gimp_image_get_active_channel (gimage)))
{
new_channel = gimp_channel_copy (gimp_image_get_mask (gimage));
new_channel = gimp_channel_copy (gimp_image_get_mask (gimage), TRUE);
gimp_channel_combine_mask (new_channel,
active_channel,
CHANNEL_OP_ADD,
@ -1153,7 +1153,7 @@ channels_dialog_sub_channel_from_sel_callback (GtkWidget *widget,
if ((active_channel = gimp_image_get_active_channel (gimage)))
{
new_channel = gimp_channel_copy (gimp_image_get_mask (gimage));
new_channel = gimp_channel_copy (gimp_image_get_mask (gimage), TRUE);
gimp_channel_combine_mask (new_channel,
active_channel,
CHANNEL_OP_SUB,
@ -1177,7 +1177,7 @@ channels_dialog_intersect_channel_with_sel_callback (GtkWidget *widget,
if ((active_channel = gimp_image_get_active_channel (gimage)))
{
new_channel = gimp_channel_copy (gimp_image_get_mask (gimage));
new_channel = gimp_channel_copy (gimp_image_get_mask (gimage), TRUE);
gimp_channel_combine_mask (new_channel,
active_channel,
CHANNEL_OP_INTERSECT,
@ -1675,7 +1675,7 @@ channel_widget_idle_drop_channel (gpointer data)
cd = (ChannelDrop *) data;
gimp_image_position_channel (cd->gimage, cd->channel, cd->dest_index);
gimp_image_position_channel (cd->gimage, cd->channel, cd->dest_index, TRUE);
gdisplays_flush ();
g_free (cd);

View file

@ -1671,16 +1671,10 @@ layers_dialog_duplicate_layer_callback (GtkWidget *widget,
if (!layersD || !(gimage = layersD->gimage))
return;
/* Start a group undo */
undo_push_group_start (gimage, LAYER_ADD_UNDO);
active_layer = gimp_image_get_active_layer (gimage);
new_layer = gimp_layer_copy (active_layer, TRUE);
gimp_image_add_layer (gimage, new_layer, -1);
/* End the group undo */
undo_push_group_end (gimage);
gdisplays_flush ();
}
@ -1772,7 +1766,7 @@ layers_dialog_apply_layer_mask_callback (GtkWidget *widget,
/* Make sure there is a layer mask to apply */
if (layer && gimp_layer_get_mask (layer))
{
gboolean flush = ! layer->apply_mask || layer->show_mask;
gboolean flush = ! layer->mask->apply_mask || layer->mask->show_mask;
gimp_layer_apply_mask (layer, APPLY, TRUE);
@ -1805,7 +1799,7 @@ layers_dialog_delete_layer_mask_callback (GtkWidget *widget,
/* Make sure there is a layer mask to apply */
if (layer && gimp_layer_get_mask (layer))
{
gboolean flush = layer->apply_mask || layer->show_mask;
gboolean flush = layer->mask->apply_mask || layer->mask->show_mask;
gimp_layer_apply_mask (layer, DISCARD, TRUE);
@ -2124,16 +2118,27 @@ layer_widget_create (GimpImage *gimage,
layer_widget->width = -1;
layer_widget->height = -1;
layer_widget->layer_mask = (gimp_layer_get_mask (layer) != NULL);
layer_widget->apply_mask = layer->apply_mask;
layer_widget->edit_mask = layer->edit_mask;
layer_widget->show_mask = layer->show_mask;
if (layer->mask)
{
layer_widget->apply_mask = layer->mask->apply_mask;
layer_widget->edit_mask = layer->mask->edit_mask;
layer_widget->show_mask = layer->mask->show_mask;
}
else
{
layer_widget->apply_mask = FALSE;
layer_widget->edit_mask = FALSE;
layer_widget->show_mask = FALSE;
}
layer_widget->visited = TRUE;
layer_widget->drop_type = GIMP_DROP_NONE;
layer_widget->layer_pixmap_valid = FALSE;
if (gimp_layer_get_mask (layer))
layer_widget->active_preview =
(layer->edit_mask) ? MASK_PREVIEW : LAYER_PREVIEW;
(layer->mask->edit_mask) ? MASK_PREVIEW : LAYER_PREVIEW;
else
layer_widget->active_preview = LAYER_PREVIEW;
@ -2818,8 +2823,8 @@ layer_widget_preview_events (GtkWidget *widget,
{
if (preview_type == MASK_PREVIEW)
{
gimage_set_layer_mask_apply (layer_widget->gimage,
layer_widget->layer);
gimp_layer_mask_set_apply (layer_widget->layer->mask,
! layer_widget->layer->mask->apply_mask);
gdisplays_flush ();
}
}
@ -2828,16 +2833,22 @@ layer_widget_preview_events (GtkWidget *widget,
{
if (preview_type == MASK_PREVIEW)
{
gimage_set_layer_mask_show (layer_widget->gimage,
layer_widget->layer);
gimp_layer_mask_set_show (layer_widget->layer->mask,
! layer_widget->layer->mask->show_mask);
gdisplays_flush ();
}
}
else if (layer_widget->active_preview != preview_type)
{
gimage_set_layer_mask_edit (layer_widget->gimage,
layer_widget->layer,
(preview_type == MASK_PREVIEW));
if (preview_type == MASK_PREVIEW)
{
gimp_layer_mask_set_edit (layer_widget->layer->mask, TRUE);
}
else if (layer_widget->layer->mask)
{
gimp_layer_mask_set_edit (layer_widget->layer->mask, FALSE);
}
gdisplays_flush ();
}
break;
@ -2987,9 +2998,9 @@ layer_widget_boundary_redraw (LayerWidget *layer_widget,
gdk_gc_set_foreground (layersD->red_gc, &red);
}
if (layer_widget->layer->show_mask)
if (layer_widget->layer->mask->show_mask)
gc2 = layersD->green_gc;
else if (! layer_widget->layer->apply_mask)
else if (! layer_widget->layer->mask->apply_mask)
gc2 = layersD->red_gc;
}
@ -3460,21 +3471,21 @@ layer_widget_layer_flush (GtkWidget *widget,
update_mask_preview =
(! GIMP_DRAWABLE (gimp_layer_get_mask (layer))->preview_valid);
if (layer->apply_mask != layer_widget->apply_mask)
if (layer->mask->apply_mask != layer_widget->apply_mask)
{
layer_widget->apply_mask = layer->apply_mask;
layer_widget->apply_mask = layer->mask->apply_mask;
update_mask_preview = TRUE;
}
if (layer->show_mask != layer_widget->show_mask)
if (layer->mask->show_mask != layer_widget->show_mask)
{
layer_widget->show_mask = layer->show_mask;
layer_widget->show_mask = layer->mask->show_mask;
update_mask_preview = TRUE;
}
if (layer->edit_mask != layer_widget->edit_mask)
if (layer->mask->edit_mask != layer_widget->edit_mask)
{
layer_widget->edit_mask = layer->edit_mask;
layer_widget->edit_mask = layer->mask->edit_mask;
if (layer->edit_mask == TRUE)
if (layer->mask->edit_mask == TRUE)
layer_widget->active_preview = MASK_PREVIEW;
else
layer_widget->active_preview = LAYER_PREVIEW;

View file

@ -244,7 +244,7 @@ qmask_activate (GtkWidget *widget,
{
/* if selection */
gmask = gimp_channel_copy (gimp_image_get_mask (gimg));
gmask = gimp_channel_copy (gimp_image_get_mask (gimg), TRUE);
gimp_image_add_channel (gimg, gmask, 0);
gimp_channel_set_color (gmask, &color);
gimp_object_set_name (GIMP_OBJECT (gmask), "Qmask");

View file

@ -525,7 +525,11 @@ drawable_view_new (gchar *title,
"active_channel_changed",
gimp_image_get_channels,
gimp_image_get_active_channel,
gimp_image_set_active_channel);
gimp_image_set_active_channel,
gimp_image_position_channel,
gimp_image_add_channel,
gimp_image_remove_channel,
gimp_channel_copy);
}
else
{
@ -534,7 +538,11 @@ drawable_view_new (gchar *title,
"active_layer_changed",
gimp_image_get_layers,
gimp_image_get_active_layer,
gimp_image_set_active_layer);
gimp_image_set_active_layer,
gimp_image_position_layer,
gimp_image_add_layer,
gimp_image_remove_layer,
gimp_layer_copy);
}
gtk_list_set_selection_mode (GTK_LIST (GIMP_CONTAINER_LIST_VIEW (view)->gtk_list),

View file

@ -1671,16 +1671,10 @@ layers_dialog_duplicate_layer_callback (GtkWidget *widget,
if (!layersD || !(gimage = layersD->gimage))
return;
/* Start a group undo */
undo_push_group_start (gimage, LAYER_ADD_UNDO);
active_layer = gimp_image_get_active_layer (gimage);
new_layer = gimp_layer_copy (active_layer, TRUE);
gimp_image_add_layer (gimage, new_layer, -1);
/* End the group undo */
undo_push_group_end (gimage);
gdisplays_flush ();
}
@ -1772,7 +1766,7 @@ layers_dialog_apply_layer_mask_callback (GtkWidget *widget,
/* Make sure there is a layer mask to apply */
if (layer && gimp_layer_get_mask (layer))
{
gboolean flush = ! layer->apply_mask || layer->show_mask;
gboolean flush = ! layer->mask->apply_mask || layer->mask->show_mask;
gimp_layer_apply_mask (layer, APPLY, TRUE);
@ -1805,7 +1799,7 @@ layers_dialog_delete_layer_mask_callback (GtkWidget *widget,
/* Make sure there is a layer mask to apply */
if (layer && gimp_layer_get_mask (layer))
{
gboolean flush = layer->apply_mask || layer->show_mask;
gboolean flush = layer->mask->apply_mask || layer->mask->show_mask;
gimp_layer_apply_mask (layer, DISCARD, TRUE);
@ -2124,16 +2118,27 @@ layer_widget_create (GimpImage *gimage,
layer_widget->width = -1;
layer_widget->height = -1;
layer_widget->layer_mask = (gimp_layer_get_mask (layer) != NULL);
layer_widget->apply_mask = layer->apply_mask;
layer_widget->edit_mask = layer->edit_mask;
layer_widget->show_mask = layer->show_mask;
if (layer->mask)
{
layer_widget->apply_mask = layer->mask->apply_mask;
layer_widget->edit_mask = layer->mask->edit_mask;
layer_widget->show_mask = layer->mask->show_mask;
}
else
{
layer_widget->apply_mask = FALSE;
layer_widget->edit_mask = FALSE;
layer_widget->show_mask = FALSE;
}
layer_widget->visited = TRUE;
layer_widget->drop_type = GIMP_DROP_NONE;
layer_widget->layer_pixmap_valid = FALSE;
if (gimp_layer_get_mask (layer))
layer_widget->active_preview =
(layer->edit_mask) ? MASK_PREVIEW : LAYER_PREVIEW;
(layer->mask->edit_mask) ? MASK_PREVIEW : LAYER_PREVIEW;
else
layer_widget->active_preview = LAYER_PREVIEW;
@ -2818,8 +2823,8 @@ layer_widget_preview_events (GtkWidget *widget,
{
if (preview_type == MASK_PREVIEW)
{
gimage_set_layer_mask_apply (layer_widget->gimage,
layer_widget->layer);
gimp_layer_mask_set_apply (layer_widget->layer->mask,
! layer_widget->layer->mask->apply_mask);
gdisplays_flush ();
}
}
@ -2828,16 +2833,22 @@ layer_widget_preview_events (GtkWidget *widget,
{
if (preview_type == MASK_PREVIEW)
{
gimage_set_layer_mask_show (layer_widget->gimage,
layer_widget->layer);
gimp_layer_mask_set_show (layer_widget->layer->mask,
! layer_widget->layer->mask->show_mask);
gdisplays_flush ();
}
}
else if (layer_widget->active_preview != preview_type)
{
gimage_set_layer_mask_edit (layer_widget->gimage,
layer_widget->layer,
(preview_type == MASK_PREVIEW));
if (preview_type == MASK_PREVIEW)
{
gimp_layer_mask_set_edit (layer_widget->layer->mask, TRUE);
}
else if (layer_widget->layer->mask)
{
gimp_layer_mask_set_edit (layer_widget->layer->mask, FALSE);
}
gdisplays_flush ();
}
break;
@ -2987,9 +2998,9 @@ layer_widget_boundary_redraw (LayerWidget *layer_widget,
gdk_gc_set_foreground (layersD->red_gc, &red);
}
if (layer_widget->layer->show_mask)
if (layer_widget->layer->mask->show_mask)
gc2 = layersD->green_gc;
else if (! layer_widget->layer->apply_mask)
else if (! layer_widget->layer->mask->apply_mask)
gc2 = layersD->red_gc;
}
@ -3460,21 +3471,21 @@ layer_widget_layer_flush (GtkWidget *widget,
update_mask_preview =
(! GIMP_DRAWABLE (gimp_layer_get_mask (layer))->preview_valid);
if (layer->apply_mask != layer_widget->apply_mask)
if (layer->mask->apply_mask != layer_widget->apply_mask)
{
layer_widget->apply_mask = layer->apply_mask;
layer_widget->apply_mask = layer->mask->apply_mask;
update_mask_preview = TRUE;
}
if (layer->show_mask != layer_widget->show_mask)
if (layer->mask->show_mask != layer_widget->show_mask)
{
layer_widget->show_mask = layer->show_mask;
layer_widget->show_mask = layer->mask->show_mask;
update_mask_preview = TRUE;
}
if (layer->edit_mask != layer_widget->edit_mask)
if (layer->mask->edit_mask != layer_widget->edit_mask)
{
layer_widget->edit_mask = layer->edit_mask;
layer_widget->edit_mask = layer->mask->edit_mask;
if (layer->edit_mask == TRUE)
if (layer->mask->edit_mask == TRUE)
layer_widget->active_preview = MASK_PREVIEW;
else
layer_widget->active_preview = LAYER_PREVIEW;

View file

@ -195,7 +195,7 @@ channel_copy_invoker (Argument *args)
success = FALSE;
if (success)
success = (copy = gimp_channel_copy (channel)) != NULL;
success = (copy = gimp_channel_copy (channel, TRUE)) != NULL;
return_args = procedural_db_return_args (&channel_copy_proc, success);

View file

@ -60,7 +60,7 @@ void register_tools_procs (void);
void register_undo_procs (void);
void register_unit_procs (void);
/* 325 procedures registered total */
/* 319 procedures registered total */
void
internal_procs_init (void)
@ -71,93 +71,93 @@ internal_procs_init (void)
app_init_update_status (NULL, _("Brushes"), 0.009);
register_brushes_procs ();
app_init_update_status (NULL, _("Channel"), 0.043);
app_init_update_status (NULL, _("Channel"), 0.044);
register_channel_procs ();
app_init_update_status (NULL, _("Channel Ops"), 0.092);
app_init_update_status (NULL, _("Channel Ops"), 0.094);
register_channel_ops_procs ();
app_init_update_status (NULL, _("Color"), 0.098);
app_init_update_status (NULL, _("Color"), 0.1);
register_color_procs ();
app_init_update_status (NULL, _("Convert"), 0.135);
app_init_update_status (NULL, _("Convert"), 0.138);
register_convert_procs ();
app_init_update_status (NULL, _("GDisplay procedures"), 0.145);
app_init_update_status (NULL, _("GDisplay procedures"), 0.147);
register_display_procs ();
app_init_update_status (NULL, _("Drawable procedures"), 0.154);
app_init_update_status (NULL, _("Drawable procedures"), 0.157);
register_drawable_procs ();
app_init_update_status (NULL, _("Edit procedures"), 0.222);
app_init_update_status (NULL, _("Edit procedures"), 0.226);
register_edit_procs ();
app_init_update_status (NULL, _("File Operations"), 0.24);
app_init_update_status (NULL, _("File Operations"), 0.245);
register_fileops_procs ();
app_init_update_status (NULL, _("Floating selections"), 0.265);
app_init_update_status (NULL, _("Floating selections"), 0.27);
register_floating_sel_procs ();
app_init_update_status (NULL, _("Gimprc procedures"), 0.283);
app_init_update_status (NULL, _("Gimprc procedures"), 0.288);
register_gimprc_procs ();
app_init_update_status (NULL, _("Gradients"), 0.292);
app_init_update_status (NULL, _("Gradients"), 0.298);
register_gradients_procs ();
app_init_update_status (NULL, _("Gradient UI"), 0.308);
app_init_update_status (NULL, _("Gradient UI"), 0.313);
register_gradient_select_procs ();
app_init_update_status (NULL, _("Guide procedures"), 0.32);
app_init_update_status (NULL, _("Guide procedures"), 0.326);
register_guides_procs ();
app_init_update_status (NULL, _("Help procedures"), 0.338);
app_init_update_status (NULL, _("Help procedures"), 0.345);
register_help_procs ();
app_init_update_status (NULL, _("Image"), 0.342);
app_init_update_status (NULL, _("Image"), 0.348);
register_image_procs ();
app_init_update_status (NULL, _("Layer"), 0.523);
app_init_update_status (NULL, _("Layer"), 0.533);
register_layer_procs ();
app_init_update_status (NULL, _("Interface"), 0.618);
app_init_update_status (NULL, _("Interface"), 0.611);
register_message_procs ();
app_init_update_status (NULL, _("Miscellaneous"), 0.628);
app_init_update_status (NULL, _("Miscellaneous"), 0.621);
register_misc_procs ();
app_init_update_status (NULL, _("Palette"), 0.634);
app_init_update_status (NULL, _("Palette"), 0.627);
register_palette_procs ();
app_init_update_status (NULL, _("Parasite procedures"), 0.655);
app_init_update_status (NULL, _("Parasite procedures"), 0.649);
register_parasite_procs ();
app_init_update_status (NULL, _("Paths"), 0.692);
app_init_update_status (NULL, _("Paths"), 0.687);
register_paths_procs ();
app_init_update_status (NULL, _("Pattern UI"), 0.732);
app_init_update_status (NULL, _("Pattern UI"), 0.727);
register_pattern_select_procs ();
app_init_update_status (NULL, _("Patterns"), 0.742);
app_init_update_status (NULL, _("Patterns"), 0.737);
register_patterns_procs ();
app_init_update_status (NULL, _("Plug-in"), 0.754);
app_init_update_status (NULL, _("Plug-in"), 0.749);
register_plug_in_procs ();
app_init_update_status (NULL, _("Procedural database"), 0.772);
app_init_update_status (NULL, _("Procedural database"), 0.768);
register_procedural_db_procs ();
app_init_update_status (NULL, _("Image mask"), 0.797);
app_init_update_status (NULL, _("Image mask"), 0.793);
register_selection_procs ();
app_init_update_status (NULL, _("Text procedures"), 0.852);
app_init_update_status (NULL, _("Text procedures"), 0.85);
register_text_tool_procs ();
app_init_update_status (NULL, _("Tool procedures"), 0.865);
app_init_update_status (NULL, _("Tool procedures"), 0.862);
register_tools_procs ();
app_init_update_status (NULL, _("Undo"), 0.957);
app_init_update_status (NULL, _("Undo"), 0.956);
register_undo_procs ();
app_init_update_status (NULL, _("Units"), 0.963);
app_init_update_status (NULL, _("Units"), 0.962);
register_unit_procs ();
}

View file

@ -52,12 +52,6 @@ static ProcRecord layer_get_visible_proc;
static ProcRecord layer_set_visible_proc;
static ProcRecord layer_get_preserve_trans_proc;
static ProcRecord layer_set_preserve_trans_proc;
static ProcRecord layer_get_apply_mask_proc;
static ProcRecord layer_set_apply_mask_proc;
static ProcRecord layer_get_show_mask_proc;
static ProcRecord layer_set_show_mask_proc;
static ProcRecord layer_get_edit_mask_proc;
static ProcRecord layer_set_edit_mask_proc;
static ProcRecord layer_get_opacity_proc;
static ProcRecord layer_set_opacity_proc;
static ProcRecord layer_get_mode_proc;
@ -87,12 +81,6 @@ register_layer_procs (void)
procedural_db_register (&layer_set_visible_proc);
procedural_db_register (&layer_get_preserve_trans_proc);
procedural_db_register (&layer_set_preserve_trans_proc);
procedural_db_register (&layer_get_apply_mask_proc);
procedural_db_register (&layer_set_apply_mask_proc);
procedural_db_register (&layer_get_show_mask_proc);
procedural_db_register (&layer_set_show_mask_proc);
procedural_db_register (&layer_get_edit_mask_proc);
procedural_db_register (&layer_set_edit_mask_proc);
procedural_db_register (&layer_get_opacity_proc);
procedural_db_register (&layer_set_opacity_proc);
procedural_db_register (&layer_get_mode_proc);
@ -1219,312 +1207,6 @@ static ProcRecord layer_set_preserve_trans_proc =
{ { layer_set_preserve_trans_invoker } }
};
static Argument *
layer_get_apply_mask_invoker (Argument *args)
{
gboolean success = TRUE;
Argument *return_args;
GimpLayer *layer;
layer = (GimpLayer *) gimp_drawable_get_by_ID (args[0].value.pdb_int);
if (layer == NULL)
success = FALSE;
return_args = procedural_db_return_args (&layer_get_apply_mask_proc, success);
if (success)
return_args[1].value.pdb_int = layer->apply_mask;
return return_args;
}
static ProcArg layer_get_apply_mask_inargs[] =
{
{
PDB_LAYER,
"layer",
"The layer"
}
};
static ProcArg layer_get_apply_mask_outargs[] =
{
{
PDB_INT32,
"apply_mask",
"The layer's apply mask setting"
}
};
static ProcRecord layer_get_apply_mask_proc =
{
"gimp_layer_get_apply_mask",
"Get the apply mask setting of the specified layer.",
"This procedure returns the specified layer's apply mask setting. If the value is non-zero, then the layer mask for this layer is currently being composited with the layer's alpha channel.",
"Spencer Kimball & Peter Mattis",
"Spencer Kimball & Peter Mattis",
"1995-1996",
PDB_INTERNAL,
1,
layer_get_apply_mask_inargs,
1,
layer_get_apply_mask_outargs,
{ { layer_get_apply_mask_invoker } }
};
static Argument *
layer_set_apply_mask_invoker (Argument *args)
{
gboolean success = TRUE;
GimpLayer *layer;
gboolean apply_mask;
layer = (GimpLayer *) gimp_drawable_get_by_ID (args[0].value.pdb_int);
if (layer == NULL)
success = FALSE;
apply_mask = args[1].value.pdb_int ? TRUE : FALSE;
if (success)
layer->apply_mask = apply_mask;
return procedural_db_return_args (&layer_set_apply_mask_proc, success);
}
static ProcArg layer_set_apply_mask_inargs[] =
{
{
PDB_LAYER,
"layer",
"The layer"
},
{
PDB_INT32,
"apply_mask",
"The new layer's apply mask setting"
}
};
static ProcRecord layer_set_apply_mask_proc =
{
"gimp_layer_set_apply_mask",
"Set the apply mask setting of the specified layer.",
"This procedure sets the specified layer's apply mask setting. This controls whether the layer's mask is currently affecting the alpha channel. If there is no layer mask, this function will return an error.",
"Spencer Kimball & Peter Mattis",
"Spencer Kimball & Peter Mattis",
"1995-1996",
PDB_INTERNAL,
2,
layer_set_apply_mask_inargs,
0,
NULL,
{ { layer_set_apply_mask_invoker } }
};
static Argument *
layer_get_show_mask_invoker (Argument *args)
{
gboolean success = TRUE;
Argument *return_args;
GimpLayer *layer;
layer = (GimpLayer *) gimp_drawable_get_by_ID (args[0].value.pdb_int);
if (layer == NULL)
success = FALSE;
return_args = procedural_db_return_args (&layer_get_show_mask_proc, success);
if (success)
return_args[1].value.pdb_int = layer->show_mask;
return return_args;
}
static ProcArg layer_get_show_mask_inargs[] =
{
{
PDB_LAYER,
"layer",
"The layer"
}
};
static ProcArg layer_get_show_mask_outargs[] =
{
{
PDB_INT32,
"show_mask",
"The layer's show mask setting"
}
};
static ProcRecord layer_get_show_mask_proc =
{
"gimp_layer_get_show_mask",
"Get the show mask setting of the specified layer.",
"This procedure returns the specified layer's show mask setting. If the value is non-zero, then the layer mask for this layer is currently being shown instead of the layer.",
"Spencer Kimball & Peter Mattis",
"Spencer Kimball & Peter Mattis",
"1995-1996",
PDB_INTERNAL,
1,
layer_get_show_mask_inargs,
1,
layer_get_show_mask_outargs,
{ { layer_get_show_mask_invoker } }
};
static Argument *
layer_set_show_mask_invoker (Argument *args)
{
gboolean success = TRUE;
GimpLayer *layer;
gboolean show_mask;
layer = (GimpLayer *) gimp_drawable_get_by_ID (args[0].value.pdb_int);
if (layer == NULL)
success = FALSE;
show_mask = args[1].value.pdb_int ? TRUE : FALSE;
if (success)
layer->show_mask = show_mask;
return procedural_db_return_args (&layer_set_show_mask_proc, success);
}
static ProcArg layer_set_show_mask_inargs[] =
{
{
PDB_LAYER,
"layer",
"The layer"
},
{
PDB_INT32,
"show_mask",
"The new layer's show mask setting"
}
};
static ProcRecord layer_set_show_mask_proc =
{
"gimp_layer_set_show_mask",
"Set the show mask setting of the specified layer.",
"This procedure sets the specified layer's show mask setting. This controls whether the layer or it's mask is visible. Non-zero values indicate that the mask should be visible. If the layer has no mask, then this function returns an error.",
"Spencer Kimball & Peter Mattis",
"Spencer Kimball & Peter Mattis",
"1995-1996",
PDB_INTERNAL,
2,
layer_set_show_mask_inargs,
0,
NULL,
{ { layer_set_show_mask_invoker } }
};
static Argument *
layer_get_edit_mask_invoker (Argument *args)
{
gboolean success = TRUE;
Argument *return_args;
GimpLayer *layer;
layer = (GimpLayer *) gimp_drawable_get_by_ID (args[0].value.pdb_int);
if (layer == NULL)
success = FALSE;
return_args = procedural_db_return_args (&layer_get_edit_mask_proc, success);
if (success)
return_args[1].value.pdb_int = layer->edit_mask;
return return_args;
}
static ProcArg layer_get_edit_mask_inargs[] =
{
{
PDB_LAYER,
"layer",
"The layer"
}
};
static ProcArg layer_get_edit_mask_outargs[] =
{
{
PDB_INT32,
"edit_mask",
"The layer's show mask setting"
}
};
static ProcRecord layer_get_edit_mask_proc =
{
"gimp_layer_get_edit_mask",
"Get the show mask setting of the specified layer.",
"This procedure returns the specified layer's show mask setting. If the value is non-zero, then the layer mask for this layer is currently active, and not the layer.",
"Spencer Kimball & Peter Mattis",
"Spencer Kimball & Peter Mattis",
"1995-1996",
PDB_INTERNAL,
1,
layer_get_edit_mask_inargs,
1,
layer_get_edit_mask_outargs,
{ { layer_get_edit_mask_invoker } }
};
static Argument *
layer_set_edit_mask_invoker (Argument *args)
{
gboolean success = TRUE;
GimpLayer *layer;
gboolean edit_mask;
layer = (GimpLayer *) gimp_drawable_get_by_ID (args[0].value.pdb_int);
if (layer == NULL)
success = FALSE;
edit_mask = args[1].value.pdb_int ? TRUE : FALSE;
if (success)
layer->edit_mask = edit_mask;
return procedural_db_return_args (&layer_set_edit_mask_proc, success);
}
static ProcArg layer_set_edit_mask_inargs[] =
{
{
PDB_LAYER,
"layer",
"The layer"
},
{
PDB_INT32,
"edit_mask",
"The new layer's show mask setting"
}
};
static ProcRecord layer_set_edit_mask_proc =
{
"gimp_layer_set_edit_mask",
"Set the show mask setting of the specified layer.",
"This procedure sets the specified layer's show mask setting. This controls whether the layer or it's mask is currently active for editing. If the specified layer has no layer mask, then this procedure will return an error.",
"Spencer Kimball & Peter Mattis",
"Spencer Kimball & Peter Mattis",
"1995-1996",
PDB_INTERNAL,
2,
layer_set_edit_mask_inargs,
0,
NULL,
{ { layer_set_edit_mask_invoker } }
};
static Argument *
layer_get_opacity_invoker (Argument *args)
{

View file

@ -1003,7 +1003,7 @@ selection_combine_invoker (Argument *args)
if (gimp_drawable_width (GIMP_DRAWABLE (channel)) == gimage->width &&
gimp_drawable_height (GIMP_DRAWABLE (channel)) == gimage->height)
{
new_channel = gimp_channel_copy (gimp_image_get_mask (gimage));
new_channel = gimp_channel_copy (gimp_image_get_mask (gimage), TRUE);
gimp_channel_combine_mask (new_channel,
channel,
operation,

View file

@ -244,7 +244,7 @@ qmask_activate (GtkWidget *widget,
{
/* if selection */
gmask = gimp_channel_copy (gimp_image_get_mask (gimg));
gmask = gimp_channel_copy (gimp_image_get_mask (gimg), TRUE);
gimp_image_add_channel (gimg, gmask, 0);
gimp_channel_set_color (gmask, &color);
gimp_object_set_name (GIMP_OBJECT (gmask), "Qmask");

View file

@ -525,7 +525,11 @@ drawable_view_new (gchar *title,
"active_channel_changed",
gimp_image_get_channels,
gimp_image_get_active_channel,
gimp_image_set_active_channel);
gimp_image_set_active_channel,
gimp_image_position_channel,
gimp_image_add_channel,
gimp_image_remove_channel,
gimp_channel_copy);
}
else
{
@ -534,7 +538,11 @@ drawable_view_new (gchar *title,
"active_layer_changed",
gimp_image_get_layers,
gimp_image_get_active_layer,
gimp_image_set_active_layer);
gimp_image_set_active_layer,
gimp_image_position_layer,
gimp_image_add_layer,
gimp_image_remove_layer,
gimp_layer_copy);
}
gtk_list_set_selection_mode (GTK_LIST (GIMP_CONTAINER_LIST_VIEW (view)->gtk_list),

View file

@ -1708,12 +1708,6 @@ undo_pop_layer_mask (GimpImage *gimage,
else
{
gimp_layer_add_mask (lmu->layer, lmu->mask, FALSE);
lmu->layer->apply_mask = lmu->apply_mask;
lmu->layer->edit_mask = lmu->edit_mask;
lmu->layer->show_mask = lmu->show_mask;
gimage_set_layer_mask_edit (gimage, lmu->layer, lmu->edit_mask);
}
return TRUE;

View file

@ -326,7 +326,7 @@ gimp_container_grid_view_set_preview_size (GimpContainerView *view)
preview = GIMP_PREVIEW (child->widget);
gimp_preview_set_size (preview, view->preview_size);
gimp_preview_set_size (preview, view->preview_size, preview->border_width);
}
gtk_widget_queue_resize (grid_view->wrap_box);

View file

@ -289,7 +289,7 @@ gimp_container_list_view_reorder_item (GimpContainerView *view,
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);
gimp_container_view_select_item (view, viewable);
gtk_object_unref (GTK_OBJECT (list_item));
}
@ -319,7 +319,7 @@ gimp_container_list_view_select_item (GimpContainerView *view,
adj = gtk_scrolled_window_get_vadjustment
(GTK_SCROLLED_WINDOW (list_view->scrolled_win));
item_height = list_item->allocation.height;
item_height = list_item->requisition.height;
index = gimp_container_get_child_index (view->container,
GIMP_OBJECT (viewable));
@ -330,6 +330,10 @@ gimp_container_list_view_select_item (GimpContainerView *view,
gtk_list_select_child (GTK_LIST (list_view->gtk_list), list_item);
gtk_signal_handler_unblock_by_func (GTK_OBJECT (list_view->gtk_list),
gimp_container_list_view_item_selected,
list_view);
if (index * item_height < adj->value)
{
gtk_adjustment_set_value (adj, index * item_height);
@ -339,10 +343,6 @@ gimp_container_list_view_select_item (GimpContainerView *view,
gtk_adjustment_set_value (adj,
(index + 1) * item_height - adj->page_size);
}
gtk_signal_handler_unblock_by_func (GTK_OBJECT (list_view->gtk_list),
gimp_container_list_view_item_selected,
list_view);
}
else
{
@ -379,7 +379,7 @@ gimp_container_list_view_set_preview_size (GimpContainerView *view)
preview = GIMP_PREVIEW (GIMP_LIST_ITEM (list->data)->preview);
gimp_preview_set_size (preview, view->preview_size);
gimp_preview_set_size (preview, view->preview_size, preview->border_width);
}
gtk_widget_queue_resize (list_view->gtk_list);

View file

@ -240,6 +240,8 @@ gimp_container_view_set_container (GimpContainerView *view,
if (view->container)
{
gimp_container_view_select_item (view, NULL);
gimp_container_view_clear_items (view);
gtk_signal_disconnect_by_func (GTK_OBJECT (view->container),

View file

@ -59,7 +59,8 @@
typedef enum
{
GIMP_DND_DATA_COLOR = 1,
GIMP_DND_DATA_NONE,
GIMP_DND_DATA_COLOR,
GIMP_DND_DATA_LAYER,
GIMP_DND_DATA_CHANNEL,
GIMP_DND_DATA_LAYER_MASK,
@ -686,222 +687,23 @@ gimp_dnd_get_viewable_icon (GtkWidget *widget,
return preview;
}
static const GtkTargetEntry layer_target_table[] =
static GimpDndDataType
gimp_dnd_data_type_get_by_gtk_type (GtkType type)
{
GIMP_TARGET_LAYER
};
static const guint layer_n_targets = (sizeof (layer_target_table) /
sizeof (layer_target_table[0]));
static const GtkTargetEntry channel_target_table[] =
{
GIMP_TARGET_CHANNEL
};
static const guint channel_n_targets = (sizeof (channel_target_table) /
sizeof (layer_target_table[0]));
static const GtkTargetEntry layer_mask_target_table[] =
{
GIMP_TARGET_LAYER_MASK
};
static const guint layer_mask_n_targets = (sizeof (layer_mask_target_table) /
sizeof (layer_mask_target_table[0]));
static const GtkTargetEntry brush_target_table[] =
{
GIMP_TARGET_BRUSH
};
static const guint brush_n_targets = (sizeof (brush_target_table) /
sizeof (brush_target_table[0]));
static const GtkTargetEntry pattern_target_table[] =
{
GIMP_TARGET_PATTERN
};
static const guint pattern_n_targets = (sizeof (pattern_target_table) /
sizeof (pattern_target_table[0]));
static const GtkTargetEntry gradient_target_table[] =
{
GIMP_TARGET_GRADIENT
};
static const guint gradient_n_targets = (sizeof (gradient_target_table) /
sizeof (gradient_target_table[0]));
static const GtkTargetEntry palette_target_table[] =
{
GIMP_TARGET_PALETTE
};
static const guint palette_n_targets = (sizeof (palette_target_table) /
sizeof (palette_target_table[0]));
static const GtkTargetEntry tool_target_table[] =
{
GIMP_TARGET_TOOL
};
static const guint tool_n_targets = (sizeof (tool_target_table) /
sizeof (tool_target_table[0]));
void
gimp_gtk_drag_source_set_by_type (GtkWidget *widget,
GdkModifierType start_button_mask,
GtkType type,
GdkDragAction actions)
{
const GtkTargetEntry *target_table = NULL;
guint n_targets = 0;
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_WIDGET (widget));
if (gtk_type_is_a (type, GIMP_TYPE_LAYER))
{
target_table = layer_target_table;
n_targets = layer_n_targets;
}
else if (gtk_type_is_a (type, GIMP_TYPE_CHANNEL))
{
target_table = channel_target_table;
n_targets = channel_n_targets;
}
else if (gtk_type_is_a (type, GIMP_TYPE_LAYER_MASK))
{
target_table = layer_mask_target_table;
n_targets = layer_mask_n_targets;
}
else if (gtk_type_is_a (type, GIMP_TYPE_BRUSH))
{
target_table = brush_target_table;
n_targets = brush_n_targets;
}
else if (gtk_type_is_a (type, GIMP_TYPE_PATTERN))
{
target_table = pattern_target_table;
n_targets = pattern_n_targets;
}
else if (gtk_type_is_a (type, GIMP_TYPE_GRADIENT))
{
target_table = gradient_target_table;
n_targets = gradient_n_targets;
}
else if (gtk_type_is_a (type, GIMP_TYPE_PALETTE))
{
target_table = palette_target_table;
n_targets = palette_n_targets;
}
else if (gtk_type_is_a (type, GIMP_TYPE_TOOL_INFO))
{
target_table = tool_target_table;
n_targets = tool_n_targets;
}
else
{
g_warning ("%s(): unsupported GtkType \"%s\"",
G_GNUC_FUNCTION, gtk_type_name (type));
}
if (target_table && n_targets)
{
gtk_drag_source_set (widget, start_button_mask,
target_table,
n_targets,
actions);
}
}
void
gimp_gtk_drag_dest_set_by_type (GtkWidget *widget,
GtkDestDefaults flags,
GtkType type,
GdkDragAction actions)
{
const GtkTargetEntry *target_table = NULL;
guint n_targets = 0;
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_WIDGET (widget));
if (gtk_type_is_a (type, GIMP_TYPE_LAYER))
{
target_table = layer_target_table;
n_targets = layer_n_targets;
}
else if (gtk_type_is_a (type, GIMP_TYPE_CHANNEL))
{
target_table = channel_target_table;
n_targets = channel_n_targets;
}
else if (gtk_type_is_a (type, GIMP_TYPE_LAYER_MASK))
{
target_table = layer_mask_target_table;
n_targets = layer_mask_n_targets;
}
else if (gtk_type_is_a (type, GIMP_TYPE_BRUSH))
{
target_table = brush_target_table;
n_targets = brush_n_targets;
}
else if (gtk_type_is_a (type, GIMP_TYPE_PATTERN))
{
target_table = pattern_target_table;
n_targets = pattern_n_targets;
}
else if (gtk_type_is_a (type, GIMP_TYPE_GRADIENT))
{
target_table = gradient_target_table;
n_targets = gradient_n_targets;
}
else if (gtk_type_is_a (type, GIMP_TYPE_PALETTE))
{
target_table = palette_target_table;
n_targets = palette_n_targets;
}
else if (gtk_type_is_a (type, GIMP_TYPE_TOOL_INFO))
{
target_table = tool_target_table;
n_targets = tool_n_targets;
}
else
{
g_warning ("%s(): unsupported GtkType \"%s\"",
G_GNUC_FUNCTION, gtk_type_name (type));
}
if (target_table && n_targets)
{
gtk_drag_dest_set (widget, flags,
target_table,
n_targets,
actions);
}
}
void
gimp_dnd_viewable_source_set (GtkWidget *widget,
GtkType type,
GimpDndDragViewableFunc get_viewable_func,
gpointer data)
{
GimpDndDataType dnd_type;
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_WIDGET (widget));
g_return_if_fail (get_viewable_func != NULL);
GimpDndDataType dnd_type = GIMP_DND_DATA_NONE;
if (gtk_type_is_a (type, GIMP_TYPE_LAYER))
{
dnd_type = GIMP_DND_DATA_LAYER;
}
else if (gtk_type_is_a (type, GIMP_TYPE_CHANNEL))
{
dnd_type = GIMP_DND_DATA_CHANNEL;
}
else if (gtk_type_is_a (type, GIMP_TYPE_LAYER_MASK))
{
dnd_type = GIMP_DND_DATA_LAYER_MASK;
}
else if (gtk_type_is_a (type, GIMP_TYPE_CHANNEL))
{
dnd_type = GIMP_DND_DATA_CHANNEL;
}
else if (gtk_type_is_a (type, GIMP_TYPE_BRUSH))
{
dnd_type = GIMP_DND_DATA_BRUSH;
@ -926,9 +728,72 @@ gimp_dnd_viewable_source_set (GtkWidget *widget,
{
g_warning ("%s(): unsupported GtkType \"%s\"",
G_GNUC_FUNCTION, gtk_type_name (type));
return;
}
return dnd_type;
}
void
gimp_gtk_drag_source_set_by_type (GtkWidget *widget,
GdkModifierType start_button_mask,
GtkType type,
GdkDragAction actions)
{
GimpDndDataType dnd_type;
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_WIDGET (widget));
dnd_type = gimp_dnd_data_type_get_by_gtk_type (type);
if (dnd_type == GIMP_DND_DATA_NONE)
return;
gtk_drag_source_set (widget, start_button_mask,
&dnd_data_defs[dnd_type].target_entry,
1,
actions);
}
void
gimp_gtk_drag_dest_set_by_type (GtkWidget *widget,
GtkDestDefaults flags,
GtkType type,
GdkDragAction actions)
{
GimpDndDataType dnd_type;
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_WIDGET (widget));
dnd_type = gimp_dnd_data_type_get_by_gtk_type (type);
if (dnd_type == GIMP_DND_DATA_NONE)
return;
gtk_drag_dest_set (widget, flags,
&dnd_data_defs[dnd_type].target_entry,
1,
actions);
}
void
gimp_dnd_viewable_source_set (GtkWidget *widget,
GtkType type,
GimpDndDragViewableFunc get_viewable_func,
gpointer data)
{
GimpDndDataType dnd_type;
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_WIDGET (widget));
g_return_if_fail (get_viewable_func != NULL);
dnd_type = gimp_dnd_data_type_get_by_gtk_type (type);
if (dnd_type == GIMP_DND_DATA_NONE)
return;
gimp_dnd_data_source_set (dnd_type, widget,
GTK_SIGNAL_FUNC (get_viewable_func),
data);
@ -943,44 +808,10 @@ gimp_dnd_viewable_source_unset (GtkWidget *widget,
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_WIDGET (widget));
if (gtk_type_is_a (type, GIMP_TYPE_LAYER))
{
dnd_type = GIMP_DND_DATA_LAYER;
}
else if (gtk_type_is_a (type, GIMP_TYPE_CHANNEL))
{
dnd_type = GIMP_DND_DATA_CHANNEL;
}
else if (gtk_type_is_a (type, GIMP_TYPE_LAYER_MASK))
{
dnd_type = GIMP_DND_DATA_LAYER_MASK;
}
else if (gtk_type_is_a (type, GIMP_TYPE_BRUSH))
{
dnd_type = GIMP_DND_DATA_BRUSH;
}
else if (gtk_type_is_a (type, GIMP_TYPE_PATTERN))
{
dnd_type = GIMP_DND_DATA_PATTERN;
}
else if (gtk_type_is_a (type, GIMP_TYPE_GRADIENT))
{
dnd_type = GIMP_DND_DATA_GRADIENT;
}
else if (gtk_type_is_a (type, GIMP_TYPE_PALETTE))
{
dnd_type = GIMP_DND_DATA_PALETTE;
}
else if (gtk_type_is_a (type, GIMP_TYPE_TOOL_INFO))
{
dnd_type = GIMP_DND_DATA_TOOL;
}
else
{
g_warning ("%s(): unsupported GtkType \"%s\"",
G_GNUC_FUNCTION, gtk_type_name (type));
return;
}
dnd_type = gimp_dnd_data_type_get_by_gtk_type (type);
if (dnd_type == GIMP_DND_DATA_NONE)
return;
gimp_dnd_data_source_unset (widget);
}
@ -997,44 +828,10 @@ gimp_dnd_viewable_dest_set (GtkWidget *widget,
g_return_if_fail (GTK_IS_WIDGET (widget));
g_return_if_fail (set_viewable_func != NULL);
if (gtk_type_is_a (type, GIMP_TYPE_LAYER))
{
dnd_type = GIMP_DND_DATA_LAYER;
}
else if (gtk_type_is_a (type, GIMP_TYPE_CHANNEL))
{
dnd_type = GIMP_DND_DATA_CHANNEL;
}
else if (gtk_type_is_a (type, GIMP_TYPE_LAYER_MASK))
{
dnd_type = GIMP_DND_DATA_LAYER_MASK;
}
else if (gtk_type_is_a (type, GIMP_TYPE_BRUSH))
{
dnd_type = GIMP_DND_DATA_BRUSH;
}
else if (gtk_type_is_a (type, GIMP_TYPE_PATTERN))
{
dnd_type = GIMP_DND_DATA_PATTERN;
}
else if (gtk_type_is_a (type, GIMP_TYPE_GRADIENT))
{
dnd_type = GIMP_DND_DATA_GRADIENT;
}
else if (gtk_type_is_a (type, GIMP_TYPE_PALETTE))
{
dnd_type = GIMP_DND_DATA_PALETTE;
}
else if (gtk_type_is_a (type, GIMP_TYPE_TOOL_INFO))
{
dnd_type = GIMP_DND_DATA_TOOL;
}
else
{
g_warning ("%s(): unsupported GtkType \"%s\"",
G_GNUC_FUNCTION, gtk_type_name (type));
return;
}
dnd_type = gimp_dnd_data_type_get_by_gtk_type (type);
if (dnd_type == GIMP_DND_DATA_NONE)
return;
gimp_dnd_data_dest_set (dnd_type, widget,
GTK_SIGNAL_FUNC (set_viewable_func),
@ -1047,44 +844,13 @@ gimp_dnd_viewable_dest_unset (GtkWidget *widget,
{
GimpDndDataType dnd_type;
if (gtk_type_is_a (type, GIMP_TYPE_LAYER))
{
dnd_type = GIMP_DND_DATA_LAYER;
}
else if (gtk_type_is_a (type, GIMP_TYPE_CHANNEL))
{
dnd_type = GIMP_DND_DATA_CHANNEL;
}
else if (gtk_type_is_a (type, GIMP_TYPE_LAYER_MASK))
{
dnd_type = GIMP_DND_DATA_LAYER_MASK;
}
else if (gtk_type_is_a (type, GIMP_TYPE_BRUSH))
{
dnd_type = GIMP_DND_DATA_BRUSH;
}
else if (gtk_type_is_a (type, GIMP_TYPE_PATTERN))
{
dnd_type = GIMP_DND_DATA_PATTERN;
}
else if (gtk_type_is_a (type, GIMP_TYPE_GRADIENT))
{
dnd_type = GIMP_DND_DATA_GRADIENT;
}
else if (gtk_type_is_a (type, GIMP_TYPE_PALETTE))
{
dnd_type = GIMP_DND_DATA_PALETTE;
}
else if (gtk_type_is_a (type, GIMP_TYPE_TOOL_INFO))
{
dnd_type = GIMP_DND_DATA_TOOL;
}
else
{
g_warning ("%s(): unsupported GtkType \"%s\"",
G_GNUC_FUNCTION, gtk_type_name (type));
return;
}
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_WIDGET (widget));
dnd_type = gimp_dnd_data_type_get_by_gtk_type (type);
if (dnd_type == GIMP_DND_DATA_NONE)
return;
gimp_dnd_data_dest_unset (dnd_type, widget);
}

View file

@ -258,7 +258,8 @@ gimp_drawable_list_item_drag_drop (GtkWidget *widget,
{
gimp_image_position_channel (gimp_drawable_gimage (GIMP_DRAWABLE (src_viewable)),
GIMP_CHANNEL (src_viewable),
dest_index);
dest_index,
TRUE);
gdisplays_flush ();
}
}

View file

@ -25,6 +25,7 @@
#include "apptypes.h"
#include "gdisplay.h"
#include "gimpcontainer.h"
#include "gimpdrawable.h"
#include "gimpdrawablelistview.h"
@ -59,6 +60,8 @@ static void gimp_drawable_list_view_activate_item (GimpContainerView *v
GimpViewable *item,
gpointer insert_data);
static void gimp_drawable_list_view_new_drawable (GimpDrawableListView *view,
GimpDrawable *drawable);
static void gimp_drawable_list_view_new_clicked (GtkWidget *widget,
GimpDrawableListView *view);
static void gimp_drawable_list_view_new_dropped (GtkWidget *widget,
@ -68,16 +71,22 @@ static void gimp_drawable_list_view_raise_clicked (GtkWidget *w
GimpDrawableListView *view);
static void gimp_drawable_list_view_lower_clicked (GtkWidget *widget,
GimpDrawableListView *view);
static void gimp_drawable_list_view_duplicate_drawable (GimpDrawableListView *view,
GimpDrawable *drawable);
static void gimp_drawable_list_view_duplicate_clicked (GtkWidget *widget,
GimpDrawableListView *view);
static void gimp_drawable_list_view_duplicate_dropped (GtkWidget *widget,
GimpViewable *viewable,
gpointer drawable);
static void gimp_drawable_list_view_edit_drawable (GimpDrawableListView *view,
GimpDrawable *drawable);
static void gimp_drawable_list_view_edit_clicked (GtkWidget *widget,
GimpDrawableListView *view);
static void gimp_drawable_list_view_edit_dropped (GtkWidget *widget,
GimpViewable *viewable,
gpointer drawable);
static void gimp_drawable_list_view_delete_drawable (GimpDrawableListView *view,
GimpDrawable *drawable);
static void gimp_drawable_list_view_delete_clicked (GtkWidget *widget,
GimpDrawableListView *view);
static void gimp_drawable_list_view_delete_dropped (GtkWidget *widget,
@ -251,10 +260,12 @@ gimp_drawable_list_view_init (GimpDrawableListView *view)
gtk_container_add (GTK_CONTAINER (view->delete_button), pixmap);
gtk_widget_show (pixmap);
gtk_widget_set_sensitive (view->raise_button, FALSE);
gtk_widget_set_sensitive (view->lower_button, FALSE);
gtk_widget_set_sensitive (view->new_button, FALSE);
gtk_widget_set_sensitive (view->raise_button, FALSE);
gtk_widget_set_sensitive (view->lower_button, FALSE);
gtk_widget_set_sensitive (view->duplicate_button, FALSE);
gtk_widget_set_sensitive (view->delete_button, FALSE);
gtk_widget_set_sensitive (view->edit_button, FALSE);
gtk_widget_set_sensitive (view->delete_button, FALSE);
}
static void
@ -290,12 +301,16 @@ gimp_drawable_list_view_insert_item (GimpContainerView *view,
}
GtkWidget *
gimp_drawable_list_view_new (GimpImage *gimage,
GtkType drawable_type,
const gchar *signal_name,
GimpGetContainerFunc get_container_func,
GimpGetDrawableFunc get_drawable_func,
GimpSetDrawableFunc set_drawable_func)
gimp_drawable_list_view_new (GimpImage *gimage,
GtkType drawable_type,
const gchar *signal_name,
GimpGetContainerFunc get_container_func,
GimpGetDrawableFunc get_drawable_func,
GimpSetDrawableFunc set_drawable_func,
GimpReorderDrawableFunc reorder_drawable_func,
GimpAddDrawableFunc add_drawable_func,
GimpRemoveDrawableFunc remove_drawable_func,
GimpCopyDrawableFunc copy_drawable_func)
{
GimpDrawableListView *list_view;
GimpContainerView *view;
@ -305,6 +320,10 @@ gimp_drawable_list_view_new (GimpImage *gimage,
g_return_val_if_fail (get_container_func != NULL, NULL);
g_return_val_if_fail (get_drawable_func != NULL, NULL);
g_return_val_if_fail (get_drawable_func != NULL, NULL);
g_return_val_if_fail (reorder_drawable_func != NULL, NULL);
g_return_val_if_fail (add_drawable_func != NULL, NULL);
g_return_val_if_fail (remove_drawable_func != NULL, NULL);
g_return_val_if_fail (copy_drawable_func != NULL, NULL);
list_view = gtk_type_new (GIMP_TYPE_DRAWABLE_LIST_VIEW);
@ -312,11 +331,15 @@ gimp_drawable_list_view_new (GimpImage *gimage,
view->preview_size = preview_size;
list_view->drawable_type = drawable_type;
list_view->signal_name = g_strdup (signal_name);
list_view->get_container_func = get_container_func;
list_view->get_drawable_func = get_drawable_func;
list_view->set_drawable_func = set_drawable_func;
list_view->drawable_type = drawable_type;
list_view->signal_name = g_strdup (signal_name);
list_view->get_container_func = get_container_func;
list_view->get_drawable_func = get_drawable_func;
list_view->set_drawable_func = set_drawable_func;
list_view->reorder_drawable_func = reorder_drawable_func;
list_view->add_drawable_func = add_drawable_func;
list_view->remove_drawable_func = remove_drawable_func;
list_view->copy_drawable_func = copy_drawable_func;
/* drop to "new" */
gimp_gtk_drag_dest_set_by_type (GTK_WIDGET (list_view->new_button),
@ -398,6 +421,8 @@ gimp_drawable_list_view_set_image (GimpDrawableListView *view,
GTK_SIGNAL_FUNC (gimp_drawable_list_view_drawable_changed),
view);
}
gtk_widget_set_sensitive (view->new_button, (view->gimage != NULL));
}
static void
@ -405,12 +430,57 @@ gimp_drawable_list_view_select_item (GimpContainerView *view,
GimpViewable *item,
gpointer insert_data)
{
GimpDrawableListView *list_view;
gboolean raise_sensitive = FALSE;
gboolean lower_sensitive = FALSE;
gboolean duplicate_sensitive = FALSE;
gboolean edit_sensitive = FALSE;
gboolean delete_sensitive = FALSE;
list_view = GIMP_DRAWABLE_LIST_VIEW (view);
if (GIMP_CONTAINER_VIEW_CLASS (parent_class)->select_item)
GIMP_CONTAINER_VIEW_CLASS (parent_class)->select_item (view,
item,
insert_data);
g_print ("select item\n");
if (item)
{
GimpDrawable *drawable;
gint index;
drawable = list_view->get_drawable_func (list_view->gimage);
if (drawable != GIMP_DRAWABLE (item))
{
list_view->set_drawable_func (list_view->gimage,
GIMP_DRAWABLE (item));
gdisplays_flush ();
}
index = gimp_container_get_child_index (view->container,
GIMP_OBJECT (item));
if (view->container->num_children > 1)
{
if (index > 0)
raise_sensitive = TRUE;
if (index < (view->container->num_children - 1))
lower_sensitive = TRUE;
}
duplicate_sensitive = TRUE;
edit_sensitive = TRUE;
delete_sensitive = TRUE;
}
gtk_widget_set_sensitive (list_view->raise_button, raise_sensitive);
gtk_widget_set_sensitive (list_view->lower_button, lower_sensitive);
gtk_widget_set_sensitive (list_view->duplicate_button, duplicate_sensitive);
gtk_widget_set_sensitive (list_view->edit_button, edit_sensitive);
gtk_widget_set_sensitive (list_view->delete_button, delete_sensitive);
}
static void
@ -423,14 +493,25 @@ gimp_drawable_list_view_activate_item (GimpContainerView *view,
item,
insert_data);
g_print ("activate item\n");
gimp_drawable_list_view_edit_drawable (GIMP_DRAWABLE_LIST_VIEW (view),
GIMP_DRAWABLE (item));
}
static void
gimp_drawable_list_view_new_drawable (GimpDrawableListView *view,
GimpDrawable *drawable)
{
if (drawable)
g_print ("new with \"%s\"'s properties\n", GIMP_OBJECT (drawable)->name);
else
g_print ("new default\n");
}
static void
gimp_drawable_list_view_new_clicked (GtkWidget *widget,
GimpDrawableListView *view)
{
g_print ("new clicked\n");
gimp_drawable_list_view_new_drawable (view, NULL);
}
static void
@ -442,19 +523,34 @@ gimp_drawable_list_view_new_dropped (GtkWidget *widget,
view = (GimpDrawableListView *) data;
g_print ("new dropped\n");
if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container,
GIMP_OBJECT (viewable)))
{
gimp_drawable_list_view_new_drawable (view, GIMP_DRAWABLE (viewable));
}
}
static void
gimp_drawable_list_view_duplicate_drawable (GimpDrawableListView *view,
GimpDrawable *drawable)
{
GimpDrawable *new_drawable;
new_drawable = view->copy_drawable_func (drawable, TRUE);
view->add_drawable_func (view->gimage, new_drawable, -1);
gdisplays_flush ();
}
static void
gimp_drawable_list_view_duplicate_clicked (GtkWidget *widget,
GimpDrawableListView *view)
{
g_print ("duplicate clicked\n");
GimpDrawable *drawable;
drawable = view->get_drawable_func (view->gimage);
gimp_drawable_list_view_duplicate_drawable (view, drawable);
}
static void
@ -466,12 +562,11 @@ gimp_drawable_list_view_duplicate_dropped (GtkWidget *widget,
view = (GimpDrawableListView *) data;
g_print ("duplicate dropped\n");
if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container,
GIMP_OBJECT (viewable)))
{
gimp_drawable_list_view_duplicate_clicked (NULL, data);
gimp_drawable_list_view_duplicate_drawable (view,
GIMP_DRAWABLE (viewable));
}
}
@ -479,21 +574,60 @@ static void
gimp_drawable_list_view_raise_clicked (GtkWidget *widget,
GimpDrawableListView *view)
{
g_print ("raise clicked\n");
GimpContainer *container;
GimpDrawable *drawable;
gint index;
container = GIMP_CONTAINER_VIEW (view)->container;
drawable = view->get_drawable_func (view->gimage);
index = gimp_container_get_child_index (container, GIMP_OBJECT (drawable));
if (index > 0)
{
view->reorder_drawable_func (view->gimage, drawable, index - 1, TRUE);
gdisplays_flush ();
}
}
static void
gimp_drawable_list_view_lower_clicked (GtkWidget *widget,
GimpDrawableListView *view)
{
g_print ("lower clicked\n");
GimpContainer *container;
GimpDrawable *drawable;
gint index;
container = GIMP_CONTAINER_VIEW (view)->container;
drawable = view->get_drawable_func (view->gimage);
index = gimp_container_get_child_index (container, GIMP_OBJECT (drawable));
if (index < container->num_children - 1)
{
view->reorder_drawable_func (view->gimage, drawable, index + 1, TRUE);
gdisplays_flush ();
}
}
static void
gimp_drawable_list_view_edit_drawable (GimpDrawableListView *view,
GimpDrawable *drawable)
{
g_print ("edit \"%s\"\n", GIMP_OBJECT (drawable)->name);
}
static void
gimp_drawable_list_view_edit_clicked (GtkWidget *widget,
GimpDrawableListView *view)
{
g_print ("edit clicked\n");
GimpDrawable *drawable;
drawable = view->get_drawable_func (view->gimage);
gimp_drawable_list_view_edit_drawable (view, drawable);
}
static void
@ -505,20 +639,31 @@ gimp_drawable_list_view_edit_dropped (GtkWidget *widget,
view = (GimpDrawableListView *) data;
g_print ("edit dropped\n");
if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container,
GIMP_OBJECT (viewable)))
{
gimp_drawable_list_view_edit_clicked (NULL, data);
gimp_drawable_list_view_edit_drawable (view, GIMP_DRAWABLE (viewable));
}
}
static void
gimp_drawable_list_view_delete_drawable (GimpDrawableListView *view,
GimpDrawable *drawable)
{
view->remove_drawable_func (view->gimage, drawable);
gdisplays_flush ();
}
static void
gimp_drawable_list_view_delete_clicked (GtkWidget *widget,
GimpDrawableListView *view)
{
g_print ("delete clicked\n");
GimpDrawable *drawable;
drawable = view->get_drawable_func (view->gimage);
gimp_drawable_list_view_delete_drawable (view, drawable);
}
static void
@ -530,12 +675,10 @@ gimp_drawable_list_view_delete_dropped (GtkWidget *widget,
view = (GimpDrawableListView *) data;
g_print ("delete dropped\n");
if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container,
GIMP_OBJECT (viewable)))
{
gimp_drawable_list_view_delete_clicked (NULL, data);
gimp_drawable_list_view_delete_drawable (view, GIMP_DRAWABLE (viewable));
}
}

View file

@ -23,10 +23,21 @@
#include "gimpcontainerlistview.h"
typedef GimpContainer * (* GimpGetContainerFunc) (const GimpImage *gimage);
typedef GimpDrawable * (* GimpGetDrawableFunc) (const GimpImage *gimage);
typedef void (* GimpSetDrawableFunc) (GimpImage *gimage,
GimpDrawable *drawable);
typedef GimpContainer * (* GimpGetContainerFunc) (const GimpImage *gimage);
typedef GimpDrawable * (* GimpGetDrawableFunc) (const GimpImage *gimage);
typedef void (* GimpSetDrawableFunc) (GimpImage *gimage,
GimpDrawable *drawable);
typedef void (* GimpReorderDrawableFunc) (GimpImage *gimage,
GimpDrawable *drawable,
gint new_index,
gboolean push_undo);
typedef void (* GimpAddDrawableFunc) (GimpImage *gimage,
GimpDrawable *drawable,
gint index);
typedef void (* GimpRemoveDrawableFunc) (GimpImage *gimage,
GimpDrawable *drawable);
typedef GimpDrawable * (* GimpCopyDrawableFunc) (GimpDrawable *drawable,
gboolean add_alpha);
#define GIMP_TYPE_DRAWABLE_LIST_VIEW (gimp_drawable_list_view_get_type ())
@ -40,25 +51,29 @@ typedef struct _GimpDrawableListViewClass GimpDrawableListViewClass;
struct _GimpDrawableListView
{
GimpContainerListView parent_instance;
GimpContainerListView parent_instance;
GimpImage *gimage;
GimpImage *gimage;
GtkType drawable_type;
gchar *signal_name;
GtkType drawable_type;
gchar *signal_name;
GimpGetContainerFunc get_container_func;
GimpGetDrawableFunc get_drawable_func;
GimpSetDrawableFunc set_drawable_func;
GimpGetContainerFunc get_container_func;
GimpGetDrawableFunc get_drawable_func;
GimpSetDrawableFunc set_drawable_func;
GimpReorderDrawableFunc reorder_drawable_func;
GimpAddDrawableFunc add_drawable_func;
GimpRemoveDrawableFunc remove_drawable_func;
GimpCopyDrawableFunc copy_drawable_func;
GtkWidget *button_box;
GtkWidget *button_box;
GtkWidget *new_button;
GtkWidget *raise_button;
GtkWidget *lower_button;
GtkWidget *duplicate_button;
GtkWidget *edit_button;
GtkWidget *delete_button;
GtkWidget *new_button;
GtkWidget *raise_button;
GtkWidget *lower_button;
GtkWidget *duplicate_button;
GtkWidget *edit_button;
GtkWidget *delete_button;
};
struct _GimpDrawableListViewClass
@ -69,12 +84,16 @@ struct _GimpDrawableListViewClass
GtkType gimp_drawable_list_view_get_type (void);
GtkWidget * gimp_drawable_list_view_new (GimpImage *gimage,
GtkType drawable_type,
const gchar *signal_name,
GimpGetContainerFunc get_container_func,
GimpGetDrawableFunc get_drawable_func,
GimpSetDrawableFunc set_drawable_func);
GtkWidget * gimp_drawable_list_view_new (GimpImage *gimage,
GtkType drawable_type,
const gchar *signal_name,
GimpGetContainerFunc get_container_func,
GimpGetDrawableFunc get_drawable_func,
GimpSetDrawableFunc set_drawable_func,
GimpReorderDrawableFunc reorder_drawable_func,
GimpAddDrawableFunc add_drawable_func,
GimpRemoveDrawableFunc remove_drawable_func,
GimpCopyDrawableFunc copy_drawable_func);
void gimp_drawable_list_view_set_image (GimpDrawableListView *view,
GimpImage *gimage);

View file

@ -25,6 +25,7 @@
#include "apptypes.h"
#include "gdisplay.h"
#include "gimpcontainer.h"
#include "gimpdrawable.h"
#include "gimpdrawablelistview.h"
@ -59,6 +60,8 @@ static void gimp_drawable_list_view_activate_item (GimpContainerView *v
GimpViewable *item,
gpointer insert_data);
static void gimp_drawable_list_view_new_drawable (GimpDrawableListView *view,
GimpDrawable *drawable);
static void gimp_drawable_list_view_new_clicked (GtkWidget *widget,
GimpDrawableListView *view);
static void gimp_drawable_list_view_new_dropped (GtkWidget *widget,
@ -68,16 +71,22 @@ static void gimp_drawable_list_view_raise_clicked (GtkWidget *w
GimpDrawableListView *view);
static void gimp_drawable_list_view_lower_clicked (GtkWidget *widget,
GimpDrawableListView *view);
static void gimp_drawable_list_view_duplicate_drawable (GimpDrawableListView *view,
GimpDrawable *drawable);
static void gimp_drawable_list_view_duplicate_clicked (GtkWidget *widget,
GimpDrawableListView *view);
static void gimp_drawable_list_view_duplicate_dropped (GtkWidget *widget,
GimpViewable *viewable,
gpointer drawable);
static void gimp_drawable_list_view_edit_drawable (GimpDrawableListView *view,
GimpDrawable *drawable);
static void gimp_drawable_list_view_edit_clicked (GtkWidget *widget,
GimpDrawableListView *view);
static void gimp_drawable_list_view_edit_dropped (GtkWidget *widget,
GimpViewable *viewable,
gpointer drawable);
static void gimp_drawable_list_view_delete_drawable (GimpDrawableListView *view,
GimpDrawable *drawable);
static void gimp_drawable_list_view_delete_clicked (GtkWidget *widget,
GimpDrawableListView *view);
static void gimp_drawable_list_view_delete_dropped (GtkWidget *widget,
@ -251,10 +260,12 @@ gimp_drawable_list_view_init (GimpDrawableListView *view)
gtk_container_add (GTK_CONTAINER (view->delete_button), pixmap);
gtk_widget_show (pixmap);
gtk_widget_set_sensitive (view->raise_button, FALSE);
gtk_widget_set_sensitive (view->lower_button, FALSE);
gtk_widget_set_sensitive (view->new_button, FALSE);
gtk_widget_set_sensitive (view->raise_button, FALSE);
gtk_widget_set_sensitive (view->lower_button, FALSE);
gtk_widget_set_sensitive (view->duplicate_button, FALSE);
gtk_widget_set_sensitive (view->delete_button, FALSE);
gtk_widget_set_sensitive (view->edit_button, FALSE);
gtk_widget_set_sensitive (view->delete_button, FALSE);
}
static void
@ -290,12 +301,16 @@ gimp_drawable_list_view_insert_item (GimpContainerView *view,
}
GtkWidget *
gimp_drawable_list_view_new (GimpImage *gimage,
GtkType drawable_type,
const gchar *signal_name,
GimpGetContainerFunc get_container_func,
GimpGetDrawableFunc get_drawable_func,
GimpSetDrawableFunc set_drawable_func)
gimp_drawable_list_view_new (GimpImage *gimage,
GtkType drawable_type,
const gchar *signal_name,
GimpGetContainerFunc get_container_func,
GimpGetDrawableFunc get_drawable_func,
GimpSetDrawableFunc set_drawable_func,
GimpReorderDrawableFunc reorder_drawable_func,
GimpAddDrawableFunc add_drawable_func,
GimpRemoveDrawableFunc remove_drawable_func,
GimpCopyDrawableFunc copy_drawable_func)
{
GimpDrawableListView *list_view;
GimpContainerView *view;
@ -305,6 +320,10 @@ gimp_drawable_list_view_new (GimpImage *gimage,
g_return_val_if_fail (get_container_func != NULL, NULL);
g_return_val_if_fail (get_drawable_func != NULL, NULL);
g_return_val_if_fail (get_drawable_func != NULL, NULL);
g_return_val_if_fail (reorder_drawable_func != NULL, NULL);
g_return_val_if_fail (add_drawable_func != NULL, NULL);
g_return_val_if_fail (remove_drawable_func != NULL, NULL);
g_return_val_if_fail (copy_drawable_func != NULL, NULL);
list_view = gtk_type_new (GIMP_TYPE_DRAWABLE_LIST_VIEW);
@ -312,11 +331,15 @@ gimp_drawable_list_view_new (GimpImage *gimage,
view->preview_size = preview_size;
list_view->drawable_type = drawable_type;
list_view->signal_name = g_strdup (signal_name);
list_view->get_container_func = get_container_func;
list_view->get_drawable_func = get_drawable_func;
list_view->set_drawable_func = set_drawable_func;
list_view->drawable_type = drawable_type;
list_view->signal_name = g_strdup (signal_name);
list_view->get_container_func = get_container_func;
list_view->get_drawable_func = get_drawable_func;
list_view->set_drawable_func = set_drawable_func;
list_view->reorder_drawable_func = reorder_drawable_func;
list_view->add_drawable_func = add_drawable_func;
list_view->remove_drawable_func = remove_drawable_func;
list_view->copy_drawable_func = copy_drawable_func;
/* drop to "new" */
gimp_gtk_drag_dest_set_by_type (GTK_WIDGET (list_view->new_button),
@ -398,6 +421,8 @@ gimp_drawable_list_view_set_image (GimpDrawableListView *view,
GTK_SIGNAL_FUNC (gimp_drawable_list_view_drawable_changed),
view);
}
gtk_widget_set_sensitive (view->new_button, (view->gimage != NULL));
}
static void
@ -405,12 +430,57 @@ gimp_drawable_list_view_select_item (GimpContainerView *view,
GimpViewable *item,
gpointer insert_data)
{
GimpDrawableListView *list_view;
gboolean raise_sensitive = FALSE;
gboolean lower_sensitive = FALSE;
gboolean duplicate_sensitive = FALSE;
gboolean edit_sensitive = FALSE;
gboolean delete_sensitive = FALSE;
list_view = GIMP_DRAWABLE_LIST_VIEW (view);
if (GIMP_CONTAINER_VIEW_CLASS (parent_class)->select_item)
GIMP_CONTAINER_VIEW_CLASS (parent_class)->select_item (view,
item,
insert_data);
g_print ("select item\n");
if (item)
{
GimpDrawable *drawable;
gint index;
drawable = list_view->get_drawable_func (list_view->gimage);
if (drawable != GIMP_DRAWABLE (item))
{
list_view->set_drawable_func (list_view->gimage,
GIMP_DRAWABLE (item));
gdisplays_flush ();
}
index = gimp_container_get_child_index (view->container,
GIMP_OBJECT (item));
if (view->container->num_children > 1)
{
if (index > 0)
raise_sensitive = TRUE;
if (index < (view->container->num_children - 1))
lower_sensitive = TRUE;
}
duplicate_sensitive = TRUE;
edit_sensitive = TRUE;
delete_sensitive = TRUE;
}
gtk_widget_set_sensitive (list_view->raise_button, raise_sensitive);
gtk_widget_set_sensitive (list_view->lower_button, lower_sensitive);
gtk_widget_set_sensitive (list_view->duplicate_button, duplicate_sensitive);
gtk_widget_set_sensitive (list_view->edit_button, edit_sensitive);
gtk_widget_set_sensitive (list_view->delete_button, delete_sensitive);
}
static void
@ -423,14 +493,25 @@ gimp_drawable_list_view_activate_item (GimpContainerView *view,
item,
insert_data);
g_print ("activate item\n");
gimp_drawable_list_view_edit_drawable (GIMP_DRAWABLE_LIST_VIEW (view),
GIMP_DRAWABLE (item));
}
static void
gimp_drawable_list_view_new_drawable (GimpDrawableListView *view,
GimpDrawable *drawable)
{
if (drawable)
g_print ("new with \"%s\"'s properties\n", GIMP_OBJECT (drawable)->name);
else
g_print ("new default\n");
}
static void
gimp_drawable_list_view_new_clicked (GtkWidget *widget,
GimpDrawableListView *view)
{
g_print ("new clicked\n");
gimp_drawable_list_view_new_drawable (view, NULL);
}
static void
@ -442,19 +523,34 @@ gimp_drawable_list_view_new_dropped (GtkWidget *widget,
view = (GimpDrawableListView *) data;
g_print ("new dropped\n");
if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container,
GIMP_OBJECT (viewable)))
{
gimp_drawable_list_view_new_drawable (view, GIMP_DRAWABLE (viewable));
}
}
static void
gimp_drawable_list_view_duplicate_drawable (GimpDrawableListView *view,
GimpDrawable *drawable)
{
GimpDrawable *new_drawable;
new_drawable = view->copy_drawable_func (drawable, TRUE);
view->add_drawable_func (view->gimage, new_drawable, -1);
gdisplays_flush ();
}
static void
gimp_drawable_list_view_duplicate_clicked (GtkWidget *widget,
GimpDrawableListView *view)
{
g_print ("duplicate clicked\n");
GimpDrawable *drawable;
drawable = view->get_drawable_func (view->gimage);
gimp_drawable_list_view_duplicate_drawable (view, drawable);
}
static void
@ -466,12 +562,11 @@ gimp_drawable_list_view_duplicate_dropped (GtkWidget *widget,
view = (GimpDrawableListView *) data;
g_print ("duplicate dropped\n");
if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container,
GIMP_OBJECT (viewable)))
{
gimp_drawable_list_view_duplicate_clicked (NULL, data);
gimp_drawable_list_view_duplicate_drawable (view,
GIMP_DRAWABLE (viewable));
}
}
@ -479,21 +574,60 @@ static void
gimp_drawable_list_view_raise_clicked (GtkWidget *widget,
GimpDrawableListView *view)
{
g_print ("raise clicked\n");
GimpContainer *container;
GimpDrawable *drawable;
gint index;
container = GIMP_CONTAINER_VIEW (view)->container;
drawable = view->get_drawable_func (view->gimage);
index = gimp_container_get_child_index (container, GIMP_OBJECT (drawable));
if (index > 0)
{
view->reorder_drawable_func (view->gimage, drawable, index - 1, TRUE);
gdisplays_flush ();
}
}
static void
gimp_drawable_list_view_lower_clicked (GtkWidget *widget,
GimpDrawableListView *view)
{
g_print ("lower clicked\n");
GimpContainer *container;
GimpDrawable *drawable;
gint index;
container = GIMP_CONTAINER_VIEW (view)->container;
drawable = view->get_drawable_func (view->gimage);
index = gimp_container_get_child_index (container, GIMP_OBJECT (drawable));
if (index < container->num_children - 1)
{
view->reorder_drawable_func (view->gimage, drawable, index + 1, TRUE);
gdisplays_flush ();
}
}
static void
gimp_drawable_list_view_edit_drawable (GimpDrawableListView *view,
GimpDrawable *drawable)
{
g_print ("edit \"%s\"\n", GIMP_OBJECT (drawable)->name);
}
static void
gimp_drawable_list_view_edit_clicked (GtkWidget *widget,
GimpDrawableListView *view)
{
g_print ("edit clicked\n");
GimpDrawable *drawable;
drawable = view->get_drawable_func (view->gimage);
gimp_drawable_list_view_edit_drawable (view, drawable);
}
static void
@ -505,20 +639,31 @@ gimp_drawable_list_view_edit_dropped (GtkWidget *widget,
view = (GimpDrawableListView *) data;
g_print ("edit dropped\n");
if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container,
GIMP_OBJECT (viewable)))
{
gimp_drawable_list_view_edit_clicked (NULL, data);
gimp_drawable_list_view_edit_drawable (view, GIMP_DRAWABLE (viewable));
}
}
static void
gimp_drawable_list_view_delete_drawable (GimpDrawableListView *view,
GimpDrawable *drawable)
{
view->remove_drawable_func (view->gimage, drawable);
gdisplays_flush ();
}
static void
gimp_drawable_list_view_delete_clicked (GtkWidget *widget,
GimpDrawableListView *view)
{
g_print ("delete clicked\n");
GimpDrawable *drawable;
drawable = view->get_drawable_func (view->gimage);
gimp_drawable_list_view_delete_drawable (view, drawable);
}
static void
@ -530,12 +675,10 @@ gimp_drawable_list_view_delete_dropped (GtkWidget *widget,
view = (GimpDrawableListView *) data;
g_print ("delete dropped\n");
if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container,
GIMP_OBJECT (viewable)))
{
gimp_drawable_list_view_delete_clicked (NULL, data);
gimp_drawable_list_view_delete_drawable (view, GIMP_DRAWABLE (viewable));
}
}

View file

@ -23,10 +23,21 @@
#include "gimpcontainerlistview.h"
typedef GimpContainer * (* GimpGetContainerFunc) (const GimpImage *gimage);
typedef GimpDrawable * (* GimpGetDrawableFunc) (const GimpImage *gimage);
typedef void (* GimpSetDrawableFunc) (GimpImage *gimage,
GimpDrawable *drawable);
typedef GimpContainer * (* GimpGetContainerFunc) (const GimpImage *gimage);
typedef GimpDrawable * (* GimpGetDrawableFunc) (const GimpImage *gimage);
typedef void (* GimpSetDrawableFunc) (GimpImage *gimage,
GimpDrawable *drawable);
typedef void (* GimpReorderDrawableFunc) (GimpImage *gimage,
GimpDrawable *drawable,
gint new_index,
gboolean push_undo);
typedef void (* GimpAddDrawableFunc) (GimpImage *gimage,
GimpDrawable *drawable,
gint index);
typedef void (* GimpRemoveDrawableFunc) (GimpImage *gimage,
GimpDrawable *drawable);
typedef GimpDrawable * (* GimpCopyDrawableFunc) (GimpDrawable *drawable,
gboolean add_alpha);
#define GIMP_TYPE_DRAWABLE_LIST_VIEW (gimp_drawable_list_view_get_type ())
@ -40,25 +51,29 @@ typedef struct _GimpDrawableListViewClass GimpDrawableListViewClass;
struct _GimpDrawableListView
{
GimpContainerListView parent_instance;
GimpContainerListView parent_instance;
GimpImage *gimage;
GimpImage *gimage;
GtkType drawable_type;
gchar *signal_name;
GtkType drawable_type;
gchar *signal_name;
GimpGetContainerFunc get_container_func;
GimpGetDrawableFunc get_drawable_func;
GimpSetDrawableFunc set_drawable_func;
GimpGetContainerFunc get_container_func;
GimpGetDrawableFunc get_drawable_func;
GimpSetDrawableFunc set_drawable_func;
GimpReorderDrawableFunc reorder_drawable_func;
GimpAddDrawableFunc add_drawable_func;
GimpRemoveDrawableFunc remove_drawable_func;
GimpCopyDrawableFunc copy_drawable_func;
GtkWidget *button_box;
GtkWidget *button_box;
GtkWidget *new_button;
GtkWidget *raise_button;
GtkWidget *lower_button;
GtkWidget *duplicate_button;
GtkWidget *edit_button;
GtkWidget *delete_button;
GtkWidget *new_button;
GtkWidget *raise_button;
GtkWidget *lower_button;
GtkWidget *duplicate_button;
GtkWidget *edit_button;
GtkWidget *delete_button;
};
struct _GimpDrawableListViewClass
@ -69,12 +84,16 @@ struct _GimpDrawableListViewClass
GtkType gimp_drawable_list_view_get_type (void);
GtkWidget * gimp_drawable_list_view_new (GimpImage *gimage,
GtkType drawable_type,
const gchar *signal_name,
GimpGetContainerFunc get_container_func,
GimpGetDrawableFunc get_drawable_func,
GimpSetDrawableFunc set_drawable_func);
GtkWidget * gimp_drawable_list_view_new (GimpImage *gimage,
GtkType drawable_type,
const gchar *signal_name,
GimpGetContainerFunc get_container_func,
GimpGetDrawableFunc get_drawable_func,
GimpSetDrawableFunc set_drawable_func,
GimpReorderDrawableFunc reorder_drawable_func,
GimpAddDrawableFunc add_drawable_func,
GimpRemoveDrawableFunc remove_drawable_func,
GimpCopyDrawableFunc copy_drawable_func);
void gimp_drawable_list_view_set_image (GimpDrawableListView *view,
GimpImage *gimage);

View file

@ -25,6 +25,7 @@
#include "apptypes.h"
#include "gdisplay.h"
#include "gimpcontainer.h"
#include "gimpdrawable.h"
#include "gimpdrawablelistview.h"
@ -59,6 +60,8 @@ static void gimp_drawable_list_view_activate_item (GimpContainerView *v
GimpViewable *item,
gpointer insert_data);
static void gimp_drawable_list_view_new_drawable (GimpDrawableListView *view,
GimpDrawable *drawable);
static void gimp_drawable_list_view_new_clicked (GtkWidget *widget,
GimpDrawableListView *view);
static void gimp_drawable_list_view_new_dropped (GtkWidget *widget,
@ -68,16 +71,22 @@ static void gimp_drawable_list_view_raise_clicked (GtkWidget *w
GimpDrawableListView *view);
static void gimp_drawable_list_view_lower_clicked (GtkWidget *widget,
GimpDrawableListView *view);
static void gimp_drawable_list_view_duplicate_drawable (GimpDrawableListView *view,
GimpDrawable *drawable);
static void gimp_drawable_list_view_duplicate_clicked (GtkWidget *widget,
GimpDrawableListView *view);
static void gimp_drawable_list_view_duplicate_dropped (GtkWidget *widget,
GimpViewable *viewable,
gpointer drawable);
static void gimp_drawable_list_view_edit_drawable (GimpDrawableListView *view,
GimpDrawable *drawable);
static void gimp_drawable_list_view_edit_clicked (GtkWidget *widget,
GimpDrawableListView *view);
static void gimp_drawable_list_view_edit_dropped (GtkWidget *widget,
GimpViewable *viewable,
gpointer drawable);
static void gimp_drawable_list_view_delete_drawable (GimpDrawableListView *view,
GimpDrawable *drawable);
static void gimp_drawable_list_view_delete_clicked (GtkWidget *widget,
GimpDrawableListView *view);
static void gimp_drawable_list_view_delete_dropped (GtkWidget *widget,
@ -251,10 +260,12 @@ gimp_drawable_list_view_init (GimpDrawableListView *view)
gtk_container_add (GTK_CONTAINER (view->delete_button), pixmap);
gtk_widget_show (pixmap);
gtk_widget_set_sensitive (view->raise_button, FALSE);
gtk_widget_set_sensitive (view->lower_button, FALSE);
gtk_widget_set_sensitive (view->new_button, FALSE);
gtk_widget_set_sensitive (view->raise_button, FALSE);
gtk_widget_set_sensitive (view->lower_button, FALSE);
gtk_widget_set_sensitive (view->duplicate_button, FALSE);
gtk_widget_set_sensitive (view->delete_button, FALSE);
gtk_widget_set_sensitive (view->edit_button, FALSE);
gtk_widget_set_sensitive (view->delete_button, FALSE);
}
static void
@ -290,12 +301,16 @@ gimp_drawable_list_view_insert_item (GimpContainerView *view,
}
GtkWidget *
gimp_drawable_list_view_new (GimpImage *gimage,
GtkType drawable_type,
const gchar *signal_name,
GimpGetContainerFunc get_container_func,
GimpGetDrawableFunc get_drawable_func,
GimpSetDrawableFunc set_drawable_func)
gimp_drawable_list_view_new (GimpImage *gimage,
GtkType drawable_type,
const gchar *signal_name,
GimpGetContainerFunc get_container_func,
GimpGetDrawableFunc get_drawable_func,
GimpSetDrawableFunc set_drawable_func,
GimpReorderDrawableFunc reorder_drawable_func,
GimpAddDrawableFunc add_drawable_func,
GimpRemoveDrawableFunc remove_drawable_func,
GimpCopyDrawableFunc copy_drawable_func)
{
GimpDrawableListView *list_view;
GimpContainerView *view;
@ -305,6 +320,10 @@ gimp_drawable_list_view_new (GimpImage *gimage,
g_return_val_if_fail (get_container_func != NULL, NULL);
g_return_val_if_fail (get_drawable_func != NULL, NULL);
g_return_val_if_fail (get_drawable_func != NULL, NULL);
g_return_val_if_fail (reorder_drawable_func != NULL, NULL);
g_return_val_if_fail (add_drawable_func != NULL, NULL);
g_return_val_if_fail (remove_drawable_func != NULL, NULL);
g_return_val_if_fail (copy_drawable_func != NULL, NULL);
list_view = gtk_type_new (GIMP_TYPE_DRAWABLE_LIST_VIEW);
@ -312,11 +331,15 @@ gimp_drawable_list_view_new (GimpImage *gimage,
view->preview_size = preview_size;
list_view->drawable_type = drawable_type;
list_view->signal_name = g_strdup (signal_name);
list_view->get_container_func = get_container_func;
list_view->get_drawable_func = get_drawable_func;
list_view->set_drawable_func = set_drawable_func;
list_view->drawable_type = drawable_type;
list_view->signal_name = g_strdup (signal_name);
list_view->get_container_func = get_container_func;
list_view->get_drawable_func = get_drawable_func;
list_view->set_drawable_func = set_drawable_func;
list_view->reorder_drawable_func = reorder_drawable_func;
list_view->add_drawable_func = add_drawable_func;
list_view->remove_drawable_func = remove_drawable_func;
list_view->copy_drawable_func = copy_drawable_func;
/* drop to "new" */
gimp_gtk_drag_dest_set_by_type (GTK_WIDGET (list_view->new_button),
@ -398,6 +421,8 @@ gimp_drawable_list_view_set_image (GimpDrawableListView *view,
GTK_SIGNAL_FUNC (gimp_drawable_list_view_drawable_changed),
view);
}
gtk_widget_set_sensitive (view->new_button, (view->gimage != NULL));
}
static void
@ -405,12 +430,57 @@ gimp_drawable_list_view_select_item (GimpContainerView *view,
GimpViewable *item,
gpointer insert_data)
{
GimpDrawableListView *list_view;
gboolean raise_sensitive = FALSE;
gboolean lower_sensitive = FALSE;
gboolean duplicate_sensitive = FALSE;
gboolean edit_sensitive = FALSE;
gboolean delete_sensitive = FALSE;
list_view = GIMP_DRAWABLE_LIST_VIEW (view);
if (GIMP_CONTAINER_VIEW_CLASS (parent_class)->select_item)
GIMP_CONTAINER_VIEW_CLASS (parent_class)->select_item (view,
item,
insert_data);
g_print ("select item\n");
if (item)
{
GimpDrawable *drawable;
gint index;
drawable = list_view->get_drawable_func (list_view->gimage);
if (drawable != GIMP_DRAWABLE (item))
{
list_view->set_drawable_func (list_view->gimage,
GIMP_DRAWABLE (item));
gdisplays_flush ();
}
index = gimp_container_get_child_index (view->container,
GIMP_OBJECT (item));
if (view->container->num_children > 1)
{
if (index > 0)
raise_sensitive = TRUE;
if (index < (view->container->num_children - 1))
lower_sensitive = TRUE;
}
duplicate_sensitive = TRUE;
edit_sensitive = TRUE;
delete_sensitive = TRUE;
}
gtk_widget_set_sensitive (list_view->raise_button, raise_sensitive);
gtk_widget_set_sensitive (list_view->lower_button, lower_sensitive);
gtk_widget_set_sensitive (list_view->duplicate_button, duplicate_sensitive);
gtk_widget_set_sensitive (list_view->edit_button, edit_sensitive);
gtk_widget_set_sensitive (list_view->delete_button, delete_sensitive);
}
static void
@ -423,14 +493,25 @@ gimp_drawable_list_view_activate_item (GimpContainerView *view,
item,
insert_data);
g_print ("activate item\n");
gimp_drawable_list_view_edit_drawable (GIMP_DRAWABLE_LIST_VIEW (view),
GIMP_DRAWABLE (item));
}
static void
gimp_drawable_list_view_new_drawable (GimpDrawableListView *view,
GimpDrawable *drawable)
{
if (drawable)
g_print ("new with \"%s\"'s properties\n", GIMP_OBJECT (drawable)->name);
else
g_print ("new default\n");
}
static void
gimp_drawable_list_view_new_clicked (GtkWidget *widget,
GimpDrawableListView *view)
{
g_print ("new clicked\n");
gimp_drawable_list_view_new_drawable (view, NULL);
}
static void
@ -442,19 +523,34 @@ gimp_drawable_list_view_new_dropped (GtkWidget *widget,
view = (GimpDrawableListView *) data;
g_print ("new dropped\n");
if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container,
GIMP_OBJECT (viewable)))
{
gimp_drawable_list_view_new_drawable (view, GIMP_DRAWABLE (viewable));
}
}
static void
gimp_drawable_list_view_duplicate_drawable (GimpDrawableListView *view,
GimpDrawable *drawable)
{
GimpDrawable *new_drawable;
new_drawable = view->copy_drawable_func (drawable, TRUE);
view->add_drawable_func (view->gimage, new_drawable, -1);
gdisplays_flush ();
}
static void
gimp_drawable_list_view_duplicate_clicked (GtkWidget *widget,
GimpDrawableListView *view)
{
g_print ("duplicate clicked\n");
GimpDrawable *drawable;
drawable = view->get_drawable_func (view->gimage);
gimp_drawable_list_view_duplicate_drawable (view, drawable);
}
static void
@ -466,12 +562,11 @@ gimp_drawable_list_view_duplicate_dropped (GtkWidget *widget,
view = (GimpDrawableListView *) data;
g_print ("duplicate dropped\n");
if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container,
GIMP_OBJECT (viewable)))
{
gimp_drawable_list_view_duplicate_clicked (NULL, data);
gimp_drawable_list_view_duplicate_drawable (view,
GIMP_DRAWABLE (viewable));
}
}
@ -479,21 +574,60 @@ static void
gimp_drawable_list_view_raise_clicked (GtkWidget *widget,
GimpDrawableListView *view)
{
g_print ("raise clicked\n");
GimpContainer *container;
GimpDrawable *drawable;
gint index;
container = GIMP_CONTAINER_VIEW (view)->container;
drawable = view->get_drawable_func (view->gimage);
index = gimp_container_get_child_index (container, GIMP_OBJECT (drawable));
if (index > 0)
{
view->reorder_drawable_func (view->gimage, drawable, index - 1, TRUE);
gdisplays_flush ();
}
}
static void
gimp_drawable_list_view_lower_clicked (GtkWidget *widget,
GimpDrawableListView *view)
{
g_print ("lower clicked\n");
GimpContainer *container;
GimpDrawable *drawable;
gint index;
container = GIMP_CONTAINER_VIEW (view)->container;
drawable = view->get_drawable_func (view->gimage);
index = gimp_container_get_child_index (container, GIMP_OBJECT (drawable));
if (index < container->num_children - 1)
{
view->reorder_drawable_func (view->gimage, drawable, index + 1, TRUE);
gdisplays_flush ();
}
}
static void
gimp_drawable_list_view_edit_drawable (GimpDrawableListView *view,
GimpDrawable *drawable)
{
g_print ("edit \"%s\"\n", GIMP_OBJECT (drawable)->name);
}
static void
gimp_drawable_list_view_edit_clicked (GtkWidget *widget,
GimpDrawableListView *view)
{
g_print ("edit clicked\n");
GimpDrawable *drawable;
drawable = view->get_drawable_func (view->gimage);
gimp_drawable_list_view_edit_drawable (view, drawable);
}
static void
@ -505,20 +639,31 @@ gimp_drawable_list_view_edit_dropped (GtkWidget *widget,
view = (GimpDrawableListView *) data;
g_print ("edit dropped\n");
if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container,
GIMP_OBJECT (viewable)))
{
gimp_drawable_list_view_edit_clicked (NULL, data);
gimp_drawable_list_view_edit_drawable (view, GIMP_DRAWABLE (viewable));
}
}
static void
gimp_drawable_list_view_delete_drawable (GimpDrawableListView *view,
GimpDrawable *drawable)
{
view->remove_drawable_func (view->gimage, drawable);
gdisplays_flush ();
}
static void
gimp_drawable_list_view_delete_clicked (GtkWidget *widget,
GimpDrawableListView *view)
{
g_print ("delete clicked\n");
GimpDrawable *drawable;
drawable = view->get_drawable_func (view->gimage);
gimp_drawable_list_view_delete_drawable (view, drawable);
}
static void
@ -530,12 +675,10 @@ gimp_drawable_list_view_delete_dropped (GtkWidget *widget,
view = (GimpDrawableListView *) data;
g_print ("delete dropped\n");
if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container,
GIMP_OBJECT (viewable)))
{
gimp_drawable_list_view_delete_clicked (NULL, data);
gimp_drawable_list_view_delete_drawable (view, GIMP_DRAWABLE (viewable));
}
}

View file

@ -23,10 +23,21 @@
#include "gimpcontainerlistview.h"
typedef GimpContainer * (* GimpGetContainerFunc) (const GimpImage *gimage);
typedef GimpDrawable * (* GimpGetDrawableFunc) (const GimpImage *gimage);
typedef void (* GimpSetDrawableFunc) (GimpImage *gimage,
GimpDrawable *drawable);
typedef GimpContainer * (* GimpGetContainerFunc) (const GimpImage *gimage);
typedef GimpDrawable * (* GimpGetDrawableFunc) (const GimpImage *gimage);
typedef void (* GimpSetDrawableFunc) (GimpImage *gimage,
GimpDrawable *drawable);
typedef void (* GimpReorderDrawableFunc) (GimpImage *gimage,
GimpDrawable *drawable,
gint new_index,
gboolean push_undo);
typedef void (* GimpAddDrawableFunc) (GimpImage *gimage,
GimpDrawable *drawable,
gint index);
typedef void (* GimpRemoveDrawableFunc) (GimpImage *gimage,
GimpDrawable *drawable);
typedef GimpDrawable * (* GimpCopyDrawableFunc) (GimpDrawable *drawable,
gboolean add_alpha);
#define GIMP_TYPE_DRAWABLE_LIST_VIEW (gimp_drawable_list_view_get_type ())
@ -40,25 +51,29 @@ typedef struct _GimpDrawableListViewClass GimpDrawableListViewClass;
struct _GimpDrawableListView
{
GimpContainerListView parent_instance;
GimpContainerListView parent_instance;
GimpImage *gimage;
GimpImage *gimage;
GtkType drawable_type;
gchar *signal_name;
GtkType drawable_type;
gchar *signal_name;
GimpGetContainerFunc get_container_func;
GimpGetDrawableFunc get_drawable_func;
GimpSetDrawableFunc set_drawable_func;
GimpGetContainerFunc get_container_func;
GimpGetDrawableFunc get_drawable_func;
GimpSetDrawableFunc set_drawable_func;
GimpReorderDrawableFunc reorder_drawable_func;
GimpAddDrawableFunc add_drawable_func;
GimpRemoveDrawableFunc remove_drawable_func;
GimpCopyDrawableFunc copy_drawable_func;
GtkWidget *button_box;
GtkWidget *button_box;
GtkWidget *new_button;
GtkWidget *raise_button;
GtkWidget *lower_button;
GtkWidget *duplicate_button;
GtkWidget *edit_button;
GtkWidget *delete_button;
GtkWidget *new_button;
GtkWidget *raise_button;
GtkWidget *lower_button;
GtkWidget *duplicate_button;
GtkWidget *edit_button;
GtkWidget *delete_button;
};
struct _GimpDrawableListViewClass
@ -69,12 +84,16 @@ struct _GimpDrawableListViewClass
GtkType gimp_drawable_list_view_get_type (void);
GtkWidget * gimp_drawable_list_view_new (GimpImage *gimage,
GtkType drawable_type,
const gchar *signal_name,
GimpGetContainerFunc get_container_func,
GimpGetDrawableFunc get_drawable_func,
GimpSetDrawableFunc set_drawable_func);
GtkWidget * gimp_drawable_list_view_new (GimpImage *gimage,
GtkType drawable_type,
const gchar *signal_name,
GimpGetContainerFunc get_container_func,
GimpGetDrawableFunc get_drawable_func,
GimpSetDrawableFunc set_drawable_func,
GimpReorderDrawableFunc reorder_drawable_func,
GimpAddDrawableFunc add_drawable_func,
GimpRemoveDrawableFunc remove_drawable_func,
GimpCopyDrawableFunc copy_drawable_func);
void gimp_drawable_list_view_set_image (GimpDrawableListView *view,
GimpImage *gimage);

View file

@ -25,6 +25,7 @@
#include "apptypes.h"
#include "gdisplay.h"
#include "gimpcontainer.h"
#include "gimpdrawable.h"
#include "gimpdrawablelistview.h"
@ -59,6 +60,8 @@ static void gimp_drawable_list_view_activate_item (GimpContainerView *v
GimpViewable *item,
gpointer insert_data);
static void gimp_drawable_list_view_new_drawable (GimpDrawableListView *view,
GimpDrawable *drawable);
static void gimp_drawable_list_view_new_clicked (GtkWidget *widget,
GimpDrawableListView *view);
static void gimp_drawable_list_view_new_dropped (GtkWidget *widget,
@ -68,16 +71,22 @@ static void gimp_drawable_list_view_raise_clicked (GtkWidget *w
GimpDrawableListView *view);
static void gimp_drawable_list_view_lower_clicked (GtkWidget *widget,
GimpDrawableListView *view);
static void gimp_drawable_list_view_duplicate_drawable (GimpDrawableListView *view,
GimpDrawable *drawable);
static void gimp_drawable_list_view_duplicate_clicked (GtkWidget *widget,
GimpDrawableListView *view);
static void gimp_drawable_list_view_duplicate_dropped (GtkWidget *widget,
GimpViewable *viewable,
gpointer drawable);
static void gimp_drawable_list_view_edit_drawable (GimpDrawableListView *view,
GimpDrawable *drawable);
static void gimp_drawable_list_view_edit_clicked (GtkWidget *widget,
GimpDrawableListView *view);
static void gimp_drawable_list_view_edit_dropped (GtkWidget *widget,
GimpViewable *viewable,
gpointer drawable);
static void gimp_drawable_list_view_delete_drawable (GimpDrawableListView *view,
GimpDrawable *drawable);
static void gimp_drawable_list_view_delete_clicked (GtkWidget *widget,
GimpDrawableListView *view);
static void gimp_drawable_list_view_delete_dropped (GtkWidget *widget,
@ -251,10 +260,12 @@ gimp_drawable_list_view_init (GimpDrawableListView *view)
gtk_container_add (GTK_CONTAINER (view->delete_button), pixmap);
gtk_widget_show (pixmap);
gtk_widget_set_sensitive (view->raise_button, FALSE);
gtk_widget_set_sensitive (view->lower_button, FALSE);
gtk_widget_set_sensitive (view->new_button, FALSE);
gtk_widget_set_sensitive (view->raise_button, FALSE);
gtk_widget_set_sensitive (view->lower_button, FALSE);
gtk_widget_set_sensitive (view->duplicate_button, FALSE);
gtk_widget_set_sensitive (view->delete_button, FALSE);
gtk_widget_set_sensitive (view->edit_button, FALSE);
gtk_widget_set_sensitive (view->delete_button, FALSE);
}
static void
@ -290,12 +301,16 @@ gimp_drawable_list_view_insert_item (GimpContainerView *view,
}
GtkWidget *
gimp_drawable_list_view_new (GimpImage *gimage,
GtkType drawable_type,
const gchar *signal_name,
GimpGetContainerFunc get_container_func,
GimpGetDrawableFunc get_drawable_func,
GimpSetDrawableFunc set_drawable_func)
gimp_drawable_list_view_new (GimpImage *gimage,
GtkType drawable_type,
const gchar *signal_name,
GimpGetContainerFunc get_container_func,
GimpGetDrawableFunc get_drawable_func,
GimpSetDrawableFunc set_drawable_func,
GimpReorderDrawableFunc reorder_drawable_func,
GimpAddDrawableFunc add_drawable_func,
GimpRemoveDrawableFunc remove_drawable_func,
GimpCopyDrawableFunc copy_drawable_func)
{
GimpDrawableListView *list_view;
GimpContainerView *view;
@ -305,6 +320,10 @@ gimp_drawable_list_view_new (GimpImage *gimage,
g_return_val_if_fail (get_container_func != NULL, NULL);
g_return_val_if_fail (get_drawable_func != NULL, NULL);
g_return_val_if_fail (get_drawable_func != NULL, NULL);
g_return_val_if_fail (reorder_drawable_func != NULL, NULL);
g_return_val_if_fail (add_drawable_func != NULL, NULL);
g_return_val_if_fail (remove_drawable_func != NULL, NULL);
g_return_val_if_fail (copy_drawable_func != NULL, NULL);
list_view = gtk_type_new (GIMP_TYPE_DRAWABLE_LIST_VIEW);
@ -312,11 +331,15 @@ gimp_drawable_list_view_new (GimpImage *gimage,
view->preview_size = preview_size;
list_view->drawable_type = drawable_type;
list_view->signal_name = g_strdup (signal_name);
list_view->get_container_func = get_container_func;
list_view->get_drawable_func = get_drawable_func;
list_view->set_drawable_func = set_drawable_func;
list_view->drawable_type = drawable_type;
list_view->signal_name = g_strdup (signal_name);
list_view->get_container_func = get_container_func;
list_view->get_drawable_func = get_drawable_func;
list_view->set_drawable_func = set_drawable_func;
list_view->reorder_drawable_func = reorder_drawable_func;
list_view->add_drawable_func = add_drawable_func;
list_view->remove_drawable_func = remove_drawable_func;
list_view->copy_drawable_func = copy_drawable_func;
/* drop to "new" */
gimp_gtk_drag_dest_set_by_type (GTK_WIDGET (list_view->new_button),
@ -398,6 +421,8 @@ gimp_drawable_list_view_set_image (GimpDrawableListView *view,
GTK_SIGNAL_FUNC (gimp_drawable_list_view_drawable_changed),
view);
}
gtk_widget_set_sensitive (view->new_button, (view->gimage != NULL));
}
static void
@ -405,12 +430,57 @@ gimp_drawable_list_view_select_item (GimpContainerView *view,
GimpViewable *item,
gpointer insert_data)
{
GimpDrawableListView *list_view;
gboolean raise_sensitive = FALSE;
gboolean lower_sensitive = FALSE;
gboolean duplicate_sensitive = FALSE;
gboolean edit_sensitive = FALSE;
gboolean delete_sensitive = FALSE;
list_view = GIMP_DRAWABLE_LIST_VIEW (view);
if (GIMP_CONTAINER_VIEW_CLASS (parent_class)->select_item)
GIMP_CONTAINER_VIEW_CLASS (parent_class)->select_item (view,
item,
insert_data);
g_print ("select item\n");
if (item)
{
GimpDrawable *drawable;
gint index;
drawable = list_view->get_drawable_func (list_view->gimage);
if (drawable != GIMP_DRAWABLE (item))
{
list_view->set_drawable_func (list_view->gimage,
GIMP_DRAWABLE (item));
gdisplays_flush ();
}
index = gimp_container_get_child_index (view->container,
GIMP_OBJECT (item));
if (view->container->num_children > 1)
{
if (index > 0)
raise_sensitive = TRUE;
if (index < (view->container->num_children - 1))
lower_sensitive = TRUE;
}
duplicate_sensitive = TRUE;
edit_sensitive = TRUE;
delete_sensitive = TRUE;
}
gtk_widget_set_sensitive (list_view->raise_button, raise_sensitive);
gtk_widget_set_sensitive (list_view->lower_button, lower_sensitive);
gtk_widget_set_sensitive (list_view->duplicate_button, duplicate_sensitive);
gtk_widget_set_sensitive (list_view->edit_button, edit_sensitive);
gtk_widget_set_sensitive (list_view->delete_button, delete_sensitive);
}
static void
@ -423,14 +493,25 @@ gimp_drawable_list_view_activate_item (GimpContainerView *view,
item,
insert_data);
g_print ("activate item\n");
gimp_drawable_list_view_edit_drawable (GIMP_DRAWABLE_LIST_VIEW (view),
GIMP_DRAWABLE (item));
}
static void
gimp_drawable_list_view_new_drawable (GimpDrawableListView *view,
GimpDrawable *drawable)
{
if (drawable)
g_print ("new with \"%s\"'s properties\n", GIMP_OBJECT (drawable)->name);
else
g_print ("new default\n");
}
static void
gimp_drawable_list_view_new_clicked (GtkWidget *widget,
GimpDrawableListView *view)
{
g_print ("new clicked\n");
gimp_drawable_list_view_new_drawable (view, NULL);
}
static void
@ -442,19 +523,34 @@ gimp_drawable_list_view_new_dropped (GtkWidget *widget,
view = (GimpDrawableListView *) data;
g_print ("new dropped\n");
if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container,
GIMP_OBJECT (viewable)))
{
gimp_drawable_list_view_new_drawable (view, GIMP_DRAWABLE (viewable));
}
}
static void
gimp_drawable_list_view_duplicate_drawable (GimpDrawableListView *view,
GimpDrawable *drawable)
{
GimpDrawable *new_drawable;
new_drawable = view->copy_drawable_func (drawable, TRUE);
view->add_drawable_func (view->gimage, new_drawable, -1);
gdisplays_flush ();
}
static void
gimp_drawable_list_view_duplicate_clicked (GtkWidget *widget,
GimpDrawableListView *view)
{
g_print ("duplicate clicked\n");
GimpDrawable *drawable;
drawable = view->get_drawable_func (view->gimage);
gimp_drawable_list_view_duplicate_drawable (view, drawable);
}
static void
@ -466,12 +562,11 @@ gimp_drawable_list_view_duplicate_dropped (GtkWidget *widget,
view = (GimpDrawableListView *) data;
g_print ("duplicate dropped\n");
if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container,
GIMP_OBJECT (viewable)))
{
gimp_drawable_list_view_duplicate_clicked (NULL, data);
gimp_drawable_list_view_duplicate_drawable (view,
GIMP_DRAWABLE (viewable));
}
}
@ -479,21 +574,60 @@ static void
gimp_drawable_list_view_raise_clicked (GtkWidget *widget,
GimpDrawableListView *view)
{
g_print ("raise clicked\n");
GimpContainer *container;
GimpDrawable *drawable;
gint index;
container = GIMP_CONTAINER_VIEW (view)->container;
drawable = view->get_drawable_func (view->gimage);
index = gimp_container_get_child_index (container, GIMP_OBJECT (drawable));
if (index > 0)
{
view->reorder_drawable_func (view->gimage, drawable, index - 1, TRUE);
gdisplays_flush ();
}
}
static void
gimp_drawable_list_view_lower_clicked (GtkWidget *widget,
GimpDrawableListView *view)
{
g_print ("lower clicked\n");
GimpContainer *container;
GimpDrawable *drawable;
gint index;
container = GIMP_CONTAINER_VIEW (view)->container;
drawable = view->get_drawable_func (view->gimage);
index = gimp_container_get_child_index (container, GIMP_OBJECT (drawable));
if (index < container->num_children - 1)
{
view->reorder_drawable_func (view->gimage, drawable, index + 1, TRUE);
gdisplays_flush ();
}
}
static void
gimp_drawable_list_view_edit_drawable (GimpDrawableListView *view,
GimpDrawable *drawable)
{
g_print ("edit \"%s\"\n", GIMP_OBJECT (drawable)->name);
}
static void
gimp_drawable_list_view_edit_clicked (GtkWidget *widget,
GimpDrawableListView *view)
{
g_print ("edit clicked\n");
GimpDrawable *drawable;
drawable = view->get_drawable_func (view->gimage);
gimp_drawable_list_view_edit_drawable (view, drawable);
}
static void
@ -505,20 +639,31 @@ gimp_drawable_list_view_edit_dropped (GtkWidget *widget,
view = (GimpDrawableListView *) data;
g_print ("edit dropped\n");
if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container,
GIMP_OBJECT (viewable)))
{
gimp_drawable_list_view_edit_clicked (NULL, data);
gimp_drawable_list_view_edit_drawable (view, GIMP_DRAWABLE (viewable));
}
}
static void
gimp_drawable_list_view_delete_drawable (GimpDrawableListView *view,
GimpDrawable *drawable)
{
view->remove_drawable_func (view->gimage, drawable);
gdisplays_flush ();
}
static void
gimp_drawable_list_view_delete_clicked (GtkWidget *widget,
GimpDrawableListView *view)
{
g_print ("delete clicked\n");
GimpDrawable *drawable;
drawable = view->get_drawable_func (view->gimage);
gimp_drawable_list_view_delete_drawable (view, drawable);
}
static void
@ -530,12 +675,10 @@ gimp_drawable_list_view_delete_dropped (GtkWidget *widget,
view = (GimpDrawableListView *) data;
g_print ("delete dropped\n");
if (viewable && gimp_container_have (GIMP_CONTAINER_VIEW (view)->container,
GIMP_OBJECT (viewable)))
{
gimp_drawable_list_view_delete_clicked (NULL, data);
gimp_drawable_list_view_delete_drawable (view, GIMP_DRAWABLE (viewable));
}
}

View file

@ -23,10 +23,21 @@
#include "gimpcontainerlistview.h"
typedef GimpContainer * (* GimpGetContainerFunc) (const GimpImage *gimage);
typedef GimpDrawable * (* GimpGetDrawableFunc) (const GimpImage *gimage);
typedef void (* GimpSetDrawableFunc) (GimpImage *gimage,
GimpDrawable *drawable);
typedef GimpContainer * (* GimpGetContainerFunc) (const GimpImage *gimage);
typedef GimpDrawable * (* GimpGetDrawableFunc) (const GimpImage *gimage);
typedef void (* GimpSetDrawableFunc) (GimpImage *gimage,
GimpDrawable *drawable);
typedef void (* GimpReorderDrawableFunc) (GimpImage *gimage,
GimpDrawable *drawable,
gint new_index,
gboolean push_undo);
typedef void (* GimpAddDrawableFunc) (GimpImage *gimage,
GimpDrawable *drawable,
gint index);
typedef void (* GimpRemoveDrawableFunc) (GimpImage *gimage,
GimpDrawable *drawable);
typedef GimpDrawable * (* GimpCopyDrawableFunc) (GimpDrawable *drawable,
gboolean add_alpha);
#define GIMP_TYPE_DRAWABLE_LIST_VIEW (gimp_drawable_list_view_get_type ())
@ -40,25 +51,29 @@ typedef struct _GimpDrawableListViewClass GimpDrawableListViewClass;
struct _GimpDrawableListView
{
GimpContainerListView parent_instance;
GimpContainerListView parent_instance;
GimpImage *gimage;
GimpImage *gimage;
GtkType drawable_type;
gchar *signal_name;
GtkType drawable_type;
gchar *signal_name;
GimpGetContainerFunc get_container_func;
GimpGetDrawableFunc get_drawable_func;
GimpSetDrawableFunc set_drawable_func;
GimpGetContainerFunc get_container_func;
GimpGetDrawableFunc get_drawable_func;
GimpSetDrawableFunc set_drawable_func;
GimpReorderDrawableFunc reorder_drawable_func;
GimpAddDrawableFunc add_drawable_func;
GimpRemoveDrawableFunc remove_drawable_func;
GimpCopyDrawableFunc copy_drawable_func;
GtkWidget *button_box;
GtkWidget *button_box;
GtkWidget *new_button;
GtkWidget *raise_button;
GtkWidget *lower_button;
GtkWidget *duplicate_button;
GtkWidget *edit_button;
GtkWidget *delete_button;
GtkWidget *new_button;
GtkWidget *raise_button;
GtkWidget *lower_button;
GtkWidget *duplicate_button;
GtkWidget *edit_button;
GtkWidget *delete_button;
};
struct _GimpDrawableListViewClass
@ -69,12 +84,16 @@ struct _GimpDrawableListViewClass
GtkType gimp_drawable_list_view_get_type (void);
GtkWidget * gimp_drawable_list_view_new (GimpImage *gimage,
GtkType drawable_type,
const gchar *signal_name,
GimpGetContainerFunc get_container_func,
GimpGetDrawableFunc get_drawable_func,
GimpSetDrawableFunc set_drawable_func);
GtkWidget * gimp_drawable_list_view_new (GimpImage *gimage,
GtkType drawable_type,
const gchar *signal_name,
GimpGetContainerFunc get_container_func,
GimpGetDrawableFunc get_drawable_func,
GimpSetDrawableFunc set_drawable_func,
GimpReorderDrawableFunc reorder_drawable_func,
GimpAddDrawableFunc add_drawable_func,
GimpRemoveDrawableFunc remove_drawable_func,
GimpCopyDrawableFunc copy_drawable_func);
void gimp_drawable_list_view_set_image (GimpDrawableListView *view,
GimpImage *gimage);

View file

@ -35,6 +35,7 @@
#include "gimplayerlistitem.h"
#include "gimpimage.h"
#include "gimplayer.h"
#include "gimplayermask.h"
#include "gimppreview.h"
#include "gimpviewable.h"
@ -55,8 +56,12 @@ static gboolean gimp_layer_list_item_drag_drop (GtkWidget *widget,
gint x,
gint y,
guint time);
static void gimp_layer_list_item_state_changed (GtkWidget *widget,
GtkStateType old_state);
static void gimp_layer_list_item_mask_changed (GimpLayer *layer,
GimpLayerListItem *layer_item);
static void gimp_layer_list_item_update_state (GtkWidget *widget);
static GimpDrawableListItemClass *parent_class = NULL;
@ -103,6 +108,7 @@ gimp_layer_list_item_class_init (GimpLayerListItemClass *klass)
widget_class->drag_motion = gimp_layer_list_item_drag_motion;
widget_class->drag_drop = gimp_layer_list_item_drag_drop;
widget_class->state_changed = gimp_layer_list_item_state_changed;
list_item_class->set_viewable = gimp_layer_list_item_set_viewable;
}
@ -123,6 +129,9 @@ gimp_layer_list_item_set_viewable (GimpListItem *list_item,
if (GIMP_LIST_ITEM_CLASS (parent_class)->set_viewable)
GIMP_LIST_ITEM_CLASS (parent_class)->set_viewable (list_item, viewable);
gimp_preview_set_size (GIMP_PREVIEW (list_item->preview),
list_item->preview_size, 2);
layer_item = GIMP_LAYER_LIST_ITEM (list_item);
layer = GIMP_LAYER (GIMP_PREVIEW (list_item->preview)->viewable);
@ -225,6 +234,16 @@ gimp_layer_list_item_drag_drop (GtkWidget *widget,
return return_val;
}
static void
gimp_layer_list_item_state_changed (GtkWidget *widget,
GtkStateType old_state)
{
if (GTK_WIDGET_CLASS (parent_class)->state_changed)
GTK_WIDGET_CLASS (parent_class)->state_changed (widget, old_state);
gimp_layer_list_item_update_state (widget);
}
static void
gimp_layer_list_item_mask_changed (GimpLayer *layer,
GimpLayerListItem *layer_item)
@ -239,18 +258,104 @@ gimp_layer_list_item_mask_changed (GimpLayer *layer,
{
layer_item->mask_preview = gimp_preview_new (GIMP_VIEWABLE (mask),
list_item->preview_size,
1, FALSE);
2, FALSE);
GIMP_PREVIEW (layer_item->mask_preview)->clickable = TRUE;
gtk_box_pack_start (GTK_BOX (list_item->hbox), layer_item->mask_preview,
FALSE, FALSE, 0);
gtk_box_reorder_child (GTK_BOX (list_item->hbox),
layer_item->mask_preview, 2);
gtk_widget_show (layer_item->mask_preview);
gtk_signal_connect_object
(GTK_OBJECT (mask), "apply_changed",
GTK_SIGNAL_FUNC (gimp_layer_list_item_update_state),
GTK_OBJECT (layer_item));
gtk_signal_connect_object_while_alive
(GTK_OBJECT (mask), "edit_changed",
GTK_SIGNAL_FUNC (gimp_layer_list_item_update_state),
GTK_OBJECT (layer_item));
gtk_signal_connect_object_while_alive
(GTK_OBJECT (mask), "show_changed",
GTK_SIGNAL_FUNC (gimp_layer_list_item_update_state),
GTK_OBJECT (layer_item));
}
else if (! mask && layer_item->mask_preview)
{
gtk_widget_destroy (layer_item->mask_preview);
layer_item->mask_preview = NULL;
}
gimp_layer_list_item_update_state (GTK_WIDGET (layer_item));
}
static void
gimp_layer_list_item_update_state (GtkWidget *widget)
{
GimpLayerListItem *layer_item;
GimpListItem *list_item;
GimpLayer *layer;
GimpLayerMask *mask;
GimpPreview *preview;
guchar layer_color[3] = { 0, 0, 0 };
guchar mask_color[3] = { 0, 0, 0 };
layer_item = GIMP_LAYER_LIST_ITEM (widget);
list_item = GIMP_LIST_ITEM (widget);
layer = GIMP_LAYER (GIMP_PREVIEW (list_item->preview)->viewable);
mask = gimp_layer_get_mask (layer);
switch (widget->state)
{
case GTK_STATE_NORMAL:
break;
case GTK_STATE_SELECTED:
if (! mask || (mask && ! gimp_layer_mask_get_edit (mask)))
{
layer_color[0] = 255;
layer_color[1] = 255;
layer_color[2] = 255;
}
else
{
mask_color[0] = 255;
mask_color[1] = 255;
mask_color[2] = 255;
}
break;
default:
g_print ("%s(): unhandled state\n", G_GNUC_FUNCTION);
}
preview = GIMP_PREVIEW (list_item->preview);
if (preview->border_color[0] != layer_color[0] ||
preview->border_color[1] != layer_color[1] ||
preview->border_color[2] != layer_color[2])
{
preview->border_color[0] = layer_color[0];
preview->border_color[1] = layer_color[1];
preview->border_color[2] = layer_color[2];
gimp_preview_render (preview);
}
if (mask)
{
preview = GIMP_PREVIEW (layer_item->mask_preview);
if (preview->border_color[0] != mask_color[0] ||
preview->border_color[1] != mask_color[1] ||
preview->border_color[2] != mask_color[2])
{
preview->border_color[0] = mask_color[0];
preview->border_color[1] = mask_color[1];
preview->border_color[2] = mask_color[2];
gimp_preview_render (preview);
}
}
}

View file

@ -137,7 +137,7 @@ gimp_list_item_class_init (GimpListItemClass *klass)
static void
gimp_list_item_init (GimpListItem *list_item)
{
list_item->hbox = gtk_hbox_new (FALSE, 8);
list_item->hbox = gtk_hbox_new (FALSE, 6);
gtk_container_set_border_width (GTK_CONTAINER (list_item->hbox), 2);
gtk_container_add (GTK_CONTAINER (list_item), list_item->hbox);
gtk_widget_show (list_item->hbox);

View file

@ -411,20 +411,22 @@ gimp_preview_new_full (GimpViewable *viewable,
void
gimp_preview_set_size (GimpPreview *preview,
gint preview_size)
gint preview_size,
gint border_width)
{
gint width, height;
g_return_if_fail (preview != NULL);
g_return_if_fail (GIMP_IS_PREVIEW (preview));
g_return_if_fail (preview_size > 0 && preview_size <= 256);
g_return_if_fail (border_width >= 0 && border_width <= 16);
gimp_preview_get_size (preview, preview_size, &width, &height);
gimp_preview_set_size_full (preview,
width,
height,
preview->border_width);
border_width);
}
void

View file

@ -95,7 +95,8 @@ GtkWidget * gimp_preview_new_full (GimpViewable *viewable,
gboolean show_popup);
void gimp_preview_set_size (GimpPreview *preview,
gint size);
gint size,
gint border_width);
void gimp_preview_set_size_full (GimpPreview *preview,
gint width,
gint height,

View file

@ -411,20 +411,22 @@ gimp_preview_new_full (GimpViewable *viewable,
void
gimp_preview_set_size (GimpPreview *preview,
gint preview_size)
gint preview_size,
gint border_width)
{
gint width, height;
g_return_if_fail (preview != NULL);
g_return_if_fail (GIMP_IS_PREVIEW (preview));
g_return_if_fail (preview_size > 0 && preview_size <= 256);
g_return_if_fail (border_width >= 0 && border_width <= 16);
gimp_preview_get_size (preview, preview_size, &width, &height);
gimp_preview_set_size_full (preview,
width,
height,
preview->border_width);
border_width);
}
void

View file

@ -95,7 +95,8 @@ GtkWidget * gimp_preview_new_full (GimpViewable *viewable,
gboolean show_popup);
void gimp_preview_set_size (GimpPreview *preview,
gint size);
gint size,
gint border_width);
void gimp_preview_set_size_full (GimpPreview *preview,
gint width,
gint height,

View file

@ -411,20 +411,22 @@ gimp_preview_new_full (GimpViewable *viewable,
void
gimp_preview_set_size (GimpPreview *preview,
gint preview_size)
gint preview_size,
gint border_width)
{
gint width, height;
g_return_if_fail (preview != NULL);
g_return_if_fail (GIMP_IS_PREVIEW (preview));
g_return_if_fail (preview_size > 0 && preview_size <= 256);
g_return_if_fail (border_width >= 0 && border_width <= 16);
gimp_preview_get_size (preview, preview_size, &width, &height);
gimp_preview_set_size_full (preview,
width,
height,
preview->border_width);
border_width);
}
void

View file

@ -95,7 +95,8 @@ GtkWidget * gimp_preview_new_full (GimpViewable *viewable,
gboolean show_popup);
void gimp_preview_set_size (GimpPreview *preview,
gint size);
gint size,
gint border_width);
void gimp_preview_set_size_full (GimpPreview *preview,
gint width,
gint height,

View file

@ -411,20 +411,22 @@ gimp_preview_new_full (GimpViewable *viewable,
void
gimp_preview_set_size (GimpPreview *preview,
gint preview_size)
gint preview_size,
gint border_width)
{
gint width, height;
g_return_if_fail (preview != NULL);
g_return_if_fail (GIMP_IS_PREVIEW (preview));
g_return_if_fail (preview_size > 0 && preview_size <= 256);
g_return_if_fail (border_width >= 0 && border_width <= 16);
gimp_preview_get_size (preview, preview_size, &width, &height);
gimp_preview_set_size_full (preview,
width,
height,
preview->border_width);
border_width);
}
void

View file

@ -95,7 +95,8 @@ GtkWidget * gimp_preview_new_full (GimpViewable *viewable,
gboolean show_popup);
void gimp_preview_set_size (GimpPreview *preview,
gint size);
gint size,
gint border_width);
void gimp_preview_set_size_full (GimpPreview *preview,
gint width,
gint height,

View file

@ -144,7 +144,10 @@ static gboolean xcf_load_image_props (XcfInfo *info,
GImage *gimage);
static gboolean xcf_load_layer_props (XcfInfo *info,
GImage *gimage,
GimpLayer *layer);
GimpLayer *layer,
gboolean *apply_mask,
gboolean *edit_mask,
gboolean *show_mask);
static gboolean xcf_load_channel_props (XcfInfo *info,
GImage *gimage,
GimpChannel *channel);
@ -663,9 +666,20 @@ xcf_save_layer_props (XcfInfo *info,
gimp_drawable_get_visible (GIMP_DRAWABLE (layer)));
xcf_save_prop (info, PROP_LINKED, layer->linked);
xcf_save_prop (info, PROP_PRESERVE_TRANSPARENCY, layer->preserve_trans);
xcf_save_prop (info, PROP_APPLY_MASK, layer->apply_mask);
xcf_save_prop (info, PROP_EDIT_MASK, layer->edit_mask);
xcf_save_prop (info, PROP_SHOW_MASK, layer->show_mask);
if (layer->mask)
{
xcf_save_prop (info, PROP_APPLY_MASK, layer->mask->apply_mask);
xcf_save_prop (info, PROP_EDIT_MASK, layer->mask->edit_mask);
xcf_save_prop (info, PROP_SHOW_MASK, layer->mask->show_mask);
}
else
{
xcf_save_prop (info, PROP_APPLY_MASK, FALSE);
xcf_save_prop (info, PROP_EDIT_MASK, FALSE);
xcf_save_prop (info, PROP_SHOW_MASK, FALSE);
}
xcf_save_prop (info, PROP_OFFSETS,
GIMP_DRAWABLE (layer)->offset_x,
GIMP_DRAWABLE (layer)->offset_y);
@ -2046,7 +2060,10 @@ xcf_load_image_props (XcfInfo *info,
static gboolean
xcf_load_layer_props (XcfInfo *info,
GImage *gimage,
GimpLayer *layer)
GimpLayer *layer,
gboolean *apply_mask,
gboolean *edit_mask,
gboolean *show_mask)
{
PropType prop_type;
guint32 prop_size;
@ -2086,13 +2103,13 @@ xcf_load_layer_props (XcfInfo *info,
info->cp += xcf_read_int32 (info->fp, (guint32*) &layer->preserve_trans, 1);
break;
case PROP_APPLY_MASK:
info->cp += xcf_read_int32 (info->fp, (guint32*) &layer->apply_mask, 1);
info->cp += xcf_read_int32 (info->fp, (guint32*) apply_mask, 1);
break;
case PROP_EDIT_MASK:
info->cp += xcf_read_int32 (info->fp, (guint32*) &layer->edit_mask, 1);
info->cp += xcf_read_int32 (info->fp, (guint32*) edit_mask, 1);
break;
case PROP_SHOW_MASK:
info->cp += xcf_read_int32 (info->fp, (guint32*) &layer->show_mask, 1);
info->cp += xcf_read_int32 (info->fp, (guint32*) show_mask, 1);
break;
case PROP_OFFSETS:
info->cp += xcf_read_int32 (info->fp, (guint32*) &GIMP_DRAWABLE(layer)->offset_x, 1);
@ -2282,7 +2299,8 @@ xcf_load_layer (XcfInfo *info,
return NULL;
/* read in the layer properties */
if (!xcf_load_layer_props (info, gimage, layer))
if (!xcf_load_layer_props (info, gimage, layer,
&apply_mask, &edit_mask, &show_mask))
goto error;
/* read the hierarchy and layer mask offsets */
@ -2307,15 +2325,11 @@ xcf_load_layer (XcfInfo *info,
GIMP_DRAWABLE (layer_mask)->offset_x = GIMP_DRAWABLE (layer)->offset_x;
GIMP_DRAWABLE (layer_mask)->offset_y = GIMP_DRAWABLE (layer)->offset_y;
apply_mask = layer->apply_mask;
edit_mask = layer->edit_mask;
show_mask = layer->show_mask;
gimp_layer_add_mask (layer, layer_mask, FALSE);
layer->apply_mask = apply_mask;
layer->edit_mask = edit_mask;
layer->show_mask = show_mask;
layer->mask->apply_mask = apply_mask;
layer->mask->edit_mask = edit_mask;
layer->mask->show_mask = show_mask;
}
/* attach the floating selection... */
@ -2329,7 +2343,7 @@ xcf_load_layer (XcfInfo *info,
return layer;
error:
error:
gtk_object_unref (GTK_OBJECT (layer));
return NULL;
}

View file

@ -144,7 +144,10 @@ static gboolean xcf_load_image_props (XcfInfo *info,
GImage *gimage);
static gboolean xcf_load_layer_props (XcfInfo *info,
GImage *gimage,
GimpLayer *layer);
GimpLayer *layer,
gboolean *apply_mask,
gboolean *edit_mask,
gboolean *show_mask);
static gboolean xcf_load_channel_props (XcfInfo *info,
GImage *gimage,
GimpChannel *channel);
@ -663,9 +666,20 @@ xcf_save_layer_props (XcfInfo *info,
gimp_drawable_get_visible (GIMP_DRAWABLE (layer)));
xcf_save_prop (info, PROP_LINKED, layer->linked);
xcf_save_prop (info, PROP_PRESERVE_TRANSPARENCY, layer->preserve_trans);
xcf_save_prop (info, PROP_APPLY_MASK, layer->apply_mask);
xcf_save_prop (info, PROP_EDIT_MASK, layer->edit_mask);
xcf_save_prop (info, PROP_SHOW_MASK, layer->show_mask);
if (layer->mask)
{
xcf_save_prop (info, PROP_APPLY_MASK, layer->mask->apply_mask);
xcf_save_prop (info, PROP_EDIT_MASK, layer->mask->edit_mask);
xcf_save_prop (info, PROP_SHOW_MASK, layer->mask->show_mask);
}
else
{
xcf_save_prop (info, PROP_APPLY_MASK, FALSE);
xcf_save_prop (info, PROP_EDIT_MASK, FALSE);
xcf_save_prop (info, PROP_SHOW_MASK, FALSE);
}
xcf_save_prop (info, PROP_OFFSETS,
GIMP_DRAWABLE (layer)->offset_x,
GIMP_DRAWABLE (layer)->offset_y);
@ -2046,7 +2060,10 @@ xcf_load_image_props (XcfInfo *info,
static gboolean
xcf_load_layer_props (XcfInfo *info,
GImage *gimage,
GimpLayer *layer)
GimpLayer *layer,
gboolean *apply_mask,
gboolean *edit_mask,
gboolean *show_mask)
{
PropType prop_type;
guint32 prop_size;
@ -2086,13 +2103,13 @@ xcf_load_layer_props (XcfInfo *info,
info->cp += xcf_read_int32 (info->fp, (guint32*) &layer->preserve_trans, 1);
break;
case PROP_APPLY_MASK:
info->cp += xcf_read_int32 (info->fp, (guint32*) &layer->apply_mask, 1);
info->cp += xcf_read_int32 (info->fp, (guint32*) apply_mask, 1);
break;
case PROP_EDIT_MASK:
info->cp += xcf_read_int32 (info->fp, (guint32*) &layer->edit_mask, 1);
info->cp += xcf_read_int32 (info->fp, (guint32*) edit_mask, 1);
break;
case PROP_SHOW_MASK:
info->cp += xcf_read_int32 (info->fp, (guint32*) &layer->show_mask, 1);
info->cp += xcf_read_int32 (info->fp, (guint32*) show_mask, 1);
break;
case PROP_OFFSETS:
info->cp += xcf_read_int32 (info->fp, (guint32*) &GIMP_DRAWABLE(layer)->offset_x, 1);
@ -2282,7 +2299,8 @@ xcf_load_layer (XcfInfo *info,
return NULL;
/* read in the layer properties */
if (!xcf_load_layer_props (info, gimage, layer))
if (!xcf_load_layer_props (info, gimage, layer,
&apply_mask, &edit_mask, &show_mask))
goto error;
/* read the hierarchy and layer mask offsets */
@ -2307,15 +2325,11 @@ xcf_load_layer (XcfInfo *info,
GIMP_DRAWABLE (layer_mask)->offset_x = GIMP_DRAWABLE (layer)->offset_x;
GIMP_DRAWABLE (layer_mask)->offset_y = GIMP_DRAWABLE (layer)->offset_y;
apply_mask = layer->apply_mask;
edit_mask = layer->edit_mask;
show_mask = layer->show_mask;
gimp_layer_add_mask (layer, layer_mask, FALSE);
layer->apply_mask = apply_mask;
layer->edit_mask = edit_mask;
layer->show_mask = show_mask;
layer->mask->apply_mask = apply_mask;
layer->mask->edit_mask = edit_mask;
layer->mask->show_mask = show_mask;
}
/* attach the floating selection... */
@ -2329,7 +2343,7 @@ xcf_load_layer (XcfInfo *info,
return layer;
error:
error:
gtk_object_unref (GTK_OBJECT (layer));
return NULL;
}

View file

@ -636,207 +636,6 @@ gimp_layer_set_preserve_trans (gint32 layer_ID,
return success;
}
/**
* gimp_layer_get_apply_mask:
* @layer_ID: The layer.
*
* Get the apply mask setting of the specified layer.
*
* This procedure returns the specified layer's apply mask setting. If
* the value is non-zero, then the layer mask for this layer is
* currently being composited with the layer's alpha channel.
*
* Returns: The layer's apply mask setting.
*/
gboolean
gimp_layer_get_apply_mask (gint32 layer_ID)
{
GimpParam *return_vals;
gint nreturn_vals;
gboolean apply_mask = FALSE;
return_vals = gimp_run_procedure ("gimp_layer_get_apply_mask",
&nreturn_vals,
GIMP_PDB_LAYER, layer_ID,
GIMP_PDB_END);
if (return_vals[0].data.d_status == GIMP_PDB_SUCCESS)
apply_mask = return_vals[1].data.d_int32;
gimp_destroy_params (return_vals, nreturn_vals);
return apply_mask;
}
/**
* gimp_layer_set_apply_mask:
* @layer_ID: The layer.
* @apply_mask: The new layer's apply mask setting.
*
* Set the apply mask setting of the specified layer.
*
* This procedure sets the specified layer's apply mask setting. This
* controls whether the layer's mask is currently affecting the alpha
* channel. If there is no layer mask, this function will return an
* error.
*
* Returns: TRUE on success.
*/
gboolean
gimp_layer_set_apply_mask (gint32 layer_ID,
gboolean apply_mask)
{
GimpParam *return_vals;
gint nreturn_vals;
gboolean success = TRUE;
return_vals = gimp_run_procedure ("gimp_layer_set_apply_mask",
&nreturn_vals,
GIMP_PDB_LAYER, layer_ID,
GIMP_PDB_INT32, apply_mask,
GIMP_PDB_END);
success = return_vals[0].data.d_status == GIMP_PDB_SUCCESS;
gimp_destroy_params (return_vals, nreturn_vals);
return success;
}
/**
* gimp_layer_get_show_mask:
* @layer_ID: The layer.
*
* Get the show mask setting of the specified layer.
*
* This procedure returns the specified layer's show mask setting. If
* the value is non-zero, then the layer mask for this layer is
* currently being shown instead of the layer.
*
* Returns: The layer's show mask setting.
*/
gboolean
gimp_layer_get_show_mask (gint32 layer_ID)
{
GimpParam *return_vals;
gint nreturn_vals;
gboolean show_mask = FALSE;
return_vals = gimp_run_procedure ("gimp_layer_get_show_mask",
&nreturn_vals,
GIMP_PDB_LAYER, layer_ID,
GIMP_PDB_END);
if (return_vals[0].data.d_status == GIMP_PDB_SUCCESS)
show_mask = return_vals[1].data.d_int32;
gimp_destroy_params (return_vals, nreturn_vals);
return show_mask;
}
/**
* gimp_layer_set_show_mask:
* @layer_ID: The layer.
* @show_mask: The new layer's show mask setting.
*
* Set the show mask setting of the specified layer.
*
* This procedure sets the specified layer's show mask setting. This
* controls whether the layer or it's mask is visible. Non-zero values
* indicate that the mask should be visible. If the layer has no mask,
* then this function returns an error.
*
* Returns: TRUE on success.
*/
gboolean
gimp_layer_set_show_mask (gint32 layer_ID,
gboolean show_mask)
{
GimpParam *return_vals;
gint nreturn_vals;
gboolean success = TRUE;
return_vals = gimp_run_procedure ("gimp_layer_set_show_mask",
&nreturn_vals,
GIMP_PDB_LAYER, layer_ID,
GIMP_PDB_INT32, show_mask,
GIMP_PDB_END);
success = return_vals[0].data.d_status == GIMP_PDB_SUCCESS;
gimp_destroy_params (return_vals, nreturn_vals);
return success;
}
/**
* gimp_layer_get_edit_mask:
* @layer_ID: The layer.
*
* Get the show mask setting of the specified layer.
*
* This procedure returns the specified layer's show mask setting. If
* the value is non-zero, then the layer mask for this layer is
* currently active, and not the layer.
*
* Returns: The layer's show mask setting.
*/
gboolean
gimp_layer_get_edit_mask (gint32 layer_ID)
{
GimpParam *return_vals;
gint nreturn_vals;
gboolean edit_mask = FALSE;
return_vals = gimp_run_procedure ("gimp_layer_get_edit_mask",
&nreturn_vals,
GIMP_PDB_LAYER, layer_ID,
GIMP_PDB_END);
if (return_vals[0].data.d_status == GIMP_PDB_SUCCESS)
edit_mask = return_vals[1].data.d_int32;
gimp_destroy_params (return_vals, nreturn_vals);
return edit_mask;
}
/**
* gimp_layer_set_edit_mask:
* @layer_ID: The layer.
* @edit_mask: The new layer's show mask setting.
*
* Set the show mask setting of the specified layer.
*
* This procedure sets the specified layer's show mask setting. This
* controls whether the layer or it's mask is currently active for
* editing. If the specified layer has no layer mask, then this
* procedure will return an error.
*
* Returns: TRUE on success.
*/
gboolean
gimp_layer_set_edit_mask (gint32 layer_ID,
gboolean edit_mask)
{
GimpParam *return_vals;
gint nreturn_vals;
gboolean success = TRUE;
return_vals = gimp_run_procedure ("gimp_layer_set_edit_mask",
&nreturn_vals,
GIMP_PDB_LAYER, layer_ID,
GIMP_PDB_INT32, edit_mask,
GIMP_PDB_END);
success = return_vals[0].data.d_status == GIMP_PDB_SUCCESS;
gimp_destroy_params (return_vals, nreturn_vals);
return success;
}
/**
* gimp_layer_get_opacity:
* @layer_ID: The layer.

View file

@ -70,15 +70,6 @@ gboolean gimp_layer_set_visible (gint32 layer_
gboolean gimp_layer_get_preserve_trans (gint32 layer_ID);
gboolean gimp_layer_set_preserve_trans (gint32 layer_ID,
gboolean preserve_trans);
gboolean gimp_layer_get_apply_mask (gint32 layer_ID);
gboolean gimp_layer_set_apply_mask (gint32 layer_ID,
gboolean apply_mask);
gboolean gimp_layer_get_show_mask (gint32 layer_ID);
gboolean gimp_layer_set_show_mask (gint32 layer_ID,
gboolean show_mask);
gboolean gimp_layer_get_edit_mask (gint32 layer_ID);
gboolean gimp_layer_set_edit_mask (gint32 layer_ID,
gboolean edit_mask);
gdouble gimp_layer_get_opacity (gint32 layer_ID);
gboolean gimp_layer_set_opacity (gint32 layer_ID,
gdouble opacity);

View file

@ -1,6 +1,6 @@
/* XPM */
static char * eye_xpm[] = {
"22 22 76 1",
"20 20 76 1",
" c None",
". c #000000",
"+ c #292929",
@ -77,25 +77,23 @@ static char * eye_xpm[] = {
"I c #070707",
"J c #353535",
"K c #5A5A5A",
" ",
" ",
" ",
" ",
" ",
" ........ ",
" ...+@#$$%... ",
" ..&*=-;>,')!~,.. ",
" ..{]^/(_:...<^[}.. ",
" ..|123456-....7689.. ",
" .0a26b(6-.....cded]. ",
" .fgh8icj......kl1mn. ",
" o]p0q........rstuv ",
" wx1y>.......zAB, ",
" >CDE......FG.. ",
" ..EHIIJK.. ",
" ...... ",
" ",
" ",
" ",
" ",
" "};
" ",
" ",
" ",
" ",
" ........ ",
" ...+@#$$%... ",
" ..&*=-;>,')!~,.. ",
" ..{]^/(_:...<^[}.. ",
"..|123456-....7689..",
".0a26b(6-.....cded].",
".fgh8icj......kl1mn.",
" o]p0q........rstuv ",
" wx1y>.......zAB, ",
" >CDE......FG.. ",
" ..EHIIJK.. ",
" ...... ",
" ",
" ",
" ",
" "};

View file

@ -63,7 +63,7 @@ SUBDIRS = \
sgi \
sel2path \
$(WEBBROWSER) \
$(XJT) \
## $(XJT) \
plugin-helper \
common

View file

@ -191,7 +191,7 @@ HELP
desc => 'The newly copied channel', alias => 'copy' }
);
%invoke = ( code => 'success = (copy = gimp_channel_copy (channel)) != NULL;' );
%invoke = ( code => 'success = (copy = gimp_channel_copy (channel, TRUE)) != NULL;' );
}
sub channel_delete {

Some files were not shown because too many files have changed in this diff Show more