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