1
2
3 #include "scriptconsolepanel.h"
4 #include "toonzqt/scriptconsole.h"
5 #include "toonz/scriptengine.h"
6 #include "toonz/scriptbinding.h"
7 #include "toonz/scriptbinding_level.h"
8 #include "iocommand.h"
9 #include "tapp.h"
10 #include "toonz/toonzscene.h"
11 #include "toonz/tproject.h"
12 #include "toonz/tscenehandle.h"
13 #include "toonz/txsheethandle.h"
14 #include "toonz/txshlevel.h"
15 #include "toonz/txshsimplelevel.h"
16 #include "toonzqt/selection.h"
17 #include "toonzqt/tselectionhandle.h"
18
19 #include "flipbook.h"
20 #include "tvectorimage.h"
21
22 #include <QScriptEngine>
23 #include <QFile>
24 #include <QTextStream>
25
loadSceneFun(QScriptContext * context,QScriptEngine * engine)26 static QScriptValue loadSceneFun(QScriptContext *context,
27 QScriptEngine *engine) {
28 if (context->argumentCount() > 0) {
29 QString fpArg = context->argument(0).toString();
30 TFilePath fp(fpArg.toStdWString());
31 IoCmd::loadScene(fp);
32 }
33 return QScriptValue();
34 }
35
saveSceneFun(QScriptContext * context,QScriptEngine * engine)36 static QScriptValue saveSceneFun(QScriptContext *context,
37 QScriptEngine *engine) {
38 if (context->argumentCount() > 0) {
39 QString fpArg = context->argument(0).toString();
40 TFilePath fp(fpArg.toStdWString());
41 IoCmd::saveScene(fp, IoCmd::SILENTLY_OVERWRITE);
42 }
43 return QScriptValue();
44 }
45
loadLevelFun(QScriptContext * context,QScriptEngine * engine)46 static QScriptValue loadLevelFun(QScriptContext *context,
47 QScriptEngine *engine) {
48 if (context->argumentCount() > 0) {
49 QString fpArg = context->argument(0).toString();
50 TFilePath fp(fpArg.toStdWString());
51 int row = 0, col = 0;
52 if (context->argumentCount() == 3) {
53 row = context->argument(1).toInteger();
54 col = context->argument(1).toInteger();
55 }
56
57 TApp *app = TApp::instance();
58 ToonzScene *scene = app->getCurrentScene()->getScene();
59 TXsheet *xsh = scene->getXsheet();
60
61 TFilePath actualPath = scene->decodeFilePath(fp);
62 TXshLevel *xl = scene->loadLevel(actualPath);
63 if (xl) {
64 scene->getXsheet()->exposeLevel(row, col, xl);
65 }
66 app->getCurrentScene()->notifyCastChange();
67 app->getCurrentScene()->notifySceneChanged();
68 app->getCurrentXsheet()->notifyXsheetChanged();
69 }
70 return QScriptValue();
71 }
72
dummyFun(QScriptContext * context,QScriptEngine * engine)73 static QScriptValue dummyFun(QScriptContext *context, QScriptEngine *engine) {
74 return QScriptValue(engine, 0);
75 }
76
viewFun(QScriptContext * context,QScriptEngine * engine)77 static QScriptValue viewFun(QScriptContext *context, QScriptEngine *engine) {
78 TScriptBinding::Image *image = 0;
79 TScriptBinding::Level *level = 0;
80
81 if (context->argumentCount() == 1) {
82 image = qscriptvalue_cast<TScriptBinding::Image *>(context->argument(0));
83 level = qscriptvalue_cast<TScriptBinding::Level *>(context->argument(0));
84 }
85 if (image) {
86 if (!image->getImg())
87 return context->throwError("Can't view an empty image");
88 } else if (level) {
89 if (!level->getSimpleLevel())
90 return context->throwError("Can't view an empty level");
91 } else {
92 return context->throwError("expected one argument : an image or a level");
93 }
94
95 FlipBook *flipBook;
96 flipBook = FlipBookPool::instance()->pop();
97 if (image) {
98 ImageViewer *imageViewer = flipBook->getImageViewer();
99 imageViewer->setImage(image->getImg());
100 } else {
101 flipBook->setLevel(level->getSimpleLevel());
102 }
103 return engine->globalObject().property("void");
104 }
105
evaluateOnMainThread(QScriptContext * context,QScriptEngine * engine)106 static QScriptValue evaluateOnMainThread(QScriptContext *context,
107 QScriptEngine *engine) {
108 QScriptValue fun = context->callee().data();
109 QObject *obj = fun.data().toQObject();
110 QString s = fun.toString();
111 ScriptEngine *se = qobject_cast<ScriptEngine *>(obj);
112 return se->evaluateOnMainThread(fun, context->argumentsObject());
113 }
114
def(ScriptEngine * teng,const QString & name,QScriptEngine::FunctionSignature fun)115 static void def(ScriptEngine *teng, const QString &name,
116 QScriptEngine::FunctionSignature fun) {
117 QScriptEngine *eng = teng->getQScriptEngine();
118 QScriptValue funVal = eng->newFunction(fun);
119 funVal.setData(eng->newQObject(teng));
120
121 QScriptValue evalFun = eng->newFunction(evaluateOnMainThread);
122 evalFun.setData(funVal);
123 eng->globalObject().setProperty(name, evalFun);
124 }
125
126 #if QT_VERSION >= 0x050500
ScriptConsolePanel(QWidget * parent,Qt::WindowFlags flags)127 ScriptConsolePanel::ScriptConsolePanel(QWidget *parent, Qt::WindowFlags flags)
128 #else
129 ScriptConsolePanel::ScriptConsolePanel(QWidget *parent, Qt::WFlags flags)
130 #endif
131 : TPanel(parent) {
132
133 setPanelType("ScriptConsole");
134 setIsMaximizable(false);
135 setWindowTitle(QObject::tr("Script Console"));
136
137 m_scriptConsole = new ScriptConsole(this);
138
139 ScriptEngine *teng = m_scriptConsole->getEngine();
140
141 /*
142 def(teng, "saveScene", saveSceneFun);
143 def(teng, "loadScene", loadSceneFun);
144 def(teng, "loadLevel", loadLevelFun);
145 */
146
147 def(teng, "view", viewFun);
148 def(teng, "dummy", dummyFun);
149
150 // teng->getQScriptEngine()->evaluate("console={version:'1.0'};function
151 // version() {print('Toonz '+toonz.version+'\nscript '+script.version);};");
152
153 /*
154 QFile initFile(":/Resources/init.js");
155 if (initFile.open(QIODevice::ReadOnly))
156 {
157 QTextStream stream(&initFile);
158 QString contents = stream.readAll();
159 initFile.close();
160 teng->getQScriptEngine()->evaluate(contents, "init.js");
161 }
162 */
163
164 setWidget(m_scriptConsole);
165 setMinimumHeight(80);
166 allowMultipleInstances(false);
167
168 resize(800, 300);
169 connect(m_scriptConsole, SIGNAL(selectionChanged()), this,
170 SLOT(selectNone()));
171 }
172
173 //-----------------------------------------------------------------------------
174
~ScriptConsolePanel()175 ScriptConsolePanel::~ScriptConsolePanel() {}
176
177 //-----------------------------------------------------------------------------
178
executeCommand(const QString & cmd)179 void ScriptConsolePanel::executeCommand(const QString &cmd) {
180 m_scriptConsole->executeCommand(cmd);
181 }
182
183 //-----------------------------------------------------------------------------
184
selectNone()185 void ScriptConsolePanel::selectNone() {
186 TApp::instance()->getCurrentSelection()->setSelection(0);
187 }
188