[gimp] app: bring the "Switches" column to the channel and path properties dialogs



commit b81b60950bcc1463882d70b1e07a725fdc628e1e
Author: Michael Natterer <mitch gimp org>
Date:   Wed Oct 26 16:51:56 2016 +0200

    app: bring the "Switches" column to the channel and path properties dialogs
    
    Introduce item-options-dialog.[ch] which abstracts this away and use
    it from the layer, channel, vectors options dialogs. This is all
    pretty ugly but better than duplicating that code three times. The
    vector-options-dialog is now completely pointless but I kept it anyway
    for now, let's see what unique path options we come up with.

 app/actions/channels-commands.c      |   85 +++++--
 app/actions/layers-commands.c        |   12 +
 app/actions/quick-mask-commands.c    |   19 ++-
 app/actions/vectors-commands.c       |   65 +++++-
 app/dialogs/Makefile.am              |    2 +
 app/dialogs/channel-options-dialog.c |  218 +++++++-----------
 app/dialogs/channel-options-dialog.h |   12 +-
 app/dialogs/item-options-dialog.c    |  417 ++++++++++++++++++++++++++++++++++
 app/dialogs/item-options-dialog.h    |   72 ++++++
 app/dialogs/layer-options-dialog.c   |  333 +++++++++------------------
 app/dialogs/layer-options-dialog.h   |    7 +-
 app/dialogs/vectors-options-dialog.c |  138 +++++-------
 app/dialogs/vectors-options-dialog.h |    9 +
 po/POTFILES.in                       |    1 +
 14 files changed, 920 insertions(+), 470 deletions(-)
---
diff --git a/app/actions/channels-commands.c b/app/actions/channels-commands.c
index 202faef..8d6214b 100644
--- a/app/actions/channels-commands.c
+++ b/app/actions/channels-commands.c
@@ -62,6 +62,10 @@ static void   channels_new_callback             (GtkWidget     *dialog,
                                                  const gchar   *channel_name,
                                                  const GimpRGB *channel_color,
                                                  gboolean       save_selection,
+                                                 gboolean       channel_visible,
+                                                 gboolean       channel_linked,
+                                                 gboolean       channel_lock_content,
+                                                 gboolean       channel_lock_position,
                                                  gpointer       user_data);
 static void   channels_edit_attributes_callback (GtkWidget     *dialog,
                                                  GimpImage     *image,
@@ -70,6 +74,10 @@ static void   channels_edit_attributes_callback (GtkWidget     *dialog,
                                                  const gchar   *channel_name,
                                                  const GimpRGB *channel_color,
                                                  gboolean       save_selection,
+                                                 gboolean       channel_visible,
+                                                 gboolean       channel_linked,
+                                                 gboolean       channel_lock_content,
+                                                 gboolean       channel_lock_position,
                                                  gpointer       user_data);
 
 
@@ -92,6 +100,8 @@ channels_edit_attributes_cmd_callback (GtkAction *action,
 
   if (! dialog)
     {
+      GimpItem *item = GIMP_ITEM (channel);
+
       dialog = channel_options_dialog_new (image, channel,
                                            action_data_get_context (data),
                                            widget,
@@ -100,11 +110,15 @@ channels_edit_attributes_cmd_callback (GtkAction *action,
                                            "gtk-edit",
                                            _("Edit Channel Attributes"),
                                            GIMP_HELP_CHANNEL_EDIT,
-                                           gimp_object_get_name (channel),
-                                           &channel->color,
                                            _("Edit Channel Color"),
-                                           _("_Fill opacity"),
+                                           _("_Fill opacity:"),
                                            FALSE,
+                                           gimp_object_get_name (channel),
+                                           &channel->color,
+                                           gimp_item_get_visible (item),
+                                           gimp_item_get_linked (item),
+                                           gimp_item_get_lock_content (item),
+                                           gimp_item_get_lock_position (item),
                                            channels_edit_attributes_callback,
                                            NULL);
 
@@ -140,11 +154,15 @@ channels_new_cmd_callback (GtkAction *action,
                                            GIMP_STOCK_CHANNEL,
                                            _("Create a New Channel"),
                                            GIMP_HELP_CHANNEL_NEW,
+                                           _("New Channel Color"),
+                                           _("_Fill opacity:"),
+                                           TRUE,
                                            config->channel_new_name,
                                            &config->channel_new_color,
-                                           _("New Channel Color"),
-                                           _("_Fill opacity"),
                                            TRUE,
+                                           FALSE,
+                                           FALSE,
+                                           FALSE,
                                            channels_new_callback,
                                            NULL);
 
@@ -355,6 +373,10 @@ channels_new_callback (GtkWidget     *dialog,
                        const gchar   *channel_name,
                        const GimpRGB *channel_color,
                        gboolean       save_selection,
+                       gboolean       channel_visible,
+                       gboolean       channel_linked,
+                       gboolean       channel_lock_content,
+                       gboolean       channel_lock_position,
                        gpointer       user_data)
 {
   GimpDialogConfig *config = GIMP_DIALOG_CONFIG (image->gimp->config);
@@ -387,6 +409,11 @@ channels_new_callback (GtkWidget     *dialog,
                           GIMP_FILL_TRANSPARENT);
     }
 
+  gimp_item_set_visible (GIMP_ITEM (channel), channel_visible, FALSE);
+  gimp_item_set_linked (GIMP_ITEM (channel), channel_linked, 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);
+
   gimp_image_add_channel (image, channel,
                           GIMP_IMAGE_ACTIVE_PARENT, -1, TRUE);
   gimp_image_flush (image);
@@ -402,32 +429,44 @@ channels_edit_attributes_callback (GtkWidget     *dialog,
                                    const gchar   *channel_name,
                                    const GimpRGB *channel_color,
                                    gboolean       save_selection,
+                                   gboolean       channel_visible,
+                                   gboolean       channel_linked,
+                                   gboolean       channel_lock_content,
+                                   gboolean       channel_lock_position,
                                    gpointer       user_data)
 {
-  gboolean name_changed  = FALSE;
-  gboolean color_changed = FALSE;
-
-  if (strcmp (channel_name, gimp_object_get_name (channel)))
-    name_changed = TRUE;
-
-  if (gimp_rgba_distance (channel_color, &channel->color) > 0.0001)
-    color_changed = TRUE;
-
-  if (name_changed || color_changed)
+  GimpItem *item = GIMP_ITEM (channel);
+
+  if (strcmp (channel_name, gimp_object_get_name (channel))        ||
+      gimp_rgba_distance (channel_color, &channel->color) > 0.0001 ||
+      channel_visible       != gimp_item_get_visible (item)        ||
+      channel_linked        != gimp_item_get_linked (item)         ||
+      channel_lock_content  != gimp_item_get_lock_content (item)   ||
+      channel_lock_position != gimp_item_get_lock_position (item))
     {
-      if (name_changed && color_changed)
-        gimp_image_undo_group_start (image,
-                                     GIMP_UNDO_GROUP_ITEM_PROPERTIES,
-                                     _("Channel Attributes"));
+      gimp_image_undo_group_start (image,
+                                   GIMP_UNDO_GROUP_ITEM_PROPERTIES,
+                                   _("Channel Attributes"));
 
-      if (name_changed)
+      if (strcmp (channel_name, gimp_object_get_name (channel)))
         gimp_item_rename (GIMP_ITEM (channel), channel_name, NULL);
 
-      if (color_changed)
+      if (gimp_rgba_distance (channel_color, &channel->color) > 0.0001)
         gimp_channel_set_color (channel, channel_color, TRUE);
 
-      if (name_changed && color_changed)
-        gimp_image_undo_group_end (image);
+      if (channel_visible != gimp_item_get_visible (item))
+        gimp_item_set_visible (item, channel_visible, TRUE);
+
+      if (channel_linked != gimp_item_get_linked (item))
+        gimp_item_set_linked (item, channel_linked, TRUE);
+
+      if (channel_lock_content != gimp_item_get_lock_content (item))
+        gimp_item_set_lock_content (item, channel_lock_content, TRUE);
+
+      if (channel_lock_position != gimp_item_get_lock_position (item))
+        gimp_item_set_lock_position (item, channel_lock_position, TRUE);
+
+      gimp_image_undo_group_end (image);
 
       gimp_image_flush (image);
     }
diff --git a/app/actions/layers-commands.c b/app/actions/layers-commands.c
index 814f401..d3dc4e4 100644
--- a/app/actions/layers-commands.c
+++ b/app/actions/layers-commands.c
@@ -243,6 +243,8 @@ layers_edit_attributes_cmd_callback (GtkAction *action,
 
   if (! dialog)
     {
+      GimpItem *item = GIMP_ITEM (layer);
+
       dialog = layer_options_dialog_new (gimp_item_get_image (GIMP_ITEM (layer)),
                                          layer,
                                          action_data_get_context (data),
@@ -256,6 +258,11 @@ layers_edit_attributes_cmd_callback (GtkAction *action,
                                          gimp_layer_get_mode (layer),
                                          gimp_layer_get_opacity (layer),
                                          0 /* unused */,
+                                         gimp_item_get_visible (item),
+                                         gimp_item_get_linked (item),
+                                         gimp_item_get_lock_content (item),
+                                         gimp_item_get_lock_position (item),
+                                         gimp_layer_get_lock_alpha (layer),
                                          layers_edit_attributes_callback,
                                          NULL);
 
@@ -316,6 +323,11 @@ layers_new_cmd_callback (GtkAction *action,
                                          config->layer_new_mode,
                                          config->layer_new_opacity,
                                          config->layer_new_fill_type,
+                                         TRUE,
+                                         FALSE,
+                                         FALSE,
+                                         FALSE,
+                                         FALSE,
                                          layers_new_callback,
                                          NULL);
 
diff --git a/app/actions/quick-mask-commands.c b/app/actions/quick-mask-commands.c
index d2dab27..252af50 100644
--- a/app/actions/quick-mask-commands.c
+++ b/app/actions/quick-mask-commands.c
@@ -34,6 +34,7 @@
 
 #include "dialogs/dialogs.h"
 #include "dialogs/channel-options-dialog.h"
+#include "dialogs/item-options-dialog.h"
 
 #include "actions.h"
 #include "quick-mask-commands.h"
@@ -50,6 +51,10 @@ static void   quick_mask_configure_callback (GtkWidget     *dialog,
                                              const gchar   *channel_name,
                                              const GimpRGB *channel_color,
                                              gboolean       save_selection,
+                                             gboolean       channel_visible,
+                                             gboolean       channel_linked,
+                                             gboolean       channel_lock_content,
+                                             gboolean       channel_lock_position,
                                              gpointer       user_data);
 
 
@@ -118,14 +123,20 @@ quick_mask_configure_cmd_callback (GtkAction *action,
                                            GIMP_STOCK_QUICK_MASK_ON,
                                            _("Edit Quick Mask Attributes"),
                                            GIMP_HELP_QUICK_MASK_EDIT,
+                                           _("Edit Quick Mask Color"),
+                                           _("_Mask opacity:"),
+                                           FALSE,
                                            NULL,
                                            &color,
-                                           _("Edit Quick Mask Color"),
-                                           _("_Mask opacity"),
+                                           FALSE,
+                                           FALSE,
+                                           FALSE,
                                            FALSE,
                                            quick_mask_configure_callback,
                                            NULL);
 
+      item_options_dialog_set_switches_visible (dialog, FALSE);
+
       dialogs_attach_dialog (G_OBJECT (image), CONFIGURE_DIALOG_KEY, dialog);
     }
 
@@ -143,6 +154,10 @@ quick_mask_configure_callback (GtkWidget     *dialog,
                                const gchar   *channel_name,
                                const GimpRGB *channel_color,
                                gboolean       save_selection,
+                               gboolean       channel_visible,
+                               gboolean       channel_linked,
+                               gboolean       channel_lock_content,
+                               gboolean       channel_lock_position,
                                gpointer       user_data)
 {
   GimpRGB old_color;
diff --git a/app/actions/vectors-commands.c b/app/actions/vectors-commands.c
index 008e0bb..7158387 100644
--- a/app/actions/vectors-commands.c
+++ b/app/actions/vectors-commands.c
@@ -77,12 +77,22 @@
 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);
 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);
 static void   vectors_fill_callback            (GtkWidget            *dialog,
                                                 GimpItem             *item,
@@ -150,6 +160,8 @@ vectors_edit_attributes_cmd_callback (GtkAction *action,
 
   if (! dialog)
     {
+      GimpItem *item = GIMP_ITEM (vectors);
+
       dialog = vectors_options_dialog_new (image, vectors,
                                            action_data_get_context (data),
                                            widget,
@@ -159,6 +171,10 @@ vectors_edit_attributes_cmd_callback (GtkAction *action,
                                            _("Edit Path Attributes"),
                                            GIMP_HELP_PATH_EDIT,
                                            gimp_object_get_name (vectors),
+                                           gimp_item_get_visible (item),
+                                           gimp_item_get_linked (item),
+                                           gimp_item_get_lock_content (item),
+                                           gimp_item_get_lock_position (item),
                                            vectors_edit_attributes_callback,
                                            NULL);
 
@@ -195,6 +211,10 @@ vectors_new_cmd_callback (GtkAction *action,
                                            _("Create a New Path"),
                                            GIMP_HELP_PATH_NEW,
                                            config->vectors_new_name,
+                                           FALSE,
+                                           FALSE,
+                                           FALSE,
+                                           FALSE,
                                            vectors_new_callback,
                                            NULL);
 
@@ -816,7 +836,12 @@ 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)
 {
   GimpDialogConfig *config = GIMP_DIALOG_CONFIG (image->gimp->config);
@@ -826,6 +851,11 @@ vectors_new_callback (GtkWidget   *dialog,
                 NULL);
 
   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_lock_content (GIMP_ITEM (vectors), vectors_lock_content, FALSE);
+  gimp_item_set_lock_position (GIMP_ITEM (vectors), vectors_lock_position, FALSE);
+
   gimp_image_add_vectors (image, vectors,
                           GIMP_IMAGE_ACTIVE_PARENT, -1, TRUE);
   gimp_image_flush (image);
@@ -837,12 +867,43 @@ 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)
 {
-  if (strcmp (vectors_name, gimp_object_get_name (vectors)))
+  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_lock_content  != gimp_item_get_lock_content (item) ||
+      vectors_lock_position != gimp_item_get_lock_position (item))
     {
-      gimp_item_rename (GIMP_ITEM (vectors), vectors_name, NULL);
+      gimp_image_undo_group_start (image,
+                                   GIMP_UNDO_GROUP_ITEM_PROPERTIES,
+                                   _("Path Attributes"));
+
+      if (strcmp (vectors_name, gimp_object_get_name (vectors)))
+        gimp_item_rename (GIMP_ITEM (vectors), vectors_name, NULL);
+
+      if (vectors_visible != gimp_item_get_visible (item))
+        gimp_item_set_visible (item, vectors_visible, TRUE);
+
+      if (vectors_linked != gimp_item_get_linked (item))
+        gimp_item_set_linked (item, vectors_linked, TRUE);
+
+      if (vectors_lock_content != gimp_item_get_lock_content (item))
+        gimp_item_set_lock_content (item, vectors_lock_content, TRUE);
+
+      if (vectors_lock_position != gimp_item_get_lock_position (item))
+        gimp_item_set_lock_position (item, vectors_lock_position, TRUE);
+
+      gimp_image_undo_group_end (image);
+
       gimp_image_flush (image);
     }
 
diff --git a/app/dialogs/Makefile.am b/app/dialogs/Makefile.am
index 72c8fcc..e2b399a 100644
--- a/app/dialogs/Makefile.am
+++ b/app/dialogs/Makefile.am
@@ -57,6 +57,8 @@ libappdialogs_a_sources = \
        image-scale-dialog.h            \
        input-devices-dialog.c          \
        input-devices-dialog.h          \
+       item-options-dialog.c           \
+       item-options-dialog.h           \
        keyboard-shortcuts-dialog.c     \
        keyboard-shortcuts-dialog.h     \
        layer-add-mask-dialog.c         \
diff --git a/app/dialogs/channel-options-dialog.c b/app/dialogs/channel-options-dialog.c
index b8474cc..7109a05 100644
--- a/app/dialogs/channel-options-dialog.c
+++ b/app/dialogs/channel-options-dialog.c
@@ -34,6 +34,7 @@
 #include "widgets/gimpviewabledialog.h"
 
 #include "channel-options-dialog.h"
+#include "item-options-dialog.h"
 
 #include "gimp-intl.h"
 
@@ -42,28 +43,31 @@ typedef struct _ChannelOptionsDialog ChannelOptionsDialog;
 
 struct _ChannelOptionsDialog
 {
-  GimpImage                  *image;
-  GimpContext                *context;
-  GimpChannel                *channel;
   GimpChannelOptionsCallback  callback;
   gpointer                    user_data;
 
-  GtkWidget                  *name_entry;
   GtkWidget                  *color_panel;
-  GtkWidget                  *save_sel_checkbutton;
+  GtkWidget                  *save_sel_toggle;
 };
 
 
 /*  local function prototypes  */
 
-static void channel_options_dialog_response (GtkWidget            *dialog,
-                                             gint                  response_id,
-                                             ChannelOptionsDialog *private);
-static void channel_options_opacity_update  (GtkAdjustment        *adjustment,
+static void 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);
+static void channel_options_opacity_changed (GtkAdjustment        *adjustment,
                                              GimpColorButton      *color_button);
 static void channel_options_color_changed   (GimpColorButton      *color_button,
                                              GtkAdjustment        *adjustment);
-static void channel_options_dialog_free     (ChannelOptionsDialog *private);
 
 
 /*  public functions  */
@@ -78,19 +82,20 @@ channel_options_dialog_new (GimpImage                  *image,
                             const gchar                *icon_name,
                             const gchar                *desc,
                             const gchar                *help_id,
-                            const gchar                *channel_name,
-                            const GimpRGB              *channel_color,
                             const gchar                *color_label,
                             const gchar                *opacity_label,
                             gboolean                    show_from_sel,
+                            const gchar                *channel_name,
+                            const GimpRGB              *channel_color,
+                            gboolean                    channel_visible,
+                            gboolean                    channel_linked,
+                            gboolean                    channel_lock_content,
+                            gboolean                    channel_lock_position,
                             GimpChannelOptionsCallback  callback,
                             gpointer                    user_data)
 {
   ChannelOptionsDialog *private;
   GtkWidget            *dialog;
-  GimpViewable         *viewable;
-  GtkWidget            *hbox;
-  GtkWidget            *vbox;
   GtkAdjustment        *opacity_adj;
   GtkWidget            *scale;
 
@@ -110,108 +115,60 @@ channel_options_dialog_new (GimpImage                  *image,
 
   private = g_slice_new0 (ChannelOptionsDialog);
 
-  private->image     = image;
-  private->channel   = channel;
-  private->context   = context;
   private->callback  = callback;
   private->user_data = user_data;
 
-  if (channel)
-    viewable = GIMP_VIEWABLE (channel);
-  else
-    viewable = GIMP_VIEWABLE (image);
-
-  dialog = gimp_viewable_dialog_new (viewable, context,
-                                     title, role, icon_name, desc,
-                                     parent,
-                                     gimp_standard_help_func, help_id,
-
-                                     GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                                     GTK_STOCK_OK,     GTK_RESPONSE_OK,
-
-                                     NULL);
-
-  gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
-                                           GTK_RESPONSE_OK,
-                                           GTK_RESPONSE_CANCEL,
-                                           -1);
+  dialog = item_options_dialog_new (image, GIMP_ITEM (channel), context,
+                                    parent, title, role,
+                                    icon_name, desc, help_id,
+                                    channel_name ? _("Channel _name:") : NULL,
+                                    GIMP_STOCK_TOOL_PAINTBRUSH,
+                                    _("Lock _pixels"),
+                                    _("Lock position and _size"),
+                                    channel_name,
+                                    channel_visible,
+                                    channel_linked,
+                                    channel_lock_content,
+                                    channel_lock_position,
+                                    channel_options_dialog_callback,
+                                    private);
 
   g_object_weak_ref (G_OBJECT (dialog),
                      (GWeakNotify) channel_options_dialog_free, private);
 
-  g_signal_connect (dialog, "response",
-                    G_CALLBACK (channel_options_dialog_response),
-                    private);
-
-  hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
-  gtk_container_set_border_width (GTK_CONTAINER (hbox), 12);
-  gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))),
-                      hbox, TRUE, TRUE, 0);
-  gtk_widget_show (hbox);
-
-  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
-  gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
-  gtk_widget_show (vbox);
-
-  if (channel_name)
-    {
-      GtkWidget *vbox2;
-      GtkWidget *label;
-
-      vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2);
-      gtk_box_pack_start (GTK_BOX (vbox), vbox2, FALSE, FALSE, 0);
-      gtk_widget_show (vbox2);
-
-      label = gtk_label_new_with_mnemonic (_("Channel _name:"));
-      gtk_label_set_xalign (GTK_LABEL (label), 0.0);
-      gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, FALSE, 0);
-      gtk_widget_show (label);
-
-      private->name_entry = gtk_entry_new ();
-      gtk_entry_set_text (GTK_ENTRY (private->name_entry), channel_name);
-      gtk_entry_set_activates_default (GTK_ENTRY (private->name_entry), TRUE);
-      gtk_box_pack_start (GTK_BOX (vbox2), private->name_entry,
-                          FALSE, FALSE, 0);
-      gtk_widget_show (private->name_entry);
-
-      gtk_label_set_mnemonic_widget (GTK_LABEL (label), private->name_entry);
-    }
-
   opacity_adj = (GtkAdjustment *)
                 gtk_adjustment_new (channel_color->a * 100.0,
                                     0.0, 100.0, 1.0, 10.0, 0);
-  scale = gimp_spin_scale_new (opacity_adj, opacity_label, 1);
+  scale = gimp_spin_scale_new (opacity_adj, NULL, 1);
   gtk_widget_set_size_request (scale, 200, -1);
-  gtk_box_pack_start (GTK_BOX (vbox), scale, FALSE, FALSE, 0);
-  gtk_widget_show (scale);
+  item_options_dialog_add_widget (dialog,
+                                  opacity_label, scale);
 
   private->color_panel = gimp_color_panel_new (color_label,
                                                channel_color,
                                                GIMP_COLOR_AREA_LARGE_CHECKS,
-                                               48, 48);
+                                               24, 24);
   gimp_color_panel_set_context (GIMP_COLOR_PANEL (private->color_panel),
                                 context);
 
   g_signal_connect (opacity_adj, "value-changed",
-                    G_CALLBACK (channel_options_opacity_update),
+                    G_CALLBACK (channel_options_opacity_changed),
                     private->color_panel);
 
-  gtk_box_pack_start (GTK_BOX (hbox), private->color_panel,
-                      FALSE, FALSE, 0);
-  gtk_widget_show (private->color_panel);
-
   g_signal_connect (private->color_panel, "color-changed",
                     G_CALLBACK (channel_options_color_changed),
                     opacity_adj);
 
+  item_options_dialog_add_widget (dialog,
+                                  NULL, private->color_panel);
+
   if (show_from_sel)
     {
-      private->save_sel_checkbutton =
+      private->save_sel_toggle =
         gtk_check_button_new_with_mnemonic (_("Initialize from _selection"));
 
-      gtk_box_pack_start (GTK_BOX (vbox), private->save_sel_checkbutton,
-                          FALSE, FALSE, 0);
-      gtk_widget_show (private->save_sel_checkbutton);
+      item_options_dialog_add_widget (dialog,
+                                      NULL, private->save_sel_toggle);
     }
 
   return dialog;
@@ -221,46 +178,53 @@ channel_options_dialog_new (GimpImage                  *image,
 /*  private functions  */
 
 static void
-channel_options_dialog_response (GtkWidget            *dialog,
-                                 gint                  response_id,
-                                 ChannelOptionsDialog *private)
+channel_options_dialog_free (ChannelOptionsDialog *private)
 {
-  if (response_id == GTK_RESPONSE_OK)
-    {
-      const gchar *name           = NULL;
-      GimpRGB      color;
-      gboolean     save_selection = FALSE;
-
-      if (private->name_entry)
-        name = gtk_entry_get_text (GTK_ENTRY (private->name_entry));
-
-      gimp_color_button_get_color (GIMP_COLOR_BUTTON (private->color_panel),
-                                   &color);
-
-      if (private->save_sel_checkbutton)
-        save_selection =
-          gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (private->save_sel_checkbutton));
-
-      private->callback (dialog,
-                         private->image,
-                         private->channel,
-                         private->context,
-                         name,
-                         &color,
-                         save_selection,
-                         private->user_data);
-    }
-  else
-    {
-      gtk_widget_destroy (dialog);
-    }
+  g_slice_free (ChannelOptionsDialog, private);
 }
 
 static void
-channel_options_opacity_update (GtkAdjustment   *adjustment,
-                                GimpColorButton *color_button)
+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)
 {
-  GimpRGB  color;
+  ChannelOptionsDialog *private = user_data;
+  GimpRGB               color;
+  gboolean              save_selection = FALSE;
+
+  gimp_color_button_get_color (GIMP_COLOR_BUTTON (private->color_panel),
+                               &color);
+
+  if (private->save_sel_toggle)
+    save_selection =
+      gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (private->save_sel_toggle));
+
+  private->callback (dialog,
+                     image,
+                     GIMP_CHANNEL (item),
+                     context,
+                     item_name,
+                     &color,
+                     save_selection,
+                     item_visible,
+                     item_linked,
+                     item_lock_content,
+                     item_lock_position,
+                     private->user_data);
+}
+
+static void
+channel_options_opacity_changed (GtkAdjustment   *adjustment,
+                                 GimpColorButton *color_button)
+{
+  GimpRGB color;
 
   gimp_color_button_get_color (color_button, &color);
   gimp_rgb_set_alpha (&color, gtk_adjustment_get_value (adjustment) / 100.0);
@@ -271,14 +235,8 @@ static void
 channel_options_color_changed (GimpColorButton *button,
                                GtkAdjustment   *adjustment)
 {
-  GimpRGB        color;
+  GimpRGB color;
 
   gimp_color_button_get_color (button, &color);
   gtk_adjustment_set_value (adjustment, color.a * 100.0);
 }
-
-static void
-channel_options_dialog_free (ChannelOptionsDialog *options)
-{
-  g_slice_free (ChannelOptionsDialog, options);
-}
diff --git a/app/dialogs/channel-options-dialog.h b/app/dialogs/channel-options-dialog.h
index a4952a8..b02a95d 100644
--- a/app/dialogs/channel-options-dialog.h
+++ b/app/dialogs/channel-options-dialog.h
@@ -26,6 +26,10 @@ typedef void (* GimpChannelOptionsCallback) (GtkWidget     *dialog,
                                              const gchar   *channel_name,
                                              const GimpRGB *channel_color,
                                              gboolean       save_selection,
+                                             gboolean       channel_visible,
+                                             gboolean       channel_linked,
+                                             gboolean       channel_lock_content,
+                                             gboolean       channel_lock_position,
                                              gpointer       user_data);
 
 
@@ -38,11 +42,15 @@ GtkWidget * channel_options_dialog_new (GimpImage                  *image,
                                         const gchar                *icon_name,
                                         const gchar                *desc,
                                         const gchar                *help_id,
-                                        const gchar                *channel_name,
-                                        const GimpRGB              *channel_color,
                                         const gchar                *color_label,
                                         const gchar                *opacity_label,
                                         gboolean                    show_from_sel,
+                                        const gchar                *channel_name,
+                                        const GimpRGB              *channel_color,
+                                        gboolean                    channel_visible,
+                                        gboolean                    channel_linked,
+                                        gboolean                    channel_lock_content,
+                                        gboolean                    channel_lock_position,
                                         GimpChannelOptionsCallback  callback,
                                         gpointer                    user_data);
 
diff --git a/app/dialogs/item-options-dialog.c b/app/dialogs/item-options-dialog.c
new file mode 100644
index 0000000..1e1d0c8
--- /dev/null
+++ b/app/dialogs/item-options-dialog.c
@@ -0,0 +1,417 @@
+/* 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 "libgimpbase/gimpbase.h"
+#include "libgimpwidgets/gimpwidgets.h"
+
+#include "dialogs-types.h"
+
+#include "core/gimpcontext.h"
+#include "core/gimpimage.h"
+#include "core/gimpitem.h"
+
+#include "widgets/gimpviewabledialog.h"
+
+#include "item-options-dialog.h"
+
+#include "gimp-intl.h"
+
+
+typedef struct _ItemOptionsDialog ItemOptionsDialog;
+
+struct _ItemOptionsDialog
+{
+  GimpImage               *image;
+  GimpItem                *item;
+  GimpContext             *context;
+  gboolean                 visible;
+  gboolean                 linked;
+  gboolean                 lock_content;
+  gboolean                 lock_position;
+  GimpItemOptionsCallback  callback;
+  gpointer                 user_data;
+
+  GtkWidget               *left_vbox;
+  GtkWidget               *left_table;
+  gint                     table_row;
+  GtkWidget               *name_entry;
+  GtkWidget               *right_frame;
+  GtkWidget               *right_vbox;
+  GtkWidget               *lock_position_toggle;
+};
+
+
+/*  local function prototypes  */
+
+static void        item_options_dialog_free     (ItemOptionsDialog *private);
+static void        item_options_dialog_response (GtkWidget         *dialog,
+                                                 gint               response_id,
+                                                 ItemOptionsDialog *private);
+static GtkWidget * check_button_with_icon_new    (const gchar      *label,
+                                                  const gchar      *icon_name,
+                                                  GtkBox           *vbox);
+
+
+/*  public functions  */
+
+GtkWidget *
+item_options_dialog_new (GimpImage               *image,
+                         GimpItem                *item,
+                         GimpContext             *context,
+                         GtkWidget               *parent,
+                         const gchar             *title,
+                         const gchar             *role,
+                         const gchar             *icon_name,
+                         const gchar             *desc,
+                         const gchar             *help_id,
+                         const gchar             *name_label,
+                         const gchar             *lock_content_icon_name,
+                         const gchar             *lock_content_label,
+                         const gchar             *lock_position_label,
+                         const gchar             *item_name,
+                         gboolean                 item_visible,
+                         gboolean                 item_linked,
+                         gboolean                 item_lock_content,
+                         gboolean                 item_lock_position,
+                         GimpItemOptionsCallback  callback,
+                         gpointer                 user_data)
+{
+  ItemOptionsDialog *private;
+  GtkWidget         *dialog;
+  GimpViewable      *viewable;
+  GtkWidget         *main_hbox;
+  GtkWidget         *table;
+  GtkWidget         *button;
+
+  g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
+  g_return_val_if_fail (item == NULL || GIMP_IS_ITEM (item), NULL);
+  g_return_val_if_fail (GIMP_IS_CONTEXT (context), NULL);
+  g_return_val_if_fail (GTK_IS_WIDGET (parent), NULL);
+  g_return_val_if_fail (title != NULL, NULL);
+  g_return_val_if_fail (role != NULL, NULL);
+  g_return_val_if_fail (icon_name != NULL, NULL);
+  g_return_val_if_fail (desc != NULL, NULL);
+  g_return_val_if_fail (help_id != NULL, NULL);
+  g_return_val_if_fail (callback != NULL, NULL);
+
+  private = g_slice_new0 (ItemOptionsDialog);
+
+  private->image         = image;
+  private->item          = item;
+  private->context       = context;
+  private->visible       = item_visible;
+  private->linked        = item_linked;
+  private->lock_content  = item_lock_content;
+  private->lock_position = item_lock_position;
+  private->callback      = callback;
+  private->user_data     = user_data;
+
+  if (item)
+    viewable = GIMP_VIEWABLE (item);
+  else
+    viewable = GIMP_VIEWABLE (image);
+
+  dialog = gimp_viewable_dialog_new (viewable, context,
+                                     title, role, icon_name, desc,
+                                     parent,
+                                     gimp_standard_help_func, help_id,
+
+                                     GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+                                     GTK_STOCK_OK,     GTK_RESPONSE_OK,
+
+                                     NULL);
+
+  gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
+                                           GTK_RESPONSE_OK,
+                                           GTK_RESPONSE_CANCEL,
+                                           -1);
+
+  g_signal_connect (dialog, "response",
+                    G_CALLBACK (item_options_dialog_response),
+                    private);
+
+  g_object_weak_ref (G_OBJECT (dialog),
+                     (GWeakNotify) item_options_dialog_free, private);
+
+  g_object_set_data (G_OBJECT (dialog), "item-options-dialog-private", private);
+
+  main_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
+  gtk_container_set_border_width (GTK_CONTAINER (main_hbox), 12);
+  gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))),
+                      main_hbox, TRUE, TRUE, 0);
+  gtk_widget_show (main_hbox);
+
+  private->left_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
+  gtk_box_pack_start (GTK_BOX (main_hbox), private->left_vbox, TRUE, TRUE, 0);
+  gtk_widget_show (private->left_vbox);
+
+  private->left_table = table = gtk_table_new (1, 2, FALSE);
+  gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+  gtk_table_set_row_spacings (GTK_TABLE (table), 6);
+  gtk_box_pack_start (GTK_BOX (private->left_vbox), table, FALSE, FALSE, 0);
+  gtk_widget_show (table);
+
+  /*  The name label and entry  */
+  if (name_label)
+    {
+      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);
+    }
+
+  /*  The switches frame & vbox  */
+
+  private->right_frame = gimp_frame_new (_("Switches"));
+  gtk_box_pack_start (GTK_BOX (main_hbox), private->right_frame,
+                      FALSE, FALSE, 0);
+  gtk_widget_show (private->right_frame);
+
+  private->right_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+  gtk_container_add (GTK_CONTAINER (private->right_frame), private->right_vbox);
+  gtk_widget_show (private->right_vbox);
+
+  button = check_button_with_icon_new (_("_Visible"),
+                                       GIMP_STOCK_VISIBLE,
+                                       GTK_BOX (private->right_vbox));
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
+                                private->visible);
+  g_signal_connect (button, "toggled",
+                    G_CALLBACK (gimp_toggle_button_update),
+                    &private->visible);
+
+  button = check_button_with_icon_new (_("_Linked"),
+                                       GIMP_STOCK_LINKED,
+                                       GTK_BOX (private->right_vbox));
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
+                                private->linked);
+  g_signal_connect (button, "toggled",
+                    G_CALLBACK (gimp_toggle_button_update),
+                    &private->linked);
+
+  button = check_button_with_icon_new (lock_content_label,
+                                       lock_content_icon_name,
+                                       GTK_BOX (private->right_vbox));
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
+                                private->lock_content);
+  g_signal_connect (button, "toggled",
+                    G_CALLBACK (gimp_toggle_button_update),
+                    &private->lock_content);
+
+  button = check_button_with_icon_new (lock_position_label,
+                                       GIMP_STOCK_TOOL_MOVE,
+                                       GTK_BOX (private->right_vbox));
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
+                                private->lock_position);
+  g_signal_connect (button, "toggled",
+                    G_CALLBACK (gimp_toggle_button_update),
+                    &private->lock_position);
+
+  private->lock_position_toggle = button;
+
+  return dialog;
+}
+
+GtkWidget *
+item_options_dialog_get_vbox (GtkWidget *dialog)
+{
+  ItemOptionsDialog *private;
+
+  g_return_val_if_fail (GIMP_IS_VIEWABLE_DIALOG (dialog), NULL);
+
+  private = g_object_get_data (G_OBJECT (dialog),
+                               "item-options-dialog-private");
+
+  g_return_val_if_fail (private != NULL, NULL);
+
+  return private->left_vbox;
+}
+
+GtkWidget *
+item_options_dialog_get_table (GtkWidget *dialog,
+                               gint      *next_row)
+{
+  ItemOptionsDialog *private;
+
+  g_return_val_if_fail (GIMP_IS_VIEWABLE_DIALOG (dialog), NULL);
+  g_return_val_if_fail (next_row != NULL, NULL);
+
+  private = g_object_get_data (G_OBJECT (dialog),
+                               "item-options-dialog-private");
+
+  g_return_val_if_fail (private != NULL, NULL);
+
+  *next_row = private->table_row;
+
+  return private->left_table;
+}
+
+GtkWidget *
+item_options_dialog_get_name_entry (GtkWidget *dialog)
+{
+  ItemOptionsDialog *private;
+
+  g_return_val_if_fail (GIMP_IS_VIEWABLE_DIALOG (dialog), NULL);
+
+  private = g_object_get_data (G_OBJECT (dialog),
+                               "item-options-dialog-private");
+
+  g_return_val_if_fail (private != NULL, NULL);
+
+  return private->name_entry;
+}
+
+GtkWidget *
+item_options_dialog_get_lock_position (GtkWidget *dialog)
+{
+  ItemOptionsDialog *private;
+
+  g_return_val_if_fail (GIMP_IS_VIEWABLE_DIALOG (dialog), NULL);
+
+  private = g_object_get_data (G_OBJECT (dialog),
+                               "item-options-dialog-private");
+
+  g_return_val_if_fail (private != NULL, NULL);
+
+  return private->lock_position_toggle;
+}
+
+void
+item_options_dialog_add_widget (GtkWidget   *dialog,
+                                const gchar *label,
+                                GtkWidget   *widget)
+{
+  ItemOptionsDialog *private;
+
+  g_return_if_fail (GIMP_IS_VIEWABLE_DIALOG (dialog));
+  g_return_if_fail (GTK_IS_WIDGET (widget));
+
+  private = g_object_get_data (G_OBJECT (dialog),
+                               "item-options-dialog-private");
+
+  g_return_if_fail (private != NULL);
+
+  gimp_table_attach_aligned (GTK_TABLE (private->left_table),
+                             0, private->table_row++,
+                             label, 0.0, 0.5,
+                             widget, 1, FALSE);
+}
+
+GtkWidget *
+item_options_dialog_add_switch (GtkWidget   *dialog,
+                                const gchar *icon_name,
+                                const gchar *label)
+{
+  ItemOptionsDialog *private;
+
+  g_return_val_if_fail (GIMP_IS_VIEWABLE_DIALOG (dialog), NULL);
+  g_return_val_if_fail (icon_name != NULL, NULL);
+  g_return_val_if_fail (label != NULL, NULL);
+
+  private = g_object_get_data (G_OBJECT (dialog),
+                               "item-options-dialog-private");
+
+  g_return_val_if_fail (private != NULL, NULL);
+
+  return check_button_with_icon_new (label, icon_name,
+                                     GTK_BOX (private->right_vbox));
+}
+
+void
+item_options_dialog_set_switches_visible (GtkWidget *dialog,
+                                          gboolean   visible)
+{
+  ItemOptionsDialog *private;
+
+  g_return_if_fail (GIMP_IS_VIEWABLE_DIALOG (dialog));
+
+  private = g_object_get_data (G_OBJECT (dialog),
+                               "item-options-dialog-private");
+
+  g_return_if_fail (private != NULL);
+
+  gtk_widget_set_visible (private->right_frame, visible);
+}
+
+
+/*  private functions  */
+
+static void
+item_options_dialog_free (ItemOptionsDialog *private)
+{
+  g_slice_free (ItemOptionsDialog, private);
+}
+
+static void
+item_options_dialog_response (GtkWidget         *dialog,
+                              gint               response_id,
+                              ItemOptionsDialog *private)
+{
+  if (response_id == GTK_RESPONSE_OK)
+    {
+      const gchar *name = NULL;
+
+      if (private->name_entry)
+        name = gtk_entry_get_text (GTK_ENTRY (private->name_entry));
+
+      private->callback (dialog,
+                         private->image,
+                         private->item,
+                         private->context,
+                         name,
+                         private->visible,
+                         private->linked,
+                         private->lock_content,
+                         private->lock_position,
+                         private->user_data);
+    }
+  else
+    {
+      gtk_widget_destroy (dialog);
+    }
+}
+
+static GtkWidget *
+check_button_with_icon_new (const gchar *label,
+                            const gchar *icon_name,
+                            GtkBox      *vbox)
+{
+  GtkWidget *hbox;
+  GtkWidget *button;
+  GtkWidget *image;
+
+  hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+  gtk_box_pack_start (vbox, hbox, FALSE, FALSE, 0);
+  gtk_widget_show (hbox);
+
+  image = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_BUTTON);
+  gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
+  gtk_widget_show (image);
+
+  button = gtk_check_button_new_with_mnemonic (label);
+  gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
+  gtk_widget_show (button);
+
+  return button;
+}
diff --git a/app/dialogs/item-options-dialog.h b/app/dialogs/item-options-dialog.h
new file mode 100644
index 0000000..b09fc4b
--- /dev/null
+++ b/app/dialogs/item-options-dialog.h
@@ -0,0 +1,72 @@
+/* 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 __ITEM_OPTIONS_DIALOG_H__
+#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);
+
+
+GtkWidget * item_options_dialog_new (GimpImage               *image,
+                                     GimpItem                *item,
+                                     GimpContext             *context,
+                                     GtkWidget               *parent,
+                                     const gchar             *title,
+                                     const gchar             *role,
+                                     const gchar             *icon_name,
+                                     const gchar             *desc,
+                                     const gchar             *help_id,
+                                     const gchar             *name_label,
+                                     const gchar             *lock_content_icon_name,
+                                     const gchar             *lock_content_label,
+                                     const gchar             *lock_position_label,
+                                     const gchar             *item_name,
+                                     gboolean                 item_visible,
+                                     gboolean                 item_linked,
+                                     gboolean                 item_lock_content,
+                                     gboolean                 item_lock_position,
+                                     GimpItemOptionsCallback  callback,
+                                     gpointer                 user_data);
+
+GtkWidget * item_options_dialog_get_vbox             (GtkWidget   *dialog);
+GtkWidget * item_options_dialog_get_table            (GtkWidget   *dialog,
+                                                      gint        *next_row);
+GtkWidget * item_options_dialog_get_name_entry       (GtkWidget   *dialog);
+GtkWidget * item_options_dialog_get_lock_position    (GtkWidget   *dialog);
+
+void        item_options_dialog_add_widget           (GtkWidget   *dialog,
+                                                      const gchar *label,
+                                                      GtkWidget   *widget);
+GtkWidget * item_options_dialog_add_switch           (GtkWidget   *dialog,
+                                                      const gchar *icon_name,
+                                                      const gchar *label);
+
+void        item_options_dialog_set_switches_visible (GtkWidget   *dialog,
+                                                      gboolean     visible);
+
+
+#endif /* __ITEM_OPTIONS_DIALOG_H__ */
diff --git a/app/dialogs/layer-options-dialog.c b/app/dialogs/layer-options-dialog.c
index 1b35440..e501a8a 100644
--- a/app/dialogs/layer-options-dialog.c
+++ b/app/dialogs/layer-options-dialog.c
@@ -39,6 +39,7 @@
 #include "widgets/gimpviewabledialog.h"
 #include "widgets/gimpwidgets-constructors.h"
 
+#include "item-options-dialog.h"
 #include "layer-options-dialog.h"
 
 #include "gimp-intl.h"
@@ -48,22 +49,15 @@ typedef struct _LayerOptionsDialog LayerOptionsDialog;
 
 struct _LayerOptionsDialog
 {
-  GimpImage                *image;
   GimpLayer                *layer;
-  GimpContext              *context;
   GimpLayerModeEffects      mode;
   gdouble                   opacity;
   GimpFillType              fill_type;
-  gboolean                  visible;
-  gboolean                  linked;
-  gboolean                  lock_pixels;
-  gboolean                  lock_position;
   gboolean                  lock_alpha;
   gboolean                  rename_text_layers;
   GimpLayerOptionsCallback  callback;
   gpointer                  user_data;
 
-  GtkWidget                *name_entry;
   GtkWidget                *size_se;
   GtkWidget                *offset_se;
 };
@@ -72,14 +66,18 @@ struct _LayerOptionsDialog
 /*  local function prototypes  */
 
 static void   layer_options_dialog_free          (LayerOptionsDialog *private);
-static void   layer_options_dialog_response      (GtkWidget          *dialog,
-                                                  gint                response_id,
-                                                  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);
 static void   layer_options_dialog_toggle_rename (GtkWidget          *widget,
                                                   LayerOptionsDialog *private);
-static GtkWidget * check_button_with_icon_new    (const gchar        *label,
-                                                  const gchar        *icon_name,
-                                                  GtkBox             *vbox);
 
 
 /*  public functions  */
@@ -98,23 +96,22 @@ layer_options_dialog_new (GimpImage                *image,
                           GimpLayerModeEffects      layer_mode,
                           gdouble                   layer_opacity,
                           GimpFillType              layer_fill_type,
+                          gboolean                  layer_visible,
+                          gboolean                  layer_linked,
+                          gboolean                  layer_lock_content,
+                          gboolean                  layer_lock_position,
+                          gboolean                  layer_lock_alpha,
                           GimpLayerOptionsCallback  callback,
                           gpointer                  user_data)
 {
   LayerOptionsDialog *private;
   GtkWidget          *dialog;
-  GimpViewable       *viewable;
-  GtkWidget          *main_hbox;
-  GtkWidget          *left_vbox;
-  GtkWidget          *right_vbox;
   GtkWidget          *table;
   GtkWidget          *combo;
   GtkWidget          *scale;
   GtkWidget          *label;
   GtkAdjustment      *adjustment;
   GtkWidget          *spinbutton;
-  GtkWidget          *frame;
-  GtkWidget          *vbox;
   GtkWidget          *button;
   gdouble             xres;
   gdouble             yres;
@@ -127,93 +124,38 @@ layer_options_dialog_new (GimpImage                *image,
 
   private = g_slice_new0 (LayerOptionsDialog);
 
-  private->image              = image;
   private->layer              = layer;
-  private->context            = context;
   private->mode               = layer_mode;
   private->opacity            = layer_opacity * 100.0;
   private->fill_type          = layer_fill_type;
-  private->visible            = TRUE;
-  private->linked             = FALSE;
-  private->lock_pixels        = FALSE;
-  private->lock_position      = FALSE;
-  private->lock_alpha         = FALSE;
+  private->lock_alpha         = layer_lock_alpha;
   private->rename_text_layers = FALSE;
   private->callback           = callback;
   private->user_data          = user_data;
 
-  if (layer)
-    {
-      viewable = GIMP_VIEWABLE (layer);
-
-      private->visible       = gimp_item_get_visible (GIMP_ITEM (layer));
-      private->linked        = gimp_item_get_linked (GIMP_ITEM (layer));
-      private->lock_pixels   = gimp_item_get_lock_content (GIMP_ITEM (layer));
-      private->lock_position = gimp_item_get_lock_position (GIMP_ITEM (layer));
-      private->lock_alpha    = gimp_layer_get_lock_alpha (layer);
-
-      if (gimp_item_is_text_layer (GIMP_ITEM (layer)))
-        private->rename_text_layers = GIMP_TEXT_LAYER (layer)->auto_rename;
-    }
-  else
-    {
-      viewable = GIMP_VIEWABLE (image);
-    }
-
-  dialog = gimp_viewable_dialog_new (viewable, context,
-                                     title, role, icon_name, desc,
-                                     parent,
-                                     gimp_standard_help_func, help_id,
-
-                                     GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                                     GTK_STOCK_OK,     GTK_RESPONSE_OK,
-
-                                     NULL);
-
-  gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
-                                           GTK_RESPONSE_OK,
-                                           GTK_RESPONSE_CANCEL,
-                                           -1);
-
-  g_signal_connect (dialog, "response",
-                    G_CALLBACK (layer_options_dialog_response),
-                    private);
+  if (layer && gimp_item_is_text_layer (GIMP_ITEM (layer)))
+    private->rename_text_layers = GIMP_TEXT_LAYER (layer)->auto_rename;
+
+  dialog = item_options_dialog_new (image, GIMP_ITEM (layer), context,
+                                    parent, title, role,
+                                    icon_name, desc, help_id,
+                                    _("Layer _name:"),
+                                    GIMP_STOCK_TOOL_PAINTBRUSH,
+                                    _("Lock _pixels"),
+                                    _("Lock position and _size"),
+                                    layer_name,
+                                    layer_visible,
+                                    layer_linked,
+                                    layer_lock_content,
+                                    layer_lock_position,
+                                    layer_options_dialog_callback,
+                                    private);
 
   g_object_weak_ref (G_OBJECT (dialog),
                      (GWeakNotify) layer_options_dialog_free, private);
 
-  main_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
-  gtk_container_set_border_width (GTK_CONTAINER (main_hbox), 12);
-  gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))),
-                      main_hbox, TRUE, TRUE, 0);
-  gtk_widget_show (main_hbox);
-
-  left_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
-  gtk_box_pack_start (GTK_BOX (main_hbox), left_vbox, TRUE, TRUE, 0);
-  gtk_widget_show (left_vbox);
-
-  table = gtk_table_new (layer ? 5 : 8, 2, FALSE);
-  gtk_table_set_col_spacings (GTK_TABLE (table), 6);
-  gtk_table_set_row_spacings (GTK_TABLE (table), 6);
-  gtk_table_set_row_spacing (GTK_TABLE (table), 3, 4);
-  if (! layer)
-    gtk_table_set_row_spacing (GTK_TABLE (table), 5, 4);
-  gtk_box_pack_start (GTK_BOX (left_vbox), table, FALSE, FALSE, 0);
-  gtk_widget_show (table);
-
-  /*  The name label and entry  */
-  private->name_entry = gtk_entry_new ();
-  gimp_table_attach_aligned (GTK_TABLE (table), 0, row++,
-                             _("Layer _name:"), 0.0, 0.5,
-                             private->name_entry, 1, FALSE);
-
-  gtk_entry_set_activates_default (GTK_ENTRY (private->name_entry), TRUE);
-  gtk_entry_set_text (GTK_ENTRY (private->name_entry), layer_name);
-
   combo = gimp_paint_mode_menu_new (FALSE, FALSE);
-  gimp_table_attach_aligned (GTK_TABLE (table), 0, row++,
-                             _("_Mode:"), 0.0, 0.5,
-                             combo, 1, FALSE);
+  item_options_dialog_add_widget (dialog, _("_Mode:"), combo);
   gimp_int_combo_box_connect (GIMP_INT_COMBO_BOX (combo),
                               private->mode,
                               G_CALLBACK (gimp_int_combo_box_get_active),
@@ -222,14 +164,14 @@ layer_options_dialog_new (GimpImage                *image,
   adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (private->opacity, 0.0, 100.0,
                                                    1.0, 10.0, 0.0));
   scale = gimp_spin_scale_new (adjustment, NULL, 1);
-  gimp_table_attach_aligned (GTK_TABLE (table), 0, row++,
-                             _("_Opacity:"), 0.0, 0.5,
-                             scale, 1, FALSE);
+  item_options_dialog_add_widget (dialog, _("_Opacity:"), scale);
 
   g_signal_connect (adjustment, "value-changed",
                     G_CALLBACK (gimp_double_adjustment_update),
                     &private->opacity);
 
+  table = item_options_dialog_get_table (dialog, &row);
+
   gimp_image_get_resolution (image, &xres, &yres);
 
   if (! layer)
@@ -369,6 +311,11 @@ layer_options_dialog_new (GimpImage                *image,
 
   row += 2;
 
+  /*  set the spacings after adding widgets or GtkTable will warn  */
+  gtk_table_set_row_spacing (GTK_TABLE (table), 3, 4);
+  if (! layer)
+    gtk_table_set_row_spacing (GTK_TABLE (table), 5, 4);
+
   if (! layer)
     {
       /*  The fill type  */
@@ -384,6 +331,8 @@ layer_options_dialog_new (GimpImage                *image,
 
   if (layer)
     {
+      GtkWidget     *left_vbox = item_options_dialog_get_vbox (dialog);
+      GtkWidget     *frame;
       GimpContainer *filters;
       GtkWidget     *view;
 
@@ -399,53 +348,7 @@ layer_options_dialog_new (GimpImage                *image,
       gtk_widget_show (view);
     }
 
-  right_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
-  gtk_box_pack_start (GTK_BOX (main_hbox), right_vbox, FALSE, FALSE, 0);
-  gtk_widget_show (right_vbox);
-
-  frame = gimp_frame_new (_("Switches"));
-  gtk_box_pack_start (GTK_BOX (right_vbox), frame, FALSE, FALSE, 0);
-  gtk_widget_show (frame);
-
-  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
-  gtk_container_add (GTK_CONTAINER (frame), vbox);
-  gtk_widget_show (vbox);
-
-  button = check_button_with_icon_new (_("_Visible"),
-                                       GIMP_STOCK_VISIBLE,
-                                       GTK_BOX (vbox));
-  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
-                                private->visible);
-  g_signal_connect (button, "toggled",
-                    G_CALLBACK (gimp_toggle_button_update),
-                    &private->visible);
-
-  button = check_button_with_icon_new (_("_Linked"),
-                                       GIMP_STOCK_LINKED,
-                                       GTK_BOX (vbox));
-  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
-                                private->linked);
-  g_signal_connect (button, "toggled",
-                    G_CALLBACK (gimp_toggle_button_update),
-                    &private->linked);
-
-  button = check_button_with_icon_new (_("Lock _pixels"),
-                                       GIMP_STOCK_TOOL_PAINTBRUSH,
-                                       GTK_BOX (vbox));
-  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
-                                private->lock_pixels);
-  g_signal_connect (button, "toggled",
-                    G_CALLBACK (gimp_toggle_button_update),
-                    &private->lock_pixels);
-
-  button = check_button_with_icon_new (_("Lock position and _size"),
-                                       GIMP_STOCK_TOOL_MOVE,
-                                       GTK_BOX (vbox));
-  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
-                                private->lock_position);
-  g_signal_connect (button, "toggled",
-                    G_CALLBACK (gimp_toggle_button_update),
-                    &private->lock_position);
+  button = item_options_dialog_get_lock_position (dialog);
 
   if (private->size_se)
     g_object_bind_property (G_OBJECT (button),           "active",
@@ -458,9 +361,9 @@ layer_options_dialog_new (GimpImage                *image,
                           G_BINDING_SYNC_CREATE |
                           G_BINDING_INVERT_BOOLEAN);
 
-  button = check_button_with_icon_new (_("Lock _alpha"),
-                                       GIMP_STOCK_TRANSPARENCY,
-                                       GTK_BOX (vbox));
+  button = item_options_dialog_add_switch (dialog,
+                                           GIMP_STOCK_TRANSPARENCY,
+                                           _("Lock _alpha"));
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
                                 private->lock_alpha);
   g_signal_connect (button, "toggled",
@@ -470,9 +373,9 @@ layer_options_dialog_new (GimpImage                *image,
   /*  For text layers add a toggle to control "auto-rename"  */
   if (layer && gimp_item_is_text_layer (GIMP_ITEM (layer)))
     {
-      button = check_button_with_icon_new (_("Set name from _text"),
-                                           GIMP_STOCK_TOOL_TEXT,
-                                           GTK_BOX (vbox));
+      button = item_options_dialog_add_switch (dialog,
+                                               GIMP_STOCK_TOOL_TEXT,
+                                               _("Set name from _text"));
       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
                                     private->rename_text_layers);
       g_signal_connect (button, "toggled",
@@ -497,61 +400,59 @@ layer_options_dialog_free (LayerOptionsDialog *private)
 }
 
 static void
-layer_options_dialog_response (GtkWidget          *dialog,
-                               gint                response_id,
-                               LayerOptionsDialog *private)
+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)
 {
-  if (response_id == GTK_RESPONSE_OK)
-    {
-      const gchar *name;
-      gint         width  = 0;
-      gint         height = 0;
-      gint         offset_x;
-      gint         offset_y;
-
-      name = gtk_entry_get_text (GTK_ENTRY (private->name_entry));
+  LayerOptionsDialog *private = user_data;
+  gint                width   = 0;
+  gint                height  = 0;
+  gint                offset_x;
+  gint                offset_y;
 
-      if (! private->layer)
-        {
-          width =
-            RINT (gimp_size_entry_get_refval (GIMP_SIZE_ENTRY (private->size_se),
-                                              0));
-          height =
-            RINT (gimp_size_entry_get_refval (GIMP_SIZE_ENTRY (private->size_se),
-                                              1));
-        }
-
-      offset_x =
-        RINT (gimp_size_entry_get_refval (GIMP_SIZE_ENTRY (private->offset_se),
+  if (item)
+    {
+      width =
+        RINT (gimp_size_entry_get_refval (GIMP_SIZE_ENTRY (private->size_se),
                                           0));
-      offset_y =
-        RINT (gimp_size_entry_get_refval (GIMP_SIZE_ENTRY (private->offset_se),
+      height =
+        RINT (gimp_size_entry_get_refval (GIMP_SIZE_ENTRY (private->size_se),
                                           1));
-
-      private->callback (dialog,
-                         private->image,
-                         private->layer,
-                         private->context,
-                         name,
-                         private->mode,
-                         private->opacity / 100.0,
-                         private->fill_type,
-                         width,
-                         height,
-                         offset_x,
-                         offset_y,
-                         private->visible,
-                         private->linked,
-                         private->lock_pixels,
-                         private->lock_position,
-                         private->lock_alpha,
-                         private->rename_text_layers,
-                         private->user_data);
-    }
-  else
-    {
-      gtk_widget_destroy (dialog);
     }
+
+  offset_x =
+    RINT (gimp_size_entry_get_refval (GIMP_SIZE_ENTRY (private->offset_se),
+                                      0));
+  offset_y =
+    RINT (gimp_size_entry_get_refval (GIMP_SIZE_ENTRY (private->offset_se),
+                                      1));
+
+  private->callback (dialog,
+                     image,
+                     GIMP_LAYER (item),
+                     context,
+                     item_name,
+                     private->mode,
+                     private->opacity / 100.0,
+                     private->fill_type,
+                     width,
+                     height,
+                     offset_x,
+                     offset_y,
+                     item_visible,
+                     item_linked,
+                     item_lock_content,
+                     item_lock_position,
+                     private->lock_alpha,
+                     private->rename_text_layers,
+                     private->user_data);
 }
 
 static void
@@ -566,35 +467,17 @@ layer_options_dialog_toggle_rename (GtkWidget          *widget,
 
       if (text && text->text)
         {
-          gchar *name = gimp_utf8_strtrim (text->text, 30);
+          GtkWidget *dialog;
+          GtkWidget *name_entry;
+          gchar     *name = gimp_utf8_strtrim (text->text, 30);
+
+          dialog = gtk_widget_get_toplevel (widget);
 
-          gtk_entry_set_text (GTK_ENTRY (private->name_entry), name);
+          name_entry = item_options_dialog_get_name_entry (dialog);
+
+          gtk_entry_set_text (GTK_ENTRY (name_entry), name);
 
           g_free (name);
         }
     }
 }
-
-static GtkWidget *
-check_button_with_icon_new (const gchar *label,
-                            const gchar *icon_name,
-                            GtkBox      *vbox)
-{
-  GtkWidget *hbox;
-  GtkWidget *button;
-  GtkWidget *image;
-
-  hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
-  gtk_box_pack_start (vbox, hbox, FALSE, FALSE, 0);
-  gtk_widget_show (hbox);
-
-  image = gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_BUTTON);
-  gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
-  gtk_widget_show (image);
-
-  button = gtk_check_button_new_with_mnemonic (label);
-  gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
-  gtk_widget_show (button);
-
-  return button;
-}
diff --git a/app/dialogs/layer-options-dialog.h b/app/dialogs/layer-options-dialog.h
index 9103c94..3416019 100644
--- a/app/dialogs/layer-options-dialog.h
+++ b/app/dialogs/layer-options-dialog.h
@@ -33,7 +33,7 @@ typedef void (* GimpLayerOptionsCallback) (GtkWidget            *dialog,
                                            gint                  layer_offset_y,
                                            gboolean              layer_visible,
                                            gboolean              layer_linked,
-                                           gboolean              layer_lock_pixels,
+                                           gboolean              layer_lock_content,
                                            gboolean              layer_lock_position,
                                            gboolean              layer_lock_alpha,
                                            gboolean              rename_text_layer,
@@ -53,6 +53,11 @@ GtkWidget * layer_options_dialog_new (GimpImage                *image,
                                       GimpLayerModeEffects      layer_mode,
                                       gdouble                   layer_opacity,
                                       GimpFillType              layer_fill_type,
+                                      gboolean                  layer_visible,
+                                      gboolean                  layer_linked,
+                                      gboolean                  layer_lock_content,
+                                      gboolean                  layer_lock_position,
+                                      gboolean                  layer_lock_alpha,
                                       GimpLayerOptionsCallback  callback,
                                       gpointer                  user_data);
 
diff --git a/app/dialogs/vectors-options-dialog.c b/app/dialogs/vectors-options-dialog.c
index b1057b6..4af580d 100644
--- a/app/dialogs/vectors-options-dialog.c
+++ b/app/dialogs/vectors-options-dialog.c
@@ -17,8 +17,6 @@
 
 #include "config.h"
 
-#include <string.h>
-
 #include <gegl.h>
 #include <gtk/gtk.h>
 
@@ -31,8 +29,7 @@
 
 #include "vectors/gimpvectors.h"
 
-#include "widgets/gimpviewabledialog.h"
-
+#include "item-options-dialog.h"
 #include "vectors-options-dialog.h"
 
 #include "gimp-intl.h"
@@ -42,21 +39,24 @@ typedef struct _VectorsOptionsDialog VectorsOptionsDialog;
 
 struct _VectorsOptionsDialog
 {
-  GimpImage                  *image;
-  GimpVectors                *vectors;
   GimpVectorsOptionsCallback  callback;
   gpointer                    user_data;
-
-  GtkWidget                  *name_entry;
 };
 
 
 /*  local function prototypes  */
 
-static void  vectors_options_dialog_response (GtkWidget            *dialog,
-                                              gint                  response_id,
-                                              VectorsOptionsDialog *private);
 static void  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);
 
 
 /*  public functions  */
@@ -72,15 +72,15 @@ vectors_options_dialog_new (GimpImage                  *image,
                             const gchar                *desc,
                             const gchar                *help_id,
                             const gchar                *vectors_name,
+                            gboolean                    vectors_visible,
+                            gboolean                    vectors_linked,
+                            gboolean                    vectors_lock_content,
+                            gboolean                    vectors_lock_position,
                             GimpVectorsOptionsCallback  callback,
                             gpointer                    user_data)
 {
   VectorsOptionsDialog *private;
   GtkWidget            *dialog;
-  GimpViewable         *viewable;
-  GtkWidget            *hbox;
-  GtkWidget            *vbox;
-  GtkWidget            *table;
 
   g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
   g_return_val_if_fail (vectors == NULL || GIMP_IS_VECTORS (vectors), NULL);
@@ -95,90 +95,58 @@ vectors_options_dialog_new (GimpImage                  *image,
 
   private = g_slice_new0 (VectorsOptionsDialog);
 
-  private->image     = image;
-  private->vectors   = vectors;
   private->callback  = callback;
   private->user_data = user_data;
 
-  if (vectors)
-    viewable = GIMP_VIEWABLE (vectors);
-  else
-    viewable = GIMP_VIEWABLE (image);
-
-  dialog = gimp_viewable_dialog_new (viewable, context,
-                                     title, role, icon_name, desc,
-                                     parent,
-                                     gimp_standard_help_func,
-                                     help_id,
-
-                                     GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                                     GTK_STOCK_OK,     GTK_RESPONSE_OK,
-
-                                     NULL);
-
-  gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
-                                           GTK_RESPONSE_OK,
-                                           GTK_RESPONSE_CANCEL,
-                                           -1);
+  dialog = item_options_dialog_new (image, GIMP_ITEM (vectors), context,
+                                    parent, title, role,
+                                    icon_name, desc, help_id,
+                                    _("Path _name:"),
+                                    GIMP_STOCK_TOOL_PATH,
+                                    _("Lock path _strokes"),
+                                    _("Lock path _position"),
+                                    vectors_name,
+                                    vectors_visible,
+                                    vectors_linked,
+                                    vectors_lock_content,
+                                    vectors_lock_position,
+                                    vectors_options_dialog_callback,
+                                    private);
 
   g_object_weak_ref (G_OBJECT (dialog),
                      (GWeakNotify) vectors_options_dialog_free, private);
 
-  g_signal_connect (dialog, "response",
-                    G_CALLBACK (vectors_options_dialog_response),
-                    private);
-
-  hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
-  gtk_container_set_border_width (GTK_CONTAINER (hbox), 12);
-  gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))),
-                      hbox, TRUE, TRUE, 0);
-  gtk_widget_show (hbox);
-
-  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
-  gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
-  gtk_widget_show (vbox);
-
-  table = gtk_table_new (1, 2, FALSE);
-  gtk_table_set_col_spacings (GTK_TABLE (table), 6);
-  gtk_table_set_row_spacings (GTK_TABLE (table), 6);
-  gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
-  gtk_widget_show (table);
-
-  private->name_entry = gtk_entry_new ();
-  gtk_widget_set_size_request (private->name_entry, 150, -1);
-  gtk_entry_set_activates_default (GTK_ENTRY (private->name_entry), TRUE);
-  gimp_table_attach_aligned (GTK_TABLE (table), 0, 0,
-                             _("Path name:"), 0.0, 0.5,
-                             private->name_entry, 1, FALSE);
-
-  gtk_entry_set_text (GTK_ENTRY (private->name_entry), vectors_name);
-
   return dialog;
 }
 
 static void
-vectors_options_dialog_response (GtkWidget            *dialog,
-                                 gint                  response_id,
-                                 VectorsOptionsDialog *private)
+vectors_options_dialog_free (VectorsOptionsDialog *private)
 {
-  if (response_id == GTK_RESPONSE_OK)
-    {
-      const gchar *name = gtk_entry_get_text (GTK_ENTRY (private->name_entry));
-
-      private->callback (dialog,
-                         private->image,
-                         private->vectors,
-                         name,
-                         private->user_data);
-    }
-  else
-    {
-      gtk_widget_destroy (dialog);
-    }
+  g_slice_free (VectorsOptionsDialog, private);
 }
 
 static void
-vectors_options_dialog_free (VectorsOptionsDialog *private)
+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)
 {
-  g_slice_free (VectorsOptionsDialog, private);
+  VectorsOptionsDialog *private = user_data;
+
+  private->callback (dialog,
+                     image,
+                     GIMP_VECTORS (item),
+                     context,
+                     item_name,
+                     item_visible,
+                     item_linked,
+                     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 db8012e..1c6a213 100644
--- a/app/dialogs/vectors-options-dialog.h
+++ b/app/dialogs/vectors-options-dialog.h
@@ -22,7 +22,12 @@
 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);
 
 
@@ -36,6 +41,10 @@ GtkWidget * vectors_options_dialog_new (GimpImage                  *image,
                                         const gchar                *desc,
                                         const gchar                *help_id,
                                         const gchar                *vectors_name,
+                                        gboolean                    vectors_visible,
+                                        gboolean                    vectors_linked,
+                                        gboolean                    vectors_lock_content,
+                                        gboolean                    vectors_lock_position,
                                         GimpVectorsOptionsCallback  callback,
                                         gpointer                    user_data);
 
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 630e3ab..5d72d07 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -212,6 +212,7 @@ app/dialogs/image-new-dialog.c
 app/dialogs/image-properties-dialog.c
 app/dialogs/image-scale-dialog.c
 app/dialogs/input-devices-dialog.c
+app/dialogs/item-options-dialog.c
 app/dialogs/keyboard-shortcuts-dialog.c
 app/dialogs/layer-add-mask-dialog.c
 app/dialogs/layer-options-dialog.c



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