Add Alt+click on timeline to hide all layers except the clicked one

https://community.aseprite.org/t/turn-off-all-other-layers/151
This commit is contained in:
David Capello 2017-11-29 17:37:42 -03:00
parent b8c5ad074a
commit 8042bbb60d
4 changed files with 51 additions and 4 deletions

View File

@ -551,7 +551,8 @@ static void ase_file_write_layer_chunk(FILE* f, dio::AsepriteFrameHeader* frame_
ChunkWriter chunk(f, frame_header, ASE_FILE_CHUNK_LAYER);
// Flags
fputw(static_cast<int>(layer->flags()), f);
fputw(static_cast<int>(layer->flags()) &
static_cast<int>(doc::LayerFlags::PersistentFlagsMask), f);
// Layer type
fputw((layer->isImage() ? ASE_FILE_LAYER_IMAGE:

View File

@ -769,8 +769,48 @@ bool Timeline::onProcessMessage(Message* msg)
if (validLayer(m_clk.layer)) {
Row& row = m_rows[m_clk.layer];
Layer* layer = row.layer();
ASSERT(layer);
if (layer->isVisible())
ASSERT(layer)
// Hide everything or restore alternative state
bool oneWithInternalState = false;
if (msg->altPressed()) {
for (const Row& row : m_rows) {
const Layer* l = row.layer();
if (l->hasFlags(LayerFlags::Internal_WasVisible)) {
oneWithInternalState = true;
break;
}
}
// If there is one layer with the internal state, restore the previous visible state
if (oneWithInternalState) {
for (Row& row : m_rows) {
Layer* l = row.layer();
if (l->hasFlags(LayerFlags::Internal_WasVisible)) {
l->setVisible(true);
l->switchFlags(LayerFlags::Internal_WasVisible, false);
}
else {
l->setVisible(false);
}
}
}
// In other case, hide everything
else {
for (Row& row : m_rows) {
Layer* l = row.layer();
l->switchFlags(LayerFlags::Internal_WasVisible, l->isVisible());
l->setVisible(false);
}
}
regenerateRows();
invalidate();
m_document->notifyGeneralUpdate();
}
if (layer->isVisible() && !oneWithInternalState)
m_state = STATE_HIDING_LAYERS;
else
m_state = STATE_SHOWING_LAYERS;

View File

@ -417,7 +417,9 @@ doc::Layer* AsepriteDecoder::readLayerChunk(AsepriteHeader* header,
if (layer) {
// flags
layer->setFlags(static_cast<doc::LayerFlags>(flags));
layer->setFlags(static_cast<doc::LayerFlags>(
flags &
static_cast<int>(doc::LayerFlags::PersistentFlagsMask)));
// name
layer->setName(name.c_str());

View File

@ -39,6 +39,10 @@ namespace doc {
Collapsed = 32, // Prefer to show this group layer collapsed
Reference = 64, // Is a reference layer
PersistentFlagsMask = 0xffff,
Internal_WasVisible = 0x10000, // Was visible in the alternative state (Alt+click)
BackgroundLayerFlags = LockMove | Background,
};