From 0beef7d97d01543d3ae09af044b0b4173e42a756 Mon Sep 17 00:00:00 2001 From: Ell Date: Thu, 7 Dec 2017 16:42:54 -0500 Subject: [PATCH] app: in GimpItemTreeView, use color tag of parent for children with no tag Add gimp_item_get_merged_color_tag(), which returns the color tag of the nearest ancestor (including the current item) that has a color tag other than NONE. Use this function in GimpItemTreeView, instead of gimp_item_get_color_tag(), to set the cell color of items, so that item's with a NONE color tag inherit the color of their parent. Add a boolean "inherited" parameter to gimp_get_color_tag_color(), which indicates if the color tag is the item's actual color tag, or an inherited color tag, and modify the returned color accordingly, so that inherited colors are less saturated/lighter than non-inherited ones. --- app/actions/items-actions.c | 4 ++-- app/core/gimpitem.c | 18 ++++++++++++++++++ app/core/gimpitem.h | 1 + app/dialogs/item-options-dialog.c | 2 +- app/widgets/gimpitemtreeview.c | 26 +++++++++++++++++++------- app/widgets/gimpwidgets-utils.c | 10 +++++++++- app/widgets/gimpwidgets-utils.h | 3 ++- 7 files changed, 52 insertions(+), 12 deletions(-) diff --git a/app/actions/items-actions.c b/app/actions/items-actions.c index a263bfbe41..0cdbf4a140 100644 --- a/app/actions/items-actions.c +++ b/app/actions/items-actions.c @@ -60,7 +60,7 @@ items_actions_setup (GimpActionGroup *group, gimp_action_group_set_action_context (group, action, gimp_get_user_context (group->gimp)); - gimp_get_color_tag_color (value->value, &color); + gimp_get_color_tag_color (value->value, &color, FALSE); gimp_action_group_set_action_color (group, action, &color, FALSE); } } @@ -95,7 +95,7 @@ items_actions_update (GimpActionGroup *group, can_lock_pos = gimp_item_can_lock_position (item); has_color_tag = gimp_get_color_tag_color (gimp_item_get_color_tag (item), - &tag_color); + &tag_color, FALSE); } #define SET_SENSITIVE(action,condition) \ diff --git a/app/core/gimpitem.c b/app/core/gimpitem.c index bfabe5094b..7888cf3022 100644 --- a/app/core/gimpitem.c +++ b/app/core/gimpitem.c @@ -2203,6 +2203,24 @@ gimp_item_get_color_tag (GimpItem *item) return GET_PRIVATE (item)->color_tag; } +GimpColorTag +gimp_item_get_merged_color_tag (GimpItem *item) +{ + g_return_val_if_fail (GIMP_IS_ITEM (item), GIMP_COLOR_TAG_NONE); + + if (gimp_item_get_color_tag (item) == GIMP_COLOR_TAG_NONE) + { + GimpItem *parent; + + parent = GIMP_ITEM (gimp_viewable_get_parent (GIMP_VIEWABLE (item))); + + if (parent) + return gimp_item_get_merged_color_tag (parent); + } + + return gimp_item_get_color_tag (item); +} + void gimp_item_set_lock_content (GimpItem *item, gboolean lock_content, diff --git a/app/core/gimpitem.h b/app/core/gimpitem.h index 53a43b49ac..ad2d2e5a52 100644 --- a/app/core/gimpitem.h +++ b/app/core/gimpitem.h @@ -339,6 +339,7 @@ void gimp_item_set_color_tag (GimpItem *item, GimpColorTag color_tag, gboolean push_undo); GimpColorTag gimp_item_get_color_tag (GimpItem *item); +GimpColorTag gimp_item_get_merged_color_tag (GimpItem *item); void gimp_item_set_lock_content (GimpItem *item, gboolean lock_content, diff --git a/app/dialogs/item-options-dialog.c b/app/dialogs/item-options-dialog.c index 37ae93fa08..9b91779f8e 100644 --- a/app/dialogs/item-options-dialog.c +++ b/app/dialogs/item-options-dialog.c @@ -228,7 +228,7 @@ item_options_dialog_new (GimpImage *image, color_tag = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (radio), "gimp-item-data")); - if (gimp_get_color_tag_color (color_tag, &color)) + if (gimp_get_color_tag_color (color_tag, &color, FALSE)) { GtkSettings *settings = gtk_widget_get_settings (dialog); gint w, h; diff --git a/app/widgets/gimpitemtreeview.c b/app/widgets/gimpitemtreeview.c index 11320a1a49..a4a6b6235a 100644 --- a/app/widgets/gimpitemtreeview.c +++ b/app/widgets/gimpitemtreeview.c @@ -990,8 +990,10 @@ gimp_item_tree_view_insert_item (GimpContainerView *view, item_view->priv->inserting_item = FALSE; - has_color = gimp_get_color_tag_color (gimp_item_get_color_tag (item), - &color); + has_color = gimp_get_color_tag_color (gimp_item_get_merged_color_tag (item), + &color, + gimp_item_get_color_tag (item) == + GIMP_COLOR_TAG_NONE); if (has_color) gimp_rgb_get_gdk_color (&color, &gdk_color); @@ -1406,12 +1408,15 @@ gimp_item_tree_view_color_tag_changed (GimpItem *item, if (iter) { - GimpRGB color; - GdkColor gdk_color; - gboolean has_color; + GimpContainer *children; + GimpRGB color; + GdkColor gdk_color; + gboolean has_color; - has_color = gimp_get_color_tag_color (gimp_item_get_color_tag (item), - &color); + has_color = gimp_get_color_tag_color (gimp_item_get_merged_color_tag (item), + &color, + gimp_item_get_color_tag (item) == + GIMP_COLOR_TAG_NONE); if (has_color) gimp_rgb_get_gdk_color (&color, &gdk_color); @@ -1419,6 +1424,13 @@ gimp_item_tree_view_color_tag_changed (GimpItem *item, view->priv->model_column_color_tag, has_color ? &gdk_color : NULL, -1); + + children = gimp_viewable_get_children (GIMP_VIEWABLE (item)); + + if (children) + gimp_container_foreach (children, + (GFunc) gimp_item_tree_view_color_tag_changed, + view); } } diff --git a/app/widgets/gimpwidgets-utils.c b/app/widgets/gimpwidgets-utils.c index b35fb698ab..ff3552a023 100644 --- a/app/widgets/gimpwidgets-utils.c +++ b/app/widgets/gimpwidgets-utils.c @@ -1161,7 +1161,8 @@ gimp_get_message_icon_name (GimpMessageSeverity severity) gboolean gimp_get_color_tag_color (GimpColorTag color_tag, - GimpRGB *color) + GimpRGB *color, + gboolean inherited) { static const struct { @@ -1183,6 +1184,7 @@ gimp_get_color_tag_color (GimpColorTag color_tag, }; g_return_val_if_fail (color != NULL, FALSE); + g_return_val_if_fail (color_tag < G_N_ELEMENTS (colors), FALSE); if (color_tag > GIMP_COLOR_TAG_NONE) { @@ -1192,6 +1194,12 @@ gimp_get_color_tag_color (GimpColorTag color_tag, colors[color_tag].b, 255); + if (inherited) + { + gimp_rgb_composite (color, &(GimpRGB) {1.0, 1.0, 1.0, 0.2}, + GIMP_RGB_COMPOSITE_NORMAL); + } + return TRUE; } diff --git a/app/widgets/gimpwidgets-utils.h b/app/widgets/gimpwidgets-utils.h index b62be0a34b..bd7ca6faaa 100644 --- a/app/widgets/gimpwidgets-utils.h +++ b/app/widgets/gimpwidgets-utils.h @@ -87,7 +87,8 @@ void gimp_widget_set_accel_help (GtkWidget *widget const gchar * gimp_get_message_icon_name (GimpMessageSeverity severity); gboolean gimp_get_color_tag_color (GimpColorTag color_tag, - GimpRGB *color); + GimpRGB *color, + gboolean inherited); void gimp_pango_layout_set_scale (PangoLayout *layout, double scale);