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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 481b84b8d826ec6fd5a2f307d8edfe4f33ad3d8f
4
- data.tar.gz: d4394d24401e9b9c4d244b240670d46ec063d28c
3
+ metadata.gz: c3e17be31c7cb2d6c9530581484a9146c71718e1
4
+ data.tar.gz: 0fa4538a3960c37c4afe368986e0d1565ce401c5
5
5
  SHA512:
6
- metadata.gz: 0b0219afde5a224d1018d1561571f5667da11aa4716f37720a3d85df8addbd52de3687924ff2c7fa3c508b7cb60e2f000928f600da3f8e983a72463436e99ed8
7
- data.tar.gz: eec31c2af2ca479301637ea4b87cf6dd29e0968a80d2b2278e5dc6078a86e641e8d2f7e7ce68c4febbf24114a31a138b9470bef2a3469d2994c074138e51f606
6
+ metadata.gz: 643d0c001ba1f018b5784ab472cd789278be85721678c5b4c5dbd1edd9e89beb46b585fa273b12da771594b7d3f6ac147b28ea4e7f72ec4835babe125e08e836
7
+ data.tar.gz: 3fdc78678a5790c2123869b66905b40bc24613a6d47cfecbdf322be58ac403d3f60007e9d4856a44b15d64698639d4b6d95b6cc61844fa66610f2322e7fdcf16
@@ -0,0 +1,3 @@
1
+ [submodule "ext/qml/lib/libqmlbind"]
2
+ path = ext/qml/lib/libqmlbind
3
+ url = https://github.com/seanchas116/libqmlbind.git
@@ -1,17 +1,13 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.2.0-rc1
4
- - 2.1.2
5
- - 2.0.0
6
- - 1.9.3
3
+ - 2.2.2
4
+ - 2.1.6
7
5
  before_install:
8
- - sudo apt-add-repository -y ppa:beineri/opt-qt521
9
- - sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
6
+ - sudo apt-add-repository -y ppa:beineri/opt-qt541
10
7
  - sudo apt-get update
11
- - sudo apt-get install -y g++-4.7 libffi-dev qt52base qt52declarative
12
- - sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.7 90
8
+ - sudo apt-get install -y qt54base qt54declarative
13
9
  before_script:
14
- - source /opt/qt52/bin/qt52-env.sh
10
+ - source /opt/qt54/bin/qt54-env.sh
15
11
  - cd ext/qml
16
12
  - bundle exec ruby extconf.rb
17
13
  - make
@@ -1,4 +1,4 @@
1
- Copyright (c) 2014 Ryohei Ikegami
1
+ Copyright (c) 2014-2015 Ryohei Ikegami
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -15,7 +15,7 @@ It provides bindings between QML and Ruby and enables you to use Qt Quick-based
15
15
 
16
16
  ## What you can do with ruby-qml
17
17
 
18
- * Develop desktop GUI applications only with Ruby and QML
18
+ * Develop desktop GUI applications only with Ruby and QML / JavaScript
19
19
  * Easily combine codes written in C++ and Qt with your Ruby code
20
20
 
21
21
  ## Gallery
@@ -28,27 +28,24 @@ It provides bindings between QML and Ruby and enables you to use Qt Quick-based
28
28
 
29
29
  ### Requirements
30
30
 
31
- * **Ruby 1.9 or later**
31
+ * **Ruby 2.1 or later**
32
32
  * **OS X or Linux**
33
- * pkg-config
34
- * libffi
35
33
  * Qt 5.2 or later
36
34
 
37
35
  ### OS X with Homebrew
38
36
 
39
37
  To install ruby-qml on OS X with Homebrew, run the following commands:
40
38
 
41
- $ brew install pkg-config libffi qt5
42
- $ gem install qml -- --with-libffi-dir=$(brew --prefix libffi) --with-qt-dir=$(brew --prefix qt5)
39
+ $ brew install qt5
40
+ $ gem install qml -- --with-qmake=$(brew --prefix qt5)/bin/qmake
43
41
 
44
42
  Both libffi and Qt5 are keg-only in Homebrew, so you must specify their paths explicitly (or force linking).
45
43
 
46
44
  If you use [official Qt installation](http://qt-project.org/downloads), for example:
47
45
 
48
- $ brew install pkg-config libffi
49
- $ gem install qml -- --with-libffi-dir=$(brew --prefix libffi) --with-qt-dir=$HOME/Qt/5.3/clang_64
46
+ $ gem install qml -- --with-qmake=$HOME/Qt/5.4/clang_64/bin/qmake
50
47
 
51
- The Qt installation path (`$HOME/Qt/5.3/clang_64` in this example) depends on your Qt installation configuration and Qt version.
48
+ The Qt installation path (`$HOME/Qt/5.4/clang_64` in this example) depends on your Qt installation configuration and Qt version.
52
49
 
53
50
  ### General (OSX and Linux)
54
51
 
@@ -56,10 +53,8 @@ The Qt installation path (`$HOME/Qt/5.3/clang_64` in this example) depends on yo
56
53
 
57
54
  #### Options
58
55
 
59
- * `--with-libffi-dir=[dir]`
60
- * libffi installation directory (optional).
61
- * `--with-qt-dir=[dir]`
62
- * Qt installation directory (optional).
56
+ * `--with-qmake=[dir]`
57
+ * Qt qmake executable path (optional).
63
58
 
64
59
  ### Use Gemfile
65
60
 
@@ -74,7 +69,7 @@ And then execute:
74
69
  To pass build options, use `bundle config`.
75
70
  For example:
76
71
 
77
- $ bundle config build.qml --with-libffi-dir=$(brew --prefix libffi) --with-qt-dir=$(brew --prefix qt5)
72
+ $ bundle config build.qml --with-qmake=$(brew --prefix qt5)/bin/qmake
78
73
 
79
74
  The configuration will be saved in `~/.bundle/config`.
80
75
 
@@ -122,8 +117,8 @@ class FizzBuzz
122
117
  include QML::Access
123
118
  register_to_qml under: "Example", version: "1.0"
124
119
 
125
- property :input, '0'
126
- property :result , ''
120
+ property(:input) { '0' }
121
+ property(:result) { '' }
127
122
  signal :inputWasFizzBuzz, []
128
123
 
129
124
  on_changed :input do
@@ -204,32 +199,15 @@ module Example
204
199
  end
205
200
  ```
206
201
 
207
- If the Ruby object is singleton, you can use the root context to make it available to QML.
208
- In this case, you don't have to use `register_to_qml`.
209
-
210
- ```ruby
211
- class Foo
212
- include QML::Access
213
- def foo
214
- puts "foo"
215
- end
216
- end
217
-
218
- QML.run do |app|
219
- app.context[:foo] = Foo.new
220
- app.load_path Pathname(__FILE__) + '../main.qml'
221
- end
222
- ```
223
-
224
202
  ### Pass data to QML ListModels
225
203
 
226
204
  To bind list data between QML ListView and Ruby, you can use ListModels.
227
205
 
228
- * `QML::Data::ListModel` - the base class for ruby-qml list models.
206
+ * `QML::ListModel` - the base class for ruby-qml list models.
229
207
 
230
- * `QML::Data::ArrayModel` - provides a simple list model implementation using Array.
208
+ * `QML::ArrayModel` - provides a simple list model implementation using Array.
231
209
 
232
- * `QML::Data::QueryModel` - for databases (like ActiveRecord, Sequel or something)
210
+ * `QML::QueryModel` - for databases (like ActiveRecord, Sequel or something)
233
211
 
234
212
  This example uses `ArrayModel` to provide list data for a QML ListView.
235
213
  When the content of the ArrayModel is changed, the list view is also automatically updated.
@@ -244,7 +222,7 @@ class TodoController
244
222
  include QML::Access
245
223
  register_to_qml under: "Example", version: "1.0"
246
224
 
247
- property :model, QML::Data::ArrayModel.new(:title, :description, :due_date)
225
+ property(:model) { QML::ArrayModel.new(:title, :description, :due_date) }
248
226
 
249
227
  def add(title, description, due_date)
250
228
  # Items of list models must be "Hash-like" (have #[] method to get columns)
@@ -253,7 +231,6 @@ class TodoController
253
231
  description: description,
254
232
  due_date: due_date
255
233
  }
256
- p item
257
234
  model << item
258
235
  end
259
236
  end
@@ -275,7 +252,7 @@ TodoController {
275
252
  ### Combile asynchronous operations
276
253
 
277
254
  In QML, all UI-related operations are done synchronously in the event loop.
278
- To set result of asynchronous operations to the UI, use `QML.later` or `QML::Dispatchable#later`.
255
+ To set result of asynchronous operations to the UI, use `QML.next_tick`.
279
256
 
280
257
  #### Examples
281
258
 
@@ -284,11 +261,10 @@ To set result of asynchronous operations to the UI, use `QML.later` or `QML::Dis
284
261
  ```ruby
285
262
  # Ruby
286
263
  class HeavyTaskController
287
- # QML::Access includes QML::Dispathable
288
264
  include QML::Access
289
265
  register_to_qml under: "Example", version: "1.0"
290
266
 
291
- property :result, ''
267
+ property(:result) { '' }
292
268
 
293
269
  def set_result(result)
294
270
  self.result = result
@@ -296,9 +272,7 @@ class HeavyTaskController
296
272
 
297
273
  def start_heavy_task
298
274
  Thread.new do
299
- self.later.set_result do_heavy_task() # #set_result is called in the main thread in the next event loop
300
- # or
301
- QML.later do
275
+ QML.next_tick do
302
276
  set_result do_heavy_task()
303
277
  end
304
278
  end
@@ -320,64 +294,77 @@ HeavyTaskController {
320
294
  }
321
295
  ```
322
296
 
323
- ### Use Qt objects in Ruby
297
+ ### Value conversions between Ruby and QML JavaScript
298
+
299
+
300
+ #### Ruby to QML
301
+
302
+ |Ruby |QML/JavaScript |
303
+ |----------------|--------------------------------|
304
+ |nil |null |
305
+ |true/false |boolean |
306
+ |Numeric |number |
307
+ |String/Symbol |string |
308
+ |Array |Array |
309
+ |Hash |plain Object |
310
+ |Proc |Function |
311
+ |Time |Date |
312
+ |QML::Access |Object(QObject derived) |
313
+ |QML::ListModel |Object(QAbstractListModel) |
324
314
 
325
- In ruby-qml, Qt objects (QObject-derived C++ objects and QML objects) can be accessed from Ruby via the meta-object system of Qt.
315
+ You can customize this by implementing `#to_qml` method.
326
316
 
327
- You can access:
317
+ #### QML to Ruby
328
318
 
329
- * Properties
330
- * Signals
331
- * Slots (as methods), Q_INVOKAVLE methods, QML methods
319
+ |QML/JavaScript |Ruby |
320
+ |--------------------------------|----------------|
321
+ |null/undefined |nil |
322
+ |boolean |true/false |
323
+ |number |Float |
324
+ |string |String |
325
+ |Array |QML::JSArray |
326
+ |Function |QML::JSFunction |
327
+ |Object |QML::JSObject |
328
+ |Object wrapping QML::Access |QML::JSWrapper |
332
329
 
333
- You cannot access:
330
+ You can convert Objects further through QML::JSObject methods.
334
331
 
335
- * Normal C++ member functions
336
332
 
337
- If their names are camelCase in Qt, ruby-qml aliases them as underscore_case.
333
+ ### QML::JSObject usage
334
+
335
+ `QML::JSObject` is the wrapper class for JavaScript objects.
338
336
 
339
337
  ```ruby
340
- # QML::Application is a wrapper for QApplication
341
- app = QML.application
338
+ obj = QML.engine.evaluate <<-JS
339
+ ({
340
+ value: 1,
341
+ add: function(d) {
342
+ this.value += d;
343
+ }
344
+ })
345
+ JS
342
346
 
343
- # set property
344
- app.applicationName = "Test"
345
- app.application_name = "Test" # aliased version
347
+ # Getter
348
+ obj.value #=> 1
346
349
 
347
- # connect to signal
348
- app.aboutToQuit.connect do # "about_to_quit" is also OK
349
- puts "quitting..."
350
- end
350
+ # Setter
351
+ obj.value = 2
352
+ obj.vaue #=> 2
351
353
 
352
- # call method (slot)
353
- app.quit
354
- ```
354
+ # Call method if the property is a function
355
+ obj.add(10)
356
+ obj.value #=> 11
355
357
 
356
- ### Value conversions
357
-
358
- The following types are automatically converted between Ruby and QML:
359
-
360
- * Integer
361
- * Double
362
- * String
363
- * Time
364
- * Date
365
- * DateTime
366
- * Array
367
- * Hash
368
- * QML::Geometry::Point (QPoint, QPointF)
369
- * QML::Geometry::Size (QSize, QSizeF)
370
- * QML::Geometry::Rectangle (QRect, QRectF)
371
- * QML::QtObjectBase (Qt objects)
372
- * QML::Access
373
- * QML::Data::ListModel
358
+ # Subscription
359
+ obj[:value] #=> 11
360
+ obj[:add] #=> #<QML::JSFunction:...>
361
+ ```
374
362
 
375
363
  ### Load and use Qt C++ plugins
376
364
 
377
365
  `PluginLoader` loads Qt C++ plugins.
378
366
  It enables you to use your Qt C++ codes from Ruby easily.
379
367
 
380
-
381
368
  ```c++
382
369
  // C++ - plugin example
383
370
  class MyPlugin : public QObject
@@ -398,42 +385,18 @@ public slots:
398
385
 
399
386
  ```ruby
400
387
  # Ruby
388
+
389
+ # The instance will be a `QML::JSObject` which represents the plugin Qt object
401
390
  plugin = QML::PluginLoader.new(directory, "myplugin").instance
402
391
 
403
- plugin.added.connect do |value|
392
+ # Connect to signal (see http://doc.qt.io/qt-5/qtqml-syntax-signals.html#connecting-signals-to-methods-and-signals)
393
+ plugin[:added].connect do |value|
404
394
  puts "added value: #{value}"
405
395
  end
406
396
 
407
397
  plugin.add(1, 2) #=> 3
408
398
  ```
409
399
 
410
- ### Garbage collection
411
-
412
- To support garbage collection of Qt objects used in ruby-qml,
413
- `#managed?` attribute of each Qt object wrappr determines its memory management status.
414
-
415
- #### Managed objects
416
-
417
- *Manged objects* are managed by Ruby and QML and garbage collected when no longer reachable.
418
- All objects created inside QML and objects returned from C++ methods will be *managed* by default.
419
-
420
- #### Unmanaged objects
421
-
422
- *Unmanaged* objects are not managed and never garbage collected.
423
- Objects that have parents or that obtained from properties of other Qt objects will be *unmanaged* by default.
424
-
425
- #### Specify management status explicitly
426
-
427
- The `#managed?` method returns whether the object is managed or not.
428
- The `#prefer_managed` methods sets management status safely
429
- (e.g., objects that are created by QML will remain managed and objects that have parents will remain unmanaged).
430
-
431
- ```ruby
432
- plugin = PluginLoader.new(path).instance
433
- obj = plugin.create_object
434
- obj.prefer_managed false
435
- ```
436
-
437
400
  ### Use with EventMachine
438
401
 
439
402
  You can use [EventMachine](https://github.com/eventmachine/eventmachine) with ruby-qml.
@@ -464,7 +427,7 @@ require 'em-http-request'
464
427
 
465
428
  class Controller
466
429
  include QML::Access
467
- property :result, ''
430
+ property(:result) { '' }
468
431
 
469
432
  def get
470
433
  EM.synchrony do
@@ -489,6 +452,13 @@ end
489
452
 
490
453
  ## Contributing
491
454
 
455
+ ### Init submodules
456
+
457
+ ```
458
+ $ git submodule init
459
+ $ git submodule update
460
+ ```
461
+
492
462
  ### Install dependencies
493
463
 
494
464
  ```
@@ -502,7 +472,7 @@ To build it, run the following commands:
502
472
 
503
473
  ```
504
474
  $ cd ext/qml
505
- $ bundle exec ruby extconf.rb --with-qt-dir=/path/to/qt --with-libffi-dir=/path/to/libffi
475
+ $ bundle exec ruby extconf.rb --with-qmake=/path/to/qmake
506
476
  $ make -j4
507
477
  ```
508
478
 
data/changes.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## 1.0.0 (2015-06-16)
2
+
3
+ * A lot of changes (see examples and docs)
4
+ * Now uses [libqmlbind](https://github.com/seanchas116/libqmlbind)
5
+
1
6
  ## 0.0.7 (2014-12-25)
2
7
 
3
8
  * Support Ruby 2.2 (rc1) and Qt 5.4
@@ -8,9 +8,10 @@ module Examples
8
8
 
9
9
  class FizzBuzz
10
10
  include QML::Access
11
+ register_to_qml
11
12
 
12
- property :input, '0'
13
- property :result , ''
13
+ property(:input) { '0' }
14
+ property(:result) { '' }
14
15
  signal :inputWasFizzBuzz, []
15
16
 
16
17
  on_changed :input do
@@ -32,8 +33,6 @@ module Examples
32
33
  puts "quitting..."
33
34
  QML.application.quit
34
35
  end
35
-
36
- register_to_qml
37
36
  end
38
37
  end
39
38
  end
@@ -10,10 +10,10 @@ module Examples
10
10
  include QML::Access
11
11
  register_to_qml
12
12
 
13
- property :title, ''
14
- property :description, ''
15
- property :due_date, ''
16
- property :model, QML::Data::ArrayModel.new(:title, :description, :due_date)
13
+ property(:title) { '' }
14
+ property(:description) { '' }
15
+ property(:due_date) { '' }
16
+ property(:model) { QML::ArrayModel.new(:title, :description, :due_date) }
17
17
 
18
18
  def add
19
19
  item = {
@@ -12,10 +12,10 @@ module Examples
12
12
  primary_key :id
13
13
  String :title
14
14
  String :description
15
- Date :due_date
15
+ Time :due_date
16
16
  end
17
17
 
18
- class SequelModel < QML::Data::QueryModel
18
+ class SequelModel < QML::QueryModel
19
19
  attr_accessor :dataset
20
20
 
21
21
  def initialize(dataset)
@@ -42,14 +42,14 @@ module Examples
42
42
  self.model = SequelModel.new(@todo_dataset)
43
43
  end
44
44
 
45
- property :title, ''
46
- property :description, ''
47
- property :due_date, ''
48
- property :order_by, ''
45
+ property(:title) { '' }
46
+ property(:description) { '' }
47
+ property(:due_date) { '' }
48
+ property(:order_by) { '' }
49
49
  property :model
50
50
 
51
51
  def add
52
- @todo_dataset.insert(title: title, description: description, due_date: due_date)
52
+ @todo_dataset.insert(title: title, description: description, due_date: due_date.to_time)
53
53
  model.update
54
54
  end
55
55