2016-03-19 22:33:05 +08:00
|
|
|
// Aseprite
|
2019-02-16 04:14:44 +08:00
|
|
|
// Copyright (C) 2018-2019 Igara Studio S.A.
|
2018-08-09 04:27:26 +08:00
|
|
|
// Copyright (C) 2015-2018 David Capello
|
2016-03-19 22:33:05 +08:00
|
|
|
//
|
2016-08-27 04:02:58 +08:00
|
|
|
// This program is distributed under the terms of
|
|
|
|
|
// the End-User License Agreement for Aseprite.
|
2016-03-19 22:33:05 +08:00
|
|
|
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
|
#include "config.h"
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#include "app/cmd/set_mask.h"
|
|
|
|
|
#include "app/commands/command.h"
|
|
|
|
|
#include "app/context_access.h"
|
2018-07-07 22:54:44 +08:00
|
|
|
#include "app/doc.h"
|
2017-12-01 10:41:45 +08:00
|
|
|
#include "app/i18n/strings.h"
|
2016-03-19 22:33:05 +08:00
|
|
|
#include "app/modules/editors.h"
|
|
|
|
|
#include "app/modules/gui.h"
|
|
|
|
|
#include "app/snap_to_grid.h"
|
2018-08-21 03:00:59 +08:00
|
|
|
#include "app/tx.h"
|
2016-03-19 22:33:05 +08:00
|
|
|
#include "app/ui/editor/editor.h"
|
|
|
|
|
#include "doc/mask.h"
|
2017-12-01 10:41:45 +08:00
|
|
|
#include "fmt/format.h"
|
2016-03-19 22:33:05 +08:00
|
|
|
#include "ui/system.h"
|
|
|
|
|
|
|
|
|
|
namespace app {
|
|
|
|
|
|
|
|
|
|
using namespace doc;
|
|
|
|
|
|
|
|
|
|
class SelectTileCommand : public Command {
|
|
|
|
|
public:
|
|
|
|
|
SelectTileCommand();
|
|
|
|
|
|
|
|
|
|
protected:
|
2016-03-19 23:09:03 +08:00
|
|
|
void onLoadParams(const Params& params) override;
|
|
|
|
|
bool onEnabled(Context* ctx) override;
|
|
|
|
|
void onExecute(Context* ctx) override;
|
|
|
|
|
std::string onGetFriendlyName() const override;
|
|
|
|
|
|
|
|
|
|
private:
|
2016-04-05 05:46:48 +08:00
|
|
|
gen::SelectionMode m_mode;
|
2016-03-19 22:33:05 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
SelectTileCommand::SelectTileCommand()
|
2017-12-02 02:10:21 +08:00
|
|
|
: Command(CommandId::SelectTile(), CmdRecordableFlag)
|
2016-04-05 05:46:48 +08:00
|
|
|
, m_mode(gen::SelectionMode::DEFAULT)
|
2016-03-19 23:09:03 +08:00
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SelectTileCommand::onLoadParams(const Params& params)
|
2016-03-19 22:33:05 +08:00
|
|
|
{
|
2016-03-19 23:09:03 +08:00
|
|
|
std::string mode = params.get("mode");
|
|
|
|
|
if (mode == "add")
|
2016-04-05 05:46:48 +08:00
|
|
|
m_mode = gen::SelectionMode::ADD;
|
2016-03-19 23:09:03 +08:00
|
|
|
else if (mode == "subtract")
|
2016-04-05 05:46:48 +08:00
|
|
|
m_mode = gen::SelectionMode::SUBTRACT;
|
2018-10-27 01:04:08 +08:00
|
|
|
else if (mode == "intersect")
|
|
|
|
|
m_mode = gen::SelectionMode::INTERSECT;
|
2016-03-19 23:09:03 +08:00
|
|
|
else
|
2016-04-05 05:46:48 +08:00
|
|
|
m_mode = gen::SelectionMode::DEFAULT;
|
2016-03-19 22:33:05 +08:00
|
|
|
}
|
|
|
|
|
|
2016-03-19 23:09:03 +08:00
|
|
|
bool SelectTileCommand::onEnabled(Context* ctx)
|
2016-03-19 22:33:05 +08:00
|
|
|
{
|
2016-03-19 23:09:03 +08:00
|
|
|
return ctx->checkFlags(ContextFlags::ActiveDocumentIsWritable);
|
2016-03-19 22:33:05 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SelectTileCommand::onExecute(Context* ctx)
|
|
|
|
|
{
|
|
|
|
|
if (!current_editor ||
|
|
|
|
|
!current_editor->hasMouse())
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
// Lock sprite
|
|
|
|
|
ContextWriter writer(ctx);
|
2018-07-07 22:54:44 +08:00
|
|
|
Doc* doc(writer.document());
|
2016-03-19 22:33:05 +08:00
|
|
|
|
2018-08-09 04:27:26 +08:00
|
|
|
std::unique_ptr<Mask> mask(new Mask());
|
2016-03-19 23:09:03 +08:00
|
|
|
|
2016-04-05 05:46:48 +08:00
|
|
|
if (m_mode != gen::SelectionMode::DEFAULT)
|
2016-03-19 23:09:03 +08:00
|
|
|
mask->copyFrom(doc->mask());
|
|
|
|
|
|
2016-03-19 22:33:05 +08:00
|
|
|
{
|
2019-10-11 02:08:59 +08:00
|
|
|
gfx::Rect gridBounds = doc->sprite()->gridBounds();
|
2016-03-19 22:33:05 +08:00
|
|
|
gfx::Point pos = current_editor->screenToEditor(ui::get_mouse_position());
|
|
|
|
|
pos = snap_to_grid(gridBounds, pos, PreferSnapTo::BoxOrigin);
|
2016-03-19 23:09:03 +08:00
|
|
|
gridBounds.setOrigin(pos);
|
2016-03-19 22:33:05 +08:00
|
|
|
|
2018-10-27 01:04:08 +08:00
|
|
|
switch (m_mode) {
|
|
|
|
|
case gen::SelectionMode::DEFAULT:
|
|
|
|
|
case gen::SelectionMode::ADD:
|
|
|
|
|
mask->add(gridBounds);
|
|
|
|
|
break;
|
|
|
|
|
case gen::SelectionMode::SUBTRACT:
|
|
|
|
|
mask->subtract(gridBounds);
|
|
|
|
|
break;
|
|
|
|
|
case gen::SelectionMode::INTERSECT:
|
|
|
|
|
mask->intersect(gridBounds);
|
|
|
|
|
break;
|
|
|
|
|
}
|
2016-03-19 22:33:05 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Set the new mask
|
2018-08-21 03:00:59 +08:00
|
|
|
Tx tx(writer.context(),
|
2017-12-01 10:41:45 +08:00
|
|
|
friendlyName(),
|
2016-03-19 22:33:05 +08:00
|
|
|
DoesntModifyDocument);
|
2018-08-21 03:00:59 +08:00
|
|
|
tx(new cmd::SetMask(doc, mask.get()));
|
|
|
|
|
tx.commit();
|
2016-03-19 22:33:05 +08:00
|
|
|
|
|
|
|
|
update_screen_for_document(doc);
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-19 23:09:03 +08:00
|
|
|
std::string SelectTileCommand::onGetFriendlyName() const
|
|
|
|
|
{
|
2017-12-01 10:41:45 +08:00
|
|
|
std::string text;
|
2016-03-19 23:09:03 +08:00
|
|
|
switch (m_mode) {
|
2017-12-01 10:41:45 +08:00
|
|
|
case gen::SelectionMode::ADD:
|
|
|
|
|
text = Strings::commands_SelectTile_Add();
|
|
|
|
|
break;
|
|
|
|
|
case gen::SelectionMode::SUBTRACT:
|
|
|
|
|
text = Strings::commands_SelectTile_Subtract();
|
|
|
|
|
break;
|
2018-10-27 01:04:08 +08:00
|
|
|
case gen::SelectionMode::INTERSECT:
|
|
|
|
|
text = Strings::commands_SelectTile_Intersect();
|
|
|
|
|
break;
|
2017-12-01 10:41:45 +08:00
|
|
|
default:
|
2018-10-27 01:04:08 +08:00
|
|
|
text = getBaseFriendlyName();
|
2017-12-01 10:41:45 +08:00
|
|
|
break;
|
2016-03-19 23:09:03 +08:00
|
|
|
}
|
|
|
|
|
return text;
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-19 22:33:05 +08:00
|
|
|
Command* CommandFactory::createSelectTileCommand()
|
|
|
|
|
{
|
|
|
|
|
return new SelectTileCommand;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace app
|