[gimp] app: derive the layer-mode menu layout entirely from the info arrays
- From: N/A <ell src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: derive the layer-mode menu layout entirely from the info arrays
- Date: Fri, 17 Feb 2017 11:36:25 +0000 (UTC)
commit e30d235edeb8380e42201888bc28ddc5af3e46e8
Author: Ell <ell_se yahoo com>
Date: Fri Feb 17 05:20:53 2017 -0500
app: derive the layer-mode menu layout entirely from the info arrays
Replace the 'with-behind' and 'with-replace' properties with a
single 'context' property, and use it to select the included
layer modes, according to their context mask.
Add a dummy GIMP_LAYER_MODE_SEPARATOR value to the GimpLayerMode
enum, and use it to explicitly mark the menu separators in the
layer-mode group arrays; add separators to the layer-mode menu
accordingly.
Update the rest of the code to use 'context' instead of 'with-behind'
and 'with-replace'. In particular, in the layers and layer options
dialogs, select the right context based on whether or not the
selected layer is a group.
app/dialogs/fade-dialog.c | 3 +-
app/dialogs/layer-options-dialog.c | 34 ++-
app/operations/layer-modes/gimp-layer-modes.c | 57 ++++
app/operations/operations-enums.h | 5 +-
app/tools/gimppaintoptions-gui.c | 3 +-
app/widgets/gimpbrushselect.c | 2 +-
app/widgets/gimplayermodebox.c | 97 ++++---
app/widgets/gimplayermodebox.h | 23 +-
app/widgets/gimplayermodecombobox.c | 368 +++++++------------------
app/widgets/gimplayermodecombobox.h | 21 +-
app/widgets/gimplayertreeview.c | 13 +-
app/widgets/gimppropwidgets.c | 20 +-
app/widgets/gimppropwidgets.h | 3 +-
13 files changed, 281 insertions(+), 368 deletions(-)
---
diff --git a/app/dialogs/fade-dialog.c b/app/dialogs/fade-dialog.c
index bf0746e..30bfaf4 100644
--- a/app/dialogs/fade-dialog.c
+++ b/app/dialogs/fade-dialog.c
@@ -152,7 +152,8 @@ fade_dialog_new (GimpImage *image,
/* the paint mode menu */
menu = gimp_prop_layer_mode_box_new (G_OBJECT (private->context),
- "paint-mode", TRUE, TRUE);
+ "paint-mode",
+ GIMP_LAYER_MODE_CONTEXT_FADE);
gimp_table_attach_aligned (GTK_TABLE (table), 0, table_row++,
_("_Mode:"), 0.0, 0.5,
menu, 2, FALSE);
diff --git a/app/dialogs/layer-options-dialog.c b/app/dialogs/layer-options-dialog.c
index e92934b..857b377 100644
--- a/app/dialogs/layer-options-dialog.c
+++ b/app/dialogs/layer-options-dialog.c
@@ -121,19 +121,20 @@ layer_options_dialog_new (GimpImage *image,
GimpLayerOptionsCallback callback,
gpointer user_data)
{
- LayerOptionsDialog *private;
- GtkWidget *dialog;
- GtkWidget *table;
- GtkListStore *space_model;
- GtkWidget *combo;
- GtkWidget *scale;
- GtkWidget *label;
- GtkAdjustment *adjustment;
- GtkWidget *spinbutton;
- GtkWidget *button;
- gdouble xres;
- gdouble yres;
- gint row = 0;
+ LayerOptionsDialog *private;
+ GtkWidget *dialog;
+ GtkWidget *table;
+ GtkListStore *space_model;
+ GtkWidget *combo;
+ GtkWidget *scale;
+ GtkWidget *label;
+ GtkAdjustment *adjustment;
+ GtkWidget *spinbutton;
+ GtkWidget *button;
+ GimpLayerModeContext mode_context;
+ gdouble xres;
+ gdouble yres;
+ gint row = 0;
g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
g_return_val_if_fail (layer == NULL || GIMP_IS_LAYER (layer), NULL);
@@ -176,7 +177,12 @@ layer_options_dialog_new (GimpImage *image,
g_object_weak_ref (G_OBJECT (dialog),
(GWeakNotify) layer_options_dialog_free, private);
- private->mode_box = gimp_layer_mode_box_new (FALSE, FALSE);
+ if (! layer || gimp_viewable_get_children (GIMP_VIEWABLE (layer)) == NULL)
+ mode_context = GIMP_LAYER_MODE_CONTEXT_LAYER;
+ else
+ mode_context = GIMP_LAYER_MODE_CONTEXT_GROUP;
+
+ private->mode_box = gimp_layer_mode_box_new (mode_context);
item_options_dialog_add_widget (dialog, _("_Mode:"), private->mode_box);
gimp_layer_mode_box_set_mode (GIMP_LAYER_MODE_BOX (private->mode_box),
private->mode);
diff --git a/app/operations/layer-modes/gimp-layer-modes.c b/app/operations/layer-modes/gimp-layer-modes.c
index 33cba31..405b80a 100644
--- a/app/operations/layer-modes/gimp-layer-modes.c
+++ b/app/operations/layer-modes/gimp-layer-modes.c
@@ -1104,7 +1104,14 @@ static const GimpLayerModeInfo layer_mode_infos[] =
static const GimpLayerMode layer_mode_group_default[] =
{
GIMP_LAYER_MODE_NORMAL,
+ GIMP_LAYER_MODE_REPLACE,
GIMP_LAYER_MODE_DISSOLVE,
+ GIMP_LAYER_MODE_BEHIND,
+ GIMP_LAYER_MODE_COLOR_ERASE,
+ GIMP_LAYER_MODE_ERASE,
+ GIMP_LAYER_MODE_ANTI_ERASE,
+
+ GIMP_LAYER_MODE_SEPARATOR,
GIMP_LAYER_MODE_LIGHTEN_ONLY,
GIMP_LAYER_MODE_LUMINANCE_LIGHTEN_ONLY,
@@ -1112,11 +1119,15 @@ static const GimpLayerMode layer_mode_group_default[] =
GIMP_LAYER_MODE_DODGE,
GIMP_LAYER_MODE_ADDITION,
+ GIMP_LAYER_MODE_SEPARATOR,
+
GIMP_LAYER_MODE_DARKEN_ONLY,
GIMP_LAYER_MODE_LUMINANCE_DARKEN_ONLY,
GIMP_LAYER_MODE_MULTIPLY,
GIMP_LAYER_MODE_BURN,
+ GIMP_LAYER_MODE_SEPARATOR,
+
GIMP_LAYER_MODE_OVERLAY,
GIMP_LAYER_MODE_SOFTLIGHT,
GIMP_LAYER_MODE_HARDLIGHT,
@@ -1125,17 +1136,23 @@ static const GimpLayerMode layer_mode_group_default[] =
GIMP_LAYER_MODE_LINEAR_LIGHT,
GIMP_LAYER_MODE_HARD_MIX,
+ GIMP_LAYER_MODE_SEPARATOR,
+
GIMP_LAYER_MODE_DIFFERENCE,
GIMP_LAYER_MODE_SUBTRACT,
GIMP_LAYER_MODE_GRAIN_EXTRACT,
GIMP_LAYER_MODE_GRAIN_MERGE,
GIMP_LAYER_MODE_DIVIDE,
+ GIMP_LAYER_MODE_SEPARATOR,
+
GIMP_LAYER_MODE_LCH_HUE,
GIMP_LAYER_MODE_LCH_CHROMA,
GIMP_LAYER_MODE_LCH_COLOR,
GIMP_LAYER_MODE_LCH_LIGHTNESS,
+ GIMP_LAYER_MODE_SEPARATOR,
+
GIMP_LAYER_MODE_EXCLUSION,
GIMP_LAYER_MODE_LINEAR_BURN
};
@@ -1143,7 +1160,13 @@ static const GimpLayerMode layer_mode_group_default[] =
static const GimpLayerMode layer_mode_group_linear[] =
{
GIMP_LAYER_MODE_NORMAL_LINEAR,
+ GIMP_LAYER_MODE_REPLACE,
GIMP_LAYER_MODE_DISSOLVE,
+ GIMP_LAYER_MODE_BEHIND_LINEAR,
+ GIMP_LAYER_MODE_ERASE,
+ GIMP_LAYER_MODE_ANTI_ERASE,
+
+ GIMP_LAYER_MODE_SEPARATOR,
GIMP_LAYER_MODE_LIGHTEN_ONLY,
GIMP_LAYER_MODE_LUMINANCE_LIGHTEN_ONLY,
@@ -1151,11 +1174,15 @@ static const GimpLayerMode layer_mode_group_linear[] =
GIMP_LAYER_MODE_DODGE_LINEAR,
GIMP_LAYER_MODE_ADDITION_LINEAR,
+ GIMP_LAYER_MODE_SEPARATOR,
+
GIMP_LAYER_MODE_DARKEN_ONLY,
GIMP_LAYER_MODE_LUMINANCE_DARKEN_ONLY,
GIMP_LAYER_MODE_MULTIPLY_LINEAR,
GIMP_LAYER_MODE_BURN_LINEAR,
+ GIMP_LAYER_MODE_SEPARATOR,
+
GIMP_LAYER_MODE_OVERLAY_LINEAR,
GIMP_LAYER_MODE_SOFTLIGHT_LINEAR,
GIMP_LAYER_MODE_HARDLIGHT_LINEAR,
@@ -1164,12 +1191,16 @@ static const GimpLayerMode layer_mode_group_linear[] =
GIMP_LAYER_MODE_LINEAR_LIGHT_LINEAR,
GIMP_LAYER_MODE_HARD_MIX_LINEAR,
+ GIMP_LAYER_MODE_SEPARATOR,
+
GIMP_LAYER_MODE_DIFFERENCE_LINEAR,
GIMP_LAYER_MODE_SUBTRACT_LINEAR,
GIMP_LAYER_MODE_GRAIN_EXTRACT_LINEAR,
GIMP_LAYER_MODE_GRAIN_MERGE_LINEAR,
GIMP_LAYER_MODE_DIVIDE_LINEAR,
+ GIMP_LAYER_MODE_SEPARATOR,
+
GIMP_LAYER_MODE_EXCLUSION_LINEAR,
GIMP_LAYER_MODE_LINEAR_BURN_LINEAR
};
@@ -1178,6 +1209,10 @@ static const GimpLayerMode layer_mode_group_perceptual[] =
{
GIMP_LAYER_MODE_NORMAL,
GIMP_LAYER_MODE_DISSOLVE,
+ GIMP_LAYER_MODE_BEHIND,
+ GIMP_LAYER_MODE_COLOR_ERASE,
+
+ GIMP_LAYER_MODE_SEPARATOR,
GIMP_LAYER_MODE_LIGHTEN_ONLY,
GIMP_LAYER_MODE_LUMA_LIGHTEN_ONLY,
@@ -1185,11 +1220,15 @@ static const GimpLayerMode layer_mode_group_perceptual[] =
GIMP_LAYER_MODE_DODGE,
GIMP_LAYER_MODE_ADDITION,
+ GIMP_LAYER_MODE_SEPARATOR,
+
GIMP_LAYER_MODE_DARKEN_ONLY,
GIMP_LAYER_MODE_LUMA_DARKEN_ONLY,
GIMP_LAYER_MODE_MULTIPLY,
GIMP_LAYER_MODE_BURN,
+ GIMP_LAYER_MODE_SEPARATOR,
+
GIMP_LAYER_MODE_OVERLAY,
GIMP_LAYER_MODE_SOFTLIGHT,
GIMP_LAYER_MODE_HARDLIGHT,
@@ -1198,22 +1237,30 @@ static const GimpLayerMode layer_mode_group_perceptual[] =
GIMP_LAYER_MODE_LINEAR_LIGHT,
GIMP_LAYER_MODE_HARD_MIX,
+ GIMP_LAYER_MODE_SEPARATOR,
+
GIMP_LAYER_MODE_DIFFERENCE,
GIMP_LAYER_MODE_SUBTRACT,
GIMP_LAYER_MODE_GRAIN_EXTRACT,
GIMP_LAYER_MODE_GRAIN_MERGE,
GIMP_LAYER_MODE_DIVIDE,
+ GIMP_LAYER_MODE_SEPARATOR,
+
GIMP_LAYER_MODE_HSV_HUE,
GIMP_LAYER_MODE_HSV_SATURATION,
GIMP_LAYER_MODE_HSV_COLOR,
GIMP_LAYER_MODE_HSV_VALUE,
+ GIMP_LAYER_MODE_SEPARATOR,
+
GIMP_LAYER_MODE_LCH_HUE,
GIMP_LAYER_MODE_LCH_CHROMA,
GIMP_LAYER_MODE_LCH_COLOR,
GIMP_LAYER_MODE_LCH_LIGHTNESS,
+ GIMP_LAYER_MODE_SEPARATOR,
+
GIMP_LAYER_MODE_EXCLUSION,
GIMP_LAYER_MODE_LINEAR_BURN
};
@@ -1223,24 +1270,34 @@ static const GimpLayerMode layer_mode_group_legacy[] =
GIMP_LAYER_MODE_NORMAL,
GIMP_LAYER_MODE_DISSOLVE,
+ GIMP_LAYER_MODE_SEPARATOR,
+
GIMP_LAYER_MODE_LIGHTEN_ONLY_LEGACY,
GIMP_LAYER_MODE_SCREEN_LEGACY,
GIMP_LAYER_MODE_DODGE_LEGACY,
GIMP_LAYER_MODE_ADDITION_LEGACY,
+ GIMP_LAYER_MODE_SEPARATOR,
+
GIMP_LAYER_MODE_DARKEN_ONLY_LEGACY,
GIMP_LAYER_MODE_MULTIPLY_LEGACY,
GIMP_LAYER_MODE_BURN_LEGACY,
+ GIMP_LAYER_MODE_SEPARATOR,
+
GIMP_LAYER_MODE_SOFTLIGHT_LEGACY,
GIMP_LAYER_MODE_HARDLIGHT_LEGACY,
+ GIMP_LAYER_MODE_SEPARATOR,
+
GIMP_LAYER_MODE_DIFFERENCE_LEGACY,
GIMP_LAYER_MODE_SUBTRACT_LEGACY,
GIMP_LAYER_MODE_GRAIN_EXTRACT_LEGACY,
GIMP_LAYER_MODE_GRAIN_MERGE_LEGACY,
GIMP_LAYER_MODE_DIVIDE_LEGACY,
+ GIMP_LAYER_MODE_SEPARATOR,
+
GIMP_LAYER_MODE_HSV_HUE_LEGACY,
GIMP_LAYER_MODE_HSV_SATURATION_LEGACY,
GIMP_LAYER_MODE_HSV_COLOR_LEGACY,
diff --git a/app/operations/operations-enums.h b/app/operations/operations-enums.h
index 8d235e4..88016f6 100644
--- a/app/operations/operations-enums.h
+++ b/app/operations/operations-enums.h
@@ -140,7 +140,10 @@ typedef enum
/* Internal modes, not available to the PDB, must be kept at the end */
GIMP_LAYER_MODE_ERASE, /*< pdb-skip, desc="Erase" >*/
GIMP_LAYER_MODE_REPLACE, /*< pdb-skip, desc="Replace" >*/
- GIMP_LAYER_MODE_ANTI_ERASE /*< pdb-skip, desc="Anti erase" >*/
+ GIMP_LAYER_MODE_ANTI_ERASE, /*< pdb-skip, desc="Anti erase" >*/
+
+ /* Layer mode menu separator */
+ GIMP_LAYER_MODE_SEPARATOR = -1 /*< pdb-skip, skip >*/
} GimpLayerMode;
diff --git a/app/tools/gimppaintoptions-gui.c b/app/tools/gimppaintoptions-gui.c
index 6971cfa..8b8b9f3 100644
--- a/app/tools/gimppaintoptions-gui.c
+++ b/app/tools/gimppaintoptions-gui.c
@@ -114,7 +114,8 @@ gimp_paint_options_gui (GimpToolOptions *tool_options)
tool_type = tool_options->tool_info->tool_type;
/* the paint mode menu */
- menu = gimp_prop_layer_mode_box_new (config, "paint-mode", TRUE, FALSE);
+ menu = gimp_prop_layer_mode_box_new (config, "paint-mode",
+ GIMP_LAYER_MODE_CONTEXT_PAINT);
gimp_layer_mode_box_set_label (GIMP_LAYER_MODE_BOX (menu), _("Mode"));
gimp_layer_mode_box_set_ellipsize (GIMP_LAYER_MODE_BOX (menu),
PANGO_ELLIPSIZE_END);
diff --git a/app/widgets/gimpbrushselect.c b/app/widgets/gimpbrushselect.c
index 6f1f733..e15168f 100644
--- a/app/widgets/gimpbrushselect.c
+++ b/app/widgets/gimpbrushselect.c
@@ -189,7 +189,7 @@ gimp_brush_select_constructed (GObject *object)
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
gtk_widget_show (label);
- select->layer_mode_box = gimp_layer_mode_box_new (TRUE, FALSE);
+ select->layer_mode_box = gimp_layer_mode_box_new (GIMP_LAYER_MODE_CONTEXT_PAINT);
gtk_box_pack_start (GTK_BOX (hbox), select->layer_mode_box, TRUE, TRUE, 0);
gtk_widget_show (select->layer_mode_box);
diff --git a/app/widgets/gimplayermodebox.c b/app/widgets/gimplayermodebox.c
index 0b06e27..dab37e9 100644
--- a/app/widgets/gimplayermodebox.c
+++ b/app/widgets/gimplayermodebox.c
@@ -48,20 +48,18 @@
enum
{
PROP_0,
- PROP_LAYER_MODE,
- PROP_WITH_BEHIND,
- PROP_WITH_REPLACE
+ PROP_CONTEXT,
+ PROP_LAYER_MODE
};
struct _GimpLayerModeBoxPrivate
{
- GimpLayerMode layer_mode;
- gboolean with_behind;
- gboolean with_replace;
+ GimpLayerModeContext context;
+ GimpLayerMode layer_mode;
- GtkWidget *mode_combo;
- GtkWidget *group_combo;
+ GtkWidget *mode_combo;
+ GtkWidget *group_combo;
};
@@ -91,6 +89,14 @@ gimp_layer_mode_box_class_init (GimpLayerModeBoxClass *klass)
object_class->set_property = gimp_layer_mode_box_set_property;
object_class->get_property = gimp_layer_mode_box_get_property;
+ g_object_class_install_property (object_class, PROP_CONTEXT,
+ g_param_spec_flags ("context",
+ NULL, NULL,
+ GIMP_TYPE_LAYER_MODE_CONTEXT,
+ GIMP_LAYER_MODE_CONTEXT_ALL,
+ GIMP_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT));
+
g_object_class_install_property (object_class, PROP_LAYER_MODE,
g_param_spec_enum ("layer-mode",
NULL, NULL,
@@ -99,20 +105,6 @@ gimp_layer_mode_box_class_init (GimpLayerModeBoxClass *klass)
GIMP_PARAM_READWRITE |
G_PARAM_CONSTRUCT));
- g_object_class_install_property (object_class, PROP_WITH_BEHIND,
- g_param_spec_boolean ("with-behind",
- NULL, NULL,
- FALSE,
- GIMP_PARAM_READWRITE |
- G_PARAM_CONSTRUCT_ONLY));
-
- g_object_class_install_property (object_class, PROP_WITH_REPLACE,
- g_param_spec_boolean ("with-replace",
- NULL, NULL,
- FALSE,
- GIMP_PARAM_READWRITE |
- G_PARAM_CONSTRUCT_ONLY));
-
g_type_class_add_private (klass, sizeof (GimpLayerModeBoxPrivate));
}
@@ -142,11 +134,15 @@ gimp_layer_mode_box_constructed (GObject *object)
G_OBJECT_CLASS (parent_class)->constructed (object);
box->priv->mode_combo = mode_combo =
- gimp_layer_mode_combo_box_new (box->priv->with_behind,
- box->priv->with_replace);
+ gimp_layer_mode_combo_box_new (box->priv->context);
gtk_box_pack_start (GTK_BOX (box), mode_combo, TRUE, TRUE, 0);
gtk_widget_show (mode_combo);
+ g_object_bind_property (object, "context",
+ G_OBJECT (mode_combo), "context",
+ G_BINDING_BIDIRECTIONAL |
+ G_BINDING_SYNC_CREATE);
+
g_object_bind_property (object, "layer-mode",
G_OBJECT (mode_combo), "layer-mode",
G_BINDING_BIDIRECTIONAL |
@@ -202,16 +198,12 @@ gimp_layer_mode_box_set_property (GObject *object,
switch (prop_id)
{
- case PROP_LAYER_MODE:
- gimp_layer_mode_box_set_mode (box, g_value_get_enum (value));
+ case PROP_CONTEXT:
+ gimp_layer_mode_box_set_context (box, g_value_get_flags (value));
break;
- case PROP_WITH_BEHIND:
- box->priv->with_behind = g_value_get_boolean (value);
- break;
-
- case PROP_WITH_REPLACE:
- box->priv->with_replace = g_value_get_boolean (value);
+ case PROP_LAYER_MODE:
+ gimp_layer_mode_box_set_mode (box, g_value_get_enum (value));
break;
default:
@@ -230,16 +222,12 @@ gimp_layer_mode_box_get_property (GObject *object,
switch (prop_id)
{
- case PROP_LAYER_MODE:
- g_value_set_enum (value, box->priv->layer_mode);
- break;
-
- case PROP_WITH_BEHIND:
- g_value_set_boolean (value, box->priv->with_behind);
+ case PROP_CONTEXT:
+ g_value_set_flags (value, box->priv->context);
break;
- case PROP_WITH_REPLACE:
- g_value_set_boolean (value, box->priv->with_replace);
+ case PROP_LAYER_MODE:
+ g_value_set_enum (value, box->priv->layer_mode);
break;
default:
@@ -256,16 +244,37 @@ gimp_layer_mode_box_get_property (GObject *object,
* Return value: a new #GimpLayerModeBox.
**/
GtkWidget *
-gimp_layer_mode_box_new (gboolean with_behind,
- gboolean with_replace)
+gimp_layer_mode_box_new (GimpLayerModeContext context)
{
return g_object_new (GIMP_TYPE_LAYER_MODE_BOX,
- "with-behind", with_behind,
- "with-replace", with_replace,
+ "context", context,
NULL);
}
void
+gimp_layer_mode_box_set_context (GimpLayerModeBox *box,
+ GimpLayerModeContext context)
+{
+ g_return_if_fail (GIMP_IS_LAYER_MODE_BOX (box));
+
+ if (context != box->priv->context)
+ {
+ box->priv->context = context;
+
+ g_object_notify (G_OBJECT (box), "context");
+ }
+}
+
+GimpLayerModeContext
+gimp_layer_mode_box_get_context (GimpLayerModeBox *box)
+{
+ g_return_val_if_fail (GIMP_IS_LAYER_MODE_BOX (box),
+ GIMP_LAYER_MODE_CONTEXT_ALL);
+
+ return box->priv->context;
+}
+
+void
gimp_layer_mode_box_set_mode (GimpLayerModeBox *box,
GimpLayerMode mode)
{
diff --git a/app/widgets/gimplayermodebox.h b/app/widgets/gimplayermodebox.h
index c6ab35f..99060a8 100644
--- a/app/widgets/gimplayermodebox.h
+++ b/app/widgets/gimplayermodebox.h
@@ -46,19 +46,22 @@ struct _GimpLayerModeBoxClass
};
-GType gimp_layer_mode_box_get_type (void) G_GNUC_CONST;
+GType gimp_layer_mode_box_get_type (void) G_GNUC_CONST;
-GtkWidget * gimp_layer_mode_box_new (gboolean with_behind,
- gboolean with_replace);
+GtkWidget * gimp_layer_mode_box_new (GimpLayerModeContext context);
-void gimp_layer_mode_box_set_mode (GimpLayerModeBox *box,
- GimpLayerMode mode);
-GimpLayerMode gimp_layer_mode_box_get_mode (GimpLayerModeBox *box);
+void gimp_layer_mode_box_set_context (GimpLayerModeBox *box,
+ GimpLayerModeContext context);
+GimpLayerModeContext gimp_layer_mode_box_get_context (GimpLayerModeBox *box);
-void gimp_layer_mode_box_set_label (GimpLayerModeBox *box,
- const gchar *label);
-void gimp_layer_mode_box_set_ellipsize (GimpLayerModeBox *box,
- PangoEllipsizeMode mode);
+void gimp_layer_mode_box_set_mode (GimpLayerModeBox *box,
+ GimpLayerMode mode);
+GimpLayerMode gimp_layer_mode_box_get_mode (GimpLayerModeBox *box);
+
+void gimp_layer_mode_box_set_label (GimpLayerModeBox *box,
+ const gchar *label);
+void gimp_layer_mode_box_set_ellipsize (GimpLayerModeBox *box,
+ PangoEllipsizeMode mode);
#endif /* __GIMP_LAYER_MODE_BOX_H__ */
diff --git a/app/widgets/gimplayermodecombobox.c b/app/widgets/gimplayermodecombobox.c
index 60ea38d..0eab9e0 100644
--- a/app/widgets/gimplayermodecombobox.c
+++ b/app/widgets/gimplayermodecombobox.c
@@ -45,19 +45,17 @@
enum
{
PROP_0,
+ PROP_CONTEXT,
PROP_LAYER_MODE,
- PROP_GROUP,
- PROP_WITH_BEHIND,
- PROP_WITH_REPLACE
+ PROP_GROUP
};
struct _GimpLayerModeComboBoxPrivate
{
- GimpLayerMode layer_mode;
- GimpLayerModeGroup group;
- gboolean with_behind;
- gboolean with_replace;
+ GimpLayerModeContext context;
+ GimpLayerMode layer_mode;
+ GimpLayerModeGroup group;
};
@@ -75,12 +73,6 @@ static void gimp_layer_mode_combo_box_changed (GtkComboBox
static void gimp_layer_mode_combo_box_update_model (GimpLayerModeComboBox *combo,
gboolean change_mode);
-static void gimp_layer_mode_combo_box_insert_value (GtkListStore *store,
- gint after,
- gint insert_value);
-static void gimp_layer_mode_combo_box_insert_separator (GtkListStore *store,
- gint after,
- gint separator_value);
static gboolean gimp_layer_mode_combo_box_separator_func (GtkTreeModel *model,
GtkTreeIter *iter,
gpointer data);
@@ -104,6 +96,14 @@ gimp_layer_mode_combo_box_class_init (GimpLayerModeComboBoxClass *klass)
combo_class->changed = gimp_layer_mode_combo_box_changed;
+ g_object_class_install_property (object_class, PROP_CONTEXT,
+ g_param_spec_flags ("context",
+ NULL, NULL,
+ GIMP_TYPE_LAYER_MODE_CONTEXT,
+ GIMP_LAYER_MODE_CONTEXT_ALL,
+ GIMP_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT));
+
g_object_class_install_property (object_class, PROP_LAYER_MODE,
g_param_spec_enum ("layer-mode",
NULL, NULL,
@@ -120,20 +120,6 @@ gimp_layer_mode_combo_box_class_init (GimpLayerModeComboBoxClass *klass)
GIMP_PARAM_READWRITE |
G_PARAM_CONSTRUCT));
- g_object_class_install_property (object_class, PROP_WITH_BEHIND,
- g_param_spec_boolean ("with-behind",
- NULL, NULL,
- FALSE,
- GIMP_PARAM_READWRITE |
- G_PARAM_CONSTRUCT_ONLY));
-
- g_object_class_install_property (object_class, PROP_WITH_REPLACE,
- g_param_spec_boolean ("with-replace",
- NULL, NULL,
- FALSE,
- GIMP_PARAM_READWRITE |
- G_PARAM_CONSTRUCT_ONLY));
-
g_type_class_add_private (klass, sizeof (GimpLayerModeComboBoxPrivate));
}
@@ -146,7 +132,7 @@ gimp_layer_mode_combo_box_init (GimpLayerModeComboBox *combo)
gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combo),
gimp_layer_mode_combo_box_separator_func,
- GINT_TO_POINTER (-1),
+ GINT_TO_POINTER (GIMP_LAYER_MODE_SEPARATOR),
NULL);
}
@@ -173,6 +159,10 @@ gimp_layer_mode_combo_box_set_property (GObject *object,
switch (prop_id)
{
+ case PROP_CONTEXT:
+ gimp_layer_mode_combo_box_set_context (combo, g_value_get_flags (value));
+ break;
+
case PROP_LAYER_MODE:
gimp_layer_mode_combo_box_set_mode (combo, g_value_get_enum (value));
break;
@@ -181,14 +171,6 @@ gimp_layer_mode_combo_box_set_property (GObject *object,
gimp_layer_mode_combo_box_set_group (combo, g_value_get_enum (value));
break;
- case PROP_WITH_BEHIND:
- combo->priv->with_behind = g_value_get_boolean (value);
- break;
-
- case PROP_WITH_REPLACE:
- combo->priv->with_replace = g_value_get_boolean (value);
- break;
-
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -205,6 +187,10 @@ gimp_layer_mode_combo_box_get_property (GObject *object,
switch (prop_id)
{
+ case PROP_CONTEXT:
+ g_value_set_flags (value, combo->priv->context);
+ break;
+
case PROP_LAYER_MODE:
g_value_set_enum (value, combo->priv->layer_mode);
break;
@@ -213,14 +199,6 @@ gimp_layer_mode_combo_box_get_property (GObject *object,
g_value_set_enum (value, combo->priv->group);
break;
- case PROP_WITH_BEHIND:
- g_value_set_boolean (value, combo->priv->with_behind);
- break;
-
- case PROP_WITH_REPLACE:
- g_value_set_boolean (value, combo->priv->with_replace);
- break;
-
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -250,20 +228,47 @@ gimp_layer_mode_combo_box_changed (GtkComboBox *gtk_combo)
* Return value: a new #GimpLayerModeComboBox.
**/
GtkWidget *
-gimp_layer_mode_combo_box_new (gboolean with_behind,
- gboolean with_replace)
+gimp_layer_mode_combo_box_new (GimpLayerModeContext context)
{
return g_object_new (GIMP_TYPE_LAYER_MODE_COMBO_BOX,
- "with-behind", with_behind,
- "with-replace", with_replace,
+ "context", context,
NULL);
}
void
+gimp_layer_mode_combo_box_set_context (GimpLayerModeComboBox *combo,
+ GimpLayerModeContext context)
+{
+ g_return_if_fail (GIMP_IS_LAYER_MODE_COMBO_BOX (combo));
+
+ if (context != combo->priv->context)
+ {
+ g_object_freeze_notify (G_OBJECT (combo));
+
+ combo->priv->context = context;
+ g_object_notify (G_OBJECT (combo), "context");
+
+ gimp_layer_mode_combo_box_update_model (combo, TRUE);
+
+ g_object_thaw_notify (G_OBJECT (combo));
+ }
+}
+
+GimpLayerModeContext
+gimp_layer_mode_combo_box_get_context (GimpLayerModeComboBox *combo)
+{
+ g_return_val_if_fail (GIMP_IS_LAYER_MODE_COMBO_BOX (combo),
+ GIMP_LAYER_MODE_CONTEXT_ALL);
+
+ return combo->priv->context;
+}
+
+void
gimp_layer_mode_combo_box_set_mode (GimpLayerModeComboBox *combo,
GimpLayerMode mode)
{
g_return_if_fail (GIMP_IS_LAYER_MODE_COMBO_BOX (combo));
+ g_return_if_fail (gimp_layer_mode_get_context (mode) & combo->priv->context);
if (mode != combo->priv->layer_mode)
{
@@ -350,13 +355,26 @@ gimp_enum_store_add_value (GtkListStore *store,
g_free (stripped);
}
+static void
+gimp_enum_store_add_separator (GtkListStore *store)
+{
+ GtkTreeIter iter = { 0, };
+
+ gtk_list_store_append (store, &iter);
+ gtk_list_store_set (store, &iter,
+ GIMP_INT_STORE_VALUE, GIMP_LAYER_MODE_SEPARATOR,
+ -1);
+}
+
static GtkListStore *
-gimp_enum_store_new_from_array (GType enum_type,
- gint n_values,
- const gint *values)
+gimp_enum_store_new_from_array (GType enum_type,
+ gint n_values,
+ const gint *values,
+ GimpLayerModeContext context)
{
GtkListStore *store;
GEnumValue *value;
+ gboolean added_values_since_last_separator = FALSE;
gint i;
g_return_val_if_fail (G_TYPE_IS_ENUM (enum_type), NULL);
@@ -369,154 +387,33 @@ gimp_enum_store_new_from_array (GType enum_type,
for (i = 0; i < n_values; i++)
{
- value = g_enum_get_value (GIMP_ENUM_STORE (store)->enum_class, values[i]);
- if (value)
- gimp_enum_store_add_value (store, value);
- }
-
- return store;
-}
-
-static void
-gimp_layer_mode_combo_box_fix_default_store (GimpLayerModeComboBox *combo,
- GtkListStore *store)
-{
- gimp_layer_mode_combo_box_insert_separator (store,
- GIMP_LAYER_MODE_DISSOLVE, -1);
-
- gimp_layer_mode_combo_box_insert_separator (store,
- GIMP_LAYER_MODE_ADDITION, -1);
-
- gimp_layer_mode_combo_box_insert_separator (store,
- GIMP_LAYER_MODE_BURN, -1);
-
- gimp_layer_mode_combo_box_insert_separator (store,
- GIMP_LAYER_MODE_HARD_MIX, -1);
-
- gimp_layer_mode_combo_box_insert_separator (store,
- GIMP_LAYER_MODE_DIVIDE, -1);
-
- gimp_layer_mode_combo_box_insert_separator (store,
- GIMP_LAYER_MODE_LCH_LIGHTNESS, -1);
-
- if (combo->priv->with_behind)
- {
- gimp_layer_mode_combo_box_insert_value (store,
- GIMP_LAYER_MODE_DISSOLVE,
- GIMP_LAYER_MODE_BEHIND);
- gimp_layer_mode_combo_box_insert_value (store,
- GIMP_LAYER_MODE_BEHIND,
- GIMP_LAYER_MODE_COLOR_ERASE);
- }
-
- if (combo->priv->with_replace)
- {
- gimp_layer_mode_combo_box_insert_value (store,
- GIMP_LAYER_MODE_NORMAL,
- GIMP_LAYER_MODE_REPLACE);
- gimp_layer_mode_combo_box_insert_value (store,
- GIMP_LAYER_MODE_COLOR_ERASE,
- GIMP_LAYER_MODE_ERASE);
- gimp_layer_mode_combo_box_insert_value (store,
- GIMP_LAYER_MODE_ERASE,
- GIMP_LAYER_MODE_ANTI_ERASE);
- }
-}
-
-static void
-gimp_layer_mode_combo_box_fix_linear_store (GimpLayerModeComboBox *combo,
- GtkListStore *store)
-{
- gimp_layer_mode_combo_box_insert_separator (store,
- GIMP_LAYER_MODE_DISSOLVE, -1);
-
- gimp_layer_mode_combo_box_insert_separator (store,
- GIMP_LAYER_MODE_ADDITION_LINEAR, -1);
-
- gimp_layer_mode_combo_box_insert_separator (store,
- GIMP_LAYER_MODE_BURN_LINEAR, -1);
-
- gimp_layer_mode_combo_box_insert_separator (store,
- GIMP_LAYER_MODE_HARD_MIX_LINEAR, -1);
-
- gimp_layer_mode_combo_box_insert_separator (store,
- GIMP_LAYER_MODE_DIVIDE_LINEAR, -1);
-
- if (combo->priv->with_behind)
- {
- gimp_layer_mode_combo_box_insert_value (store,
- GIMP_LAYER_MODE_DISSOLVE,
- GIMP_LAYER_MODE_BEHIND_LINEAR);
- }
-
- if (combo->priv->with_replace)
- {
- gimp_layer_mode_combo_box_insert_value (store,
- GIMP_LAYER_MODE_NORMAL_LINEAR,
- GIMP_LAYER_MODE_REPLACE);
- gimp_layer_mode_combo_box_insert_value (store,
- GIMP_LAYER_MODE_REPLACE,
- GIMP_LAYER_MODE_ERASE);
- gimp_layer_mode_combo_box_insert_value (store,
- GIMP_LAYER_MODE_ERASE,
- GIMP_LAYER_MODE_ANTI_ERASE);
- }
-}
-
-static void
-gimp_layer_mode_combo_box_fix_perceptual_store (GimpLayerModeComboBox *combo,
- GtkListStore *store)
-{
- gimp_layer_mode_combo_box_insert_separator (store,
- GIMP_LAYER_MODE_DISSOLVE, -1);
-
- gimp_layer_mode_combo_box_insert_separator (store,
- GIMP_LAYER_MODE_ADDITION, -1);
-
- gimp_layer_mode_combo_box_insert_separator (store,
- GIMP_LAYER_MODE_BURN, -1);
-
- gimp_layer_mode_combo_box_insert_separator (store,
- GIMP_LAYER_MODE_HARD_MIX, -1);
-
- gimp_layer_mode_combo_box_insert_separator (store,
- GIMP_LAYER_MODE_DIVIDE, -1);
-
- gimp_layer_mode_combo_box_insert_separator (store,
- GIMP_LAYER_MODE_HSV_VALUE, -1);
-
- gimp_layer_mode_combo_box_insert_separator (store,
- GIMP_LAYER_MODE_LCH_LIGHTNESS, -1);
+ if (values[i] != GIMP_LAYER_MODE_SEPARATOR)
+ {
+ if (gimp_layer_mode_get_context (values[i]) & context)
+ {
+ value = g_enum_get_value (GIMP_ENUM_STORE (store)->enum_class,
+ values[i]);
+
+ if (value)
+ {
+ gimp_enum_store_add_value (store, value);
+
+ added_values_since_last_separator = TRUE;
+ }
+ }
+ }
+ else
+ {
+ if (added_values_since_last_separator)
+ {
+ gimp_enum_store_add_separator (store);
- if (combo->priv->with_behind)
- {
- gimp_layer_mode_combo_box_insert_value (store,
- GIMP_LAYER_MODE_DISSOLVE,
- GIMP_LAYER_MODE_BEHIND);
- gimp_layer_mode_combo_box_insert_value (store,
- GIMP_LAYER_MODE_BEHIND,
- GIMP_LAYER_MODE_COLOR_ERASE);
+ added_values_since_last_separator = FALSE;
+ }
+ }
}
-}
-static void
-gimp_layer_mode_combo_box_fix_legacy_store (GimpLayerModeComboBox *combo,
- GtkListStore *store)
-{
- gimp_layer_mode_combo_box_insert_separator (store,
- GIMP_LAYER_MODE_DISSOLVE, -1);
-
- gimp_layer_mode_combo_box_insert_separator (store,
- GIMP_LAYER_MODE_ADDITION_LEGACY, -1);
-
- gimp_layer_mode_combo_box_insert_separator (store,
- GIMP_LAYER_MODE_BURN_LEGACY, -1);
-
- gimp_layer_mode_combo_box_insert_separator (store,
- GIMP_LAYER_MODE_HARDLIGHT_LEGACY, -1);
-
- gimp_layer_mode_combo_box_insert_separator (store,
- GIMP_LAYER_MODE_DIVIDE_LEGACY, -1);
+ return store;
}
static void
@@ -529,29 +426,8 @@ gimp_layer_mode_combo_box_update_model (GimpLayerModeComboBox *combo,
modes = gimp_layer_mode_get_group_array (combo->priv->group, &n_modes);
store = gimp_enum_store_new_from_array (GIMP_TYPE_LAYER_MODE,
- n_modes, (gint *) modes);
-
- switch (combo->priv->group)
- {
- case GIMP_LAYER_MODE_GROUP_DEFAULT:
- gimp_layer_mode_combo_box_fix_default_store (combo, store);
- break;
-
- case GIMP_LAYER_MODE_GROUP_LINEAR:
- gimp_layer_mode_combo_box_fix_linear_store (combo, store);
- break;
-
- case GIMP_LAYER_MODE_GROUP_PERCEPTUAL:
- gimp_layer_mode_combo_box_fix_perceptual_store (combo, store);
- break;
-
- case GIMP_LAYER_MODE_GROUP_LEGACY:
- gimp_layer_mode_combo_box_fix_legacy_store (combo, store);
- break;
-
- default:
- g_return_if_reached ();
- }
+ n_modes, (gint *) modes,
+ combo->priv->context);
gtk_combo_box_set_model (GTK_COMBO_BOX (combo), GTK_TREE_MODEL (store));
g_object_unref (store);
@@ -577,60 +453,6 @@ gimp_layer_mode_combo_box_update_model (GimpLayerModeComboBox *combo,
}
}
-static void
-gimp_layer_mode_combo_box_insert_value (GtkListStore *store,
- gint after,
- gint insert_value)
-{
- GtkTreeIter iter;
-
- if (gimp_int_store_lookup_by_value (GTK_TREE_MODEL (store),
- after, &iter))
- {
- GEnumValue *enum_value;
-
- enum_value = g_enum_get_value (GIMP_ENUM_STORE (store)->enum_class,
- insert_value);
-
- if (enum_value)
- {
- GtkTreeIter value_iter;
- const gchar *desc;
-
- gtk_list_store_insert_after (GTK_LIST_STORE (store),
- &value_iter, &iter);
-
- desc = gimp_enum_value_get_desc (GIMP_ENUM_STORE (store)->enum_class,
- enum_value);
-
- gtk_list_store_set (GTK_LIST_STORE (store), &value_iter,
- GIMP_INT_STORE_VALUE, enum_value->value,
- GIMP_INT_STORE_LABEL, desc,
- -1);
- }
- }
-}
-
-static void
-gimp_layer_mode_combo_box_insert_separator (GtkListStore *store,
- gint after,
- gint separator_value)
-{
- GtkTreeIter iter;
-
- if (gimp_int_store_lookup_by_value (GTK_TREE_MODEL (store),
- after, &iter))
- {
- GtkTreeIter sep_iter;
-
- gtk_list_store_insert_after (GTK_LIST_STORE (store),
- &sep_iter, &iter);
- gtk_list_store_set (GTK_LIST_STORE (store), &sep_iter,
- GIMP_INT_STORE_VALUE, separator_value,
- -1);
- }
-}
-
static gboolean
gimp_layer_mode_combo_box_separator_func (GtkTreeModel *model,
GtkTreeIter *iter,
diff --git a/app/widgets/gimplayermodecombobox.h b/app/widgets/gimplayermodecombobox.h
index f9213ee..f89fbe6 100644
--- a/app/widgets/gimplayermodecombobox.h
+++ b/app/widgets/gimplayermodecombobox.h
@@ -46,18 +46,21 @@ struct _GimpLayerModeComboBoxClass
};
-GType gimp_layer_mode_combo_box_get_type (void) G_GNUC_CONST;
+GType gimp_layer_mode_combo_box_get_type (void) G_GNUC_CONST;
-GtkWidget * gimp_layer_mode_combo_box_new (gboolean with_behind,
- gboolean with_replace);
+GtkWidget * gimp_layer_mode_combo_box_new (GimpLayerModeContext context);
-void gimp_layer_mode_combo_box_set_mode (GimpLayerModeComboBox *combo,
- GimpLayerMode mode);
-GimpLayerMode gimp_layer_mode_combo_box_get_mode (GimpLayerModeComboBox *combo);
+void gimp_layer_mode_combo_box_set_context (GimpLayerModeComboBox *combo,
+ GimpLayerModeContext context);
+GimpLayerModeContext gimp_layer_mode_combo_box_get_context (GimpLayerModeComboBox *combo);
-void gimp_layer_mode_combo_box_set_group (GimpLayerModeComboBox *combo,
- GimpLayerModeGroup group);
-GimpLayerModeGroup gimp_layer_mode_combo_box_get_group (GimpLayerModeComboBox *combo);
+void gimp_layer_mode_combo_box_set_mode (GimpLayerModeComboBox *combo,
+ GimpLayerMode mode);
+GimpLayerMode gimp_layer_mode_combo_box_get_mode (GimpLayerModeComboBox *combo);
+
+void gimp_layer_mode_combo_box_set_group (GimpLayerModeComboBox *combo,
+ GimpLayerModeGroup group);
+GimpLayerModeGroup gimp_layer_mode_combo_box_get_group (GimpLayerModeComboBox *combo);
#endif /* __GIMP_LAYER_MODE_COMBO_BOX_H__ */
diff --git a/app/widgets/gimplayertreeview.c b/app/widgets/gimplayertreeview.c
index 1cc2c3e..29bbb93 100644
--- a/app/widgets/gimplayertreeview.c
+++ b/app/widgets/gimplayertreeview.c
@@ -265,7 +265,7 @@ gimp_layer_tree_view_init (GimpLayerTreeView *view)
/* Paint mode menu */
- view->priv->layer_mode_box = gimp_layer_mode_box_new (FALSE, FALSE);
+ view->priv->layer_mode_box = gimp_layer_mode_box_new (GIMP_LAYER_MODE_CONTEXT_LAYER);
gimp_layer_mode_box_set_label (GIMP_LAYER_MODE_BOX (view->priv->layer_mode_box),
_("Mode"));
gimp_item_tree_view_add_options (GIMP_ITEM_TREE_VIEW (view), NULL,
@@ -1076,6 +1076,17 @@ gimp_layer_tree_view_update_options (GimpLayerTreeView *view,
BLOCK (view->priv->layer_mode_box,
gimp_layer_tree_view_layer_mode_box_callback);
+ if (gimp_viewable_get_children (GIMP_VIEWABLE (layer)) == NULL)
+ {
+ gimp_layer_mode_box_set_context (GIMP_LAYER_MODE_BOX (view->priv->layer_mode_box),
+ GIMP_LAYER_MODE_CONTEXT_LAYER);
+ }
+ else
+ {
+ gimp_layer_mode_box_set_context (GIMP_LAYER_MODE_BOX (view->priv->layer_mode_box),
+ GIMP_LAYER_MODE_CONTEXT_GROUP);
+ }
+
gimp_layer_mode_box_set_mode (GIMP_LAYER_MODE_BOX (view->priv->layer_mode_box),
gimp_layer_get_mode (layer));
diff --git a/app/widgets/gimppropwidgets.c b/app/widgets/gimppropwidgets.c
index 1a90c55..23f5e8e 100644
--- a/app/widgets/gimppropwidgets.c
+++ b/app/widgets/gimppropwidgets.c
@@ -148,24 +148,22 @@ gimp_prop_expanding_frame_new (GObject *config,
/**
* gimp_prop_layer_mode_box_new:
- * @config: #GimpConfig object to which property is attached.
- * @property_name: Name of Enum property.
- * @with_behind_mode: Whether to include "Behind" mode in the menu.
- * @with_replace_modes: Whether to include the "Replace", "Erase" and
- * "Anti Erase" modes in the menu.
+ * @config: #GimpConfig object to which property is attached.
+ * @property_name: Name of Enum property.
+ * @context: A context mask, determining the set of modes to
+ * include in the menu.
*
* Creates a #GimpLayerModeBox widget to display and set the specified
* Enum property, for which the enum must be #GimpLayerMode.
*
* Return value: The newly created #GimpLayerModeBox widget.
*
- * Since GIMP 2.4
+ * Since GIMP 2.10
*/
GtkWidget *
-gimp_prop_layer_mode_box_new (GObject *config,
- const gchar *property_name,
- gboolean with_behind_mode,
- gboolean with_replace_modes)
+gimp_prop_layer_mode_box_new (GObject *config,
+ const gchar *property_name,
+ GimpLayerModeContext context)
{
GParamSpec *param_spec;
GtkWidget *box;
@@ -175,7 +173,7 @@ gimp_prop_layer_mode_box_new (GObject *config,
if (! param_spec)
return NULL;
- box = gimp_layer_mode_box_new (with_behind_mode, with_replace_modes);
+ box = gimp_layer_mode_box_new (context);
g_object_bind_property (config, property_name,
G_OBJECT (box), "layer-mode",
diff --git a/app/widgets/gimppropwidgets.h b/app/widgets/gimppropwidgets.h
index f29e572..f31b2f5 100644
--- a/app/widgets/gimppropwidgets.h
+++ b/app/widgets/gimppropwidgets.h
@@ -35,8 +35,7 @@ GtkWidget * gimp_prop_expanding_frame_new (GObject *config,
GtkWidget * gimp_prop_layer_mode_box_new (GObject *config,
const gchar *property_name,
- gboolean with_behind_mode,
- gboolean with_replace_modes);
+ GimpLayerModeContext context);
/* GimpParamColor */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]