void PixelsMovement::onPivotChange() { set_pivot_from_preferences(m_currentData); onRotationAlgorithmChange(); }
gfx::Transformation StandbyState::getTransformation(Editor* editor) { gfx::Transformation t = editor->document()->getTransformation(); set_pivot_from_preferences(t); return t; }
PixelsMovement::PixelsMovement( Context* context, Site site, const Image* moveThis, const Mask* mask, const char* operationName) : m_reader(context) , m_site(site) , m_document(static_cast<app::Document*>(site.document())) , m_sprite(site.sprite()) , m_layer(site.layer()) , m_transaction(context, operationName) , m_setMaskCmd(nullptr) , m_isDragging(false) , m_adjustPivot(false) , m_handle(NoHandle) , m_originalImage(Image::createCopy(moveThis)) , m_opaque(false) , m_maskColor(m_sprite->transparentColor()) { gfx::Transformation transform(mask->bounds()); set_pivot_from_preferences(transform); m_initialData = transform; m_currentData = transform; m_initialMask = new Mask(*mask); m_currentMask = new Mask(*mask); m_pivotVisConn = Preferences::instance().selection.pivotVisibility.AfterChange.connect( base::Bind<void>(&PixelsMovement::onPivotChange, this)); m_pivotPosConn = Preferences::instance().selection.pivotPosition.AfterChange.connect( base::Bind<void>(&PixelsMovement::onPivotChange, this)); m_rotAlgoConn = Preferences::instance().selection.rotationAlgorithm.AfterChange.connect( base::Bind<void>(&PixelsMovement::onRotationAlgorithmChange, this)); // The extra cel must be null, because if it's not null, it means // that someone else is using it (e.g. the editor brush preview), // and its owner could destroy our new "extra cel". ASSERT(!m_document->extraCel()); redrawExtraImage(); redrawCurrentMask(); // If the mask isn't in the document (e.g. it's from Paste command), // we've to replace the document mask and generate its boundaries. // // This is really tricky. PixelsMovement is used in two situations: // 1) When the current selection is transformed, and // 2) when the user pastes the clipboard content. // // In the first case, the current document selection is used. And a // cutMask() command could be called after PixelsMovement ctor. We // need the following stack of Cmd instances in the Transaction: // - cmd::ClearMask: clears the old mask) // - cmd::SetMask (m_setMaskCmd): replaces the old mask with a new mask // The new mask in m_setMaskCmd is replaced each time the mask is modified. // // In the second case, the mask isn't in the document, is a new mask // used to paste the pixels, so we've to replace the document mask. // The Transaction contains just a: // - cmd::SetMask // // The main point here is that cmd::SetMask must be the last item in // the Transaction using the mask (because we use cmd::SetMask::setNewMask()). // // TODO Simplify this code in some way or make explicit both usages if (mask != m_document->mask()) { updateDocumentMask(); update_screen_for_document(m_document); } }