void UndoTransaction::removeFrameOfLayer(Layer* layer, int frame) { ASSERT(layer); ASSERT(frame >= 0); switch (layer->getType()) { case GFXOBJ_LAYER_IMAGE: if (Cel* cel = static_cast<LayerImage*>(layer)->getCel(frame)) removeCel(static_cast<LayerImage*>(layer), cel); for (++frame; frame<m_sprite->getTotalFrames(); ++frame) if (Cel* cel = static_cast<LayerImage*>(layer)->getCel(frame)) setCelFramePosition(cel, cel->getFrame()-1); break; case GFXOBJ_LAYER_FOLDER: { LayerIterator it = static_cast<LayerFolder*>(layer)->get_layer_begin(); LayerIterator end = static_cast<LayerFolder*>(layer)->get_layer_end(); for (; it != end; ++it) removeFrameOfLayer(*it, frame); break; } } }
// Does the hard part of removing a frame: Removes all cels located in // the given frame, and moves all following cels one frame position back. void DocumentApi::removeFrameOfLayer(Layer* layer, FrameNumber frame) { ASSERT(layer); ASSERT(frame >= 0); Sprite* sprite = layer->getSprite(); switch (layer->getType()) { case GFXOBJ_LAYER_IMAGE: if (Cel* cel = static_cast<LayerImage*>(layer)->getCel(frame)) removeCel(static_cast<LayerImage*>(layer), cel); for (++frame; frame<sprite->getTotalFrames(); ++frame) if (Cel* cel = static_cast<LayerImage*>(layer)->getCel(frame)) setCelFramePosition(sprite, cel, cel->getFrame().previous()); break; case GFXOBJ_LAYER_FOLDER: { LayerIterator it = static_cast<LayerFolder*>(layer)->getLayerBegin(); LayerIterator end = static_cast<LayerFolder*>(layer)->getLayerEnd(); for (; it != end; ++it) removeFrameOfLayer(*it, frame); break; } } }
void UndoTransaction::removeFrame(int frame) { ASSERT(frame >= 0); // Remove cels from this frame (and displace one position backward // all next frames) removeFrameOfLayer(m_sprite->getFolder(), frame); // New value for totalFrames propety int newTotalFrames = m_sprite->getTotalFrames()-1; // Move backward if we will be outside the range of frames if (m_sprite->getCurrentFrame() >= newTotalFrames) setCurrentFrame(newTotalFrames-1); // Decrement frames counter in the sprite setNumberOfFrames(newTotalFrames); }
void DocumentApi::removeFrame(Sprite* sprite, FrameNumber frame) { ASSERT(frame >= 0); // Remove cels from this frame (and displace one position backward // all next frames) removeFrameOfLayer(sprite->getFolder(), frame); // Add undoers to restore the removed frame from the sprite (to // restore the number and durations of frames). DocumentUndo* undo = m_document->getUndo(); if (undo->isEnabled()) m_undoers->pushUndoer(new undoers::RemoveFrame(getObjects(), m_document, sprite, frame)); // Remove the frame from the sprite. This is the low level // operation, it modifies the number and duration of frames. sprite->removeFrame(frame); // Notify observers. DocumentEvent ev(m_document); ev.sprite(sprite); ev.frame(frame); m_document->notifyObservers<DocumentEvent&>(&DocumentObserver::onRemoveFrame, ev); }