diff --git a/data/gui.xml b/data/gui.xml index 220cbb132..f6de98327 100644 --- a/data/gui.xml +++ b/data/gui.xml @@ -708,6 +708,7 @@ + diff --git a/src/app/CMakeLists.txt b/src/app/CMakeLists.txt index a9e80d73c..429633de3 100644 --- a/src/app/CMakeLists.txt +++ b/src/app/CMakeLists.txt @@ -280,6 +280,7 @@ add_library(app-lib commands/cmd_keyboard_shortcuts.cpp commands/cmd_launch.cpp commands/cmd_layer_from_background.cpp + commands/cmd_layer_lock.cpp commands/cmd_layer_opacity.cpp commands/cmd_layer_properties.cpp commands/cmd_layer_visibility.cpp diff --git a/src/app/commands/cmd_layer_lock.cpp b/src/app/commands/cmd_layer_lock.cpp new file mode 100644 index 000000000..5c6155770 --- /dev/null +++ b/src/app/commands/cmd_layer_lock.cpp @@ -0,0 +1,98 @@ +// Aseprite +// Copyright (C) 2017 David Capello +// +// This program is distributed under the terms of +// the End-User License Agreement for Aseprite. + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "app/app.h" +#include "app/commands/command.h" +#include "app/context_access.h" +#include "app/modules/gui.h" +#include "app/ui/timeline/timeline.h" +#include "doc/image.h" +#include "doc/layer.h" + +namespace app { + +using namespace ui; + +class LayerLockCommand : public Command { +public: + LayerLockCommand(); + Command* clone() const override { return new LayerLockCommand(*this); } + +protected: + bool onEnabled(Context* context) override; + bool onChecked(Context* context) override; + void onExecute(Context* context) override; +}; + +LayerLockCommand::LayerLockCommand() + : Command("LayerLock", + "Lock Layers", + CmdRecordableFlag) +{ +} + +bool LayerLockCommand::onEnabled(Context* context) +{ + return context->checkFlags(ContextFlags::ActiveDocumentIsWritable | + ContextFlags::HasActiveLayer); +} + +bool LayerLockCommand::onChecked(Context* context) +{ + const ContextReader reader(context); + if (!reader.document() || + !reader.layer()) + return false; + + SelectedLayers selLayers; + auto range = App::instance()->timeline()->range(); + if (range.enabled()) { + selLayers = range.selectedLayers(); + } + else { + selLayers.insert(const_cast(reader.layer())); + } + bool lock = false; + for (auto layer : selLayers) { + if (layer && !layer->isEditable()) + lock = true; + } + return lock; +} + +void LayerLockCommand::onExecute(Context* context) +{ + ContextWriter writer(context); + SelectedLayers selLayers; + auto range = App::instance()->timeline()->range(); + if (range.enabled()) { + selLayers = range.selectedLayers(); + } + else { + selLayers.insert(writer.layer()); + } + bool anyLock = false; + for (auto layer : selLayers) { + if (!layer->isEditable()) + anyLock = true; + } + for (auto layer : selLayers) { + layer->setEditable(anyLock); + } + + update_screen_for_document(writer.document()); +} + +Command* CommandFactory::createLayerLockCommand() +{ + return new LayerLockCommand; +} + +} // namespace app diff --git a/src/app/commands/commands_list.h b/src/app/commands/commands_list.h index c50b15645..fd9a601a6 100644 --- a/src/app/commands/commands_list.h +++ b/src/app/commands/commands_list.h @@ -63,6 +63,7 @@ FOR_EACH_COMMAND(InvertMask) FOR_EACH_COMMAND(KeyboardShortcuts) FOR_EACH_COMMAND(Launch) FOR_EACH_COMMAND(LayerFromBackground) +FOR_EACH_COMMAND(LayerLock) FOR_EACH_COMMAND(LayerOpacity) FOR_EACH_COMMAND(LayerProperties) FOR_EACH_COMMAND(LayerVisibility)