[gimp] Bug 769738 - Add color tags/labels for layers/channels/paths



commit 31fcd79dd9428c4fbfbbd00b2c221b46f65bdcc9
Author: Michael Natterer <mitch gimp org>
Date:   Sat Oct 29 16:50:13 2016 +0200

    Bug 769738 - Add color tags/labels for layers/channels/paths
    
    Add property "color-tag" of type enum GimpColorTag to GimpItem so all
    layers, channels and paths can be tagged with a color.
    
    For interoperability, use the color list from Krita which is a
    superset of Photoshop's colors.
    
    Features a "Color Tag" submenu in the layers, channels and paths
    menus, a row of color radio buttons in the properties dialogs,
    undo and PDB API.
    
    As a side effect, some common code is now factores out into
    items-actions.[ch] and items-commands.[ch] which adds visible, linked
    and lock actions for layers and channels.

 app/actions/Makefile.am              |    4 +
 app/actions/channels-actions.c       |  102 ++++++++++++++++++++++
 app/actions/channels-commands.c      |   69 +++++++++++++++
 app/actions/channels-commands.h      |   13 +++
 app/actions/items-actions.c          |  138 +++++++++++++++++++++++++++++
 app/actions/items-actions.h          |   29 ++++++
 app/actions/items-commands.c         |  158 ++++++++++++++++++++++++++++++++++
 app/actions/items-commands.h         |   41 +++++++++
 app/actions/layers-actions.c         |  113 ++++++++++++++++++++++--
 app/actions/layers-commands.c        |   70 +++++++++++++++-
 app/actions/layers-commands.h        |   12 +++
 app/actions/quick-mask-commands.c    |    3 +
 app/actions/vectors-actions.c        |  127 +++++++++++++++++++---------
 app/actions/vectors-commands.c       |  138 ++++++++++-------------------
 app/actions/vectors-commands.h       |    4 +
 app/core/core-enums.c                |    2 +
 app/core/core-enums.h                |    1 +
 app/core/gimpimage-undo-push.c       |   16 ++++
 app/core/gimpimage-undo-push.h       |    3 +
 app/core/gimpitem.c                  |   77 +++++++++++++---
 app/core/gimpitem.h                  |    6 ++
 app/core/gimpitempropundo.c          |   16 +++-
 app/core/gimpitempropundo.h          |    1 +
 app/dialogs/channel-options-dialog.c |   25 +++--
 app/dialogs/channel-options-dialog.h |    2 +
 app/dialogs/item-options-dialog.c    |   69 +++++++++++++++
 app/dialogs/item-options-dialog.h    |   22 +++--
 app/dialogs/layer-options-dialog.c   |   25 +++--
 app/dialogs/layer-options-dialog.h   |    2 +
 app/dialogs/vectors-options-dialog.c |   25 +++--
 app/dialogs/vectors-options-dialog.h |   22 +++--
 app/pdb/internal-procs.c             |    2 +-
 app/pdb/item-cmds.c                  |  113 ++++++++++++++++++++++++
 app/widgets/gimphelp-ids.h           |    5 +
 app/widgets/gimpitemtreeview.c       |   66 ++++++++++++++-
 app/widgets/gimpwidgets-utils.c      |   39 ++++++++
 app/widgets/gimpwidgets-utils.h      |    4 +
 libgimp/gimp.def                     |    2 +
 libgimp/gimpenums.c.tail             |    2 +
 libgimp/gimpitem_pdb.c               |   66 ++++++++++++++
 libgimp/gimpitem_pdb.h               |    3 +
 libgimpbase/gimpbase.def             |    1 +
 libgimpbase/gimpbaseenums.c          |   44 ++++++++++
 libgimpbase/gimpbaseenums.h          |   18 ++++
 menus/channels-menu.xml              |   11 +++
 menus/layers-menu.xml                |   11 +++
 menus/vectors-menu.xml               |   11 +++
 tools/pdbgen/enums.pl                |   18 ++++
 tools/pdbgen/pdb/item.pdb            |   50 +++++++++++
 49 files changed, 1591 insertions(+), 210 deletions(-)
---
diff --git a/app/actions/Makefile.am b/app/actions/Makefile.am
index 1c144c0..3613fbb 100644
--- a/app/actions/Makefile.am
+++ b/app/actions/Makefile.am
@@ -116,6 +116,10 @@ libappactions_a_SOURCES = \
        images-actions.h                \
        images-commands.c               \
        images-commands.h               \
+       items-commands.c                \
+       items-commands.h                \
+       items-actions.c                 \
+       items-actions.h                 \
        layers-actions.c                \
        layers-actions.h                \
        layers-commands.c               \
diff --git a/app/actions/channels-actions.c b/app/actions/channels-actions.c
index 573f8b5..a74e613 100644
--- a/app/actions/channels-actions.c
+++ b/app/actions/channels-actions.c
@@ -34,6 +34,7 @@
 #include "actions.h"
 #include "channels-actions.h"
 #include "channels-commands.h"
+#include "items-actions.h"
 
 #include "gimp-intl.h"
 
@@ -44,6 +45,10 @@ static const GimpActionEntry channels_actions[] =
     NC_("channels-action", "Channels Menu"), NULL, NULL, NULL,
     GIMP_HELP_CHANNEL_DIALOG },
 
+  { "channels-color-tag-menu", GIMP_STOCK_CLOSE /* abused */,
+    NC_("channels-action", "Color Tag"), NULL, NULL, NULL,
+    GIMP_HELP_CHANNEL_COLOR_TAG },
+
   { "channels-edit-attributes", "gtk-edit",
     NC_("channels-action", "_Edit Channel Attributes..."), NULL,
     NC_("channels-action", "Edit the channel's name, color and opacity"),
@@ -102,6 +107,90 @@ static const GimpActionEntry channels_actions[] =
     GIMP_HELP_CHANNEL_LOWER_TO_BOTTOM }
 };
 
+static const GimpToggleActionEntry channels_toggle_actions[] =
+{
+  { "channels-visible", GIMP_STOCK_VISIBLE,
+    NC_("channels-action", "_Visible"), NULL, NULL,
+    G_CALLBACK (channels_visible_cmd_callback),
+    FALSE,
+    GIMP_HELP_CHANNEL_VISIBLE },
+
+  { "channels-linked", GIMP_STOCK_LINKED,
+    NC_("channels-action", "_Linked"), NULL, NULL,
+    G_CALLBACK (channels_linked_cmd_callback),
+    FALSE,
+    GIMP_HELP_CHANNEL_LINKED },
+
+  { "channels-lock-content", NULL /* GIMP_STOCK_LOCK */,
+    NC_("channels-action", "L_ock pixels"), NULL, NULL,
+    G_CALLBACK (channels_lock_content_cmd_callback),
+    FALSE,
+    GIMP_HELP_CHANNEL_LOCK_PIXELS },
+
+  { "channels-lock-position", GIMP_STOCK_TOOL_MOVE,
+    NC_("channels-action", "L_ock position"), NULL, NULL,
+    G_CALLBACK (channels_lock_position_cmd_callback),
+    FALSE,
+    GIMP_HELP_CHANNEL_LOCK_POSITION }
+};
+
+static const GimpEnumActionEntry channels_color_tag_actions[] =
+{
+  { "channels-color-tag-none", GIMP_STOCK_CLOSE /* abused */,
+    NC_("channels-action", "None"), NULL,
+    NC_("channels-action", "Clear color tag"),
+    GIMP_COLOR_TAG_NONE, FALSE,
+    GIMP_HELP_CHANNEL_COLOR_TAG },
+
+  { "channels-color-tag-blue", NULL,
+    NC_("channels-action", "Blue"), NULL,
+    NC_("channels-action", "Set color tag to blue"),
+    GIMP_COLOR_TAG_BLUE, FALSE,
+    GIMP_HELP_CHANNEL_COLOR_TAG },
+
+  { "channels-color-tag-green", NULL,
+    NC_("channels-action", "Green"), NULL,
+    NC_("channels-action", "Set color tag to green"),
+    GIMP_COLOR_TAG_GREEN, FALSE,
+    GIMP_HELP_CHANNEL_COLOR_TAG },
+
+  { "channels-color-tag-yellow", NULL,
+    NC_("channels-action", "Yellow"), NULL,
+    NC_("channels-action", "Set color tag to yellow"),
+    GIMP_COLOR_TAG_YELLOW, FALSE,
+    GIMP_HELP_CHANNEL_COLOR_TAG },
+
+  { "channels-color-tag-orange", NULL,
+    NC_("channels-action", "Orange"), NULL,
+    NC_("channels-action", "Set color tag to orange"),
+    GIMP_COLOR_TAG_ORANGE, FALSE,
+    GIMP_HELP_CHANNEL_COLOR_TAG },
+
+  { "channels-color-tag-brown", NULL,
+    NC_("channels-action", "Brown"), NULL,
+    NC_("channels-action", "Set color tag to brown"),
+    GIMP_COLOR_TAG_BROWN, FALSE,
+    GIMP_HELP_CHANNEL_COLOR_TAG },
+
+  { "channels-color-tag-red", NULL,
+    NC_("channels-action", "Red"), NULL,
+    NC_("channels-action", "Set color tag to red"),
+    GIMP_COLOR_TAG_RED, FALSE,
+    GIMP_HELP_CHANNEL_COLOR_TAG },
+
+  { "channels-color-tag-violet", NULL,
+    NC_("channels-action", "Violet"), NULL,
+    NC_("channels-action", "Set color tag to violet"),
+    GIMP_COLOR_TAG_VIOLET, FALSE,
+    GIMP_HELP_CHANNEL_COLOR_TAG },
+
+  { "channels-color-tag-gray", NULL,
+    NC_("channels-action", "Gray"), NULL,
+    NC_("channels-action", "Set color tag to gray"),
+    GIMP_COLOR_TAG_GRAY, FALSE,
+    GIMP_HELP_CHANNEL_COLOR_TAG }
+};
+
 static const GimpEnumActionEntry channels_to_selection_actions[] =
 {
   { "channels-selection-replace", GIMP_STOCK_SELECTION_REPLACE,
@@ -137,10 +226,21 @@ channels_actions_setup (GimpActionGroup *group)
                                  channels_actions,
                                  G_N_ELEMENTS (channels_actions));
 
+  gimp_action_group_add_toggle_actions (group, "channels-action",
+                                        channels_toggle_actions,
+                                        G_N_ELEMENTS (channels_toggle_actions));
+
+  gimp_action_group_add_enum_actions (group, "channels-action",
+                                      channels_color_tag_actions,
+                                      G_N_ELEMENTS (channels_color_tag_actions),
+                                      G_CALLBACK (channels_color_tag_cmd_callback));
+
   gimp_action_group_add_enum_actions (group, "channels-action",
                                       channels_to_selection_actions,
                                       G_N_ELEMENTS (channels_to_selection_actions),
                                       G_CALLBACK (channels_to_selection_cmd_callback));
+
+  items_actions_setup (group, "channels");
 }
 
 void
@@ -206,4 +306,6 @@ channels_actions_update (GimpActionGroup *group,
   SET_SENSITIVE ("channels-selection-intersect", !fs && (channel || component));
 
 #undef SET_SENSITIVE
+
+  items_actions_update (group, "channels", GIMP_ITEM (channel));
 }
diff --git a/app/actions/channels-commands.c b/app/actions/channels-commands.c
index 8d6214b..e34b165 100644
--- a/app/actions/channels-commands.c
+++ b/app/actions/channels-commands.c
@@ -49,6 +49,7 @@
 
 #include "actions.h"
 #include "channels-commands.h"
+#include "items-commands.h"
 
 #include "gimp-intl.h"
 
@@ -64,6 +65,7 @@ static void   channels_new_callback             (GtkWidget     *dialog,
                                                  gboolean       save_selection,
                                                  gboolean       channel_visible,
                                                  gboolean       channel_linked,
+                                                 GimpColorTag   channel_color_tag,
                                                  gboolean       channel_lock_content,
                                                  gboolean       channel_lock_position,
                                                  gpointer       user_data);
@@ -76,6 +78,7 @@ static void   channels_edit_attributes_callback (GtkWidget     *dialog,
                                                  gboolean       save_selection,
                                                  gboolean       channel_visible,
                                                  gboolean       channel_linked,
+                                                 GimpColorTag   channel_color_tag,
                                                  gboolean       channel_lock_content,
                                                  gboolean       channel_lock_position,
                                                  gpointer       user_data);
@@ -117,6 +120,7 @@ channels_edit_attributes_cmd_callback (GtkAction *action,
                                            &channel->color,
                                            gimp_item_get_visible (item),
                                            gimp_item_get_linked (item),
+                                           gimp_item_get_color_tag (item),
                                            gimp_item_get_lock_content (item),
                                            gimp_item_get_lock_position (item),
                                            channels_edit_attributes_callback,
@@ -161,6 +165,7 @@ channels_new_cmd_callback (GtkAction *action,
                                            &config->channel_new_color,
                                            TRUE,
                                            FALSE,
+                                           GIMP_COLOR_TAG_NONE,
                                            FALSE,
                                            FALSE,
                                            channels_new_callback,
@@ -362,6 +367,63 @@ channels_to_selection_cmd_callback (GtkAction *action,
   gimp_image_flush (image);
 }
 
+void
+channels_visible_cmd_callback (GtkAction *action,
+                               gpointer   data)
+{
+  GimpImage   *image;
+  GimpChannel *channel;
+  return_if_no_channel (image, channel, data);
+
+  items_visible_cmd_callback (action, image, GIMP_ITEM (channel));
+}
+
+void
+channels_linked_cmd_callback (GtkAction *action,
+                              gpointer   data)
+{
+  GimpImage   *image;
+  GimpChannel *channel;
+  return_if_no_channel (image, channel, data);
+
+  items_linked_cmd_callback (action, image, GIMP_ITEM (channel));
+}
+
+void
+channels_lock_content_cmd_callback (GtkAction *action,
+                                    gpointer   data)
+{
+  GimpImage   *image;
+  GimpChannel *channel;
+  return_if_no_channel (image, channel, data);
+
+  items_lock_content_cmd_callback (action, image, GIMP_ITEM (channel));
+}
+
+void
+channels_lock_position_cmd_callback (GtkAction *action,
+                                     gpointer   data)
+{
+  GimpImage   *image;
+  GimpChannel *channel;
+  return_if_no_channel (image, channel, data);
+
+  items_lock_position_cmd_callback (action, image, GIMP_ITEM (channel));
+}
+
+void
+channels_color_tag_cmd_callback (GtkAction *action,
+                                 gint       value,
+                                 gpointer   data)
+{
+  GimpImage   *image;
+  GimpChannel *channel;
+  return_if_no_channel (image, channel, data);
+
+  items_color_tag_cmd_callback (action, image, GIMP_ITEM (channel),
+                                (GimpColorTag) value);
+}
+
 
 /*  private functions  */
 
@@ -375,6 +437,7 @@ channels_new_callback (GtkWidget     *dialog,
                        gboolean       save_selection,
                        gboolean       channel_visible,
                        gboolean       channel_linked,
+                       GimpColorTag   channel_color_tag,
                        gboolean       channel_lock_content,
                        gboolean       channel_lock_position,
                        gpointer       user_data)
@@ -411,6 +474,7 @@ channels_new_callback (GtkWidget     *dialog,
 
   gimp_item_set_visible (GIMP_ITEM (channel), channel_visible, FALSE);
   gimp_item_set_linked (GIMP_ITEM (channel), channel_linked, FALSE);
+  gimp_item_set_color_tag (GIMP_ITEM (channel), channel_color_tag, FALSE);
   gimp_item_set_lock_content (GIMP_ITEM (channel), channel_lock_content, FALSE);
   gimp_item_set_lock_position (GIMP_ITEM (channel), channel_lock_position, FALSE);
 
@@ -431,6 +495,7 @@ channels_edit_attributes_callback (GtkWidget     *dialog,
                                    gboolean       save_selection,
                                    gboolean       channel_visible,
                                    gboolean       channel_linked,
+                                   GimpColorTag   channel_color_tag,
                                    gboolean       channel_lock_content,
                                    gboolean       channel_lock_position,
                                    gpointer       user_data)
@@ -441,6 +506,7 @@ channels_edit_attributes_callback (GtkWidget     *dialog,
       gimp_rgba_distance (channel_color, &channel->color) > 0.0001 ||
       channel_visible       != gimp_item_get_visible (item)        ||
       channel_linked        != gimp_item_get_linked (item)         ||
+      channel_color_tag     != gimp_item_get_color_tag (item)      ||
       channel_lock_content  != gimp_item_get_lock_content (item)   ||
       channel_lock_position != gimp_item_get_lock_position (item))
     {
@@ -460,6 +526,9 @@ channels_edit_attributes_callback (GtkWidget     *dialog,
       if (channel_linked != gimp_item_get_linked (item))
         gimp_item_set_linked (item, channel_linked, TRUE);
 
+      if (channel_color_tag != gimp_item_get_color_tag (item))
+        gimp_item_set_color_tag (item, channel_color_tag, TRUE);
+
       if (channel_lock_content != gimp_item_get_lock_content (item))
         gimp_item_set_lock_content (item, channel_lock_content, TRUE);
 
diff --git a/app/actions/channels-commands.h b/app/actions/channels-commands.h
index a868e68..f88ff92 100644
--- a/app/actions/channels-commands.h
+++ b/app/actions/channels-commands.h
@@ -43,5 +43,18 @@ void   channels_to_selection_cmd_callback    (GtkAction   *action,
                                               gint         value,
                                               gpointer     data);
 
+void   channels_visible_cmd_callback         (GtkAction   *action,
+                                              gpointer     data);
+void   channels_linked_cmd_callback          (GtkAction   *action,
+                                              gpointer     data);
+void   channels_lock_content_cmd_callback    (GtkAction   *action,
+                                              gpointer     data);
+void   channels_lock_position_cmd_callback   (GtkAction   *action,
+                                              gpointer     data);
+
+void   channels_color_tag_cmd_callback       (GtkAction   *action,
+                                              gint         value,
+                                              gpointer     data);
+
 
 #endif /* __CHANNELS_COMMANDS_H__ */
diff --git a/app/actions/items-actions.c b/app/actions/items-actions.c
new file mode 100644
index 0000000..bb8084e
--- /dev/null
+++ b/app/actions/items-actions.c
@@ -0,0 +1,138 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <gegl.h>
+#include <gtk/gtk.h>
+
+#include "libgimpwidgets/gimpwidgets.h"
+
+#include "actions-types.h"
+
+#include "core/gimpitem.h"
+
+#include "widgets/gimpactiongroup.h"
+#include "widgets/gimpwidgets-utils.h"
+
+#include "items-actions.h"
+
+
+void
+items_actions_setup (GimpActionGroup *group,
+                     const gchar     *prefix)
+{
+  GEnumClass *enum_class;
+  GEnumValue *value;
+
+  enum_class = g_type_class_ref (GIMP_TYPE_COLOR_TAG);
+
+  for (value = enum_class->values; value->value_name; value++)
+    {
+      gchar action[32];
+
+      g_snprintf (action, sizeof (action),
+                  "%s-color-tag-%s", prefix, value->value_nick);
+
+      if (value->value == GIMP_COLOR_TAG_NONE)
+        {
+          gimp_action_group_set_action_always_show_image (group, action, TRUE);
+        }
+      else
+        {
+          GimpRGB color;
+
+          gimp_get_color_tag_color (value->value, &color);
+          gimp_action_group_set_action_color (group, action, &color, FALSE);
+        }
+    }
+
+  g_type_class_unref (enum_class);
+}
+
+void
+items_actions_update (GimpActionGroup *group,
+                      const gchar     *prefix,
+                      GimpItem        *item)
+{
+  GEnumClass *enum_class;
+  GEnumValue *value;
+  gchar       action[32];
+  gboolean    visible       = FALSE;
+  gboolean    linked        = FALSE;
+  gboolean    has_color_tag = FALSE;
+  gboolean    locked        = FALSE;
+  gboolean    can_lock      = FALSE;
+  gboolean    locked_pos    = FALSE;
+  gboolean    can_lock_pos  = FALSE;
+  GimpRGB     tag_color;
+
+  if (item)
+    {
+      visible      = gimp_item_get_visible (item);
+      linked       = gimp_item_get_linked (item);
+      locked       = gimp_item_get_lock_content (item);
+      can_lock     = gimp_item_can_lock_content (item);
+      locked_pos   = gimp_item_get_lock_position (item);
+      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);
+    }
+
+#define SET_SENSITIVE(action,condition) \
+        gimp_action_group_set_action_sensitive (group, action, (condition) != 0)
+#define SET_ACTIVE(action,condition) \
+        gimp_action_group_set_action_active (group, action, (condition) != 0)
+#define SET_COLOR(action,color) \
+        gimp_action_group_set_action_color (group, action, color, FALSE)
+
+  g_snprintf (action, sizeof (action), "%s-visible", prefix);
+  SET_SENSITIVE (action, item);
+  SET_ACTIVE    (action, visible);
+
+  g_snprintf (action, sizeof (action), "%s-linked", prefix);
+  SET_SENSITIVE (action, item);
+  SET_ACTIVE    (action, linked);
+
+  g_snprintf (action, sizeof (action), "%s-lock-content", prefix);
+  SET_SENSITIVE (action, can_lock);
+  SET_ACTIVE    (action, locked);
+
+  g_snprintf (action, sizeof (action), "%s-lock-position", prefix);
+  SET_SENSITIVE (action, can_lock_pos);
+  SET_ACTIVE    (action, locked_pos);
+
+  g_snprintf (action, sizeof (action), "%s-color-tag-menu", prefix);
+  SET_COLOR (action, has_color_tag ? &tag_color : NULL);
+
+  enum_class = g_type_class_ref (GIMP_TYPE_COLOR_TAG);
+
+  for (value = enum_class->values; value->value_name; value++)
+    {
+      g_snprintf (action, sizeof (action),
+                  "%s-color-tag-%s", prefix, value->value_nick);
+
+      SET_SENSITIVE (action, item);
+    }
+
+  g_type_class_unref (enum_class);
+
+#undef SET_SENSITIVE
+#undef SET_ACTIVE
+#undef SET_COLOR
+}
diff --git a/app/actions/items-actions.h b/app/actions/items-actions.h
new file mode 100644
index 0000000..0075d1a
--- /dev/null
+++ b/app/actions/items-actions.h
@@ -0,0 +1,29 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __ITEMS_ACTIONS_H__
+#define __ITEMS_ACTIONS_H__
+
+
+void   items_actions_setup  (GimpActionGroup *group,
+                             const gchar     *prefix);
+void   items_actions_update (GimpActionGroup *group,
+                             const gchar     *prefix,
+                             GimpItem        *item);
+
+
+#endif /* __ITEMS_ACTIONS_H__ */
diff --git a/app/actions/items-commands.c b/app/actions/items-commands.c
new file mode 100644
index 0000000..738e04a
--- /dev/null
+++ b/app/actions/items-commands.c
@@ -0,0 +1,158 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <gegl.h>
+#include <gtk/gtk.h>
+
+#include "actions-types.h"
+
+#include "core/gimpimage.h"
+#include "core/gimpimage-undo.h"
+#include "core/gimpitem.h"
+#include "core/gimpitemundo.h"
+
+#include "items-commands.h"
+
+#include "gimp-intl.h"
+
+
+/*  public functions  */
+
+void
+items_visible_cmd_callback (GtkAction *action,
+                            GimpImage *image,
+                            GimpItem  *item)
+{
+  gboolean visible;
+
+  visible = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
+
+  if (visible != gimp_item_get_visible (item))
+    {
+      GimpUndo *undo;
+      gboolean  push_undo = TRUE;
+
+      undo = gimp_image_undo_can_compress (image, GIMP_TYPE_ITEM_UNDO,
+                                           GIMP_UNDO_ITEM_VISIBILITY);
+
+      if (undo && GIMP_ITEM_UNDO (undo)->item == item)
+        push_undo = FALSE;
+
+      gimp_item_set_visible (item, visible, push_undo);
+      gimp_image_flush (image);
+    }
+}
+
+void
+items_linked_cmd_callback (GtkAction *action,
+                           GimpImage *image,
+                           GimpItem  *item)
+{
+  gboolean linked;
+
+  linked = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
+
+  if (linked != gimp_item_get_linked (item))
+    {
+      GimpUndo *undo;
+      gboolean  push_undo = TRUE;
+
+      undo = gimp_image_undo_can_compress (image, GIMP_TYPE_ITEM_UNDO,
+                                           GIMP_UNDO_ITEM_LINKED);
+
+      if (undo && GIMP_ITEM_UNDO (undo)->item == item)
+        push_undo = FALSE;
+
+      gimp_item_set_linked (item, linked, push_undo);
+      gimp_image_flush (image);
+    }
+}
+
+void
+items_lock_content_cmd_callback (GtkAction *action,
+                                 GimpImage *image,
+                                 GimpItem  *item)
+{
+  gboolean locked;
+
+  locked = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
+
+  if (locked != gimp_item_get_lock_content (item))
+    {
+      GimpUndo *undo;
+      gboolean  push_undo = TRUE;
+
+      undo = gimp_image_undo_can_compress (image, GIMP_TYPE_ITEM_UNDO,
+                                           GIMP_UNDO_ITEM_LINKED);
+
+      if (undo && GIMP_ITEM_UNDO (undo)->item == item)
+        push_undo = FALSE;
+
+      gimp_item_set_lock_content (item, locked, push_undo);
+      gimp_image_flush (image);
+    }
+}
+
+void
+items_lock_position_cmd_callback (GtkAction *action,
+                                  GimpImage *image,
+                                  GimpItem  *item)
+{
+  gboolean locked;
+
+  locked = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
+
+  if (locked != gimp_item_get_lock_position (item))
+    {
+      GimpUndo *undo;
+      gboolean  push_undo = TRUE;
+
+      undo = gimp_image_undo_can_compress (image, GIMP_TYPE_ITEM_UNDO,
+                                           GIMP_UNDO_ITEM_LOCK_POSITION);
+
+      if (undo && GIMP_ITEM_UNDO (undo)->item == item)
+        push_undo = FALSE;
+
+
+      gimp_item_set_lock_position (item, locked, push_undo);
+      gimp_image_flush (image);
+    }
+}
+
+void
+items_color_tag_cmd_callback (GtkAction    *action,
+                              GimpImage    *image,
+                              GimpItem     *item,
+                              GimpColorTag  color_tag)
+{
+  if (color_tag != gimp_item_get_color_tag (item))
+    {
+      GimpUndo *undo;
+      gboolean  push_undo = TRUE;
+
+      undo = gimp_image_undo_can_compress (image, GIMP_TYPE_ITEM_UNDO,
+                                           GIMP_UNDO_ITEM_COLOR_TAG);
+
+      if (undo && GIMP_ITEM_UNDO (undo)->item == item)
+        push_undo = FALSE;
+
+      gimp_item_set_color_tag (item, color_tag, push_undo);
+      gimp_image_flush (image);
+    }
+}
diff --git a/app/actions/items-commands.h b/app/actions/items-commands.h
new file mode 100644
index 0000000..d9ac8ba
--- /dev/null
+++ b/app/actions/items-commands.h
@@ -0,0 +1,41 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __ITEMS_COMMANDS_H__
+#define __ITEMS_COMMANDS_H__
+
+
+void   items_visible_cmd_callback       (GtkAction    *action,
+                                         GimpImage    *image,
+                                         GimpItem     *item);
+void   items_linked_cmd_callback        (GtkAction    *action,
+                                         GimpImage    *image,
+                                         GimpItem     *item);
+void   items_lock_content_cmd_callback  (GtkAction    *action,
+                                         GimpImage    *image,
+                                         GimpItem     *item);
+void   items_lock_position_cmd_callback (GtkAction    *action,
+                                         GimpImage    *image,
+                                         GimpItem     *item);
+
+void   items_color_tag_cmd_callback     (GtkAction    *action,
+                                         GimpImage    *image,
+                                         GimpItem     *item,
+                                         GimpColorTag  color_tag);
+
+
+#endif /* __ITEMS_COMMANDS_H__ */
diff --git a/app/actions/layers-actions.c b/app/actions/layers-actions.c
index a16914a..116bd94 100644
--- a/app/actions/layers-actions.c
+++ b/app/actions/layers-actions.c
@@ -37,6 +37,7 @@
 
 #include "actions.h"
 #include "image-commands.h"
+#include "items-actions.h"
 #include "layers-actions.h"
 #include "layers-commands.h"
 
@@ -49,6 +50,10 @@ static const GimpActionEntry layers_actions[] =
     NC_("layers-action", "Layers Menu"), NULL, NULL, NULL,
     GIMP_HELP_LAYER_DIALOG },
 
+  { "layers-color-tag-menu", GIMP_STOCK_CLOSE /* abused */,
+    NC_("layers-action", "Color Tag"), NULL, NULL, NULL,
+    GIMP_HELP_LAYER_COLOR_TAG },
+
   { "layers-menu",                   NULL,
     NC_("layers-action", "_Layer")        },
   { "layers-stack-menu",             NULL,
@@ -257,14 +262,6 @@ static const GimpActionEntry layers_actions[] =
 
 static const GimpToggleActionEntry layers_toggle_actions[] =
 {
-  { "layers-lock-alpha", GIMP_STOCK_TRANSPARENCY,
-    NC_("layers-action", "Lock Alph_a Channel"), NULL,
-    NC_("layers-action",
-        "Keep transparency information on this layer from being modified"),
-    G_CALLBACK (layers_lock_alpha_cmd_callback),
-    FALSE,
-    GIMP_HELP_LAYER_LOCK_ALPHA },
-
   { "layers-mask-edit", "gtk-edit",
     NC_("layers-action", "_Edit Layer Mask"), NULL,
     NC_("layers-action", "Work on the layer mask"),
@@ -283,7 +280,96 @@ static const GimpToggleActionEntry layers_toggle_actions[] =
     NC_("layers-action", "Dismiss the effect of the layer mask"),
     G_CALLBACK (layers_mask_disable_cmd_callback),
     FALSE,
-    GIMP_HELP_LAYER_MASK_DISABLE }
+    GIMP_HELP_LAYER_MASK_DISABLE },
+
+  { "layers-visible", GIMP_STOCK_VISIBLE,
+    NC_("layers-action", "_Visible"), NULL, NULL,
+    G_CALLBACK (layers_visible_cmd_callback),
+    FALSE,
+    GIMP_HELP_LAYER_VISIBLE },
+
+  { "layers-linked", GIMP_STOCK_LINKED,
+    NC_("layers-action", "_Linked"), NULL, NULL,
+    G_CALLBACK (layers_linked_cmd_callback),
+    FALSE,
+    GIMP_HELP_LAYER_LINKED },
+
+  { "layers-lock-content", NULL /* GIMP_STOCK_LOCK */,
+    NC_("layers-action", "L_ock pixels"), NULL, NULL,
+    G_CALLBACK (layers_lock_content_cmd_callback),
+    FALSE,
+    GIMP_HELP_LAYER_LOCK_PIXELS },
+
+  { "layers-lock-position", GIMP_STOCK_TOOL_MOVE,
+    NC_("layers-action", "L_ock position"), NULL, NULL,
+    G_CALLBACK (layers_lock_position_cmd_callback),
+    FALSE,
+    GIMP_HELP_LAYER_LOCK_POSITION },
+
+  { "layers-lock-alpha", GIMP_STOCK_TRANSPARENCY,
+    NC_("layers-action", "Lock Alph_a Channel"), NULL,
+    NC_("layers-action",
+        "Keep transparency information on this layer from being modified"),
+    G_CALLBACK (layers_lock_alpha_cmd_callback),
+    FALSE,
+    GIMP_HELP_LAYER_LOCK_ALPHA },
+};
+
+static const GimpEnumActionEntry layers_color_tag_actions[] =
+{
+  { "layers-color-tag-none", GIMP_STOCK_CLOSE /* abused */,
+    NC_("layers-action", "None"), NULL,
+    NC_("layers-action", "Clear color tag"),
+    GIMP_COLOR_TAG_NONE, FALSE,
+    GIMP_HELP_LAYER_COLOR_TAG },
+
+  { "layers-color-tag-blue", NULL,
+    NC_("layers-action", "Blue"), NULL,
+    NC_("layers-action", "Set color tag to blue"),
+    GIMP_COLOR_TAG_BLUE, FALSE,
+    GIMP_HELP_LAYER_COLOR_TAG },
+
+  { "layers-color-tag-green", NULL,
+    NC_("layers-action", "Green"), NULL,
+    NC_("layers-action", "Set color tag to green"),
+    GIMP_COLOR_TAG_GREEN, FALSE,
+    GIMP_HELP_LAYER_COLOR_TAG },
+
+  { "layers-color-tag-yellow", NULL,
+    NC_("layers-action", "Yellow"), NULL,
+    NC_("layers-action", "Set color tag to yellow"),
+    GIMP_COLOR_TAG_YELLOW, FALSE,
+    GIMP_HELP_LAYER_COLOR_TAG },
+
+  { "layers-color-tag-orange", NULL,
+    NC_("layers-action", "Orange"), NULL,
+    NC_("layers-action", "Set color tag to orange"),
+    GIMP_COLOR_TAG_ORANGE, FALSE,
+    GIMP_HELP_LAYER_COLOR_TAG },
+
+  { "layers-color-tag-brown", NULL,
+    NC_("layers-action", "Brown"), NULL,
+    NC_("layers-action", "Set color tag to brown"),
+    GIMP_COLOR_TAG_BROWN, FALSE,
+    GIMP_HELP_LAYER_COLOR_TAG },
+
+  { "layers-color-tag-red", NULL,
+    NC_("layers-action", "Red"), NULL,
+    NC_("layers-action", "Set color tag to red"),
+    GIMP_COLOR_TAG_RED, FALSE,
+    GIMP_HELP_LAYER_COLOR_TAG },
+
+  { "layers-color-tag-violet", NULL,
+    NC_("layers-action", "Violet"), NULL,
+    NC_("layers-action", "Set color tag to violet"),
+    GIMP_COLOR_TAG_VIOLET, FALSE,
+    GIMP_HELP_LAYER_COLOR_TAG },
+
+  { "layers-color-tag-gray", NULL,
+    NC_("layers-action", "Gray"), NULL,
+    NC_("layers-action", "Set color tag to gray"),
+    GIMP_COLOR_TAG_GRAY, FALSE,
+    GIMP_HELP_LAYER_COLOR_TAG }
 };
 
 static const GimpEnumActionEntry layers_mask_apply_actions[] =
@@ -497,6 +583,11 @@ layers_actions_setup (GimpActionGroup *group)
                                         G_N_ELEMENTS (layers_toggle_actions));
 
   gimp_action_group_add_enum_actions (group, "layers-action",
+                                      layers_color_tag_actions,
+                                      G_N_ELEMENTS (layers_color_tag_actions),
+                                      G_CALLBACK (layers_color_tag_cmd_callback));
+
+  gimp_action_group_add_enum_actions (group, "layers-action",
                                       layers_mask_apply_actions,
                                       G_N_ELEMENTS (layers_mask_apply_actions),
                                       G_CALLBACK (layers_mask_apply_cmd_callback));
@@ -534,6 +625,8 @@ layers_actions_setup (GimpActionGroup *group)
                                       layers_mode_actions,
                                       G_N_ELEMENTS (layers_mode_actions),
                                       G_CALLBACK (layers_mode_cmd_callback));
+
+  items_actions_setup (group, "layers");
 }
 
 void
@@ -706,4 +799,6 @@ layers_actions_update (GimpActionGroup *group,
 #undef SET_SENSITIVE
 #undef SET_ACTIVE
 #undef SET_LABEL
+
+  items_actions_update (group, "layers", GIMP_ITEM (layer));
 }
diff --git a/app/actions/layers-commands.c b/app/actions/layers-commands.c
index d3dc4e4..394fa7b 100644
--- a/app/actions/layers-commands.c
+++ b/app/actions/layers-commands.c
@@ -75,6 +75,7 @@
 #include "dialogs/scale-dialog.h"
 
 #include "actions.h"
+#include "items-commands.h"
 #include "layers-commands.h"
 
 #include "gimp-intl.h"
@@ -126,6 +127,7 @@ static void   layers_new_callback             (GtkWidget             *dialog,
                                                gint                   layer_offset_y,
                                                gboolean               layer_visible,
                                                gboolean               layer_linked,
+                                               GimpColorTag           layer_color_tag,
                                                gboolean               layer_lock_pixels,
                                                gboolean               layer_lock_position,
                                                gboolean               layer_lock_alpha,
@@ -145,6 +147,7 @@ static void   layers_edit_attributes_callback (GtkWidget             *dialog,
                                                gint                   layer_offset_y,
                                                gboolean               layer_visible,
                                                gboolean               layer_linked,
+                                               GimpColorTag           layer_color_tag,
                                                gboolean               layer_lock_pixels,
                                                gboolean               layer_lock_position,
                                                gboolean               layer_lock_alpha,
@@ -260,6 +263,7 @@ layers_edit_attributes_cmd_callback (GtkAction *action,
                                          0 /* unused */,
                                          gimp_item_get_visible (item),
                                          gimp_item_get_linked (item),
+                                         gimp_item_get_color_tag (item),
                                          gimp_item_get_lock_content (item),
                                          gimp_item_get_lock_position (item),
                                          gimp_layer_get_lock_alpha (layer),
@@ -325,6 +329,7 @@ layers_new_cmd_callback (GtkAction *action,
                                          config->layer_new_fill_type,
                                          TRUE,
                                          FALSE,
+                                         GIMP_COLOR_TAG_NONE,
                                          FALSE,
                                          FALSE,
                                          FALSE,
@@ -1129,6 +1134,50 @@ layers_mode_cmd_callback (GtkAction *action,
 }
 
 void
+layers_visible_cmd_callback (GtkAction *action,
+                             gpointer   data)
+{
+  GimpImage *image;
+  GimpLayer *layer;
+  return_if_no_layer (image, layer, data);
+
+  items_visible_cmd_callback (action, image, GIMP_ITEM (layer));
+}
+
+void
+layers_linked_cmd_callback (GtkAction *action,
+                            gpointer   data)
+{
+  GimpImage *image;
+  GimpLayer *layer;
+  return_if_no_layer (image, layer, data);
+
+  items_linked_cmd_callback (action, image, GIMP_ITEM (layer));
+}
+
+void
+layers_lock_content_cmd_callback (GtkAction *action,
+                                  gpointer   data)
+{
+  GimpImage *image;
+  GimpLayer *layer;
+  return_if_no_layer (image, layer, data);
+
+  items_lock_content_cmd_callback (action, image, GIMP_ITEM (layer));
+}
+
+void
+layers_lock_position_cmd_callback (GtkAction *action,
+                                   gpointer   data)
+{
+  GimpImage *image;
+  GimpLayer *layer;
+  return_if_no_layer (image, layer, data);
+
+  items_lock_position_cmd_callback (action, image, GIMP_ITEM (layer));
+}
+
+void
 layers_lock_alpha_cmd_callback (GtkAction *action,
                                 gpointer   data)
 {
@@ -1155,6 +1204,19 @@ layers_lock_alpha_cmd_callback (GtkAction *action,
     }
 }
 
+void
+layers_color_tag_cmd_callback (GtkAction *action,
+                               gint       value,
+                               gpointer   data)
+{
+  GimpImage *image;
+  GimpLayer *layer;
+  return_if_no_layer (image, layer, data);
+
+  items_color_tag_cmd_callback (action, image, GIMP_ITEM (layer),
+                                (GimpColorTag) value);
+}
+
 
 /*  private functions  */
 
@@ -1173,6 +1235,7 @@ layers_new_callback (GtkWidget            *dialog,
                      gint                  layer_offset_y,
                      gboolean              layer_visible,
                      gboolean              layer_linked,
+                     GimpColorTag          layer_color_tag,
                      gboolean              layer_lock_pixels,
                      gboolean              layer_lock_position,
                      gboolean              layer_lock_alpha,
@@ -1201,6 +1264,7 @@ layers_new_callback (GtkWidget            *dialog,
                           config->layer_new_fill_type);
       gimp_item_set_visible (GIMP_ITEM (layer), layer_visible, FALSE);
       gimp_item_set_linked (GIMP_ITEM (layer), layer_linked, FALSE);
+      gimp_item_set_color_tag (GIMP_ITEM (layer), layer_color_tag, FALSE);
       gimp_item_set_lock_content (GIMP_ITEM (layer), layer_lock_pixels,
                                   FALSE);
       gimp_item_set_lock_position (GIMP_ITEM (layer), layer_lock_position,
@@ -1234,6 +1298,7 @@ layers_edit_attributes_callback (GtkWidget            *dialog,
                                  gint                  layer_offset_y,
                                  gboolean              layer_visible,
                                  gboolean              layer_linked,
+                                 GimpColorTag          layer_color_tag,
                                  gboolean              layer_lock_pixels,
                                  gboolean              layer_lock_position,
                                  gboolean              layer_lock_alpha,
@@ -1249,6 +1314,7 @@ layers_edit_attributes_callback (GtkWidget            *dialog,
       layer_offset_y      != gimp_item_get_offset_y (item)      ||
       layer_visible       != gimp_item_get_visible (item)       ||
       layer_linked        != gimp_item_get_linked (item)        ||
+      layer_color_tag     != gimp_item_get_color_tag (item)     ||
       layer_lock_pixels   != gimp_item_get_lock_content (item)  ||
       layer_lock_position != gimp_item_get_lock_position (item) ||
       layer_lock_alpha    != gimp_layer_get_lock_alpha (layer))
@@ -1291,6 +1357,9 @@ layers_edit_attributes_callback (GtkWidget            *dialog,
       if (layer_linked != gimp_item_get_linked (item))
         gimp_item_set_linked (item, layer_linked, TRUE);
 
+      if (layer_color_tag != gimp_item_get_color_tag (item))
+        gimp_item_set_color_tag (item, layer_color_tag, TRUE);
+
       if (layer_lock_pixels != gimp_item_get_lock_content (item))
         gimp_item_set_lock_content (item, layer_lock_pixels, TRUE);
 
@@ -1429,7 +1498,6 @@ layers_resize_callback (GtkWidget    *dialog,
                         gboolean      unused2,
                         gpointer      user_data)
 {
-
   layer_resize_unit = unit;
 
   if (width > 0 && height > 0)
diff --git a/app/actions/layers-commands.h b/app/actions/layers-commands.h
index 76e94cc..32db839 100644
--- a/app/actions/layers-commands.h
+++ b/app/actions/layers-commands.h
@@ -107,8 +107,20 @@ void   layers_mode_cmd_callback               (GtkAction   *action,
                                                gint         value,
                                                gpointer     data);
 
+void   layers_visible_cmd_callback            (GtkAction   *action,
+                                               gpointer     data);
+void   layers_linked_cmd_callback             (GtkAction   *action,
+                                               gpointer     data);
+void   layers_lock_content_cmd_callback       (GtkAction   *action,
+                                               gpointer     data);
+void   layers_lock_position_cmd_callback      (GtkAction   *action,
+                                               gpointer     data);
 void   layers_lock_alpha_cmd_callback         (GtkAction   *action,
                                                gpointer     data);
 
+void   layers_color_tag_cmd_callback          (GtkAction   *action,
+                                               gint         value,
+                                               gpointer     data);
+
 
 #endif /* __LAYERS_COMMANDS_H__ */
diff --git a/app/actions/quick-mask-commands.c b/app/actions/quick-mask-commands.c
index 252af50..d66020c 100644
--- a/app/actions/quick-mask-commands.c
+++ b/app/actions/quick-mask-commands.c
@@ -53,6 +53,7 @@ static void   quick_mask_configure_callback (GtkWidget     *dialog,
                                              gboolean       save_selection,
                                              gboolean       channel_visible,
                                              gboolean       channel_linked,
+                                             GimpColorTag   channel_color_tag,
                                              gboolean       channel_lock_content,
                                              gboolean       channel_lock_position,
                                              gpointer       user_data);
@@ -130,6 +131,7 @@ quick_mask_configure_cmd_callback (GtkAction *action,
                                            &color,
                                            FALSE,
                                            FALSE,
+                                           GIMP_COLOR_TAG_NONE,
                                            FALSE,
                                            FALSE,
                                            quick_mask_configure_callback,
@@ -156,6 +158,7 @@ quick_mask_configure_callback (GtkWidget     *dialog,
                                gboolean       save_selection,
                                gboolean       channel_visible,
                                gboolean       channel_linked,
+                               GimpColorTag   channel_color_tag,
                                gboolean       channel_lock_content,
                                gboolean       channel_lock_position,
                                gpointer       user_data)
diff --git a/app/actions/vectors-actions.c b/app/actions/vectors-actions.c
index 537f1d6..d36c13e 100644
--- a/app/actions/vectors-actions.c
+++ b/app/actions/vectors-actions.c
@@ -30,8 +30,10 @@
 
 #include "widgets/gimpactiongroup.h"
 #include "widgets/gimphelp-ids.h"
+#include "widgets/gimpwidgets-utils.h"
 
 #include "actions.h"
+#include "items-actions.h"
 #include "vectors-actions.h"
 #include "vectors-commands.h"
 
@@ -44,6 +46,10 @@ static const GimpActionEntry vectors_actions[] =
     NC_("vectors-action", "Paths Menu"), NULL, NULL, NULL,
     GIMP_HELP_PATH_DIALOG },
 
+  { "vectors-color-tag-menu", GIMP_STOCK_CLOSE /* abused */,
+    NC_("vectors-action", "Color Tag"), NULL, NULL, NULL,
+    GIMP_HELP_PATH_COLOR_TAG },
+
   { "vectors-path-tool", GIMP_STOCK_TOOL_PATH,
     NC_("vectors-action", "Path _Tool"), NULL, NULL,
     G_CALLBACK (vectors_vectors_tool_cmd_callback),
@@ -180,6 +186,63 @@ static const GimpToggleActionEntry vectors_toggle_actions[] =
     GIMP_HELP_PATH_LOCK_POSITION }
 };
 
+static const GimpEnumActionEntry vectors_color_tag_actions[] =
+{
+  { "vectors-color-tag-none", GIMP_STOCK_CLOSE /* abused */,
+    NC_("vectors-action", "None"), NULL,
+    NC_("vectors-action", "Clear color tag"),
+    GIMP_COLOR_TAG_NONE, FALSE,
+    GIMP_HELP_PATH_COLOR_TAG },
+
+  { "vectors-color-tag-blue", NULL,
+    NC_("vectors-action", "Blue"), NULL,
+    NC_("vectors-action", "Set color tag to blue"),
+    GIMP_COLOR_TAG_BLUE, FALSE,
+    GIMP_HELP_PATH_COLOR_TAG },
+
+  { "vectors-color-tag-green", NULL,
+    NC_("vectors-action", "Green"), NULL,
+    NC_("vectors-action", "Set color tag to green"),
+    GIMP_COLOR_TAG_GREEN, FALSE,
+    GIMP_HELP_PATH_COLOR_TAG },
+
+  { "vectors-color-tag-yellow", NULL,
+    NC_("vectors-action", "Yellow"), NULL,
+    NC_("vectors-action", "Set color tag to yellow"),
+    GIMP_COLOR_TAG_YELLOW, FALSE,
+    GIMP_HELP_PATH_COLOR_TAG },
+
+  { "vectors-color-tag-orange", NULL,
+    NC_("vectors-action", "Orange"), NULL,
+    NC_("vectors-action", "Set color tag to orange"),
+    GIMP_COLOR_TAG_ORANGE, FALSE,
+    GIMP_HELP_PATH_COLOR_TAG },
+
+  { "vectors-color-tag-brown", NULL,
+    NC_("vectors-action", "Brown"), NULL,
+    NC_("vectors-action", "Set color tag to brown"),
+    GIMP_COLOR_TAG_BROWN, FALSE,
+    GIMP_HELP_PATH_COLOR_TAG },
+
+  { "vectors-color-tag-red", NULL,
+    NC_("vectors-action", "Red"), NULL,
+    NC_("vectors-action", "Set color tag to red"),
+    GIMP_COLOR_TAG_RED, FALSE,
+    GIMP_HELP_PATH_COLOR_TAG },
+
+  { "vectors-color-tag-violet", NULL,
+    NC_("vectors-action", "Violet"), NULL,
+    NC_("vectors-action", "Set color tag to violet"),
+    GIMP_COLOR_TAG_VIOLET, FALSE,
+    GIMP_HELP_PATH_COLOR_TAG },
+
+  { "vectors-color-tag-gray", NULL,
+    NC_("vectors-action", "Gray"), NULL,
+    NC_("vectors-action", "Set color tag to gray"),
+    GIMP_COLOR_TAG_GRAY, FALSE,
+    GIMP_HELP_PATH_COLOR_TAG }
+};
+
 static const GimpEnumActionEntry vectors_to_selection_actions[] =
 {
   { "vectors-selection-replace", GIMP_STOCK_SELECTION_REPLACE,
@@ -247,6 +310,11 @@ vectors_actions_setup (GimpActionGroup *group)
                                         G_N_ELEMENTS (vectors_toggle_actions));
 
   gimp_action_group_add_enum_actions (group, "vectors-action",
+                                      vectors_color_tag_actions,
+                                      G_N_ELEMENTS (vectors_color_tag_actions),
+                                      G_CALLBACK (vectors_color_tag_cmd_callback));
+
+  gimp_action_group_add_enum_actions (group, "vectors-action",
                                       vectors_to_selection_actions,
                                       G_N_ELEMENTS (vectors_to_selection_actions),
                                       G_CALLBACK (vectors_to_selection_cmd_callback));
@@ -255,27 +323,23 @@ vectors_actions_setup (GimpActionGroup *group)
                                       vectors_selection_to_vectors_actions,
                                       G_N_ELEMENTS (vectors_selection_to_vectors_actions),
                                       G_CALLBACK (vectors_selection_to_vectors_cmd_callback));
+
+  items_actions_setup (group, "vectors");
 }
 
 void
 vectors_actions_update (GimpActionGroup *group,
                         gpointer         data)
 {
-  GimpImage    *image        = action_data_get_image (data);
-  GimpVectors  *vectors      = NULL;
-  GimpDrawable *drawable     = NULL;
-  gint          n_vectors    = 0;
-  gboolean      mask_empty   = TRUE;
-  gboolean      visible      = FALSE;
-  gboolean      linked       = FALSE;
-  gboolean      locked       = FALSE;
-  gboolean      can_lock     = FALSE;
-  gboolean      locked_pos   = FALSE;
-  gboolean      can_lock_pos = FALSE;
-  gboolean      dr_writable  = FALSE;
-  gboolean      dr_children  = FALSE;
-  GList        *next         = NULL;
-  GList        *prev         = NULL;
+  GimpImage    *image         = action_data_get_image (data);
+  GimpVectors  *vectors       = NULL;
+  GimpDrawable *drawable      = NULL;
+  gint          n_vectors     = 0;
+  gboolean      mask_empty    = TRUE;
+  gboolean      dr_writable   = FALSE;
+  gboolean      dr_children   = FALSE;
+  GList        *next          = NULL;
+  GList        *prev          = NULL;
 
   if (image)
     {
@@ -286,17 +350,10 @@ vectors_actions_update (GimpActionGroup *group,
 
       if (vectors)
         {
-          GimpItem *item = GIMP_ITEM (vectors);
-          GList    *vectors_list;
-          GList    *list;
-
-          visible      = gimp_item_get_visible (item);
-          linked       = gimp_item_get_linked (item);
-          locked       = gimp_item_get_lock_content (item);
-          can_lock     = gimp_item_can_lock_content (item);
-          locked_pos   = gimp_item_get_lock_position (item);
-          can_lock_pos = gimp_item_can_lock_position (item);
-          vectors_list = gimp_item_get_container_iter (item);
+          GList *vectors_list;
+          GList *list;
+
+          vectors_list = gimp_item_get_container_iter (GIMP_ITEM (vectors));
 
           list = g_list_find (vectors_list, vectors);
 
@@ -311,11 +368,9 @@ vectors_actions_update (GimpActionGroup *group,
 
       if (drawable)
         {
-          GimpItem *item = GIMP_ITEM (drawable);
-
-          dr_writable = ! gimp_item_is_content_locked (item);
+          dr_writable = ! gimp_item_is_content_locked (GIMP_ITEM (drawable));
 
-          if (gimp_viewable_get_children (GIMP_VIEWABLE (item)))
+          if (gimp_viewable_get_children (GIMP_VIEWABLE (drawable)))
             dr_children = TRUE;
         }
     }
@@ -344,16 +399,6 @@ vectors_actions_update (GimpActionGroup *group,
   SET_SENSITIVE ("vectors-export", vectors);
   SET_SENSITIVE ("vectors-import", image);
 
-  SET_SENSITIVE ("vectors-visible",       vectors);
-  SET_SENSITIVE ("vectors-linked",        vectors);
-  SET_SENSITIVE ("vectors-lock-content",  can_lock);
-  SET_SENSITIVE ("vectors-lock-position", can_lock_pos);
-
-  SET_ACTIVE ("vectors-visible",       visible);
-  SET_ACTIVE ("vectors-linked",        linked);
-  SET_ACTIVE ("vectors-lock-content",  locked);
-  SET_ACTIVE ("vectors-lock-position", locked_pos);
-
   SET_SENSITIVE ("vectors-selection-to-vectors",          image && !mask_empty);
   SET_SENSITIVE ("vectors-selection-to-vectors-short",    image && !mask_empty);
   SET_SENSITIVE ("vectors-selection-to-vectors-advanced", image && !mask_empty);
@@ -378,4 +423,6 @@ vectors_actions_update (GimpActionGroup *group,
 
 #undef SET_SENSITIVE
 #undef SET_ACTIVE
+
+  items_actions_update (group, "vectors", GIMP_ITEM (vectors));
 }
diff --git a/app/actions/vectors-commands.c b/app/actions/vectors-commands.c
index 0739ac2..50ae22a 100644
--- a/app/actions/vectors-commands.c
+++ b/app/actions/vectors-commands.c
@@ -67,6 +67,7 @@
 #include "dialogs/vectors-options-dialog.h"
 
 #include "actions.h"
+#include "items-commands.h"
 #include "vectors-commands.h"
 
 #include "gimp-intl.h"
@@ -81,6 +82,7 @@ static void   vectors_new_callback             (GtkWidget         *dialog,
                                                 const gchar       *vectors_name,
                                                 gboolean           vectors_visible,
                                                 gboolean           vectors_linked,
+                                                GimpColorTag       vectors_color_tag,
                                                 gboolean           vectors_lock_content,
                                                 gboolean           vectors_lock_position,
                                                 gpointer           user_data);
@@ -91,6 +93,7 @@ static void   vectors_edit_attributes_callback (GtkWidget         *dialog,
                                                 const gchar       *vectors_name,
                                                 gboolean           vectors_visible,
                                                 gboolean           vectors_linked,
+                                                GimpColorTag       vectors_color_tag,
                                                 gboolean           vectors_lock_content,
                                                 gboolean           vectors_lock_position,
                                                 gpointer           user_data);
@@ -180,6 +183,7 @@ vectors_edit_attributes_cmd_callback (GtkAction *action,
                                            gimp_object_get_name (vectors),
                                            gimp_item_get_visible (item),
                                            gimp_item_get_linked (item),
+                                           gimp_item_get_color_tag (item),
                                            gimp_item_get_lock_content (item),
                                            gimp_item_get_lock_position (item),
                                            vectors_edit_attributes_callback,
@@ -220,6 +224,7 @@ vectors_new_cmd_callback (GtkAction *action,
                                            config->vectors_new_name,
                                            FALSE,
                                            FALSE,
+                                           GIMP_COLOR_TAG_NONE,
                                            FALSE,
                                            FALSE,
                                            vectors_new_callback,
@@ -729,25 +734,9 @@ vectors_visible_cmd_callback (GtkAction *action,
 {
   GimpImage   *image;
   GimpVectors *vectors;
-  gboolean     visible;
   return_if_no_vectors (image, vectors, data);
 
-  visible = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
-
-  if (visible != gimp_item_get_visible (GIMP_ITEM (vectors)))
-    {
-      GimpUndo *undo;
-      gboolean  push_undo = TRUE;
-
-      undo = gimp_image_undo_can_compress (image, GIMP_TYPE_ITEM_UNDO,
-                                           GIMP_UNDO_ITEM_VISIBILITY);
-
-      if (undo && GIMP_ITEM_UNDO (undo)->item == GIMP_ITEM (vectors))
-        push_undo = FALSE;
-
-      gimp_item_set_visible (GIMP_ITEM (vectors), visible, push_undo);
-      gimp_image_flush (image);
-    }
+  items_visible_cmd_callback (action, image, GIMP_ITEM (vectors));
 }
 
 void
@@ -756,25 +745,9 @@ vectors_linked_cmd_callback (GtkAction *action,
 {
   GimpImage   *image;
   GimpVectors *vectors;
-  gboolean     linked;
   return_if_no_vectors (image, vectors, data);
 
-  linked = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
-
-  if (linked != gimp_item_get_linked (GIMP_ITEM (vectors)))
-    {
-      GimpUndo *undo;
-      gboolean  push_undo = TRUE;
-
-      undo = gimp_image_undo_can_compress (image, GIMP_TYPE_ITEM_UNDO,
-                                           GIMP_UNDO_ITEM_LINKED);
-
-      if (undo && GIMP_ITEM_UNDO (undo)->item == GIMP_ITEM (vectors))
-        push_undo = FALSE;
-
-      gimp_item_set_linked (GIMP_ITEM (vectors), linked, push_undo);
-      gimp_image_flush (image);
-    }
+  items_linked_cmd_callback (action, image, GIMP_ITEM (vectors));
 }
 
 void
@@ -783,29 +756,9 @@ vectors_lock_content_cmd_callback (GtkAction *action,
 {
   GimpImage   *image;
   GimpVectors *vectors;
-  gboolean     locked;
   return_if_no_vectors (image, vectors, data);
 
-  locked = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
-
-  if (locked != gimp_item_get_lock_content (GIMP_ITEM (vectors)))
-    {
-#if 0
-      GimpUndo *undo;
-#endif
-      gboolean  push_undo = TRUE;
-
-#if 0
-      undo = gimp_image_undo_can_compress (image, GIMP_TYPE_ITEM_UNDO,
-                                           GIMP_UNDO_ITEM_LINKED);
-
-      if (undo && GIMP_ITEM_UNDO (undo)->item == GIMP_ITEM (vectors))
-        push_undo = FALSE;
-#endif
-
-      gimp_item_set_lock_content (GIMP_ITEM (vectors), locked, push_undo);
-      gimp_image_flush (image);
-    }
+  items_lock_content_cmd_callback (action, image, GIMP_ITEM (vectors));
 }
 
 void
@@ -814,42 +767,39 @@ vectors_lock_position_cmd_callback (GtkAction *action,
 {
   GimpImage   *image;
   GimpVectors *vectors;
-  gboolean     locked;
   return_if_no_vectors (image, vectors, data);
 
-  locked = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
-
-  if (locked != gimp_item_get_lock_position (GIMP_ITEM (vectors)))
-    {
-      GimpUndo *undo;
-      gboolean  push_undo = TRUE;
-
-      undo = gimp_image_undo_can_compress (image, GIMP_TYPE_ITEM_UNDO,
-                                           GIMP_UNDO_ITEM_LOCK_POSITION);
-
-      if (undo && GIMP_ITEM_UNDO (undo)->item == GIMP_ITEM (vectors))
-        push_undo = FALSE;
+  items_lock_position_cmd_callback (action, image, GIMP_ITEM (vectors));
+}
 
+void
+vectors_color_tag_cmd_callback (GtkAction *action,
+                                gint       value,
+                                gpointer   data)
+{
+  GimpImage   *image;
+  GimpVectors *vectors;
+  return_if_no_vectors (image, vectors, data);
 
-      gimp_item_set_lock_position (GIMP_ITEM (vectors), locked, push_undo);
-      gimp_image_flush (image);
-    }
+  items_color_tag_cmd_callback (action, image, GIMP_ITEM (vectors),
+                                (GimpColorTag) value);
 }
 
 
 /*  private functions  */
 
 static void
-vectors_new_callback (GtkWidget   *dialog,
-                      GimpImage   *image,
-                      GimpVectors *vectors,
-                      GimpContext *context,
-                      const gchar *vectors_name,
-                      gboolean     vectors_visible,
-                      gboolean     vectors_linked,
-                      gboolean     vectors_lock_content,
-                      gboolean     vectors_lock_position,
-                      gpointer     user_data)
+vectors_new_callback (GtkWidget    *dialog,
+                      GimpImage    *image,
+                      GimpVectors  *vectors,
+                      GimpContext  *context,
+                      const gchar  *vectors_name,
+                      gboolean      vectors_visible,
+                      gboolean      vectors_linked,
+                      GimpColorTag  vectors_color_tag,
+                      gboolean      vectors_lock_content,
+                      gboolean      vectors_lock_position,
+                      gpointer      user_data)
 {
   GimpDialogConfig *config = GIMP_DIALOG_CONFIG (image->gimp->config);
 
@@ -860,6 +810,7 @@ vectors_new_callback (GtkWidget   *dialog,
   vectors = gimp_vectors_new (image, config->vectors_new_name);
   gimp_item_set_visible (GIMP_ITEM (vectors), vectors_visible, FALSE);
   gimp_item_set_linked (GIMP_ITEM (vectors), vectors_linked, FALSE);
+  gimp_item_set_color_tag (GIMP_ITEM (vectors), vectors_color_tag, FALSE);
   gimp_item_set_lock_content (GIMP_ITEM (vectors), vectors_lock_content, FALSE);
   gimp_item_set_lock_position (GIMP_ITEM (vectors), vectors_lock_position, FALSE);
 
@@ -871,22 +822,24 @@ vectors_new_callback (GtkWidget   *dialog,
 }
 
 static void
-vectors_edit_attributes_callback (GtkWidget   *dialog,
-                                  GimpImage   *image,
-                                  GimpVectors *vectors,
-                                  GimpContext *context,
-                                  const gchar *vectors_name,
-                                  gboolean     vectors_visible,
-                                  gboolean     vectors_linked,
-                                  gboolean     vectors_lock_content,
-                                  gboolean     vectors_lock_position,
-                                  gpointer     user_data)
+vectors_edit_attributes_callback (GtkWidget    *dialog,
+                                  GimpImage    *image,
+                                  GimpVectors  *vectors,
+                                  GimpContext  *context,
+                                  const gchar  *vectors_name,
+                                  gboolean      vectors_visible,
+                                  gboolean      vectors_linked,
+                                  GimpColorTag  vectors_color_tag,
+                                  gboolean      vectors_lock_content,
+                                  gboolean      vectors_lock_position,
+                                  gpointer      user_data)
 {
   GimpItem *item = GIMP_ITEM (vectors);
 
   if (strcmp (vectors_name, gimp_object_get_name (vectors))      ||
       vectors_visible       != gimp_item_get_visible (item)      ||
       vectors_linked        != gimp_item_get_linked (item)       ||
+      vectors_color_tag     != gimp_item_get_color_tag (item)    ||
       vectors_lock_content  != gimp_item_get_lock_content (item) ||
       vectors_lock_position != gimp_item_get_lock_position (item))
     {
@@ -903,6 +856,9 @@ vectors_edit_attributes_callback (GtkWidget   *dialog,
       if (vectors_linked != gimp_item_get_linked (item))
         gimp_item_set_linked (item, vectors_linked, TRUE);
 
+      if (vectors_color_tag != gimp_item_get_color_tag (item))
+        gimp_item_set_color_tag (item, vectors_color_tag, TRUE);
+
       if (vectors_lock_content != gimp_item_get_lock_content (item))
         gimp_item_set_lock_content (item, vectors_lock_content, TRUE);
 
diff --git a/app/actions/vectors-commands.h b/app/actions/vectors-commands.h
index 8b92989..dc33aea 100644
--- a/app/actions/vectors-commands.h
+++ b/app/actions/vectors-commands.h
@@ -77,5 +77,9 @@ void   vectors_lock_content_cmd_callback         (GtkAction   *action,
 void   vectors_lock_position_cmd_callback        (GtkAction   *action,
                                                   gpointer     data);
 
+void   vectors_color_tag_cmd_callback            (GtkAction   *action,
+                                                  gint         value,
+                                                  gpointer     data);
+
 
 #endif /* __VECTORS_COMMANDS_H__ */
diff --git a/app/core/core-enums.c b/app/core/core-enums.c
index 4725723..cbdcf44 100644
--- a/app/core/core-enums.c
+++ b/app/core/core-enums.c
@@ -866,6 +866,7 @@ gimp_undo_type_get_type (void)
     { GIMP_UNDO_ITEM_DISPLACE, "GIMP_UNDO_ITEM_DISPLACE", "item-displace" },
     { GIMP_UNDO_ITEM_VISIBILITY, "GIMP_UNDO_ITEM_VISIBILITY", "item-visibility" },
     { GIMP_UNDO_ITEM_LINKED, "GIMP_UNDO_ITEM_LINKED", "item-linked" },
+    { GIMP_UNDO_ITEM_COLOR_TAG, "GIMP_UNDO_ITEM_COLOR_TAG", "item-color-tag" },
     { GIMP_UNDO_ITEM_LOCK_CONTENT, "GIMP_UNDO_ITEM_LOCK_CONTENT", "item-lock-content" },
     { GIMP_UNDO_ITEM_LOCK_POSITION, "GIMP_UNDO_ITEM_LOCK_POSITION", "item-lock-position" },
     { GIMP_UNDO_LAYER_ADD, "GIMP_UNDO_LAYER_ADD", "layer-add" },
@@ -958,6 +959,7 @@ gimp_undo_type_get_type (void)
     { GIMP_UNDO_ITEM_DISPLACE, NC_("undo-type", "Move item"), NULL },
     { GIMP_UNDO_ITEM_VISIBILITY, NC_("undo-type", "Item visibility"), NULL },
     { GIMP_UNDO_ITEM_LINKED, NC_("undo-type", "Link/Unlink item"), NULL },
+    { GIMP_UNDO_ITEM_COLOR_TAG, NC_("undo-type", "Item color tag"), NULL },
     { GIMP_UNDO_ITEM_LOCK_CONTENT, NC_("undo-type", "Lock/Unlock content"), NULL },
     { GIMP_UNDO_ITEM_LOCK_POSITION, NC_("undo-type", "Lock/Unlock position"), NULL },
     { GIMP_UNDO_LAYER_ADD, NC_("undo-type", "New layer"), NULL },
diff --git a/app/core/core-enums.h b/app/core/core-enums.h
index 96c837f..95616e6 100644
--- a/app/core/core-enums.h
+++ b/app/core/core-enums.h
@@ -438,6 +438,7 @@ typedef enum /*< pdb-skip >*/
   GIMP_UNDO_ITEM_DISPLACE,            /*< desc="Move item"                   >*/
   GIMP_UNDO_ITEM_VISIBILITY,          /*< desc="Item visibility"             >*/
   GIMP_UNDO_ITEM_LINKED,              /*< desc="Link/Unlink item"            >*/
+  GIMP_UNDO_ITEM_COLOR_TAG,           /*< desc="Item color tag"              >*/
   GIMP_UNDO_ITEM_LOCK_CONTENT,        /*< desc="Lock/Unlock content"         >*/
   GIMP_UNDO_ITEM_LOCK_POSITION,       /*< desc="Lock/Unlock position"        >*/
   GIMP_UNDO_LAYER_ADD,                /*< desc="New layer"                   >*/
diff --git a/app/core/gimpimage-undo-push.c b/app/core/gimpimage-undo-push.c
index 86f9aed..670cc42 100644
--- a/app/core/gimpimage-undo-push.c
+++ b/app/core/gimpimage-undo-push.c
@@ -418,6 +418,22 @@ gimp_image_undo_push_item_linked (GimpImage   *image,
 }
 
 GimpUndo *
+gimp_image_undo_push_item_color_tag (GimpImage   *image,
+                                     const gchar *undo_desc,
+                                     GimpItem    *item)
+{
+  g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
+  g_return_val_if_fail (GIMP_IS_ITEM (item), NULL);
+  g_return_val_if_fail (gimp_item_is_attached (item), NULL);
+
+  return gimp_image_undo_push (image, GIMP_TYPE_ITEM_PROP_UNDO,
+                               GIMP_UNDO_ITEM_COLOR_TAG, undo_desc,
+                               GIMP_DIRTY_ITEM_META,
+                               "item", item,
+                               NULL);
+}
+
+GimpUndo *
 gimp_image_undo_push_item_lock_content (GimpImage   *image,
                                         const gchar *undo_desc,
                                         GimpItem    *item)
diff --git a/app/core/gimpimage-undo-push.h b/app/core/gimpimage-undo-push.h
index df531ec..57bc970 100644
--- a/app/core/gimpimage-undo-push.h
+++ b/app/core/gimpimage-undo-push.h
@@ -101,6 +101,9 @@ GimpUndo * gimp_image_undo_push_item_visibility     (GimpImage     *image,
 GimpUndo * gimp_image_undo_push_item_linked         (GimpImage     *image,
                                                      const gchar   *undo_desc,
                                                      GimpItem      *item);
+GimpUndo * gimp_image_undo_push_item_color_tag      (GimpImage     *image,
+                                                     const gchar   *undo_desc,
+                                                     GimpItem      *item);
 GimpUndo * gimp_image_undo_push_item_lock_content   (GimpImage     *image,
                                                      const gchar   *undo_desc,
                                                      GimpItem      *item);
diff --git a/app/core/gimpitem.c b/app/core/gimpitem.c
index 0fab4ca..f9e750c 100644
--- a/app/core/gimpitem.c
+++ b/app/core/gimpitem.c
@@ -54,6 +54,7 @@ enum
 {
   REMOVED,
   LINKED_CHANGED,
+  COLOR_TAG_CHANGED,
   LOCK_CONTENT_CHANGED,
   LOCK_POSITION_CHANGED,
   LAST_SIGNAL
@@ -69,6 +70,7 @@ enum
   PROP_OFFSET_X,
   PROP_OFFSET_Y,
   PROP_LINKED,
+  PROP_COLOR_TAG,
   PROP_LOCK_CONTENT,
   PROP_LOCK_POSITION
 };
@@ -92,7 +94,9 @@ struct _GimpItemPrivate
   guint             lock_content  : 1;  /*  content editability      */
   guint             lock_position : 1;  /*  content movability       */
 
-  guint             removed : 1;        /*  removed from the image?  */
+  guint             removed       : 1;  /*  removed from the image?  */
+
+  GimpColorTag      color_tag;          /*  color tag                */
 
   GList            *offset_nodes;       /*  offset nodes to manage   */
 };
@@ -186,6 +190,15 @@ gimp_item_class_init (GimpItemClass *klass)
                   gimp_marshal_VOID__VOID,
                   G_TYPE_NONE, 0);
 
+  gimp_item_signals[COLOR_TAG_CHANGED] =
+    g_signal_new ("color-tag-changed",
+                  G_TYPE_FROM_CLASS (klass),
+                  G_SIGNAL_RUN_FIRST,
+                  G_STRUCT_OFFSET (GimpItemClass, color_tag_changed),
+                  NULL, NULL,
+                  gimp_marshal_VOID__VOID,
+                  G_TYPE_NONE, 0);
+
   gimp_item_signals[LOCK_CONTENT_CHANGED] =
     g_signal_new ("lock-content-changed",
                   G_TYPE_FROM_CLASS (klass),
@@ -216,6 +229,7 @@ gimp_item_class_init (GimpItemClass *klass)
 
   klass->removed                   = NULL;
   klass->linked_changed            = NULL;
+  klass->color_tag_changed         = NULL;
   klass->lock_content_changed      = NULL;
   klass->lock_position_changed     = NULL;
 
@@ -286,6 +300,12 @@ gimp_item_class_init (GimpItemClass *klass)
                                                          FALSE,
                                                          GIMP_PARAM_READABLE));
 
+  g_object_class_install_property (object_class, PROP_COLOR_TAG,
+                                   g_param_spec_enum ("color-tag", NULL, NULL,
+                                                      GIMP_TYPE_COLOR_TAG,
+                                                      GIMP_COLOR_TAG_NONE,
+                                                      GIMP_PARAM_READABLE));
+
   g_object_class_install_property (object_class, PROP_LOCK_CONTENT,
                                    g_param_spec_boolean ("lock-content",
                                                          NULL, NULL,
@@ -308,18 +328,7 @@ gimp_item_init (GimpItem *item)
 
   g_object_force_floating (G_OBJECT (item));
 
-  private->ID            = 0;
-  private->tattoo        = 0;
-  private->image         = NULL;
-  private->parasites     = gimp_parasite_list_new ();
-  private->width         = 0;
-  private->height        = 0;
-  private->offset_x      = 0;
-  private->offset_y      = 0;
-  private->linked        = FALSE;
-  private->lock_content  = FALSE;
-  private->lock_position = FALSE;
-  private->removed       = FALSE;
+  private->parasites = gimp_parasite_list_new ();
 }
 
 static void
@@ -411,6 +420,9 @@ gimp_item_get_property (GObject    *object,
     case PROP_LINKED:
       g_value_set_boolean (value, private->linked);
       break;
+    case PROP_COLOR_TAG:
+      g_value_set_enum (value, private->color_tag);
+      break;
     case PROP_LOCK_CONTENT:
       g_value_set_boolean (value, private->lock_content);
       break;
@@ -526,8 +538,9 @@ gimp_item_real_duplicate (GimpItem *item,
   g_object_unref (GET_PRIVATE (new_item)->parasites);
   GET_PRIVATE (new_item)->parasites = gimp_parasite_list_copy (private->parasites);
 
-  gimp_item_set_visible (new_item, gimp_item_get_visible (item), FALSE);
-  gimp_item_set_linked  (new_item, gimp_item_get_linked (item),  FALSE);
+  gimp_item_set_visible   (new_item, gimp_item_get_visible   (item), FALSE);
+  gimp_item_set_linked    (new_item, gimp_item_get_linked    (item), FALSE);
+  gimp_item_set_color_tag (new_item, gimp_item_get_color_tag (item), FALSE);
 
   if (gimp_item_can_lock_content (new_item))
     gimp_item_set_lock_content (new_item, gimp_item_get_lock_content (item),
@@ -1819,6 +1832,7 @@ gimp_item_replace_item (GimpItem *item,
 
   gimp_item_set_visible       (item, gimp_item_get_visible (replace), FALSE);
   gimp_item_set_linked        (item, gimp_item_get_linked (replace), FALSE);
+  gimp_item_set_color_tag     (item, gimp_item_get_color_tag (replace), FALSE);
   gimp_item_set_lock_content  (item, gimp_item_get_lock_content (replace), FALSE);
   gimp_item_set_lock_position (item, gimp_item_get_lock_position (replace), FALSE);
 }
@@ -2103,6 +2117,39 @@ gimp_item_get_linked (GimpItem *item)
 }
 
 void
+gimp_item_set_color_tag (GimpItem     *item,
+                         GimpColorTag  color_tag,
+                         gboolean      push_undo)
+{
+  g_return_if_fail (GIMP_IS_ITEM (item));
+
+  if (gimp_item_get_color_tag (item) != color_tag)
+    {
+      if (push_undo && gimp_item_is_attached (item))
+        {
+          GimpImage *image = gimp_item_get_image (item);
+
+          if (image)
+            gimp_image_undo_push_item_color_tag (image, NULL, item);
+        }
+
+      GET_PRIVATE (item)->color_tag = color_tag;
+
+      g_signal_emit (item, gimp_item_signals[COLOR_TAG_CHANGED], 0);
+
+      g_object_notify (G_OBJECT (item), "color-tag");
+    }
+}
+
+GimpColorTag
+gimp_item_get_color_tag (GimpItem *item)
+{
+  g_return_val_if_fail (GIMP_IS_ITEM (item), GIMP_COLOR_TAG_NONE);
+
+  return GET_PRIVATE (item)->color_tag;
+}
+
+void
 gimp_item_set_lock_content (GimpItem *item,
                             gboolean  lock_content,
                             gboolean  push_undo)
diff --git a/app/core/gimpitem.h b/app/core/gimpitem.h
index dc053f0..da431e1 100644
--- a/app/core/gimpitem.h
+++ b/app/core/gimpitem.h
@@ -44,6 +44,7 @@ struct _GimpItemClass
   /*  signals  */
   void            (* removed)               (GimpItem            *item);
   void            (* linked_changed)        (GimpItem            *item);
+  void            (* color_tag_changed)     (GimpItem            *item);
   void            (* lock_content_changed)  (GimpItem            *item);
   void            (* lock_position_changed) (GimpItem            *item);
 
@@ -330,6 +331,11 @@ void            gimp_item_set_linked         (GimpItem           *item,
                                               gboolean            push_undo);
 gboolean        gimp_item_get_linked         (GimpItem           *item);
 
+void            gimp_item_set_color_tag      (GimpItem           *item,
+                                              GimpColorTag        color_tag,
+                                              gboolean            push_undo);
+GimpColorTag    gimp_item_get_color_tag      (GimpItem           *item);
+
 void            gimp_item_set_lock_content   (GimpItem           *item,
                                               gboolean            lock_content,
                                               gboolean            push_undo);
diff --git a/app/core/gimpitempropundo.c b/app/core/gimpitempropundo.c
index 61034df..023e8ee 100644
--- a/app/core/gimpitempropundo.c
+++ b/app/core/gimpitempropundo.c
@@ -124,7 +124,11 @@ gimp_item_prop_undo_constructed (GObject *object)
       break;
 
     case GIMP_UNDO_ITEM_LINKED:
-      item_prop_undo->linked  = gimp_item_get_linked (item);
+      item_prop_undo->linked = gimp_item_get_linked (item);
+      break;
+
+    case GIMP_UNDO_ITEM_COLOR_TAG:
+      item_prop_undo->color_tag = gimp_item_get_color_tag (item);
       break;
 
     case GIMP_UNDO_ITEM_LOCK_CONTENT:
@@ -285,6 +289,16 @@ gimp_item_prop_undo_pop (GimpUndo            *undo,
       }
       break;
 
+    case GIMP_UNDO_ITEM_COLOR_TAG:
+      {
+        GimpColorTag color_tag;
+
+        color_tag = gimp_item_get_color_tag (item);
+        gimp_item_set_color_tag (item, item_prop_undo->color_tag, FALSE);
+        item_prop_undo->color_tag = color_tag;
+      }
+      break;
+
     case GIMP_UNDO_ITEM_LOCK_CONTENT:
       {
         gboolean lock_content;
diff --git a/app/core/gimpitempropundo.h b/app/core/gimpitempropundo.h
index 59e92b4..192b4d1 100644
--- a/app/core/gimpitempropundo.h
+++ b/app/core/gimpitempropundo.h
@@ -46,6 +46,7 @@ struct _GimpItemPropUndo
   guint         linked        : 1;
   guint         lock_content  : 1;
   guint         lock_position : 1;
+  GimpColorTag  color_tag;
   gchar        *parasite_name;
   GimpParasite *parasite;
 };
diff --git a/app/dialogs/channel-options-dialog.c b/app/dialogs/channel-options-dialog.c
index 7109a05..cf8d740 100644
--- a/app/dialogs/channel-options-dialog.c
+++ b/app/dialogs/channel-options-dialog.c
@@ -61,6 +61,7 @@ static void channel_options_dialog_callback (GtkWidget            *dialog,
                                              const gchar          *item_name,
                                              gboolean              item_visible,
                                              gboolean              item_linked,
+                                             GimpColorTag          item_color_tag,
                                              gboolean              item_lock_content,
                                              gboolean              item_lock_position,
                                              gpointer              user_data);
@@ -89,6 +90,7 @@ channel_options_dialog_new (GimpImage                  *image,
                             const GimpRGB              *channel_color,
                             gboolean                    channel_visible,
                             gboolean                    channel_linked,
+                            GimpColorTag                channel_color_tag,
                             gboolean                    channel_lock_content,
                             gboolean                    channel_lock_position,
                             GimpChannelOptionsCallback  callback,
@@ -128,6 +130,7 @@ channel_options_dialog_new (GimpImage                  *image,
                                     channel_name,
                                     channel_visible,
                                     channel_linked,
+                                    channel_color_tag,
                                     channel_lock_content,
                                     channel_lock_position,
                                     channel_options_dialog_callback,
@@ -184,16 +187,17 @@ channel_options_dialog_free (ChannelOptionsDialog *private)
 }
 
 static void
-channel_options_dialog_callback (GtkWidget   *dialog,
-                                 GimpImage   *image,
-                                 GimpItem    *item,
-                                 GimpContext *context,
-                                 const gchar *item_name,
-                                 gboolean     item_visible,
-                                 gboolean     item_linked,
-                                 gboolean     item_lock_content,
-                                 gboolean     item_lock_position,
-                                 gpointer     user_data)
+channel_options_dialog_callback (GtkWidget    *dialog,
+                                 GimpImage    *image,
+                                 GimpItem     *item,
+                                 GimpContext  *context,
+                                 const gchar  *item_name,
+                                 gboolean      item_visible,
+                                 gboolean      item_linked,
+                                 GimpColorTag  item_color_tag,
+                                 gboolean      item_lock_content,
+                                 gboolean      item_lock_position,
+                                 gpointer      user_data)
 {
   ChannelOptionsDialog *private = user_data;
   GimpRGB               color;
@@ -215,6 +219,7 @@ channel_options_dialog_callback (GtkWidget   *dialog,
                      save_selection,
                      item_visible,
                      item_linked,
+                     item_color_tag,
                      item_lock_content,
                      item_lock_position,
                      private->user_data);
diff --git a/app/dialogs/channel-options-dialog.h b/app/dialogs/channel-options-dialog.h
index b02a95d..4bbc26b 100644
--- a/app/dialogs/channel-options-dialog.h
+++ b/app/dialogs/channel-options-dialog.h
@@ -28,6 +28,7 @@ typedef void (* GimpChannelOptionsCallback) (GtkWidget     *dialog,
                                              gboolean       save_selection,
                                              gboolean       channel_visible,
                                              gboolean       channel_linked,
+                                             GimpColorTag   channel_color_tag,
                                              gboolean       channel_lock_content,
                                              gboolean       channel_lock_position,
                                              gpointer       user_data);
@@ -49,6 +50,7 @@ GtkWidget * channel_options_dialog_new (GimpImage                  *image,
                                         const GimpRGB              *channel_color,
                                         gboolean                    channel_visible,
                                         gboolean                    channel_linked,
+                                        GimpColorTag                channel_color_tag,
                                         gboolean                    channel_lock_content,
                                         gboolean                    channel_lock_position,
                                         GimpChannelOptionsCallback  callback,
diff --git a/app/dialogs/item-options-dialog.c b/app/dialogs/item-options-dialog.c
index 1e1d0c8..b47d1ef 100644
--- a/app/dialogs/item-options-dialog.c
+++ b/app/dialogs/item-options-dialog.c
@@ -30,6 +30,7 @@
 #include "core/gimpitem.h"
 
 #include "widgets/gimpviewabledialog.h"
+#include "widgets/gimpwidgets-utils.h"
 
 #include "item-options-dialog.h"
 
@@ -45,6 +46,7 @@ struct _ItemOptionsDialog
   GimpContext             *context;
   gboolean                 visible;
   gboolean                 linked;
+  GimpColorTag             color_tag;
   gboolean                 lock_content;
   gboolean                 lock_position;
   GimpItemOptionsCallback  callback;
@@ -90,6 +92,7 @@ item_options_dialog_new (GimpImage               *image,
                          const gchar             *item_name,
                          gboolean                 item_visible,
                          gboolean                 item_linked,
+                         GimpColorTag             item_color_tag,
                          gboolean                 item_lock_content,
                          gboolean                 item_lock_position,
                          GimpItemOptionsCallback  callback,
@@ -120,6 +123,7 @@ item_options_dialog_new (GimpImage               *image,
   private->context       = context;
   private->visible       = item_visible;
   private->linked        = item_linked;
+  private->color_tag     = item_color_tag;
   private->lock_content  = item_lock_content;
   private->lock_position = item_lock_position;
   private->callback      = callback;
@@ -173,12 +177,76 @@ item_options_dialog_new (GimpImage               *image,
   /*  The name label and entry  */
   if (name_label)
     {
+      GtkWidget *hbox;
+      GtkWidget *radio;
+      GtkWidget *radio_box;
+      GList     *children;
+      GList     *list;
+
       private->name_entry = gtk_entry_new ();
       gtk_entry_set_activates_default (GTK_ENTRY (private->name_entry), TRUE);
       gtk_entry_set_text (GTK_ENTRY (private->name_entry), item_name);
       gimp_table_attach_aligned (GTK_TABLE (table), 0, private->table_row++,
                                  name_label, 0.0, 0.5,
                                  private->name_entry, 1, FALSE);
+
+      hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+      gimp_table_attach_aligned (GTK_TABLE (table), 0, private->table_row++,
+                                 _("Color tag:"), 0.0, 0.5,
+                                 hbox, 1, TRUE);
+
+      radio_box = gimp_enum_radio_box_new (GIMP_TYPE_COLOR_TAG,
+                                           G_CALLBACK (gimp_radio_button_update),
+                                           &private->color_tag,
+                                           &radio);
+      gimp_int_radio_group_set_active (GTK_RADIO_BUTTON (radio),
+                                       private->color_tag);
+
+      children = gtk_container_get_children (GTK_CONTAINER (radio_box));
+
+      for (list = children;
+           list;
+           list = g_list_next (list))
+        {
+          GimpColorTag  color_tag;
+          GimpRGB       color;
+          GtkWidget    *image;
+
+          radio = list->data;
+
+          g_object_ref (radio);
+          gtk_container_remove (GTK_CONTAINER (radio_box), radio);
+          g_object_set (radio, "draw-indicator", FALSE, NULL);
+          gtk_box_pack_start (GTK_BOX (hbox), radio, FALSE, FALSE, 0);
+          g_object_unref (radio);
+
+          gtk_widget_destroy (gtk_bin_get_child (GTK_BIN (radio)));
+
+          color_tag = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (radio),
+                                                          "gimp-item-data"));
+
+          if (gimp_get_color_tag_color (color_tag, &color))
+            {
+              GtkSettings *settings = gtk_widget_get_settings (dialog);
+              gint         w, h;
+
+              image = gimp_color_area_new (&color, GIMP_COLOR_AREA_FLAT, 0);
+              gtk_icon_size_lookup_for_settings (settings,
+                                                 GTK_ICON_SIZE_MENU, &w, &h);
+              gtk_widget_set_size_request (image, w, h);
+            }
+          else
+            {
+              image = gtk_image_new_from_icon_name (GIMP_STOCK_CLOSE,
+                                                    GTK_ICON_SIZE_MENU);
+            }
+
+          gtk_container_add (GTK_CONTAINER (radio), image);
+          gtk_widget_show (image);
+        }
+
+      g_list_free (children);
+      gtk_widget_destroy (radio_box);
     }
 
   /*  The switches frame & vbox  */
@@ -382,6 +450,7 @@ item_options_dialog_response (GtkWidget         *dialog,
                          name,
                          private->visible,
                          private->linked,
+                         private->color_tag,
                          private->lock_content,
                          private->lock_position,
                          private->user_data);
diff --git a/app/dialogs/item-options-dialog.h b/app/dialogs/item-options-dialog.h
index b09fc4b..6177fdb 100644
--- a/app/dialogs/item-options-dialog.h
+++ b/app/dialogs/item-options-dialog.h
@@ -19,16 +19,17 @@
 #define __ITEM_OPTIONS_DIALOG_H__
 
 
-typedef void (* GimpItemOptionsCallback) (GtkWidget   *dialog,
-                                          GimpImage   *image,
-                                          GimpItem    *item,
-                                          GimpContext *context,
-                                          const gchar *item_name,
-                                          gboolean     item_visible,
-                                          gboolean     item_linked,
-                                          gboolean     item_lock_content,
-                                          gboolean     item_lock_position,
-                                          gpointer     user_data);
+typedef void (* GimpItemOptionsCallback) (GtkWidget    *dialog,
+                                          GimpImage    *image,
+                                          GimpItem     *item,
+                                          GimpContext  *context,
+                                          const gchar  *item_name,
+                                          gboolean      item_visible,
+                                          gboolean      item_linked,
+                                          GimpColorTag  item_color_tag,
+                                          gboolean      item_lock_content,
+                                          gboolean      item_lock_position,
+                                          gpointer      user_data);
 
 
 GtkWidget * item_options_dialog_new (GimpImage               *image,
@@ -47,6 +48,7 @@ GtkWidget * item_options_dialog_new (GimpImage               *image,
                                      const gchar             *item_name,
                                      gboolean                 item_visible,
                                      gboolean                 item_linked,
+                                     GimpColorTag             item_color_tag,
                                      gboolean                 item_lock_content,
                                      gboolean                 item_lock_position,
                                      GimpItemOptionsCallback  callback,
diff --git a/app/dialogs/layer-options-dialog.c b/app/dialogs/layer-options-dialog.c
index 730a08f..b8fd7fd 100644
--- a/app/dialogs/layer-options-dialog.c
+++ b/app/dialogs/layer-options-dialog.c
@@ -73,6 +73,7 @@ static void   layer_options_dialog_callback      (GtkWidget          *dialog,
                                                   const gchar        *item_name,
                                                   gboolean            item_visible,
                                                   gboolean            item_linked,
+                                                  GimpColorTag        item_color_tag,
                                                   gboolean            item_lock_content,
                                                   gboolean            item_lock_position,
                                                   gpointer            user_data);
@@ -98,6 +99,7 @@ layer_options_dialog_new (GimpImage                *image,
                           GimpFillType              layer_fill_type,
                           gboolean                  layer_visible,
                           gboolean                  layer_linked,
+                          GimpColorTag              layer_color_tag,
                           gboolean                  layer_lock_content,
                           gboolean                  layer_lock_position,
                           gboolean                  layer_lock_alpha,
@@ -146,6 +148,7 @@ layer_options_dialog_new (GimpImage                *image,
                                     layer_name,
                                     layer_visible,
                                     layer_linked,
+                                    layer_color_tag,
                                     layer_lock_content,
                                     layer_lock_position,
                                     layer_options_dialog_callback,
@@ -400,16 +403,17 @@ layer_options_dialog_free (LayerOptionsDialog *private)
 }
 
 static void
-layer_options_dialog_callback (GtkWidget   *dialog,
-                               GimpImage   *image,
-                               GimpItem    *item,
-                               GimpContext *context,
-                               const gchar *item_name,
-                               gboolean     item_visible,
-                               gboolean     item_linked,
-                               gboolean     item_lock_content,
-                               gboolean     item_lock_position,
-                               gpointer     user_data)
+layer_options_dialog_callback (GtkWidget    *dialog,
+                               GimpImage    *image,
+                               GimpItem     *item,
+                               GimpContext  *context,
+                               const gchar  *item_name,
+                               gboolean      item_visible,
+                               gboolean      item_linked,
+                               GimpColorTag  item_color_tag,
+                               gboolean      item_lock_content,
+                               gboolean      item_lock_position,
+                               gpointer      user_data)
 {
   LayerOptionsDialog *private = user_data;
   gint                width   = 0;
@@ -448,6 +452,7 @@ layer_options_dialog_callback (GtkWidget   *dialog,
                      offset_y,
                      item_visible,
                      item_linked,
+                     item_color_tag,
                      item_lock_content,
                      item_lock_position,
                      private->lock_alpha,
diff --git a/app/dialogs/layer-options-dialog.h b/app/dialogs/layer-options-dialog.h
index 3416019..f5a9e20 100644
--- a/app/dialogs/layer-options-dialog.h
+++ b/app/dialogs/layer-options-dialog.h
@@ -33,6 +33,7 @@ typedef void (* GimpLayerOptionsCallback) (GtkWidget            *dialog,
                                            gint                  layer_offset_y,
                                            gboolean              layer_visible,
                                            gboolean              layer_linked,
+                                           GimpColorTag          layer_color_tag,
                                            gboolean              layer_lock_content,
                                            gboolean              layer_lock_position,
                                            gboolean              layer_lock_alpha,
@@ -55,6 +56,7 @@ GtkWidget * layer_options_dialog_new (GimpImage                *image,
                                       GimpFillType              layer_fill_type,
                                       gboolean                  layer_visible,
                                       gboolean                  layer_linked,
+                                      GimpColorTag              layer_color_tag,
                                       gboolean                  layer_lock_content,
                                       gboolean                  layer_lock_position,
                                       gboolean                  layer_lock_alpha,
diff --git a/app/dialogs/vectors-options-dialog.c b/app/dialogs/vectors-options-dialog.c
index 8021c79..9e5834d 100644
--- a/app/dialogs/vectors-options-dialog.c
+++ b/app/dialogs/vectors-options-dialog.c
@@ -54,6 +54,7 @@ static void  vectors_options_dialog_callback (GtkWidget            *dialog,
                                               const gchar          *item_name,
                                               gboolean              item_visible,
                                               gboolean              item_linked,
+                                              GimpColorTag          item_color_tag,
                                               gboolean              item_lock_content,
                                               gboolean              item_lock_position,
                                               gpointer              user_data);
@@ -74,6 +75,7 @@ vectors_options_dialog_new (GimpImage                  *image,
                             const gchar                *vectors_name,
                             gboolean                    vectors_visible,
                             gboolean                    vectors_linked,
+                            GimpColorTag                vectors_color_tag,
                             gboolean                    vectors_lock_content,
                             gboolean                    vectors_lock_position,
                             GimpVectorsOptionsCallback  callback,
@@ -108,6 +110,7 @@ vectors_options_dialog_new (GimpImage                  *image,
                                     vectors_name,
                                     vectors_visible,
                                     vectors_linked,
+                                    vectors_color_tag,
                                     vectors_lock_content,
                                     vectors_lock_position,
                                     vectors_options_dialog_callback,
@@ -129,16 +132,17 @@ vectors_options_dialog_free (VectorsOptionsDialog *private)
 }
 
 static void
-vectors_options_dialog_callback (GtkWidget   *dialog,
-                                 GimpImage   *image,
-                                 GimpItem    *item,
-                                 GimpContext *context,
-                                 const gchar *item_name,
-                                 gboolean     item_visible,
-                                 gboolean     item_linked,
-                                 gboolean     item_lock_content,
-                                 gboolean     item_lock_position,
-                                 gpointer     user_data)
+vectors_options_dialog_callback (GtkWidget    *dialog,
+                                 GimpImage    *image,
+                                 GimpItem     *item,
+                                 GimpContext  *context,
+                                 const gchar  *item_name,
+                                 gboolean      item_visible,
+                                 gboolean      item_linked,
+                                 GimpColorTag  item_color_tag,
+                                 gboolean      item_lock_content,
+                                 gboolean      item_lock_position,
+                                 gpointer      user_data)
 {
   VectorsOptionsDialog *private = user_data;
 
@@ -149,6 +153,7 @@ vectors_options_dialog_callback (GtkWidget   *dialog,
                      item_name,
                      item_visible,
                      item_linked,
+                     item_color_tag,
                      item_lock_content,
                      item_lock_position,
                      private->user_data);
diff --git a/app/dialogs/vectors-options-dialog.h b/app/dialogs/vectors-options-dialog.h
index 1c6a213..a446ef1 100644
--- a/app/dialogs/vectors-options-dialog.h
+++ b/app/dialogs/vectors-options-dialog.h
@@ -19,16 +19,17 @@
 #define __VECTORS_OPTIONS_DIALOG_H__
 
 
-typedef void (* GimpVectorsOptionsCallback) (GtkWidget   *dialog,
-                                             GimpImage   *image,
-                                             GimpVectors *vectors,
-                                             GimpContext *context,
-                                             const gchar *vectors_name,
-                                             gboolean     vectors_visible,
-                                             gboolean     vectors_linked,
-                                             gboolean     vectors_lock_content,
-                                             gboolean     vectors_lock_position,
-                                             gpointer     user_data);
+typedef void (* GimpVectorsOptionsCallback) (GtkWidget    *dialog,
+                                             GimpImage    *image,
+                                             GimpVectors  *vectors,
+                                             GimpContext  *context,
+                                             const gchar  *vectors_name,
+                                             gboolean      vectors_visible,
+                                             gboolean      vectors_linked,
+                                             GimpColorTag  vectors_color_tag,
+                                             gboolean      vectors_lock_content,
+                                             gboolean      vectors_lock_position,
+                                             gpointer      user_data);
 
 
 GtkWidget * vectors_options_dialog_new (GimpImage                  *image,
@@ -43,6 +44,7 @@ GtkWidget * vectors_options_dialog_new (GimpImage                  *image,
                                         const gchar                *vectors_name,
                                         gboolean                    vectors_visible,
                                         gboolean                    vectors_linked,
+                                        GimpColorTag                vectors_color_tag,
                                         gboolean                    vectors_lock_content,
                                         gboolean                    vectors_lock_position,
                                         GimpVectorsOptionsCallback  callback,
diff --git a/app/pdb/internal-procs.c b/app/pdb/internal-procs.c
index b71520a..5379699 100644
--- a/app/pdb/internal-procs.c
+++ b/app/pdb/internal-procs.c
@@ -28,7 +28,7 @@
 #include "internal-procs.h"
 
 
-/* 800 procedures registered total */
+/* 802 procedures registered total */
 
 void
 internal_procs_init (GimpPDB *pdb)
diff --git a/app/pdb/item-cmds.c b/app/pdb/item-cmds.c
index 652320f..2a19e25 100644
--- a/app/pdb/item-cmds.c
+++ b/app/pdb/item-cmds.c
@@ -716,6 +716,59 @@ item_set_lock_position_invoker (GimpProcedure         *procedure,
 }
 
 static GimpValueArray *
+item_get_color_tag_invoker (GimpProcedure         *procedure,
+                            Gimp                  *gimp,
+                            GimpContext           *context,
+                            GimpProgress          *progress,
+                            const GimpValueArray  *args,
+                            GError               **error)
+{
+  gboolean success = TRUE;
+  GimpValueArray *return_vals;
+  GimpItem *item;
+  gint32 color_tag = 0;
+
+  item = gimp_value_get_item (gimp_value_array_index (args, 0), gimp);
+
+  if (success)
+    {
+      color_tag = gimp_item_get_color_tag (GIMP_ITEM (item));
+    }
+
+  return_vals = gimp_procedure_get_return_values (procedure, success,
+                                                  error ? *error : NULL);
+
+  if (success)
+    g_value_set_enum (gimp_value_array_index (return_vals, 1), color_tag);
+
+  return return_vals;
+}
+
+static GimpValueArray *
+item_set_color_tag_invoker (GimpProcedure         *procedure,
+                            Gimp                  *gimp,
+                            GimpContext           *context,
+                            GimpProgress          *progress,
+                            const GimpValueArray  *args,
+                            GError               **error)
+{
+  gboolean success = TRUE;
+  GimpItem *item;
+  gint32 color_tag;
+
+  item = gimp_value_get_item (gimp_value_array_index (args, 0), gimp);
+  color_tag = g_value_get_enum (gimp_value_array_index (args, 1));
+
+  if (success)
+    {
+      gimp_item_set_color_tag (GIMP_ITEM (item), color_tag, TRUE);
+    }
+
+  return gimp_procedure_get_return_values (procedure, success,
+                                           error ? *error : NULL);
+}
+
+static GimpValueArray *
 item_get_tattoo_invoker (GimpProcedure         *procedure,
                          Gimp                  *gimp,
                          GimpContext           *context,
@@ -1560,6 +1613,66 @@ register_item_procs (GimpPDB *pdb)
   g_object_unref (procedure);
 
   /*
+   * gimp-item-get-color-tag
+   */
+  procedure = gimp_procedure_new (item_get_color_tag_invoker);
+  gimp_object_set_static_name (GIMP_OBJECT (procedure),
+                               "gimp-item-get-color-tag");
+  gimp_procedure_set_static_strings (procedure,
+                                     "gimp-item-get-color-tag",
+                                     "Get the color tag of the specified item.",
+                                     "This procedure returns the specified item's color tag.",
+                                     "Michael Natterer <mitch gimp org>",
+                                     "Michael Natterer",
+                                     "2016",
+                                     NULL);
+  gimp_procedure_add_argument (procedure,
+                               gimp_param_spec_item_id ("item",
+                                                        "item",
+                                                        "The item",
+                                                        pdb->gimp, FALSE,
+                                                        GIMP_PARAM_READWRITE));
+  gimp_procedure_add_return_value (procedure,
+                                   g_param_spec_enum ("color-tag",
+                                                      "color tag",
+                                                      "The item's color tag",
+                                                      GIMP_TYPE_COLOR_TAG,
+                                                      GIMP_COLOR_TAG_NONE,
+                                                      GIMP_PARAM_READWRITE));
+  gimp_pdb_register_procedure (pdb, procedure);
+  g_object_unref (procedure);
+
+  /*
+   * gimp-item-set-color-tag
+   */
+  procedure = gimp_procedure_new (item_set_color_tag_invoker);
+  gimp_object_set_static_name (GIMP_OBJECT (procedure),
+                               "gimp-item-set-color-tag");
+  gimp_procedure_set_static_strings (procedure,
+                                     "gimp-item-set-color-tag",
+                                     "Set the color tag of the specified item.",
+                                     "This procedure sets the specified item's color tag.",
+                                     "Michael Natterer <mitch gimp org>",
+                                     "Michael Natterer",
+                                     "2016",
+                                     NULL);
+  gimp_procedure_add_argument (procedure,
+                               gimp_param_spec_item_id ("item",
+                                                        "item",
+                                                        "The item",
+                                                        pdb->gimp, FALSE,
+                                                        GIMP_PARAM_READWRITE));
+  gimp_procedure_add_argument (procedure,
+                               g_param_spec_enum ("color-tag",
+                                                  "color tag",
+                                                  "The new item color tag",
+                                                  GIMP_TYPE_COLOR_TAG,
+                                                  GIMP_COLOR_TAG_NONE,
+                                                  GIMP_PARAM_READWRITE));
+  gimp_pdb_register_procedure (pdb, procedure);
+  g_object_unref (procedure);
+
+  /*
    * gimp-item-get-tattoo
    */
   procedure = gimp_procedure_new (item_get_tattoo_invoker);
diff --git a/app/widgets/gimphelp-ids.h b/app/widgets/gimphelp-ids.h
index 8bfa8c0..e184190 100644
--- a/app/widgets/gimphelp-ids.h
+++ b/app/widgets/gimphelp-ids.h
@@ -191,6 +191,7 @@
 #define GIMP_HELP_LAYER_ERODE                     "gimp-layer-erode"
 #define GIMP_HELP_LAYER_VISIBLE                   "gimp-layer-visible"
 #define GIMP_HELP_LAYER_LINKED                    "gimp-layer-linked"
+#define GIMP_HELP_LAYER_COLOR_TAG                 "gimp-layer-color-tag"
 #define GIMP_HELP_LAYER_OPACITY                   "gimp-layer-opacity"
 #define GIMP_HELP_LAYER_MODE                      "gimp-layer-mode"
 #define GIMP_HELP_LAYER_LOCK_ALPHA                "gimp-layer-lock-alpha"
@@ -232,6 +233,9 @@
 #define GIMP_HELP_CHANNEL_LOWER_TO_BOTTOM         "gimp-channel-lower-to-bottom"
 #define GIMP_HELP_CHANNEL_DUPLICATE               "gimp-channel-duplicate"
 #define GIMP_HELP_CHANNEL_DELETE                  "gimp-channel-delete"
+#define GIMP_HELP_CHANNEL_VISIBLE                 "gimp-channel-visible"
+#define GIMP_HELP_CHANNEL_LINKED                  "gimp-channel-linked"
+#define GIMP_HELP_CHANNEL_COLOR_TAG               "gimp-channel-color-tag"
 #define GIMP_HELP_CHANNEL_LOCK_PIXELS             "gimp-channel-lock-pixels"
 #define GIMP_HELP_CHANNEL_LOCK_POSITION           "gimp-channel-lock-position"
 #define GIMP_HELP_CHANNEL_SELECTION_REPLACE       "gimp-channel-selection-replace"
@@ -256,6 +260,7 @@
 #define GIMP_HELP_PATH_MERGE_VISIBLE              "gimp-path-merge-visible"
 #define GIMP_HELP_PATH_VISIBLE                    "gimp-path-visible"
 #define GIMP_HELP_PATH_LINKED                     "gimp-path-linked"
+#define GIMP_HELP_PATH_COLOR_TAG                  "gimp-path-color-tag"
 #define GIMP_HELP_PATH_LOCK_STROKES               "gimp-path-lock-strokes"
 #define GIMP_HELP_PATH_LOCK_POSITION              "gimp-path-lock-position"
 #define GIMP_HELP_PATH_SELECTION_REPLACE          "gimp-path-selection-replace"
diff --git a/app/widgets/gimpitemtreeview.c b/app/widgets/gimpitemtreeview.c
index cc93a3d..8ec7a97 100644
--- a/app/widgets/gimpitemtreeview.c
+++ b/app/widgets/gimpitemtreeview.c
@@ -86,11 +86,13 @@ struct _GimpItemTreeViewPriv
   gint             model_column_visible;
   gint             model_column_viewable;
   gint             model_column_linked;
+  gint             model_column_color_tag;
   GtkCellRenderer *eye_cell;
   GtkCellRenderer *chain_cell;
 
   GimpTreeHandler *visible_changed_handler;
   GimpTreeHandler *linked_changed_handler;
+  GimpTreeHandler *color_tag_changed_handler;
   GimpTreeHandler *lock_content_changed_handler;
   GimpTreeHandler *lock_position_changed_handler;
 
@@ -169,6 +171,8 @@ static void   gimp_item_tree_view_visible_changed      (GimpItem          *item,
                                                         GimpItemTreeView  *view);
 static void   gimp_item_tree_view_linked_changed       (GimpItem          *item,
                                                         GimpItemTreeView  *view);
+static void   gimp_item_tree_view_color_tag_changed    (GimpItem          *item,
+                                                        GimpItemTreeView  *view);
 static void   gimp_item_tree_view_lock_content_changed (GimpItem          *item,
                                                         GimpItemTreeView  *view);
 static void   gimp_item_tree_view_lock_position_changed(GimpItem          *item,
@@ -328,6 +332,11 @@ gimp_item_tree_view_init (GimpItemTreeView *view)
                                            &tree_view->n_model_columns,
                                            G_TYPE_BOOLEAN);
 
+  view->priv->model_column_color_tag =
+    gimp_container_tree_store_columns_add (tree_view->model_columns,
+                                           &tree_view->n_model_columns,
+                                           GDK_TYPE_COLOR);
+
   gimp_container_tree_view_set_dnd_drop_to_empty (tree_view, TRUE);
 
   view->priv->image  = NULL;
@@ -364,8 +373,9 @@ gimp_item_tree_view_constructed (GObject *object)
 
   item_view->priv->eye_cell = gimp_cell_renderer_toggle_new (GIMP_STOCK_VISIBLE);
   g_object_set (item_view->priv->eye_cell,
-                "xpad", 0,
-                "ypad", 0,
+                "xpad",                0,
+                "ypad",                0,
+                "override-background", TRUE,
                 NULL);
   gtk_tree_view_column_pack_start (column, item_view->priv->eye_cell, FALSE);
   gtk_tree_view_column_set_attributes (column, item_view->priv->eye_cell,
@@ -373,6 +383,8 @@ gimp_item_tree_view_constructed (GObject *object)
                                        item_view->priv->model_column_visible,
                                        "inconsistent",
                                        item_view->priv->model_column_viewable,
+                                       "cell-background-gdk",
+                                       item_view->priv->model_column_color_tag,
                                        NULL);
 
   gimp_container_tree_view_add_toggle_cell (tree_view,
@@ -898,6 +910,9 @@ gimp_item_tree_view_set_container (GimpContainerView *view,
       gimp_tree_handler_disconnect (item_view->priv->linked_changed_handler);
       item_view->priv->linked_changed_handler = NULL;
 
+      gimp_tree_handler_disconnect (item_view->priv->color_tag_changed_handler);
+      item_view->priv->color_tag_changed_handler = NULL;
+
       gimp_tree_handler_disconnect (item_view->priv->lock_content_changed_handler);
       item_view->priv->lock_content_changed_handler = NULL;
 
@@ -919,6 +934,11 @@ gimp_item_tree_view_set_container (GimpContainerView *view,
                                    G_CALLBACK (gimp_item_tree_view_linked_changed),
                                    view);
 
+      item_view->priv->color_tag_changed_handler =
+        gimp_tree_handler_connect (container, "color-tag-changed",
+                                   G_CALLBACK (gimp_item_tree_view_color_tag_changed),
+                                   view);
+
       item_view->priv->lock_content_changed_handler =
         gimp_tree_handler_connect (container, "lock-content-changed",
                                    G_CALLBACK (gimp_item_tree_view_lock_content_changed),
@@ -976,6 +996,9 @@ gimp_item_tree_view_insert_item (GimpContainerView *view,
   GimpItemTreeView      *item_view = GIMP_ITEM_TREE_VIEW (view);
   GimpItem              *item      = GIMP_ITEM (viewable);
   GtkTreeIter           *iter;
+  GimpRGB                color;
+  GdkColor               gdk_color;
+  gboolean               has_color;
 
   item_view->priv->inserting_item = TRUE;
 
@@ -984,6 +1007,11 @@ 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);
+  if (has_color)
+    gimp_rgb_get_gdk_color (&color, &gdk_color);
+
   gtk_tree_store_set (GTK_TREE_STORE (tree_view->model), iter,
                       item_view->priv->model_column_visible,
                       gimp_item_get_visible (item),
@@ -992,6 +1020,8 @@ gimp_item_tree_view_insert_item (GimpContainerView *view,
                       ! gimp_item_is_visible (item),
                       item_view->priv->model_column_linked,
                       gimp_item_get_linked (item),
+                      item_view->priv->model_column_color_tag,
+                      has_color ? &gdk_color : NULL,
                       -1);
 
   return iter;
@@ -1378,6 +1408,38 @@ gimp_item_tree_view_chain_clicked (GtkCellRendererToggle *toggle,
 }
 
 
+/*  "Color Tag" callbacks  */
+
+static void
+gimp_item_tree_view_color_tag_changed (GimpItem         *item,
+                                       GimpItemTreeView *view)
+{
+  GimpContainerView     *container_view = GIMP_CONTAINER_VIEW (view);
+  GimpContainerTreeView *tree_view      = GIMP_CONTAINER_TREE_VIEW (view);
+  GtkTreeIter           *iter;
+
+  iter = gimp_container_view_lookup (container_view,
+                                     (GimpViewable *) item);
+
+  if (iter)
+    {
+      GimpRGB  color;
+      GdkColor gdk_color;
+      gboolean has_color;
+
+      has_color = gimp_get_color_tag_color (gimp_item_get_color_tag (item),
+                                            &color);
+      if (has_color)
+        gimp_rgb_get_gdk_color (&color, &gdk_color);
+
+      gtk_tree_store_set (GTK_TREE_STORE (tree_view->model), iter,
+                          view->priv->model_column_color_tag,
+                          has_color ? &gdk_color : NULL,
+                          -1);
+    }
+}
+
+
 /*  "Lock Content" callbacks  */
 
 static void
diff --git a/app/widgets/gimpwidgets-utils.c b/app/widgets/gimpwidgets-utils.c
index 3b9472e..6ea77f6 100644
--- a/app/widgets/gimpwidgets-utils.c
+++ b/app/widgets/gimpwidgets-utils.c
@@ -1159,6 +1159,45 @@ gimp_get_message_icon_name (GimpMessageSeverity severity)
   g_return_val_if_reached (GIMP_STOCK_WARNING);
 }
 
+gboolean
+gimp_get_color_tag_color (GimpColorTag  color_tag,
+                          GimpRGB      *color)
+{
+  static const struct
+  {
+    guchar r;
+    guchar g;
+    guchar b;
+  }
+  colors[] =
+  {
+    {   0,   0,   0  }, /* none   */
+    {  84, 182, 231  }, /* blue   */
+    { 154, 202,  66  }, /* green  */
+    { 250, 228,  57  }, /* yellow */
+    { 255, 168,  63  }, /* orange */
+    { 179, 101,  65  }, /* brown  */
+    { 245,  44,  52  }, /* red    */
+    { 196, 107, 217  }, /* violet */
+    { 121, 122, 116  }  /* gray   */
+  };
+
+  g_return_val_if_fail (color != NULL, FALSE);
+
+  if (color_tag > GIMP_COLOR_TAG_NONE)
+    {
+      gimp_rgba_set_uchar (color,
+                           colors[color_tag].r,
+                           colors[color_tag].g,
+                           colors[color_tag].b,
+                           255);
+
+      return TRUE;
+    }
+
+  return FALSE;
+}
+
 void
 gimp_pango_layout_set_scale (PangoLayout *layout,
                              gdouble      scale)
diff --git a/app/widgets/gimpwidgets-utils.h b/app/widgets/gimpwidgets-utils.h
index b41de73..67cefc0 100644
--- a/app/widgets/gimpwidgets-utils.h
+++ b/app/widgets/gimpwidgets-utils.h
@@ -84,7 +84,11 @@ void              gimp_window_set_transient_for    (GtkWindow            *window
                                                     guint32               parent_ID);
 void              gimp_widget_set_accel_help       (GtkWidget            *widget,
                                                     GtkAction            *action);
+
 const gchar     * gimp_get_message_icon_name       (GimpMessageSeverity   severity);
+gboolean          gimp_get_color_tag_color         (GimpColorTag          color_tag,
+                                                    GimpRGB              *color);
+
 void              gimp_pango_layout_set_scale      (PangoLayout          *layout,
                                                     double                scale);
 void              gimp_pango_layout_set_weight     (PangoLayout          *layout,
diff --git a/libgimp/gimp.def b/libgimp/gimp.def
index 19e4494..ac54622 100644
--- a/libgimp/gimp.def
+++ b/libgimp/gimp.def
@@ -552,6 +552,7 @@ EXPORTS
        gimp_item_delete
        gimp_item_detach_parasite
        gimp_item_get_children
+       gimp_item_get_color_tag
        gimp_item_get_image
        gimp_item_get_linked
        gimp_item_get_lock_content
@@ -571,6 +572,7 @@ EXPORTS
        gimp_item_is_text_layer
        gimp_item_is_valid
        gimp_item_is_vectors
+       gimp_item_set_color_tag
        gimp_item_set_linked
        gimp_item_set_lock_content
        gimp_item_set_lock_position
diff --git a/libgimp/gimpenums.c.tail b/libgimp/gimpenums.c.tail
index 3e1f465..2d616e9 100644
--- a/libgimp/gimpenums.c.tail
+++ b/libgimp/gimpenums.c.tail
@@ -14,6 +14,7 @@ static const GimpGetTypeFunc get_type_funcs[] =
   gimp_clone_type_get_type,
   gimp_color_management_mode_get_type,
   gimp_color_rendering_intent_get_type,
+  gimp_color_tag_get_type,
   gimp_component_type_get_type,
   gimp_convert_dither_type_get_type,
   gimp_convert_palette_type_get_type,
@@ -77,6 +78,7 @@ static const gchar * const type_names[] =
   "GimpCloneType",
   "GimpColorManagementMode",
   "GimpColorRenderingIntent",
+  "GimpColorTag",
   "GimpComponentType",
   "GimpConvertDitherType",
   "GimpConvertPaletteType",
diff --git a/libgimp/gimpitem_pdb.c b/libgimp/gimpitem_pdb.c
index 1e4adf9..c1a004f 100644
--- a/libgimp/gimpitem_pdb.c
+++ b/libgimp/gimpitem_pdb.c
@@ -799,6 +799,72 @@ gimp_item_set_lock_position (gint32   item_ID,
 }
 
 /**
+ * gimp_item_get_color_tag:
+ * @item_ID: The item.
+ *
+ * Get the color tag of the specified item.
+ *
+ * This procedure returns the specified item's color tag.
+ *
+ * Returns: The item's color tag.
+ *
+ * Since: 2.10
+ **/
+GimpColorTag
+gimp_item_get_color_tag (gint32 item_ID)
+{
+  GimpParam *return_vals;
+  gint nreturn_vals;
+  GimpColorTag color_tag = 0;
+
+  return_vals = gimp_run_procedure ("gimp-item-get-color-tag",
+                                    &nreturn_vals,
+                                    GIMP_PDB_ITEM, item_ID,
+                                    GIMP_PDB_END);
+
+  if (return_vals[0].data.d_status == GIMP_PDB_SUCCESS)
+    color_tag = return_vals[1].data.d_int32;
+
+  gimp_destroy_params (return_vals, nreturn_vals);
+
+  return color_tag;
+}
+
+/**
+ * gimp_item_set_color_tag:
+ * @item_ID: The item.
+ * @color_tag: The new item color tag.
+ *
+ * Set the color tag of the specified item.
+ *
+ * This procedure sets the specified item's color tag.
+ *
+ * Returns: TRUE on success.
+ *
+ * Since: 2.10
+ **/
+gboolean
+gimp_item_set_color_tag (gint32       item_ID,
+                         GimpColorTag color_tag)
+{
+  GimpParam *return_vals;
+  gint nreturn_vals;
+  gboolean success = TRUE;
+
+  return_vals = gimp_run_procedure ("gimp-item-set-color-tag",
+                                    &nreturn_vals,
+                                    GIMP_PDB_ITEM, item_ID,
+                                    GIMP_PDB_INT32, color_tag,
+                                    GIMP_PDB_END);
+
+  success = return_vals[0].data.d_status == GIMP_PDB_SUCCESS;
+
+  gimp_destroy_params (return_vals, nreturn_vals);
+
+  return success;
+}
+
+/**
  * gimp_item_get_tattoo:
  * @item_ID: The item.
  *
diff --git a/libgimp/gimpitem_pdb.h b/libgimp/gimpitem_pdb.h
index c564f0f..6b81f04 100644
--- a/libgimp/gimpitem_pdb.h
+++ b/libgimp/gimpitem_pdb.h
@@ -61,6 +61,9 @@ gboolean      gimp_item_set_lock_content  (gint32              item_ID,
 gboolean      gimp_item_get_lock_position (gint32              item_ID);
 gboolean      gimp_item_set_lock_position (gint32              item_ID,
                                            gboolean            lock_position);
+GimpColorTag  gimp_item_get_color_tag     (gint32              item_ID);
+gboolean      gimp_item_set_color_tag     (gint32              item_ID,
+                                           GimpColorTag        color_tag);
 gint          gimp_item_get_tattoo        (gint32              item_ID);
 gboolean      gimp_item_set_tattoo        (gint32              item_ID,
                                            gint                tattoo);
diff --git a/libgimpbase/gimpbase.def b/libgimpbase/gimpbase.def
index 033dda4..5897ed8 100644
--- a/libgimpbase/gimpbase.def
+++ b/libgimpbase/gimpbase.def
@@ -13,6 +13,7 @@ EXPORTS
        gimp_check_type_get_type
        gimp_checks_get_shades
        gimp_clone_type_get_type
+       gimp_color_tag_get_type
        gimp_component_type_get_type
        gimp_convert_palette_type_get_type
        gimp_convolve_type_get_type
diff --git a/libgimpbase/gimpbaseenums.c b/libgimpbase/gimpbaseenums.c
index f78e895..093b137 100644
--- a/libgimpbase/gimpbaseenums.c
+++ b/libgimpbase/gimpbaseenums.c
@@ -351,6 +351,50 @@ gimp_clone_type_get_type (void)
 }
 
 GType
+gimp_color_tag_get_type (void)
+{
+  static const GEnumValue values[] =
+  {
+    { GIMP_COLOR_TAG_NONE, "GIMP_COLOR_TAG_NONE", "none" },
+    { GIMP_COLOR_TAG_BLUE, "GIMP_COLOR_TAG_BLUE", "blue" },
+    { GIMP_COLOR_TAG_GREEN, "GIMP_COLOR_TAG_GREEN", "green" },
+    { GIMP_COLOR_TAG_YELLOW, "GIMP_COLOR_TAG_YELLOW", "yellow" },
+    { GIMP_COLOR_TAG_ORANGE, "GIMP_COLOR_TAG_ORANGE", "orange" },
+    { GIMP_COLOR_TAG_BROWN, "GIMP_COLOR_TAG_BROWN", "brown" },
+    { GIMP_COLOR_TAG_RED, "GIMP_COLOR_TAG_RED", "red" },
+    { GIMP_COLOR_TAG_VIOLET, "GIMP_COLOR_TAG_VIOLET", "violet" },
+    { GIMP_COLOR_TAG_GRAY, "GIMP_COLOR_TAG_GRAY", "gray" },
+    { 0, NULL, NULL }
+  };
+
+  static const GimpEnumDesc descs[] =
+  {
+    { GIMP_COLOR_TAG_NONE, NC_("color-tag", "None"), NULL },
+    { GIMP_COLOR_TAG_BLUE, NC_("color-tag", "Blue"), NULL },
+    { GIMP_COLOR_TAG_GREEN, NC_("color-tag", "Green"), NULL },
+    { GIMP_COLOR_TAG_YELLOW, NC_("color-tag", "Yellow"), NULL },
+    { GIMP_COLOR_TAG_ORANGE, NC_("color-tag", "Orange"), NULL },
+    { GIMP_COLOR_TAG_BROWN, NC_("color-tag", "Brown"), NULL },
+    { GIMP_COLOR_TAG_RED, NC_("color-tag", "Red"), NULL },
+    { GIMP_COLOR_TAG_VIOLET, NC_("color-tag", "Violet"), NULL },
+    { GIMP_COLOR_TAG_GRAY, NC_("color-tag", "Gray"), NULL },
+    { 0, NULL, NULL }
+  };
+
+  static GType type = 0;
+
+  if (G_UNLIKELY (! type))
+    {
+      type = g_enum_register_static ("GimpColorTag", values);
+      gimp_type_set_translation_domain (type, GETTEXT_PACKAGE "-libgimp");
+      gimp_type_set_translation_context (type, "color-tag");
+      gimp_enum_set_value_descriptions (type, descs);
+    }
+
+  return type;
+}
+
+GType
 gimp_component_type_get_type (void)
 {
   static const GEnumValue values[] =
diff --git a/libgimpbase/gimpbaseenums.h b/libgimpbase/gimpbaseenums.h
index e9da27c..7a93f38 100644
--- a/libgimpbase/gimpbaseenums.h
+++ b/libgimpbase/gimpbaseenums.h
@@ -193,6 +193,24 @@ typedef enum
 } GimpCloneType;
 
 
+#define GIMP_TYPE_COLOR_TAG (gimp_color_tag_get_type ())
+
+GType gimp_color_tag_get_type (void) G_GNUC_CONST;
+
+typedef enum
+{
+  GIMP_COLOR_TAG_NONE,   /*< desc="None"   >*/
+  GIMP_COLOR_TAG_BLUE,   /*< desc="Blue"   >*/
+  GIMP_COLOR_TAG_GREEN,  /*< desc="Green"  >*/
+  GIMP_COLOR_TAG_YELLOW, /*< desc="Yellow" >*/
+  GIMP_COLOR_TAG_ORANGE, /*< desc="Orange" >*/
+  GIMP_COLOR_TAG_BROWN,  /*< desc="Brown"  >*/
+  GIMP_COLOR_TAG_RED,    /*< desc="Red"    >*/
+  GIMP_COLOR_TAG_VIOLET, /*< desc="Violet" >*/
+  GIMP_COLOR_TAG_GRAY    /*< desc="Gray"   >*/
+} GimpColorTag;
+
+
 #define GIMP_TYPE_COMPONENT_TYPE (gimp_component_type_get_type ())
 
 GType gimp_component_type_get_type (void) G_GNUC_CONST;
diff --git a/menus/channels-menu.xml b/menus/channels-menu.xml
index a31b0b9..c27c253 100644
--- a/menus/channels-menu.xml
+++ b/menus/channels-menu.xml
@@ -4,6 +4,17 @@
 <ui>
   <popup action="channels-popup">
     <menuitem action="channels-edit-attributes" />
+    <menu action="channels-color-tag-menu" name="Color Tags">
+     <menuitem action="channels-color-tag-none" />
+     <menuitem action="channels-color-tag-blue" />
+     <menuitem action="channels-color-tag-green" />
+     <menuitem action="channels-color-tag-yellow" />
+     <menuitem action="channels-color-tag-orange" />
+     <menuitem action="channels-color-tag-brown" />
+     <menuitem action="channels-color-tag-red" />
+     <menuitem action="channels-color-tag-violet" />
+     <menuitem action="channels-color-tag-gray" />
+    </menu>
     <separator />
     <menuitem action="channels-new" />
     <menuitem action="channels-raise" />
diff --git a/menus/layers-menu.xml b/menus/layers-menu.xml
index 194b04a..27d8674 100644
--- a/menus/layers-menu.xml
+++ b/menus/layers-menu.xml
@@ -5,6 +5,17 @@
   <popup action="layers-popup">
     <menuitem action="layers-text-tool" />
     <menuitem action="layers-edit-attributes" />
+    <menu action="layers-color-tag-menu" name="Color Tags">
+     <menuitem action="layers-color-tag-none" />
+     <menuitem action="layers-color-tag-blue" />
+     <menuitem action="layers-color-tag-green" />
+     <menuitem action="layers-color-tag-yellow" />
+     <menuitem action="layers-color-tag-orange" />
+     <menuitem action="layers-color-tag-brown" />
+     <menuitem action="layers-color-tag-red" />
+     <menuitem action="layers-color-tag-violet" />
+     <menuitem action="layers-color-tag-gray" />
+    </menu>
     <separator />
     <menuitem action="layers-new" />
     <menuitem action="layers-new-from-visible" />
diff --git a/menus/vectors-menu.xml b/menus/vectors-menu.xml
index 3c128f9..c595859 100644
--- a/menus/vectors-menu.xml
+++ b/menus/vectors-menu.xml
@@ -5,6 +5,17 @@
   <popup action="vectors-popup">
     <menuitem action="vectors-path-tool" />
     <menuitem action="vectors-edit-attributes" />
+    <menu action="vectors-color-tag-menu" name="Color Tags">
+     <menuitem action="vectors-color-tag-none" />
+     <menuitem action="vectors-color-tag-blue" />
+     <menuitem action="vectors-color-tag-green" />
+     <menuitem action="vectors-color-tag-yellow" />
+     <menuitem action="vectors-color-tag-orange" />
+     <menuitem action="vectors-color-tag-brown" />
+     <menuitem action="vectors-color-tag-red" />
+     <menuitem action="vectors-color-tag-violet" />
+     <menuitem action="vectors-color-tag-gray" />
+    </menu>
     <separator />
     <menuitem action="vectors-new" />
     <menuitem action="vectors-raise" />
diff --git a/tools/pdbgen/enums.pl b/tools/pdbgen/enums.pl
index d2a4b0c..0d6839f 100644
--- a/tools/pdbgen/enums.pl
+++ b/tools/pdbgen/enums.pl
@@ -101,6 +101,24 @@ package Gimp::CodeGen::enums;
          mapping => { GIMP_CLONE_IMAGE => '0',
                       GIMP_CLONE_PATTERN => '1' }
        },
+    GimpColorTag =>
+       { contig => 1,
+         header => 'libgimpbase/gimpbaseenums.h',
+         symbols => [ qw(GIMP_COLOR_TAG_NONE GIMP_COLOR_TAG_BLUE
+                         GIMP_COLOR_TAG_GREEN GIMP_COLOR_TAG_YELLOW
+                         GIMP_COLOR_TAG_ORANGE GIMP_COLOR_TAG_BROWN
+                         GIMP_COLOR_TAG_RED GIMP_COLOR_TAG_VIOLET
+                         GIMP_COLOR_TAG_GRAY) ],
+         mapping => { GIMP_COLOR_TAG_NONE => '0',
+                      GIMP_COLOR_TAG_BLUE => '1',
+                      GIMP_COLOR_TAG_GREEN => '2',
+                      GIMP_COLOR_TAG_YELLOW => '3',
+                      GIMP_COLOR_TAG_ORANGE => '4',
+                      GIMP_COLOR_TAG_BROWN => '5',
+                      GIMP_COLOR_TAG_RED => '6',
+                      GIMP_COLOR_TAG_VIOLET => '7',
+                      GIMP_COLOR_TAG_GRAY => '8' }
+       },
     GimpComponentType =>
        { contig => 0,
          header => 'libgimpbase/gimpbaseenums.h',
diff --git a/tools/pdbgen/pdb/item.pdb b/tools/pdbgen/pdb/item.pdb
index 58f07db..b6f5ff9 100644
--- a/tools/pdbgen/pdb/item.pdb
+++ b/tools/pdbgen/pdb/item.pdb
@@ -675,6 +675,55 @@ CODE
     );
 }
 
+sub item_get_color_tag {
+    $blurb = "Get the color tag of the specified item.";
+
+    $help = "This procedure returns the specified item's color tag.";
+
+    &mitch_pdb_misc('2016', '2.10');
+
+    @inargs = (
+       { name => 'item', type => 'item',
+         desc => 'The item' }
+    );
+
+    @outargs = (
+       { name => 'color_tag', type => 'enum GimpColorTag',
+         desc => "The item's color tag" }
+    );
+
+    %invoke = (
+       code => <<'CODE'
+{
+  color_tag = gimp_item_get_color_tag (GIMP_ITEM (item));
+}
+CODE
+    );
+}
+
+sub item_set_color_tag {
+    $blurb = "Set the color tag of the specified item.";
+
+    $help = "This procedure sets the specified item's color tag.";
+
+    &mitch_pdb_misc('2016', '2.10');
+
+    @inargs = (
+       { name => 'item', type => 'item',
+         desc => 'The item' },
+       { name => 'color_tag', type => 'enum GimpColorTag',
+         desc => "The new item color tag" }
+    );
+
+    %invoke = (
+       code => <<'CODE'
+{
+  gimp_item_set_color_tag (GIMP_ITEM (item), color_tag, TRUE);
+}
+CODE
+    );
+}
+
 sub item_get_tattoo {
     $blurb = "Get the tattoo of the specified item.";
 
@@ -873,6 +922,7 @@ CODE
             item_get_linked item_set_linked
             item_get_lock_content item_set_lock_content
             item_get_lock_position item_set_lock_position
+            item_get_color_tag item_set_color_tag
             item_get_tattoo item_set_tattoo
            item_attach_parasite item_detach_parasite
            item_get_parasite


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]