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

View file

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