qml 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -1
- data/changes.md +4 -0
- data/examples/twitter/twitter.rb +1 -2
- data/ext/qml/{ext_accesssupport.cpp → ext_accesswrapperfactory.cpp} +17 -19
- data/ext/qml/{ext_accesssupport.h → ext_accesswrapperfactory.h} +3 -6
- data/ext/qml/ext_anywrapper.cpp +6 -8
- data/ext/qml/ext_anywrapper.h +2 -5
- data/ext/qml/ext_kernel.cpp +27 -8
- data/ext/qml/ext_kernel.h +1 -3
- data/ext/qml/ext_metaobject.cpp +47 -49
- data/ext/qml/ext_metaobject.h +2 -4
- data/ext/qml/ext_pluginloader.cpp +10 -12
- data/ext/qml/ext_pluginloader.h +3 -5
- data/ext/qml/ext_pointer.cpp +23 -25
- data/ext/qml/ext_pointer.h +3 -5
- data/ext/qml/ext_testutil.cpp +1 -3
- data/ext/qml/ext_testutil.h +1 -3
- data/ext/qml/init.cpp +10 -10
- data/ext/qml/kernel.cpp +39 -0
- data/ext/qml/kernel.h +32 -0
- data/ext/qml/plugins/core/applicationextension.cpp +0 -5
- data/ext/qml/plugins/core/applicationextension.h +0 -3
- data/ext/qml/rubyvalue.cpp +10 -10
- data/ext/qml/weakvaluereference.cpp +2 -2
- data/lib/qml.rb +1 -22
- data/lib/qml/application.rb +0 -8
- data/lib/qml/dispatcher.rb +10 -1
- data/lib/qml/init.rb +29 -0
- data/lib/qml/version.rb +1 -1
- data/spec/qml/dispatchable_spec.rb +1 -0
- data/spec/qml/dispatcher_spec.rb +26 -2
- metadata +7 -6
- data/ext/qml/application.cpp +0 -54
- data/ext/qml/application.h +0 -17
data/ext/qml/ext_metaobject.h
CHANGED
@@ -7,12 +7,11 @@
|
|
7
7
|
#include <QtCore/QObject>
|
8
8
|
|
9
9
|
namespace RubyQml {
|
10
|
-
namespace Ext {
|
11
10
|
|
12
|
-
class
|
11
|
+
class Ext_MetaObject
|
13
12
|
{
|
14
13
|
public:
|
15
|
-
|
14
|
+
Ext_MetaObject(RubyValue self);
|
16
15
|
|
17
16
|
RubyValue className() const;
|
18
17
|
|
@@ -58,5 +57,4 @@ private:
|
|
58
57
|
QHash<ID, int> mPropertyHash;
|
59
58
|
};
|
60
59
|
|
61
|
-
} // namespace Ext
|
62
60
|
} // namespace RubyQml
|
@@ -5,25 +5,24 @@
|
|
5
5
|
#include <QtCore/QSet>
|
6
6
|
|
7
7
|
namespace RubyQml {
|
8
|
-
namespace Ext {
|
9
8
|
|
10
|
-
|
9
|
+
Ext_PluginLoader::Ext_PluginLoader(RubyValue self) :
|
11
10
|
self(self),
|
12
11
|
mPluginLoader(new QPluginLoader())
|
13
12
|
{
|
14
13
|
}
|
15
14
|
|
16
|
-
|
15
|
+
Ext_PluginLoader::~Ext_PluginLoader()
|
17
16
|
{
|
18
17
|
}
|
19
18
|
|
20
|
-
RubyValue
|
19
|
+
RubyValue Ext_PluginLoader::initialize(RubyValue path)
|
21
20
|
{
|
22
21
|
mPluginLoader->setFileName(path.to<QString>());
|
23
22
|
return self;
|
24
23
|
}
|
25
24
|
|
26
|
-
RubyValue
|
25
|
+
RubyValue Ext_PluginLoader::load()
|
27
26
|
{
|
28
27
|
auto ok = mPluginLoader->load();
|
29
28
|
if (!ok) {
|
@@ -32,7 +31,7 @@ RubyValue PluginLoader::load()
|
|
32
31
|
return self;
|
33
32
|
}
|
34
33
|
|
35
|
-
RubyValue
|
34
|
+
RubyValue Ext_PluginLoader::instance()
|
36
35
|
{
|
37
36
|
self.send("load");
|
38
37
|
auto instance = mPluginLoader->instance();
|
@@ -43,13 +42,12 @@ RubyValue PluginLoader::instance()
|
|
43
42
|
}
|
44
43
|
}
|
45
44
|
|
46
|
-
void
|
45
|
+
void Ext_PluginLoader::defineClass()
|
47
46
|
{
|
48
|
-
WrapperRubyClass<
|
49
|
-
klass.defineMethod(MethodAccess::Private, "initialize", RUBYQML_MEMBER_FUNCTION_INFO(&
|
50
|
-
klass.defineMethod(MethodAccess::Public, "load", RUBYQML_MEMBER_FUNCTION_INFO(&
|
51
|
-
klass.defineMethod(MethodAccess::Public, "instance", RUBYQML_MEMBER_FUNCTION_INFO(&
|
47
|
+
WrapperRubyClass<Ext_PluginLoader> klass(RubyModule::fromPath("QML"), "PluginLoader");
|
48
|
+
klass.defineMethod(MethodAccess::Private, "initialize", RUBYQML_MEMBER_FUNCTION_INFO(&Ext_PluginLoader::initialize));
|
49
|
+
klass.defineMethod(MethodAccess::Public, "load", RUBYQML_MEMBER_FUNCTION_INFO(&Ext_PluginLoader::load));
|
50
|
+
klass.defineMethod(MethodAccess::Public, "instance", RUBYQML_MEMBER_FUNCTION_INFO(&Ext_PluginLoader::instance));
|
52
51
|
}
|
53
52
|
|
54
|
-
} // namespace Ext
|
55
53
|
} // namespace RubyQml
|
data/ext/qml/ext_pluginloader.h
CHANGED
@@ -6,13 +6,12 @@
|
|
6
6
|
class QPluginLoader;
|
7
7
|
|
8
8
|
namespace RubyQml {
|
9
|
-
namespace Ext {
|
10
9
|
|
11
|
-
class
|
10
|
+
class Ext_PluginLoader
|
12
11
|
{
|
13
12
|
public:
|
14
|
-
|
15
|
-
~
|
13
|
+
Ext_PluginLoader(RubyValue self);
|
14
|
+
~Ext_PluginLoader();
|
16
15
|
|
17
16
|
RubyValue initialize(RubyValue path);
|
18
17
|
RubyValue load();
|
@@ -27,6 +26,5 @@ private:
|
|
27
26
|
std::unique_ptr<QPluginLoader> mPluginLoader;
|
28
27
|
};
|
29
28
|
|
30
|
-
} // namespace Ext
|
31
29
|
} // namespace RubyQml
|
32
30
|
|
data/ext/qml/ext_pointer.cpp
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
#include "markable.h"
|
3
3
|
#include "objectdata.h"
|
4
4
|
#include "objectgc.h"
|
5
|
-
#include "
|
5
|
+
#include "kernel.h"
|
6
6
|
#include <QObject>
|
7
7
|
#include <QHash>
|
8
8
|
#include <QQmlEngine>
|
@@ -11,27 +11,26 @@
|
|
11
11
|
#include <QCoreApplication>
|
12
12
|
|
13
13
|
namespace RubyQml {
|
14
|
-
namespace Ext {
|
15
14
|
|
16
|
-
|
15
|
+
Ext_Pointer::Ext_Pointer(RubyValue self) :
|
17
16
|
self(self)
|
18
17
|
{
|
19
18
|
}
|
20
19
|
|
21
|
-
|
20
|
+
Ext_Pointer::~Ext_Pointer()
|
22
21
|
{
|
23
22
|
ObjectGC::instance()->debug() << "\u267B\uFE0F releasing object:" << mObject << "managed:" << mIsManaged;
|
24
23
|
}
|
25
24
|
|
26
|
-
RubyValue
|
25
|
+
RubyValue Ext_Pointer::fromQObject(QObject *obj, bool owned)
|
27
26
|
{
|
28
|
-
auto klass = wrapperRubyClass<
|
27
|
+
auto klass = wrapperRubyClass<Ext_Pointer>();
|
29
28
|
auto ptr = klass.newInstance();
|
30
29
|
klass.unwrap(ptr)->setQObject(obj, owned);
|
31
30
|
return ptr;
|
32
31
|
}
|
33
32
|
|
34
|
-
QObject *
|
33
|
+
QObject *Ext_Pointer::fetchQObject()
|
35
34
|
{
|
36
35
|
if (!mObject) {
|
37
36
|
fail("QML::QtObjectError", "referencing already deleted Qt Object");
|
@@ -39,7 +38,7 @@ QObject *Pointer::fetchQObject()
|
|
39
38
|
return mObject;
|
40
39
|
}
|
41
40
|
|
42
|
-
void
|
41
|
+
void Ext_Pointer::setQObject(QObject *obj, bool managed)
|
43
42
|
{
|
44
43
|
if (!obj) {
|
45
44
|
throw std::logic_error("null object");
|
@@ -51,12 +50,12 @@ void Pointer::setQObject(QObject *obj, bool managed)
|
|
51
50
|
ObjectGC::instance()->debug() << "\u2728 acquiring object:" << mObject;
|
52
51
|
}
|
53
52
|
|
54
|
-
void
|
53
|
+
void Ext_Pointer::setManaged(bool managed)
|
55
54
|
{
|
56
55
|
if (mObject) {
|
57
56
|
if (managed) {
|
58
57
|
QQmlEngine::setObjectOwnership(mObject, QQmlEngine::JavaScriptOwnership);
|
59
|
-
mJSValue =
|
58
|
+
mJSValue = Kernel::instance()->engine()->newQObject(mObject);
|
60
59
|
} else {
|
61
60
|
QQmlEngine::setObjectOwnership(mObject, QQmlEngine::CppOwnership);
|
62
61
|
mJSValue = QJSValue();
|
@@ -67,7 +66,7 @@ void Pointer::setManaged(bool managed)
|
|
67
66
|
}
|
68
67
|
}
|
69
68
|
|
70
|
-
void
|
69
|
+
void Ext_Pointer::preferManaged(bool managed)
|
71
70
|
{
|
72
71
|
auto ownership = QQmlEngine::objectOwnership(mObject);
|
73
72
|
|
@@ -83,52 +82,51 @@ void Pointer::preferManaged(bool managed)
|
|
83
82
|
setManaged(managed);
|
84
83
|
}
|
85
84
|
|
86
|
-
RubyValue
|
85
|
+
RubyValue Ext_Pointer::ext_isManaged() const
|
87
86
|
{
|
88
87
|
return RubyValue::from(mIsManaged);
|
89
88
|
}
|
90
89
|
|
91
|
-
RubyValue
|
90
|
+
RubyValue Ext_Pointer::ext_setManaged(RubyValue managed)
|
92
91
|
{
|
93
92
|
setManaged(managed.to<bool>());
|
94
93
|
return ext_isManaged();
|
95
94
|
}
|
96
95
|
|
97
|
-
RubyValue
|
96
|
+
RubyValue Ext_Pointer::ext_preferManaged(RubyValue managed)
|
98
97
|
{
|
99
98
|
preferManaged(managed.to<bool>());
|
100
99
|
return ext_isManaged();
|
101
100
|
}
|
102
101
|
|
103
|
-
RubyValue
|
102
|
+
RubyValue Ext_Pointer::ext_isNull() const
|
104
103
|
{
|
105
104
|
return RubyValue::from(!mObject);
|
106
105
|
}
|
107
106
|
|
108
|
-
RubyValue
|
107
|
+
RubyValue Ext_Pointer::ext_toString() const
|
109
108
|
{
|
110
109
|
QString name;
|
111
110
|
QDebug(&name) << mObject.data();
|
112
111
|
return RubyValue::from(name);
|
113
112
|
}
|
114
113
|
|
115
|
-
void
|
114
|
+
void Ext_Pointer::gc_mark()
|
116
115
|
{
|
117
116
|
if (mIsManaged) {
|
118
117
|
ObjectGC::instance()->markOwnedObject(mObject);
|
119
118
|
}
|
120
119
|
}
|
121
120
|
|
122
|
-
void
|
121
|
+
void Ext_Pointer::defineClass()
|
123
122
|
{
|
124
|
-
WrapperRubyClass<
|
125
|
-
klass.defineMethod("managed?", RUBYQML_MEMBER_FUNCTION_INFO(&
|
126
|
-
klass.defineMethod("managed=", RUBYQML_MEMBER_FUNCTION_INFO(&
|
127
|
-
klass.defineMethod("prefer_managed", RUBYQML_MEMBER_FUNCTION_INFO(&
|
128
|
-
klass.defineMethod("null?", RUBYQML_MEMBER_FUNCTION_INFO(&
|
129
|
-
klass.defineMethod("to_s", RUBYQML_MEMBER_FUNCTION_INFO(&
|
123
|
+
WrapperRubyClass<Ext_Pointer> klass(RubyModule::fromPath("QML"), "Pointer");
|
124
|
+
klass.defineMethod("managed?", RUBYQML_MEMBER_FUNCTION_INFO(&Ext_Pointer::ext_isManaged));
|
125
|
+
klass.defineMethod("managed=", RUBYQML_MEMBER_FUNCTION_INFO(&Ext_Pointer::ext_setManaged));
|
126
|
+
klass.defineMethod("prefer_managed", RUBYQML_MEMBER_FUNCTION_INFO(&Ext_Pointer::ext_preferManaged));
|
127
|
+
klass.defineMethod("null?", RUBYQML_MEMBER_FUNCTION_INFO(&Ext_Pointer::ext_isNull));
|
128
|
+
klass.defineMethod("to_s", RUBYQML_MEMBER_FUNCTION_INFO(&Ext_Pointer::ext_toString));
|
130
129
|
klass.aliasMethod("inspect", "to_s");
|
131
130
|
}
|
132
131
|
|
133
|
-
} // namespace Ext
|
134
132
|
} // namespace RubyQml
|
data/ext/qml/ext_pointer.h
CHANGED
@@ -4,13 +4,12 @@
|
|
4
4
|
#include <QJSValue>
|
5
5
|
|
6
6
|
namespace RubyQml {
|
7
|
-
namespace Ext {
|
8
7
|
|
9
|
-
class
|
8
|
+
class Ext_Pointer
|
10
9
|
{
|
11
10
|
public:
|
12
|
-
|
13
|
-
~
|
11
|
+
Ext_Pointer(RubyValue self);
|
12
|
+
~Ext_Pointer();
|
14
13
|
|
15
14
|
static RubyValue fromQObject(QObject *obj, bool owned);
|
16
15
|
|
@@ -39,5 +38,4 @@ private:
|
|
39
38
|
QJSValue mJSValue;
|
40
39
|
};
|
41
40
|
|
42
|
-
} // namespace Ext
|
43
41
|
} // namespace RubyQml
|
data/ext/qml/ext_testutil.cpp
CHANGED
@@ -3,8 +3,7 @@
|
|
3
3
|
#include "objectgc.h"
|
4
4
|
|
5
5
|
namespace RubyQml {
|
6
|
-
namespace
|
7
|
-
namespace TestUtil {
|
6
|
+
namespace Ext_TestUtil {
|
8
7
|
|
9
8
|
namespace {
|
10
9
|
|
@@ -38,5 +37,4 @@ void defineModule()
|
|
38
37
|
}
|
39
38
|
|
40
39
|
} // namespace TestUtil
|
41
|
-
} // namespace Ext
|
42
40
|
} // namespace RubyQml
|
data/ext/qml/ext_testutil.h
CHANGED
data/ext/qml/init.cpp
CHANGED
@@ -2,10 +2,10 @@
|
|
2
2
|
#include "ext_pointer.h"
|
3
3
|
#include "ext_pluginloader.h"
|
4
4
|
#include "ext_anywrapper.h"
|
5
|
-
#include "
|
5
|
+
#include "ext_accesswrapperfactory.h"
|
6
6
|
#include "ext_testutil.h"
|
7
7
|
#include "ext_kernel.h"
|
8
|
-
#include "
|
8
|
+
#include "kernel.h"
|
9
9
|
#include "signalforwarder.h"
|
10
10
|
#include "valuereference.h"
|
11
11
|
#include "objectgc.h"
|
@@ -23,19 +23,19 @@ void defineMetaTypes()
|
|
23
23
|
|
24
24
|
void defineClasses()
|
25
25
|
{
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
26
|
+
Ext_MetaObject::defineClass();
|
27
|
+
Ext_Pointer::defineClass();
|
28
|
+
Ext_PluginLoader::defineClass();
|
29
|
+
Ext_AnyWrapper::defineClass();
|
30
|
+
Ext_AccessWrapperFactory::defineClass();
|
31
|
+
Ext_TestUtil::defineModule();
|
32
|
+
Ext_Kernel::defineModule();
|
33
33
|
ListModel::defineUtilMethods();
|
34
34
|
}
|
35
35
|
|
36
36
|
void setupGlobalGCMarking()
|
37
37
|
{
|
38
|
-
auto marker =
|
38
|
+
auto marker = Ext_AnyWrapper::create(QVariant(), [](const QVariant &) {
|
39
39
|
ValueReference::markAllReferences();
|
40
40
|
ObjectGC::instance()->markNonOwnedObjects();
|
41
41
|
});
|
data/ext/qml/kernel.cpp
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
#include "kernel.h"
|
2
|
+
#include "util.h"
|
3
|
+
#include <QTimer>
|
4
|
+
|
5
|
+
namespace RubyQml {
|
6
|
+
|
7
|
+
Kernel *Kernel::instance()
|
8
|
+
{
|
9
|
+
if (!mInstance) {
|
10
|
+
fail("QML::UninitializedError", "ruby-qml not yet initialized");
|
11
|
+
}
|
12
|
+
return mInstance;
|
13
|
+
}
|
14
|
+
|
15
|
+
void Kernel::init(const QList<QByteArray> &args)
|
16
|
+
{
|
17
|
+
if (mInstance) {
|
18
|
+
fail("QML::AlreadyInitializedErryr", "ruby-qml already initialized");
|
19
|
+
}
|
20
|
+
mInstance = new Kernel(args);
|
21
|
+
}
|
22
|
+
|
23
|
+
Kernel::Kernel(const QList<QByteArray> &args)
|
24
|
+
{
|
25
|
+
mArgc = args.size();
|
26
|
+
mArgData = args;
|
27
|
+
mArgv = new char*[mArgc];
|
28
|
+
std::transform(mArgData.begin(), mArgData.end(), mArgv, [](QByteArray &ba) { return ba.data(); });
|
29
|
+
|
30
|
+
mApplication = new QApplication(mArgc, mArgv);
|
31
|
+
mEngine = new QQmlEngine();
|
32
|
+
mEventLoopHookTimer = new QTimer();
|
33
|
+
mEventLoopHookTimer->setInterval(0);
|
34
|
+
mEventLoopHookTimer->setSingleShot(false);
|
35
|
+
}
|
36
|
+
|
37
|
+
Kernel *Kernel::mInstance = nullptr;
|
38
|
+
|
39
|
+
} // namespace RubyQml
|
data/ext/qml/kernel.h
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
#pragma once
|
2
|
+
|
3
|
+
#include <QList>
|
4
|
+
#include <QApplication>
|
5
|
+
#include <QQmlEngine>
|
6
|
+
|
7
|
+
namespace RubyQml {
|
8
|
+
|
9
|
+
class Kernel
|
10
|
+
{
|
11
|
+
public:
|
12
|
+
QApplication *application() { return mApplication; }
|
13
|
+
QQmlEngine *engine() { return mEngine; }
|
14
|
+
QTimer *eventLoopHookTimer() { return mEventLoopHookTimer; }
|
15
|
+
|
16
|
+
static bool initialized() { return mInstance; }
|
17
|
+
static void init(const QList<QByteArray> &args);
|
18
|
+
static Kernel *instance();
|
19
|
+
|
20
|
+
private:
|
21
|
+
Kernel(const QList<QByteArray> &args);
|
22
|
+
static Kernel *mInstance;
|
23
|
+
|
24
|
+
QList<QByteArray> mArgData;
|
25
|
+
int mArgc;
|
26
|
+
char **mArgv;
|
27
|
+
QApplication *mApplication = nullptr;
|
28
|
+
QQmlEngine *mEngine = nullptr;
|
29
|
+
QTimer *mEventLoopHookTimer = nullptr;
|
30
|
+
};
|
31
|
+
|
32
|
+
} // namespace RubyQml
|
@@ -8,11 +8,6 @@ namespace RubyQml {
|
|
8
8
|
ApplicationExtension::ApplicationExtension(QApplication *app) :
|
9
9
|
mApp(app)
|
10
10
|
{
|
11
|
-
auto timer = new QTimer(this);
|
12
|
-
timer->setInterval(0);
|
13
|
-
timer->setSingleShot(false);
|
14
|
-
timer->start();
|
15
|
-
connect(timer, &QTimer::timeout, this, &ApplicationExtension::eventsProcessed);
|
16
11
|
}
|
17
12
|
|
18
13
|
void ApplicationExtension::exec()
|
data/ext/qml/rubyvalue.cpp
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
#include "objectdata.h"
|
6
6
|
#include "accessobject.h"
|
7
7
|
#include "listmodel.h"
|
8
|
-
#include "
|
8
|
+
#include "ext_accesswrapperfactory.h"
|
9
9
|
#include <ruby/intern.h>
|
10
10
|
#define ONIG_ESCAPE_UCHAR_COLLISION
|
11
11
|
#include <ruby/encoding.h>
|
@@ -328,7 +328,7 @@ template <> const QMetaObject *Conversion<const QMetaObject *>::from(RubyValue x
|
|
328
328
|
if (x == RubyValue()) {
|
329
329
|
return nullptr;
|
330
330
|
}
|
331
|
-
return wrapperRubyClass<
|
331
|
+
return wrapperRubyClass<Ext_MetaObject>().unwrap(x)->metaObject();
|
332
332
|
}
|
333
333
|
|
334
334
|
template <> RubyValue Conversion<const QMetaObject *>::to(const QMetaObject *metaobj)
|
@@ -336,7 +336,7 @@ template <> RubyValue Conversion<const QMetaObject *>::to(const QMetaObject *met
|
|
336
336
|
if (!metaobj) {
|
337
337
|
return Qnil;
|
338
338
|
}
|
339
|
-
return
|
339
|
+
return Ext_MetaObject::fromMetaObject(metaobj);
|
340
340
|
}
|
341
341
|
|
342
342
|
} // namespace detail
|
@@ -449,7 +449,7 @@ bool RubyValue::isConvertibleTo(int metaType) const
|
|
449
449
|
}
|
450
450
|
return false;
|
451
451
|
}
|
452
|
-
if (rb_obj_is_kind_of(x, wrapperRubyClass<
|
452
|
+
if (rb_obj_is_kind_of(x, wrapperRubyClass<Ext_MetaObject>())) {
|
453
453
|
return metaType == QMetaType::type("const QMetaObject*");
|
454
454
|
}
|
455
455
|
auto accessModule = RubyModule::fromPath("QML::Access");
|
@@ -524,7 +524,7 @@ int RubyValue::defaultMetaType() const
|
|
524
524
|
if (rb_obj_is_kind_of(x, objectBaseClass)) {
|
525
525
|
return QMetaType::QObjectStar;
|
526
526
|
}
|
527
|
-
if (rb_obj_is_kind_of(x, wrapperRubyClass<
|
527
|
+
if (rb_obj_is_kind_of(x, wrapperRubyClass<Ext_MetaObject>())) {
|
528
528
|
return QMetaType::type("const QMetaObject*");
|
529
529
|
}
|
530
530
|
auto accessModule = RubyModule::fromPath("QML::Access");
|
@@ -630,8 +630,8 @@ RubyValue RubyValue::fromQObject(QObject *obj, bool implicit)
|
|
630
630
|
return data->rubyObject;
|
631
631
|
}
|
632
632
|
|
633
|
-
auto metaobj =
|
634
|
-
auto pointer =
|
633
|
+
auto metaobj = Ext_MetaObject::fromMetaObject(obj->metaObject());
|
634
|
+
auto pointer = Ext_Pointer::fromQObject(obj, false);
|
635
635
|
|
636
636
|
RubyValue wrapper;
|
637
637
|
protect([&] {
|
@@ -656,7 +656,7 @@ QObject *RubyValue::toQObject() const
|
|
656
656
|
auto wrapperFactory = protect([&] {
|
657
657
|
return rb_funcall(rb_obj_class(x), RUBYQML_INTERN("access_wrapper_factory"), 0);
|
658
658
|
});
|
659
|
-
return wrapperRubyClass<
|
659
|
+
return wrapperRubyClass<Ext_AccessWrapperFactory>().unwrap(wrapperFactory)->create(x);
|
660
660
|
}
|
661
661
|
static auto listModelClass = RubyModule::fromPath("QML::Data::ListModel");
|
662
662
|
if (x.isKindOf(listModelClass)) {
|
@@ -670,8 +670,8 @@ QObject *RubyValue::toQObject() const
|
|
670
670
|
.arg(x.send("class").send("name").to<QString>()));
|
671
671
|
}
|
672
672
|
auto objptr = x.send(RUBYQML_INTERN("pointer"));
|
673
|
-
auto obj = wrapperRubyClass<
|
674
|
-
|
673
|
+
auto obj = wrapperRubyClass<Ext_Pointer>().unwrap(objptr)->fetchQObject();
|
674
|
+
Ext_MetaObject::fromMetaObject(obj->metaObject()).send(RUBYQML_INTERN("build_class"));
|
675
675
|
return obj;
|
676
676
|
}
|
677
677
|
|