mirror of
https://github.com/aseprite/aseprite.git
synced 2025-04-10 03:44:16 +00:00
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:
parent
b8c5ad074a
commit
8042bbb60d
@ -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);
|
ChunkWriter chunk(f, frame_header, ASE_FILE_CHUNK_LAYER);
|
||||||
|
|
||||||
// Flags
|
// Flags
|
||||||
fputw(static_cast<int>(layer->flags()), f);
|
fputw(static_cast<int>(layer->flags()) &
|
||||||
|
static_cast<int>(doc::LayerFlags::PersistentFlagsMask), f);
|
||||||
|
|
||||||
// Layer type
|
// Layer type
|
||||||
fputw((layer->isImage() ? ASE_FILE_LAYER_IMAGE:
|
fputw((layer->isImage() ? ASE_FILE_LAYER_IMAGE:
|
||||||
|
@ -769,8 +769,48 @@ bool Timeline::onProcessMessage(Message* msg)
|
|||||||
if (validLayer(m_clk.layer)) {
|
if (validLayer(m_clk.layer)) {
|
||||||
Row& row = m_rows[m_clk.layer];
|
Row& row = m_rows[m_clk.layer];
|
||||||
Layer* layer = row.layer();
|
Layer* layer = row.layer();
|
||||||
ASSERT(layer);
|
ASSERT(layer)
|
||||||
if (layer->isVisible())
|
|
||||||
|
// 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;
|
m_state = STATE_HIDING_LAYERS;
|
||||||
else
|
else
|
||||||
m_state = STATE_SHOWING_LAYERS;
|
m_state = STATE_SHOWING_LAYERS;
|
||||||
|
@ -417,7 +417,9 @@ doc::Layer* AsepriteDecoder::readLayerChunk(AsepriteHeader* header,
|
|||||||
|
|
||||||
if (layer) {
|
if (layer) {
|
||||||
// flags
|
// flags
|
||||||
layer->setFlags(static_cast<doc::LayerFlags>(flags));
|
layer->setFlags(static_cast<doc::LayerFlags>(
|
||||||
|
flags &
|
||||||
|
static_cast<int>(doc::LayerFlags::PersistentFlagsMask)));
|
||||||
|
|
||||||
// name
|
// name
|
||||||
layer->setName(name.c_str());
|
layer->setName(name.c_str());
|
||||||
|
@ -39,6 +39,10 @@ namespace doc {
|
|||||||
Collapsed = 32, // Prefer to show this group layer collapsed
|
Collapsed = 32, // Prefer to show this group layer collapsed
|
||||||
Reference = 64, // Is a reference layer
|
Reference = 64, // Is a reference layer
|
||||||
|
|
||||||
|
PersistentFlagsMask = 0xffff,
|
||||||
|
|
||||||
|
Internal_WasVisible = 0x10000, // Was visible in the alternative state (Alt+click)
|
||||||
|
|
||||||
BackgroundLayerFlags = LockMove | Background,
|
BackgroundLayerFlags = LockMove | Background,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user