14#include <unordered_map>
15#include <giomm/actionmap.h>
16#include <glibmm/i18n.h>
17#include <glibmm/ustring.h>
43typedef std::unordered_map<SnapTargetType, Glib::ustring>
SnapMap;
87 {
"simple-snap-bbox", SimpleSnap::BBox,
true },
88 {
"simple-snap-nodes", SimpleSnap::Nodes,
true },
89 {
"simple-snap-alignment", SimpleSnap::Alignment,
false }
95 for (
auto&& snap :
snap_bbox) { map[snap.type] = snap.action_name; }
96 for (
auto&& snap :
snap_node) { map[snap.type] = snap.action_name; }
97 for (
auto&& snap :
snap_alignment) { map[snap.type] = snap.action_name; }
107 vect.insert(vect.end(), v->begin(), v->end());
119 static bool initialized =
false;
125 bool enabled = prefs->getBool(
snap_pref_path + info.action_name, info.set);
129 bool enabled = prefs->getBool(
snap_pref_path + info.action_name, info.set);
133 auto simple = prefs->getEntry(
"/toolbox/simplesnap");
134 if (!simple.isSet()) {
136 prefs->setBool(simple.getPath(),
true);
162 g_warning(
"No action for snap target type %d",
int(type));
184 case SimpleSnap::BBox:
187 case SimpleSnap::Nodes:
190 case SimpleSnap::Alignment:
193 case SimpleSnap::Rest:
197 show_output(Glib::ustring(
"missing case statement in ") + __func__);
202 for (
auto&& info : *vect) {
203 bool enable = value && info.set;
209 if (info.option ==
option) {
243const Glib::ustring
SECTION = NC_(
"Action Section",
"Snap");
247 {
"win.snap-global-toggle", N_(
"Snapping"),
SECTION, N_(
"Toggle snapping on/off") },
249 {
"win.snap-alignment", N_(
"Snap Objects that Align"),
SECTION, N_(
"Toggle alignment snapping") },
250 {
"win.snap-alignment-self", N_(
"Snap Nodes that Align"),
SECTION, N_(
"Toggle alignment snapping to nodes in the same path")},
252 {
"win.snap-distribution", N_(
"Snap Objects at Equal Distances"),
SECTION, N_(
"Toggle snapping objects at equal distances")},
254 {
"win.snap-bbox", N_(
"Snap Bounding Boxes"),
SECTION, N_(
"Toggle snapping to bounding boxes (global)") },
255 {
"win.snap-bbox-edge", N_(
"Snap Bounding Box Edges"),
SECTION, N_(
"Toggle snapping to bounding-box edges") },
256 {
"win.snap-bbox-corner", N_(
"Snap Bounding Box Corners"),
SECTION, N_(
"Toggle snapping to bounding-box corners") },
257 {
"win.snap-bbox-edge-midpoint", N_(
"Snap Bounding Box Edge Midpoints"),
SECTION, N_(
"Toggle snapping to bounding-box edge mid-points") },
258 {
"win.snap-bbox-center", N_(
"Snap Bounding Box Centers"),
SECTION, N_(
"Toggle snapping to bounding-box centers") },
260 {
"win.snap-node-category", N_(
"Snap Nodes"),
SECTION, N_(
"Toggle snapping to nodes (global)") },
261 {
"win.snap-path", N_(
"Snap Paths"),
SECTION, N_(
"Toggle snapping to paths") },
262 {
"win.snap-path-intersection", N_(
"Snap Path Intersections"),
SECTION, N_(
"Toggle snapping to path intersections") },
263 {
"win.snap-node-cusp", N_(
"Snap Cusp Nodes"),
SECTION, N_(
"Toggle snapping to cusp nodes, including rectangle corners")},
264 {
"win.snap-node-smooth", N_(
"Snap Smooth Node"),
SECTION, N_(
"Toggle snapping to smooth nodes, including quadrant points of ellipses")},
265 {
"win.snap-line-midpoint", N_(
"Snap Line Midpoints"),
SECTION, N_(
"Toggle snapping to midpoints of lines") },
266 {
"win.snap-line-perpendicular", N_(
"Snap Perpendicular Lines"),
SECTION, N_(
"Toggle snapping to perpendicular lines") },
267 {
"win.snap-line-tangential", N_(
"Snap Tangential Lines"),
SECTION, N_(
"Toggle snapping to tangential lines") },
269 {
"win.snap-others", N_(
"Snap Others"),
SECTION, N_(
"Toggle snapping to misc. points (global)") },
270 {
"win.snap-object-midpoint", N_(
"Snap Object Midpoint"),
SECTION, N_(
"Toggle snapping to object midpoint") },
271 {
"win.snap-rotation-center", N_(
"Snap Rotation Center"),
SECTION, N_(
"Toggle snapping to object rotation center") },
272 {
"win.snap-text-baseline", N_(
"Snap Text Baselines"),
SECTION, N_(
"Toggle snapping to text baseline and text anchors") },
274 {
"win.snap-page-border", N_(
"Snap Page Border"),
SECTION, N_(
"Toggle snapping to page border") },
275 {
"win.snap-page-margin", N_(
"Snap Page Margin"),
SECTION, N_(
"Toggle snapping to page margin") },
276 {
"win.snap-grid", N_(
"Snap Grids"),
SECTION, N_(
"Toggle snapping to grids") },
277 {
"win.snap-grid-line", N_(
"Snap Grid Lines"),
SECTION, N_(
"Toggle snapping to grid lines") },
278 {
"win.snap-guide", N_(
"Snap Guide Lines"),
SECTION, N_(
"Toggle snapping to guide lines") },
280 {
"win.snap-path-mask", N_(
"Snap Mask Paths"),
SECTION, N_(
"Toggle snapping to mask paths") },
281 {
"win.snap-path-clip", N_(
"Snap Clip Paths"),
SECTION, N_(
"Toggle snapping to clip paths") },
283 {
"win.simple-snap-bbox", N_(
"Simple Snap Bounding Box"),
SECTION, N_(
"Toggle snapping to bounding boxes") },
284 {
"win.simple-snap-nodes", N_(
"Simple Snap Nodes"),
SECTION, N_(
"Toggle snapping to nodes") },
285 {
"win.simple-snap-alignment", N_(
"Simple Snap Alignment"),
SECTION, N_(
"Toggle alignment snapping") },
289 assert(map !=
nullptr);
293 bool enabled = !pref.getSnapEnabledGlobally();
294 pref.setSnapEnabledGlobally(enabled);
311 show_output(
"add_actions_canvas_snapping: no app!");
327 Glib::RefPtr<Gio::Action> action = map.lookup_action(
action_name);
329 show_output(Glib::ustring(
"set_actions_canvas_snapping_helper: action ") +
action_name.raw() +
" missing!");
333 auto simple = std::dynamic_pointer_cast<Gio::SimpleAction>(action);
335 show_output(Glib::ustring(
"set_actions_canvas_snapping_helper: action ") +
action_name.raw() +
" not SimpleAction!");
339 simple->change_state(state);
340 simple->set_enabled(enabled);
345 bool global = snapprefs.getSnapEnabledGlobally();
353 struct {
const char* action;
bool state;
bool enabled; } snap_options[] = {
354 {
"snap-global-toggle", global,
true },
356 {
"snap-alignment", alignment, global },
358 {
"snap-distribution", distribution, global && alignment},
360 {
"snap-bbox", bbox, global },
366 {
"snap-node-category",
node, global },
375 {
"snap-others", other, global },
385 {
"snap-grid", snapprefs.isSnapButtonEnabled(
SNAPTARGET_GRID), global },
389 {
"simple-snap-bbox", bbox, global },
390 {
"simple-snap-nodes",
node, global },
391 {
"simple-snap-alignment", alignment, global },
394 for (
auto&& snap : snap_options) {
405 if (
auto* dt = SP_ACTIVE_DESKTOP) {
406 if (Gio::ActionMap* map = dt->getInkscapeWindow()) {
static void canvas_snapping_toggle(Gio::ActionMap &map, SnapTargetType type)
std::vector< SnapInfo > SnapVector
void transition_to_simple_snapping()
Simple snapping groups existing "advanced" options into three easy to understand choices (bounding bo...
void set_actions_canvas_snapping(Gio::ActionMap &map)
const Glib::ustring snap_pref_path
const struct @10 simple_snap_options[]
const Glib::ustring SECTION
void set_canvas_snapping(SnapTargetType type, bool enabled)
void set_actions_canvas_snapping_helper(Gio::ActionMap &map, Glib::ustring action_name, bool state, bool enabled)
void apply_simple_snap_defaults(Gio::ActionMap &map)
const SnapMap & get_snap_map()
void add_actions_canvas_snapping(Gio::ActionMap *map)
const Glib::ustring global_toggle
void store_snapping_action(const Glib::ustring &action_name, bool enabled)
SnapPreferences & get_snapping_preferences()
void toggle_simple_snap_option(Gio::ActionMap &map, SimpleSnap option)
const SnapVector & get_snap_vect()
SnapVector snap_all_the_rest
SnapVector snap_alignment
std::vector< std::vector< Glib::ustring > > raw_data_canvas_snapping
void set_simple_snap(SimpleSnap option, bool value)
void update_actions(Gio::ActionMap &map)
std::unordered_map< SnapTargetType, Glib::ustring > SnapMap
void show_output(Glib::ustring const &data, bool const is_cerr)
static InkscapeApplication * instance()
Singleton instance.
static Preferences * get()
Access the singleton Preferences object.
void setBool(Glib::ustring const &pref_path, bool value)
Set a Boolean value.
Storing of snapping preferences.
void setSnapEnabledGlobally(bool enabled)
void setTargetSnappable(Inkscape::SnapTargetType const target, bool enabled)
bool get_simple_snap(Inkscape::SimpleSnap option) const
bool isSnapButtonEnabled(Inkscape::SnapTargetType const target) const
void set_simple_snap(Inkscape::SimpleSnap option, bool enable)
Editable view implementation.
Inkscape::XML::Node * node
Inkscape - An SVG editor.
GType type()
Returns the type used for storing an object of type T inside a value.
Helper class to stream background task notifications as a series of messages.
@ SNAPTARGET_BBOX_EDGE_MIDPOINT
@ SNAPTARGET_PAGE_MARGIN_BORDER
@ SNAPTARGET_ROTATION_CENTER
@ SNAPTARGET_LINE_MIDPOINT
@ SNAPTARGET_OTHERS_CATEGORY
@ SNAPTARGET_BBOX_MIDPOINT
@ SNAPTARGET_ALIGNMENT_CATEGORY
@ SNAPTARGET_DISTRIBUTION_CATEGORY
@ SNAPTARGET_NODE_CATEGORY
@ SNAPTARGET_PAGE_EDGE_BORDER
@ SNAPTARGET_ALIGNMENT_HANDLE
@ SNAPTARGET_TEXT_BASELINE
@ SNAPTARGET_OBJECT_MIDPOINT
@ SNAPTARGET_PATH_TANGENTIAL
@ SNAPTARGET_PATH_PERPENDICULAR
@ SNAPTARGET_PATH_INTERSECTION
@ SNAPTARGET_BBOX_CATEGORY
Singleton class to access the preferences file in a convenient way.