mirror of https://github.com/GNOME/gimp.git
Bug 675747 - Layers with some modes get hidden in layer groups
Add a boolean "is-last-node" property to GimpDrawable and set it from GimpDrawableStack, which is the place that easily has the information. In GimpLayer, connect to "notify" and make sure we use NORMAL mode unless the layer is in NORMAL or DISSOLVE mode.
This commit is contained in:
parent
3ef2baea67
commit
c914aa805d
|
@ -32,6 +32,8 @@ struct _GimpDrawablePrivate
|
|||
GeglNode *fs_mode_node;
|
||||
|
||||
GeglNode *mode_node;
|
||||
|
||||
gboolean is_last_node;
|
||||
};
|
||||
|
||||
#endif /* __GIMP_DRAWABLE_PRIVATE_H__ */
|
||||
|
|
|
@ -61,6 +61,12 @@ enum
|
|||
LAST_SIGNAL
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_0,
|
||||
PROP_IS_LAST_NODE
|
||||
};
|
||||
|
||||
|
||||
/* local function prototypes */
|
||||
|
||||
|
@ -68,6 +74,14 @@ static void gimp_drawable_pickable_iface_init (GimpPickableInterface *iface);
|
|||
|
||||
static void gimp_drawable_dispose (GObject *object);
|
||||
static void gimp_drawable_finalize (GObject *object);
|
||||
static void gimp_drawable_set_property (GObject *object,
|
||||
guint property_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec);
|
||||
static void gimp_drawable_get_property (GObject *object,
|
||||
guint property_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec);
|
||||
|
||||
static gint64 gimp_drawable_get_memsize (GimpObject *object,
|
||||
gint64 *gui_size);
|
||||
|
@ -212,6 +226,8 @@ gimp_drawable_class_init (GimpDrawableClass *klass)
|
|||
|
||||
object_class->dispose = gimp_drawable_dispose;
|
||||
object_class->finalize = gimp_drawable_finalize;
|
||||
object_class->set_property = gimp_drawable_set_property;
|
||||
object_class->get_property = gimp_drawable_get_property;
|
||||
|
||||
gimp_object_class->get_memsize = gimp_drawable_get_memsize;
|
||||
|
||||
|
@ -242,6 +258,12 @@ gimp_drawable_class_init (GimpDrawableClass *klass)
|
|||
klass->push_undo = gimp_drawable_real_push_undo;
|
||||
klass->swap_pixels = gimp_drawable_real_swap_pixels;
|
||||
|
||||
g_object_class_install_property (object_class, PROP_IS_LAST_NODE,
|
||||
g_param_spec_boolean ("is-last-node",
|
||||
NULL, NULL,
|
||||
FALSE,
|
||||
GIMP_PARAM_READWRITE));
|
||||
|
||||
g_type_class_add_private (klass, sizeof (GimpDrawablePrivate));
|
||||
}
|
||||
|
||||
|
@ -298,6 +320,46 @@ gimp_drawable_finalize (GObject *object)
|
|||
G_OBJECT_CLASS (parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_drawable_set_property (GObject *object,
|
||||
guint property_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
GimpDrawable *drawable = GIMP_DRAWABLE (object);
|
||||
|
||||
switch (property_id)
|
||||
{
|
||||
case PROP_IS_LAST_NODE:
|
||||
drawable->private->is_last_node = g_value_get_boolean (value);
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_drawable_get_property (GObject *object,
|
||||
guint property_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
GimpDrawable *drawable = GIMP_DRAWABLE (object);
|
||||
|
||||
switch (property_id)
|
||||
{
|
||||
case PROP_IS_LAST_NODE:
|
||||
g_value_set_boolean (value, drawable->private->is_last_node);
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static gint64
|
||||
gimp_drawable_get_memsize (GimpObject *object,
|
||||
gint64 *gui_size)
|
||||
|
@ -1318,6 +1380,28 @@ gimp_drawable_get_mode_node (GimpDrawable *drawable)
|
|||
return drawable->private->mode_node;
|
||||
}
|
||||
|
||||
void
|
||||
gimp_drawable_set_is_last_node (GimpDrawable *drawable,
|
||||
gboolean last_node)
|
||||
{
|
||||
g_return_if_fail (GIMP_IS_DRAWABLE (drawable));
|
||||
|
||||
if (last_node != drawable->private->is_last_node)
|
||||
{
|
||||
g_object_set (drawable,
|
||||
"is-last-node", last_node ? TRUE : FALSE,
|
||||
NULL);
|
||||
}
|
||||
}
|
||||
|
||||
gboolean
|
||||
gimp_drawable_get_is_last_node (GimpDrawable *drawable)
|
||||
{
|
||||
g_return_val_if_fail (GIMP_IS_DRAWABLE (drawable), FALSE);
|
||||
|
||||
return drawable->private->is_last_node;
|
||||
}
|
||||
|
||||
void
|
||||
gimp_drawable_swap_pixels (GimpDrawable *drawable,
|
||||
GeglBuffer *buffer,
|
||||
|
|
|
@ -180,6 +180,10 @@ void gimp_drawable_set_buffer_full (GimpDrawable *drawable,
|
|||
GeglNode * gimp_drawable_get_source_node (GimpDrawable *drawable);
|
||||
GeglNode * gimp_drawable_get_mode_node (GimpDrawable *drawable);
|
||||
|
||||
void gimp_drawable_set_is_last_node (GimpDrawable *drawable,
|
||||
gboolean last_node);
|
||||
gboolean gimp_drawable_get_is_last_node (GimpDrawable *drawable);
|
||||
|
||||
void gimp_drawable_swap_pixels (GimpDrawable *drawable,
|
||||
GeglBuffer *buffer,
|
||||
gint x,
|
||||
|
|
|
@ -235,6 +235,9 @@ gimp_drawable_stack_get_graph (GimpDrawableStack *stack)
|
|||
GimpDrawable *drawable = list->data;
|
||||
|
||||
reverse_list = g_list_prepend (reverse_list, drawable);
|
||||
|
||||
if (! g_list_next (list))
|
||||
gimp_drawable_set_is_last_node (drawable, TRUE);
|
||||
}
|
||||
|
||||
stack->graph = gegl_node_new ();
|
||||
|
@ -271,6 +274,7 @@ static void
|
|||
gimp_drawable_stack_add_node (GimpDrawableStack *stack,
|
||||
GimpDrawable *drawable)
|
||||
{
|
||||
GimpDrawable *drawable_above = NULL;
|
||||
GimpDrawable *drawable_below;
|
||||
GeglNode *node_above;
|
||||
GeglNode *node;
|
||||
|
@ -287,8 +291,6 @@ gimp_drawable_stack_add_node (GimpDrawableStack *stack,
|
|||
}
|
||||
else
|
||||
{
|
||||
GimpDrawable *drawable_above;
|
||||
|
||||
drawable_above = (GimpDrawable *)
|
||||
gimp_container_get_child_by_index (GIMP_CONTAINER (stack), index - 1);
|
||||
|
||||
|
@ -308,12 +310,20 @@ gimp_drawable_stack_add_node (GimpDrawableStack *stack,
|
|||
gegl_node_connect_to (node_below, "output",
|
||||
node, "input");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (drawable_above)
|
||||
gimp_drawable_set_is_last_node (drawable_above, FALSE);
|
||||
|
||||
gimp_drawable_set_is_last_node (drawable, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_drawable_stack_remove_node (GimpDrawableStack *stack,
|
||||
GimpDrawable *drawable)
|
||||
{
|
||||
GimpDrawable *drawable_above = NULL;
|
||||
GimpDrawable *drawable_below;
|
||||
GeglNode *node_above;
|
||||
GeglNode *node;
|
||||
|
@ -330,8 +340,6 @@ gimp_drawable_stack_remove_node (GimpDrawableStack *stack,
|
|||
}
|
||||
else
|
||||
{
|
||||
GimpDrawable *drawable_above;
|
||||
|
||||
drawable_above = (GimpDrawable *)
|
||||
gimp_container_get_child_by_index (GIMP_CONTAINER (stack), index - 1);
|
||||
|
||||
|
@ -352,6 +360,11 @@ gimp_drawable_stack_remove_node (GimpDrawableStack *stack,
|
|||
else
|
||||
{
|
||||
gegl_node_disconnect (node_above, "input");
|
||||
|
||||
gimp_drawable_set_is_last_node (drawable, FALSE);
|
||||
|
||||
if (drawable_above)
|
||||
gimp_drawable_set_is_last_node (drawable_above, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -85,6 +85,8 @@ static void gimp_layer_get_property (GObject *object,
|
|||
GParamSpec *pspec);
|
||||
static void gimp_layer_dispose (GObject *object);
|
||||
static void gimp_layer_finalize (GObject *object);
|
||||
static void gimp_layer_notify (GObject *object,
|
||||
GParamSpec *pspec);
|
||||
|
||||
static void gimp_layer_name_changed (GimpObject *object);
|
||||
static gint64 gimp_layer_get_memsize (GimpObject *object,
|
||||
|
@ -264,6 +266,7 @@ gimp_layer_class_init (GimpLayerClass *klass)
|
|||
object_class->get_property = gimp_layer_get_property;
|
||||
object_class->dispose = gimp_layer_dispose;
|
||||
object_class->finalize = gimp_layer_finalize;
|
||||
object_class->notify = gimp_layer_notify;
|
||||
|
||||
gimp_object_class->name_changed = gimp_layer_name_changed;
|
||||
gimp_object_class->get_memsize = gimp_layer_get_memsize;
|
||||
|
@ -466,6 +469,39 @@ gimp_layer_finalize (GObject *object)
|
|||
G_OBJECT_CLASS (parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static GimpLayerModeEffects
|
||||
gimp_layer_get_visible_mode (GimpLayer *layer)
|
||||
{
|
||||
if (layer->mode != GIMP_DISSOLVE_MODE &&
|
||||
gimp_drawable_get_is_last_node (GIMP_DRAWABLE (layer)))
|
||||
return GIMP_NORMAL_MODE;
|
||||
|
||||
return layer->mode;
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_layer_notify (GObject *object,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
if (! strcmp (pspec->name, "is-last-node") &&
|
||||
gimp_item_peek_node (GIMP_ITEM (object)))
|
||||
{
|
||||
GimpLayer *layer = GIMP_LAYER (object);
|
||||
GeglNode *mode_node;
|
||||
|
||||
mode_node = gimp_drawable_get_mode_node (GIMP_DRAWABLE (layer));
|
||||
|
||||
gimp_gegl_mode_node_set (mode_node,
|
||||
gimp_layer_get_visible_mode (layer),
|
||||
layer->opacity, FALSE);
|
||||
|
||||
gimp_drawable_update (GIMP_DRAWABLE (layer),
|
||||
0, 0,
|
||||
gimp_item_get_width (GIMP_ITEM (layer)),
|
||||
gimp_item_get_height (GIMP_ITEM (layer)));
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_layer_name_changed (GimpObject *object)
|
||||
{
|
||||
|
@ -880,7 +916,9 @@ gimp_layer_get_node (GimpItem *item)
|
|||
*/
|
||||
mode_node = gimp_drawable_get_mode_node (drawable);
|
||||
|
||||
gimp_gegl_mode_node_set (mode_node, layer->mode, layer->opacity, FALSE);
|
||||
gimp_gegl_mode_node_set (mode_node,
|
||||
gimp_layer_get_visible_mode (layer),
|
||||
layer->opacity, FALSE);
|
||||
|
||||
/* the layer's offset node */
|
||||
layer->layer_offset_node = gegl_node_new_child (node,
|
||||
|
@ -1944,7 +1982,8 @@ gimp_layer_set_opacity (GimpLayer *layer,
|
|||
mode_node = gimp_drawable_get_mode_node (GIMP_DRAWABLE (layer));
|
||||
|
||||
gimp_gegl_mode_node_set (mode_node,
|
||||
layer->mode, layer->opacity, FALSE);
|
||||
gimp_layer_get_visible_mode (layer),
|
||||
layer->opacity, FALSE);
|
||||
}
|
||||
|
||||
gimp_drawable_update (GIMP_DRAWABLE (layer),
|
||||
|
@ -1990,7 +2029,8 @@ gimp_layer_set_mode (GimpLayer *layer,
|
|||
mode_node = gimp_drawable_get_mode_node (GIMP_DRAWABLE (layer));
|
||||
|
||||
gimp_gegl_mode_node_set (mode_node,
|
||||
layer->mode, layer->opacity, FALSE);
|
||||
gimp_layer_get_visible_mode (layer),
|
||||
layer->opacity, FALSE);
|
||||
}
|
||||
|
||||
gimp_drawable_update (GIMP_DRAWABLE (layer),
|
||||
|
|
Loading…
Reference in New Issue