qml 0.0.7 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. checksums.yaml +4 -4
  2. data/.gitmodules +3 -0
  3. data/.travis.yml +5 -9
  4. data/LICENSE.txt +1 -1
  5. data/README.md +84 -114
  6. data/changes.md +5 -0
  7. data/examples/fizzbuzz/fizzbuzz.rb +3 -4
  8. data/examples/todo_array/todo_array.rb +4 -4
  9. data/examples/todo_sequel/todo_sequel.rb +7 -7
  10. data/examples/twitter/twitter.rb +5 -3
  11. data/ext/qml/application.c +88 -0
  12. data/ext/qml/application.h +9 -0
  13. data/ext/qml/component.c +89 -0
  14. data/ext/qml/component.h +10 -0
  15. data/ext/qml/conversion.c +60 -0
  16. data/ext/qml/conversion.h +8 -0
  17. data/ext/qml/dispatcher.c +31 -0
  18. data/ext/qml/dispatcher.h +7 -0
  19. data/ext/qml/engine.c +135 -0
  20. data/ext/qml/engine.h +10 -0
  21. data/ext/qml/exporter.c +93 -0
  22. data/ext/qml/exporter.h +7 -0
  23. data/ext/qml/extconf.rb +38 -97
  24. data/ext/qml/interface.c +156 -0
  25. data/ext/qml/interface.h +11 -0
  26. data/ext/qml/js_array.c +47 -0
  27. data/ext/qml/js_array.h +7 -0
  28. data/ext/qml/js_function.c +109 -0
  29. data/ext/qml/js_function.h +7 -0
  30. data/ext/qml/js_object.c +284 -0
  31. data/ext/qml/js_object.h +19 -0
  32. data/ext/qml/js_wrapper.c +19 -0
  33. data/ext/qml/js_wrapper.h +7 -0
  34. data/ext/qml/lib/libqmlbind/.gitignore +38 -0
  35. data/ext/qml/lib/libqmlbind/.gitmodules +3 -0
  36. data/ext/qml/lib/libqmlbind/.travis.yml +14 -0
  37. data/ext/qml/lib/libqmlbind/LICENSE.txt +22 -0
  38. data/ext/qml/lib/libqmlbind/libqmlbind.pro +3 -0
  39. data/ext/qml/lib/libqmlbind/qmlbind/include/qmlbind.h +14 -0
  40. data/ext/qml/lib/libqmlbind/qmlbind/include/qmlbind/application.h +18 -0
  41. data/ext/qml/lib/libqmlbind/qmlbind/include/qmlbind/component.h +21 -0
  42. data/ext/qml/lib/libqmlbind/qmlbind/include/qmlbind/engine.h +34 -0
  43. data/ext/qml/lib/libqmlbind/qmlbind/include/qmlbind/exporter.h +37 -0
  44. data/ext/qml/lib/libqmlbind/qmlbind/include/qmlbind/interface.h +16 -0
  45. data/ext/qml/lib/libqmlbind/qmlbind/include/qmlbind/iterator.h +19 -0
  46. data/ext/qml/lib/libqmlbind/qmlbind/include/qmlbind/metaobject.h +13 -0
  47. data/ext/qml/lib/libqmlbind/qmlbind/include/qmlbind/plugin.h +17 -0
  48. data/ext/qml/lib/libqmlbind/qmlbind/include/qmlbind/qmlbind_global.h +78 -0
  49. data/ext/qml/lib/libqmlbind/qmlbind/include/qmlbind/register.h +17 -0
  50. data/ext/qml/lib/libqmlbind/qmlbind/include/qmlbind/signal_emitter.h +15 -0
  51. data/ext/qml/lib/libqmlbind/qmlbind/include/qmlbind/string.h +15 -0
  52. data/ext/qml/lib/libqmlbind/qmlbind/include/qmlbind/value.h +100 -0
  53. data/ext/qml/lib/libqmlbind/qmlbind/qmlbind.pro +62 -0
  54. data/ext/qml/lib/libqmlbind/qmlbind/src/api_application.cpp +103 -0
  55. data/ext/qml/lib/libqmlbind/qmlbind/src/api_component.cpp +54 -0
  56. data/ext/qml/lib/libqmlbind/qmlbind/src/api_engine.cpp +65 -0
  57. data/ext/qml/lib/libqmlbind/qmlbind/src/api_exporter.cpp +52 -0
  58. data/ext/qml/lib/libqmlbind/qmlbind/src/api_interface.cpp +19 -0
  59. data/ext/qml/lib/libqmlbind/qmlbind/src/api_iterator.cpp +32 -0
  60. data/ext/qml/lib/libqmlbind/qmlbind/src/api_metaobject.cpp +19 -0
  61. data/ext/qml/lib/libqmlbind/qmlbind/src/api_plugin.cpp +27 -0
  62. data/ext/qml/lib/libqmlbind/qmlbind/src/api_register.cpp +17 -0
  63. data/ext/qml/lib/libqmlbind/qmlbind/src/api_signal_emitter.cpp +27 -0
  64. data/ext/qml/lib/libqmlbind/qmlbind/src/api_string.cpp +22 -0
  65. data/ext/qml/lib/libqmlbind/qmlbind/src/api_value.cpp +215 -0
  66. data/ext/qml/lib/libqmlbind/qmlbind/src/backref.cpp +54 -0
  67. data/ext/qml/lib/libqmlbind/qmlbind/src/backref.h +29 -0
  68. data/ext/qml/lib/libqmlbind/qmlbind/src/engine.cpp +32 -0
  69. data/ext/qml/lib/libqmlbind/qmlbind/src/engine.h +27 -0
  70. data/ext/qml/lib/libqmlbind/qmlbind/src/exporter.cpp +73 -0
  71. data/ext/qml/lib/libqmlbind/qmlbind/src/exporter.h +46 -0
  72. data/ext/qml/lib/libqmlbind/qmlbind/src/interface.cpp +75 -0
  73. data/ext/qml/lib/libqmlbind/qmlbind/src/interface.h +37 -0
  74. data/ext/qml/lib/libqmlbind/qmlbind/src/metaobject.cpp +101 -0
  75. data/ext/qml/lib/libqmlbind/qmlbind/src/metaobject.h +29 -0
  76. data/ext/qml/lib/libqmlbind/qmlbind/src/signalemitter.cpp +33 -0
  77. data/ext/qml/lib/libqmlbind/qmlbind/src/signalemitter.h +25 -0
  78. data/ext/qml/lib/libqmlbind/qmlbind/src/ticktimer.cpp +15 -0
  79. data/ext/qml/lib/libqmlbind/qmlbind/src/ticktimer.h +19 -0
  80. data/ext/qml/lib/libqmlbind/qmlbind/src/typeregisterer.cpp +112 -0
  81. data/ext/qml/lib/libqmlbind/qmlbind/src/typeregisterer.h +28 -0
  82. data/ext/qml/lib/libqmlbind/qmlbind/src/util.h +13 -0
  83. data/ext/qml/lib/libqmlbind/qmlbind/src/wrapper.cpp +23 -0
  84. data/ext/qml/lib/libqmlbind/qmlbind/src/wrapper.h +29 -0
  85. data/ext/qml/lib/libqmlbind/readme.md +14 -0
  86. data/ext/qml/lib/libqmlbind/test/api.c +1 -0
  87. data/ext/qml/lib/libqmlbind/test/application_test.cpp +16 -0
  88. data/ext/qml/lib/libqmlbind/test/component_test.cpp +57 -0
  89. data/ext/qml/lib/libqmlbind/test/engine_test.cpp +94 -0
  90. data/ext/qml/lib/libqmlbind/test/exporter_test.cpp +312 -0
  91. data/ext/qml/lib/libqmlbind/test/fixtures/emptyhandlers.cpp +36 -0
  92. data/ext/qml/lib/libqmlbind/test/fixtures/emptyhandlers.h +6 -0
  93. data/ext/qml/lib/libqmlbind/test/fixtures/test.qml +5 -0
  94. data/ext/qml/lib/libqmlbind/test/fixtures/testmodule/qmldir +2 -0
  95. data/ext/qml/lib/libqmlbind/test/fixtures/testmodule/test.qml +5 -0
  96. data/ext/qml/lib/libqmlbind/test/iterator_test.cpp +37 -0
  97. data/ext/qml/lib/libqmlbind/test/main.cpp +11 -0
  98. data/ext/qml/lib/libqmlbind/test/plugin_test.cpp +41 -0
  99. data/ext/qml/lib/libqmlbind/test/test.pro +26 -0
  100. data/ext/qml/lib/libqmlbind/test/test_helper.h +20 -0
  101. data/ext/qml/lib/libqmlbind/test/value_test.cpp +252 -0
  102. data/ext/qml/lib/libqmlbind/testplugin/testplugin.cpp +11 -0
  103. data/ext/qml/lib/libqmlbind/testplugin/testplugin.h +21 -0
  104. data/ext/qml/lib/libqmlbind/testplugin/testplugin.json +3 -0
  105. data/ext/qml/lib/libqmlbind/testplugin/testplugin.pro +21 -0
  106. data/ext/qml/meta_object.c +81 -0
  107. data/ext/qml/meta_object.h +8 -0
  108. data/ext/qml/plugin_loader.c +71 -0
  109. data/ext/qml/plugin_loader.h +7 -0
  110. data/ext/qml/qml.c +95 -0
  111. data/ext/qml/qml.h +10 -0
  112. data/ext/qml/rubyqml-plugin/listmodel.cpp +102 -0
  113. data/ext/qml/rubyqml-plugin/listmodel.h +37 -0
  114. data/ext/qml/rubyqml-plugin/rubyqml-plugin.pro +19 -0
  115. data/ext/qml/rubyqml-plugin/rubyqmlplugin.cpp +25 -0
  116. data/ext/qml/rubyqml-plugin/rubyqmlplugin.h +19 -0
  117. data/ext/qml/signal_emitter.c +71 -0
  118. data/ext/qml/signal_emitter.h +9 -0
  119. data/lib/qml.rb +11 -10
  120. data/lib/qml/access.rb +64 -86
  121. data/lib/qml/application.rb +20 -71
  122. data/lib/qml/component.rb +41 -33
  123. data/lib/qml/core_ext.rb +1 -0
  124. data/lib/qml/core_ext/to_qml.rb +70 -0
  125. data/lib/qml/data.rb +1 -0
  126. data/lib/qml/data/array_model.rb +99 -101
  127. data/lib/qml/data/list_model.rb +107 -131
  128. data/lib/qml/data/list_model_access.rb +44 -0
  129. data/lib/qml/data/query_model.rb +45 -47
  130. data/lib/qml/dispatcher.rb +5 -13
  131. data/lib/qml/engine.rb +9 -58
  132. data/lib/qml/errors.rb +0 -21
  133. data/lib/qml/interface.rb +21 -0
  134. data/lib/qml/js_array.rb +8 -0
  135. data/lib/qml/js_object.rb +69 -0
  136. data/lib/qml/js_util.rb +18 -0
  137. data/lib/qml/plugin_loader.rb +1 -13
  138. data/lib/qml/plugins.rb +3 -17
  139. data/lib/qml/proc_access.rb +28 -0
  140. data/lib/qml/qt.rb +21 -3
  141. data/lib/qml/reactive.rb +147 -8
  142. data/lib/qml/signal.rb +67 -0
  143. data/lib/qml/version.rb +1 -1
  144. data/qml.gemspec +8 -2
  145. data/spec/qml/access_spec.rb +33 -120
  146. data/spec/qml/application_spec.rb +11 -24
  147. data/spec/qml/component_spec.rb +4 -4
  148. data/spec/qml/data/array_model_spec.rb +2 -2
  149. data/spec/qml/data/list_model_spec.rb +2 -2
  150. data/spec/qml/data/query_model_spec.rb +4 -4
  151. data/spec/qml/engine_spec.rb +23 -21
  152. data/spec/qml/interface_spec.rb +20 -0
  153. data/spec/qml/js_array_spec.rb +29 -0
  154. data/spec/qml/js_function_spec.rb +32 -0
  155. data/spec/qml/js_object_spec.rb +113 -0
  156. data/spec/qml/plugin_loader_spec.rb +9 -11
  157. data/spec/qml/qt_spec.rb +9 -0
  158. data/spec/qml/reactive_spec.rb +37 -0
  159. data/spec/qml/signal_connect_spec.rb +27 -0
  160. data/spec/qml/signal_spec.rb +73 -0
  161. data/spec/qml/to_qml_spec.rb +76 -0
  162. data/spec/shared/qml/access_example.rb +21 -0
  163. data/spec/shared/qml/data/list_model.rb +12 -13
  164. data/spec/spec_helper.rb +2 -3
  165. metadata +141 -166
  166. data/examples/imageprovider/imageprovider.rb +0 -57
  167. data/examples/imageprovider/main.qml +0 -51
  168. data/ext/qml/accessclass.cpp +0 -65
  169. data/ext/qml/accessclass.h +0 -19
  170. data/ext/qml/accessobject.cpp +0 -30
  171. data/ext/qml/accessobject.h +0 -22
  172. data/ext/qml/common.h +0 -18
  173. data/ext/qml/conversionerror.h +0 -14
  174. data/ext/qml/ext_accesswrapperfactory.cpp +0 -75
  175. data/ext/qml/ext_accesswrapperfactory.h +0 -39
  176. data/ext/qml/ext_anywrapper.cpp +0 -34
  177. data/ext/qml/ext_anywrapper.h +0 -23
  178. data/ext/qml/ext_kernel.cpp +0 -81
  179. data/ext/qml/ext_kernel.h +0 -9
  180. data/ext/qml/ext_metaobject.cpp +0 -399
  181. data/ext/qml/ext_metaobject.h +0 -60
  182. data/ext/qml/ext_pluginloader.cpp +0 -53
  183. data/ext/qml/ext_pluginloader.h +0 -30
  184. data/ext/qml/ext_pointer.cpp +0 -132
  185. data/ext/qml/ext_pointer.h +0 -41
  186. data/ext/qml/ext_testutil.cpp +0 -40
  187. data/ext/qml/ext_testutil.h +0 -9
  188. data/ext/qml/foreignclass.cpp +0 -72
  189. data/ext/qml/foreignclass.h +0 -88
  190. data/ext/qml/foreignmetaobject.cpp +0 -345
  191. data/ext/qml/foreignmetaobject.h +0 -46
  192. data/ext/qml/foreignobject.cpp +0 -22
  193. data/ext/qml/foreignobject.h +0 -21
  194. data/ext/qml/functioninfo.h +0 -16
  195. data/ext/qml/init.cpp +0 -67
  196. data/ext/qml/kernel.cpp +0 -39
  197. data/ext/qml/kernel.h +0 -32
  198. data/ext/qml/listmodel.cpp +0 -137
  199. data/ext/qml/listmodel.h +0 -45
  200. data/ext/qml/markable.h +0 -12
  201. data/ext/qml/objectdata.cpp +0 -26
  202. data/ext/qml/objectdata.h +0 -20
  203. data/ext/qml/objectgc.cpp +0 -69
  204. data/ext/qml/objectgc.h +0 -28
  205. data/ext/qml/plugins/core/applicationextension.cpp +0 -29
  206. data/ext/qml/plugins/core/applicationextension.h +0 -25
  207. data/ext/qml/plugins/core/componentextension.cpp +0 -41
  208. data/ext/qml/plugins/core/componentextension.h +0 -28
  209. data/ext/qml/plugins/core/contextextension.cpp +0 -39
  210. data/ext/qml/plugins/core/contextextension.h +0 -29
  211. data/ext/qml/plugins/core/core.pro +0 -29
  212. data/ext/qml/plugins/core/coreplugin.cpp +0 -87
  213. data/ext/qml/plugins/core/coreplugin.h +0 -49
  214. data/ext/qml/plugins/core/engineextension.cpp +0 -43
  215. data/ext/qml/plugins/core/engineextension.h +0 -31
  216. data/ext/qml/plugins/core/imageprovider.cpp +0 -38
  217. data/ext/qml/plugins/core/imageprovider.h +0 -18
  218. data/ext/qml/plugins/core/imagerequestpromise.cpp +0 -19
  219. data/ext/qml/plugins/core/imagerequestpromise.h +0 -21
  220. data/ext/qml/plugins/core/qmlexception.cpp +0 -11
  221. data/ext/qml/plugins/core/qmlexception.h +0 -17
  222. data/ext/qml/plugins/testutil/imageprovidertest.cpp +0 -40
  223. data/ext/qml/plugins/testutil/imageprovidertest.h +0 -17
  224. data/ext/qml/plugins/testutil/objectlifechecker.cpp +0 -17
  225. data/ext/qml/plugins/testutil/objectlifechecker.h +0 -24
  226. data/ext/qml/plugins/testutil/ownershiptest.cpp +0 -26
  227. data/ext/qml/plugins/testutil/ownershiptest.h +0 -30
  228. data/ext/qml/plugins/testutil/testobject.cpp +0 -6
  229. data/ext/qml/plugins/testutil/testobject.h +0 -108
  230. data/ext/qml/plugins/testutil/testobjectsubclass.cpp +0 -10
  231. data/ext/qml/plugins/testutil/testobjectsubclass.h +0 -19
  232. data/ext/qml/plugins/testutil/testutil.pro +0 -22
  233. data/ext/qml/plugins/testutil/testutilplugin.cpp +0 -55
  234. data/ext/qml/plugins/testutil/testutilplugin.h +0 -36
  235. data/ext/qml/qmltyperegisterer.cpp +0 -74
  236. data/ext/qml/qmltyperegisterer.h +0 -30
  237. data/ext/qml/rubyclass.cpp +0 -82
  238. data/ext/qml/rubyclass.h +0 -230
  239. data/ext/qml/rubyvalue.cpp +0 -656
  240. data/ext/qml/rubyvalue.h +0 -224
  241. data/ext/qml/signalforwarder.cpp +0 -64
  242. data/ext/qml/signalforwarder.h +0 -29
  243. data/ext/qml/util.cpp +0 -112
  244. data/ext/qml/util.h +0 -82
  245. data/ext/qml/valuereference.cpp +0 -50
  246. data/ext/qml/valuereference.h +0 -22
  247. data/ext/qml/weakvaluereference.cpp +0 -51
  248. data/ext/qml/weakvaluereference.h +0 -21
  249. data/lib/qml/context.rb +0 -71
  250. data/lib/qml/data/error.rb +0 -5
  251. data/lib/qml/dispatchable.rb +0 -34
  252. data/lib/qml/error_converter.rb +0 -16
  253. data/lib/qml/geometry.rb +0 -3
  254. data/lib/qml/geometry/point.rb +0 -5
  255. data/lib/qml/geometry/rectangle.rb +0 -5
  256. data/lib/qml/geometry/size.rb +0 -5
  257. data/lib/qml/image_provider.rb +0 -87
  258. data/lib/qml/init.rb +0 -29
  259. data/lib/qml/meta_object.rb +0 -20
  260. data/lib/qml/models.rb +0 -1
  261. data/lib/qml/qt_classes.rb +0 -9
  262. data/lib/qml/qt_object_base.rb +0 -233
  263. data/lib/qml/reactive/bindable.rb +0 -79
  264. data/lib/qml/reactive/chained_signal.rb +0 -25
  265. data/lib/qml/reactive/error.rb +0 -5
  266. data/lib/qml/reactive/object.rb +0 -293
  267. data/lib/qml/reactive/property.rb +0 -19
  268. data/lib/qml/reactive/signal.rb +0 -115
  269. data/lib/qml/reactive/signal_spy.rb +0 -27
  270. data/lib/qml/reactive/signals/map_signal.rb +0 -21
  271. data/lib/qml/reactive/signals/merge_signal.rb +0 -21
  272. data/lib/qml/reactive/signals/select_signal.rb +0 -21
  273. data/lib/qml/reactive/simple_property.rb +0 -17
  274. data/lib/qml/reactive/unbound_property.rb +0 -42
  275. data/lib/qml/reactive/unbound_signal.rb +0 -51
  276. data/lib/qml/test_util.rb +0 -1
  277. data/lib/qml/test_util/object_life_checker.rb +0 -17
  278. data/lib/qml/wrappable.rb +0 -9
  279. data/spec/qml/context_spec.rb +0 -43
  280. data/spec/qml/conversion_spec.rb +0 -60
  281. data/spec/qml/dispatchable_spec.rb +0 -26
  282. data/spec/qml/dispatcher_spec.rb +0 -71
  283. data/spec/qml/geometry/point_spec.rb +0 -4
  284. data/spec/qml/geometry/rectangle_spec.rb +0 -4
  285. data/spec/qml/geometry/size_spec.rb +0 -4
  286. data/spec/qml/image_provider_spec.rb +0 -33
  287. data/spec/qml/qt_object_base_spec.rb +0 -119
  288. data/spec/qml/reactive/object_spec.rb +0 -249
  289. data/spec/qml/reactive/property_spec.rb +0 -70
  290. data/spec/qml/reactive/signal_spec.rb +0 -191
  291. data/spec/qml/reactive/signal_spy_spec.rb +0 -26
  292. data/spec/qml/reactive/unbound_property_spec.rb +0 -40
  293. data/spec/qml/reactive/unbound_signal_spec.rb +0 -70
  294. data/spec/qml/test_object_spec.rb +0 -186
  295. data/spec/qml/wrappable_spec.rb +0 -10
  296. data/spec/shared/qml/reactive/object.rb +0 -39
@@ -1,57 +0,0 @@
1
- $LOAD_PATH.unshift File.expand_path('../../../lib', __FILE__)
2
- require 'qml'
3
- require 'open-uri'
4
- require 'singleton'
5
- require 'celluloid'
6
-
7
- module Examples
8
- module ImageProvider
9
-
10
- VERSION = '0.1.0'
11
-
12
- class ImageFetcher
13
- include Celluloid
14
- include Singleton
15
-
16
- def set_url(url)
17
- @url = url
18
- end
19
-
20
- def fetch(request)
21
- image =
22
- case request.id
23
- when "image"
24
- open(@url, 'rb') { |f| f.read } rescue nil
25
- end
26
- request.finish(image || "")
27
- end
28
- end
29
-
30
- class Controller
31
- include QML::Access
32
-
33
- property :url, ''
34
-
35
- on_changed :url do
36
- ImageFetcher.instance.async.set_url url
37
- end
38
-
39
- register_to_qml
40
- end
41
-
42
- class Provider < QML::ImageProvider
43
-
44
- def request(req)
45
- case req.id
46
- when 'image'
47
- ImageFetcher.instance.fetch(req)
48
- end
49
- end
50
- end
51
- end
52
- end
53
-
54
- QML.run do |app|
55
- app.engine.add_image_provider 'example', Examples::ImageProvider::Provider.new
56
- app.load_path Pathname(__FILE__) + '../main.qml'
57
- end
@@ -1,51 +0,0 @@
1
- import QtQuick 2.2
2
- import QtQuick.Controls 1.1
3
- import QtQuick.Layouts 1.1
4
- import Examples.ImageProvider 0.1
5
-
6
- ApplicationWindow {
7
- visible: true
8
- width: 200
9
- height: 200
10
-
11
- GridLayout {
12
- anchors.fill: parent
13
- anchors.margins: 10
14
- columns: 1
15
-
16
- Image {
17
- id: image
18
- source: 'image://example/image'
19
- asynchronous: true
20
- cache: false
21
- fillMode: Image.Pad
22
- Layout.fillHeight: true
23
-
24
- function reload() {
25
- source = ''
26
- source = 'image://example/image'
27
- }
28
- }
29
-
30
- GridLayout {
31
- columns: 2
32
-
33
- Label {
34
- text: 'Image URL'
35
- }
36
-
37
- TextField {
38
- id: textField
39
- Layout.fillWidth: true
40
- onEditingFinished: {
41
- image.reload()
42
- }
43
- }
44
- }
45
- }
46
-
47
- Controller {
48
- id: provider
49
- url: textField.text
50
- }
51
- }
@@ -1,65 +0,0 @@
1
- #include "accessclass.h"
2
- #include "accessobject.h"
3
- #include "util.h"
4
- #include <QDebug>
5
-
6
- namespace RubyQml {
7
-
8
- AccessClass::AccessClass(RubyValue className, RubyValue methodInfos, RubyValue signalInfos, RubyValue propertyInfos)
9
- {
10
- setClassName(className.to<QByteArray>());
11
- rb_check_array_type(methodInfos);
12
- rb_check_array_type(signalInfos);
13
- rb_check_array_type(propertyInfos);
14
- for (int i = 0; i < RARRAY_LEN(VALUE(methodInfos)); ++i) {
15
- RubyValue info = RARRAY_AREF(VALUE(methodInfos), i);
16
- auto nameSym = info.send("name");
17
- addMethod(nameSym.to<QByteArray>(),
18
- nameSym.toID(),
19
- info.send("params").to<QList<QByteArray>>());
20
- }
21
- for (int i = 0; i < RARRAY_LEN(VALUE(signalInfos)); ++i) {
22
- RubyValue info = RARRAY_AREF(VALUE(signalInfos), i);
23
- auto nameSym = info.send("name");
24
- addSignal(nameSym.to<QByteArray>(),
25
- nameSym.toID(),
26
- info.send("params").to<QList<QByteArray>>());
27
- }
28
- for (int i = 0; i < RARRAY_LEN(VALUE(propertyInfos)); ++i) {
29
- RubyValue info = RARRAY_AREF(VALUE(propertyInfos), i);
30
- addProperty(info.send("name").to<QByteArray>(),
31
- info.send("getter").toID(),
32
- info.send("setter").toID(),
33
- Property::Flag::Readable | Property::Flag::Writable,
34
- true,
35
- info.send("notifier").toID());
36
- }
37
- }
38
-
39
- QVariant AccessClass::callMethod(ForeignObject *obj, size_t id, const QVariantList &args)
40
- {
41
- auto self = static_cast<AccessWrapper *>(obj)->wrappedValue();
42
- QVariant ret;
43
- withGvl([&] {
44
- std::vector<VALUE> values(args.size());
45
- std::transform(args.begin(), args.end(), values.begin(), &RubyValue::from<QVariant>);
46
- RubyValue retValue;
47
- rescueNotify([&] {
48
- retValue = rb_funcall2(self, id, values.size(), values.data());
49
- });
50
- ret = retValue.to<QVariant>();
51
- });
52
- return ret;
53
- }
54
-
55
- void AccessClass::setProperty(ForeignObject *obj, size_t id, const QVariant &variant)
56
- {
57
- callMethod(obj, id, {variant});
58
- }
59
-
60
- QVariant AccessClass::getProperty(ForeignObject *obj, size_t id)
61
- {
62
- return callMethod(obj, id, {});
63
- }
64
-
65
- } // namespace RubyQml
@@ -1,19 +0,0 @@
1
- #pragma once
2
- #include "foreignclass.h"
3
- #include "rubyvalue.h"
4
-
5
- namespace RubyQml {
6
-
7
- class AccessWrapper;
8
-
9
- class AccessClass : public ForeignClass
10
- {
11
- public:
12
- AccessClass(RubyValue className, RubyValue methodInfos, RubyValue signalInfos, RubyValue propertyInfos);
13
-
14
- QVariant callMethod(ForeignObject *obj, size_t id, const QVariantList &args) override;
15
- void setProperty(ForeignObject *obj, size_t id, const QVariant &value) override;
16
- QVariant getProperty(ForeignObject *obj, size_t id) override;
17
- };
18
-
19
- } // namespace RubyQml
@@ -1,30 +0,0 @@
1
- #include "accessobject.h"
2
- #include "util.h"
3
- #include "rubyclass.h"
4
- #include <QSet>
5
-
6
- namespace RubyQml {
7
-
8
- AccessWrapper::AccessWrapper(const SP<ForeignMetaObject> &metaobj, RubyValue value) :
9
- ForeignObject(metaobj),
10
- mWrapped(value)
11
- {
12
- if (!value.isKindOf(RubyModule::fromPath("QML::Access"))) {
13
- std::logic_error("wrapping non QML::Access object");
14
- }
15
- value.send("access_wrappers").send("push", RubyValue::fromQObject(this, false));
16
- }
17
-
18
- AccessWrapper::~AccessWrapper()
19
- {
20
- if (mWrapped.hasValue()) {
21
- mWrapped.value().send("access_wrappers").send("delete", RubyValue::fromQObject(this, false));
22
- }
23
- }
24
-
25
- void AccessWrapper::gc_mark()
26
- {
27
- rb_gc_mark(mWrapped.value());
28
- }
29
-
30
- } // namespace RubyQml
@@ -1,22 +0,0 @@
1
- #pragma once
2
- #include "weakvaluereference.h"
3
- #include "foreignobject.h"
4
- #include "markable.h"
5
-
6
- namespace RubyQml {
7
-
8
- class AccessWrapper : public ForeignObject, public Markable
9
- {
10
- public:
11
- AccessWrapper(const SP<ForeignMetaObject> &metaobj, RubyValue wrappedValue);
12
- ~AccessWrapper();
13
-
14
- RubyValue wrappedValue() { return mWrapped.value(); }
15
- void gc_mark() override;
16
-
17
- private:
18
- WeakValueReference mWrapped;
19
- };
20
-
21
- } // namespace RubyQml
22
-
@@ -1,18 +0,0 @@
1
- #pragma once
2
- #include <memory>
3
-
4
- namespace RubyQml {
5
-
6
- template <typename T>
7
- using SP = std::shared_ptr<T>;
8
-
9
- template <typename T>
10
- using WP = std::weak_ptr<T>;
11
-
12
- template <typename T, typename ... Args>
13
- inline SP<T> makeSP(Args && ... args)
14
- {
15
- return std::make_shared<T>(std::forward<Args>(args)...);
16
- }
17
-
18
- } // namespace RubyQml
@@ -1,14 +0,0 @@
1
- #pragma once
2
-
3
- #include <stdexcept>
4
- #include <QString>
5
-
6
- namespace RubyQml {
7
-
8
- class ConversionError : public std::runtime_error
9
- {
10
- public:
11
- ConversionError(const QString &str) : std::runtime_error(str.toStdString()) {}
12
- };
13
-
14
- }
@@ -1,75 +0,0 @@
1
- #include "ext_accesswrapperfactory.h"
2
- #include "ext_pointer.h"
3
- #include "rubyclass.h"
4
- #include "accessclass.h"
5
- #include "accessobject.h"
6
- #include "foreignmetaobject.h"
7
- #include "qmltyperegisterer.h"
8
-
9
- namespace RubyQml {
10
-
11
- Ext_AccessWrapperFactory::Ext_AccessWrapperFactory(RubyValue self) :
12
- self(self)
13
- {
14
- }
15
-
16
- Ext_AccessWrapperFactory::~Ext_AccessWrapperFactory()
17
- {
18
- }
19
-
20
- RubyValue Ext_AccessWrapperFactory::ext_initialize(RubyValue rubyClass, RubyValue className, RubyValue methodInfos, RubyValue signalInfos, RubyValue propertyInfos)
21
- {
22
- mRubyClass = rubyClass;
23
- mAccessClass = makeSP<AccessClass>(className, methodInfos, signalInfos, propertyInfos);
24
- mMetaObject = makeSP<ForeignMetaObject>(mAccessClass);
25
- return self;
26
- }
27
-
28
- RubyValue Ext_AccessWrapperFactory::ext_emitSignal(RubyValue obj, RubyValue name, RubyValue args)
29
- {
30
- auto accessObj = wrapperRubyClass<Ext_Pointer>().unwrap(obj.send("access_object"))->fetchQObject();
31
- auto nameId = name.toID();
32
- auto argVariants = args.to<QVariantList>();
33
- withoutGvl([&] {
34
- mMetaObject->emitSignal(dynamic_cast<ForeignObject *>(accessObj), nameId, argVariants);
35
- });
36
- return Qnil;
37
- }
38
-
39
- RubyValue Ext_AccessWrapperFactory::ext_registerToQml(RubyValue path, RubyValue majorVersion, RubyValue minorVersion, RubyValue name)
40
- {
41
- using namespace std::placeholders;
42
- if (!mTypeRegisterer) {
43
- mTypeRegisterer = makeSP<QmlTypeRegisterer>(mMetaObject, std::bind(&Ext_AccessWrapperFactory::newInstanceInto, this, _1));
44
- mTypeRegisterer->registerType(path.to<QByteArray>(), majorVersion.to<int>(), minorVersion.to<int>(), name.to<QByteArray>());
45
- }
46
- return self;
47
- }
48
-
49
- RubyValue Ext_AccessWrapperFactory::ext_create(RubyValue access)
50
- {
51
- return RubyValue::fromQObject(create(access), false);
52
- }
53
-
54
- AccessWrapper *Ext_AccessWrapperFactory::create(RubyValue access)
55
- {
56
- return new AccessWrapper(mMetaObject, access);
57
- }
58
-
59
- void Ext_AccessWrapperFactory::newInstanceInto(void *where)
60
- {
61
- withGvl([&] {
62
- new(where) AccessWrapper(mMetaObject, mRubyClass.send("new"));
63
- });
64
- }
65
-
66
- void Ext_AccessWrapperFactory::defineClass()
67
- {
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));
73
- }
74
-
75
- } // namespace RubyQml
@@ -1,39 +0,0 @@
1
- #pragma once
2
- #include "common.h"
3
- #include "rubyvalue.h"
4
-
5
- namespace RubyQml {
6
-
7
- class AccessClass;
8
- class ForeignMetaObject;
9
- class QmlTypeRegisterer;
10
- class AccessWrapper;
11
-
12
- class Ext_AccessWrapperFactory
13
- {
14
- public:
15
- Ext_AccessWrapperFactory(RubyValue self);
16
- ~Ext_AccessWrapperFactory();
17
-
18
- RubyValue ext_initialize(RubyValue rubyClass, RubyValue className, RubyValue methodInfos, RubyValue signalInfos, RubyValue propertyInfos);
19
- RubyValue ext_emitSignal(RubyValue obj, RubyValue name, RubyValue args);
20
- RubyValue ext_registerToQml(RubyValue path, RubyValue majorVersion, RubyValue minorVersion, RubyValue name);
21
- RubyValue ext_create(RubyValue access);
22
-
23
- AccessWrapper *create(RubyValue access);
24
-
25
- void gc_mark() {}
26
- static void defineClass();
27
-
28
- private:
29
-
30
- void newInstanceInto(void *where);
31
-
32
- const RubyValue self;
33
- RubyValue mRubyClass;
34
- SP<AccessClass> mAccessClass;
35
- SP<ForeignMetaObject> mMetaObject;
36
- SP<QmlTypeRegisterer> mTypeRegisterer;
37
- };
38
-
39
- } // namespace RubyQml
@@ -1,34 +0,0 @@
1
- #include "ext_anywrapper.h"
2
- #include "rubyclass.h"
3
-
4
- namespace RubyQml {
5
-
6
- Ext_AnyWrapper::Ext_AnyWrapper(RubyValue self)
7
- {
8
- Q_UNUSED(self);
9
- }
10
-
11
- RubyValue Ext_AnyWrapper::create(const QVariant &value, void (*markFunction)(const QVariant &))
12
- {
13
- auto klass = wrapperRubyClass<Ext_AnyWrapper>();
14
- auto wrapper = klass.newInstance();
15
- auto ptr = klass.unwrap(wrapper);
16
- ptr->mValue = value;
17
- ptr->mMarkFunction = markFunction;
18
- return wrapper;
19
- }
20
-
21
- void Ext_AnyWrapper::defineClass()
22
- {
23
- WrapperRubyClass<Ext_AnyWrapper> klass(RubyModule::fromPath("QML"), "AnyWrapper");
24
- Q_UNUSED(klass);
25
- }
26
-
27
- void Ext_AnyWrapper::gc_mark()
28
- {
29
- if (mMarkFunction) {
30
- mMarkFunction(mValue);
31
- }
32
- }
33
-
34
- } // namespace RubyQml
@@ -1,23 +0,0 @@
1
- #pragma once
2
- #include <QVariant>
3
-
4
- namespace RubyQml {
5
-
6
- class RubyValue;
7
-
8
- class Ext_AnyWrapper
9
- {
10
- public:
11
- Ext_AnyWrapper(RubyValue self);
12
- static RubyValue create(const QVariant &value, void (*markFunction)(const QVariant &) = nullptr);
13
- static void defineClass();
14
-
15
- QVariant value() const { return mValue; }
16
- void gc_mark();
17
-
18
- private:
19
- QVariant mValue;
20
- void (*mMarkFunction)(const QVariant &);
21
- };
22
-
23
- } // namespace RubyQml