mirror of https://github.com/aseprite/aseprite.git
Timeline: Add support to move several layers
This commit is contained in:
parent
cb11fb3458
commit
eabb65be50
|
|
@ -303,7 +303,7 @@ bool Timeline::onProcessMessage(Message* msg)
|
||||||
const DocumentReader document(const_cast<Document*>(m_document));
|
const DocumentReader document(const_cast<Document*>(m_document));
|
||||||
const Sprite* sprite = m_sprite;
|
const Sprite* sprite = m_sprite;
|
||||||
int old_layer = getLayerIndex(m_layer);
|
int old_layer = getLayerIndex(m_layer);
|
||||||
bool selectLayer = (mouseMsg->left() || !isLayerActive(m_layers[m_clk_layer]));
|
bool selectLayer = (mouseMsg->left() || !isLayerActive(m_clk_layer));
|
||||||
FrameNumber frame = m_frame;
|
FrameNumber frame = m_frame;
|
||||||
|
|
||||||
if (selectLayer) {
|
if (selectLayer) {
|
||||||
|
|
@ -318,13 +318,20 @@ bool Timeline::onProcessMessage(Message* msg)
|
||||||
showCel(m_clk_layer, m_frame);
|
showCel(m_clk_layer, m_frame);
|
||||||
|
|
||||||
if (selectLayer) {
|
if (selectLayer) {
|
||||||
|
bool startRange = false;
|
||||||
|
|
||||||
if (msg->ctrlPressed()) {
|
if (msg->ctrlPressed()) {
|
||||||
m_state = STATE_MOVING_LAYER;
|
m_state = STATE_MOVING_LAYER;
|
||||||
|
if (!m_range.inRange(m_clk_layer))
|
||||||
|
startRange = true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
m_state = STATE_SELECTING_LAYERS;
|
m_state = STATE_SELECTING_LAYERS;
|
||||||
m_range.startRange(m_clk_layer, m_frame);
|
startRange = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (startRange)
|
||||||
|
m_range.startRange(m_clk_layer, m_frame);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -566,40 +573,50 @@ bool Timeline::onProcessMessage(Message* msg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if 0
|
|
||||||
// Move a layer.
|
// Move a layer.
|
||||||
else if (mouseMsg->left()) {
|
else if (m_state == STATE_MOVING_LAYER) {
|
||||||
if (m_hot_layer >= 0 &&
|
if (m_hot_layer >= 0
|
||||||
m_hot_layer < (int)m_layers.size() &&
|
&& m_hot_layer < (int)m_layers.size()
|
||||||
m_hot_layer != m_clk_layer &&
|
&& !isLayerActive(m_hot_layer)) {
|
||||||
m_hot_layer != m_clk_layer+1) {
|
|
||||||
if (!m_layers[m_clk_layer]->isBackground()) {
|
|
||||||
// Move the clicked-layer after the hot-layer.
|
|
||||||
try {
|
|
||||||
const ContextReader reader(m_context);
|
|
||||||
ContextWriter writer(reader);
|
|
||||||
|
|
||||||
UndoTransaction undoTransaction(m_context, "Move Layer");
|
if (m_layers[m_clk_layer]->isBackground()) {
|
||||||
m_document->getApi().restackLayerAfter(m_layers[m_clk_layer],
|
Alert::show(PACKAGE "<<You can't move the `Background' layer.||&OK");
|
||||||
m_layers[m_hot_layer]);
|
break;
|
||||||
undoTransaction.commit();
|
}
|
||||||
|
|
||||||
// Select the new layer.
|
// Move the clicked-layer after the hot-layer.
|
||||||
setLayer(m_layers[m_clk_layer]);
|
try {
|
||||||
}
|
const ContextReader reader(m_context);
|
||||||
catch (LockedDocumentException& e) {
|
ContextWriter writer(reader);
|
||||||
Console::showException(e);
|
|
||||||
|
UndoTransaction undoTransaction(m_context, "Move Layer");
|
||||||
|
|
||||||
|
Layer* firstLayer = m_layers[m_range.layerBegin()];
|
||||||
|
Layer* lastLayer = m_layers[m_range.layerEnd()];
|
||||||
|
|
||||||
|
for (int i = m_range.layerBegin(); i <= m_range.layerEnd(); ++i) {
|
||||||
|
m_document->getApi().restackLayerAfter(
|
||||||
|
m_layers[i], m_layers[m_hot_layer]);
|
||||||
}
|
}
|
||||||
|
|
||||||
invalidate();
|
undoTransaction.commit();
|
||||||
|
|
||||||
|
// Select the new layer.
|
||||||
|
setLayer(m_layers[m_clk_layer]);
|
||||||
|
|
||||||
|
regenerateLayers();
|
||||||
|
|
||||||
|
m_range.startRange(getLayerIndex(firstLayer), m_frame);
|
||||||
|
m_range.endRange(getLayerIndex(lastLayer), m_frame);
|
||||||
|
}
|
||||||
|
catch (LockedDocumentException& e) {
|
||||||
|
Console::showException(e);
|
||||||
regenerateLayers();
|
regenerateLayers();
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
Alert::show(PACKAGE "<<You can't move the `Background' layer.||&OK");
|
invalidate();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
break;
|
break;
|
||||||
case A_PART_LAYER_EYE_ICON:
|
case A_PART_LAYER_EYE_ICON:
|
||||||
// Hide/show layer.
|
// Hide/show layer.
|
||||||
|
|
@ -1012,7 +1029,7 @@ void Timeline::drawHeaderFrame(ui::Graphics* g, FrameNumber frame)
|
||||||
void Timeline::drawLayer(ui::Graphics* g, int layer_index)
|
void Timeline::drawLayer(ui::Graphics* g, int layer_index)
|
||||||
{
|
{
|
||||||
Layer* layer = m_layers[layer_index];
|
Layer* layer = m_layers[layer_index];
|
||||||
bool is_active = isLayerActive(layer);
|
bool is_active = isLayerActive(layer_index);
|
||||||
bool hotlayer = (m_hot_layer == layer_index);
|
bool hotlayer = (m_hot_layer == layer_index);
|
||||||
bool clklayer = (m_clk_layer == layer_index);
|
bool clklayer = (m_clk_layer == layer_index);
|
||||||
gfx::Rect bounds = getPartBounds(A_PART_LAYER, layer_index, FrameNumber(0));
|
gfx::Rect bounds = getPartBounds(A_PART_LAYER, layer_index, FrameNumber(0));
|
||||||
|
|
@ -1060,7 +1077,7 @@ void Timeline::drawCel(ui::Graphics* g, int layer_index, FrameNumber frame, Cel*
|
||||||
bool is_hover = (m_hot_part == A_PART_CEL &&
|
bool is_hover = (m_hot_part == A_PART_CEL &&
|
||||||
m_hot_layer == layer_index &&
|
m_hot_layer == layer_index &&
|
||||||
m_hot_frame == frame);
|
m_hot_frame == frame);
|
||||||
bool is_active = (isLayerActive(layer) || isFrameActive(frame));
|
bool is_active = (isLayerActive(layer_index) || isFrameActive(frame));
|
||||||
bool is_empty = (image == NULL);
|
bool is_empty = (image == NULL);
|
||||||
gfx::Rect bounds = getPartBounds(A_PART_CEL, layer_index, frame);
|
gfx::Rect bounds = getPartBounds(A_PART_CEL, layer_index, frame);
|
||||||
IntersectClip clip(g, bounds);
|
IntersectClip clip(g, bounds);
|
||||||
|
|
@ -1068,7 +1085,7 @@ void Timeline::drawCel(ui::Graphics* g, int layer_index, FrameNumber frame, Cel*
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (m_range.inRange(layer_index, frame)
|
if (m_range.inRange(layer_index, frame)
|
||||||
|| (isLayerActive(layer) && isFrameActive(frame))) {
|
|| (isLayerActive(layer_index) && isFrameActive(frame))) {
|
||||||
drawPart(g, bounds, NULL, m_timelineSelectedCelStyle, false, false, true);
|
drawPart(g, bounds, NULL, m_timelineSelectedCelStyle, false, false, true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -1375,12 +1392,12 @@ int Timeline::getLayerIndex(const Layer* layer) const
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Timeline::isLayerActive(const Layer* layer) const
|
bool Timeline::isLayerActive(int layer_index) const
|
||||||
{
|
{
|
||||||
if (layer == m_layer)
|
if (layer_index == getLayerIndex(m_layer))
|
||||||
return true;
|
return true;
|
||||||
else
|
else
|
||||||
return m_range.inRange(getLayerIndex(layer));
|
return m_range.inRange(layer_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Timeline::isFrameActive(FrameNumber frame) const
|
bool Timeline::isFrameActive(FrameNumber frame) const
|
||||||
|
|
|
||||||
|
|
@ -155,7 +155,7 @@ namespace app {
|
||||||
void cleanClk();
|
void cleanClk();
|
||||||
void setScroll(int x, int y);
|
void setScroll(int x, int y);
|
||||||
int getLayerIndex(const Layer* layer) const;
|
int getLayerIndex(const Layer* layer) const;
|
||||||
bool isLayerActive(const Layer* layer) const;
|
bool isLayerActive(int layer_index) const;
|
||||||
bool isFrameActive(FrameNumber frame) const;
|
bool isFrameActive(FrameNumber frame) const;
|
||||||
|
|
||||||
skin::Style* m_timelineStyle;
|
skin::Style* m_timelineStyle;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue