mirror of https://github.com/GNOME/gimp.git
app: add group filling support to GimpCanvasItem and GimpCanvasGroup
The code is almost identical to the group stroking feature.
This commit is contained in:
parent
b63e26e45d
commit
d7cb20b0d5
|
@ -36,7 +36,8 @@
|
|||
enum
|
||||
{
|
||||
PROP_0,
|
||||
PROP_GROUP_STROKING
|
||||
PROP_GROUP_STROKING,
|
||||
PROP_GROUP_FILLING
|
||||
};
|
||||
|
||||
|
||||
|
@ -46,6 +47,7 @@ struct _GimpCanvasGroupPrivate
|
|||
{
|
||||
GList *items;
|
||||
gboolean group_stroking;
|
||||
gboolean group_filling;
|
||||
};
|
||||
|
||||
#define GET_PRIVATE(group) \
|
||||
|
@ -96,6 +98,12 @@ gimp_canvas_group_class_init (GimpCanvasGroupClass *klass)
|
|||
FALSE,
|
||||
GIMP_PARAM_READWRITE));
|
||||
|
||||
g_object_class_install_property (object_class, PROP_GROUP_FILLING,
|
||||
g_param_spec_boolean ("group-filling",
|
||||
NULL, NULL,
|
||||
FALSE,
|
||||
GIMP_PARAM_READWRITE));
|
||||
|
||||
g_type_class_add_private (klass, sizeof (GimpCanvasGroupPrivate));
|
||||
}
|
||||
|
||||
|
@ -132,6 +140,9 @@ gimp_canvas_group_set_property (GObject *object,
|
|||
case PROP_GROUP_STROKING:
|
||||
private->group_stroking = g_value_get_boolean (value);
|
||||
break;
|
||||
case PROP_GROUP_FILLING:
|
||||
private->group_filling = g_value_get_boolean (value);
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||
|
@ -152,6 +163,9 @@ gimp_canvas_group_get_property (GObject *object,
|
|||
case PROP_GROUP_STROKING:
|
||||
g_value_set_boolean (value, private->group_stroking);
|
||||
break;
|
||||
case PROP_GROUP_FILLING:
|
||||
g_value_set_boolean (value, private->group_filling);
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||
|
@ -176,6 +190,9 @@ gimp_canvas_group_draw (GimpCanvasItem *item,
|
|||
|
||||
if (private->group_stroking)
|
||||
_gimp_canvas_item_stroke (item, shell, cr);
|
||||
|
||||
if (private->group_filling)
|
||||
_gimp_canvas_item_fill (item, shell, cr);
|
||||
}
|
||||
|
||||
static GdkRegion *
|
||||
|
@ -192,15 +209,15 @@ gimp_canvas_group_get_extents (GimpCanvasItem *item,
|
|||
GdkRegion *sub_region = gimp_canvas_item_get_extents (sub_item,
|
||||
shell);
|
||||
|
||||
if (region)
|
||||
if (! region)
|
||||
{
|
||||
region = sub_region;
|
||||
}
|
||||
else if (sub_region)
|
||||
{
|
||||
gdk_region_union (region, sub_region);
|
||||
gdk_region_destroy (sub_region);
|
||||
}
|
||||
else
|
||||
{
|
||||
region = sub_region;
|
||||
}
|
||||
}
|
||||
|
||||
return region;
|
||||
|
@ -227,6 +244,9 @@ gimp_canvas_group_add_item (GimpCanvasGroup *group,
|
|||
if (private->group_stroking)
|
||||
gimp_canvas_item_suspend_stroking (item);
|
||||
|
||||
if (private->group_filling)
|
||||
gimp_canvas_item_suspend_filling (item);
|
||||
|
||||
private->items = g_list_append (private->items, g_object_ref (item));
|
||||
}
|
||||
|
||||
|
@ -257,3 +277,14 @@ gimp_canvas_group_set_group_stroking (GimpCanvasGroup *group,
|
|||
"group-stroking", group_stroking ? TRUE : FALSE,
|
||||
NULL);
|
||||
}
|
||||
|
||||
void
|
||||
gimp_canvas_group_set_group_filling (GimpCanvasGroup *group,
|
||||
gboolean group_filling)
|
||||
{
|
||||
g_return_if_fail (GIMP_IS_CANVAS_GROUP (group));
|
||||
|
||||
g_object_set (group,
|
||||
"group-filling", group_filling ? TRUE : FALSE,
|
||||
NULL);
|
||||
}
|
||||
|
|
|
@ -57,6 +57,8 @@ void gimp_canvas_group_remove_item (GimpCanvasGroup *group,
|
|||
|
||||
void gimp_canvas_group_set_group_stroking (GimpCanvasGroup *group,
|
||||
gboolean group_stroking);
|
||||
void gimp_canvas_group_set_group_filling (GimpCanvasGroup *group,
|
||||
gboolean group_filling);
|
||||
|
||||
|
||||
#endif /* __GIMP_CANVAS_GROUP_H__ */
|
||||
|
|
|
@ -47,6 +47,7 @@ struct _GimpCanvasItemPrivate
|
|||
cairo_line_cap_t line_cap;
|
||||
gboolean highlight;
|
||||
gint suspend_stroking;
|
||||
gint suspend_filling;
|
||||
};
|
||||
|
||||
#define GET_PRIVATE(item) \
|
||||
|
@ -115,6 +116,7 @@ gimp_canvas_item_init (GimpCanvasItem *item)
|
|||
private->line_cap = CAIRO_LINE_CAP_ROUND;
|
||||
private->highlight = FALSE;
|
||||
private->suspend_stroking = 0;
|
||||
private->suspend_filling = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -255,6 +257,32 @@ gimp_canvas_item_resume_stroking (GimpCanvasItem *item)
|
|||
private->suspend_stroking--;
|
||||
}
|
||||
|
||||
void
|
||||
gimp_canvas_item_suspend_filling (GimpCanvasItem *item)
|
||||
{
|
||||
GimpCanvasItemPrivate *private;
|
||||
|
||||
g_return_if_fail (GIMP_IS_CANVAS_ITEM (item));
|
||||
|
||||
private = GET_PRIVATE (item);
|
||||
|
||||
private->suspend_filling++;
|
||||
}
|
||||
|
||||
void
|
||||
gimp_canvas_item_resume_filling (GimpCanvasItem *item)
|
||||
{
|
||||
GimpCanvasItemPrivate *private;
|
||||
|
||||
g_return_if_fail (GIMP_IS_CANVAS_ITEM (item));
|
||||
|
||||
private = GET_PRIVATE (item);
|
||||
|
||||
g_return_if_fail (private->suspend_filling > 0);
|
||||
|
||||
private->suspend_filling--;
|
||||
}
|
||||
|
||||
|
||||
/* protected functions */
|
||||
|
||||
|
@ -265,6 +293,9 @@ _gimp_canvas_item_stroke (GimpCanvasItem *item,
|
|||
{
|
||||
GimpCanvasItemPrivate *private = GET_PRIVATE (item);
|
||||
|
||||
if (private->suspend_filling > 0)
|
||||
g_warning ("_gimp_canvas_item_stroke() on an item that is in a filling group");
|
||||
|
||||
if (private->suspend_stroking == 0)
|
||||
{
|
||||
cairo_set_line_cap (cr, private->line_cap);
|
||||
|
@ -291,10 +322,17 @@ _gimp_canvas_item_fill (GimpCanvasItem *item,
|
|||
if (private->suspend_stroking > 0)
|
||||
g_warning ("_gimp_canvas_item_fill() on an item that is in a stroking group");
|
||||
|
||||
gimp_display_shell_set_tool_bg_style (shell, cr);
|
||||
cairo_set_line_width (cr, 2.0);
|
||||
cairo_stroke_preserve (cr);
|
||||
if (private->suspend_filling == 0)
|
||||
{
|
||||
gimp_display_shell_set_tool_bg_style (shell, cr);
|
||||
cairo_set_line_width (cr, 2.0);
|
||||
cairo_stroke_preserve (cr);
|
||||
|
||||
gimp_display_shell_set_tool_fg_style (shell, cr, private->highlight);
|
||||
cairo_fill (cr);
|
||||
gimp_display_shell_set_tool_fg_style (shell, cr, private->highlight);
|
||||
cairo_fill (cr);
|
||||
}
|
||||
else
|
||||
{
|
||||
cairo_new_sub_path (cr);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -68,6 +68,9 @@ void gimp_canvas_item_set_highlight (GimpCanvasItem *item,
|
|||
void gimp_canvas_item_suspend_stroking (GimpCanvasItem *item);
|
||||
void gimp_canvas_item_resume_stroking (GimpCanvasItem *item);
|
||||
|
||||
void gimp_canvas_item_suspend_filling (GimpCanvasItem *item);
|
||||
void gimp_canvas_item_resume_filling (GimpCanvasItem *item);
|
||||
|
||||
|
||||
/* protected */
|
||||
|
||||
|
|
Loading…
Reference in New Issue