summaryrefslogtreecommitdiffstats
path: root/src/actions/actions-hide-lock.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/actions/actions-hide-lock.cpp237
1 files changed, 237 insertions, 0 deletions
diff --git a/src/actions/actions-hide-lock.cpp b/src/actions/actions-hide-lock.cpp
new file mode 100644
index 0000000..01ccef9
--- /dev/null
+++ b/src/actions/actions-hide-lock.cpp
@@ -0,0 +1,237 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/** \file
+ *
+ * Actions related to hide and lock
+ *
+ * Authors:
+ * Sushant A A <sushant.co19@gmail.com>
+ * Tavmjong Bah
+ *
+ * Copyright (C) 2021-2022 Authors
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include "actions-hide-lock.h"
+
+#include <giomm.h> // Not <gtkmm.h>! To eventually allow a headless version!
+#include <glibmm/i18n.h>
+
+#include "inkscape-application.h"
+#include "document-undo.h"
+
+#include "object/sp-root.h"
+
+// Helper to unlock/unhide everything. (Could also be used to lock/hide everything but that isn't very useful.)
+static bool
+hide_lock_recurse(bool (*f)(SPItem*, bool), SPItem *item, bool hide_or_lock)
+{
+ bool changed = false;
+
+ if (f(item, hide_or_lock)) {
+ changed = true;
+ }
+
+ for (auto& child : item->children) {
+ auto item = dynamic_cast<SPItem*>(&child);
+ if (item && hide_lock_recurse(f, item, hide_or_lock)) {
+ changed = true;
+ }
+ }
+
+ return changed;
+}
+
+// Helper to hide/unhide one item.
+bool
+hide_lock_hide(SPItem* item, bool hide)
+{
+ bool changed = false;
+ if (item->isHidden() != hide) {
+ item->setHidden(hide);
+ changed = true;
+ }
+ return changed;
+}
+
+// Helper to lock/unlock one item.
+bool
+hide_lock_lock(SPItem* item, bool lock)
+{
+ bool changed = false;
+ if (item->isLocked() != lock) {
+ item->setLocked(lock);
+ changed = true;
+ }
+ return changed;
+}
+
+// Unhide all
+void
+hide_lock_unhide_all(InkscapeApplication* app)
+{
+ auto document = app->get_active_document();
+ auto root = document->getRoot();
+
+ bool changed = hide_lock_recurse(&hide_lock_hide, root, false); // Unhide
+
+ if (changed) {
+ Inkscape::DocumentUndo::done(document, _("Unhid all objects in the current layer"), "");
+ }
+}
+
+// Unlock all
+void
+hide_lock_unlock_all(InkscapeApplication* app)
+{
+ auto document = app->get_active_document();
+ auto root = document->getRoot();
+
+ bool changed = hide_lock_recurse(&hide_lock_lock, root, false); // Unlock
+
+ if (changed) {
+ Inkscape::DocumentUndo::done(document, _("Unlocked all objects in the current layer"), "");
+ }
+}
+
+// Unhide selected items and their descendents.
+void
+hide_lock_unhide_below(InkscapeApplication *app)
+{
+ auto selection = app->get_active_selection();
+ if (!selection) {
+ std::cerr << "hide_lock_unhide_below: no selection!" << std::endl;
+ return;
+ }
+
+ bool changed = false;
+ for (auto item : selection->items()) {
+ if (hide_lock_recurse(&hide_lock_hide, item, false)) {
+ changed = true;
+ }
+ }
+
+ if (changed) {
+ auto document = app->get_active_document();
+ Inkscape::DocumentUndo::done(document, _("Unhid selected items and their descendents."), "");
+ }
+}
+
+// Unlock selected items and their descendents.
+void
+hide_lock_unlock_below(InkscapeApplication *app)
+{
+ auto selection = app->get_active_selection();
+ if (!selection) {
+ std::cerr << "hide_lock_unhide_below: no selection!" << std::endl;
+ return;
+ }
+
+ bool changed = false;
+ for (auto item : selection->items()) {
+ if (hide_lock_recurse(&hide_lock_lock, item, false)) {
+ changed = true;
+ }
+ }
+
+ if (changed) {
+ auto document = app->get_active_document();
+ Inkscape::DocumentUndo::done(document, _("Unlocked selected items and their descendents."), "");
+ }
+}
+
+// Hide/unhide selected items.
+void
+hide_lock_hide_selected(InkscapeApplication* app, bool hide)
+{
+ auto selection = app->get_active_selection();
+ if (!selection) {
+ std::cerr << "hide_lock_hide_selected: no selection!" << std::endl;
+ return;
+ }
+
+ bool changed = false;
+ for (auto item : selection->items()) {
+ if (hide_lock_hide(item, hide)) {
+ changed = true;
+ }
+ }
+
+ if (changed) {
+ auto document = app->get_active_document();
+ Inkscape::DocumentUndo::done(document, (hide ? _("Hid selected items.") : _("Unhid selected items.")), "");
+ selection->clear();
+ }
+}
+
+// Lock/Unlock selected items.
+void
+hide_lock_lock_selected(InkscapeApplication* app, bool lock)
+{
+ auto selection = app->get_active_selection();
+ if (!selection) {
+ std::cerr << "hide_lock_lock_selected: no selection!" << std::endl;
+ return;
+ }
+
+ bool changed = false;
+ for (auto item : selection->items()) {
+ if (hide_lock_lock(item, lock)) {
+ changed = true;
+ }
+ }
+
+ if (changed) {
+ auto document = app->get_active_document();
+ Inkscape::DocumentUndo::done(document, (lock ? _("Locked selected items.") : _("Unlocked selected items.")), "");
+ selection->clear();
+ }
+}
+
+std::vector<std::vector<Glib::ustring>> raw_data_hide_lock =
+{
+ // clang-format off
+ {"app.unhide-all", N_("Unhide All"), "Hide and Lock", N_("Unhide all objects") },
+ {"app.unlock-all", N_("Unlock All"), "Hide and Lock", N_("Unlock all objects") },
+
+ {"app.selection-hide", N_("Hide selection"), "Hide and Lock", N_("Hide all selected objects") },
+ {"app.selection-unhide", N_("Unhide selection"), "Hide and Lock", N_("Unhide all selected objects") },
+ {"app.selection-unhide-below", N_("Unhide descendents"), "Hide and Lock", N_("Unhide all items inside selected objects") },
+
+ {"app.selection-lock", N_("Lock selection"), "Hide and Lock", N_("Lock all selected objects") },
+ {"app.selection-unlock", N_("Unlock selection"), "Hide and Lock", N_("Unlock all selected objects") },
+ {"app.selection-unlock-below", N_("Unlock descendents"), "Hide and Lock", N_("Unlock all items inside selected objects") },
+ // clang-format on
+};
+
+void
+add_actions_hide_lock(InkscapeApplication* app)
+{
+ auto *gapp = app->gio_app();
+
+ // clang-format off
+ gapp->add_action( "unhide-all", sigc::bind<InkscapeApplication*>( sigc::ptr_fun(&hide_lock_unhide_all), app));
+ gapp->add_action( "unlock-all", sigc::bind<InkscapeApplication*>( sigc::ptr_fun(&hide_lock_unlock_all), app));
+
+ gapp->add_action( "selection-hide", sigc::bind<InkscapeApplication*, bool>(sigc::ptr_fun(&hide_lock_hide_selected), app, true ));
+ gapp->add_action( "selection-unhide", sigc::bind<InkscapeApplication*, bool>(sigc::ptr_fun(&hide_lock_hide_selected), app, false));
+ gapp->add_action( "selection-unhide-below", sigc::bind<InkscapeApplication*>( sigc::ptr_fun(&hide_lock_unhide_below), app));
+
+ gapp->add_action( "selection-lock", sigc::bind<InkscapeApplication*, bool>(sigc::ptr_fun(&hide_lock_lock_selected), app, true ));
+ gapp->add_action( "selection-unlock", sigc::bind<InkscapeApplication*, bool>(sigc::ptr_fun(&hide_lock_lock_selected), app, false));
+ gapp->add_action( "selection-unlock-below", sigc::bind<InkscapeApplication*>( sigc::ptr_fun(&hide_lock_unlock_below), app));
+ // clang-format on
+
+ app->get_action_extra_data().add_data(raw_data_hide_lock);
+}
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :