mirror of
https://github.com/aseprite/aseprite.git
synced 2025-03-14 04:19:12 +00:00
lua: Add app.params and --script-param
Now parameters for scripts can be specified from the CLI with --script-params and from gui.xml or .aseprite-keys from <param> sections.
This commit is contained in:
parent
58c1ee1e0e
commit
b2cafe4108
@ -1,4 +1,5 @@
|
||||
// Aseprite
|
||||
// Copyright (C) 2018 Igara Studio S.A.
|
||||
// Copyright (C) 2001-2017 David Capello
|
||||
//
|
||||
// This program is distributed under the terms of
|
||||
@ -63,6 +64,7 @@ AppOptions::AppOptions(int argc, const char* argv[])
|
||||
, m_filenameFormat(m_po.add("filename-format").requiresValue("<fmt>").description("Special format to generate filenames"))
|
||||
#ifdef ENABLE_SCRIPTING
|
||||
, m_script(m_po.add("script").requiresValue("<filename>").description("Execute a specific script"))
|
||||
, m_scriptParam(m_po.add("script-param").requiresValue("name=value").description("Parameter for a script executed from the\nCLI that you can access with app.params"))
|
||||
#endif
|
||||
, m_listLayers(m_po.add("list-layers").description("List layers of the next given sprite\nor include layers in JSON data"))
|
||||
, m_listTags(m_po.add("list-tags").description("List tags of the next given sprite\nor include frame tags in JSON data"))
|
||||
|
@ -1,4 +1,5 @@
|
||||
// Aseprite
|
||||
// Copyright (C) 2018 Igara Studio S.A.
|
||||
// Copyright (C) 2001-2017 David Capello
|
||||
//
|
||||
// This program is distributed under the terms of
|
||||
@ -77,6 +78,7 @@ public:
|
||||
const Option& filenameFormat() const { return m_filenameFormat; }
|
||||
#ifdef ENABLE_SCRIPTING
|
||||
const Option& script() const { return m_script; }
|
||||
const Option& scriptParam() const { return m_scriptParam; }
|
||||
#endif
|
||||
const Option& listLayers() const { return m_listLayers; }
|
||||
const Option& listTags() const { return m_listTags; }
|
||||
@ -135,6 +137,7 @@ private:
|
||||
Option& m_filenameFormat;
|
||||
#ifdef ENABLE_SCRIPTING
|
||||
Option& m_script;
|
||||
Option& m_scriptParam;
|
||||
#endif
|
||||
Option& m_listLayers;
|
||||
Option& m_listTags;
|
||||
|
@ -1,4 +1,5 @@
|
||||
// Aseprite
|
||||
// Copyright (C) 2018 Igara Studio S.A.
|
||||
// Copyright (C) 2016-2018 David Capello
|
||||
//
|
||||
// This program is distributed under the terms of
|
||||
@ -15,6 +16,7 @@ namespace app {
|
||||
class AppOptions;
|
||||
class Context;
|
||||
class DocExporter;
|
||||
class Params;
|
||||
struct CliOpenFile;
|
||||
|
||||
class CliDelegate {
|
||||
@ -30,7 +32,10 @@ namespace app {
|
||||
virtual void saveFile(Context* ctx, const CliOpenFile& cof) { }
|
||||
virtual void loadPalette(Context* ctx, const CliOpenFile& cof, const std::string& filename) { }
|
||||
virtual void exportFiles(Context* ctx, DocExporter& exporter) { }
|
||||
virtual void execScript(const std::string& filename) { }
|
||||
#ifdef ENABLE_SCRIPTING
|
||||
virtual void execScript(const std::string& filename,
|
||||
const Params& params) { }
|
||||
#endif // ENABLE_SCRIPTING
|
||||
};
|
||||
|
||||
} // namespace app
|
||||
|
@ -1,4 +1,5 @@
|
||||
// Aseprite
|
||||
// Copyright (C) 2018 Igara Studio S.A.
|
||||
// Copyright (C) 2001-2018 David Capello
|
||||
//
|
||||
// This program is distributed under the terms of
|
||||
@ -134,6 +135,9 @@ void CliProcessor::process(Context* ctx)
|
||||
}
|
||||
// Process other options and file names
|
||||
else if (!m_options.values().empty()) {
|
||||
#ifdef ENABLE_SCRIPTING
|
||||
Params scriptParams;
|
||||
#endif
|
||||
Console console;
|
||||
CliOpenFile cof;
|
||||
SpriteSheetType sheetType = SpriteSheetType::None;
|
||||
@ -431,7 +435,17 @@ void CliProcessor::process(Context* ctx)
|
||||
// --script <filename>
|
||||
else if (opt == &m_options.script()) {
|
||||
std::string filename = value.value();
|
||||
m_delegate->execScript(filename);
|
||||
m_delegate->execScript(filename, scriptParams);
|
||||
}
|
||||
// --script-param <name=value>
|
||||
else if (opt == &m_options.scriptParam()) {
|
||||
const std::string& v = value.value();
|
||||
auto i = v.find('=');
|
||||
if (i != std::string::npos)
|
||||
scriptParams.set(v.substr(0, i).c_str(),
|
||||
v.substr(i+1).c_str());
|
||||
else
|
||||
scriptParams.set(v.c_str(), "1");
|
||||
}
|
||||
#endif
|
||||
// --list-layers
|
||||
|
@ -1,4 +1,5 @@
|
||||
// Aseprite
|
||||
// Copyright (C) 2018 Igara Studio S.A.
|
||||
// Copyright (C) 2016-2018 David Capello
|
||||
//
|
||||
// This program is distributed under the terms of
|
||||
@ -33,7 +34,10 @@ public:
|
||||
void afterOpenFile(const CliOpenFile& cof) override { }
|
||||
void saveFile(Context* ctx, const CliOpenFile& cof) override { }
|
||||
void exportFiles(Context* ctx, DocExporter& exporter) override { }
|
||||
void execScript(const std::string& filename) override { }
|
||||
#ifdef ENABLE_SCRIPTING
|
||||
void execScript(const std::string& filename,
|
||||
const Params& params) override { }
|
||||
#endif
|
||||
|
||||
bool helpWasShown() const { return m_helpWasShown; }
|
||||
bool versionWasShown() const { return m_versionWasShown; }
|
||||
|
@ -1,4 +1,5 @@
|
||||
// Aseprite
|
||||
// Copyright (C) 2018 Igara Studio S.A.
|
||||
// Copyright (C) 2016-2018 David Capello
|
||||
//
|
||||
// This program is distributed under the terms of
|
||||
@ -127,12 +128,13 @@ void DefaultCliDelegate::exportFiles(Context* ctx, DocExporter& exporter)
|
||||
LOG("APP: Export sprite sheet: Done\n");
|
||||
}
|
||||
|
||||
void DefaultCliDelegate::execScript(const std::string& filename)
|
||||
{
|
||||
#ifdef ENABLE_SCRIPTING
|
||||
if (!App::instance()->scriptEngine()->evalFile(filename))
|
||||
void DefaultCliDelegate::execScript(const std::string& filename,
|
||||
const Params& params)
|
||||
{
|
||||
if (!App::instance()->scriptEngine()->evalFile(filename, params))
|
||||
throw std::runtime_error("Error executing script");
|
||||
#endif
|
||||
}
|
||||
#endif // ENABLE_SCRIPTING
|
||||
|
||||
} // namespace app
|
||||
|
@ -1,4 +1,5 @@
|
||||
// Aseprite
|
||||
// Copyright (C) 2018 Igara Studio S.A.
|
||||
// Copyright (C) 2016-2018 David Capello
|
||||
//
|
||||
// This program is distributed under the terms of
|
||||
@ -20,7 +21,10 @@ namespace app {
|
||||
void saveFile(Context* ctx, const CliOpenFile& cof) override;
|
||||
void loadPalette(Context* ctx, const CliOpenFile& cof, const std::string& filename) override;
|
||||
void exportFiles(Context* ctx, DocExporter& exporter) override;
|
||||
void execScript(const std::string& filename) override;
|
||||
#ifdef ENABLE_SCRIPTING
|
||||
void execScript(const std::string& filename,
|
||||
const Params& params) override;
|
||||
#endif
|
||||
};
|
||||
|
||||
} // namespace app
|
||||
|
@ -1,4 +1,5 @@
|
||||
// Aseprite
|
||||
// Copyright (C) 2018 Igara Studio S.A.
|
||||
// Copyright (C) 2016-2018 David Capello
|
||||
//
|
||||
// This program is distributed under the terms of
|
||||
@ -206,10 +207,19 @@ void PreviewCliDelegate::exportFiles(Context* ctx, DocExporter& exporter)
|
||||
}
|
||||
}
|
||||
|
||||
void PreviewCliDelegate::execScript(const std::string& filename)
|
||||
#ifdef ENABLE_SCRIPTING
|
||||
void PreviewCliDelegate::execScript(const std::string& filename,
|
||||
const Params& params)
|
||||
{
|
||||
std::cout << "- Run script: '" << filename << "'\n";
|
||||
if (!params.empty()) {
|
||||
std::cout << " - With app.params = {\n";
|
||||
for (const auto& kv : params)
|
||||
std::cout << " " << kv.first << "=\"" << kv.second << "\",\n";
|
||||
std::cout << " }\n";
|
||||
}
|
||||
}
|
||||
#endif // ENABLE_SCRIPTING
|
||||
|
||||
void PreviewCliDelegate::showLayersFilter(const CliOpenFile& cof)
|
||||
{
|
||||
|
@ -1,4 +1,5 @@
|
||||
// Aseprite
|
||||
// Copyright (C) 2018 Igara Studio S.A.
|
||||
// Copyright (C) 2016-2018 David Capello
|
||||
//
|
||||
// This program is distributed under the terms of
|
||||
@ -26,7 +27,10 @@ namespace app {
|
||||
const CliOpenFile& cof,
|
||||
const std::string& filename) override;
|
||||
void exportFiles(Context* ctx, DocExporter& exporter) override;
|
||||
void execScript(const std::string& filename) override;
|
||||
#ifdef ENABLE_SCRIPTING
|
||||
void execScript(const std::string& filename,
|
||||
const Params& params) override;
|
||||
#endif // ENABLE_SCRIPTING
|
||||
|
||||
private:
|
||||
void showLayersFilter(const CliOpenFile& cof);
|
||||
|
@ -43,6 +43,7 @@ protected:
|
||||
|
||||
private:
|
||||
std::string m_filename;
|
||||
Params m_params;
|
||||
};
|
||||
|
||||
RunScriptCommand::RunScriptCommand()
|
||||
@ -59,6 +60,8 @@ void RunScriptCommand::onLoadParams(const Params& params)
|
||||
if (rf.findFirst())
|
||||
m_filename = rf.filename();
|
||||
}
|
||||
|
||||
m_params = params;
|
||||
}
|
||||
|
||||
void RunScriptCommand::onExecute(Context* context)
|
||||
@ -76,7 +79,7 @@ void RunScriptCommand::onExecute(Context* context)
|
||||
|
||||
App::instance()
|
||||
->scriptEngine()
|
||||
->evalFile(m_filename);
|
||||
->evalFile(m_filename, m_params);
|
||||
|
||||
ui::Manager::getDefault()->invalidate();
|
||||
}
|
||||
|
@ -10,6 +10,6 @@
|
||||
|
||||
// Increment this value if the scripting API is modified between two
|
||||
// released Aseprite versions.
|
||||
#define API_VERSION 1
|
||||
#define API_VERSION 2
|
||||
|
||||
#endif
|
||||
|
@ -468,5 +468,17 @@ void register_app_object(lua_State* L)
|
||||
lua_pop(L, 1); // Pop app table
|
||||
}
|
||||
|
||||
void set_app_params(lua_State* L, const Params& params)
|
||||
{
|
||||
lua_getglobal(L, "app");
|
||||
lua_newtable(L);
|
||||
for (const auto& kv : params) {
|
||||
lua_pushstring(L, kv.second.c_str());
|
||||
lua_setfield(L, -2, kv.first.c_str());
|
||||
}
|
||||
lua_setfield(L, -2, "params");
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
|
||||
} // namespace script
|
||||
} // namespace app
|
||||
|
@ -161,6 +161,8 @@ void register_sprites_class(lua_State* L);
|
||||
void register_tag_class(lua_State* L);
|
||||
void register_tags_class(lua_State* L);
|
||||
|
||||
void set_app_params(lua_State* L, const Params& params);
|
||||
|
||||
// We use our own fopen() that supports Unicode filename on Windows
|
||||
extern "C" FILE* lua_user_fopen(const char* fname,
|
||||
const char* mode)
|
||||
@ -351,7 +353,8 @@ bool Engine::evalCode(const std::string& code,
|
||||
return ok;
|
||||
}
|
||||
|
||||
bool Engine::evalFile(const std::string& filename)
|
||||
bool Engine::evalFile(const std::string& filename,
|
||||
const Params& params)
|
||||
{
|
||||
std::stringstream buf;
|
||||
{
|
||||
@ -361,6 +364,7 @@ bool Engine::evalFile(const std::string& filename)
|
||||
std::string absFilename = base::get_absolute_path(filename);
|
||||
|
||||
AddScriptFilename add(absFilename);
|
||||
set_app_params(L, params);
|
||||
return evalCode(buf.str(), "@" + absFilename);
|
||||
}
|
||||
|
||||
|
@ -14,6 +14,7 @@
|
||||
#endif
|
||||
|
||||
#include "app/color.h"
|
||||
#include "app/commands/params.h"
|
||||
#include "doc/frame.h"
|
||||
#include "doc/object_ids.h"
|
||||
#include "gfx/fwd.h"
|
||||
@ -67,7 +68,8 @@ namespace app {
|
||||
void printLastResult();
|
||||
bool evalCode(const std::string& code,
|
||||
const std::string& filename = std::string());
|
||||
bool evalFile(const std::string& filename);
|
||||
bool evalFile(const std::string& filename,
|
||||
const Params& params = Params());
|
||||
|
||||
void consolePrint(const char* text) {
|
||||
onConsolePrint(text);
|
||||
|
Loading…
x
Reference in New Issue
Block a user