void ClearCelCommand::onExecute(Context* context) { ContextWriter writer(context); Document* document(writer.document()); { UndoTransaction undoTransaction(writer.context(), "Clear Cel"); // TODO the range of selected frames should be in the DocumentLocation. Timeline::Range range = App::instance()->getMainWindow()->getTimeline()->range(); if (range.enabled()) { Sprite* sprite = writer.sprite(); for (LayerIndex layerIdx = range.layerBegin(); layerIdx <= range.layerEnd(); ++layerIdx) { Layer* layer = sprite->indexToLayer(layerIdx); if (!layer->isImage()) continue; LayerImage* layerImage = static_cast<LayerImage*>(layer); for (FrameNumber frame = range.frameEnd(), begin = range.frameBegin().previous(); frame != begin; frame = frame.previous()) { document->getApi().clearCel(layerImage, frame); } } } else { document->getApi().clearCel(writer.cel()); } undoTransaction.commit(); } update_screen_for_document(document); }
void LinkCelsCommand::onExecute(Context* context) { ContextWriter writer(context); Document* document(writer.document()); bool nonEditableLayers = false; { // TODO the range of selected frames should be in doc::Site. Timeline::Range range = App::instance()->getMainWindow()->getTimeline()->range(); if (!range.enabled()) return; Transaction transaction(writer.context(), friendlyName()); Sprite* sprite = writer.sprite(); frame_t begin = range.frameBegin(); frame_t end = range.frameEnd(); for (LayerIndex layerIdx = range.layerBegin(); layerIdx <= range.layerEnd(); ++layerIdx) { Layer* layer = sprite->indexToLayer(layerIdx); if (!layer->isImage()) continue; if (!layer->isEditable()) { nonEditableLayers = true; continue; } LayerImage* layerImage = static_cast<LayerImage*>(layer); for (frame_t frame=begin; frame < end+1; ++frame) { Cel* cel = layerImage->cel(frame); if (cel) { for (frame = cel->frame()+1; frame < end+1; ++frame) { transaction.execute( new cmd::CopyCel( layerImage, cel->frame(), layerImage, frame, true)); // true = force links } break; } } } transaction.commit(); } if (nonEditableLayers) StatusBar::instance()->showTip(1000, "There are locked layers"); update_screen_for_document(document); }
void RemoveLayerCommand::onExecute(Context* context) { std::string layer_name; ContextWriter writer(context); Document* document(writer.document()); Layer* layer(writer.layer()); { UndoTransaction undoTransaction(writer.context(), "Remove Layer"); // TODO the range of selected layer should be in the DocumentLocation. Timeline::Range range = App::instance()->getMainWindow()->getTimeline()->range(); if (range.enabled()) { Sprite* sprite = writer.sprite(); // TODO indexes in timeline are inverted!! fix that for a future release for (LayerIndex layer = sprite->countLayers() - LayerIndex(range.layerBegin()+1), end = sprite->countLayers() - LayerIndex(range.layerEnd()+2); layer != end; --layer) { document->getApi().removeLayer(sprite->indexToLayer(layer)); } } else { layer_name = layer->getName(); document->getApi().removeLayer(layer); } undoTransaction.commit(); } update_screen_for_document(document); StatusBar::instance()->invalidate(); if (!layer_name.empty()) StatusBar::instance()->showTip(1000, "Layer `%s' removed", layer_name.c_str()); else StatusBar::instance()->showTip(1000, "Layers removed"); }