diff --git a/data/pref.xml b/data/pref.xml index 66332f569..3e97135cf 100644 --- a/data/pref.xml +++ b/data/pref.xml @@ -73,6 +73,7 @@ + diff --git a/src/app/script/api_version.h b/src/app/script/api_version.h index dc6e480fd..a9b9cd620 100644 --- a/src/app/script/api_version.h +++ b/src/app/script/api_version.h @@ -1,5 +1,5 @@ // Aseprite -// Copyright (C) 2018-2020 Igara Studio S.A. +// Copyright (C) 2018-2021 Igara Studio S.A. // // This program is distributed under the terms of // the End-User License Agreement for Aseprite. @@ -10,6 +10,6 @@ // Increment this value if the scripting API is modified between two // released Aseprite versions. -#define API_VERSION 13 +#define API_VERSION 14 #endif diff --git a/src/app/script/app_object.cpp b/src/app/script/app_object.cpp index 360810002..700e452db 100644 --- a/src/app/script/app_object.cpp +++ b/src/app/script/app_object.cpp @@ -1,5 +1,5 @@ // Aseprite -// Copyright (C) 2018-2020 Igara Studio S.A. +// Copyright (C) 2018-2021 Igara Studio S.A. // Copyright (C) 2015-2018 David Capello // // This program is distributed under the terms of @@ -26,6 +26,7 @@ #include "app/script/security.h" #include "app/site.h" #include "app/tools/active_tool.h" +#include "app/tools/ink.h" #include "app/tools/tool_box.h" #include "app/tools/tool_loop.h" #include "app/tools/tool_loop_manager.h" @@ -388,6 +389,30 @@ int App_useTool(lua_State* L) params.freehandAlgorithm = get_value_from_lua(L, -1); lua_pop(L, 1); + if (params.ink->isSelection()) { + gen::SelectionMode selectionMode = Preferences::instance().selection.mode(); + + type = lua_getfield(L, 1, "selection"); + if (type != LUA_TNIL) + selectionMode = get_value_from_lua(L, -1); + lua_pop(L, 1); + + switch (selectionMode) { + case gen::SelectionMode::REPLACE: + params.modifiers = tools::ToolLoopModifiers::kReplaceSelection; + break; + case gen::SelectionMode::ADD: + params.modifiers = tools::ToolLoopModifiers::kAddSelection; + break; + case gen::SelectionMode::SUBTRACT: + params.modifiers = tools::ToolLoopModifiers::kSubtractSelection; + break; + case gen::SelectionMode::INTERSECT: + params.modifiers = tools::ToolLoopModifiers::kIntersectSelection; + break; + } + } + // Do the tool loop type = lua_getfield(L, 1, "points"); if (type == LUA_TTABLE) { diff --git a/src/app/script/engine.cpp b/src/app/script/engine.cpp index 8d2958730..ce1cfc655 100644 --- a/src/app/script/engine.cpp +++ b/src/app/script/engine.cpp @@ -1,5 +1,5 @@ // Aseprite -// Copyright (C) 2018-2020 Igara Studio S.A. +// Copyright (C) 2018-2021 Igara Studio S.A. // Copyright (C) 2001-2018 David Capello // // This program is distributed under the terms of @@ -15,6 +15,7 @@ #include "app/console.h" #include "app/doc_exporter.h" #include "app/doc_range.h" +#include "app/pref/preferences.h" #include "app/script/luacpp.h" #include "app/script/security.h" #include "app/sprite_sheet_type.h" @@ -367,6 +368,15 @@ Engine::Engine() setfield_integer(L, "X2", (int)ui::kButtonX2); lua_pop(L, 1); + lua_newtable(L); + lua_pushvalue(L, -1); + lua_setglobal(L, "SelectionMode"); + setfield_integer(L, "REPLACE", (int)gen::SelectionMode::REPLACE); + setfield_integer(L, "ADD", (int)gen::SelectionMode::ADD); + setfield_integer(L, "SUBTRACT", (int)gen::SelectionMode::SUBTRACT); + setfield_integer(L, "INTERSECT", (int)gen::SelectionMode::INTERSECT); + lua_pop(L, 1); + // Register classes/prototypes register_brush_class(L); register_cel_class(L); diff --git a/src/app/ui/editor/tool_loop_impl.cpp b/src/app/ui/editor/tool_loop_impl.cpp index 5d661e7fc..2103dd987 100644 --- a/src/app/ui/editor/tool_loop_impl.cpp +++ b/src/app/ui/editor/tool_loop_impl.cpp @@ -121,6 +121,9 @@ protected: doc::color_t m_secondaryColor; tools::DynamicsOptions m_dynamics; + // Modifiers that can be used with scripts + tools::ToolLoopModifiers m_staticToolModifiers; + public: ToolLoopBase(Editor* editor, Site site, ToolLoopParams& params) @@ -157,6 +160,7 @@ public: , m_bgColor(color_utils::color_for_target_mask(params.bg, m_colorTarget)) , m_primaryColor(m_button == tools::ToolLoop::Left ? m_fgColor: m_bgColor) , m_secondaryColor(m_button == tools::ToolLoop::Left ? m_bgColor: m_fgColor) + , m_staticToolModifiers(params.modifiers) { ASSERT(m_tool); ASSERT(m_ink); @@ -266,8 +270,10 @@ public: int getTolerance() override { return m_tolerance; } bool getContiguous() override { return m_contiguous; } tools::ToolLoopModifiers getModifiers() override { - return m_editor ? m_editor->getToolLoopModifiers(): - tools::ToolLoopModifiers::kNone; + return + (m_staticToolModifiers == tools::ToolLoopModifiers::kNone && + m_editor ? m_editor->getToolLoopModifiers(): + m_staticToolModifiers); } filters::TiledMode getTiledMode() override { return m_docPref.tiled.mode(); } bool getGridVisible() override { return m_docPref.show.grid(); } diff --git a/src/app/ui/editor/tool_loop_impl.h b/src/app/ui/editor/tool_loop_impl.h index 9af848257..14fd6d4b6 100644 --- a/src/app/ui/editor/tool_loop_impl.h +++ b/src/app/ui/editor/tool_loop_impl.h @@ -1,5 +1,5 @@ // Aseprite -// Copyright (C) 2019-2020 Igara Studio S.A. +// Copyright (C) 2019-2021 Igara Studio S.A. // Copyright (C) 2001-2017 David Capello // // This program is distributed under the terms of @@ -46,6 +46,9 @@ namespace app { int tolerance = 0; bool contiguous = true; tools::FreehandAlgorithm freehandAlgorithm = tools::FreehandAlgorithm::DEFAULT; + + // For selection tools executed from scripts + tools::ToolLoopModifiers modifiers = tools::ToolLoopModifiers::kNone; }; //////////////////////////////////////////////////////////////////////