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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 525fa2715a8aadc120216147318e0179a578d546
|
4
|
+
data.tar.gz: ca001300069503c335494e26bd443ef123b56179
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e6468fcf25055c17367415cca0d62b540eacf732de0028958a1337af8e9b157c85a9602e4fc07b47b9a64f130a8797e76dfdf6bcd43b2f9907c41cbfb354f627
|
7
|
+
data.tar.gz: 865173142d1e3e4ed48d52c08fc52cb77e0fa51b43188388b3fe9074d9b273e1fc9dfdf5f27667505c1b618447038be10f61c1377c82ff007c0010c039e0a291
|
data/README.md
CHANGED
@@ -1,8 +1,11 @@
|
|
1
|
-
|
1
|
+
ruby-qml
|
2
|
+
================
|
2
3
|
|
3
4
|
[![Gem Version](https://badge.fury.io/rb/qml.svg)](http://badge.fury.io/rb/qml)
|
5
|
+
[![Dependency Status](https://gemnasium.com/seanchas116/ruby-qml.svg)](https://gemnasium.com/seanchas116/ruby-qml)
|
4
6
|
[![Build Status](https://travis-ci.org/seanchas116/ruby-qml.svg?branch=master)](https://travis-ci.org/seanchas116/ruby-qml)
|
5
7
|
[![Coverage Status](https://coveralls.io/repos/seanchas116/ruby-qml/badge.png?branch=master)](https://coveralls.io/r/seanchas116/ruby-qml?branch=master)
|
8
|
+
[![Inline docs](http://inch-ci.org/github/seanchas116/ruby-qml.png?branch=master)](http://inch-ci.org/github/seanchas116/ruby-qml)
|
6
9
|
|
7
10
|
ruby-qml is a QML / Qt Quick wrapper for Ruby.
|
8
11
|
It provides bindings between QML and Ruby and enables you to use Qt Quick-based GUI from Ruby.
|
data/changes.md
CHANGED
data/examples/twitter/twitter.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#include "
|
1
|
+
#include "ext_accesswrapperfactory.h"
|
2
2
|
#include "ext_pointer.h"
|
3
3
|
#include "rubyclass.h"
|
4
4
|
#include "accessclass.h"
|
@@ -7,18 +7,17 @@
|
|
7
7
|
#include "qmltyperegisterer.h"
|
8
8
|
|
9
9
|
namespace RubyQml {
|
10
|
-
namespace Ext {
|
11
10
|
|
12
|
-
|
11
|
+
Ext_AccessWrapperFactory::Ext_AccessWrapperFactory(RubyValue self) :
|
13
12
|
self(self)
|
14
13
|
{
|
15
14
|
}
|
16
15
|
|
17
|
-
|
16
|
+
Ext_AccessWrapperFactory::~Ext_AccessWrapperFactory()
|
18
17
|
{
|
19
18
|
}
|
20
19
|
|
21
|
-
RubyValue
|
20
|
+
RubyValue Ext_AccessWrapperFactory::ext_initialize(RubyValue rubyClass, RubyValue className, RubyValue methodInfos, RubyValue signalInfos, RubyValue propertyInfos)
|
22
21
|
{
|
23
22
|
mRubyClass = rubyClass;
|
24
23
|
mAccessClass = makeSP<AccessClass>(className, methodInfos, signalInfos, propertyInfos);
|
@@ -26,9 +25,9 @@ RubyValue AccessWrapperFactory::ext_initialize(RubyValue rubyClass, RubyValue cl
|
|
26
25
|
return self;
|
27
26
|
}
|
28
27
|
|
29
|
-
RubyValue
|
28
|
+
RubyValue Ext_AccessWrapperFactory::ext_emitSignal(RubyValue obj, RubyValue name, RubyValue args)
|
30
29
|
{
|
31
|
-
auto accessObj = wrapperRubyClass<
|
30
|
+
auto accessObj = wrapperRubyClass<Ext_Pointer>().unwrap(obj.send("access_object"))->fetchQObject();
|
32
31
|
auto nameId = name.toID();
|
33
32
|
auto argVariants = args.to<QVariantList>();
|
34
33
|
withoutGvl([&] {
|
@@ -37,41 +36,40 @@ RubyValue AccessWrapperFactory::ext_emitSignal(RubyValue obj, RubyValue name, Ru
|
|
37
36
|
return Qnil;
|
38
37
|
}
|
39
38
|
|
40
|
-
RubyValue
|
39
|
+
RubyValue Ext_AccessWrapperFactory::ext_registerToQml(RubyValue path, RubyValue majorVersion, RubyValue minorVersion, RubyValue name)
|
41
40
|
{
|
42
41
|
using namespace std::placeholders;
|
43
42
|
if (!mTypeRegisterer) {
|
44
|
-
mTypeRegisterer = makeSP<QmlTypeRegisterer>(mMetaObject, std::bind(&
|
43
|
+
mTypeRegisterer = makeSP<QmlTypeRegisterer>(mMetaObject, std::bind(&Ext_AccessWrapperFactory::newInstanceInto, this, _1));
|
45
44
|
mTypeRegisterer->registerType(path.to<QByteArray>(), majorVersion.to<int>(), minorVersion.to<int>(), name.to<QByteArray>());
|
46
45
|
}
|
47
46
|
return self;
|
48
47
|
}
|
49
48
|
|
50
|
-
RubyValue
|
49
|
+
RubyValue Ext_AccessWrapperFactory::ext_create(RubyValue access)
|
51
50
|
{
|
52
51
|
return RubyValue::fromQObject(create(access), false);
|
53
52
|
}
|
54
53
|
|
55
|
-
AccessWrapper *
|
54
|
+
AccessWrapper *Ext_AccessWrapperFactory::create(RubyValue access)
|
56
55
|
{
|
57
56
|
return new AccessWrapper(mMetaObject, access);
|
58
57
|
}
|
59
58
|
|
60
|
-
void
|
59
|
+
void Ext_AccessWrapperFactory::newInstanceInto(void *where)
|
61
60
|
{
|
62
61
|
withGvl([&] {
|
63
62
|
new(where) AccessWrapper(mMetaObject, mRubyClass.send("new"));
|
64
63
|
});
|
65
64
|
}
|
66
65
|
|
67
|
-
void
|
66
|
+
void Ext_AccessWrapperFactory::defineClass()
|
68
67
|
{
|
69
|
-
WrapperRubyClass<
|
70
|
-
klass.defineMethod(MethodAccess::Protected, "initialize", RUBYQML_MEMBER_FUNCTION_INFO(&
|
71
|
-
klass.defineMethod("emit_signal", RUBYQML_MEMBER_FUNCTION_INFO(&
|
72
|
-
klass.defineMethod("register_to_qml", RUBYQML_MEMBER_FUNCTION_INFO(&
|
73
|
-
klass.defineMethod("create", RUBYQML_MEMBER_FUNCTION_INFO(&
|
68
|
+
WrapperRubyClass<Ext_AccessWrapperFactory> klass(RubyModule::fromPath("QML"), "AccessWrapperFactory");
|
69
|
+
klass.defineMethod(MethodAccess::Protected, "initialize", RUBYQML_MEMBER_FUNCTION_INFO(&Ext_AccessWrapperFactory::ext_initialize));
|
70
|
+
klass.defineMethod("emit_signal", RUBYQML_MEMBER_FUNCTION_INFO(&Ext_AccessWrapperFactory::ext_emitSignal));
|
71
|
+
klass.defineMethod("register_to_qml", RUBYQML_MEMBER_FUNCTION_INFO(&Ext_AccessWrapperFactory::ext_registerToQml));
|
72
|
+
klass.defineMethod("create", RUBYQML_MEMBER_FUNCTION_INFO(&Ext_AccessWrapperFactory::ext_create));
|
74
73
|
}
|
75
74
|
|
76
|
-
} // namespace Ext
|
77
75
|
} // namespace RubyQml
|
@@ -9,13 +9,11 @@ class ForeignMetaObject;
|
|
9
9
|
class QmlTypeRegisterer;
|
10
10
|
class AccessWrapper;
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
class AccessWrapperFactory
|
12
|
+
class Ext_AccessWrapperFactory
|
15
13
|
{
|
16
14
|
public:
|
17
|
-
|
18
|
-
~
|
15
|
+
Ext_AccessWrapperFactory(RubyValue self);
|
16
|
+
~Ext_AccessWrapperFactory();
|
19
17
|
|
20
18
|
RubyValue ext_initialize(RubyValue rubyClass, RubyValue className, RubyValue methodInfos, RubyValue signalInfos, RubyValue propertyInfos);
|
21
19
|
RubyValue ext_emitSignal(RubyValue obj, RubyValue name, RubyValue args);
|
@@ -38,5 +36,4 @@ private:
|
|
38
36
|
SP<QmlTypeRegisterer> mTypeRegisterer;
|
39
37
|
};
|
40
38
|
|
41
|
-
} // namespace Ext
|
42
39
|
} // namespace RubyQml
|
data/ext/qml/ext_anywrapper.cpp
CHANGED
@@ -2,16 +2,15 @@
|
|
2
2
|
#include "rubyclass.h"
|
3
3
|
|
4
4
|
namespace RubyQml {
|
5
|
-
namespace Ext {
|
6
5
|
|
7
|
-
|
6
|
+
Ext_AnyWrapper::Ext_AnyWrapper(RubyValue self)
|
8
7
|
{
|
9
8
|
Q_UNUSED(self);
|
10
9
|
}
|
11
10
|
|
12
|
-
RubyValue
|
11
|
+
RubyValue Ext_AnyWrapper::create(const QVariant &value, void (*markFunction)(const QVariant &))
|
13
12
|
{
|
14
|
-
auto klass = wrapperRubyClass<
|
13
|
+
auto klass = wrapperRubyClass<Ext_AnyWrapper>();
|
15
14
|
auto wrapper = klass.newInstance();
|
16
15
|
auto ptr = klass.unwrap(wrapper);
|
17
16
|
ptr->mValue = value;
|
@@ -19,18 +18,17 @@ RubyValue AnyWrapper::create(const QVariant &value, void (*markFunction)(const Q
|
|
19
18
|
return wrapper;
|
20
19
|
}
|
21
20
|
|
22
|
-
void
|
21
|
+
void Ext_AnyWrapper::defineClass()
|
23
22
|
{
|
24
|
-
WrapperRubyClass<
|
23
|
+
WrapperRubyClass<Ext_AnyWrapper> klass(RubyModule::fromPath("QML"), "AnyWrapper");
|
25
24
|
Q_UNUSED(klass);
|
26
25
|
}
|
27
26
|
|
28
|
-
void
|
27
|
+
void Ext_AnyWrapper::gc_mark()
|
29
28
|
{
|
30
29
|
if (mMarkFunction) {
|
31
30
|
mMarkFunction(mValue);
|
32
31
|
}
|
33
32
|
}
|
34
33
|
|
35
|
-
} // namespace Ext
|
36
34
|
} // namespace RubyQml
|
data/ext/qml/ext_anywrapper.h
CHANGED
@@ -5,12 +5,10 @@ namespace RubyQml {
|
|
5
5
|
|
6
6
|
class RubyValue;
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
class AnyWrapper
|
8
|
+
class Ext_AnyWrapper
|
11
9
|
{
|
12
10
|
public:
|
13
|
-
|
11
|
+
Ext_AnyWrapper(RubyValue self);
|
14
12
|
static RubyValue create(const QVariant &value, void (*markFunction)(const QVariant &) = nullptr);
|
15
13
|
static void defineClass();
|
16
14
|
|
@@ -22,5 +20,4 @@ private:
|
|
22
20
|
void (*mMarkFunction)(const QVariant &);
|
23
21
|
};
|
24
22
|
|
25
|
-
} // namespace Ext
|
26
23
|
} // namespace RubyQml
|
data/ext/qml/ext_kernel.cpp
CHANGED
@@ -1,24 +1,42 @@
|
|
1
1
|
#include "ext_kernel.h"
|
2
|
-
#include "
|
2
|
+
#include "kernel.h"
|
3
3
|
#include "rubyvalue.h"
|
4
4
|
#include "rubyclass.h"
|
5
|
+
#include <QTimer>
|
5
6
|
|
6
7
|
namespace RubyQml {
|
7
|
-
namespace
|
8
|
-
namespace Kernel {
|
8
|
+
namespace Ext_Kernel {
|
9
9
|
|
10
10
|
namespace {
|
11
11
|
|
12
12
|
RubyValue application(RubyValue self)
|
13
13
|
{
|
14
14
|
Q_UNUSED(self);
|
15
|
-
return RubyValue::from(
|
15
|
+
return RubyValue::from(Kernel::instance()->application());
|
16
16
|
}
|
17
17
|
|
18
18
|
RubyValue engine(RubyValue self)
|
19
19
|
{
|
20
20
|
Q_UNUSED(self);
|
21
|
-
return RubyValue::from(
|
21
|
+
return RubyValue::from(Kernel::instance()->engine());
|
22
|
+
}
|
23
|
+
|
24
|
+
RubyValue eventLoopHookTimer(RubyValue self)
|
25
|
+
{
|
26
|
+
Q_UNUSED(self);
|
27
|
+
return RubyValue::from(Kernel::instance()->eventLoopHookTimer());
|
28
|
+
}
|
29
|
+
|
30
|
+
RubyValue setEventLoopHookEnabledLater(RubyValue self, RubyValue enabled)
|
31
|
+
{
|
32
|
+
Q_UNUSED(self);
|
33
|
+
auto timer = Kernel::instance()->eventLoopHookTimer();
|
34
|
+
if (enabled) {
|
35
|
+
timer->metaObject()->invokeMethod(timer, "start", Qt::QueuedConnection);
|
36
|
+
} else {
|
37
|
+
timer->metaObject()->invokeMethod(timer, "stop", Qt::QueuedConnection);
|
38
|
+
}
|
39
|
+
return enabled;
|
22
40
|
}
|
23
41
|
|
24
42
|
RubyValue applicationMetaObject()
|
@@ -34,14 +52,14 @@ RubyValue engineMetaObject()
|
|
34
52
|
RubyValue init(RubyValue self, RubyValue argv)
|
35
53
|
{
|
36
54
|
Q_UNUSED(self);
|
37
|
-
|
55
|
+
Kernel::init(argv.to<QList<QByteArray>>());
|
38
56
|
return Qnil;
|
39
57
|
}
|
40
58
|
|
41
59
|
RubyValue initialized(RubyValue self)
|
42
60
|
{
|
43
61
|
Q_UNUSED(self);
|
44
|
-
return RubyValue::from(
|
62
|
+
return RubyValue::from(Kernel::initialized());
|
45
63
|
}
|
46
64
|
|
47
65
|
}
|
@@ -51,6 +69,8 @@ void defineModule()
|
|
51
69
|
RubyModule kernel(RubyModule::fromPath("QML"), "Kernel");
|
52
70
|
kernel.defineModuleFunction("application", RUBYQML_FUNCTION_INFO(&application));
|
53
71
|
kernel.defineModuleFunction("engine", RUBYQML_FUNCTION_INFO(&engine));
|
72
|
+
kernel.defineModuleFunction("event_loop_hook_timer", RUBYQML_FUNCTION_INFO(&eventLoopHookTimer));
|
73
|
+
kernel.defineModuleFunction("set_event_loop_hook_enabled_later", RUBYQML_FUNCTION_INFO(&setEventLoopHookEnabledLater));
|
54
74
|
kernel.defineModuleFunction("application_meta_object", RUBYQML_FUNCTION_INFO(&applicationMetaObject));
|
55
75
|
kernel.defineModuleFunction("engine_meta_object", RUBYQML_FUNCTION_INFO(&engineMetaObject));
|
56
76
|
kernel.defineModuleFunction("init", RUBYQML_FUNCTION_INFO(&init));
|
@@ -58,5 +78,4 @@ void defineModule()
|
|
58
78
|
}
|
59
79
|
|
60
80
|
} // namespace Kernel
|
61
|
-
} // namespace Ext
|
62
81
|
} // namespace RubyQml
|
data/ext/qml/ext_kernel.h
CHANGED
data/ext/qml/ext_metaobject.cpp
CHANGED
@@ -13,7 +13,6 @@
|
|
13
13
|
#include <QtQml/QQmlEngine>
|
14
14
|
|
15
15
|
namespace RubyQml {
|
16
|
-
namespace Ext {
|
17
16
|
|
18
17
|
namespace {
|
19
18
|
|
@@ -30,38 +29,38 @@ RubyValue idListToArray(const QList<ID> &xs)
|
|
30
29
|
|
31
30
|
}
|
32
31
|
|
33
|
-
|
32
|
+
Ext_MetaObject::Ext_MetaObject(RubyValue self) :
|
34
33
|
self(self)
|
35
34
|
{
|
36
35
|
setMetaObject(&QObject::staticMetaObject);
|
37
36
|
}
|
38
37
|
|
39
|
-
RubyValue
|
38
|
+
RubyValue Ext_MetaObject::className() const
|
40
39
|
{
|
41
40
|
return rb_str_new_cstr(mMetaObject->className());
|
42
41
|
}
|
43
42
|
|
44
|
-
RubyValue
|
43
|
+
RubyValue Ext_MetaObject::methodNames() const
|
45
44
|
{
|
46
45
|
return idListToArray(mMethodHash.keys());
|
47
46
|
}
|
48
47
|
|
49
|
-
RubyValue
|
48
|
+
RubyValue Ext_MetaObject::isPublic(RubyValue name) const
|
50
49
|
{
|
51
50
|
auto methods = findMethods(name);
|
52
51
|
return RubyValue::from(mMetaObject->method(methods.first()).access() == QMetaMethod::Public);
|
53
52
|
}
|
54
|
-
RubyValue
|
53
|
+
RubyValue Ext_MetaObject::isProtected(RubyValue name) const
|
55
54
|
{
|
56
55
|
auto methods = findMethods(name);
|
57
56
|
return RubyValue::from(mMetaObject->method(methods.first()).access() == QMetaMethod::Protected);
|
58
57
|
}
|
59
|
-
RubyValue
|
58
|
+
RubyValue Ext_MetaObject::isPrivate(RubyValue name) const
|
60
59
|
{
|
61
60
|
auto methods = findMethods(name);
|
62
61
|
return RubyValue::from(mMetaObject->method(methods.first()).access() == QMetaMethod::Private);
|
63
62
|
}
|
64
|
-
RubyValue
|
63
|
+
RubyValue Ext_MetaObject::isSignal(RubyValue name) const
|
65
64
|
{
|
66
65
|
auto methods = findMethods(name);
|
67
66
|
return RubyValue::from(mMetaObject->method(methods.first()).methodType() == QMetaMethod::Signal);
|
@@ -132,7 +131,7 @@ public:
|
|
132
131
|
auto ret = RubyValue::from(returnValue);
|
133
132
|
static auto objectBaseClass = RubyClass::fromPath("QML::QtObjectBase");
|
134
133
|
if (ret.isKindOf(objectBaseClass)) {
|
135
|
-
auto pointer = wrapperRubyClass<
|
134
|
+
auto pointer = wrapperRubyClass<Ext_Pointer>().unwrap(ret.send("pointer"));
|
136
135
|
pointer->preferManaged(true);
|
137
136
|
}
|
138
137
|
return ret;
|
@@ -143,7 +142,7 @@ private:
|
|
143
142
|
QMetaMethod mMethod;
|
144
143
|
};
|
145
144
|
|
146
|
-
RubyValue
|
145
|
+
RubyValue Ext_MetaObject::invokeMethod(RubyValue object, RubyValue methodName, RubyValue args) const
|
147
146
|
{
|
148
147
|
checkThread();
|
149
148
|
|
@@ -152,7 +151,7 @@ RubyValue MetaObject::invokeMethod(RubyValue object, RubyValue methodName, RubyV
|
|
152
151
|
protect([&] {
|
153
152
|
args = rb_check_array_type(args);
|
154
153
|
});
|
155
|
-
auto obj = wrapperRubyClass<
|
154
|
+
auto obj = wrapperRubyClass<Ext_Pointer>().unwrap(object)->fetchQObject();
|
156
155
|
for (int i : methodIndexes) {
|
157
156
|
MethodInvoker invoker(args, mMetaObject->method(i));
|
158
157
|
if (invoker.isArgsCompatible()) {
|
@@ -173,10 +172,10 @@ RubyValue MetaObject::invokeMethod(RubyValue object, RubyValue methodName, RubyV
|
|
173
172
|
return Qnil;
|
174
173
|
}
|
175
174
|
|
176
|
-
RubyValue
|
175
|
+
RubyValue Ext_MetaObject::connectSignal(RubyValue object, RubyValue signalName, RubyValue proc) const
|
177
176
|
{
|
178
177
|
auto id = signalName.toID();
|
179
|
-
auto obj = wrapperRubyClass<
|
178
|
+
auto obj = wrapperRubyClass<Ext_Pointer>().unwrap(object)->fetchQObject();
|
180
179
|
|
181
180
|
proc = proc.send("to_proc");
|
182
181
|
|
@@ -199,18 +198,18 @@ RubyValue MetaObject::connectSignal(RubyValue object, RubyValue signalName, Ruby
|
|
199
198
|
return Qnil;
|
200
199
|
}
|
201
200
|
|
202
|
-
RubyValue
|
201
|
+
RubyValue Ext_MetaObject::propertyNames() const
|
203
202
|
{
|
204
203
|
return idListToArray(mPropertyHash.keys());
|
205
204
|
}
|
206
205
|
|
207
|
-
RubyValue
|
206
|
+
RubyValue Ext_MetaObject::getProperty(RubyValue object, RubyValue name) const
|
208
207
|
{
|
209
208
|
checkThread();
|
210
209
|
|
211
210
|
auto metaProperty = mMetaObject->property(findProperty(name));
|
212
211
|
|
213
|
-
auto qobj = wrapperRubyClass<
|
212
|
+
auto qobj = wrapperRubyClass<Ext_Pointer>().unwrap(object)->fetchQObject();
|
214
213
|
QVariant result;
|
215
214
|
withoutGvl([&] {
|
216
215
|
result = metaProperty.read(qobj);
|
@@ -218,7 +217,7 @@ RubyValue MetaObject::getProperty(RubyValue object, RubyValue name) const
|
|
218
217
|
return RubyValue::from(result);
|
219
218
|
}
|
220
219
|
|
221
|
-
RubyValue
|
220
|
+
RubyValue Ext_MetaObject::setProperty(RubyValue object, RubyValue name, RubyValue newValue) const
|
222
221
|
{
|
223
222
|
checkThread();
|
224
223
|
|
@@ -231,7 +230,7 @@ RubyValue MetaObject::setProperty(RubyValue object, RubyValue name, RubyValue ne
|
|
231
230
|
});
|
232
231
|
}
|
233
232
|
|
234
|
-
auto qobj = wrapperRubyClass<
|
233
|
+
auto qobj = wrapperRubyClass<Ext_Pointer>().unwrap(object)->fetchQObject();
|
235
234
|
auto variant = newValue.to<QVariant>();
|
236
235
|
QVariant result;
|
237
236
|
withoutGvl([&] {
|
@@ -241,7 +240,7 @@ RubyValue MetaObject::setProperty(RubyValue object, RubyValue name, RubyValue ne
|
|
241
240
|
return RubyValue::from(result);
|
242
241
|
}
|
243
242
|
|
244
|
-
RubyValue
|
243
|
+
RubyValue Ext_MetaObject::notifySignal(RubyValue name) const
|
245
244
|
{
|
246
245
|
auto metaProperty = mMetaObject->property(findProperty(name));
|
247
246
|
auto signal = metaProperty.notifySignal();
|
@@ -253,14 +252,14 @@ RubyValue MetaObject::notifySignal(RubyValue name) const
|
|
253
252
|
}
|
254
253
|
}
|
255
254
|
|
256
|
-
void
|
255
|
+
void Ext_MetaObject::checkThread() const
|
257
256
|
{
|
258
257
|
if (rb_thread_current() != rb_thread_main()) {
|
259
258
|
fail("QML::InvalidThreadError", "Qt object accessed from non-main thread");
|
260
259
|
}
|
261
260
|
}
|
262
261
|
|
263
|
-
QList<int>
|
262
|
+
QList<int> Ext_MetaObject::findMethods(RubyValue name) const
|
264
263
|
{
|
265
264
|
auto id = name.toID();
|
266
265
|
auto methodIndexes = mMethodHash.values(id);
|
@@ -275,7 +274,7 @@ QList<int> MetaObject::findMethods(RubyValue name) const
|
|
275
274
|
return methodIndexes;
|
276
275
|
}
|
277
276
|
|
278
|
-
int
|
277
|
+
int Ext_MetaObject::findProperty(RubyValue name) const
|
279
278
|
{
|
280
279
|
auto id = name.toID();
|
281
280
|
if (!mPropertyHash.contains(id)) {
|
@@ -288,7 +287,7 @@ int MetaObject::findProperty(RubyValue name) const
|
|
288
287
|
return mPropertyHash[id];
|
289
288
|
}
|
290
289
|
|
291
|
-
RubyValue
|
290
|
+
RubyValue Ext_MetaObject::enumerators() const
|
292
291
|
{
|
293
292
|
QHash<QByteArray, QHash<QByteArray, int>> enums;
|
294
293
|
|
@@ -308,7 +307,7 @@ RubyValue MetaObject::enumerators() const
|
|
308
307
|
return RubyValue::from(enums);
|
309
308
|
}
|
310
309
|
|
311
|
-
RubyValue
|
310
|
+
RubyValue Ext_MetaObject::superClass() const
|
312
311
|
{
|
313
312
|
auto superclass = mMetaObject->superClass();
|
314
313
|
if (!superclass) {
|
@@ -317,17 +316,17 @@ RubyValue MetaObject::superClass() const
|
|
317
316
|
return fromMetaObject(superclass);
|
318
317
|
}
|
319
318
|
|
320
|
-
RubyValue
|
319
|
+
RubyValue Ext_MetaObject::isEqual(RubyValue other) const
|
321
320
|
{
|
322
|
-
return RubyValue::from(mMetaObject == wrapperRubyClass<
|
321
|
+
return RubyValue::from(mMetaObject == wrapperRubyClass<Ext_MetaObject>().unwrap(other)->mMetaObject);
|
323
322
|
}
|
324
323
|
|
325
|
-
RubyValue
|
324
|
+
RubyValue Ext_MetaObject::hash() const
|
326
325
|
{
|
327
326
|
return RubyValue::from(reinterpret_cast<size_t>(mMetaObject)).send("hash");
|
328
327
|
}
|
329
328
|
|
330
|
-
void
|
329
|
+
void Ext_MetaObject::setMetaObject(const QMetaObject *metaObject)
|
331
330
|
{
|
332
331
|
int methodCount = metaObject->methodCount() - metaObject->methodOffset();
|
333
332
|
|
@@ -370,43 +369,42 @@ void MetaObject::setMetaObject(const QMetaObject *metaObject)
|
|
370
369
|
mPropertyHash = propertyHash;
|
371
370
|
}
|
372
371
|
|
373
|
-
RubyValue
|
372
|
+
RubyValue Ext_MetaObject::fromMetaObject(const QMetaObject *metaObject)
|
374
373
|
{
|
375
|
-
auto klass = wrapperRubyClass<
|
374
|
+
auto klass = wrapperRubyClass<Ext_MetaObject>();
|
376
375
|
auto value = klass.newInstance();
|
377
376
|
klass.unwrap(value)->setMetaObject(metaObject);
|
378
377
|
return value;
|
379
378
|
}
|
380
379
|
|
381
|
-
void
|
380
|
+
void Ext_MetaObject::defineClass()
|
382
381
|
{
|
383
|
-
WrapperRubyClass<
|
382
|
+
WrapperRubyClass<Ext_MetaObject> klass(RubyModule::fromPath("QML"), "MetaObject");
|
384
383
|
|
385
|
-
klass.defineMethod("name", RUBYQML_MEMBER_FUNCTION_INFO(&
|
384
|
+
klass.defineMethod("name", RUBYQML_MEMBER_FUNCTION_INFO(&Ext_MetaObject::className));
|
386
385
|
|
387
|
-
klass.defineMethod("method_names", RUBYQML_MEMBER_FUNCTION_INFO(&
|
388
|
-
klass.defineMethod("public?", RUBYQML_MEMBER_FUNCTION_INFO(&
|
389
|
-
klass.defineMethod("protected?", RUBYQML_MEMBER_FUNCTION_INFO(&
|
390
|
-
klass.defineMethod("private?", RUBYQML_MEMBER_FUNCTION_INFO(&
|
391
|
-
klass.defineMethod("signal?", RUBYQML_MEMBER_FUNCTION_INFO(&
|
386
|
+
klass.defineMethod("method_names", RUBYQML_MEMBER_FUNCTION_INFO(&Ext_MetaObject::methodNames));
|
387
|
+
klass.defineMethod("public?", RUBYQML_MEMBER_FUNCTION_INFO(&Ext_MetaObject::isPublic));
|
388
|
+
klass.defineMethod("protected?", RUBYQML_MEMBER_FUNCTION_INFO(&Ext_MetaObject::isProtected));
|
389
|
+
klass.defineMethod("private?", RUBYQML_MEMBER_FUNCTION_INFO(&Ext_MetaObject::isPrivate));
|
390
|
+
klass.defineMethod("signal?", RUBYQML_MEMBER_FUNCTION_INFO(&Ext_MetaObject::isSignal));
|
392
391
|
|
393
|
-
klass.defineMethod("invoke_method", RUBYQML_MEMBER_FUNCTION_INFO(&
|
394
|
-
klass.defineMethod("connect_signal", RUBYQML_MEMBER_FUNCTION_INFO(&
|
392
|
+
klass.defineMethod("invoke_method", RUBYQML_MEMBER_FUNCTION_INFO(&Ext_MetaObject::invokeMethod));
|
393
|
+
klass.defineMethod("connect_signal", RUBYQML_MEMBER_FUNCTION_INFO(&Ext_MetaObject::connectSignal));
|
395
394
|
|
396
|
-
klass.defineMethod("property_names", RUBYQML_MEMBER_FUNCTION_INFO(&
|
397
|
-
klass.defineMethod("get_property", RUBYQML_MEMBER_FUNCTION_INFO(&
|
398
|
-
klass.defineMethod("set_property", RUBYQML_MEMBER_FUNCTION_INFO(&
|
399
|
-
klass.defineMethod("notify_signal", RUBYQML_MEMBER_FUNCTION_INFO(&
|
395
|
+
klass.defineMethod("property_names", RUBYQML_MEMBER_FUNCTION_INFO(&Ext_MetaObject::propertyNames));
|
396
|
+
klass.defineMethod("get_property", RUBYQML_MEMBER_FUNCTION_INFO(&Ext_MetaObject::getProperty));
|
397
|
+
klass.defineMethod("set_property", RUBYQML_MEMBER_FUNCTION_INFO(&Ext_MetaObject::setProperty));
|
398
|
+
klass.defineMethod("notify_signal", RUBYQML_MEMBER_FUNCTION_INFO(&Ext_MetaObject::notifySignal));
|
400
399
|
|
401
|
-
klass.defineMethod("enumerators", RUBYQML_MEMBER_FUNCTION_INFO(&
|
400
|
+
klass.defineMethod("enumerators", RUBYQML_MEMBER_FUNCTION_INFO(&Ext_MetaObject::enumerators));
|
402
401
|
|
403
|
-
klass.defineMethod("super_class", RUBYQML_MEMBER_FUNCTION_INFO(&
|
402
|
+
klass.defineMethod("super_class", RUBYQML_MEMBER_FUNCTION_INFO(&Ext_MetaObject::superClass));
|
404
403
|
|
405
|
-
klass.defineMethod("==", RUBYQML_MEMBER_FUNCTION_INFO(&
|
406
|
-
klass.defineMethod("hash", RUBYQML_MEMBER_FUNCTION_INFO(&
|
404
|
+
klass.defineMethod("==", RUBYQML_MEMBER_FUNCTION_INFO(&Ext_MetaObject::isEqual));
|
405
|
+
klass.defineMethod("hash", RUBYQML_MEMBER_FUNCTION_INFO(&Ext_MetaObject::hash));
|
407
406
|
|
408
407
|
klass.aliasMethod("eql?", "==");
|
409
408
|
}
|
410
409
|
|
411
|
-
} // namespace Ext
|
412
410
|
} // namespace RubyQml
|