Timeline: Add support to move several layers

This commit is contained in:
David Capello 2013-12-15 21:07:42 -03:00
parent cb11fb3458
commit eabb65be50
2 changed files with 51 additions and 34 deletions

View File

@ -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

View File

@ -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;