Remove pimpl idiom from PixelsMovement class as it is used in just one file.

This commit is contained in:
David Capello 2011-11-03 00:29:35 -03:00
parent aedaf7e5b8
commit d82507df9a
2 changed files with 153 additions and 216 deletions

View File

@ -18,276 +18,199 @@
#include "config.h"
#include "widgets/editor/pixels_movement.h"
#include "app.h"
#include "document.h"
#include "document_wrappers.h"
#include "modules/gui.h"
#include "raster/cel.h"
#include "raster/image.h"
#include "raster/mask.h"
#include "raster/sprite.h"
#include "undo_transaction.h"
#include "util/expand_cel_canvas.h"
#include "widgets/editor/pixels_movement.h"
using namespace gfx;
class PixelsMovementImpl
PixelsMovement::PixelsMovement(Document* document, Sprite* sprite, const Image* moveThis, int initial_x, int initial_y, int opacity)
: m_documentReader(document)
, m_sprite(sprite)
, m_undoTransaction(document, "Pixels Movement")
, m_initial_x(initial_x)
, m_initial_y(initial_y)
, m_firstDrop(true)
, m_isDragging(false)
{
const DocumentReader m_documentReader;
Sprite* m_sprite;
UndoTransaction m_undoTransaction;
int m_initial_x, m_initial_y;
int m_catch_x, m_catch_y;
bool m_firstDrop;
bool m_isDragging;
DocumentWriter documentWriter(m_documentReader);
documentWriter->prepareExtraCel(initial_x, initial_y, moveThis->w, moveThis->h, opacity);
public:
PixelsMovementImpl(Document* document, Sprite* sprite, const Image* moveThis, int initial_x, int initial_y, int opacity)
: m_documentReader(document)
, m_sprite(sprite)
, m_undoTransaction(document, "Pixels Movement")
, m_initial_x(initial_x)
, m_initial_y(initial_y)
, m_firstDrop(true)
, m_isDragging(false)
{
DocumentWriter documentWriter(m_documentReader);
documentWriter->prepareExtraCel(initial_x, initial_y, moveThis->w, moveThis->h, opacity);
Image* extraImage = documentWriter->getExtraCelImage();
image_copy(extraImage, moveThis, 0, 0);
}
~PixelsMovementImpl()
{
}
void cutMask()
{
{
DocumentWriter documentWriter(m_documentReader);
m_undoTransaction.clearMask(app_get_color_to_clear_layer(m_sprite->getCurrentLayer()));
}
copyMask();
}
void copyMask()
{
// Hide the mask (do not deselect it, it will be moved them using m_undoTransaction.setMaskPosition)
Mask emptyMask;
{
DocumentWriter documentWriter(m_documentReader);
documentWriter->generateMaskBoundaries(&emptyMask);
}
update_screen_for_document(m_documentReader);
}
void catchImage(int x, int y)
{
m_catch_x = x;
m_catch_y = y;
m_isDragging = true;
}
void catchImageAgain(int x, int y)
{
// Create a new UndoTransaction to move the pixels to other position
const Cel* cel = m_documentReader->getExtraCel();
m_initial_x = cel->getX();
m_initial_y = cel->getY();
m_isDragging = true;
m_catch_x = x;
m_catch_y = y;
// Hide the mask (do not deselect it, it will be moved them using m_undoTransaction.setMaskPosition)
Mask emptyMask;
{
DocumentWriter documentWriter(m_documentReader);
documentWriter->generateMaskBoundaries(&emptyMask);
}
update_screen_for_document(m_documentReader);
}
Rect moveImage(int x, int y)
{
DocumentWriter documentWriter(m_documentReader);
Cel* cel = documentWriter->getExtraCel();
Image* image = documentWriter->getExtraCelImage();
int x1, y1, x2, y2;
int u1, v1, u2, v2;
x1 = cel->getX();
y1 = cel->getY();
x2 = cel->getX() + image->w;
y2 = cel->getY() + image->h;
int new_x = m_initial_x + x - m_catch_x;
int new_y = m_initial_y + y - m_catch_y;
// No movement
if (cel->getX() == new_x && cel->getY() == new_y)
return Rect();
cel->setPosition(new_x, new_y);
u1 = cel->getX();
v1 = cel->getY();
u2 = cel->getX() + image->w;
v2 = cel->getY() + image->h;
return Rect(MIN(x1, u1), MIN(y1, v1),
MAX(x2, u2) - MIN(x1, u1) + 1,
MAX(y2, v2) - MIN(y1, v1) + 1);
}
void dropImageTemporarily()
{
m_isDragging = false;
const Cel* cel = m_documentReader->getExtraCel();
{
DocumentWriter documentWriter(m_documentReader);
// Show the mask again in the new position
if (m_firstDrop) {
m_firstDrop = false;
m_undoTransaction.setMaskPosition(cel->getX(), cel->getY());
}
else {
documentWriter->getMask()->x = cel->getX();
documentWriter->getMask()->y = cel->getY();
}
documentWriter->generateMaskBoundaries();
}
update_screen_for_document(m_documentReader);
}
void dropImage()
{
m_isDragging = false;
const Cel* cel = m_documentReader->getExtraCel();
const Image* image = m_documentReader->getExtraCelImage();
{
DocumentWriter documentWriter(m_documentReader);
{
// Expand the canvas to paste the image in the fully visible
// portion of sprite.
ExpandCelCanvas expandCelCanvas(documentWriter, m_sprite,
m_sprite->getCurrentLayer(), TILED_NONE);
image_merge(expandCelCanvas.getDestCanvas(), image,
cel->getX()-expandCelCanvas.getCel()->getX(),
cel->getY()-expandCelCanvas.getCel()->getY(),
cel->getOpacity(), BLEND_MODE_NORMAL);
expandCelCanvas.commit();
}
m_undoTransaction.commit();
documentWriter->destroyExtraCel();
}
}
bool isDragging()
{
return m_isDragging;
}
Rect getImageBounds()
{
const Cel* cel = m_documentReader->getExtraCel();
const Image* image = m_documentReader->getExtraCelImage();
ASSERT(cel != NULL);
ASSERT(image != NULL);
return Rect(cel->getX(), cel->getY(), image->w, image->h);
}
void setMaskColor(uint32_t mask_color)
{
{
DocumentWriter documentWriter(m_documentReader);
Image* image = documentWriter->getExtraCelImage();
ASSERT(image != NULL);
image->mask_color = mask_color;
}
update_screen_for_document(m_documentReader);
}
};
//////////////////////////////////////////////////////////////////////
// PixelsMovement
PixelsMovement::PixelsMovement(Document* document, Sprite* sprite, const Image* moveThis, int x, int y, int opacity)
{
m_impl = new PixelsMovementImpl(document, sprite, moveThis, x, y, opacity);
Image* extraImage = documentWriter->getExtraCelImage();
image_copy(extraImage, moveThis, 0, 0);
}
PixelsMovement::~PixelsMovement()
{
delete m_impl;
}
void PixelsMovement::cutMask()
{
m_impl->cutMask();
{
DocumentWriter documentWriter(m_documentReader);
m_undoTransaction.clearMask(app_get_color_to_clear_layer(m_sprite->getCurrentLayer()));
}
copyMask();
}
void PixelsMovement::copyMask()
{
m_impl->copyMask();
// Hide the mask (do not deselect it, it will be moved them using m_undoTransaction.setMaskPosition)
Mask emptyMask;
{
DocumentWriter documentWriter(m_documentReader);
documentWriter->generateMaskBoundaries(&emptyMask);
}
update_screen_for_document(m_documentReader);
}
void PixelsMovement::catchImage(int x, int y)
{
m_impl->catchImage(x, y);
m_catch_x = x;
m_catch_y = y;
m_isDragging = true;
}
void PixelsMovement::catchImageAgain(int x, int y)
{
return m_impl->catchImageAgain(x, y);
// Create a new UndoTransaction to move the pixels to other position
const Cel* cel = m_documentReader->getExtraCel();
m_initial_x = cel->getX();
m_initial_y = cel->getY();
m_isDragging = true;
m_catch_x = x;
m_catch_y = y;
// Hide the mask (do not deselect it, it will be moved them using m_undoTransaction.setMaskPosition)
Mask emptyMask;
{
DocumentWriter documentWriter(m_documentReader);
documentWriter->generateMaskBoundaries(&emptyMask);
}
update_screen_for_document(m_documentReader);
}
Rect PixelsMovement::moveImage(int x, int y)
{
return m_impl->moveImage(x, y);
DocumentWriter documentWriter(m_documentReader);
Cel* cel = documentWriter->getExtraCel();
Image* image = documentWriter->getExtraCelImage();
int x1, y1, x2, y2;
int u1, v1, u2, v2;
x1 = cel->getX();
y1 = cel->getY();
x2 = cel->getX() + image->w;
y2 = cel->getY() + image->h;
int new_x = m_initial_x + x - m_catch_x;
int new_y = m_initial_y + y - m_catch_y;
// No movement
if (cel->getX() == new_x && cel->getY() == new_y)
return Rect();
cel->setPosition(new_x, new_y);
u1 = cel->getX();
v1 = cel->getY();
u2 = cel->getX() + image->w;
v2 = cel->getY() + image->h;
return Rect(MIN(x1, u1), MIN(y1, v1),
MAX(x2, u2) - MIN(x1, u1) + 1,
MAX(y2, v2) - MIN(y1, v1) + 1);
}
void PixelsMovement::dropImageTemporarily()
{
return m_impl->dropImageTemporarily();
m_isDragging = false;
const Cel* cel = m_documentReader->getExtraCel();
{
DocumentWriter documentWriter(m_documentReader);
// Show the mask again in the new position
if (m_firstDrop) {
m_firstDrop = false;
m_undoTransaction.setMaskPosition(cel->getX(), cel->getY());
}
else {
documentWriter->getMask()->x = cel->getX();
documentWriter->getMask()->y = cel->getY();
}
documentWriter->generateMaskBoundaries();
}
update_screen_for_document(m_documentReader);
}
void PixelsMovement::dropImage()
{
m_impl->dropImage();
m_isDragging = false;
const Cel* cel = m_documentReader->getExtraCel();
const Image* image = m_documentReader->getExtraCelImage();
{
DocumentWriter documentWriter(m_documentReader);
{
// Expand the canvas to paste the image in the fully visible
// portion of sprite.
ExpandCelCanvas expandCelCanvas(documentWriter, m_sprite,
m_sprite->getCurrentLayer(), TILED_NONE);
image_merge(expandCelCanvas.getDestCanvas(), image,
cel->getX()-expandCelCanvas.getCel()->getX(),
cel->getY()-expandCelCanvas.getCel()->getY(),
cel->getOpacity(), BLEND_MODE_NORMAL);
expandCelCanvas.commit();
}
m_undoTransaction.commit();
documentWriter->destroyExtraCel();
}
}
bool PixelsMovement::isDragging()
{
return m_impl->isDragging();
return m_isDragging;
}
Rect PixelsMovement::getImageBounds()
{
return m_impl->getImageBounds();
const Cel* cel = m_documentReader->getExtraCel();
const Image* image = m_documentReader->getExtraCelImage();
ASSERT(cel != NULL);
ASSERT(image != NULL);
return Rect(cel->getX(), cel->getY(), image->w, image->h);
}
void PixelsMovement::setMaskColor(uint32_t mask_color)
{
m_impl->setMaskColor(mask_color);
{
DocumentWriter documentWriter(m_documentReader);
Image* image = documentWriter->getExtraCelImage();
ASSERT(image != NULL);
image->mask_color = mask_color;
}
update_screen_for_document(m_documentReader);
}

View File

@ -19,6 +19,9 @@
#ifndef WIDGETS_EDITOR_PIXELS_MOVEMENT_H_INCLUDED
#define WIDGETS_EDITOR_PIXELS_MOVEMENT_H_INCLUDED
#include "document_wrappers.h"
#include "undo_transaction.h"
class Document;
class Image;
class Sprite;
@ -34,7 +37,12 @@ public:
void copyMask();
void catchImage(int x, int y);
void catchImageAgain(int x, int y);
// Moves the image to the new position (relative to the start
// position given in the ctor). Returns the rectangle that should be
// redrawn.
gfx::Rect moveImage(int x, int y);
void dropImageTemporarily();
void dropImage();
bool isDragging();
@ -44,7 +52,13 @@ public:
void setMaskColor(uint32_t mask_color);
private:
class PixelsMovementImpl* m_impl;
const DocumentReader m_documentReader;
Sprite* m_sprite;
UndoTransaction m_undoTransaction;
int m_initial_x, m_initial_y;
int m_catch_x, m_catch_y;
bool m_firstDrop;
bool m_isDragging;
};
#endif