summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJohn Smith <john.smith7545@yahoo.com>2012-10-11 09:43:21 +0000
committerJohn Smith <john.smith7545@yahoo.com>2012-10-11 09:43:21 +0000
commitc520388928f8cc85d91f24a2f01fa7549096fe83 (patch)
tree5b5f0a7b4433dc22a1080c722b78e04f7fc779e4 /src
parentFix for 171904 : toggleToolbox verb (diff)
downloadinkscape-c520388928f8cc85d91f24a2f01fa7549096fe83.tar.gz
inkscape-c520388928f8cc85d91f24a2f01fa7549096fe83.zip
Fix for 191020 : Lock/Unlock all layers - Lock other layers
(bzr r11779)
Diffstat (limited to 'src')
-rw-r--r--src/desktop.cpp29
-rw-r--r--src/desktop.h1
-rw-r--r--src/ui/dialog/layers.cpp7
-rw-r--r--src/verbs.cpp13
-rw-r--r--src/verbs.h1
5 files changed, 49 insertions, 2 deletions
diff --git a/src/desktop.cpp b/src/desktop.cpp
index bfec523db..fa0c8647f 100644
--- a/src/desktop.cpp
+++ b/src/desktop.cpp
@@ -511,6 +511,35 @@ void SPDesktop::toggleLockAllLayers(bool lock) {
}
}
+void SPDesktop::toggleLockOtherLayers(SPObject *object) {
+ g_return_if_fail(SP_IS_GROUP(object));
+ g_return_if_fail( currentRoot() == object || (currentRoot() && currentRoot()->isAncestorOf(object)) );
+
+ bool othersLocked = false;
+ std::vector<SPObject*> layers;
+ for ( SPObject* obj = Inkscape::next_layer(currentRoot(), object); obj; obj = Inkscape::next_layer(currentRoot(), obj) ) {
+ // Dont lock any ancestors, since that would in turn lock the layer as well
+ if (!obj->isAncestorOf(object)) {
+ layers.push_back(obj);
+ othersLocked |= !SP_ITEM(obj)->isLocked();
+ }
+ }
+ for ( SPObject* obj = Inkscape::previous_layer(currentRoot(), object); obj; obj = Inkscape::previous_layer(currentRoot(), obj) ) {
+ if (!obj->isAncestorOf(object)) {
+ layers.push_back(obj);
+ othersLocked |= !SP_ITEM(obj)->isLocked();
+ }
+ }
+
+ SPItem *item = SP_ITEM(object);
+ if ( item->isLocked() ) {
+ item->setLocked(false);
+ }
+
+ for ( std::vector<SPObject*>::iterator it = layers.begin(); it != layers.end(); ++it ) {
+ SP_ITEM(*it)->setLocked(othersLocked);
+ }
+}
void SPDesktop::toggleLayerSolo(SPObject *object) {
diff --git a/src/desktop.h b/src/desktop.h
index 958e881ed..529199692 100644
--- a/src/desktop.h
+++ b/src/desktop.h
@@ -282,6 +282,7 @@ public:
void toggleLayerSolo(SPObject *object);
void toggleHideAllLayers(bool hide);
void toggleLockAllLayers(bool lock);
+ void toggleLockOtherLayers(SPObject *object);
SPObject *layerForObject(SPObject *object);
bool isLayer(SPObject *object) const;
bool isWithinViewport(SPItem *item) const;
diff --git a/src/ui/dialog/layers.cpp b/src/ui/dialog/layers.cpp
index 44eef89bb..457f7c147 100644
--- a/src/ui/dialog/layers.cpp
+++ b/src/ui/dialog/layers.cpp
@@ -69,6 +69,7 @@ enum {
BUTTON_SOLO,
BUTTON_SHOW_ALL,
BUTTON_HIDE_ALL,
+ BUTTON_LOCK_OTHERS,
BUTTON_LOCK_ALL,
BUTTON_UNLOCK_ALL,
DRAGNDROP
@@ -265,6 +266,11 @@ bool LayersPanel::_executeAction()
_fireAction( SP_VERB_LAYER_HIDE_ALL );
}
break;
+ case BUTTON_LOCK_OTHERS:
+ {
+ _fireAction( SP_VERB_LAYER_LOCK_OTHERS );
+ }
+ break;
case BUTTON_LOCK_ALL:
{
_fireAction( SP_VERB_LAYER_LOCK_ALL );
@@ -888,6 +894,7 @@ LayersPanel::LayersPanel() :
_popupMenu.append(*manage(new Gtk::SeparatorMenuItem()));
+ _watching.push_back( &_addPopupItem( targetDesktop, SP_VERB_LAYER_LOCK_OTHERS, 0, "Lock Others", (int)BUTTON_LOCK_OTHERS ) );
_watching.push_back( &_addPopupItem( targetDesktop, SP_VERB_LAYER_LOCK_ALL, 0, "Lock All", (int)BUTTON_LOCK_ALL ) );
_watching.push_back( &_addPopupItem( targetDesktop, SP_VERB_LAYER_UNLOCK_ALL, 0, "Unlock All", (int)BUTTON_UNLOCK_ALL ) );
diff --git a/src/verbs.cpp b/src/verbs.cpp
index 55d114e9d..450b800c1 100644
--- a/src/verbs.cpp
+++ b/src/verbs.cpp
@@ -1351,13 +1351,20 @@ void LayerVerb::perform(SPAction *action, void *data)
DocumentUndo::maybeDone(sp_desktop_document(dt), "layer:hideall", SP_VERB_LAYER_HIDE_ALL, _("Hide all layers"));
break;
}
-
case SP_VERB_LAYER_LOCK_ALL: {
dt->toggleLockAllLayers( true );
DocumentUndo::maybeDone(sp_desktop_document(dt), "layer:lockall", SP_VERB_LAYER_LOCK_ALL, _("Lock all layers"));
break;
}
-
+ case SP_VERB_LAYER_LOCK_OTHERS: {
+ if ( dt->currentLayer() == dt->currentRoot() ) {
+ dt->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("No current layer."));
+ } else {
+ dt->toggleLockOtherLayers( dt->currentLayer() );
+ DocumentUndo::maybeDone(sp_desktop_document(dt), "layer:lockothers", SP_VERB_LAYER_LOCK_OTHERS, _("Lock other layers"));
+ }
+ break;
+ }
case SP_VERB_LAYER_UNLOCK_ALL: {
dt->toggleLockAllLayers( false );
DocumentUndo::maybeDone(sp_desktop_document(dt), "layer:unlockall", SP_VERB_LAYER_UNLOCK_ALL, _("Unlock all layers"));
@@ -2520,6 +2527,8 @@ Verb *Verb::_base_verbs[] = {
N_("Hide all the layers"), NULL),
new LayerVerb(SP_VERB_LAYER_LOCK_ALL, "LayerLockAll", N_("_Lock all layers"),
N_("Lock all the layers"), NULL),
+ new LayerVerb(SP_VERB_LAYER_LOCK_OTHERS, "LayerLockOthers", N_("Lock/Unlock _other layers"),
+ N_("Lock all the other layers"), NULL),
new LayerVerb(SP_VERB_LAYER_UNLOCK_ALL, "LayerUnlockAll", N_("_Unlock all layers"),
N_("Unlock all the layers"), NULL),
new LayerVerb(SP_VERB_LAYER_TOGGLE_LOCK, "LayerToggleLock", N_("_Lock/Unlock Current Layer"),
diff --git a/src/verbs.h b/src/verbs.h
index 5a707ade3..da2adb52e 100644
--- a/src/verbs.h
+++ b/src/verbs.h
@@ -150,6 +150,7 @@ enum {
SP_VERB_LAYER_SHOW_ALL,
SP_VERB_LAYER_HIDE_ALL,
SP_VERB_LAYER_LOCK_ALL,
+ SP_VERB_LAYER_LOCK_OTHERS,
SP_VERB_LAYER_UNLOCK_ALL,
SP_VERB_LAYER_TOGGLE_LOCK,
SP_VERB_LAYER_TOGGLE_HIDE,