bool MovingPixelsState::onMouseDown(Editor* editor, Message* msg) { ASSERT(m_pixelsMovement != NULL); Decorator* decorator = static_cast<Decorator*>(editor->getDecorator()); Document* document = editor->getDocument(); // Start scroll loop if (checkForScroll(editor, msg)) return true; // Transform selected pixels if (document->isMaskVisible() && decorator->getTransformHandles(editor)) { TransformHandles* transfHandles = decorator->getTransformHandles(editor); // Get the handle covered by the mouse. HandleType handle = transfHandles->getHandleAtPoint(editor, gfx::Point(msg->mouse.x, msg->mouse.y), getTransformation(editor)); if (handle != NoHandle) { // Re-catch the image int x, y; editor->screenToEditor(msg->mouse.x, msg->mouse.y, &x, &y); m_pixelsMovement->catchImageAgain(x, y, handle); editor->captureMouse(); return true; } } // Start "moving pixels" loop if (editor->isInsideSelection() && (msg->mouse.left || msg->mouse.right)) { // In case that the user is pressing the copy-selection keyboard shortcut. EditorCustomizationDelegate* customization = editor->getCustomizationDelegate(); if (customization && customization->isCopySelectionKeyPressed()) { // Stamp the pixels to create the copy. m_pixelsMovement->stampImage(); } // Re-catch the image int x, y; editor->screenToEditor(msg->mouse.x, msg->mouse.y, &x, &y); m_pixelsMovement->catchImageAgain(x, y, MoveHandle); editor->captureMouse(); return true; } // End "moving pixels" loop else { // Drop pixels (e.g. to start drawing) dropPixels(editor); } // Use StandbyState implementation return StandbyState::onMouseDown(editor, msg); }
bool MovingPixelsState::onMouseMove(Editor* editor, MouseMessage* msg) { ASSERT(m_pixelsMovement != NULL); // If there is a button pressed if (m_pixelsMovement->isDragging()) { // Auto-scroll gfx::Point mousePos = editor->autoScroll(msg, AutoScroll::MouseDir, false); // Get the position of the mouse in the sprite int x, y; editor->screenToEditor(mousePos.x, mousePos.y, &x, &y); // Get the customization for the pixels movement (snap to grid, angle snap, etc.). PixelsMovement::MoveModifier moveModifier = PixelsMovement::NormalMovement; if (editor->getCustomizationDelegate()->isSnapToGridKeyPressed()) moveModifier |= PixelsMovement::SnapToGridMovement; if (editor->getCustomizationDelegate()->isAngleSnapKeyPressed()) moveModifier |= PixelsMovement::AngleSnapMovement; if (editor->getCustomizationDelegate()->isMaintainAspectRatioKeyPressed()) moveModifier |= PixelsMovement::MaintainAspectRatioMovement; if (editor->getCustomizationDelegate()->isLockAxisKeyPressed()) moveModifier |= PixelsMovement::LockAxisMovement; // Invalidate handles Decorator* decorator = static_cast<Decorator*>(editor->decorator()); TransformHandles* transfHandles = decorator->getTransformHandles(editor); transfHandles->invalidateHandles(editor, m_pixelsMovement->getTransformation()); // Drag the image to that position m_pixelsMovement->moveImage(x, y, moveModifier); editor->updateStatusBar(); return true; } // Use StandbyState implementation return StandbyState::onMouseMove(editor, msg); }
bool MovingPixelsState::onMouseDown(Editor* editor, MouseMessage* msg) { ASSERT(m_pixelsMovement != NULL); // Set this editor as the active one and setup the ContextBar for // moving pixels. This is needed in case that the user is working // with a couple of Editors, in one is moving pixels and the other // one not. UIContext* ctx = UIContext::instance(); ctx->setActiveView(editor->getDocumentView()); ContextBar* contextBar = App::instance()->getMainWindow()->getContextBar(); contextBar->updateForMovingPixels(); // Start scroll loop if (checkForScroll(editor, msg)) return true; Decorator* decorator = static_cast<Decorator*>(editor->decorator()); Document* document = editor->document(); // Transform selected pixels if (document->isMaskVisible() && decorator->getTransformHandles(editor)) { TransformHandles* transfHandles = decorator->getTransformHandles(editor); // Get the handle covered by the mouse. HandleType handle = transfHandles->getHandleAtPoint(editor, msg->position(), getTransformation(editor)); if (handle != NoHandle) { // Re-catch the image int x, y; editor->screenToEditor(msg->position().x, msg->position().y, &x, &y); m_pixelsMovement->catchImageAgain(x, y, handle); editor->captureMouse(); return true; } } // Start "moving pixels" loop if (editor->isInsideSelection() && (msg->left() || msg->right())) { // In case that the user is pressing the copy-selection keyboard shortcut. EditorCustomizationDelegate* customization = editor->getCustomizationDelegate(); if (customization && customization->isCopySelectionKeyPressed()) { // Stamp the pixels to create the copy. m_pixelsMovement->stampImage(); } // Re-catch the image int x, y; editor->screenToEditor(msg->position().x, msg->position().y, &x, &y); m_pixelsMovement->catchImageAgain(x, y, MoveHandle); editor->captureMouse(); return true; } // End "moving pixels" loop else { // Drop pixels (e.g. to start drawing) dropPixels(editor); } // Use StandbyState implementation return StandbyState::onMouseDown(editor, msg); }