Fix scripting app.command.Cut() and app.command.Paste() does not work in --batch mode (fix #4354)

This commit is contained in:
Gaspar Capello 2024-05-03 14:10:12 -03:00
parent 92edd5f700
commit a3b0c2653b
4 changed files with 56 additions and 6 deletions

View File

@ -1,4 +1,5 @@
// Aseprite
// Copyright (C) 2024 Igara Studio S.A.
// Copyright (C) 2001-2017 David Capello
//
// This program is distributed under the terms of
@ -10,10 +11,16 @@
#include "app/app.h"
#include "app/commands/command.h"
#include "app/context_access.h"
#include "app/tx.h"
#include "app/ui/input_chain.h"
#include "app/util/clipboard.h"
#include "app/util/range_utils.h"
namespace app {
class Clipboard;
class CutCommand : public Command {
public:
CutCommand();
@ -30,12 +37,18 @@ CutCommand::CutCommand()
bool CutCommand::onEnabled(Context* ctx)
{
return App::instance()->inputChain().canCut(ctx);
return App::instance()->isGui() ?
App::instance()->inputChain().canCut(ctx) : true;
}
void CutCommand::onExecute(Context* ctx)
{
App::instance()->inputChain().cut(ctx);
if (App::instance()->isGui())
App::instance()->inputChain().cut(ctx);
else if (ctx->clipboard()) {
ContextWriter writer(ctx);
ctx->clipboard()->cut(writer);
}
}
Command* CommandFactory::createCutCommand()

View File

@ -1,4 +1,5 @@
// Aseprite
// Copyright (C) 2024 Igara Studio S.A.
// Copyright (C) 2001-2017 David Capello
//
// This program is distributed under the terms of
@ -10,7 +11,9 @@
#include "app/app.h"
#include "app/commands/command.h"
#include "app/context.h"
#include "app/ui/input_chain.h"
#include "app/util/clipboard.h"
namespace app {
@ -30,12 +33,17 @@ PasteCommand::PasteCommand()
bool PasteCommand::onEnabled(Context* ctx)
{
return App::instance()->inputChain().canPaste(ctx);
return ctx->isUIAvailable() ?
App::instance()->inputChain().canPaste(ctx) :
ctx->clipboard()->isImageAvailable();
}
void PasteCommand::onExecute(Context* ctx)
{
App::instance()->inputChain().paste(ctx);
if (ctx->isUIAvailable())
App::instance()->inputChain().paste(ctx);
else if (ctx->clipboard())
ctx->clipboard()->paste(ctx, false);
}
Command* CommandFactory::createPasteCommand()

View File

@ -290,7 +290,7 @@ bool Clipboard::copyFromDocument(const Site& site, bool merged)
(mask ? new Mask(*mask): nullptr),
(pal ? new Palette(*pal): nullptr),
nullptr,
true, // set native clipboard
App::instance()->isGui() ? true : false, // set native clipboard
site.layer() && !site.layer()->isBackground());
return true;
@ -364,6 +364,21 @@ void Clipboard::cut(ContextWriter& writer)
{
Tx tx(writer, "Cut");
Site site = writer.context()->activeSite();
if (!App::instance()->isGui()) {
if (const Doc* doc = static_cast<const Doc*>(site.document())) {
if (doc->sprite()) {
const Mask* mask = doc->mask();
const Palette* pal = doc->sprite()->palette(site.frame());
doc::Image* image(new_image_from_mask(site, true));
setData(image,
(mask ? new Mask(*mask): nullptr),
(pal ? new Palette(*pal): nullptr),
nullptr,
false,
site.layer() && !site.layer()->isBackground());
}
}
}
CelList cels;
if (site.range().enabled()) {
cels = get_unique_cels_to_edit_pixels(site.sprite(), site.range());
@ -379,6 +394,8 @@ void Clipboard::cut(ContextWriter& writer)
tx.commit();
}
writer.document()->generateMaskBoundaries();
if (!App::instance()->isGui())
return;
#ifdef ENABLE_UI
update_screen_for_document(writer.document());
#endif
@ -487,7 +504,9 @@ void Clipboard::paste(Context* ctx,
case ClipboardFormat::Image: {
// Get the image from the native clipboard.
if (!getImage(nullptr))
if (App::instance()->isGui() && !getImage(nullptr))
return;
else if (!isImageAvailable())
return;
ASSERT(m_data->image);
@ -805,6 +824,13 @@ ImageRef Clipboard::getImage(Palette* palette)
return m_data->image;
}
bool Clipboard::isImageAvailable() const
{
return m_data->image &&
m_data->image->width() > 0 &&
m_data->image->height() > 0;
}
bool Clipboard::getImageSize(gfx::Size& size)
{
if (use_native_clipboard() && getNativeBitmapSize(&size))

View File

@ -79,6 +79,9 @@ namespace app {
doc::ImageRef getImage(doc::Palette* palette);
// Used to identify data available when the UI is not available
bool isImageAvailable() const;
// Returns true and fills the specified "size"" with the image's
// size in the clipboard, or return false in case that the clipboard
// doesn't contain an image at all.