mirror of
https://github.com/aseprite/aseprite.git
synced 2025-04-15 20:42:40 +00:00
Fix "paste" command when we paste in an empty spot (layer/frame without a created cel).
This commit is contained in:
parent
327f627e60
commit
aa0229f950
@ -19,6 +19,7 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "commands/command.h"
|
#include "commands/command.h"
|
||||||
|
#include "raster/layer.h"
|
||||||
#include "raster/sprite.h"
|
#include "raster/sprite.h"
|
||||||
#include "raster/undo.h"
|
#include "raster/undo.h"
|
||||||
#include "util/clipboard.h"
|
#include "util/clipboard.h"
|
||||||
@ -50,16 +51,15 @@ bool PasteCommand::onEnabled(Context* context)
|
|||||||
const CurrentSpriteReader sprite(context);
|
const CurrentSpriteReader sprite(context);
|
||||||
return
|
return
|
||||||
sprite != NULL &&
|
sprite != NULL &&
|
||||||
|
sprite->getCurrentLayer() &&
|
||||||
|
sprite->getCurrentLayer()->is_image() &&
|
||||||
|
sprite->getCurrentLayer()->is_writable() &&
|
||||||
clipboard::can_paste();
|
clipboard::can_paste();
|
||||||
}
|
}
|
||||||
|
|
||||||
void PasteCommand::onExecute(Context* context)
|
void PasteCommand::onExecute(Context* context)
|
||||||
{
|
{
|
||||||
CurrentSpriteWriter sprite(context);
|
CurrentSpriteWriter sprite(context);
|
||||||
|
|
||||||
if (undo_is_enabled(sprite->getUndo()))
|
|
||||||
undo_set_label(sprite->getUndo(), "Paste");
|
|
||||||
|
|
||||||
clipboard::paste(sprite);
|
clipboard::paste(sprite);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -189,6 +189,7 @@ void clipboard::copy_image(Image* image, Palette* pal)
|
|||||||
|
|
||||||
void clipboard::paste(SpriteWriter& sprite)
|
void clipboard::paste(SpriteWriter& sprite)
|
||||||
{
|
{
|
||||||
|
Undoable undoable(sprite, "Paste");
|
||||||
int xout[4], yout[4];
|
int xout[4], yout[4];
|
||||||
int dst_x, dst_y;
|
int dst_x, dst_y;
|
||||||
Image *src_image;
|
Image *src_image;
|
||||||
@ -209,15 +210,36 @@ void clipboard::paste(SpriteWriter& sprite)
|
|||||||
|
|
||||||
ASSERT(sprite != NULL);
|
ASSERT(sprite != NULL);
|
||||||
|
|
||||||
// destination image (where to put this image)
|
// Destination image (where to put this image)
|
||||||
dst_image = sprite->getCurrentImage(&dst_x, &dst_y);
|
dst_image = sprite->getCurrentImage(&dst_x, &dst_y);
|
||||||
if (!dst_image) {
|
if (!dst_image) {
|
||||||
Console console;
|
// We don't have an image to paste the clipboard content,
|
||||||
console.printf(_("Error: no destination image\n"));
|
// here we create the cel/image to draw on it
|
||||||
return;
|
|
||||||
|
LayerImage* layer = dynamic_cast<LayerImage*>(sprite->getCurrentLayer());
|
||||||
|
ASSERT(layer != NULL);
|
||||||
|
|
||||||
|
// Create the image for the cel (of a size equal to the entire sprite size)
|
||||||
|
dst_image = image_new(sprite->getImgType(), sprite->getWidth(), sprite->getHeight());
|
||||||
|
image_clear(dst_image, 0);
|
||||||
|
|
||||||
|
// Add the new image in the stock
|
||||||
|
int dst_image_index = stock_add_image(sprite->getStock(), dst_image);
|
||||||
|
if (undo_is_enabled(sprite->getUndo()))
|
||||||
|
undo_add_image(sprite->getUndo(), sprite->getStock(), dst_image_index);
|
||||||
|
|
||||||
|
// Create the new cel in the current frame with the recently
|
||||||
|
// created image
|
||||||
|
Cel* cel = cel_new(sprite->getCurrentFrame(), dst_image_index);
|
||||||
|
|
||||||
|
// Add the cel to the layer
|
||||||
|
undoable.add_cel(layer, cel);
|
||||||
|
|
||||||
|
// Default destination position
|
||||||
|
dst_x = dst_y = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// source image (clipboard or a converted copy to the destination 'imgtype')
|
// Source image (clipboard or a converted copy to the destination 'imgtype')
|
||||||
if (clipboard_image->imgtype == sprite->getImgType())
|
if (clipboard_image->imgtype == sprite->getImgType())
|
||||||
src_image = clipboard_image;
|
src_image = clipboard_image;
|
||||||
else {
|
else {
|
||||||
@ -226,7 +248,7 @@ void clipboard::paste(SpriteWriter& sprite)
|
|||||||
rgbmap, sprite->getPalette(sprite->getCurrentFrame()));
|
rgbmap, sprite->getPalette(sprite->getCurrentFrame()));
|
||||||
}
|
}
|
||||||
|
|
||||||
// do the interactive-transform loop (where the user can move the floating image)
|
// Do the interactive-transform loop (where the user can move the floating image)
|
||||||
{
|
{
|
||||||
JWidget view = jwidget_get_view(current_editor);
|
JWidget view = jwidget_get_view(current_editor);
|
||||||
JRect vp = jview_get_viewport_position(view);
|
JRect vp = jview_get_viewport_position(view);
|
||||||
@ -271,6 +293,9 @@ void clipboard::paste(SpriteWriter& sprite)
|
|||||||
xout[0], yout[0], xout[1], yout[1],
|
xout[0], yout[0], xout[1], yout[1],
|
||||||
xout[2], yout[2], xout[3], yout[3]);
|
xout[2], yout[2], xout[3], yout[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Commit the "paste" operation
|
||||||
|
undoable.commit();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (src_image != clipboard_image)
|
if (src_image != clipboard_image)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user