From 0aa8ac46608da51ca16a779315674bf05928b4ed Mon Sep 17 00:00:00 2001 From: "mr.fantastic" Date: Wed, 8 Mar 2023 19:08:55 +0300 Subject: [PATCH] Adding initial support for snapping layers/path_points by layers bounding boxes --- app/actions/view-actions.c | 9 ++ app/actions/view-commands.c | 17 +++ app/actions/view-commands.h | 3 + app/config/gimpdisplayoptions.c | 28 ++++ app/config/gimpdisplayoptions.h | 1 + app/config/gimprc-blurbs.h | 3 + app/core/gimpimage-snap.c | 174 ++++++++++++++++++++-- app/core/gimpimage-snap.h | 10 +- app/dialogs/preferences-dialog.c | 3 + app/display/gimpdisplayshell-appearance.c | 21 +++ app/display/gimpdisplayshell-appearance.h | 4 + app/display/gimpdisplayshell.c | 12 +- app/widgets/gimphelp-ids.h | 1 + menus/image-menu.ui.in.in | 2 + 14 files changed, 270 insertions(+), 18 deletions(-) diff --git a/app/actions/view-actions.c b/app/actions/view-actions.c index 64223babc7..92a7b7edc2 100644 --- a/app/actions/view-actions.c +++ b/app/actions/view-actions.c @@ -277,6 +277,13 @@ static const GimpToggleActionEntry view_toggle_actions[] = FALSE, GIMP_HELP_VIEW_SNAP_TO_VECTORS }, + { "view-snap-to-bbox", NULL, + NC_("view-action", "Snap to _Bounding Boxes"), NULL, { NULL }, + NC_("view-action", "Tool operations snap to the bounding boxes"), + view_snap_to_bbox_cmd_callback, + FALSE, + GIMP_HELP_VIEW_SNAP_TO_BBOX }, + { "view-show-menubar", NULL, NC_("view-action", "Show _Menubar"), NULL, { NULL }, NC_("view-action", "Show this window's menubar"), @@ -919,6 +926,8 @@ view_actions_update (GimpActionGroup *group, SET_ACTIVE ("view-snap-to-canvas", display && options->snap_to_canvas); SET_SENSITIVE ("view-snap-to-vectors", image); SET_ACTIVE ("view-snap-to-vectors", display && options->snap_to_path); + SET_SENSITIVE ("view-snap-to-bbox", image); + SET_ACTIVE ("view-snap-to-bbox", display && options->snap_to_bbox); SET_SENSITIVE ("view-padding-color-theme", image); SET_SENSITIVE ("view-padding-color-light-check", image); diff --git a/app/actions/view-commands.c b/app/actions/view-commands.c index 07ef42a3f3..fb277b0b98 100644 --- a/app/actions/view-commands.c +++ b/app/actions/view-commands.c @@ -994,6 +994,23 @@ view_snap_to_vectors_cmd_callback (GimpAction *action, } } +void +view_snap_to_bbox_cmd_callback (GimpAction *action, + GVariant *value, + gpointer data) +{ + GimpDisplayShell *shell; + gboolean active; + return_if_no_shell (shell, data); + + active = g_variant_get_boolean (value); + + if (active != gimp_display_shell_get_snap_to_bbox (shell)) + { + gimp_display_shell_set_snap_to_bbox (shell, active); + } +} + void view_padding_color_cmd_callback (GimpAction *action, GVariant *value, diff --git a/app/actions/view-commands.h b/app/actions/view-commands.h index 51af901bb7..887190d082 100644 --- a/app/actions/view-commands.h +++ b/app/actions/view-commands.h @@ -161,6 +161,9 @@ void view_snap_to_canvas_cmd_callback (GimpAction *action, void view_snap_to_vectors_cmd_callback (GimpAction *action, GVariant *value, gpointer data); +void view_snap_to_bbox_cmd_callback (GimpAction *action, + GVariant *value, + gpointer data); void view_padding_color_cmd_callback (GimpAction *action, GVariant *value, gpointer data); diff --git a/app/config/gimpdisplayoptions.c b/app/config/gimpdisplayoptions.c index b51a653cbc..9826846875 100644 --- a/app/config/gimpdisplayoptions.c +++ b/app/config/gimpdisplayoptions.c @@ -55,6 +55,7 @@ enum PROP_SNAP_TO_GRID, PROP_SNAP_TO_CANVAS, PROP_SNAP_TO_PATH, + PROP_SNAP_TO_BBOX, PROP_PADDING_MODE, PROP_PADDING_COLOR, PROP_PADDING_IN_SHOW_ALL @@ -206,6 +207,13 @@ gimp_display_options_class_init (GimpDisplayOptionsClass *klass) FALSE, GIMP_PARAM_STATIC_STRINGS); + GIMP_CONFIG_PROP_BOOLEAN (object_class, PROP_SNAP_TO_BBOX, + "snap-to-bbox", + "Snap to bounding boxes", + SNAP_TO_BBOX_BLURB, + FALSE, + GIMP_PARAM_STATIC_STRINGS); + GIMP_CONFIG_PROP_ENUM (object_class, PROP_PADDING_MODE, "padding-mode", "Padding mode", @@ -338,6 +346,13 @@ gimp_display_options_fullscreen_class_init (GimpDisplayOptionsFullscreenClass *k FALSE, GIMP_PARAM_STATIC_STRINGS); + GIMP_CONFIG_PROP_BOOLEAN (object_class, PROP_SNAP_TO_BBOX, + "snap-to-bbox", + "Snap to bounding boxes", + SNAP_TO_BBOX_BLURB, + FALSE, + GIMP_PARAM_STATIC_STRINGS); + GIMP_CONFIG_PROP_ENUM (object_class, PROP_PADDING_MODE, "padding-mode", "Padding mode", @@ -432,6 +447,13 @@ gimp_display_options_no_image_class_init (GimpDisplayOptionsNoImageClass *klass) TRUE, GIMP_PARAM_STATIC_STRINGS); + GIMP_CONFIG_PROP_BOOLEAN (object_class, PROP_SNAP_TO_BBOX, + "snap-to-bbox", + "Snap to bounding boxes", + SNAP_TO_BBOX_BLURB, + FALSE, + GIMP_PARAM_STATIC_STRINGS); + GIMP_CONFIG_PROP_BOOLEAN (object_class, PROP_SNAP_TO_GRID, "snap-to-grid", "Snap to grid", @@ -512,6 +534,9 @@ gimp_display_options_set_property (GObject *object, case PROP_SNAP_TO_PATH: options->snap_to_path = g_value_get_boolean (value); break; + case PROP_SNAP_TO_BBOX: + options->snap_to_bbox = g_value_get_boolean (value); + break; case PROP_PADDING_MODE: options->padding_mode = g_value_get_enum (value); break; @@ -580,6 +605,9 @@ gimp_display_options_get_property (GObject *object, case PROP_SNAP_TO_PATH: g_value_set_boolean (value, options->snap_to_path); break; + case PROP_SNAP_TO_BBOX: + g_value_set_boolean (value, options->snap_to_bbox); + break; case PROP_PADDING_MODE: g_value_set_enum (value, options->padding_mode); break; diff --git a/app/config/gimpdisplayoptions.h b/app/config/gimpdisplayoptions.h index 8da5e7a810..36dd4cd5ea 100644 --- a/app/config/gimpdisplayoptions.h +++ b/app/config/gimpdisplayoptions.h @@ -57,6 +57,7 @@ struct _GimpDisplayOptions gboolean snap_to_grid; gboolean snap_to_canvas; gboolean snap_to_path; + gboolean snap_to_bbox; GimpCanvasPaddingMode padding_mode; GimpRGB padding_color; diff --git a/app/config/gimprc-blurbs.h b/app/config/gimprc-blurbs.h index ca7e211a36..9a8b7950d7 100644 --- a/app/config/gimprc-blurbs.h +++ b/app/config/gimprc-blurbs.h @@ -124,6 +124,9 @@ _("Snap to the canvas edges by default in new image windows.") #define SNAP_TO_PATH_BLURB \ _("Snap to the active path by default in new image windows.") +#define SNAP_TO_BBOX_BLURB \ +_("Snap to the layers bounding boxes by default in new image windows.") + #define DEFAULT_THRESHOLD_BLURB \ _("Tools such as fuzzy-select and bucket fill find regions based on a " \ "seed-fill algorithm. The seed fill starts at the initially selected " \ diff --git a/app/core/gimpimage-snap.c b/app/core/gimpimage-snap.c index 08151b0523..95e923e0af 100644 --- a/app/core/gimpimage-snap.c +++ b/app/core/gimpimage-snap.c @@ -28,6 +28,7 @@ #include "gimpgrid.h" #include "gimpguide.h" #include "gimpimage.h" +#include "gimplayer.h" #include "gimpimage-grid.h" #include "gimpimage-guides.h" #include "gimpimage-snap.h" @@ -55,7 +56,8 @@ gimp_image_snap_x (GimpImage *image, gdouble epsilon_x, gboolean snap_to_guides, gboolean snap_to_grid, - gboolean snap_to_canvas) + gboolean snap_to_canvas, + gboolean snap_to_bbox) { gdouble mindist = G_MAXDOUBLE; gboolean snapped = FALSE; @@ -68,7 +70,7 @@ gimp_image_snap_x (GimpImage *image, if (! gimp_image_get_guides (image)) snap_to_guides = FALSE; if (! gimp_image_get_grid (image)) snap_to_grid = FALSE; - if (! (snap_to_guides || snap_to_grid || snap_to_canvas)) + if (! (snap_to_guides || snap_to_grid || snap_to_canvas || snap_to_bbox)) return FALSE; if (x < -epsilon_x || x >= (gimp_image_get_width (image) + epsilon_x)) @@ -126,6 +128,50 @@ gimp_image_snap_x (GimpImage *image, &mindist, tx); } + if (snap_to_bbox) + { + GList *layers_list = gimp_image_get_layer_list (image); + GList *selected_layers_list = gimp_image_get_selected_layers (image); + gdouble gcx; + gint gx, gy, gw, gh; + gboolean not_in_selected_set; + + selected_layers_list = gimp_image_get_selected_layers (image); + layers_list = gimp_image_get_layer_list (image); + not_in_selected_set = TRUE; + + for (GList *iter = layers_list; iter; iter = iter->next) + { + gimp_item_bounds (iter->data, &gx, &gy, &gw, &gh); + gimp_item_get_offset (iter->data, &gx, &gy); + gcx = (double) gx + (double) gw/2.0; + not_in_selected_set = TRUE; + + for (GList *iter2 = selected_layers_list; iter2; iter2 = iter2->next) + { + if (iter2->data == iter->data) + not_in_selected_set = FALSE; + } + + if ((gint) x >= gx && (gint) x <= (gx+gw) && not_in_selected_set) + { + snapped |= gimp_image_snap_distance (x, (double) gx, + epsilon_x, + &mindist, tx); + + snapped |= gimp_image_snap_distance (x, (double) gx+gw, + epsilon_x, + &mindist, tx); + + snapped |= gimp_image_snap_distance (x, gcx, + epsilon_x, + &mindist, tx); + } + } + + g_list_free (layers_list); + } + return snapped; } @@ -136,7 +182,8 @@ gimp_image_snap_y (GimpImage *image, gdouble epsilon_y, gboolean snap_to_guides, gboolean snap_to_grid, - gboolean snap_to_canvas) + gboolean snap_to_canvas, + gboolean snap_to_bbox) { gdouble mindist = G_MAXDOUBLE; gboolean snapped = FALSE; @@ -149,7 +196,7 @@ gimp_image_snap_y (GimpImage *image, if (! gimp_image_get_guides (image)) snap_to_guides = FALSE; if (! gimp_image_get_grid (image)) snap_to_grid = FALSE; - if (! (snap_to_guides || snap_to_grid || snap_to_canvas)) + if (! (snap_to_guides || snap_to_grid || snap_to_canvas || snap_to_bbox)) return FALSE; if (y < -epsilon_y || y >= (gimp_image_get_height (image) + epsilon_y)) @@ -207,6 +254,50 @@ gimp_image_snap_y (GimpImage *image, &mindist, ty); } + if (snap_to_bbox) + { + GList *selected_layers_list; + GList *layers_list; + gdouble gcy; + gint gx, gy, gw, gh; + gboolean not_in_selected_set; + + selected_layers_list = gimp_image_get_selected_layers (image); + layers_list = gimp_image_get_layer_list (image); + not_in_selected_set = TRUE; + + for (GList *iter = layers_list; iter; iter = iter->next) + { + gimp_item_bounds (iter->data, &gx, &gy, &gw, &gh); + gimp_item_get_offset (iter->data, &gx, &gy); + gcy = (double) gy + (double) gh/2.0; + not_in_selected_set = TRUE; + + for (GList *iter2 = selected_layers_list; iter2; iter2 = iter2->next) + { + if (iter2->data == iter->data) + not_in_selected_set = FALSE; + } + + if ((gint) y >= gy && (gint) y <= (gy+gh) && not_in_selected_set) + { + snapped |= gimp_image_snap_distance (y, (double) gy, + epsilon_y, + &mindist, ty); + + snapped |= gimp_image_snap_distance (y, (double) gy+gh, + epsilon_y, + &mindist, ty); + + snapped |= gimp_image_snap_distance (y, gcy, + epsilon_y, + &mindist, ty); + } + } + + g_list_free (layers_list); + } + return snapped; } @@ -222,6 +313,7 @@ gimp_image_snap_point (GimpImage *image, gboolean snap_to_grid, gboolean snap_to_canvas, gboolean snap_to_vectors, + gboolean snap_to_bbox, gboolean show_all) { gdouble mindist_x = G_MAXDOUBLE; @@ -242,7 +334,7 @@ gimp_image_snap_point (GimpImage *image, if (! gimp_image_get_selected_vectors (image)) snap_to_vectors = FALSE; - if (! (snap_to_guides || snap_to_grid || snap_to_canvas || snap_to_vectors)) + if (! (snap_to_guides || snap_to_grid || snap_to_canvas || snap_to_vectors || snap_to_bbox)) return FALSE; if (! show_all && @@ -370,6 +462,55 @@ gimp_image_snap_point (GimpImage *image, } } + if (snap_to_bbox) + { + GList *layers_list = gimp_image_get_layer_list (image); + + for (GList *iter = layers_list; iter; iter = iter->next) + { + gdouble gcx; + gdouble gcy; + gint gx, gy, gw, gh; + + gimp_item_bounds (iter->data, &gx, &gy, &gw, &gh); + gimp_item_get_offset (iter->data, &gx, &gy); + gcx = (double) gx + (double) gw/2.0; + gcy = (double) gy + (double) gh/2.0; + + if ((gint) x >= gx && (gint) x <= (gx+gw)) + { + snapped |= gimp_image_snap_distance (x, (double) gx, + epsilon_x, + &mindist_x, tx); + + snapped |= gimp_image_snap_distance (x, (double) gx+gw, + epsilon_x, + &mindist_x, tx); + + snapped |= gimp_image_snap_distance (x, gcx, + epsilon_x, + &mindist_x, tx); + } + + if ((gint) y >= gy && (gint) y <= (gy+gh)) + { + snapped |= gimp_image_snap_distance (y, (double) gy, + epsilon_y, + &mindist_y, ty); + + snapped |= gimp_image_snap_distance (y, (double) gy+gh, + epsilon_y, + &mindist_y, ty); + + snapped |= gimp_image_snap_distance (y, gcy, + epsilon_y, + &mindist_y, ty); + } + } + + g_list_free (layers_list); + } + return snapped; } @@ -386,7 +527,8 @@ gimp_image_snap_rectangle (GimpImage *image, gboolean snap_to_guides, gboolean snap_to_grid, gboolean snap_to_canvas, - gboolean snap_to_vectors) + gboolean snap_to_vectors, + gboolean snap_to_bbox) { gdouble nx, ny; gdouble mindist_x = G_MAXDOUBLE; @@ -409,7 +551,7 @@ gimp_image_snap_rectangle (GimpImage *image, if (! gimp_image_get_selected_vectors (image)) snap_to_vectors = FALSE; - if (! (snap_to_guides || snap_to_grid || snap_to_canvas || snap_to_vectors)) + if (! (snap_to_guides || snap_to_grid || snap_to_canvas || snap_to_vectors || snap_to_bbox)) return FALSE; /* left edge */ @@ -417,7 +559,8 @@ gimp_image_snap_rectangle (GimpImage *image, MIN (epsilon_x, mindist_x), snap_to_guides, snap_to_grid, - snap_to_canvas)) + snap_to_canvas, + snap_to_bbox)) { mindist_x = ABS (nx - x1); *tx1 = nx; @@ -429,7 +572,8 @@ gimp_image_snap_rectangle (GimpImage *image, MIN (epsilon_x, mindist_x), snap_to_guides, snap_to_grid, - snap_to_canvas)) + snap_to_canvas, + snap_to_bbox)) { mindist_x = ABS (nx - x2); *tx1 = RINT (x1 + (nx - x2)); @@ -441,7 +585,8 @@ gimp_image_snap_rectangle (GimpImage *image, MIN (epsilon_x, mindist_x), snap_to_guides, snap_to_grid, - snap_to_canvas)) + snap_to_canvas, + snap_to_bbox)) { mindist_x = ABS (nx - x_center); *tx1 = RINT (x1 + (nx - x_center)); @@ -453,7 +598,8 @@ gimp_image_snap_rectangle (GimpImage *image, MIN (epsilon_y, mindist_y), snap_to_guides, snap_to_grid, - snap_to_canvas)) + snap_to_canvas, + snap_to_bbox)) { mindist_y = ABS (ny - y1); *ty1 = ny; @@ -465,7 +611,8 @@ gimp_image_snap_rectangle (GimpImage *image, MIN (epsilon_y, mindist_y), snap_to_guides, snap_to_grid, - snap_to_canvas)) + snap_to_canvas, + snap_to_bbox)) { mindist_y = ABS (ny - y2); *ty1 = RINT (y1 + (ny - y2)); @@ -477,7 +624,8 @@ gimp_image_snap_rectangle (GimpImage *image, MIN (epsilon_y, mindist_y), snap_to_guides, snap_to_grid, - snap_to_canvas)) + snap_to_canvas, + snap_to_bbox)) { mindist_y = ABS (ny - y_center); *ty1 = RINT (y1 + (ny - y_center)); diff --git a/app/core/gimpimage-snap.h b/app/core/gimpimage-snap.h index b0d5e4b3dd..a6cac2bfb5 100644 --- a/app/core/gimpimage-snap.h +++ b/app/core/gimpimage-snap.h @@ -25,14 +25,16 @@ gboolean gimp_image_snap_x (GimpImage *image, gdouble epsilon_x, gboolean snap_to_guides, gboolean snap_to_grid, - gboolean snap_to_canvas); + gboolean snap_to_canvas, + gboolean snap_to_bbox); gboolean gimp_image_snap_y (GimpImage *image, gdouble y, gdouble *ty, gdouble epsilon_y, gboolean snap_to_guides, gboolean snap_to_grid, - gboolean snap_to_canvas); + gboolean snap_to_canvas, + gboolean snap_to_bbox); gboolean gimp_image_snap_point (GimpImage *image, gdouble x, gdouble y, @@ -44,6 +46,7 @@ gboolean gimp_image_snap_point (GimpImage *image, gboolean snap_to_grid, gboolean snap_to_canvas, gboolean snap_to_vectors, + gboolean snap_to_bbox, gboolean show_all); gboolean gimp_image_snap_rectangle (GimpImage *image, gdouble x1, @@ -57,7 +60,8 @@ gboolean gimp_image_snap_rectangle (GimpImage *image, gboolean snap_to_guides, gboolean snap_to_grid, gboolean snap_to_canvas, - gboolean snap_to_vectors); + gboolean snap_to_vectors, + gboolean snap_to_bbox); #endif /* __GIMP_IMAGE_SNAP_H__ */ diff --git a/app/dialogs/preferences-dialog.c b/app/dialogs/preferences-dialog.c index b8a495d8e8..24c1195069 100644 --- a/app/dialogs/preferences-dialog.c +++ b/app/dialogs/preferences-dialog.c @@ -1140,6 +1140,9 @@ prefs_behavior_options_frame_add (Gimp *gimp, prefs_check_button_add (object, "snap-to-path", _("Snap to _Active Path"), GTK_BOX (checks_vbox)); + prefs_check_button_add (object, "snap-to-bbox", + _("Snap to _Bounding Box"), + GTK_BOX (checks_vbox)); } static void diff --git a/app/display/gimpdisplayshell-appearance.c b/app/display/gimpdisplayshell-appearance.c index 9a22962297..d801167919 100644 --- a/app/display/gimpdisplayshell-appearance.c +++ b/app/display/gimpdisplayshell-appearance.c @@ -465,6 +465,27 @@ gimp_display_shell_get_snap_to_vectors (GimpDisplayShell *shell) return appearance_get_options (shell)->snap_to_path; } +void +gimp_display_shell_set_snap_to_bbox (GimpDisplayShell *shell, + gboolean snap) +{ + GimpDisplayOptions *options; + + g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell)); + + options = appearance_get_options (shell); + + g_object_set (options, "snap-to-bbox", snap, NULL); +} + +gboolean +gimp_display_shell_get_snap_to_bbox (GimpDisplayShell *shell) +{ + g_return_val_if_fail (GIMP_IS_DISPLAY_SHELL (shell), FALSE); + + return appearance_get_options (shell)->snap_to_bbox; +} + void gimp_display_shell_set_padding (GimpDisplayShell *shell, GimpCanvasPaddingMode padding_mode, diff --git a/app/display/gimpdisplayshell-appearance.h b/app/display/gimpdisplayshell-appearance.h index 0c67649b49..1c343d78e4 100644 --- a/app/display/gimpdisplayshell-appearance.h +++ b/app/display/gimpdisplayshell-appearance.h @@ -78,6 +78,10 @@ void gimp_display_shell_set_snap_to_vectors (GimpDisplayShell *s gboolean snap); gboolean gimp_display_shell_get_snap_to_vectors (GimpDisplayShell *shell); +void gimp_display_shell_set_snap_to_bbox (GimpDisplayShell *shell, + gboolean snap); +gboolean gimp_display_shell_get_snap_to_bbox (GimpDisplayShell *shell); + void gimp_display_shell_set_padding (GimpDisplayShell *shell, GimpCanvasPaddingMode mode, const GimpRGB *color); diff --git a/app/display/gimpdisplayshell.c b/app/display/gimpdisplayshell.c index 4386c2ddef..29f635c54f 100644 --- a/app/display/gimpdisplayshell.c +++ b/app/display/gimpdisplayshell.c @@ -1649,6 +1649,7 @@ gimp_display_shell_snap_coords (GimpDisplayShell *shell, gboolean snap_to_grid = FALSE; gboolean snap_to_canvas = FALSE; gboolean snap_to_vectors = FALSE; + gboolean snap_to_bbox = FALSE; gboolean snapped = FALSE; g_return_val_if_fail (GIMP_IS_DISPLAY_SHELL (shell), FALSE); @@ -1676,7 +1677,12 @@ gimp_display_shell_snap_coords (GimpDisplayShell *shell, snap_to_vectors = TRUE; } - if (snap_to_guides || snap_to_grid || snap_to_canvas || snap_to_vectors) + if (gimp_display_shell_get_snap_to_bbox (shell)) + { + snap_to_bbox = TRUE; + } + + if (snap_to_guides || snap_to_grid || snap_to_canvas || snap_to_vectors || snap_to_bbox) { gint snap_distance; gdouble tx, ty; @@ -1699,7 +1705,8 @@ gimp_display_shell_snap_coords (GimpDisplayShell *shell, snap_to_guides, snap_to_grid, snap_to_canvas, - snap_to_vectors); + snap_to_vectors, + snap_to_bbox); } else { @@ -1714,6 +1721,7 @@ gimp_display_shell_snap_coords (GimpDisplayShell *shell, snap_to_grid, snap_to_canvas, snap_to_vectors, + snap_to_bbox, shell->show_all); } diff --git a/app/widgets/gimphelp-ids.h b/app/widgets/gimphelp-ids.h index 3760633643..b040df524b 100644 --- a/app/widgets/gimphelp-ids.h +++ b/app/widgets/gimphelp-ids.h @@ -114,6 +114,7 @@ #define GIMP_HELP_VIEW_SNAP_TO_GRID "gimp-view-snap-to-grid" #define GIMP_HELP_VIEW_SNAP_TO_CANVAS "gimp-view-snap-to-canvas" #define GIMP_HELP_VIEW_SNAP_TO_VECTORS "gimp-view-snap-to-vectors" +#define GIMP_HELP_VIEW_SNAP_TO_BBOX "gimp-view-snap-to-bbox" #define GIMP_HELP_VIEW_SHOW_MENUBAR "gimp-view-show-menubar" #define GIMP_HELP_VIEW_SHOW_RULERS "gimp-view-show-rulers" #define GIMP_HELP_VIEW_SHOW_SCROLLBARS "gimp-view-show-scrollbars" diff --git a/menus/image-menu.ui.in.in b/menus/image-menu.ui.in.in index f7ad0acd22..0765017f11 100644 --- a/menus/image-menu.ui.in.in +++ b/menus/image-menu.ui.in.in @@ -264,6 +264,8 @@ app.view-snap-to-grid app.view-snap-to-canvas app.view-snap-to-vectors + app.view-snap-to-bbox + app.view-snap-to-equidistance