1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
/*
Copyright (c) 2018, Lukas Holecek <hluk@email.cz>
This file is part of CopyQ.
CopyQ is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
CopyQ is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with CopyQ. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef SCRIPTABLECLASS_H
#define SCRIPTABLECLASS_H
#include <QObject>
#include <QScriptClass>
#include <QScriptEngine>
#include <QScriptValue>
class QScriptContext;
#define COPYQ_DECLARE_SCRIPTABLE_CLASS(Derived) \
Q_DECLARE_METATYPE(Derived::ScriptableValueType*)
class ScriptableClassBase : public QObject, public QScriptClass
{
Q_OBJECT
public:
explicit ScriptableClassBase(QScriptEngine *engine);
virtual QScriptValue createInstance(const QScriptContext &context) = 0;
QScriptValue constructor();
QScriptValue prototype() const override;
QScriptValue newInstance(QObject *instance);
protected:
void init(QObject *prototype, const QScriptValue &objectPrototype);
static QScriptValue toScriptValue(QScriptEngine *eng, QObject* const &instance);
private:
QScriptValue proto;
QScriptValue ctor;
};
template <typename Object, typename ObjectPrototype>
class ScriptableClass : public ScriptableClassBase
{
public:
using ScriptableValueType = Object;
ScriptableClass(QScriptEngine *engine, const QScriptValue &objectPrototype)
: ScriptableClassBase(engine)
{
qScriptRegisterMetaType<Object*>(engine, toScriptValue, fromScriptValue);
init(new ObjectPrototype(this), objectPrototype);
}
private:
static QScriptValue toScriptValue(QScriptEngine *eng, Object* const &instance)
{
return ScriptableClassBase::toScriptValue(eng, instance);
}
static void fromScriptValue(const QScriptValue &value, Object* &instance)
{
instance = qobject_cast<Object*>(value.toQObject());
}
};
#endif // SCRIPTABLECLASS_H
|