From e9cedddeeb52a5cfa3ccfe55a193f20b64b5e185 Mon Sep 17 00:00:00 2001 From: Martin Owens Date: Sun, 16 Aug 2020 03:58:46 -0400 Subject: [PATCH] Move snap toggles to verbs and combine icon info. --- src/ui/toolbar/snap-toolbar.cpp | 306 ++++---------------------------- src/ui/toolbar/snap-toolbar.h | 3 +- src/verbs.cpp | 177 +++++++++++++++++- src/verbs.h | 25 ++- 4 files changed, 231 insertions(+), 280 deletions(-) diff --git a/src/ui/toolbar/snap-toolbar.cpp b/src/ui/toolbar/snap-toolbar.cpp index 63347f2219..a872d28303 100644 --- a/src/ui/toolbar/snap-toolbar.cpp +++ b/src/ui/toolbar/snap-toolbar.cpp @@ -18,6 +18,7 @@ #include "verbs.h" #include "object/sp-namedview.h" +#include "helper/action.h" #include "ui/icon-names.h" @@ -25,174 +26,45 @@ namespace Inkscape { namespace UI { namespace Toolbar { +Gtk::ToggleToolButton * +SnapToolbar::add_toggle_snap_verb(int verb_id) +{ + auto verb = Inkscape::Verb::get(verb_id); + auto button = add_toggle_button(verb->get_name(), verb->get_tip()); + button->set_icon_name(verb->get_image()); + button->signal_toggled().connect( + sigc::bind(sigc::mem_fun(*this, &SnapToolbar::on_snap_toggled_verb), verb_id)); + return button; +} + SnapToolbar::SnapToolbar(SPDesktop *desktop) : Toolbar(desktop), _freeze(false) { // Global snapping control - { - auto snap_global_verb = Inkscape::Verb::get(SP_VERB_TOGGLE_SNAPPING); - _snap_global_item = add_toggle_button(snap_global_verb->get_name(), - snap_global_verb->get_tip()); - _snap_global_item->set_icon_name(INKSCAPE_ICON("snap")); - _snap_global_item->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &SnapToolbar::on_snap_toggled), - SPAttr::INKSCAPE_SNAP_GLOBAL)); - } - + _snap_global_item = this->add_toggle_snap_verb(SP_VERB_TOGGLE_SNAP_GLOBAL); add_separator(); - - // Snapping to bounding boxes - { - _snap_from_bbox_corner_item = add_toggle_button(_("Bounding box"), - _("Snap bounding boxes")); - _snap_from_bbox_corner_item->set_icon_name(INKSCAPE_ICON("snap")); - _snap_from_bbox_corner_item->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &SnapToolbar::on_snap_toggled), - SPAttr::INKSCAPE_SNAP_BBOX)); - } - - { - _snap_to_bbox_path_item = add_toggle_button(_("Bounding box edges"), - _("Snap to edges of a bounding box")); - _snap_to_bbox_path_item->set_icon_name(INKSCAPE_ICON("snap-bounding-box-edges")); - _snap_to_bbox_path_item->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &SnapToolbar::on_snap_toggled), - SPAttr::INKSCAPE_SNAP_BBOX_EDGE)); - } - - { - _snap_to_bbox_node_item = add_toggle_button(_("Bounding box corners"), - _("Snap bounding box corners")); - _snap_to_bbox_node_item->set_icon_name(INKSCAPE_ICON("snap-bounding-box-corners")); - _snap_to_bbox_node_item->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &SnapToolbar::on_snap_toggled), - SPAttr::INKSCAPE_SNAP_BBOX_CORNER)); - } - - { - _snap_to_from_bbox_edge_midpoints_item = add_toggle_button(_("BBox Edge Midpoints"), - _("Snap midpoints of bounding box edges")); - _snap_to_from_bbox_edge_midpoints_item->set_icon_name(INKSCAPE_ICON("snap-bounding-box-midpoints")); - _snap_to_from_bbox_edge_midpoints_item->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &SnapToolbar::on_snap_toggled), - SPAttr::INKSCAPE_SNAP_BBOX_EDGE_MIDPOINT)); - } - - { - _snap_to_from_bbox_edge_centers_item = add_toggle_button(_("BBox Centers"), - _("Snapping centers of bounding boxes")); - _snap_to_from_bbox_edge_centers_item->set_icon_name(INKSCAPE_ICON("snap-bounding-box-center")); - _snap_to_from_bbox_edge_centers_item->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &SnapToolbar::on_snap_toggled), - SPAttr::INKSCAPE_SNAP_BBOX_MIDPOINT)); - } - + _snap_from_bbox_corner_item = this->add_toggle_snap_verb(SP_VERB_TOGGLE_SNAP_BBOX); + _snap_to_bbox_path_item = this->add_toggle_snap_verb(SP_VERB_TOGGLE_SNAP_BBOX_EDGE); + _snap_to_bbox_node_item = this->add_toggle_snap_verb(SP_VERB_TOGGLE_SNAP_BBOX_CORNER); + _snap_to_from_bbox_edge_midpoints_item = this->add_toggle_snap_verb(SP_VERB_TOGGLE_SNAP_BBOX_EDGE_MIDPOINT); + _snap_to_from_bbox_edge_centers_item = this->add_toggle_snap_verb(SP_VERB_TOGGLE_SNAP_BBOX_MIDPOINT); add_separator(); - - // Snapping to nodes, paths & handles - { - _snap_from_node_item = add_toggle_button(_("Nodes"), - _("Snap nodes, paths, and handles")); - _snap_from_node_item->set_icon_name(INKSCAPE_ICON("snap")); - _snap_from_node_item->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &SnapToolbar::on_snap_toggled), - SPAttr::INKSCAPE_SNAP_NODE)); - } - - { - _snap_to_item_path_item = add_toggle_button(_("Paths"), - _("Snap to paths")); - _snap_to_item_path_item->set_icon_name(INKSCAPE_ICON("snap-nodes-path")); - _snap_to_item_path_item->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &SnapToolbar::on_snap_toggled), - SPAttr::INKSCAPE_SNAP_PATH)); - } - - { - _snap_to_path_intersections_item = add_toggle_button(_("Path intersections"), - _("Snap to path intersections")); - _snap_to_path_intersections_item->set_icon_name(INKSCAPE_ICON("snap-nodes-intersection")); - _snap_to_path_intersections_item->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &SnapToolbar::on_snap_toggled), - SPAttr::INKSCAPE_SNAP_PATH_INTERSECTION)); - } - - { - _snap_to_item_node_item = add_toggle_button(_("To nodes"), - _("Snap to cusp nodes, incl. rectangle corners")); - _snap_to_item_node_item->set_icon_name(INKSCAPE_ICON("snap-nodes-cusp")); - _snap_to_item_node_item->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &SnapToolbar::on_snap_toggled), - SPAttr::INKSCAPE_SNAP_NODE_CUSP)); - } - - { - _snap_to_smooth_nodes_item = add_toggle_button(_("Smooth nodes"), - _("Snap smooth nodes, incl. quadrant points of ellipses")); - _snap_to_smooth_nodes_item->set_icon_name(INKSCAPE_ICON("snap-nodes-smooth")); - _snap_to_smooth_nodes_item->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &SnapToolbar::on_snap_toggled), - SPAttr::INKSCAPE_SNAP_NODE_SMOOTH)); - } - - { - _snap_to_from_line_midpoints_item = add_toggle_button(_("Line Midpoints"), - _("Snap midpoints of line segments")); - _snap_to_from_line_midpoints_item->set_icon_name(INKSCAPE_ICON("snap-nodes-midpoint")); - _snap_to_from_line_midpoints_item->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &SnapToolbar::on_snap_toggled), - SPAttr::INKSCAPE_SNAP_LINE_MIDPOINT)); - } - + _snap_from_node_item = this->add_toggle_snap_verb(SP_VERB_TOGGLE_SNAP_NODE); + _snap_to_item_path_item = this->add_toggle_snap_verb(SP_VERB_TOGGLE_SNAP_PATH); + _snap_to_path_intersections_item = this->add_toggle_snap_verb(SP_VERB_TOGGLE_SNAP_PATH_INTERSECTION); + _snap_to_item_node_item = this->add_toggle_snap_verb(SP_VERB_TOGGLE_SNAP_NODE_CUSP); + _snap_to_smooth_nodes_item = this->add_toggle_snap_verb(SP_VERB_TOGGLE_SNAP_NODE_SMOOTH); + _snap_to_from_line_midpoints_item = this->add_toggle_snap_verb(SP_VERB_TOGGLE_SNAP_LINE_MIDPOINT); add_separator(); - - { - _snap_from_others_item = add_toggle_button(_("Others"), - _("Snap other points (centers, guide origins, gradient handles, etc.)")); - _snap_from_others_item->set_icon_name(INKSCAPE_ICON("snap")); - _snap_from_others_item->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &SnapToolbar::on_snap_toggled), - SPAttr::INKSCAPE_SNAP_OTHERS)); - } - - { - _snap_to_from_object_centers_item = add_toggle_button(_("Object Centers"), - _("Snap centers of objects")); - _snap_to_from_object_centers_item->set_icon_name(INKSCAPE_ICON("snap-nodes-center")); - _snap_to_from_object_centers_item->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &SnapToolbar::on_snap_toggled), - SPAttr::INKSCAPE_SNAP_OBJECT_MIDPOINT)); - } - - { - _snap_to_from_rotation_center_item = add_toggle_button(_("Rotation Centers"), - _("Snap an item's rotation center")); - _snap_to_from_rotation_center_item->set_icon_name(INKSCAPE_ICON("snap-nodes-rotation-center")); - _snap_to_from_rotation_center_item->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &SnapToolbar::on_snap_toggled), - SPAttr::INKSCAPE_SNAP_ROTATION_CENTER)); - } - - { - _snap_to_from_text_baseline_item = add_toggle_button(_("Text baseline"), - _("Snap text anchors and baselines")); - _snap_to_from_text_baseline_item->set_icon_name(INKSCAPE_ICON("snap-text-baseline")); - _snap_to_from_text_baseline_item->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &SnapToolbar::on_snap_toggled), - SPAttr::INKSCAPE_SNAP_TEXT_BASELINE)); - } - + _snap_from_others_item = this->add_toggle_snap_verb(SP_VERB_TOGGLE_SNAP_OTHERS); + _snap_to_from_object_centers_item = this->add_toggle_snap_verb(SP_VERB_TOGGLE_SNAP_OBJECT_MIDPOINT); + _snap_to_from_rotation_center_item = this->add_toggle_snap_verb(SP_VERB_TOGGLE_SNAP_ROTATION_CENTER); + _snap_to_from_text_baseline_item = this->add_toggle_snap_verb(SP_VERB_TOGGLE_SNAP_TEXT_BASELINE); add_separator(); - - { - _snap_to_page_border_item = add_toggle_button(_("Page border"), - _("Snap to the page border")); - _snap_to_page_border_item->set_icon_name(INKSCAPE_ICON("snap-page")); - _snap_to_page_border_item->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &SnapToolbar::on_snap_toggled), - SPAttr::INKSCAPE_SNAP_PAGE_BORDER)); - } - - { - _snap_to_grids_item = add_toggle_button(_("Grids"), - _("Snap to grids")); - _snap_to_grids_item->set_icon_name(INKSCAPE_ICON("grid-rectangular")); - _snap_to_grids_item->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &SnapToolbar::on_snap_toggled), - SPAttr::INKSCAPE_SNAP_GRID)); - } - - { - _snap_to_guides_item = add_toggle_button(_("Guides"), - _("Snap guides")); - _snap_to_guides_item->set_icon_name(INKSCAPE_ICON("guides")); - _snap_to_guides_item->signal_toggled().connect(sigc::bind(sigc::mem_fun(*this, &SnapToolbar::on_snap_toggled), - SPAttr::INKSCAPE_SNAP_GUIDE)); - } - + _snap_to_page_border_item = this->add_toggle_snap_verb(SP_VERB_TOGGLE_SNAP_PAGE_BORDER); + _snap_to_grids_item = this->add_toggle_snap_verb(SP_VERB_TOGGLE_SNAP_GRID); + _snap_to_guides_item = this->add_toggle_snap_verb(SP_VERB_TOGGLE_SNAP_GUIDE); show_all(); } @@ -271,120 +143,14 @@ SnapToolbar::update(SnapToolbar *tb) } void -SnapToolbar::on_snap_toggled(SPAttr attr) +SnapToolbar::on_snap_toggled_verb(int verb_id) { if(_freeze) return; - auto dt = _desktop; - auto nv = dt->getNamedView(); - - if(!nv) { - g_warning("No namedview specified in toggle-snap callback"); - return; - } - - auto doc = nv->document; - auto repr = nv->getRepr(); - - if(!repr) { - g_warning("This namedview doesn't have an XML representation attached!"); - return; - } - - DocumentUndo::ScopedInsensitive _no_undo(doc); - - bool v = false; - - switch (attr) { - case SPAttr::INKSCAPE_SNAP_GLOBAL: - dt->toggleSnapGlobal(); - break; - case SPAttr::INKSCAPE_SNAP_BBOX: - v = nv->snap_manager.snapprefs.isTargetSnappable(Inkscape::SNAPTARGET_BBOX_CATEGORY); - sp_repr_set_boolean(repr, "inkscape:snap-bbox", !v); - break; - case SPAttr::INKSCAPE_SNAP_BBOX_EDGE: - v = nv->snap_manager.snapprefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_BBOX_EDGE); - sp_repr_set_boolean(repr, "inkscape:bbox-paths", !v); - break; - case SPAttr::INKSCAPE_SNAP_BBOX_CORNER: - v = nv->snap_manager.snapprefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_BBOX_CORNER); - sp_repr_set_boolean(repr, "inkscape:bbox-nodes", !v); - break; - case SPAttr::INKSCAPE_SNAP_NODE: - v = nv->snap_manager.snapprefs.isTargetSnappable(Inkscape::SNAPTARGET_NODE_CATEGORY); - sp_repr_set_boolean(repr, "inkscape:snap-nodes", !v); - break; - case SPAttr::INKSCAPE_SNAP_PATH: - v = nv->snap_manager.snapprefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_PATH); - sp_repr_set_boolean(repr, "inkscape:object-paths", !v); - break; - case SPAttr::INKSCAPE_SNAP_PATH_CLIP: - v = nv->snap_manager.snapprefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_PATH_CLIP); - sp_repr_set_boolean(repr, "inkscape:snap-path-clip", !v); - break; - case SPAttr::INKSCAPE_SNAP_PATH_MASK: - v = nv->snap_manager.snapprefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_PATH_MASK); - sp_repr_set_boolean(repr, "inkscape:snap-path-mask", !v); - break; - case SPAttr::INKSCAPE_SNAP_NODE_CUSP: - v = nv->snap_manager.snapprefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_NODE_CUSP); - sp_repr_set_boolean(repr, "inkscape:object-nodes", !v); - break; - case SPAttr::INKSCAPE_SNAP_NODE_SMOOTH: - v = nv->snap_manager.snapprefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_NODE_SMOOTH); - sp_repr_set_boolean(repr, "inkscape:snap-smooth-nodes", !v); - break; - case SPAttr::INKSCAPE_SNAP_PATH_INTERSECTION: - v = nv->snap_manager.snapprefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_PATH_INTERSECTION); - sp_repr_set_boolean(repr, "inkscape:snap-intersection-paths", !v); - break; - case SPAttr::INKSCAPE_SNAP_OTHERS: - v = nv->snap_manager.snapprefs.isTargetSnappable(Inkscape::SNAPTARGET_OTHERS_CATEGORY); - sp_repr_set_boolean(repr, "inkscape:snap-others", !v); - break; - case SPAttr::INKSCAPE_SNAP_ROTATION_CENTER: - v = nv->snap_manager.snapprefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_ROTATION_CENTER); - sp_repr_set_boolean(repr, "inkscape:snap-center", !v); - break; - case SPAttr::INKSCAPE_SNAP_GRID: - v = nv->snap_manager.snapprefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_GRID); - sp_repr_set_boolean(repr, "inkscape:snap-grids", !v); - break; - case SPAttr::INKSCAPE_SNAP_GUIDE: - v = nv->snap_manager.snapprefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_GUIDE); - sp_repr_set_boolean(repr, "inkscape:snap-to-guides", !v); - break; - case SPAttr::INKSCAPE_SNAP_PAGE_BORDER: - v = nv->snap_manager.snapprefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_PAGE_BORDER); - sp_repr_set_boolean(repr, "inkscape:snap-page", !v); - break; - case SPAttr::INKSCAPE_SNAP_LINE_MIDPOINT: - v = nv->snap_manager.snapprefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_LINE_MIDPOINT); - sp_repr_set_boolean(repr, "inkscape:snap-midpoints", !v); - break; - case SPAttr::INKSCAPE_SNAP_OBJECT_MIDPOINT: - v = nv->snap_manager.snapprefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_OBJECT_MIDPOINT); - sp_repr_set_boolean(repr, "inkscape:snap-object-midpoints", !v); - break; - case SPAttr::INKSCAPE_SNAP_TEXT_BASELINE: - v = nv->snap_manager.snapprefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_TEXT_BASELINE); - sp_repr_set_boolean(repr, "inkscape:snap-text-baseline", !v); - break; - case SPAttr::INKSCAPE_SNAP_BBOX_EDGE_MIDPOINT: - v = nv->snap_manager.snapprefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_BBOX_EDGE_MIDPOINT); - sp_repr_set_boolean(repr, "inkscape:snap-bbox-edge-midpoints", !v); - break; - case SPAttr::INKSCAPE_SNAP_BBOX_MIDPOINT: - v = nv->snap_manager.snapprefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_BBOX_MIDPOINT); - sp_repr_set_boolean(repr, "inkscape:snap-bbox-midpoints", !v); - break; - default: - g_warning("toggle_snap_callback has been called with an ID for which no action has been defined"); - break; - } - - doc->setModifiedSinceSave(); + Inkscape::Verb *verb = Inkscape::Verb::get( verb_id ); + g_assert( verb != NULL ); + SPAction *action = verb->get_action((Inkscape::UI::View::View *) _desktop); + sp_action_perform (action, NULL); } } diff --git a/src/ui/toolbar/snap-toolbar.h b/src/ui/toolbar/snap-toolbar.h index 9d948a11b6..3057efb83e 100644 --- a/src/ui/toolbar/snap-toolbar.h +++ b/src/ui/toolbar/snap-toolbar.h @@ -23,6 +23,7 @@ private: bool _freeze; // Toolbar widgets + Gtk::ToggleToolButton *add_toggle_snap_verb(int verb_id); Gtk::ToggleToolButton *_snap_global_item; Gtk::ToggleToolButton *_snap_from_bbox_corner_item; Gtk::ToggleToolButton *_snap_to_bbox_path_item; @@ -43,7 +44,7 @@ private: Gtk::ToggleToolButton *_snap_to_grids_item; Gtk::ToggleToolButton *_snap_to_guides_item; - void on_snap_toggled(SPAttr attr); + void on_snap_toggled_verb(int verb_id); protected: SnapToolbar(SPDesktop *desktop); diff --git a/src/verbs.cpp b/src/verbs.cpp index 19ffc62561..0c565c70fd 100644 --- a/src/verbs.cpp +++ b/src/verbs.cpp @@ -260,6 +260,27 @@ public: }; // ZoomVerb class +/** + * A class to encompass all of the verbs which deal with snapping + */ +class SnapVerb : public Verb { +private: + static void perform(SPAction *action, void *mydata); +protected: + SPAction *make_action(Inkscape::ActionContext const & context) override; +public: + /** Use the Verb initializer with the same parameters. */ + SnapVerb(unsigned int const code, + gchar const *id, + gchar const *name, + gchar const *tip, + gchar const *image) : + Verb(code, id, name, tip, image, _("View")) + { } +}; // SnapVerb class + + + /** * A class to encompass all of the verbs which deal with dialog operations. */ @@ -511,6 +532,19 @@ SPAction *ZoomVerb::make_action(Inkscape::ActionContext const & context) return make_action_helper(context, &perform); } +/** + * Create an action for a \c SnapVerb. + * + * Calls \c make_action_helper with the \c vector. + * + * @param context Which context the action should be created for. + * @return The built action. + */ +SPAction *SnapVerb::make_action(Inkscape::ActionContext const & context) +{ + return make_action_helper(context, &perform); +} + /** * Create an action for a \c DialogVerb. * @@ -2067,12 +2101,6 @@ void ZoomVerb::perform(SPAction *action, void *data) case SP_VERB_TOGGLE_GUIDES: sp_namedview_toggle_guides(doc, dt->namedview); break; - case SP_VERB_TOGGLE_SNAPPING: - { - DocumentUndo::ScopedInsensitive _no_undo(doc); - dt->toggleSnapGlobal(); - break; - } case SP_VERB_TOGGLE_GRID: dt->toggleGrids(); break; @@ -2137,6 +2165,119 @@ void ZoomVerb::perform(SPAction *action, void *data) } // end of sp_verb_action_zoom_perform() +/** + * Decode the verb code and take appropriate snapping action. + */ +void SnapVerb::perform(SPAction *action, void *data) +{ + g_return_if_fail(ensure_desktop_valid(action)); + SPDesktop *dt = sp_action_get_desktop(action); + SPDocument *doc = dt->getDocument(); + auto nv = dt->getNamedView(); + + if(!nv) { + g_warning("No namedview specified in toggle-snap callback"); + return; + } + auto repr = nv->getRepr(); + if(!repr) { + g_warning("This namedview doesn't have an XML representation attached!"); + return; + } + DocumentUndo::ScopedInsensitive _no_undo(doc); + auto prefs = nv->snap_manager.snapprefs; + bool val = false; + + switch (reinterpret_cast(data)) { + case SP_VERB_TOGGLE_SNAP_GLOBAL: + dt->toggleSnapGlobal(); + break; + case SP_VERB_TOGGLE_SNAP_BBOX: + val = prefs.isTargetSnappable(Inkscape::SNAPTARGET_BBOX_CATEGORY); + sp_repr_set_boolean(repr, "inkscape:snap-bbox", !val); + break; + case SP_VERB_TOGGLE_SNAP_BBOX_EDGE: + val = prefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_BBOX_EDGE); + sp_repr_set_boolean(repr, "inkscape:bbox-paths", !val); + break; + case SP_VERB_TOGGLE_SNAP_BBOX_CORNER: + val = prefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_BBOX_CORNER); + sp_repr_set_boolean(repr, "inkscape:bbox-nodes", !val); + break; + case SP_VERB_TOGGLE_SNAP_NODE: + val = prefs.isTargetSnappable(Inkscape::SNAPTARGET_NODE_CATEGORY); + sp_repr_set_boolean(repr, "inkscape:snap-nodes", !val); + break; + case SP_VERB_TOGGLE_SNAP_PATH: + val = prefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_PATH); + sp_repr_set_boolean(repr, "inkscape:object-paths", !val); + break; + case SP_VERB_TOGGLE_SNAP_PATH_CLIP: + val = prefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_PATH_CLIP); + sp_repr_set_boolean(repr, "inkscape:snap-path-clip", !val); + break; + case SP_VERB_TOGGLE_SNAP_PATH_MASK: + val = prefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_PATH_MASK); + sp_repr_set_boolean(repr, "inkscape:snap-path-mask", !val); + break; + case SP_VERB_TOGGLE_SNAP_NODE_CUSP: + val = prefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_NODE_CUSP); + sp_repr_set_boolean(repr, "inkscape:object-nodes", !val); + break; + case SP_VERB_TOGGLE_SNAP_NODE_SMOOTH: + val = prefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_NODE_SMOOTH); + sp_repr_set_boolean(repr, "inkscape:snap-smooth-nodes", !val); + break; + case SP_VERB_TOGGLE_SNAP_PATH_INTERSECTION: + val = prefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_PATH_INTERSECTION); + sp_repr_set_boolean(repr, "inkscape:snap-intersection-paths", !val); + break; + case SP_VERB_TOGGLE_SNAP_OTHERS: + val = prefs.isTargetSnappable(Inkscape::SNAPTARGET_OTHERS_CATEGORY); + sp_repr_set_boolean(repr, "inkscape:snap-others", !val); + break; + case SP_VERB_TOGGLE_SNAP_ROTATION_CENTER: + val = prefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_ROTATION_CENTER); + sp_repr_set_boolean(repr, "inkscape:snap-center", !val); + break; + case SP_VERB_TOGGLE_SNAP_GRID: + val = prefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_GRID); + sp_repr_set_boolean(repr, "inkscape:snap-grids", !val); + break; + case SP_VERB_TOGGLE_SNAP_GUIDE: + val = prefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_GUIDE); + sp_repr_set_boolean(repr, "inkscape:snap-to-guides", !val); + break; + case SP_VERB_TOGGLE_SNAP_PAGE_BORDER: + val = prefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_PAGE_BORDER); + sp_repr_set_boolean(repr, "inkscape:snap-page", !val); + break; + case SP_VERB_TOGGLE_SNAP_LINE_MIDPOINT: + val = prefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_LINE_MIDPOINT); + sp_repr_set_boolean(repr, "inkscape:snap-midpoints", !val); + break; + case SP_VERB_TOGGLE_SNAP_OBJECT_MIDPOINT: + val = prefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_OBJECT_MIDPOINT); + sp_repr_set_boolean(repr, "inkscape:snap-object-midpoints", !val); + break; + case SP_VERB_TOGGLE_SNAP_TEXT_BASELINE: + val = prefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_TEXT_BASELINE); + sp_repr_set_boolean(repr, "inkscape:snap-text-baseline", !val); + break; + case SP_VERB_TOGGLE_SNAP_BBOX_EDGE_MIDPOINT: + val = prefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_BBOX_EDGE_MIDPOINT); + sp_repr_set_boolean(repr, "inkscape:snap-bbox-edge-midpoints", !val); + break; + case SP_VERB_TOGGLE_SNAP_BBOX_MIDPOINT: + val = prefs.isSnapButtonEnabled(Inkscape::SNAPTARGET_BBOX_MIDPOINT); + sp_repr_set_boolean(repr, "inkscape:snap-bbox-midpoints", !val); + break; + default: + break; + } + doc->setModifiedSinceSave(); +} + /** * Decode the verb code and take appropriate action. */ @@ -3052,7 +3193,6 @@ Verb *Verb::_base_verbs[] = { N_("Show or hide guides (drag from a ruler to create a guide)"), INKSCAPE_ICON("show-guides")), new ZoomVerb(SP_VERB_TOGGLE_ROTATION_LOCK, "ToggleRotationLock", N_("Lock rotation"), N_("Lock canvas rotation"), nullptr), - new ZoomVerb(SP_VERB_TOGGLE_SNAPPING, "ToggleSnapGlobal", N_("Snap"), N_("Enable snapping"), INKSCAPE_ICON("snap")), new ZoomVerb(SP_VERB_TOGGLE_COMMANDS_TOOLBAR, "ToggleCommandsToolbar", N_("_Commands Bar"), N_("Show or hide the Commands bar (under the menu)"), nullptr), new ZoomVerb(SP_VERB_TOGGLE_SNAP_TOOLBAR, "ToggleSnapToolbar", N_("Sn_ap Controls Bar"), @@ -3107,6 +3247,29 @@ Verb *Verb::_base_verbs[] = { N_("Open a window to preview objects at different icon resolutions"), INKSCAPE_ICON("dialog-icon-preview")), + // Snap + new SnapVerb(SP_VERB_TOGGLE_SNAP_GLOBAL, "ToggleSnapGlobal", N_("Snap"), N_("Enable snapping"), INKSCAPE_ICON("snap")), + new SnapVerb(SP_VERB_TOGGLE_SNAP_BBOX, "ToggleSnapBBox", N_("Bounding box"), N_("Snap bounding boxes"), INKSCAPE_ICON("snap")), + new SnapVerb(SP_VERB_TOGGLE_SNAP_NODE, "ToggleSnapNode", _("Nodes"), _("Snap nodes, paths, and handles"), INKSCAPE_ICON("snap")), + new SnapVerb(SP_VERB_TOGGLE_SNAP_OTHERS, "ToggleSnapOthers", _("Others"), _("Snap other points (centers, guide origins, gradient handles, etc.)"), INKSCAPE_ICON("snap")), + new SnapVerb(SP_VERB_TOGGLE_SNAP_ROTATION_CENTER, "ToggleSnapRotation", _("Rotation Centers"), _("Snap an item's rotation center"), INKSCAPE_ICON("snap-nodes-rotation-center")), + new SnapVerb(SP_VERB_TOGGLE_SNAP_GRID, "ToggleSnapGrids", N_("Grids"), N_("Snap to grids"), INKSCAPE_ICON("grid-rectangular")), + new SnapVerb(SP_VERB_TOGGLE_SNAP_GUIDE, "ToggleSnapGuide", _("Guides"), _("Snap guides"), INKSCAPE_ICON("guides")), + new SnapVerb(SP_VERB_TOGGLE_SNAP_NODE_SMOOTH, "ToggleSnapNodeSmooth", _("Smooth nodes"), _("Snap smooth nodes, incl. quadrant points of ellipses"), INKSCAPE_ICON("snap-nodes-smooth")), + new SnapVerb(SP_VERB_TOGGLE_SNAP_LINE_MIDPOINT, "ToggleSnapLineMid", _("Line Midpoints"), _("Snap midpoints of line segments"), INKSCAPE_ICON("snap-nodes-midpoint")), + new SnapVerb(SP_VERB_TOGGLE_SNAP_OBJECT_MIDPOINT, "ToggleSnapObjMid", _("Object Centers"), _("Snap centers of objects"), INKSCAPE_ICON("snap-nodes-center")), + new SnapVerb(SP_VERB_TOGGLE_SNAP_TEXT_BASELINE, "ToggleSnapTextBase", _("Text baseline"), _("Snap text anchors and baselines"), INKSCAPE_ICON("snap-text-baseline")), + new SnapVerb(SP_VERB_TOGGLE_SNAP_BBOX_EDGE_MIDPOINT, "ToggleSnapBBoxEdgeMid", _("BBox Edge Midpoints"), _("Snap midpoints of bounding box edges"), INKSCAPE_ICON("snap-bounding-box-midpoints")), + new SnapVerb(SP_VERB_TOGGLE_SNAP_BBOX_MIDPOINT, "ToggleSnapBBoxMid", _("BBox Centers"), _("Snapping centers of bounding boxes"), INKSCAPE_ICON("snap-bounding-box-center")), + new SnapVerb(SP_VERB_TOGGLE_SNAP_PATH_INTERSECTION, "ToggleSnapIntersection", _("Path intersections"), _("Snap to path intersections"), INKSCAPE_ICON("snap-nodes-intersection")), + new SnapVerb(SP_VERB_TOGGLE_SNAP_PATH, "ToggleSnapPath", _("Paths"), _("Snap to paths"), INKSCAPE_ICON("snap-nodes-path")), + new SnapVerb(SP_VERB_TOGGLE_SNAP_PATH_CLIP, "ToggleSnapPathClip", _("Path Clip"), _("Snap to the path clip"), INKSCAPE_ICON("snap-nodes-path")), + new SnapVerb(SP_VERB_TOGGLE_SNAP_PATH_MASK, "ToggleSnapPathMask", _("Path Mask"), _("Snap to the path mask"), INKSCAPE_ICON("snap-nodes-path")), + new SnapVerb(SP_VERB_TOGGLE_SNAP_NODE_CUSP, "ToggleSnapNodeCusp", _("To nodes"), _("Snap to cusp nodes, incl. rectangle corners"), INKSCAPE_ICON("snap-nodes-cusp")), + new SnapVerb(SP_VERB_TOGGLE_SNAP_BBOX_EDGE, "ToggleSnapBBoxEdge", _("Bounding box edges"), _("Snap to edges of a bounding box"), INKSCAPE_ICON("snap-bounding-box-edges")), + new SnapVerb(SP_VERB_TOGGLE_SNAP_BBOX_CORNER, "ToggleSnapBBoxCorner", _("Bounding box corners"), _("Snap bounding box corners"), INKSCAPE_ICON("snap-bounding-box-corners")), + new SnapVerb(SP_VERB_TOGGLE_SNAP_PAGE_BORDER, "ToggleSnapPageBorder", _("Page border"), _("Snap to the page border"), INKSCAPE_ICON("snap-page")), + // Dialogs new DialogVerb(SP_VERB_DIALOG_PROTOTYPE, "DialogPrototype", N_("Prototype..."), N_("Prototype Dialog"), INKSCAPE_ICON("preferences-system")), diff --git a/src/verbs.h b/src/verbs.h index 42f331f0ec..dc739344f8 100644 --- a/src/verbs.h +++ b/src/verbs.h @@ -272,7 +272,6 @@ enum { SP_VERB_TOGGLE_GRID, SP_VERB_TOGGLE_GUIDES, SP_VERB_TOGGLE_ROTATION_LOCK, - SP_VERB_TOGGLE_SNAPPING, SP_VERB_TOGGLE_COMMANDS_TOOLBAR, SP_VERB_TOGGLE_SNAP_TOOLBAR, SP_VERB_TOGGLE_TOOL_TOOLBAR, @@ -290,7 +289,6 @@ enum { SP_VERB_VIEW_MODE_TOGGLE, SP_VERB_VIEW_COLOR_MODE_NORMAL, SP_VERB_VIEW_COLOR_MODE_GRAYSCALE, - // SP_VERB_VIEW_COLOR_MODE_PRINT_COLORS_PREVIEW, SP_VERB_VIEW_COLOR_MODE_TOGGLE, SP_VERB_VIEW_TOGGLE_SPLIT, @@ -298,6 +296,29 @@ enum { SP_VERB_VIEW_CMS_TOGGLE, SP_VERB_VIEW_ICON_PREVIEW, + /* Snapping */ + SP_VERB_TOGGLE_SNAP_GLOBAL, + SP_VERB_TOGGLE_SNAP_BBOX, + SP_VERB_TOGGLE_SNAP_NODE, + SP_VERB_TOGGLE_SNAP_OTHERS, + SP_VERB_TOGGLE_SNAP_ROTATION_CENTER, + SP_VERB_TOGGLE_SNAP_GRID, + SP_VERB_TOGGLE_SNAP_GUIDE, + SP_VERB_TOGGLE_SNAP_NODE_SMOOTH, + SP_VERB_TOGGLE_SNAP_LINE_MIDPOINT, + SP_VERB_TOGGLE_SNAP_OBJECT_MIDPOINT, + SP_VERB_TOGGLE_SNAP_TEXT_BASELINE, + SP_VERB_TOGGLE_SNAP_BBOX_EDGE_MIDPOINT, + SP_VERB_TOGGLE_SNAP_BBOX_MIDPOINT, + SP_VERB_TOGGLE_SNAP_PATH_INTERSECTION, + SP_VERB_TOGGLE_SNAP_PATH, + SP_VERB_TOGGLE_SNAP_PATH_CLIP, + SP_VERB_TOGGLE_SNAP_PATH_MASK, + SP_VERB_TOGGLE_SNAP_NODE_CUSP, + SP_VERB_TOGGLE_SNAP_BBOX_EDGE, + SP_VERB_TOGGLE_SNAP_BBOX_CORNER, + SP_VERB_TOGGLE_SNAP_PAGE_BORDER, + /* Dialogs */ SP_VERB_DIALOG_PROTOTYPE, SP_VERB_DIALOG_DISPLAY, -- GitLab