Update ScriptUndoCommand to run on ScriptEngine thread

This commit is contained in:
Ryan Huffman 2014-10-22 15:18:49 -07:00
parent 14555c4534
commit ac8d947cb1
2 changed files with 22 additions and 5 deletions

View file

@ -10,6 +10,7 @@
// //
#include <QDebug> #include <QDebug>
#include <QScriptValue>
#include <QScriptValueList> #include <QScriptValueList>
#include <QScriptEngine> #include <QScriptEngine>
@ -20,9 +21,11 @@ UndoStackScriptingInterface::UndoStackScriptingInterface(QUndoStack* undoStack)
void UndoStackScriptingInterface::pushCommand(QScriptValue undoFunction, QScriptValue undoData, void UndoStackScriptingInterface::pushCommand(QScriptValue undoFunction, QScriptValue undoData,
QScriptValue redoFunction, QScriptValue redoData) { QScriptValue redoFunction, QScriptValue redoData) {
ScriptUndoCommand* undoCommand = new ScriptUndoCommand(undoFunction, undoData, redoFunction, redoData); if (undoFunction.engine()) {
qDebug() << "Pushing command"; ScriptUndoCommand* undoCommand = new ScriptUndoCommand(undoFunction, undoData, redoFunction, redoData);
_undoStack->push(undoCommand); undoCommand->moveToThread(undoFunction.engine()->thread());
_undoStack->push(undoCommand);
}
} }
ScriptUndoCommand::ScriptUndoCommand(QScriptValue undoFunction, QScriptValue undoData, ScriptUndoCommand::ScriptUndoCommand(QScriptValue undoFunction, QScriptValue undoData,
@ -34,12 +37,21 @@ ScriptUndoCommand::ScriptUndoCommand(QScriptValue undoFunction, QScriptValue und
} }
void ScriptUndoCommand::undo() { void ScriptUndoCommand::undo() {
QMetaObject::invokeMethod(this, "doUndo");
}
void ScriptUndoCommand::redo() {
QMetaObject::invokeMethod(this, "doRedo");
}
void ScriptUndoCommand::doUndo() {
QScriptValueList args; QScriptValueList args;
args << _undoData; args << _undoData;
_undoFunction.call(QScriptValue(), args); _undoFunction.call(QScriptValue(), args);
} }
void ScriptUndoCommand::redo() {
void ScriptUndoCommand::doRedo() {
QScriptValueList args; QScriptValueList args;
args << _redoData; args << _redoData;
_redoFunction.call(QScriptValue(), args); _redoFunction.call(QScriptValue(), args);

View file

@ -28,7 +28,8 @@ private:
QUndoStack* _undoStack; QUndoStack* _undoStack;
}; };
class ScriptUndoCommand : public QUndoCommand { class ScriptUndoCommand : public QObject, public QUndoCommand {
Q_OBJECT
public: public:
ScriptUndoCommand(QScriptValue undoFunction, QScriptValue undoData, QScriptValue redoFunction, QScriptValue redoData); ScriptUndoCommand(QScriptValue undoFunction, QScriptValue undoData, QScriptValue redoFunction, QScriptValue redoData);
@ -37,6 +38,10 @@ public:
virtual bool mergeWith(const QUndoCommand* command) { return false; } virtual bool mergeWith(const QUndoCommand* command) { return false; }
virtual int id() const { return -1; } virtual int id() const { return -1; }
public slots:
void doUndo();
void doRedo();
private: private:
QScriptValue _undoFunction; QScriptValue _undoFunction;
QScriptValue _undoData; QScriptValue _undoData;