rock-qtbindings 4.8.6.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (768) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.txt +85 -0
  3. data/COPYING.LIB.txt +510 -0
  4. data/COPYING.txt +286 -0
  5. data/KNOWN_ISSUES.txt +17 -0
  6. data/Rakefile +121 -0
  7. data/TODO.txt +2 -0
  8. data/bin/rbqtapi +152 -0
  9. data/bin/rbrcc +14 -0
  10. data/bin/rbuic4 +14 -0
  11. data/bin/smokeapi +14 -0
  12. data/bin/smokedeptool +14 -0
  13. data/examples/designer/calculatorbuilder/calculatorbuilder.qrc +5 -0
  14. data/examples/designer/calculatorbuilder/calculatorform.rb +60 -0
  15. data/examples/designer/calculatorbuilder/calculatorform.ui +299 -0
  16. data/examples/designer/calculatorbuilder/main.rb +34 -0
  17. data/examples/designer/calculatorbuilder/makefile +2 -0
  18. data/examples/designer/calculatorform/calculatorform.rb +46 -0
  19. data/examples/designer/calculatorform/calculatorform.ui +277 -0
  20. data/examples/designer/calculatorform/main.rb +32 -0
  21. data/examples/designer/calculatorform/makefile +3 -0
  22. data/examples/desktop/screenshot/main.rb +32 -0
  23. data/examples/desktop/screenshot/screenshot.rb +157 -0
  24. data/examples/desktop/systray/images/bad.svg +64 -0
  25. data/examples/desktop/systray/images/heart.svg +55 -0
  26. data/examples/desktop/systray/images/trash.svg +58 -0
  27. data/examples/desktop/systray/main.rb +41 -0
  28. data/examples/desktop/systray/makefile +2 -0
  29. data/examples/desktop/systray/systray.qrc +7 -0
  30. data/examples/desktop/systray/window.rb +219 -0
  31. data/examples/dialogs/complexwizard/complexwizard.rb +140 -0
  32. data/examples/dialogs/complexwizard/licensewizard.rb +294 -0
  33. data/examples/dialogs/complexwizard/main.rb +31 -0
  34. data/examples/dialogs/configdialog/configdialog.rb +109 -0
  35. data/examples/dialogs/configdialog/images/config.png +0 -0
  36. data/examples/dialogs/configdialog/images/query.png +0 -0
  37. data/examples/dialogs/configdialog/images/update.png +0 -0
  38. data/examples/dialogs/configdialog/main.rb +31 -0
  39. data/examples/dialogs/configdialog/pages.rb +140 -0
  40. data/examples/dialogs/extension/finddialog.rb +89 -0
  41. data/examples/dialogs/extension/main.rb +31 -0
  42. data/examples/dialogs/findfiles/main.rb +32 -0
  43. data/examples/dialogs/findfiles/window.rb +177 -0
  44. data/examples/dialogs/simplewizard/classwizard.rb +374 -0
  45. data/examples/dialogs/simplewizard/main.rb +31 -0
  46. data/examples/dialogs/simplewizard/simplewizard.rb +110 -0
  47. data/examples/dialogs/standarddialogs/dialog.rb +340 -0
  48. data/examples/dialogs/standarddialogs/main.rb +31 -0
  49. data/examples/dialogs/tabdialog/main.rb +38 -0
  50. data/examples/dialogs/tabdialog/tabdialog.rb +178 -0
  51. data/examples/draganddrop/draggableicons/dragwidget.rb +125 -0
  52. data/examples/draganddrop/draggableicons/images/boat.png +0 -0
  53. data/examples/draganddrop/draggableicons/images/car.png +0 -0
  54. data/examples/draganddrop/draggableicons/images/house.png +0 -0
  55. data/examples/draganddrop/draggableicons/main.rb +41 -0
  56. data/examples/draganddrop/draggabletext/draglabel.rb +51 -0
  57. data/examples/draganddrop/draggabletext/dragwidget.rb +94 -0
  58. data/examples/draganddrop/draggabletext/main.rb +33 -0
  59. data/examples/draganddrop/draggabletext/words.txt +41 -0
  60. data/examples/draganddrop/dropsite/dropsitewidget.rb +99 -0
  61. data/examples/draganddrop/dropsite/dropsitewindow.rb +114 -0
  62. data/examples/draganddrop/dropsite/main.rb +33 -0
  63. data/examples/draganddrop/fridgemagnets/draglabel.rb +78 -0
  64. data/examples/draganddrop/fridgemagnets/dragwidget.rb +130 -0
  65. data/examples/draganddrop/fridgemagnets/main.rb +33 -0
  66. data/examples/draganddrop/fridgemagnets/words.txt +48 -0
  67. data/examples/draganddrop/puzzle/example.jpg +0 -0
  68. data/examples/draganddrop/puzzle/main.rb +33 -0
  69. data/examples/draganddrop/puzzle/mainwindow.rb +136 -0
  70. data/examples/draganddrop/puzzle/pieceslist.rb +95 -0
  71. data/examples/draganddrop/puzzle/puzzlewidget.rb +190 -0
  72. data/examples/graphicsview/collidingmice/images/cheese.jpg +0 -0
  73. data/examples/graphicsview/collidingmice/main.rb +53 -0
  74. data/examples/graphicsview/collidingmice/makefile +2 -0
  75. data/examples/graphicsview/collidingmice/mice.qrc +5 -0
  76. data/examples/graphicsview/collidingmice/mouse.rb +176 -0
  77. data/examples/graphicsview/dragdroprobot/coloritem.rb +86 -0
  78. data/examples/graphicsview/dragdroprobot/images/head.png +0 -0
  79. data/examples/graphicsview/dragdroprobot/main.rb +57 -0
  80. data/examples/graphicsview/dragdroprobot/makefile +2 -0
  81. data/examples/graphicsview/dragdroprobot/robot.qrc +5 -0
  82. data/examples/graphicsview/dragdroprobot/robot.rb +246 -0
  83. data/examples/itemviews/chart/chart.qrc +5 -0
  84. data/examples/itemviews/chart/main.rb +33 -0
  85. data/examples/itemviews/chart/mainwindow.rb +151 -0
  86. data/examples/itemviews/chart/makefile +2 -0
  87. data/examples/itemviews/chart/mydata.cht +8 -0
  88. data/examples/itemviews/chart/pieview.rb +516 -0
  89. data/examples/itemviews/chart/qtdata.cht +14 -0
  90. data/examples/itemviews/dirview/main.rb +39 -0
  91. data/examples/itemviews/pixelator/imagemodel.rb +51 -0
  92. data/examples/itemviews/pixelator/images/qt.png +0 -0
  93. data/examples/itemviews/pixelator/images.qrc +5 -0
  94. data/examples/itemviews/pixelator/main.rb +34 -0
  95. data/examples/itemviews/pixelator/mainwindow.rb +218 -0
  96. data/examples/itemviews/pixelator/makefile +3 -0
  97. data/examples/itemviews/pixelator/pixeldelegate.rb +67 -0
  98. data/examples/itemviews/puzzle/example.jpg +0 -0
  99. data/examples/itemviews/puzzle/main.rb +36 -0
  100. data/examples/itemviews/puzzle/mainwindow.rb +143 -0
  101. data/examples/itemviews/puzzle/piecesmodel.rb +174 -0
  102. data/examples/itemviews/puzzle/puzzlewidget.rb +192 -0
  103. data/examples/itemviews/simpledommodel/domitem.rb +62 -0
  104. data/examples/itemviews/simpledommodel/dommodel.rb +139 -0
  105. data/examples/itemviews/simpledommodel/main.rb +33 -0
  106. data/examples/itemviews/simpledommodel/mainwindow.rb +66 -0
  107. data/examples/itemviews/simpletreemodel/default.txt +40 -0
  108. data/examples/itemviews/simpletreemodel/main.rb +41 -0
  109. data/examples/itemviews/simpletreemodel/makefile +2 -0
  110. data/examples/itemviews/simpletreemodel/simpletreemodel.qrc +5 -0
  111. data/examples/itemviews/simpletreemodel/treeitem.rb +67 -0
  112. data/examples/itemviews/simpletreemodel/treemodel.rb +164 -0
  113. data/examples/itemviews/sortingmodel/default.txt +40 -0
  114. data/examples/itemviews/sortingmodel/main.rb +53 -0
  115. data/examples/itemviews/sortingmodel/treeitem.rb +73 -0
  116. data/examples/itemviews/sortingmodel/treemodel.rb +166 -0
  117. data/examples/itemviews/spinboxdelegate/main.rb +47 -0
  118. data/examples/itemviews/spinboxdelegate/spinboxdelegate.rb +62 -0
  119. data/examples/killerfilter/killerfilter.rb +55 -0
  120. data/examples/layouts/basiclayouts/dialog.rb +110 -0
  121. data/examples/layouts/basiclayouts/main.rb +31 -0
  122. data/examples/layouts/borderlayout/borderlayout.rb +190 -0
  123. data/examples/layouts/borderlayout/main.rb +32 -0
  124. data/examples/layouts/borderlayout/window.rb +52 -0
  125. data/examples/layouts/flowlayouts/flowlayout.rb +108 -0
  126. data/examples/layouts/flowlayouts/main.rb +32 -0
  127. data/examples/layouts/flowlayouts/window.rb +43 -0
  128. data/examples/mainwindows/application/images/copy.png +0 -0
  129. data/examples/mainwindows/application/images/cut.png +0 -0
  130. data/examples/mainwindows/application/images/new.png +0 -0
  131. data/examples/mainwindows/application/images/open.png +0 -0
  132. data/examples/mainwindows/application/images/paste.png +0 -0
  133. data/examples/mainwindows/application/images/save.png +0 -0
  134. data/examples/mainwindows/application/main.rb +32 -0
  135. data/examples/mainwindows/application/mainwindow.rb +285 -0
  136. data/examples/mainwindows/dockwidgets/images/new.png +0 -0
  137. data/examples/mainwindows/dockwidgets/images/print.png +0 -0
  138. data/examples/mainwindows/dockwidgets/images/save.png +0 -0
  139. data/examples/mainwindows/dockwidgets/images/undo.png +0 -0
  140. data/examples/mainwindows/dockwidgets/main.rb +32 -0
  141. data/examples/mainwindows/dockwidgets/mainwindow.rb +302 -0
  142. data/examples/mainwindows/mdi/images/copy.png +0 -0
  143. data/examples/mainwindows/mdi/images/cut.png +0 -0
  144. data/examples/mainwindows/mdi/images/new.png +0 -0
  145. data/examples/mainwindows/mdi/images/open.png +0 -0
  146. data/examples/mainwindows/mdi/images/paste.png +0 -0
  147. data/examples/mainwindows/mdi/images/save.png +0 -0
  148. data/examples/mainwindows/mdi/main.rb +32 -0
  149. data/examples/mainwindows/mdi/mainwindow.rb +363 -0
  150. data/examples/mainwindows/mdi/mdichild.rb +152 -0
  151. data/examples/mainwindows/menus/main.rb +32 -0
  152. data/examples/mainwindows/menus/mainwindow.rb +327 -0
  153. data/examples/mainwindows/recentfiles/main.rb +32 -0
  154. data/examples/mainwindows/recentfiles/mainwindow.rb +258 -0
  155. data/examples/mainwindows/sdi/images/copy.png +0 -0
  156. data/examples/mainwindows/sdi/images/cut.png +0 -0
  157. data/examples/mainwindows/sdi/images/new.png +0 -0
  158. data/examples/mainwindows/sdi/images/open.png +0 -0
  159. data/examples/mainwindows/sdi/images/paste.png +0 -0
  160. data/examples/mainwindows/sdi/images/save.png +0 -0
  161. data/examples/mainwindows/sdi/main.rb +32 -0
  162. data/examples/mainwindows/sdi/mainwindow.rb +335 -0
  163. data/examples/network/broadcastreceiver/main.rb +32 -0
  164. data/examples/network/broadcastreceiver/receiver.rb +64 -0
  165. data/examples/network/broadcastsender/main.rb +32 -0
  166. data/examples/network/broadcastsender/sender.rb +72 -0
  167. data/examples/network/fortuneclient/client.rb +149 -0
  168. data/examples/network/fortuneclient/main.rb +32 -0
  169. data/examples/network/fortuneserver/main.rb +32 -0
  170. data/examples/network/fortuneserver/server.rb +88 -0
  171. data/examples/network/ftp/ftpwindow.rb +259 -0
  172. data/examples/network/ftp/images/cdtoparent.png +0 -0
  173. data/examples/network/ftp/images/dir.png +0 -0
  174. data/examples/network/ftp/images/file.png +0 -0
  175. data/examples/network/ftp/main.rb +32 -0
  176. data/examples/network/http/httpwindow.rb +187 -0
  177. data/examples/network/http/main.rb +32 -0
  178. data/examples/network/loopback/dialog.rb +163 -0
  179. data/examples/network/loopback/main.rb +32 -0
  180. data/examples/opengl/grabber/glwidget.rb +265 -0
  181. data/examples/opengl/grabber/main.rb +32 -0
  182. data/examples/opengl/grabber/mainwindow.rb +189 -0
  183. data/examples/opengl/hellogl/glwidget.rb +226 -0
  184. data/examples/opengl/hellogl/main.rb +32 -0
  185. data/examples/opengl/hellogl/window.rb +66 -0
  186. data/examples/opengl/textures/glwidget.rb +151 -0
  187. data/examples/opengl/textures/images/side1.png +0 -0
  188. data/examples/opengl/textures/images/side2.png +0 -0
  189. data/examples/opengl/textures/images/side3.png +0 -0
  190. data/examples/opengl/textures/images/side4.png +0 -0
  191. data/examples/opengl/textures/images/side5.png +0 -0
  192. data/examples/opengl/textures/images/side6.png +0 -0
  193. data/examples/opengl/textures/main.rb +32 -0
  194. data/examples/opengl/textures/window.rb +77 -0
  195. data/examples/painting/basicdrawing/images/brick.png +0 -0
  196. data/examples/painting/basicdrawing/images/qt-logo.png +0 -0
  197. data/examples/painting/basicdrawing/main.rb +32 -0
  198. data/examples/painting/basicdrawing/renderarea.rb +166 -0
  199. data/examples/painting/basicdrawing/window.rb +215 -0
  200. data/examples/painting/concentriccircles/circlewidget.rb +88 -0
  201. data/examples/painting/concentriccircles/main.rb +32 -0
  202. data/examples/painting/concentriccircles/window.rb +72 -0
  203. data/examples/painting/fontsampler/main.rb +32 -0
  204. data/examples/painting/fontsampler/mainwindow.rb +369 -0
  205. data/examples/painting/fontsampler/mainwindowbase.ui +136 -0
  206. data/examples/painting/fontsampler/makefile +8 -0
  207. data/examples/painting/fontsampler/previewdialog.rb +257 -0
  208. data/examples/painting/fontsampler/previewdialogbase.ui +224 -0
  209. data/examples/painting/fontsampler/previewlabel.rb +43 -0
  210. data/examples/painting/imagecomposition/imagecomposer.rb +152 -0
  211. data/examples/painting/imagecomposition/imagecomposition.qrc +6 -0
  212. data/examples/painting/imagecomposition/images/background.png +0 -0
  213. data/examples/painting/imagecomposition/images/blackrectangle.png +0 -0
  214. data/examples/painting/imagecomposition/images/butterfly.png +0 -0
  215. data/examples/painting/imagecomposition/images/checker.png +0 -0
  216. data/examples/painting/imagecomposition/main.rb +33 -0
  217. data/examples/painting/imagecomposition/makefile +2 -0
  218. data/examples/painting/painterpaths/main.rb +32 -0
  219. data/examples/painting/painterpaths/renderarea.rb +97 -0
  220. data/examples/painting/painterpaths/window.rb +247 -0
  221. data/examples/painting/svgviewer/files/bubbles.svg +212 -0
  222. data/examples/painting/svgviewer/files/cubic.svg +77 -0
  223. data/examples/painting/svgviewer/files/spheres.svg +79 -0
  224. data/examples/painting/svgviewer/main.rb +38 -0
  225. data/examples/painting/svgviewer/mainwindow.rb +99 -0
  226. data/examples/painting/svgviewer/makefile +2 -0
  227. data/examples/painting/svgviewer/svgview.rb +156 -0
  228. data/examples/painting/svgviewer/svgviewer.qrc +6 -0
  229. data/examples/painting/svgviewer/svgwindow.rb +87 -0
  230. data/examples/painting/transformations/main.rb +32 -0
  231. data/examples/painting/transformations/renderarea.rb +127 -0
  232. data/examples/painting/transformations/window.rb +153 -0
  233. data/examples/passivepopup/passivepopup.rb +38 -0
  234. data/examples/qdbus/chat/chat.rb +146 -0
  235. data/examples/qdbus/chat/chat_adaptor.rb +12 -0
  236. data/examples/qdbus/chat/chat_interface.rb +13 -0
  237. data/examples/qdbus/chat/chatmainwindow.ui +184 -0
  238. data/examples/qdbus/chat/chatsetnickname.ui +145 -0
  239. data/examples/qdbus/chat/makefile +8 -0
  240. data/examples/qdbus/complexpingpong/complexping.rb +92 -0
  241. data/examples/qdbus/complexpingpong/complexpong.rb +83 -0
  242. data/examples/qdbus/complexpingpong/ping-common.rb +1 -0
  243. data/examples/qdbus/listnames/listnames.rb +69 -0
  244. data/examples/qdbus/pingpong/ping-common.rb +1 -0
  245. data/examples/qdbus/pingpong/ping.rb +52 -0
  246. data/examples/qdbus/pingpong/pong.rb +55 -0
  247. data/examples/qdbus/remotecontrolledcar/car/car.rb +151 -0
  248. data/examples/qdbus/remotecontrolledcar/car/main.rb +50 -0
  249. data/examples/qdbus/remotecontrolledcar/controller/controller.rb +66 -0
  250. data/examples/qdbus/remotecontrolledcar/controller/controller.ui +61 -0
  251. data/examples/qdbus/remotecontrolledcar/controller/main.rb +32 -0
  252. data/examples/qdbus/remotecontrolledcar/controller/makefile +2 -0
  253. data/examples/qtscribble/scribble.rb +270 -0
  254. data/examples/richtext/calendar/main.rb +33 -0
  255. data/examples/richtext/calendar/mainwindow.rb +173 -0
  256. data/examples/richtext/orderform/detailsdialog.rb +130 -0
  257. data/examples/richtext/orderform/main.rb +34 -0
  258. data/examples/richtext/orderform/mainwindow.rb +194 -0
  259. data/examples/richtext/syntaxhighlighter/examples/example +79 -0
  260. data/examples/richtext/syntaxhighlighter/highlighter.rb +90 -0
  261. data/examples/richtext/syntaxhighlighter/main.rb +34 -0
  262. data/examples/richtext/syntaxhighlighter/mainwindow.rb +105 -0
  263. data/examples/ruboids/LICENSE.txt +58 -0
  264. data/examples/ruboids/Manifest +26 -0
  265. data/examples/ruboids/README +53 -0
  266. data/examples/ruboids/TODO +29 -0
  267. data/examples/ruboids/boids.properties +33 -0
  268. data/examples/ruboids/generateManifest.rb +42 -0
  269. data/examples/ruboids/index.html +147 -0
  270. data/examples/ruboids/release.rb +152 -0
  271. data/examples/ruboids/ruboids/Boid.rb +141 -0
  272. data/examples/ruboids/ruboids/BoidView.rb +159 -0
  273. data/examples/ruboids/ruboids/Camera.rb +24 -0
  274. data/examples/ruboids/ruboids/CameraDialog.rb +218 -0
  275. data/examples/ruboids/ruboids/Canvas.rb +143 -0
  276. data/examples/ruboids/ruboids/Cloud.rb +61 -0
  277. data/examples/ruboids/ruboids/CloudView.rb +54 -0
  278. data/examples/ruboids/ruboids/Flock.rb +47 -0
  279. data/examples/ruboids/ruboids/Graphics.rb +278 -0
  280. data/examples/ruboids/ruboids/Params.rb +87 -0
  281. data/examples/ruboids/ruboids/Point.rb +153 -0
  282. data/examples/ruboids/ruboids/Thing.rb +34 -0
  283. data/examples/ruboids/ruboids/Triangle.rb +21 -0
  284. data/examples/ruboids/ruboids/View.rb +88 -0
  285. data/examples/ruboids/ruboids/World.rb +82 -0
  286. data/examples/ruboids/ruboids/WorldWindow.rb +52 -0
  287. data/examples/ruboids/ruboids/info.rb +12 -0
  288. data/examples/ruboids/ruboids/ruboids.rb +29 -0
  289. data/examples/run_all.rb +15 -0
  290. data/examples/threading/main_thread.rb +19 -0
  291. data/examples/tutorial/t1/t1.rb +10 -0
  292. data/examples/tutorial/t10/cannon.rb +72 -0
  293. data/examples/tutorial/t10/lcdrange.rb +45 -0
  294. data/examples/tutorial/t10/t10.rb +55 -0
  295. data/examples/tutorial/t11/cannon.rb +123 -0
  296. data/examples/tutorial/t11/lcdrange.rb +45 -0
  297. data/examples/tutorial/t11/t11.rb +65 -0
  298. data/examples/tutorial/t12/cannon.rb +157 -0
  299. data/examples/tutorial/t12/lcdrange.rb +58 -0
  300. data/examples/tutorial/t12/t12.rb +65 -0
  301. data/examples/tutorial/t13/cannon.rb +206 -0
  302. data/examples/tutorial/t13/gamebrd.rb +112 -0
  303. data/examples/tutorial/t13/lcdrange.rb +59 -0
  304. data/examples/tutorial/t13/t13.rb +11 -0
  305. data/examples/tutorial/t14/cannon.rb +262 -0
  306. data/examples/tutorial/t14/gamebrd.rb +122 -0
  307. data/examples/tutorial/t14/lcdrange.rb +61 -0
  308. data/examples/tutorial/t14/t14.rb +11 -0
  309. data/examples/tutorial/t2/t2.rb +16 -0
  310. data/examples/tutorial/t3/t3.rb +17 -0
  311. data/examples/tutorial/t4/t4.rb +23 -0
  312. data/examples/tutorial/t5/t5.rb +35 -0
  313. data/examples/tutorial/t6/t6.rb +48 -0
  314. data/examples/tutorial/t7/lcdrange.rb +32 -0
  315. data/examples/tutorial/t7/t7.rb +40 -0
  316. data/examples/tutorial/t8/cannon.rb +37 -0
  317. data/examples/tutorial/t8/lcdrange.rb +45 -0
  318. data/examples/tutorial/t8/t8.rb +43 -0
  319. data/examples/tutorial/t9/cannon.rb +44 -0
  320. data/examples/tutorial/t9/lcdrange.rb +46 -0
  321. data/examples/tutorial/t9/t9.rb +43 -0
  322. data/examples/widgets/analogclock/analogclock.rb +94 -0
  323. data/examples/widgets/analogclock/main.rb +9 -0
  324. data/examples/widgets/calculator/button.rb +45 -0
  325. data/examples/widgets/calculator/calculator.rb +382 -0
  326. data/examples/widgets/calculator/main.rb +32 -0
  327. data/examples/widgets/charactermap/characterwidget.rb +110 -0
  328. data/examples/widgets/charactermap/main.rb +32 -0
  329. data/examples/widgets/charactermap/mainwindow.rb +118 -0
  330. data/examples/widgets/digitalclock/digitalclock.rb +30 -0
  331. data/examples/widgets/digitalclock/main.rb +9 -0
  332. data/examples/widgets/groupbox/main.rb +32 -0
  333. data/examples/widgets/groupbox/window.rb +134 -0
  334. data/examples/widgets/icons/iconpreviewarea.rb +111 -0
  335. data/examples/widgets/icons/iconsizespinbox.rb +39 -0
  336. data/examples/widgets/icons/imagedelegate.rb +73 -0
  337. data/examples/widgets/icons/images/designer.png +0 -0
  338. data/examples/widgets/icons/images/find_disabled.png +0 -0
  339. data/examples/widgets/icons/images/find_normal.png +0 -0
  340. data/examples/widgets/icons/images/monkey_off_128x128.png +0 -0
  341. data/examples/widgets/icons/images/monkey_off_16x16.png +0 -0
  342. data/examples/widgets/icons/images/monkey_off_32x32.png +0 -0
  343. data/examples/widgets/icons/images/monkey_off_64x64.png +0 -0
  344. data/examples/widgets/icons/images/monkey_on_128x128.png +0 -0
  345. data/examples/widgets/icons/images/monkey_on_16x16.png +0 -0
  346. data/examples/widgets/icons/images/monkey_on_32x32.png +0 -0
  347. data/examples/widgets/icons/images/monkey_on_64x64.png +0 -0
  348. data/examples/widgets/icons/images/qtopia_16x16.png +0 -0
  349. data/examples/widgets/icons/images/qtopia_32x32.png +0 -0
  350. data/examples/widgets/icons/images/qtopia_48x48.png +0 -0
  351. data/examples/widgets/icons/main.rb +32 -0
  352. data/examples/widgets/icons/mainwindow.rb +351 -0
  353. data/examples/widgets/imageviewer/imageviewer.rb +219 -0
  354. data/examples/widgets/imageviewer/main.rb +32 -0
  355. data/examples/widgets/lineedits/main.rb +32 -0
  356. data/examples/widgets/lineedits/window.rb +199 -0
  357. data/examples/widgets/movie/images/open.png +0 -0
  358. data/examples/widgets/movie/images/pause.png +0 -0
  359. data/examples/widgets/movie/images/play.png +0 -0
  360. data/examples/widgets/movie/images/quit.png +0 -0
  361. data/examples/widgets/movie/images/stop.png +0 -0
  362. data/examples/widgets/movie/main.rb +32 -0
  363. data/examples/widgets/movie/movieplayer.rb +201 -0
  364. data/examples/widgets/movie/movies/fire.mng +0 -0
  365. data/examples/widgets/screenshot/main.rb +32 -0
  366. data/examples/widgets/screenshot/screenshot.rb +155 -0
  367. data/examples/widgets/scribble/main.rb +32 -0
  368. data/examples/widgets/scribble/mainwindow.rb +202 -0
  369. data/examples/widgets/scribble/scribblearea.rb +154 -0
  370. data/examples/widgets/sliders/main.rb +32 -0
  371. data/examples/widgets/sliders/slidersgroup.rb +97 -0
  372. data/examples/widgets/sliders/window.rb +124 -0
  373. data/examples/widgets/spinboxes/main.rb +32 -0
  374. data/examples/widgets/spinboxes/window.rb +213 -0
  375. data/examples/widgets/tetrix/main.rb +33 -0
  376. data/examples/widgets/tetrix/tetrixboard.rb +346 -0
  377. data/examples/widgets/tetrix/tetrixpiece.rb +135 -0
  378. data/examples/widgets/tetrix/tetrixwindow.rb +88 -0
  379. data/examples/widgets/tooltips/images/circle.png +0 -0
  380. data/examples/widgets/tooltips/images/square.png +0 -0
  381. data/examples/widgets/tooltips/images/triangle.png +0 -0
  382. data/examples/widgets/tooltips/main.rb +32 -0
  383. data/examples/widgets/tooltips/shapeitem.rb +31 -0
  384. data/examples/widgets/tooltips/sortingbox.rb +222 -0
  385. data/examples/widgets/wiggly/dialog.rb +48 -0
  386. data/examples/widgets/wiggly/main.rb +9 -0
  387. data/examples/widgets/wiggly/wigglywidget.rb +76 -0
  388. data/examples/widgets/windowflags/controllerwindow.rb +195 -0
  389. data/examples/widgets/windowflags/main.rb +32 -0
  390. data/examples/widgets/windowflags/previewwindow.rb +103 -0
  391. data/examples/xml/dombookmarks/frank.xbel +230 -0
  392. data/examples/xml/dombookmarks/jennifer.xbel +93 -0
  393. data/examples/xml/dombookmarks/main.rb +34 -0
  394. data/examples/xml/dombookmarks/mainwindow.rb +129 -0
  395. data/examples/xml/dombookmarks/xbeltree.rb +172 -0
  396. data/examples/xml/saxbookmarks/frank.xbel +230 -0
  397. data/examples/xml/saxbookmarks/jennifer.xbel +93 -0
  398. data/examples/xml/saxbookmarks/main.rb +34 -0
  399. data/examples/xml/saxbookmarks/mainwindow.rb +144 -0
  400. data/examples/xml/saxbookmarks/xbelgenerator.rb +95 -0
  401. data/examples/xml/saxbookmarks/xbelhandler.rb +122 -0
  402. data/ext/CMakeLists.txt +28 -0
  403. data/ext/cmake/modules/BasicFindPackageVersion.cmake.in +30 -0
  404. data/ext/cmake/modules/CMakeCSharpCompiler.cmake.in +7 -0
  405. data/ext/cmake/modules/CMakeCSharpInformation.cmake +366 -0
  406. data/ext/cmake/modules/CMakeDetermineCSharpCompiler.cmake +85 -0
  407. data/ext/cmake/modules/CMakeTestCSharpCompiler.cmake +1 -0
  408. data/ext/cmake/modules/CheckCXXSourceCompiles.cmake +68 -0
  409. data/ext/cmake/modules/FindLibraryWithDebug.cmake +113 -0
  410. data/ext/cmake/modules/FindMono.cmake +36 -0
  411. data/ext/cmake/modules/FindPHP5.cmake +179 -0
  412. data/ext/cmake/modules/FindPerlMore.cmake +78 -0
  413. data/ext/cmake/modules/FindPhonon.cmake +71 -0
  414. data/ext/cmake/modules/FindQImageBlitz.cmake +51 -0
  415. data/ext/cmake/modules/FindQScintilla.cmake +57 -0
  416. data/ext/cmake/modules/FindQt4.cmake +1275 -0
  417. data/ext/cmake/modules/FindQwt5.cmake +104 -0
  418. data/ext/cmake/modules/FindRuby.cmake +279 -0
  419. data/ext/cmake/modules/FindSmoke.cmake +78 -0
  420. data/ext/cmake/modules/HandleImportedTargetsInCMakeRequiredLibraries.cmake +85 -0
  421. data/ext/cmake/modules/MacroLogFeature.cmake +146 -0
  422. data/ext/cmake/modules/MacroOptionalAddBindings.cmake +47 -0
  423. data/ext/cmake/modules/MacroOptionalFindPackage.cmake +28 -0
  424. data/ext/cmake/modules/MacroPushRequiredVars.cmake +47 -0
  425. data/ext/cmake/modules/MacroWriteBasicCMakeVersionFile.cmake +22 -0
  426. data/ext/cmake/modules/Qt4ConfigDependentSettings.cmake +384 -0
  427. data/ext/cmake/modules/Qt4Macros.cmake +414 -0
  428. data/ext/cmake/modules/SmokeConfig.cmake.in +109 -0
  429. data/ext/generator/CMakeLists.txt +38 -0
  430. data/ext/generator/cmake/BasicFindPackageVersion.cmake.in +30 -0
  431. data/ext/generator/cmake/CMakeLists.txt +24 -0
  432. data/ext/generator/cmake/FindLibraryWithDebug.cmake +113 -0
  433. data/ext/generator/cmake/FindPhonon.cmake +71 -0
  434. data/ext/generator/cmake/FindQImageBlitz.cmake +51 -0
  435. data/ext/generator/cmake/FindQScintilla.cmake +57 -0
  436. data/ext/generator/cmake/FindQwt5.cmake +104 -0
  437. data/ext/generator/cmake/HandleImportedTargetsInCMakeRequiredLibraries.cmake +85 -0
  438. data/ext/generator/cmake/MacroLogFeature.cmake +146 -0
  439. data/ext/generator/cmake/MacroOptionalAddBindings.cmake +47 -0
  440. data/ext/generator/cmake/MacroOptionalFindPackage.cmake +28 -0
  441. data/ext/generator/cmake/MacroWriteBasicCMakeVersionFile.cmake +22 -0
  442. data/ext/generator/cmake/SmokeConfig.cmake.in +109 -0
  443. data/ext/generator/config.h +25 -0
  444. data/ext/generator/generator_export.h +31 -0
  445. data/ext/generator/generatorenvironment.cpp +52 -0
  446. data/ext/generator/generatorenvironment.h +35 -0
  447. data/ext/generator/generatorpreprocessor.cpp +303 -0
  448. data/ext/generator/generatorpreprocessor.h +83 -0
  449. data/ext/generator/generators/CMakeLists.txt +4 -0
  450. data/ext/generator/generators/dump/CMakeLists.txt +15 -0
  451. data/ext/generator/generators/dump/generator_dump.cpp +36 -0
  452. data/ext/generator/generators/smoke/CMakeLists.txt +18 -0
  453. data/ext/generator/generators/smoke/generator_smoke.cpp +240 -0
  454. data/ext/generator/generators/smoke/globals.h +140 -0
  455. data/ext/generator/generators/smoke/helpers.cpp +793 -0
  456. data/ext/generator/generators/smoke/writeClasses.cpp +502 -0
  457. data/ext/generator/generators/smoke/writeSmokeDataFile.cpp +754 -0
  458. data/ext/generator/generatorvisitor.cpp +922 -0
  459. data/ext/generator/generatorvisitor.h +119 -0
  460. data/ext/generator/main.cpp +243 -0
  461. data/ext/generator/name_compiler.cpp +205 -0
  462. data/ext/generator/name_compiler.h +76 -0
  463. data/ext/generator/options.cpp +33 -0
  464. data/ext/generator/options.h +46 -0
  465. data/ext/generator/parser/CMakeLists.txt +50 -0
  466. data/ext/generator/parser/ast.cpp +21 -0
  467. data/ext/generator/parser/ast.h +923 -0
  468. data/ext/generator/parser/astutilities.h +65 -0
  469. data/ext/generator/parser/codegenerator.cpp +867 -0
  470. data/ext/generator/parser/codegenerator.h +180 -0
  471. data/ext/generator/parser/codemodel_fwd.h +76 -0
  472. data/ext/generator/parser/commentformatter.cpp +54 -0
  473. data/ext/generator/parser/commentformatter.h +45 -0
  474. data/ext/generator/parser/commentparser.cpp +109 -0
  475. data/ext/generator/parser/commentparser.h +84 -0
  476. data/ext/generator/parser/control.cpp +40 -0
  477. data/ext/generator/parser/control.h +51 -0
  478. data/ext/generator/parser/cppparser_export.h +33 -0
  479. data/ext/generator/parser/default_visitor.cpp +470 -0
  480. data/ext/generator/parser/default_visitor.h +116 -0
  481. data/ext/generator/parser/dumptree.cpp +146 -0
  482. data/ext/generator/parser/dumptree.h +50 -0
  483. data/ext/generator/parser/indexedstring.cpp +213 -0
  484. data/ext/generator/parser/indexedstring.h +147 -0
  485. data/ext/generator/parser/kdevelop-parser-rev +1 -0
  486. data/ext/generator/parser/kdevvarlengtharray.h +346 -0
  487. data/ext/generator/parser/lexer.cpp +964 -0
  488. data/ext/generator/parser/lexer.h +308 -0
  489. data/ext/generator/parser/listnode.cpp +20 -0
  490. data/ext/generator/parser/listnode.h +97 -0
  491. data/ext/generator/parser/memorypool.cpp +20 -0
  492. data/ext/generator/parser/memorypool.h +41 -0
  493. data/ext/generator/parser/name_compiler.cpp +190 -0
  494. data/ext/generator/parser/name_compiler.h +77 -0
  495. data/ext/generator/parser/parser.cpp +4708 -0
  496. data/ext/generator/parser/parser.h +290 -0
  497. data/ext/generator/parser/parsesession.cpp +106 -0
  498. data/ext/generator/parser/parsesession.h +87 -0
  499. data/ext/generator/parser/problem.h +21 -0
  500. data/ext/generator/parser/rpp/CMakeLists.txt +45 -0
  501. data/ext/generator/parser/rpp/Makefile.am +13 -0
  502. data/ext/generator/parser/rpp/anchor.h +51 -0
  503. data/ext/generator/parser/rpp/appendedlist.h +363 -0
  504. data/ext/generator/parser/rpp/chartools.cpp +146 -0
  505. data/ext/generator/parser/rpp/chartools.h +99 -0
  506. data/ext/generator/parser/rpp/macrorepository.cpp +44 -0
  507. data/ext/generator/parser/rpp/macrorepository.h +59 -0
  508. data/ext/generator/parser/rpp/pp-configuration +86 -0
  509. data/ext/generator/parser/rpp/pp-engine.cpp +1216 -0
  510. data/ext/generator/parser/rpp/pp-engine.h +267 -0
  511. data/ext/generator/parser/rpp/pp-environment.cpp +271 -0
  512. data/ext/generator/parser/rpp/pp-environment.h +119 -0
  513. data/ext/generator/parser/rpp/pp-internal.cpp +38 -0
  514. data/ext/generator/parser/rpp/pp-internal.h +37 -0
  515. data/ext/generator/parser/rpp/pp-location.cpp +191 -0
  516. data/ext/generator/parser/rpp/pp-location.h +89 -0
  517. data/ext/generator/parser/rpp/pp-macro-expander.cpp +568 -0
  518. data/ext/generator/parser/rpp/pp-macro-expander.cpp.orig +558 -0
  519. data/ext/generator/parser/rpp/pp-macro-expander.h +130 -0
  520. data/ext/generator/parser/rpp/pp-macro.cpp +153 -0
  521. data/ext/generator/parser/rpp/pp-macro.h +176 -0
  522. data/ext/generator/parser/rpp/pp-scanner.cpp +311 -0
  523. data/ext/generator/parser/rpp/pp-scanner.h +97 -0
  524. data/ext/generator/parser/rpp/pp-stream.cpp +425 -0
  525. data/ext/generator/parser/rpp/pp-stream.h +183 -0
  526. data/ext/generator/parser/rpp/preprocessor.cpp +65 -0
  527. data/ext/generator/parser/rpp/preprocessor.h +80 -0
  528. data/ext/generator/parser/rpp/rpp.pri +2 -0
  529. data/ext/generator/parser/rpp/test/t001.cpp +23 -0
  530. data/ext/generator/parser/rpp/test/t002.cpp +15 -0
  531. data/ext/generator/parser/rpp/test/t003.cpp +10 -0
  532. data/ext/generator/parser/rpp/test/t004.cpp +9 -0
  533. data/ext/generator/parser/rpp/test/t005.cpp +10 -0
  534. data/ext/generator/parser/rpp/test/t006.cpp +10 -0
  535. data/ext/generator/parser/rpp/test/t007.cpp +6 -0
  536. data/ext/generator/parser/rpp/test/t008.cpp +6 -0
  537. data/ext/generator/parser/rpp/test/t009.cpp +5 -0
  538. data/ext/generator/parser/rpp/test/t010.cpp +15 -0
  539. data/ext/generator/parser/rpp/test/t011.cpp +9 -0
  540. data/ext/generator/parser/rpp/tests/CMakeLists.txt +17 -0
  541. data/ext/generator/parser/rpp/tests/main.cpp +69 -0
  542. data/ext/generator/parser/rxx.pri +50 -0
  543. data/ext/generator/parser/rxx_allocator.h +128 -0
  544. data/ext/generator/parser/safetycounter.h +57 -0
  545. data/ext/generator/parser/simplecursor.h +74 -0
  546. data/ext/generator/parser/stringhelpers.cpp +577 -0
  547. data/ext/generator/parser/stringhelpers.h +118 -0
  548. data/ext/generator/parser/symbol.h +140 -0
  549. data/ext/generator/parser/tests/CMakeLists.txt +46 -0
  550. data/ext/generator/parser/tests/test_generator.cpp +259 -0
  551. data/ext/generator/parser/tests/test_parser.cpp +474 -0
  552. data/ext/generator/parser/tests/test_pool.cpp +109 -0
  553. data/ext/generator/parser/tests/test_pool.h +35 -0
  554. data/ext/generator/parser/tests/testconfig.h.cmake +4 -0
  555. data/ext/generator/parser/tokens.cpp +367 -0
  556. data/ext/generator/parser/tokens.h +148 -0
  557. data/ext/generator/parser/type_compiler.cpp +135 -0
  558. data/ext/generator/parser/type_compiler.h +68 -0
  559. data/ext/generator/parser/visitor.cpp +115 -0
  560. data/ext/generator/parser/visitor.h +138 -0
  561. data/ext/generator/smoke.h +557 -0
  562. data/ext/generator/smokegen_string.h +43 -0
  563. data/ext/generator/type.cpp +204 -0
  564. data/ext/generator/type.h +497 -0
  565. data/ext/generator/type_compiler.cpp +277 -0
  566. data/ext/generator/type_compiler.h +80 -0
  567. data/ext/ruby/CMakeLists.txt +64 -0
  568. data/ext/ruby/qtdeclarative/CMakeLists.txt +17 -0
  569. data/ext/ruby/qtdeclarative/qtdeclarative.cpp +67 -0
  570. data/ext/ruby/qtdeclarative/qtdeclarative.rb +17 -0
  571. data/ext/ruby/qtdeclarative/qtdeclarativehandlers.cpp +36 -0
  572. data/ext/ruby/qtruby/AUTHORS +54 -0
  573. data/ext/ruby/qtruby/CMakeLists.txt +4 -0
  574. data/ext/ruby/qtruby/COPYING +355 -0
  575. data/ext/ruby/qtruby/COPYING.LIB +510 -0
  576. data/ext/ruby/qtruby/ChangeLog +3732 -0
  577. data/ext/ruby/qtruby/INSTALL +79 -0
  578. data/ext/ruby/qtruby/README +264 -0
  579. data/ext/ruby/qtruby/TODO +8 -0
  580. data/ext/ruby/qtruby/bin/CMakeLists.txt +1 -0
  581. data/ext/ruby/qtruby/bin/rbqtapi +152 -0
  582. data/ext/ruby/qtruby/rails_support/CMakeLists.txt +1 -0
  583. data/ext/ruby/qtruby/rails_support/active_item_model.rb +234 -0
  584. data/ext/ruby/qtruby/rails_support/active_table_model.rb +122 -0
  585. data/ext/ruby/qtruby/src/CMakeLists.txt +103 -0
  586. data/ext/ruby/qtruby/src/Qt.cpp +1327 -0
  587. data/ext/ruby/qtruby/src/handlers.cpp +2668 -0
  588. data/ext/ruby/qtruby/src/marshall.h +66 -0
  589. data/ext/ruby/qtruby/src/marshall_basetypes.h +208 -0
  590. data/ext/ruby/qtruby/src/marshall_complex.h +175 -0
  591. data/ext/ruby/qtruby/src/marshall_macros.h +647 -0
  592. data/ext/ruby/qtruby/src/marshall_primitives.h +306 -0
  593. data/ext/ruby/qtruby/src/marshall_types.cpp +815 -0
  594. data/ext/ruby/qtruby/src/marshall_types.h +240 -0
  595. data/ext/ruby/qtruby/src/qtruby.cpp +2627 -0
  596. data/ext/ruby/qtruby/src/qtruby.h +198 -0
  597. data/ext/ruby/qtruby/src/smokeruby.h +164 -0
  598. data/ext/ruby/qtruby/test/opoverloading.rb +46 -0
  599. data/ext/ruby/qtruby/test/unittests.rb +151 -0
  600. data/ext/ruby/qtruby/tools/CMakeLists.txt +2 -0
  601. data/ext/ruby/qtruby/tools/rbrcc/CMakeLists.txt +6 -0
  602. data/ext/ruby/qtruby/tools/rbrcc/Messages.sh +7 -0
  603. data/ext/ruby/qtruby/tools/rbrcc/main.cpp +173 -0
  604. data/ext/ruby/qtruby/tools/rbrcc/rbrcc.pro +14 -0
  605. data/ext/ruby/qtruby/tools/rbrcc/rcc.cpp +648 -0
  606. data/ext/ruby/qtruby/tools/rbrcc/rcc.h +165 -0
  607. data/ext/ruby/qtruby/tools/rbuic/CMakeLists.txt +35 -0
  608. data/ext/ruby/qtruby/tools/rbuic/LICENSE.GPL +280 -0
  609. data/ext/ruby/qtruby/tools/rbuic/Messages.sh +7 -0
  610. data/ext/ruby/qtruby/tools/rbuic/TODO +4 -0
  611. data/ext/ruby/qtruby/tools/rbuic/customwidgetsinfo.cpp +106 -0
  612. data/ext/ruby/qtruby/tools/rbuic/customwidgetsinfo.h +95 -0
  613. data/ext/ruby/qtruby/tools/rbuic/databaseinfo.cpp +102 -0
  614. data/ext/ruby/qtruby/tools/rbuic/databaseinfo.h +85 -0
  615. data/ext/ruby/qtruby/tools/rbuic/driver.cpp +384 -0
  616. data/ext/ruby/qtruby/tools/rbuic/driver.h +141 -0
  617. data/ext/ruby/qtruby/tools/rbuic/globaldefs.h +60 -0
  618. data/ext/ruby/qtruby/tools/rbuic/main.cpp +201 -0
  619. data/ext/ruby/qtruby/tools/rbuic/option.h +110 -0
  620. data/ext/ruby/qtruby/tools/rbuic/rbuic.pri +23 -0
  621. data/ext/ruby/qtruby/tools/rbuic/rbuic4.pro +43 -0
  622. data/ext/ruby/qtruby/tools/rbuic/ruby/rbextractimages.cpp +150 -0
  623. data/ext/ruby/qtruby/tools/rbuic/ruby/rbextractimages.h +83 -0
  624. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwritedeclaration.cpp +217 -0
  625. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwritedeclaration.h +85 -0
  626. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteicondata.cpp +185 -0
  627. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteicondata.h +86 -0
  628. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteicondeclaration.cpp +88 -0
  629. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteicondeclaration.h +83 -0
  630. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteiconinitialization.cpp +126 -0
  631. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteiconinitialization.h +87 -0
  632. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteinitialization.cpp +2478 -0
  633. data/ext/ruby/qtruby/tools/rbuic/ruby/rbwriteinitialization.h +314 -0
  634. data/ext/ruby/qtruby/tools/rbuic/ruby/ruby.pri +18 -0
  635. data/ext/ruby/qtruby/tools/rbuic/treewalker.cpp +318 -0
  636. data/ext/ruby/qtruby/tools/rbuic/treewalker.h +139 -0
  637. data/ext/ruby/qtruby/tools/rbuic/ui4.cpp +7623 -0
  638. data/ext/ruby/qtruby/tools/rbuic/ui4.h +3180 -0
  639. data/ext/ruby/qtruby/tools/rbuic/uic.cpp +438 -0
  640. data/ext/ruby/qtruby/tools/rbuic/uic.h +154 -0
  641. data/ext/ruby/qtruby/tools/rbuic/utils.h +125 -0
  642. data/ext/ruby/qtruby/tools/rbuic/validator.cpp +100 -0
  643. data/ext/ruby/qtruby/tools/rbuic/validator.h +80 -0
  644. data/ext/ruby/qtscript/CMakeLists.txt +19 -0
  645. data/ext/ruby/qtscript/qtscript.cpp +83 -0
  646. data/ext/ruby/qtscript/qtscript.rb +40 -0
  647. data/ext/ruby/qtscript/qtscripthandlers.cpp +37 -0
  648. data/ext/ruby/qtscript/smokedata.cpp +1403 -0
  649. data/ext/ruby/qttest/CMakeLists.txt +18 -0
  650. data/ext/ruby/qttest/ChangeLog +9 -0
  651. data/ext/ruby/qttest/examples/myfirsttest.rb +30 -0
  652. data/ext/ruby/qttest/qttest.cpp +83 -0
  653. data/ext/ruby/qttest/qttest.rb +166 -0
  654. data/ext/ruby/qttest/qttesthandlers.cpp +37 -0
  655. data/ext/ruby/qtuitools/CMakeLists.txt +16 -0
  656. data/ext/ruby/qtuitools/qtuitools.cpp +83 -0
  657. data/ext/ruby/qtuitools/qtuitools.rb +17 -0
  658. data/ext/ruby/qtuitools/qtuitoolshandlers.cpp +32 -0
  659. data/ext/ruby/qtwebkit/CMakeLists.txt +17 -0
  660. data/ext/ruby/qtwebkit/qtwebkit.cpp +67 -0
  661. data/ext/ruby/qtwebkit/qtwebkit.rb +17 -0
  662. data/ext/ruby/qtwebkit/qtwebkithandlers.cpp +40 -0
  663. data/ext/smoke/CMakeLists.txt +39 -0
  664. data/ext/smoke/deptool/CMakeLists.txt +7 -0
  665. data/ext/smoke/deptool/main.cpp +128 -0
  666. data/ext/smoke/qt_smoke.h +16 -0
  667. data/ext/smoke/qtcore/CMakeLists.txt +88 -0
  668. data/ext/smoke/qtcore/QtGuess.txt +180 -0
  669. data/ext/smoke/qtcore/config.xml.cmake +10 -0
  670. data/ext/smoke/qtcore/qt-config.xml.cmake +21 -0
  671. data/ext/smoke/qtcore/qtcore_includes.h +1 -0
  672. data/ext/smoke/qtcore/smokeconfig.xml +193 -0
  673. data/ext/smoke/qtcore/tests/CMakeLists.txt +13 -0
  674. data/ext/smoke/qtcore/tests/test.cpp +846 -0
  675. data/ext/smoke/qtcore_smoke.h +16 -0
  676. data/ext/smoke/qtdbus/CMakeLists.txt +38 -0
  677. data/ext/smoke/qtdbus/config.xml.cmake +11 -0
  678. data/ext/smoke/qtdbus/qtdbus_includes.h +2 -0
  679. data/ext/smoke/qtdbus/smokeconfig.xml +65 -0
  680. data/ext/smoke/qtdbus_smoke.h +16 -0
  681. data/ext/smoke/qtdeclarative/CMakeLists.txt +45 -0
  682. data/ext/smoke/qtdeclarative/config.xml.cmake +12 -0
  683. data/ext/smoke/qtdeclarative/qtdeclarative_includes.h +3 -0
  684. data/ext/smoke/qtdeclarative/smokeconfig.xml +59 -0
  685. data/ext/smoke/qtdeclarative_smoke.h +16 -0
  686. data/ext/smoke/qtgui/CMakeLists.txt +76 -0
  687. data/ext/smoke/qtgui/config.xml.cmake +11 -0
  688. data/ext/smoke/qtgui/qtgui_includes.h +7 -0
  689. data/ext/smoke/qtgui/smokeconfig.xml +500 -0
  690. data/ext/smoke/qtgui_smoke.h +16 -0
  691. data/ext/smoke/qthelp/CMakeLists.txt +45 -0
  692. data/ext/smoke/qthelp/config.xml.cmake +13 -0
  693. data/ext/smoke/qthelp/qthelp_includes.h +3 -0
  694. data/ext/smoke/qthelp/smokeconfig.xml +54 -0
  695. data/ext/smoke/qthelp_smoke.h +16 -0
  696. data/ext/smoke/qtmultimedia/CMakeLists.txt +42 -0
  697. data/ext/smoke/qtmultimedia/config.xml.cmake +12 -0
  698. data/ext/smoke/qtmultimedia/qtmultimedia_includes.h +3 -0
  699. data/ext/smoke/qtmultimedia/smokeconfig.xml +51 -0
  700. data/ext/smoke/qtmultimedia_smoke.h +16 -0
  701. data/ext/smoke/qtnetwork/CMakeLists.txt +38 -0
  702. data/ext/smoke/qtnetwork/config.xml.cmake +11 -0
  703. data/ext/smoke/qtnetwork/qtnetwork_includes.h +2 -0
  704. data/ext/smoke/qtnetwork/smokeconfig.xml +81 -0
  705. data/ext/smoke/qtnetwork_smoke.h +16 -0
  706. data/ext/smoke/qtopengl/CMakeLists.txt +43 -0
  707. data/ext/smoke/qtopengl/config.xml.cmake +13 -0
  708. data/ext/smoke/qtopengl/qtopengl_includes.h +3 -0
  709. data/ext/smoke/qtopengl/smokeconfig.xml +58 -0
  710. data/ext/smoke/qtopengl_smoke.h +16 -0
  711. data/ext/smoke/qtscript/CMakeLists.txt +31 -0
  712. data/ext/smoke/qtscript/config.xml.cmake +11 -0
  713. data/ext/smoke/qtscript/qtscript_includes.h +14 -0
  714. data/ext/smoke/qtscript/smokeconfig.xml +39 -0
  715. data/ext/smoke/qtscript_smoke.h +16 -0
  716. data/ext/smoke/qtsql/CMakeLists.txt +45 -0
  717. data/ext/smoke/qtsql/config.xml.cmake +11 -0
  718. data/ext/smoke/qtsql/qtsql_includes.h +3 -0
  719. data/ext/smoke/qtsql/smokeconfig.xml +60 -0
  720. data/ext/smoke/qtsql_smoke.h +16 -0
  721. data/ext/smoke/qtsvg/CMakeLists.txt +43 -0
  722. data/ext/smoke/qtsvg/config.xml.cmake +12 -0
  723. data/ext/smoke/qtsvg/qtsvg_includes.h +3 -0
  724. data/ext/smoke/qtsvg/smokeconfig.xml +46 -0
  725. data/ext/smoke/qtsvg_smoke.h +16 -0
  726. data/ext/smoke/qttest/CMakeLists.txt +35 -0
  727. data/ext/smoke/qttest/config.xml.cmake +12 -0
  728. data/ext/smoke/qttest/qttest_includes.h +14 -0
  729. data/ext/smoke/qttest/smokeconfig.xml +36 -0
  730. data/ext/smoke/qttest_smoke.h +16 -0
  731. data/ext/smoke/qtuitools/CMakeLists.txt +30 -0
  732. data/ext/smoke/qtuitools/config.xml.cmake +12 -0
  733. data/ext/smoke/qtuitools/qtuitools_includes.h +1 -0
  734. data/ext/smoke/qtuitools/smokeconfig.xml +20 -0
  735. data/ext/smoke/qtuitools_smoke.h +16 -0
  736. data/ext/smoke/qtwebkit/CMakeLists.txt +36 -0
  737. data/ext/smoke/qtwebkit/config.xml.cmake +11 -0
  738. data/ext/smoke/qtwebkit/qtwebkit_includes.h +1 -0
  739. data/ext/smoke/qtwebkit/smokeconfig.xml +48 -0
  740. data/ext/smoke/qtwebkit_smoke.h +16 -0
  741. data/ext/smoke/qtxml/CMakeLists.txt +41 -0
  742. data/ext/smoke/qtxml/config.xml.cmake +11 -0
  743. data/ext/smoke/qtxml/qtxml_includes.h +2 -0
  744. data/ext/smoke/qtxml/smokeconfig.xml +70 -0
  745. data/ext/smoke/qtxml_smoke.h +16 -0
  746. data/ext/smoke/qtxmlpatterns/CMakeLists.txt +42 -0
  747. data/ext/smoke/qtxmlpatterns/config.xml.cmake +12 -0
  748. data/ext/smoke/qtxmlpatterns/qtxmlpatterns_includes.h +3 -0
  749. data/ext/smoke/qtxmlpatterns/smokeconfig.xml +80 -0
  750. data/ext/smoke/qtxmlpatterns_smoke.h +16 -0
  751. data/ext/smoke/smoke.h +559 -0
  752. data/ext/smoke/smokeapi/CMakeLists.txt +9 -0
  753. data/ext/smoke/smokeapi/main.cpp +309 -0
  754. data/ext/smoke/smokebase/CMakeLists.txt +11 -0
  755. data/ext/smoke/smokebase/smokebase.cpp +6 -0
  756. data/ext/smoke/solid_smoke.h +16 -0
  757. data/extconf.rb +256 -0
  758. data/lib/Qt/qtruby4.rb +3268 -0
  759. data/lib/Qt.rb +1 -0
  760. data/lib/Qt4.rb +119 -0
  761. data/lib/qtbindings_version.rb +2 -0
  762. data/lib/qtdeclarative/qtdeclarative.rb +17 -0
  763. data/lib/qtscript/qtscript.rb +40 -0
  764. data/lib/qttest/qttest.rb +166 -0
  765. data/lib/qtuitools/qtuitools.rb +17 -0
  766. data/lib/qtwebkit/qtwebkit.rb +17 -0
  767. data/rock-qtbindings.gemspec +18 -0
  768. metadata +819 -0
@@ -0,0 +1,2627 @@
1
+ /***************************************************************************
2
+ qtruby.cpp - description
3
+ -------------------
4
+ begin : Fri Jul 4 2003
5
+ copyright : (C) 2003-2006 by Richard Dale
6
+ email : Richard_Dale@tipitina.demon.co.uk
7
+ ***************************************************************************/
8
+
9
+ /***************************************************************************
10
+ * *
11
+ * This program is free software; you can redistribute it and/or modify *
12
+ * it under the terms of the GNU Lesser General Public License as *
13
+ * published by the Free Software Foundation; either version 2 of the *
14
+ * License, or (at your option) any later version. *
15
+ * *
16
+ ***************************************************************************/
17
+
18
+ #include <QtCore/qabstractitemmodel.h>
19
+ #include <QtCore/qglobal.h>
20
+ #include <QtCore/qhash.h>
21
+ #include <QtCore/qline.h>
22
+ #include <QtCore/qmetaobject.h>
23
+ #include <QtCore/qobject.h>
24
+ #include <QtCore/qrect.h>
25
+ #include <QtCore/qregexp.h>
26
+ #include <QtCore/qstring.h>
27
+ #include <QtCore/qvariant.h>
28
+ #include <QtGui/qapplication.h>
29
+ #include <QtGui/qbitmap.h>
30
+ #include <QtGui/qcolor.h>
31
+ #include <QtGui/qcursor.h>
32
+ #include <QtGui/qfont.h>
33
+ #include <QtGui/qicon.h>
34
+ #include <QtGui/qitemselectionmodel.h>
35
+ #include <QtGui/qpalette.h>
36
+ #include <QtGui/qpen.h>
37
+ #include <QtGui/qpixmap.h>
38
+ #include <QtGui/qpolygon.h>
39
+ #include <QtGui/qtextformat.h>
40
+ #include <QtGui/qwidget.h>
41
+
42
+ #ifdef QT_QTDBUS
43
+ #include <QtDBus/qdbusargument.h>
44
+ #endif
45
+
46
+ #include <smoke/smoke.h>
47
+
48
+ #include <smoke/qtcore_smoke.h>
49
+ #include <smoke/qtgui_smoke.h>
50
+ #include <smoke/qtxml_smoke.h>
51
+ #include <smoke/qtsql_smoke.h>
52
+ #include <smoke/qtopengl_smoke.h>
53
+ #include <smoke/qtnetwork_smoke.h>
54
+ #include <smoke/qtsvg_smoke.h>
55
+
56
+ #ifdef QT_QTDBUS
57
+ #include <smoke/qtdbus_smoke.h>
58
+ #endif
59
+
60
+ #include <ruby.h>
61
+ #undef read
62
+ #undef write
63
+ #undef connect
64
+ #undef accept
65
+
66
+ #include "marshall_types.h"
67
+ #include "qtruby.h"
68
+
69
+ extern bool qRegisterResourceData(int, const unsigned char *, const unsigned char *, const unsigned char *);
70
+ extern bool qUnregisterResourceData(int, const unsigned char *, const unsigned char *, const unsigned char *);
71
+
72
+ extern TypeHandler Qt_handlers[];
73
+ extern const char * resolve_classname_qt(smokeruby_object * o);
74
+
75
+ extern "C" {
76
+
77
+ static VALUE
78
+ qdebug(VALUE klass, VALUE msg)
79
+ {
80
+ qDebug("%s", StringValuePtr(msg));
81
+ return klass;
82
+ }
83
+
84
+ static VALUE
85
+ qfatal(VALUE klass, VALUE msg)
86
+ {
87
+ qFatal("%s", StringValuePtr(msg));
88
+ return klass;
89
+ }
90
+
91
+ static VALUE
92
+ qwarning(VALUE klass, VALUE msg)
93
+ {
94
+ qWarning("%s", StringValuePtr(msg));
95
+ return klass;
96
+ }
97
+
98
+ //---------- Ruby methods (for all functions except fully qualified statics & enums) ---------
99
+
100
+
101
+ // Takes a variable name and a QProperty with QVariant value, and returns a '
102
+ // variable=value' pair with the value in ruby inspect style
103
+ static QString
104
+ inspectProperty(QMetaProperty property, const char * name, QVariant & value)
105
+ {
106
+ if (property.isEnumType()) {
107
+ QMetaEnum e = property.enumerator();
108
+ return QString(" %1=%2::%3").arg(name).arg(e.scope()).arg(e.valueToKey(value.toInt()));
109
+ }
110
+
111
+ switch (value.type()) {
112
+ case QVariant::String:
113
+ {
114
+ if (value.toString().isNull()) {
115
+ return QString(" %1=nil").arg(name);
116
+ } else {
117
+ return QString(" %1=%2").arg(name).arg(value.toString());
118
+ }
119
+ }
120
+
121
+ case QVariant::Bool:
122
+ {
123
+ QString rubyName;
124
+ QRegExp name_re("^(is|has)(.)(.*)");
125
+
126
+ if (name_re.indexIn(name) != -1) {
127
+ rubyName = name_re.cap(2).toLower() + name_re.cap(3) + "?";
128
+ } else {
129
+ rubyName = name;
130
+ }
131
+
132
+ return QString(" %1=%2").arg(rubyName).arg(value.toString());
133
+ }
134
+
135
+ case QVariant::Color:
136
+ {
137
+ QColor c = value.value<QColor>();
138
+ return QString(" %1=#<Qt::Color:0x0 %2>").arg(name).arg(c.name());
139
+ }
140
+
141
+ case QVariant::Cursor:
142
+ {
143
+ QCursor c = value.value<QCursor>();
144
+ return QString(" %1=#<Qt::Cursor:0x0 shape=%2>").arg(name).arg(c.shape());
145
+ }
146
+
147
+ case QVariant::Double:
148
+ {
149
+ return QString(" %1=%2").arg(name).arg(value.toDouble());
150
+ }
151
+
152
+ case QVariant::Font:
153
+ {
154
+ QFont f = value.value<QFont>();
155
+ return QString( " %1=#<Qt::Font:0x0 family=%2, pointSize=%3, weight=%4, italic=%5, bold=%6, underline=%7, strikeOut=%8>")
156
+ .arg(name)
157
+ .arg(f.family())
158
+ .arg(f.pointSize())
159
+ .arg(f.weight())
160
+ .arg(f.italic() ? "true" : "false")
161
+ .arg(f.bold() ? "true" : "false")
162
+ .arg(f.underline() ? "true" : "false")
163
+ .arg(f.strikeOut() ? "true" : "false");
164
+ }
165
+
166
+ case QVariant::Line:
167
+ {
168
+ QLine l = value.toLine();
169
+ return QString(" %1=#<Qt::Line:0x0 x1=%2, y1=%3, x2=%4, y2=%5>")
170
+ .arg(name)
171
+ .arg(l.x1())
172
+ .arg(l.y1())
173
+ .arg(l.x2())
174
+ .arg(l.y2());
175
+ }
176
+
177
+ case QVariant::LineF:
178
+ {
179
+ QLineF l = value.toLineF();
180
+ return QString(" %1=#<Qt::LineF:0x0 x1=%2, y1=%3, x2=%4, y2=%5>")
181
+ .arg(name)
182
+ .arg(l.x1())
183
+ .arg(l.y1())
184
+ .arg(l.x2())
185
+ .arg(l.y2());
186
+ }
187
+
188
+ case QVariant::Point:
189
+ {
190
+ QPoint p = value.toPoint();
191
+ return QString(" %1=#<Qt::Point:0x0 x=%2, y=%3>").arg(name).arg(p.x()).arg(p.y());
192
+ }
193
+
194
+ case QVariant::PointF:
195
+ {
196
+ QPointF p = value.toPointF();
197
+ return QString(" %1=#<Qt::PointF:0x0 x=%2, y=%3>").arg(name).arg(p.x()).arg(p.y());
198
+ }
199
+
200
+ case QVariant::Rect:
201
+ {
202
+ QRect r = value.toRect();
203
+ return QString(" %1=#<Qt::Rect:0x0 left=%2, right=%3, top=%4, bottom=%5>")
204
+ .arg(name)
205
+ .arg(r.left()).arg(r.right()).arg(r.top()).arg(r.bottom());
206
+ }
207
+
208
+ case QVariant::RectF:
209
+ {
210
+ QRectF r = value.toRectF();
211
+ return QString(" %1=#<Qt::RectF:0x0 left=%2, right=%3, top=%4, bottom=%5>")
212
+ .arg(name)
213
+ .arg(r.left()).arg(r.right()).arg(r.top()).arg(r.bottom());
214
+ }
215
+
216
+ case QVariant::Size:
217
+ {
218
+ QSize s = value.toSize();
219
+ return QString(" %1=#<Qt::Size:0x0 width=%2, height=%3>")
220
+ .arg(name)
221
+ .arg(s.width()).arg(s.height());
222
+ }
223
+
224
+ case QVariant::SizeF:
225
+ {
226
+ QSizeF s = value.toSizeF();
227
+ return QString(" %1=#<Qt::SizeF:0x0 width=%2, height=%3>")
228
+ .arg(name)
229
+ .arg(s.width()).arg(s.height());
230
+ }
231
+
232
+ case QVariant::SizePolicy:
233
+ {
234
+ QSizePolicy s = value.value<QSizePolicy>();
235
+ return QString(" %1=#<Qt::SizePolicy:0x0 horizontalPolicy=%2, verticalPolicy=%3>")
236
+ .arg(name)
237
+ .arg(s.horizontalPolicy())
238
+ .arg(s.verticalPolicy());
239
+ }
240
+
241
+ case QVariant::Brush:
242
+ // case QVariant::ColorGroup:
243
+ case QVariant::Image:
244
+ case QVariant::Palette:
245
+ case QVariant::Pixmap:
246
+ case QVariant::Region:
247
+ {
248
+ return QString(" %1=#<Qt::%2:0x0>").arg(name).arg(value.typeName() + 1);
249
+ }
250
+
251
+ default:
252
+ return QString(" %1=%2").arg(name)
253
+ .arg((value.isNull() || value.toString().isNull()) ? "nil" : value.toString() );
254
+ }
255
+ }
256
+
257
+ // Retrieves the properties for a QObject and returns them as 'name=value' pairs
258
+ // in a ruby inspect string. For example:
259
+ //
260
+ // #<Qt::HBoxLayout:0x30139030 name=unnamed, margin=0, spacing=0, resizeMode=3>
261
+ //
262
+ static VALUE
263
+ inspect_qobject(VALUE self)
264
+ {
265
+ if (TYPE(self) != T_DATA) {
266
+ return Qnil;
267
+ }
268
+
269
+ // Start with #<Qt::HBoxLayout:0x30139030> from the original inspect() call
270
+ // Drop the closing '>'
271
+ VALUE inspect_str = rb_call_super(0, 0);
272
+ rb_str_resize(inspect_str, RSTRING_LEN(inspect_str) - 1);
273
+
274
+ smokeruby_object * o = 0;
275
+ Data_Get_Struct(self, smokeruby_object, o);
276
+ QObject * qobject = (QObject *) o->smoke->cast(o->ptr, o->classId, o->smoke->idClass("QObject").index);
277
+
278
+ QString value_list;
279
+ value_list.append(QString(" objectName=\"%1\"").arg(qobject->objectName()));
280
+
281
+ if (qobject->isWidgetType()) {
282
+ QWidget * w = (QWidget *) qobject;
283
+ value_list.append(QString(", x=%1, y=%2, width=%3, height=%4")
284
+ .arg(w->x())
285
+ .arg(w->y())
286
+ .arg(w->width())
287
+ .arg(w->height()) );
288
+ }
289
+
290
+ value_list.append(">");
291
+ rb_str_cat2(inspect_str, value_list.toLatin1());
292
+
293
+ return inspect_str;
294
+ }
295
+
296
+ // Retrieves the properties for a QObject and pretty_prints them as 'name=value' pairs
297
+ // For example:
298
+ //
299
+ // #<Qt::HBoxLayout:0x30139030
300
+ // name=unnamed,
301
+ // margin=0,
302
+ // spacing=0,
303
+ // resizeMode=3>
304
+ //
305
+ static VALUE
306
+ pretty_print_qobject(VALUE self, VALUE pp)
307
+ {
308
+ if (TYPE(self) != T_DATA) {
309
+ return Qnil;
310
+ }
311
+
312
+ // Start with #<Qt::HBoxLayout:0x30139030>
313
+ // Drop the closing '>'
314
+ VALUE inspect_str = rb_funcall(self, rb_intern("to_s"), 0, 0);
315
+ rb_str_resize(inspect_str, RSTRING_LEN(inspect_str) - 1);
316
+ rb_funcall(pp, rb_intern("text"), 1, inspect_str);
317
+ rb_funcall(pp, rb_intern("breakable"), 0);
318
+
319
+ smokeruby_object * o = 0;
320
+ Data_Get_Struct(self, smokeruby_object, o);
321
+ QObject * qobject = (QObject *) o->smoke->cast(o->ptr, o->classId, o->smoke->idClass("QObject").index);
322
+
323
+ QString value_list;
324
+
325
+ if (qobject->parent() != 0) {
326
+ QString parentInspectString;
327
+ VALUE obj = getPointerObject(qobject->parent());
328
+ if (obj != Qnil) {
329
+ VALUE parent_inspect_str = rb_funcall(obj, rb_intern("to_s"), 0, 0);
330
+ rb_str_resize(parent_inspect_str, RSTRING_LEN(parent_inspect_str) - 1);
331
+ parentInspectString = StringValuePtr(parent_inspect_str);
332
+ } else {
333
+ parentInspectString.sprintf("#<%s:0x0", qobject->parent()->metaObject()->className());
334
+ }
335
+
336
+ if (qobject->parent()->isWidgetType()) {
337
+ QWidget * w = (QWidget *) qobject->parent();
338
+ value_list = QString(" parent=%1 objectName=\"%2\", x=%3, y=%4, width=%5, height=%6>,\n")
339
+ .arg(parentInspectString)
340
+ .arg(w->objectName())
341
+ .arg(w->x())
342
+ .arg(w->y())
343
+ .arg(w->width())
344
+ .arg(w->height());
345
+ } else {
346
+ value_list = QString(" parent=%1 objectName=\"%2\">,\n")
347
+ .arg(parentInspectString)
348
+ .arg(qobject->parent()->objectName());
349
+ }
350
+
351
+ rb_funcall(pp, rb_intern("text"), 1, rb_str_new2(value_list.toLatin1()));
352
+ }
353
+
354
+ if (qobject->children().count() != 0) {
355
+ value_list = QString(" children=Array (%1 element(s)),\n")
356
+ .arg(qobject->children().count());
357
+ rb_funcall(pp, rb_intern("text"), 1, rb_str_new2(value_list.toLatin1()));
358
+ }
359
+
360
+ value_list = QString(" metaObject=#<Qt::MetaObject:0x0");
361
+ value_list.append(QString(" className=%1").arg(qobject->metaObject()->className()));
362
+
363
+ if (qobject->metaObject()->superClass() != 0) {
364
+ value_list.append( QString(", superClass=#<Qt::MetaObject:0x0 className=%1>")
365
+ .arg(qobject->metaObject()->superClass()->className()) );
366
+ }
367
+
368
+ value_list.append(">,\n");
369
+ rb_funcall(pp, rb_intern("text"), 1, rb_str_new2(value_list.toLatin1()));
370
+
371
+ QMetaProperty property = qobject->metaObject()->property(0);
372
+ QVariant value = property.read(qobject);
373
+ value_list = " " + inspectProperty(property, property.name(), value);
374
+ rb_funcall(pp, rb_intern("text"), 1, rb_str_new2(value_list.toLatin1()));
375
+
376
+ for (int index = 1; index < qobject->metaObject()->propertyCount(); index++) {
377
+ rb_funcall(pp, rb_intern("text"), 1, rb_str_new2(",\n"));
378
+
379
+ property = qobject->metaObject()->property(index);
380
+ value = property.read(qobject);
381
+ value_list = " " + inspectProperty(property, property.name(), value);
382
+ rb_funcall(pp, rb_intern("text"), 1, rb_str_new2(value_list.toLatin1()));
383
+ }
384
+
385
+ rb_funcall(pp, rb_intern("text"), 1, rb_str_new2(">"));
386
+
387
+ return self;
388
+ }
389
+
390
+ static VALUE
391
+ q_register_resource_data(VALUE /*self*/, VALUE version, VALUE tree_value, VALUE name_value, VALUE data_value)
392
+ {
393
+ const unsigned char * tree = (const unsigned char *) malloc(RSTRING_LEN(tree_value));
394
+ memcpy((void *) tree, (const void *) RSTRING_PTR(tree_value), RSTRING_LEN(tree_value));
395
+
396
+ const unsigned char * name = (const unsigned char *) malloc(RSTRING_LEN(name_value));
397
+ memcpy((void *) name, (const void *) RSTRING_PTR(name_value), RSTRING_LEN(name_value));
398
+
399
+ const unsigned char * data = (const unsigned char *) malloc(RSTRING_LEN(data_value));
400
+ memcpy((void *) data, (const void *) RSTRING_PTR(data_value), RSTRING_LEN(data_value));
401
+
402
+ return qRegisterResourceData(NUM2INT(version), tree, name, data) ? Qtrue : Qfalse;
403
+ }
404
+
405
+ static VALUE
406
+ q_unregister_resource_data(VALUE /*self*/, VALUE version, VALUE tree_value, VALUE name_value, VALUE data_value)
407
+ {
408
+ const unsigned char * tree = (const unsigned char *) malloc(RSTRING_LEN(tree_value));
409
+ memcpy((void *) tree, (const void *) RSTRING_PTR(tree_value), RSTRING_LEN(tree_value));
410
+
411
+ const unsigned char * name = (const unsigned char *) malloc(RSTRING_LEN(name_value));
412
+ memcpy((void *) name, (const void *) RSTRING_PTR(name_value), RSTRING_LEN(name_value));
413
+
414
+ const unsigned char * data = (const unsigned char *) malloc(RSTRING_LEN(data_value));
415
+ memcpy((void *) data, (const void *) RSTRING_PTR(data_value), RSTRING_LEN(data_value));
416
+
417
+ return qUnregisterResourceData(NUM2INT(version), tree, name, data) ? Qtrue : Qfalse;
418
+ }
419
+
420
+ static VALUE
421
+ qabstract_item_model_rowcount(int argc, VALUE * argv, VALUE self)
422
+ {
423
+ smokeruby_object *o = value_obj_info(self);
424
+ QAbstractItemModel * model = (QAbstractItemModel *) o->ptr;
425
+ if (argc == 0) {
426
+ return INT2NUM(model->rowCount());
427
+ }
428
+
429
+ if (argc == 1) {
430
+ smokeruby_object * mi = value_obj_info(argv[0]);
431
+ QModelIndex * modelIndex = (QModelIndex *) mi->ptr;
432
+ return INT2NUM(model->rowCount(*modelIndex));
433
+ }
434
+
435
+ rb_raise(rb_eArgError, "Invalid argument list");
436
+ }
437
+
438
+ static VALUE
439
+ qabstract_item_model_columncount(int argc, VALUE * argv, VALUE self)
440
+ {
441
+ smokeruby_object *o = value_obj_info(self);
442
+ QAbstractItemModel * model = (QAbstractItemModel *) o->ptr;
443
+ if (argc == 0) {
444
+ return INT2NUM(model->columnCount());
445
+ }
446
+
447
+ if (argc == 1) {
448
+ smokeruby_object * mi = value_obj_info(argv[0]);
449
+ QModelIndex * modelIndex = (QModelIndex *) mi->ptr;
450
+ return INT2NUM(model->columnCount(*modelIndex));
451
+ }
452
+
453
+ rb_raise(rb_eArgError, "Invalid argument list");
454
+ }
455
+
456
+ static VALUE
457
+ qabstract_item_model_data(int argc, VALUE * argv, VALUE self)
458
+ {
459
+ smokeruby_object * o = value_obj_info(self);
460
+ QAbstractItemModel * model = (QAbstractItemModel *) o->ptr;
461
+ smokeruby_object * mi = value_obj_info(argv[0]);
462
+ QModelIndex * modelIndex = (QModelIndex *) mi->ptr;
463
+ QVariant value;
464
+ if (argc == 1) {
465
+ value = model->data(*modelIndex);
466
+ } else if (argc == 2) {
467
+ value = model->data(*modelIndex, NUM2INT(rb_funcall(argv[1], rb_intern("to_i"), 0)));
468
+ } else {
469
+ rb_raise(rb_eArgError, "Invalid argument list");
470
+ }
471
+
472
+
473
+ smokeruby_object * result = alloc_smokeruby_object( true,
474
+ o->smoke,
475
+ o->smoke->findClass("QVariant").index,
476
+ new QVariant(value) );
477
+ return set_obj_info("Qt::Variant", result);
478
+ }
479
+
480
+ static VALUE
481
+ qabstract_item_model_setdata(int argc, VALUE * argv, VALUE self)
482
+ {
483
+ smokeruby_object *o = value_obj_info(self);
484
+ QAbstractItemModel * model = (QAbstractItemModel *) o->ptr;
485
+ smokeruby_object * mi = value_obj_info(argv[0]);
486
+ QModelIndex * modelIndex = (QModelIndex *) mi->ptr;
487
+ smokeruby_object * v = value_obj_info(argv[1]);
488
+ QVariant * variant = (QVariant *) v->ptr;
489
+
490
+ if (argc == 2) {
491
+ return (model->setData(*modelIndex, *variant) ? Qtrue : Qfalse);
492
+ }
493
+
494
+ if (argc == 3) {
495
+ return (model->setData( *modelIndex,
496
+ *variant,
497
+ NUM2INT(rb_funcall(argv[2], rb_intern("to_i"), 0)) ) ? Qtrue : Qfalse);
498
+ }
499
+
500
+ rb_raise(rb_eArgError, "Invalid argument list");
501
+ }
502
+
503
+ static VALUE
504
+ qabstract_item_model_flags(VALUE self, VALUE model_index)
505
+ {
506
+ smokeruby_object *o = value_obj_info(self);
507
+ QAbstractItemModel * model = (QAbstractItemModel *) o->ptr;
508
+ smokeruby_object * mi = value_obj_info(model_index);
509
+ const QModelIndex * modelIndex = (const QModelIndex *) mi->ptr;
510
+ return INT2NUM((int) model->flags(*modelIndex));
511
+ }
512
+
513
+ static VALUE
514
+ qabstract_item_model_insertrows(int argc, VALUE * argv, VALUE self)
515
+ {
516
+ smokeruby_object *o = value_obj_info(self);
517
+ QAbstractItemModel * model = (QAbstractItemModel *) o->ptr;
518
+
519
+ if (argc == 2) {
520
+ return (model->insertRows(NUM2INT(argv[0]), NUM2INT(argv[1])) ? Qtrue : Qfalse);
521
+ }
522
+
523
+ if (argc == 3) {
524
+ smokeruby_object * mi = value_obj_info(argv[2]);
525
+ const QModelIndex * modelIndex = (const QModelIndex *) mi->ptr;
526
+ return (model->insertRows(NUM2INT(argv[0]), NUM2INT(argv[1]), *modelIndex) ? Qtrue : Qfalse);
527
+ }
528
+
529
+ rb_raise(rb_eArgError, "Invalid argument list");
530
+ }
531
+
532
+ static VALUE
533
+ qabstract_item_model_insertcolumns(int argc, VALUE * argv, VALUE self)
534
+ {
535
+ smokeruby_object *o = value_obj_info(self);
536
+ QAbstractItemModel * model = (QAbstractItemModel *) o->ptr;
537
+
538
+ if (argc == 2) {
539
+ return (model->insertColumns(NUM2INT(argv[0]), NUM2INT(argv[1])) ? Qtrue : Qfalse);
540
+ }
541
+
542
+ if (argc == 3) {
543
+ smokeruby_object * mi = value_obj_info(argv[2]);
544
+ const QModelIndex * modelIndex = (const QModelIndex *) mi->ptr;
545
+ return (model->insertColumns(NUM2INT(argv[0]), NUM2INT(argv[1]), *modelIndex) ? Qtrue : Qfalse);
546
+ }
547
+
548
+ rb_raise(rb_eArgError, "Invalid argument list");
549
+ }
550
+
551
+ static VALUE
552
+ qabstract_item_model_removerows(int argc, VALUE * argv, VALUE self)
553
+ {
554
+ smokeruby_object *o = value_obj_info(self);
555
+ QAbstractItemModel * model = (QAbstractItemModel *) o->ptr;
556
+
557
+ if (argc == 2) {
558
+ return (model->removeRows(NUM2INT(argv[0]), NUM2INT(argv[1])) ? Qtrue : Qfalse);
559
+ }
560
+
561
+ if (argc == 3) {
562
+ smokeruby_object * mi = value_obj_info(argv[2]);
563
+ const QModelIndex * modelIndex = (const QModelIndex *) mi->ptr;
564
+ return (model->removeRows(NUM2INT(argv[0]), NUM2INT(argv[1]), *modelIndex) ? Qtrue : Qfalse);
565
+ }
566
+
567
+ rb_raise(rb_eArgError, "Invalid argument list");
568
+ }
569
+
570
+ static VALUE
571
+ qabstract_item_model_removecolumns(int argc, VALUE * argv, VALUE self)
572
+ {
573
+ smokeruby_object *o = value_obj_info(self);
574
+ QAbstractItemModel * model = (QAbstractItemModel *) o->ptr;
575
+
576
+ if (argc == 2) {
577
+ return (model->removeColumns(NUM2INT(argv[0]), NUM2INT(argv[1])) ? Qtrue : Qfalse);
578
+ }
579
+
580
+ if (argc == 3) {
581
+ smokeruby_object * mi = value_obj_info(argv[2]);
582
+ const QModelIndex * modelIndex = (const QModelIndex *) mi->ptr;
583
+ return (model->removeRows(NUM2INT(argv[0]), NUM2INT(argv[1]), *modelIndex) ? Qtrue : Qfalse);
584
+ }
585
+
586
+ rb_raise(rb_eArgError, "Invalid argument list");
587
+ }
588
+
589
+ // There is a QByteArray operator method in the Smoke lib that takes a QString
590
+ // arg and returns a QString. This is normally the desired behaviour, so
591
+ // special case a '+' method here.
592
+ static VALUE
593
+ qbytearray_append(VALUE self, VALUE str)
594
+ {
595
+ smokeruby_object *o = value_obj_info(self);
596
+ QByteArray * bytes = (QByteArray *) o->ptr;
597
+ (*bytes) += (const char *) StringValuePtr(str);
598
+ return self;
599
+ }
600
+
601
+ static VALUE
602
+ qbytearray_data(VALUE self)
603
+ {
604
+ smokeruby_object *o = value_obj_info(self);
605
+ QByteArray * bytes = (QByteArray *) o->ptr;
606
+ return rb_str_new(bytes->data(), bytes->size());
607
+ }
608
+
609
+ static VALUE
610
+ qimage_bits(VALUE self)
611
+ {
612
+ smokeruby_object *o = value_obj_info(self);
613
+ QImage * image = static_cast<QImage *>(o->ptr);
614
+ const uchar * bytes = image->bits();
615
+ return rb_str_new((const char *) bytes, image->numBytes());
616
+ }
617
+
618
+ static VALUE
619
+ qimage_scan_line(VALUE self, VALUE ix)
620
+ {
621
+ smokeruby_object *o = value_obj_info(self);
622
+ QImage * image = static_cast<QImage *>(o->ptr);
623
+ const uchar * bytes = image->scanLine(NUM2INT(ix));
624
+ return rb_str_new((const char *) bytes, image->bytesPerLine());
625
+ }
626
+
627
+ #ifdef QT_QTDBUS
628
+ static VALUE
629
+ qdbusargument_endarraywrite(VALUE self)
630
+ {
631
+ smokeruby_object *o = value_obj_info(self);
632
+ QDBusArgument * arg = (QDBusArgument *) o->ptr;
633
+ arg->endArray();
634
+ return self;
635
+ }
636
+
637
+ static VALUE
638
+ qdbusargument_endmapwrite(VALUE self)
639
+ {
640
+ smokeruby_object *o = value_obj_info(self);
641
+ QDBusArgument * arg = (QDBusArgument *) o->ptr;
642
+ arg->endMap();
643
+ return self;
644
+ }
645
+
646
+ static VALUE
647
+ qdbusargument_endmapentrywrite(VALUE self)
648
+ {
649
+ smokeruby_object *o = value_obj_info(self);
650
+ QDBusArgument * arg = (QDBusArgument *) o->ptr;
651
+ arg->endMapEntry();
652
+ return self;
653
+ }
654
+
655
+ static VALUE
656
+ qdbusargument_endstructurewrite(VALUE self)
657
+ {
658
+ smokeruby_object *o = value_obj_info(self);
659
+ QDBusArgument * arg = (QDBusArgument *) o->ptr;
660
+ arg->endStructure();
661
+ return self;
662
+ }
663
+
664
+ #endif
665
+
666
+ // The QtRuby runtime's overloaded method resolution mechanism can't currently
667
+ // distinguish between Ruby Arrays containing different sort of instances.
668
+ // Unfortunately Qt::Painter.drawLines() and Qt::Painter.drawRects() methods can
669
+ // be passed a Ruby Array as an argument containing either Qt::Points or Qt::PointFs
670
+ // for instance. These methods need to call the correct Qt C++ methods, so special case
671
+ // the overload method resolution for now..
672
+ static VALUE
673
+ qpainter_drawlines(int argc, VALUE * argv, VALUE self)
674
+ {
675
+ static Smoke::Index drawlines_pointf_vector = 0;
676
+ static Smoke::Index drawlines_point_vector = 0;
677
+ static Smoke::Index drawlines_linef_vector = 0;
678
+ static Smoke::Index drawlines_line_vector = 0;
679
+
680
+ if (argc == 1 && TYPE(argv[0]) == T_ARRAY && RARRAY_LEN(argv[0]) > 0) {
681
+ if (drawlines_point_vector == 0) {
682
+ Smoke::ModuleIndex nameId = qtcore_Smoke->findMethodName("QPainter", "drawLines?");
683
+ Smoke::ModuleIndex meth = qtcore_Smoke->findMethod(qtcore_Smoke->findClass("QPainter"), nameId);
684
+ Smoke::Index i = meth.smoke->methodMaps[meth.index].method;
685
+ i = -i; // turn into ambiguousMethodList index
686
+ while (meth.smoke->ambiguousMethodList[i] != 0) {
687
+ const char * argType = meth.smoke->types[meth.smoke->argumentList[meth.smoke->methods[meth.smoke->ambiguousMethodList[i]].args]].name;
688
+
689
+ if (qstrcmp(argType, "const QVector<QPointF>&" ) == 0) {
690
+ drawlines_pointf_vector = meth.smoke->ambiguousMethodList[i];
691
+ } else if (qstrcmp(argType, "const QVector<QPoint>&" ) == 0) {
692
+ drawlines_point_vector = meth.smoke->ambiguousMethodList[i];
693
+ } else if (qstrcmp(argType, "const QVector<QLineF>&" ) == 0) {
694
+ drawlines_linef_vector = meth.smoke->ambiguousMethodList[i];
695
+ } else if (qstrcmp(argType, "const QVector<QLine>&" ) == 0) {
696
+ drawlines_line_vector = meth.smoke->ambiguousMethodList[i];
697
+ }
698
+
699
+ i++;
700
+ }
701
+ }
702
+
703
+ smokeruby_object * o = value_obj_info(rb_ary_entry(argv[0], 0));
704
+
705
+ if (qstrcmp(o->smoke->classes[o->classId].className, "QPointF") == 0) {
706
+ _current_method.smoke = qtcore_Smoke;
707
+ _current_method.index = drawlines_pointf_vector;
708
+ } else if (qstrcmp(o->smoke->classes[o->classId].className, "QPoint") == 0) {
709
+ _current_method.smoke = qtcore_Smoke;
710
+ _current_method.index = drawlines_point_vector;
711
+ } else if (qstrcmp(o->smoke->classes[o->classId].className, "QLineF") == 0) {
712
+ _current_method.smoke = qtcore_Smoke;
713
+ _current_method.index = drawlines_linef_vector;
714
+ } else if (qstrcmp(o->smoke->classes[o->classId].className, "QLine") == 0) {
715
+ _current_method.smoke = qtcore_Smoke;
716
+ _current_method.index = drawlines_line_vector;
717
+ } else {
718
+ return rb_call_super(argc, argv);
719
+ }
720
+
721
+ QtRuby::MethodCall c(qtcore_Smoke, _current_method.index, self, argv, argc-1);
722
+ c.next();
723
+ return self;
724
+ }
725
+
726
+ return rb_call_super(argc, argv);
727
+ }
728
+
729
+ static VALUE
730
+ qpainter_drawrects(int argc, VALUE * argv, VALUE self)
731
+ {
732
+ static Smoke::Index drawlines_rectf_vector = 0;
733
+ static Smoke::Index drawlines_rect_vector = 0;
734
+
735
+ if (argc == 1 && TYPE(argv[0]) == T_ARRAY && RARRAY_LEN(argv[0]) > 0) {
736
+ if (drawlines_rectf_vector == 0) {
737
+ Smoke::ModuleIndex nameId = qtcore_Smoke->findMethodName("QPainter", "drawRects?");
738
+ Smoke::ModuleIndex meth = qtcore_Smoke->findMethod(qtcore_Smoke->findClass("QPainter"), nameId);
739
+ Smoke::Index i = meth.smoke->methodMaps[meth.index].method;
740
+ i = -i; // turn into ambiguousMethodList index
741
+ while (meth.smoke->ambiguousMethodList[i] != 0) {
742
+ const char * argType = meth.smoke->types[meth.smoke->argumentList[meth.smoke->methods[meth.smoke->ambiguousMethodList[i]].args]].name;
743
+
744
+ if (qstrcmp(argType, "const QVector<QRectF>&" ) == 0) {
745
+ drawlines_rectf_vector = meth.smoke->ambiguousMethodList[i];
746
+ } else if (qstrcmp(argType, "const QVector<QRect>&" ) == 0) {
747
+ drawlines_rect_vector = meth.smoke->ambiguousMethodList[i];
748
+ }
749
+
750
+ i++;
751
+ }
752
+ }
753
+
754
+ smokeruby_object * o = value_obj_info(rb_ary_entry(argv[0], 0));
755
+
756
+ if (qstrcmp(o->smoke->classes[o->classId].className, "QRectF") == 0) {
757
+ _current_method.smoke = qtcore_Smoke;
758
+ _current_method.index = drawlines_rectf_vector;
759
+ } else if (qstrcmp(o->smoke->classes[o->classId].className, "QRect") == 0) {
760
+ _current_method.smoke = qtcore_Smoke;
761
+ _current_method.index = drawlines_rect_vector;
762
+ } else {
763
+ return rb_call_super(argc, argv);
764
+ }
765
+
766
+ QtRuby::MethodCall c(qtcore_Smoke, _current_method.index, self, argv, argc-1);
767
+ c.next();
768
+ return self;
769
+ }
770
+
771
+ return rb_call_super(argc, argv);
772
+ }
773
+
774
+ static VALUE
775
+ qabstractitemmodel_createindex(int argc, VALUE * argv, VALUE self)
776
+ {
777
+ if (argc == 2 || argc == 3) {
778
+ smokeruby_object * o = value_obj_info(self);
779
+ Smoke::ModuleIndex nameId = o->smoke->idMethodName("createIndex$$$");
780
+ Smoke::ModuleIndex meth = o->smoke->findMethod(qtcore_Smoke->findClass("QAbstractItemModel"), nameId);
781
+ Smoke::Index i = meth.smoke->methodMaps[meth.index].method;
782
+ i = -i; // turn into ambiguousMethodList index
783
+ while (o->smoke->ambiguousMethodList[i] != 0) {
784
+ if ( qstrcmp( o->smoke->types[o->smoke->argumentList[o->smoke->methods[o->smoke->ambiguousMethodList[i]].args + 2]].name,
785
+ "void*" ) == 0 )
786
+ {
787
+ const Smoke::Method &m = o->smoke->methods[o->smoke->ambiguousMethodList[i]];
788
+ Smoke::ClassFn fn = o->smoke->classes[m.classId].classFn;
789
+ Smoke::StackItem stack[4];
790
+ stack[1].s_int = NUM2INT(argv[0]);
791
+ stack[2].s_int = NUM2INT(argv[1]);
792
+ if (argc == 2) {
793
+ stack[3].s_voidp = (void*) Qnil;
794
+ } else {
795
+ stack[3].s_voidp = (void*) argv[2];
796
+ }
797
+ (*fn)(m.method, o->ptr, stack);
798
+ smokeruby_object * result = alloc_smokeruby_object( true,
799
+ o->smoke,
800
+ o->smoke->idClass("QModelIndex").index,
801
+ stack[0].s_voidp );
802
+
803
+ return set_obj_info("Qt::ModelIndex", result);
804
+ }
805
+
806
+ i++;
807
+ }
808
+ }
809
+
810
+ return rb_call_super(argc, argv);
811
+ }
812
+
813
+ #if QT_VERSION >= 0x040600
814
+ // copy the role names defined on the model instance into a ruby hash and return it
815
+ static VALUE
816
+ qabstractitemmodel_rolenames(int argc, VALUE * argv, VALUE self)
817
+ {
818
+ smokeruby_object *o = value_obj_info(self);
819
+ if( !o->ptr )
820
+ {
821
+ // not ok
822
+ rb_raise(rb_eArgError, "NULL given, expected subclass of QAbstractItemModel");
823
+ }
824
+
825
+ QAbstractItemModel* model = (QAbstractItemModel*) o->ptr;
826
+
827
+ // convert QHash<int,QByteArray> to a ruby hash
828
+ VALUE result = rb_hash_new();
829
+ QHash<int, QByteArray>::const_iterator i;
830
+ for( i = model->roleNames().constBegin(); i != model->roleNames().constEnd(); i++)
831
+ {
832
+ rb_hash_aset(result,
833
+ INT2NUM(i.key()),
834
+ rb_str_new2(i.value().data()));
835
+ }
836
+
837
+ return result;
838
+ }
839
+
840
+ // let C++ call a protected member function from outside
841
+ // NOTE: a little hacky, but setRoleNames is deprecated in Qt 5.0, anyway...
842
+ struct SetRoleNamesExposer : QAbstractItemModel {
843
+ using QAbstractItemModel::setRoleNames;
844
+ };
845
+
846
+ // set the role names on the given model instance from the given hash
847
+ static VALUE
848
+ qabstractitemmodel_setrolenames(int argc, VALUE * argv, VALUE self)
849
+ {
850
+ if( argc != 1 || TYPE(argv[0]) != T_HASH )
851
+ {
852
+ rb_raise(rb_eArgError, "Invalid arguments");
853
+ }
854
+
855
+ // convert the ruby hash to a QHash<int,QByteArray>
856
+ QHash<int,QByteArray> rnames;
857
+ VALUE tmp = rb_funcall(argv[0], rb_intern("to_a"), 0);
858
+ for( long i=0; i<RARRAY_LEN(tmp); i++)
859
+ {
860
+ VALUE key = rb_ary_entry(rb_ary_entry(tmp, i), 0);
861
+ VALUE val = rb_ary_entry(rb_ary_entry(tmp, i), 1);
862
+ rnames[NUM2INT(key)] = QByteArray(StringValuePtr(val));
863
+ }
864
+
865
+ smokeruby_object *o = value_obj_info(self);
866
+ if( !o->ptr )
867
+ {
868
+ // not ok
869
+ rb_raise(rb_eArgError, "NULL given, expected subclass of QAbstractItemModel");
870
+ }
871
+
872
+ QAbstractItemModel* model = (QAbstractItemModel*) o->ptr;
873
+ (model->*&SetRoleNamesExposer::setRoleNames)(rnames); // just a little hacky, since
874
+ // 'setRoleNames' is protected
875
+
876
+ return Qnil;
877
+ }
878
+ #endif
879
+
880
+ static VALUE
881
+ qmodelindex_internalpointer(VALUE self)
882
+ {
883
+ smokeruby_object *o = value_obj_info(self);
884
+ QModelIndex * index = (QModelIndex *) o->ptr;
885
+ void * ptr = index->internalPointer();
886
+ return ptr != 0 ? (VALUE) ptr : Qnil;
887
+ }
888
+
889
+ static VALUE
890
+ qitemselection_at(VALUE self, VALUE i)
891
+ {
892
+ smokeruby_object *o = value_obj_info(self);
893
+ QItemSelection * item = (QItemSelection *) o->ptr;
894
+ QItemSelectionRange range = item->at(NUM2INT(i));
895
+
896
+ smokeruby_object * result = alloc_smokeruby_object( true,
897
+ o->smoke,
898
+ o->smoke->idClass("QItemSelectionRange").index,
899
+ new QItemSelectionRange(range) );
900
+
901
+ return set_obj_info("Qt::ItemSelectionRange", result);
902
+ }
903
+
904
+ static VALUE
905
+ qitemselection_count(VALUE self)
906
+ {
907
+ smokeruby_object *o = value_obj_info(self);
908
+ QItemSelection * item = (QItemSelection *) o->ptr;
909
+ return INT2NUM(item->count());
910
+ }
911
+
912
+ static VALUE
913
+ qpolygon_at(VALUE self, VALUE i)
914
+ {
915
+ smokeruby_object *o = value_obj_info(self);
916
+ QPolygon * item = (QPolygon *) o->ptr;
917
+ QPoint point = item->at(NUM2INT(i));
918
+
919
+ smokeruby_object * result = alloc_smokeruby_object( true,
920
+ qtcore_Smoke,
921
+ qtcore_Smoke->idClass("QPoint").index,
922
+ new QPoint(point) );
923
+
924
+ return set_obj_info("Qt::Point", result);
925
+ }
926
+
927
+ static VALUE
928
+ qpolygon_count(VALUE self)
929
+ {
930
+ smokeruby_object *o = value_obj_info(self);
931
+ QPolygon * item = (QPolygon *) o->ptr;
932
+ return INT2NUM(item->count());
933
+ }
934
+
935
+ static VALUE
936
+ qpolygonf_at(VALUE self, VALUE i)
937
+ {
938
+ smokeruby_object *o = value_obj_info(self);
939
+ QPolygonF * item = (QPolygonF *) o->ptr;
940
+ QPointF point = item->at(NUM2INT(i));
941
+
942
+ smokeruby_object * result = alloc_smokeruby_object( true,
943
+ qtcore_Smoke,
944
+ qtcore_Smoke->idClass("QPointF").index,
945
+ new QPointF(point) );
946
+
947
+ return set_obj_info("Qt::PointF", result);
948
+ }
949
+
950
+ static VALUE
951
+ qpolygonf_count(VALUE self)
952
+ {
953
+ smokeruby_object *o = value_obj_info(self);
954
+ QPolygonF * item = (QPolygonF *) o->ptr;
955
+ return INT2NUM(item->count());
956
+ }
957
+
958
+ static VALUE
959
+ metaObject(VALUE self)
960
+ {
961
+ VALUE metaObject = rb_funcall(qt_internal_module, rb_intern("getMetaObject"), 2, Qnil, self);
962
+ return metaObject;
963
+ }
964
+
965
+ /* This shouldn't be needed, but kalyptus doesn't generate a staticMetaObject
966
+ method for QObject::staticMetaObject, although it does for all the other
967
+ classes, and it isn't obvious what the problem with it is.
968
+ So add this as a hack to work round the bug.
969
+ */
970
+ static VALUE
971
+ qobject_staticmetaobject(VALUE /*klass*/)
972
+ {
973
+ QMetaObject * meta = new QMetaObject(QObject::staticMetaObject);
974
+
975
+ smokeruby_object * m = alloc_smokeruby_object( true,
976
+ qtcore_Smoke,
977
+ qtcore_Smoke->idClass("QMetaObject").index,
978
+ meta );
979
+
980
+ VALUE obj = set_obj_info("Qt::MetaObject", m);
981
+ return obj;
982
+ }
983
+
984
+ static VALUE
985
+ cast_object_to(VALUE /*self*/, VALUE object, VALUE new_klass)
986
+ {
987
+ smokeruby_object *o = value_obj_info(object);
988
+
989
+ VALUE new_klassname = rb_funcall(new_klass, rb_intern("name"), 0);
990
+
991
+ Smoke::ModuleIndex * cast_to_id = classcache.value(StringValuePtr(new_klassname));
992
+ if (cast_to_id == 0) {
993
+ rb_raise(rb_eArgError, "unable to find class \"%s\" to cast to\n", StringValuePtr(new_klassname));
994
+ }
995
+
996
+ smokeruby_object * o_cast = alloc_smokeruby_object(o->allocated,
997
+ cast_to_id->smoke,
998
+ (int) cast_to_id->index,
999
+ o->smoke->cast(o->ptr, o->classId, (int) cast_to_id->index) );
1000
+
1001
+ VALUE obj = Data_Wrap_Struct(new_klass, smokeruby_mark, smokeruby_free, (void *) o_cast);
1002
+ mapPointer(obj, o_cast, o_cast->classId, 0);
1003
+ return obj;
1004
+ }
1005
+
1006
+ static VALUE
1007
+ qobject_qt_metacast(VALUE self, VALUE klass)
1008
+ {
1009
+ smokeruby_object *o = value_obj_info(self);
1010
+ if (o == 0 || o->ptr == 0) {
1011
+ return Qnil;
1012
+ }
1013
+
1014
+ const char * classname = rb_class2name(klass);
1015
+ Smoke::ModuleIndex * mi = classcache.value(classname);
1016
+ if (mi == 0) {
1017
+ return Qnil;
1018
+ }
1019
+
1020
+ QObject* qobj = (QObject*) o->smoke->cast(o->ptr, o->classId, o->smoke->idClass("QObject").index);
1021
+ if (qobj == 0) {
1022
+ return Qnil;
1023
+ }
1024
+
1025
+ void* ret = qobj->qt_metacast(mi->smoke->classes[mi->index].className);
1026
+
1027
+ if (ret == 0) {
1028
+ return Qnil;
1029
+ }
1030
+
1031
+ smokeruby_object * o_cast = alloc_smokeruby_object( o->allocated,
1032
+ mi->smoke,
1033
+ (int) mi->index,
1034
+ ret );
1035
+
1036
+ VALUE obj = Data_Wrap_Struct(klass, smokeruby_mark, smokeruby_free, (void *) o_cast);
1037
+ mapPointer(obj, o_cast, o_cast->classId, 0);
1038
+ return obj;
1039
+ }
1040
+
1041
+ static VALUE
1042
+ qsignalmapper_mapping(int argc, VALUE * argv, VALUE self)
1043
+ {
1044
+ if (argc == 1 && TYPE(argv[0]) == T_DATA) {
1045
+ smokeruby_object *o = value_obj_info(self);
1046
+ smokeruby_object *a = value_obj_info(argv[0]);
1047
+
1048
+ Smoke::ModuleIndex nameId = Smoke::NullModuleIndex;
1049
+ nameId = o->smoke->idMethodName("mapping#");
1050
+ Smoke::ModuleIndex ci(o->smoke, o->classId);
1051
+ Smoke::ModuleIndex meth = o->smoke->findMethod(ci, nameId);
1052
+ Smoke::Index i = meth.smoke->methodMaps[meth.index].method;
1053
+ i = -i; // turn into ambiguousMethodList index
1054
+ while (meth.smoke->ambiguousMethodList[i] != 0) {
1055
+ if ((qstrcmp(meth.smoke->types[meth.smoke->argumentList[meth.smoke->methods[meth.smoke->ambiguousMethodList[i]].args]].name, "QObject*" ) == 0
1056
+ && Smoke::isDerivedFrom(a->smoke->classes[a->classId].className, "QObject")
1057
+ && !Smoke::isDerivedFrom(a->smoke->classes[a->classId].className, "QWidget") )
1058
+ || (qstrcmp(meth.smoke->types[meth.smoke->argumentList[meth.smoke->methods[meth.smoke->ambiguousMethodList[i]].args]].name, "QWidget*" ) == 0
1059
+ && Smoke::isDerivedFrom(a->smoke->classes[a->classId].className, "QWidget") ) )
1060
+ {
1061
+ _current_method.smoke = meth.smoke;
1062
+ _current_method.index = meth.smoke->ambiguousMethodList[i];
1063
+ QtRuby::MethodCall c(meth.smoke, _current_method.index, self, argv, 1);
1064
+ c.next();
1065
+ return *(c.var());
1066
+ }
1067
+
1068
+ i++;
1069
+ }
1070
+ }
1071
+
1072
+ return rb_call_super(argc, argv);
1073
+ }
1074
+
1075
+ static VALUE
1076
+ qsignalmapper_set_mapping(int argc, VALUE * argv, VALUE self)
1077
+ {
1078
+ if (argc == 2 && TYPE(argv[0]) == T_DATA && TYPE(argv[1]) == T_DATA) {
1079
+ smokeruby_object *o = value_obj_info(self);
1080
+ smokeruby_object *a = value_obj_info(argv[1]);
1081
+
1082
+ Smoke::ModuleIndex nameId = Smoke::NullModuleIndex;
1083
+ nameId = o->smoke->idMethodName("setMapping##");
1084
+ Smoke::ModuleIndex ci(o->smoke, o->classId);
1085
+ Smoke::ModuleIndex meth = o->smoke->findMethod(ci, nameId);
1086
+ Smoke::Index i = meth.smoke->methodMaps[meth.index].method;
1087
+ i = -i; // turn into ambiguousMethodList index
1088
+ while (meth.smoke->ambiguousMethodList[i] != 0) {
1089
+ if ((qstrcmp(meth.smoke->types[meth.smoke->argumentList[meth.smoke->methods[meth.smoke->ambiguousMethodList[i]].args + 1]].name, "QObject*" ) == 0
1090
+ && Smoke::isDerivedFrom(a->smoke->classes[a->classId].className, "QObject")
1091
+ && !Smoke::isDerivedFrom(a->smoke->classes[a->classId].className, "QWidget") )
1092
+ || (qstrcmp(meth.smoke->types[meth.smoke->argumentList[meth.smoke->methods[meth.smoke->ambiguousMethodList[i]].args + 1]].name, "QWidget*" ) == 0
1093
+ && Smoke::isDerivedFrom(a->smoke->classes[a->classId].className, "QWidget") ) )
1094
+ {
1095
+ _current_method.smoke = meth.smoke;
1096
+ _current_method.index = meth.smoke->ambiguousMethodList[i];
1097
+ QtRuby::MethodCall c(meth.smoke, _current_method.index, self, argv, 2);
1098
+ c.next();
1099
+ return *(c.var());
1100
+ }
1101
+
1102
+ i++;
1103
+ }
1104
+ }
1105
+
1106
+ return rb_call_super(argc, argv);
1107
+ }
1108
+
1109
+ static int rObject_typeId;
1110
+
1111
+ // QMetaType helpers
1112
+ static void delete_ruby_object(void *ptr)
1113
+ {
1114
+ rb_gc_unregister_address((VALUE*) ptr);
1115
+ delete (VALUE*) ptr;
1116
+ }
1117
+
1118
+ static void *create_ruby_object(const void *copyFrom)
1119
+ {
1120
+ VALUE *object;
1121
+
1122
+ if (copyFrom) {
1123
+ object = new VALUE(*(VALUE*) copyFrom);
1124
+ } else {
1125
+ object = new VALUE(Qnil);
1126
+ }
1127
+
1128
+ rb_gc_register_address(object);
1129
+ return object;
1130
+ }
1131
+
1132
+ static VALUE
1133
+ qvariant_value(VALUE /*self*/, VALUE variant_value_klass, VALUE variant_value)
1134
+ {
1135
+ void * value_ptr = 0;
1136
+ VALUE result = Qnil;
1137
+ smokeruby_object * vo = 0;
1138
+
1139
+ smokeruby_object *o = value_obj_info(variant_value);
1140
+ if (o == 0 || o->ptr == 0) {
1141
+ return Qnil;
1142
+ }
1143
+
1144
+ QVariant * variant = (QVariant*) o->ptr;
1145
+
1146
+ if (variant->userType() == rObject_typeId) {
1147
+ return *(VALUE*) variant->data();
1148
+ #ifdef QT_QTDBUS
1149
+ } else if (variant->userType() == qMetaTypeId<QDBusObjectPath>()) {
1150
+ QString s = qVariantValue<QDBusObjectPath>(*variant).path();
1151
+ return rb_str_new2(s.toLatin1());
1152
+ } else if (variant->userType() == qMetaTypeId<QDBusSignature>()) {
1153
+ QString s = qVariantValue<QDBusSignature>(*variant).signature();
1154
+ return rb_str_new2(s.toLatin1());
1155
+ } else if (variant->userType() == qMetaTypeId<QDBusVariant>()) {
1156
+ QVariant *ptr = new QVariant(qVariantValue<QDBusVariant>(*variant).variant());
1157
+ vo = alloc_smokeruby_object(true, qtcore_Smoke, qtcore_Smoke->idClass("QVariant").index, ptr);
1158
+ return set_obj_info("Qt::Variant", vo);
1159
+ #endif
1160
+ } else if (variant->type() >= QVariant::UserType) {
1161
+ // If the QVariant contains a user type, don't bother to look at the Ruby class argument
1162
+ value_ptr = QMetaType::construct(QMetaType::type(variant->typeName()), (void *) variant->constData());
1163
+ Smoke::ModuleIndex mi = o->smoke->findClass(variant->typeName());
1164
+ vo = alloc_smokeruby_object(true, mi.smoke, mi.index, value_ptr);
1165
+ return set_obj_info(qtruby_modules[mi.smoke].binding->className(mi.index), vo);
1166
+ }
1167
+
1168
+ const char * classname = rb_class2name(variant_value_klass);
1169
+ Smoke::ModuleIndex * value_class_id = classcache.value(classname);
1170
+ if (value_class_id == 0) {
1171
+ return Qnil;
1172
+ }
1173
+
1174
+ if (qstrcmp(classname, "Qt::Pixmap") == 0) {
1175
+ QPixmap v = qVariantValue<QPixmap>(*variant);
1176
+ value_ptr = (void *) new QPixmap(v);
1177
+ } else if (qstrcmp(classname, "Qt::Font") == 0) {
1178
+ QFont v = qVariantValue<QFont>(*variant);
1179
+ value_ptr = (void *) new QFont(v);
1180
+ } else if (qstrcmp(classname, "Qt::Brush") == 0) {
1181
+ QBrush v = qVariantValue<QBrush>(*variant);
1182
+ value_ptr = (void *) new QBrush(v);
1183
+ } else if (qstrcmp(classname, "Qt::Color") == 0) {
1184
+ QColor v = qVariantValue<QColor>(*variant);
1185
+ value_ptr = (void *) new QColor(v);
1186
+ } else if (qstrcmp(classname, "Qt::Palette") == 0) {
1187
+ QPalette v = qVariantValue<QPalette>(*variant);
1188
+ value_ptr = (void *) new QPalette(v);
1189
+ } else if (qstrcmp(classname, "Qt::Icon") == 0) {
1190
+ QIcon v = qVariantValue<QIcon>(*variant);
1191
+ value_ptr = (void *) new QIcon(v);
1192
+ } else if (qstrcmp(classname, "Qt::Image") == 0) {
1193
+ QImage v = qVariantValue<QImage>(*variant);
1194
+ value_ptr = (void *) new QImage(v);
1195
+ } else if (qstrcmp(classname, "Qt::Polygon") == 0) {
1196
+ QPolygon v = qVariantValue<QPolygon>(*variant);
1197
+ value_ptr = (void *) new QPolygon(v);
1198
+ } else if (qstrcmp(classname, "Qt::Region") == 0) {
1199
+ QRegion v = qVariantValue<QRegion>(*variant);
1200
+ value_ptr = (void *) new QRegion(v);
1201
+ } else if (qstrcmp(classname, "Qt::Bitmap") == 0) {
1202
+ QBitmap v = qVariantValue<QBitmap>(*variant);
1203
+ value_ptr = (void *) new QBitmap(v);
1204
+ } else if (qstrcmp(classname, "Qt::Cursor") == 0) {
1205
+ QCursor v = qVariantValue<QCursor>(*variant);
1206
+ value_ptr = (void *) new QCursor(v);
1207
+ } else if (qstrcmp(classname, "Qt::SizePolicy") == 0) {
1208
+ QSizePolicy v = qVariantValue<QSizePolicy>(*variant);
1209
+ value_ptr = (void *) new QSizePolicy(v);
1210
+ } else if (qstrcmp(classname, "Qt::KeySequence") == 0) {
1211
+ QKeySequence v = qVariantValue<QKeySequence>(*variant);
1212
+ value_ptr = (void *) new QKeySequence(v);
1213
+ } else if (qstrcmp(classname, "Qt::Pen") == 0) {
1214
+ QPen v = qVariantValue<QPen>(*variant);
1215
+ value_ptr = (void *) new QPen(v);
1216
+ } else if (qstrcmp(classname, "Qt::TextLength") == 0) {
1217
+ QTextLength v = qVariantValue<QTextLength>(*variant);
1218
+ value_ptr = (void *) new QTextLength(v);
1219
+ } else if (qstrcmp(classname, "Qt::TextFormat") == 0) {
1220
+ QTextFormat v = qVariantValue<QTextFormat>(*variant);
1221
+ value_ptr = (void *) new QTextFormat(v);
1222
+ } else if (qstrcmp(classname, "Qt::Variant") == 0) {
1223
+ value_ptr = (void *) new QVariant(*((QVariant *) variant->constData()));
1224
+ } else {
1225
+ // Assume the value of the Qt::Variant can be obtained
1226
+ // with a call such as Qt::Variant.toPoint()
1227
+ QByteArray toValueMethodName(classname);
1228
+ if (toValueMethodName.startsWith("Qt::")) {
1229
+ toValueMethodName.remove(0, strlen("Qt::"));
1230
+ }
1231
+ toValueMethodName.prepend("to");
1232
+ return rb_funcall(variant_value, rb_intern(toValueMethodName), 1, variant_value);
1233
+ }
1234
+
1235
+ vo = alloc_smokeruby_object(true, value_class_id->smoke, value_class_id->index, value_ptr);
1236
+ result = set_obj_info(classname, vo);
1237
+
1238
+ return result;
1239
+ }
1240
+
1241
+ static VALUE create_qvariant_one_arg(VALUE arg)
1242
+ {
1243
+ return rb_funcall(qvariant_class, rb_intern("new"), 1, arg);
1244
+ }
1245
+
1246
+ static VALUE
1247
+ qvariant_from_value(int argc, VALUE * argv, VALUE self)
1248
+ {
1249
+ if (argc == 2) {
1250
+ Smoke::ModuleIndex nameId = Smoke::NullModuleIndex;
1251
+ const char *typeName = StringValuePtr(argv[1]);
1252
+
1253
+ if (TYPE(argv[0]) == T_DATA) {
1254
+ nameId = qtcore_Smoke->idMethodName("QVariant#");
1255
+ } else if (TYPE(argv[0]) == T_ARRAY || qstrcmp(typeName, "long long") == 0 || qstrcmp(typeName, "unsigned long long") == 0) {
1256
+ nameId = qtcore_Smoke->idMethodName("QVariant?");
1257
+ } else {
1258
+ nameId = qtcore_Smoke->idMethodName("QVariant$");
1259
+ }
1260
+
1261
+ Smoke::ModuleIndex meth = qtcore_Smoke->findMethod(qtcore_Smoke->idClass("QVariant"), nameId);
1262
+ Smoke::Index i = meth.smoke->methodMaps[meth.index].method;
1263
+ i = -i; // turn into ambiguousMethodList index
1264
+ while (meth.smoke->ambiguousMethodList[i] != 0) {
1265
+ if (qstrcmp(meth.smoke->types[meth.smoke->argumentList[meth.smoke->methods[meth.smoke->ambiguousMethodList[i]].args]].name, typeName ) == 0 )
1266
+ {
1267
+ _current_method.smoke = meth.smoke;
1268
+ _current_method.index = meth.smoke->ambiguousMethodList[i];
1269
+ QtRuby::MethodCall c(meth.smoke, _current_method.index, self, argv, 0);
1270
+ c.next();
1271
+ return *(c.var());
1272
+ }
1273
+
1274
+ i++;
1275
+ }
1276
+
1277
+ if(do_debug & qtdb_gc) printf("No suitable method for signature QVariant::QVariant(%s) found - looking for another suitable constructor\n", StringValuePtr(argv[1]));
1278
+ }
1279
+
1280
+ QVariant * v = 0;
1281
+
1282
+ const char * classname = rb_obj_classname(argv[0]);
1283
+ smokeruby_object *o = value_obj_info(argv[0]);
1284
+ int type = 0;
1285
+
1286
+ if (qstrcmp(classname, "Qt::Enum") == 0) {
1287
+ return rb_funcall(qvariant_class, rb_intern("new"), 1, rb_funcall(argv[0], rb_intern("to_i"), 0));
1288
+ } else if (o && o->ptr && (type = QVariant::nameToType(o->smoke->className(o->classId)))) {
1289
+ v = new QVariant(type, o->ptr);
1290
+ } else {
1291
+ int error = 0;
1292
+ VALUE result = rb_protect(&create_qvariant_one_arg, argv[0], &error);
1293
+ if (!error) {
1294
+ return result;
1295
+ } else {
1296
+ VALUE lasterr = rb_gv_get("$!");
1297
+ VALUE klass = rb_class_name(CLASS_OF(lasterr));
1298
+ if (qstrcmp(StringValuePtr(klass), "ArgumentError") == 0) {
1299
+ // ArgumentError - no suitable constructor found
1300
+ // Create a QVariant that contains an rObject
1301
+ v = new QVariant(rObject_typeId, &argv[0]);
1302
+ } else {
1303
+ rb_raise(lasterr, "while creating the QVariant");
1304
+ }
1305
+ }
1306
+ }
1307
+
1308
+ smokeruby_object * vo = alloc_smokeruby_object(true, qtcore_Smoke, qtcore_Smoke->idClass("QVariant").index, v);
1309
+ VALUE result = set_obj_info("Qt::Variant", vo);
1310
+
1311
+ return result;
1312
+ }
1313
+
1314
+ static VALUE
1315
+ new_qvariant(int argc, VALUE * argv, VALUE self)
1316
+ {
1317
+ static Smoke::Index new_qvariant_qlist = 0;
1318
+ static Smoke::Index new_qvariant_qmap = 0;
1319
+
1320
+ if (new_qvariant_qlist == 0) {
1321
+ Smoke::ModuleIndex nameId = qtcore_Smoke->findMethodName("Qvariant", "QVariant?");
1322
+ Smoke::ModuleIndex meth = qtcore_Smoke->findMethod(qtcore_Smoke->findClass("QVariant"), nameId);
1323
+ Smoke::Index i = meth.smoke->methodMaps[meth.index].method;
1324
+ i = -i; // turn into ambiguousMethodList index
1325
+ while (qtcore_Smoke->ambiguousMethodList[i] != 0) {
1326
+ const char * argType = meth.smoke->types[meth.smoke->argumentList[meth.smoke->methods[meth.smoke->ambiguousMethodList[i]].args]].name;
1327
+
1328
+ if (qstrcmp(argType, "const QList<QVariant>&" ) == 0) {
1329
+ new_qvariant_qlist = meth.smoke->ambiguousMethodList[i];
1330
+ } else if (qstrcmp(argType, "const QMap<QString,QVariant>&" ) == 0) {
1331
+ new_qvariant_qmap = meth.smoke->ambiguousMethodList[i];
1332
+ }
1333
+
1334
+ i++;
1335
+ }
1336
+ }
1337
+
1338
+ if (argc == 1 && TYPE(argv[0]) == T_HASH) {
1339
+ _current_method.smoke = qtcore_Smoke;
1340
+ _current_method.index = new_qvariant_qmap;
1341
+ QtRuby::MethodCall c(qtcore_Smoke, _current_method.index, self, argv, argc-1);
1342
+ c.next();
1343
+ return *(c.var());
1344
+ } else if ( argc == 1
1345
+ && TYPE(argv[0]) == T_ARRAY
1346
+ && RARRAY_LEN(argv[0]) > 0
1347
+ && TYPE(rb_ary_entry(argv[0], 0)) != T_STRING )
1348
+ {
1349
+ _current_method.smoke = qtcore_Smoke;
1350
+ _current_method.index = new_qvariant_qlist;
1351
+ QtRuby::MethodCall c(qtcore_Smoke, _current_method.index, self, argv, argc-1);
1352
+ c.next();
1353
+ return *(c.var());
1354
+ }
1355
+
1356
+ return rb_call_super(argc, argv);
1357
+ }
1358
+
1359
+ static VALUE module_method_missing(int argc, VALUE * argv, VALUE klass)
1360
+ {
1361
+ return class_method_missing(argc, argv, klass);
1362
+ }
1363
+
1364
+ /*
1365
+
1366
+ class LCDRange < Qt::Widget
1367
+
1368
+ def initialize(s, parent, name)
1369
+ super(parent, name)
1370
+ init()
1371
+ ...
1372
+
1373
+ For a case such as the above, the QWidget can't be instantiated until
1374
+ the initializer has been run up to the point where 'super(parent, name)'
1375
+ is called. Only then, can the number and type of arguments passed to the
1376
+ constructor be known. However, the rest of the intializer
1377
+ can't be run until 'self' is a proper T_DATA object with a wrapped C++
1378
+ instance.
1379
+
1380
+ The solution is to run the initialize code twice. First, only up to the
1381
+ 'super(parent, name)' call, where the QWidget would get instantiated in
1382
+ initialize_qt(). And then rb_throw() jumps out of the
1383
+ initializer returning the wrapped object as a result.
1384
+
1385
+ The second time round 'self' will be the wrapped instance of type T_DATA,
1386
+ so initialize() can be allowed to proceed to the end.
1387
+ */
1388
+ static VALUE
1389
+ initialize_qt(int argc, VALUE * argv, VALUE self)
1390
+ {
1391
+ VALUE retval = Qnil;
1392
+ VALUE temp_obj;
1393
+ static VALUE mainThread = Qnil;
1394
+ if (mainThread == Qnil) {
1395
+ mainThread = rb_thread_main();
1396
+ }
1397
+ if (TYPE(self) == T_DATA) {
1398
+ // If a ruby block was passed then run that now
1399
+ if (rb_block_given_p()) {
1400
+ rb_funcall(qt_internal_module, rb_intern("run_initializer_block"), 2, self, rb_block_proc());
1401
+ }
1402
+ return self;
1403
+ } else {
1404
+ if (rb_thread_current() != mainThread) {
1405
+ rb_raise(rb_eRuntimeError, "Qt methods cannot be called from outside of the main thread");
1406
+ }
1407
+ }
1408
+
1409
+ VALUE klass = rb_funcall(self, rb_intern("class"), 0);
1410
+ VALUE constructor_name = rb_str_new2("new");
1411
+
1412
+ VALUE * temp_stack = ALLOCA_N(VALUE, argc+4);
1413
+
1414
+ temp_stack[0] = rb_str_new2("Qt");
1415
+ temp_stack[1] = constructor_name;
1416
+ temp_stack[2] = klass;
1417
+ temp_stack[3] = self;
1418
+
1419
+ for (int count = 0; count < argc; count++) {
1420
+ temp_stack[count+4] = argv[count];
1421
+ }
1422
+
1423
+ {
1424
+ QByteArray * mcid = find_cached_selector(argc+4, temp_stack, klass, rb_class2name(klass));
1425
+
1426
+ if (_current_method.index == -1) {
1427
+ retval = rb_funcall2(qt_internal_module, rb_intern("do_method_missing"), argc+4, temp_stack);
1428
+ if (_current_method.index != -1) {
1429
+ // Success. Cache result.
1430
+ methcache.insert(*mcid, new Smoke::ModuleIndex(_current_method));
1431
+ }
1432
+ }
1433
+ }
1434
+
1435
+ if (_current_method.index == -1) {
1436
+ // Another longjmp here..
1437
+ rb_raise(rb_eArgError, "unresolved constructor call %s\n", rb_class2name(klass));
1438
+ }
1439
+
1440
+ {
1441
+ // Allocate the MethodCall within a C block. Otherwise, because the continue_new_instance()
1442
+ // call below will longjmp out, it wouldn't give C++ an opportunity to clean up
1443
+ QtRuby::MethodCall c(_current_method.smoke, _current_method.index, self, temp_stack+4, argc);
1444
+ c.next();
1445
+ temp_obj = *(c.var());
1446
+ }
1447
+
1448
+ smokeruby_object * p = 0;
1449
+ Data_Get_Struct(temp_obj, smokeruby_object, p);
1450
+
1451
+ smokeruby_object * o = alloc_smokeruby_object( true,
1452
+ p->smoke,
1453
+ p->classId,
1454
+ p->ptr );
1455
+ p->ptr = 0;
1456
+ p->allocated = false;
1457
+
1458
+ VALUE result = Data_Wrap_Struct(klass, smokeruby_mark, smokeruby_free, o);
1459
+ mapObject(result, result);
1460
+ // Off with a longjmp, never to return..
1461
+ rb_throw("newqt", result);
1462
+ /*NOTREACHED*/
1463
+ return self;
1464
+ }
1465
+
1466
+ VALUE
1467
+ new_qt(int argc, VALUE * argv, VALUE klass)
1468
+ {
1469
+ VALUE * temp_stack = ALLOCA_N(VALUE, argc + 1);
1470
+ temp_stack[0] = rb_obj_alloc(klass);
1471
+
1472
+ for (int count = 0; count < argc; count++) {
1473
+ temp_stack[count+1] = argv[count];
1474
+ }
1475
+
1476
+ VALUE result = rb_funcall2(qt_internal_module, rb_intern("try_initialize"), argc+1, temp_stack);
1477
+ rb_obj_call_init(result, argc, argv);
1478
+
1479
+ return result;
1480
+ }
1481
+
1482
+
1483
+ // Returns $qApp.ARGV() - the original ARGV array with Qt command line options removed
1484
+ static VALUE
1485
+ qapplication_argv(VALUE /*self*/)
1486
+ {
1487
+ VALUE result = rb_ary_new();
1488
+ // Drop argv[0], as it isn't included in the ruby global ARGV
1489
+ for (int index = 1; index < qApp->argc(); index++) {
1490
+ rb_ary_push(result, rb_str_new2(qApp->argv()[index]));
1491
+ }
1492
+
1493
+ return result;
1494
+ }
1495
+
1496
+ //----------------- Sig/Slot ------------------
1497
+
1498
+
1499
+ static VALUE
1500
+ qt_signal(int argc, VALUE * argv, VALUE self)
1501
+ {
1502
+ smokeruby_object *o = value_obj_info(self);
1503
+ QObject *qobj = (QObject*)o->smoke->cast(o->ptr, o->classId, o->smoke->idClass("QObject").index);
1504
+ if (qobj->signalsBlocked()) {
1505
+ return Qfalse;
1506
+ }
1507
+
1508
+ #if RUBY_VERSION >= 0x20000
1509
+ QLatin1String signalname(rb_id2name(rb_frame_this_func()));
1510
+ #elif RUBY_VERSION >= 0x10900
1511
+ QLatin1String signalname(rb_id2name(rb_frame_callee()));
1512
+ #else
1513
+ QLatin1String signalname(rb_id2name(rb_frame_last_func()));
1514
+ #endif
1515
+
1516
+ VALUE metaObject_value = rb_funcall(qt_internal_module, rb_intern("getMetaObject"), 2, Qnil, self);
1517
+
1518
+ smokeruby_object *ometa = value_obj_info(metaObject_value);
1519
+ if (ometa == 0) {
1520
+ return Qnil;
1521
+ }
1522
+
1523
+ int i = -1;
1524
+ const QMetaObject * m = (QMetaObject*) ometa->ptr;
1525
+ for (i = m->methodCount() - 1; i > -1; i--) {
1526
+ if (m->method(i).methodType() == QMetaMethod::Signal) {
1527
+ QString name(m->method(i).signature());
1528
+ static QRegExp * rx = 0;
1529
+ if (rx == 0) {
1530
+ rx = new QRegExp("\\(.*");
1531
+ }
1532
+ name.replace(*rx, "");
1533
+
1534
+ if (name == signalname) {
1535
+ break;
1536
+ }
1537
+ }
1538
+ }
1539
+
1540
+ if (i == -1) {
1541
+ return Qnil;
1542
+ }
1543
+
1544
+ QList<MocArgument*> args = get_moc_arguments(o->smoke, m->method(i).typeName(), m->method(i).parameterTypes());
1545
+
1546
+ VALUE result = Qnil;
1547
+ // Okay, we have the signal info. *whew*
1548
+ QtRuby::EmitSignal signal(qobj, i, argc, args, argv, &result);
1549
+ signal.next();
1550
+
1551
+ return result;
1552
+ }
1553
+
1554
+ static VALUE
1555
+ qt_metacall(int /*argc*/, VALUE * argv, VALUE self)
1556
+ {
1557
+ // Arguments: QMetaObject::Call _c, int id, void ** _o
1558
+ QMetaObject::Call _c = (QMetaObject::Call) NUM2INT( rb_funcall( qt_internal_module,
1559
+ rb_intern("get_qinteger"),
1560
+ 1,
1561
+ argv[0] ) );
1562
+ int id = NUM2INT(argv[1]);
1563
+ void ** _o = 0;
1564
+
1565
+ // Note that for a slot with no args and no return type,
1566
+ // it isn't an error to get a NULL value of _o here.
1567
+ Data_Get_Struct(argv[2], void*, _o);
1568
+ // Assume the target slot is a C++ one
1569
+ smokeruby_object *o = value_obj_info(self);
1570
+ Smoke::ModuleIndex nameId = o->smoke->idMethodName("qt_metacall$$?");
1571
+ Smoke::ModuleIndex classIdx(o->smoke, o->classId);
1572
+ Smoke::ModuleIndex meth = nameId.smoke->findMethod(classIdx, nameId);
1573
+ if (meth.index > 0) {
1574
+ const Smoke::Method &m = meth.smoke->methods[meth.smoke->methodMaps[meth.index].method];
1575
+ Smoke::ClassFn fn = meth.smoke->classes[m.classId].classFn;
1576
+ Smoke::StackItem i[4];
1577
+ i[1].s_enum = _c;
1578
+ i[2].s_int = id;
1579
+ i[3].s_voidp = _o;
1580
+ (*fn)(m.method, o->ptr, i);
1581
+ int ret = i[0].s_int;
1582
+ if (ret < 0) {
1583
+ return INT2NUM(ret);
1584
+ }
1585
+ } else {
1586
+ // Should never happen..
1587
+ rb_raise(rb_eRuntimeError, "Cannot find %s::qt_metacall() method\n",
1588
+ o->smoke->classes[o->classId].className );
1589
+ }
1590
+
1591
+ if (_c != QMetaObject::InvokeMetaMethod) {
1592
+ return argv[1];
1593
+ }
1594
+
1595
+ QObject * qobj = (QObject *) o->smoke->cast(o->ptr, o->classId, o->smoke->idClass("QObject").index);
1596
+ // get obj metaobject with a virtual call
1597
+ const QMetaObject *metaobject = qobj->metaObject();
1598
+
1599
+ // get method/property count
1600
+ int count = 0;
1601
+ if (_c == QMetaObject::InvokeMetaMethod) {
1602
+ count = metaobject->methodCount();
1603
+ } else {
1604
+ count = metaobject->propertyCount();
1605
+ }
1606
+
1607
+ if (_c == QMetaObject::InvokeMetaMethod) {
1608
+ QMetaMethod method = metaobject->method(id);
1609
+
1610
+ if (method.methodType() == QMetaMethod::Signal) {
1611
+ metaobject->activate(qobj, id, (void**) _o);
1612
+ return INT2NUM(id - count);
1613
+ }
1614
+
1615
+ QList<MocArgument*> mocArgs = get_moc_arguments(o->smoke, method.typeName(), method.parameterTypes());
1616
+
1617
+ QString name(method.signature());
1618
+ static QRegExp * rx = 0;
1619
+ if (rx == 0) {
1620
+ rx = new QRegExp("\\(.*");
1621
+ }
1622
+ name.replace(*rx, "");
1623
+ QtRuby::InvokeSlot slot(self, rb_intern(name.toLatin1()), mocArgs, _o);
1624
+ slot.next();
1625
+ }
1626
+
1627
+ return INT2NUM(id - count);
1628
+ }
1629
+
1630
+ static VALUE
1631
+ qobject_connect(int argc, VALUE * argv, VALUE self)
1632
+ {
1633
+ if (rb_block_given_p()) {
1634
+ if (argc == 1) {
1635
+ return rb_funcall(qt_internal_module, rb_intern("signal_connect"), 3, self, argv[0], rb_block_proc());
1636
+ } else if (argc == 2) {
1637
+ return rb_funcall(qt_internal_module, rb_intern("connect"), 4, argv[0], argv[1], self, rb_block_proc());
1638
+ } else if (argc == 3) {
1639
+ return rb_funcall(qt_internal_module, rb_intern("connect"), 4, argv[0], argv[1], argv[2], rb_block_proc());
1640
+ } else {
1641
+ rb_raise(rb_eArgError, "Invalid argument list");
1642
+ }
1643
+ } else {
1644
+ if (argc == 3 && TYPE(argv[1]) != T_STRING) {
1645
+ return rb_funcall(qt_internal_module, rb_intern("method_connect"), 4, self, argv[0], argv[1], argv[2]);
1646
+ } else {
1647
+ return rb_call_super(argc, argv);
1648
+ }
1649
+ }
1650
+ }
1651
+
1652
+ static VALUE
1653
+ qtimer_single_shot(int argc, VALUE * argv, VALUE /*self*/)
1654
+ {
1655
+ if (rb_block_given_p()) {
1656
+ if (argc == 2) {
1657
+ return rb_funcall(qt_internal_module, rb_intern("single_shot_timer_connect"), 3, argv[0], argv[1], rb_block_proc());
1658
+ } else {
1659
+ rb_raise(rb_eArgError, "Invalid argument list");
1660
+ }
1661
+ } else {
1662
+ return rb_call_super(argc, argv);
1663
+ }
1664
+ }
1665
+
1666
+ // --------------- Ruby C functions for Qt::_internal.* helpers ----------------
1667
+
1668
+
1669
+ static VALUE
1670
+ getMethStat(VALUE /*self*/)
1671
+ {
1672
+ VALUE result_list = rb_ary_new();
1673
+ rb_ary_push(result_list, INT2NUM((int)methcache.size()));
1674
+ rb_ary_push(result_list, INT2NUM((int)methcache.count()));
1675
+ return result_list;
1676
+ }
1677
+
1678
+ static VALUE
1679
+ getClassStat(VALUE /*self*/)
1680
+ {
1681
+ VALUE result_list = rb_ary_new();
1682
+ rb_ary_push(result_list, INT2NUM((int)classcache.size()));
1683
+ rb_ary_push(result_list, INT2NUM((int)classcache.count()));
1684
+ return result_list;
1685
+ }
1686
+
1687
+ static VALUE
1688
+ getIsa(VALUE /*self*/, VALUE classId)
1689
+ {
1690
+ VALUE parents_list = rb_ary_new();
1691
+
1692
+ int id = NUM2INT(rb_funcall(classId, rb_intern("index"), 0));
1693
+ Smoke* smoke = smokeList[NUM2INT(rb_funcall(classId, rb_intern("smoke"), 0))];
1694
+
1695
+ Smoke::Index *parents =
1696
+ smoke->inheritanceList +
1697
+ smoke->classes[id].parents;
1698
+
1699
+ while(*parents) {
1700
+ //logger("\tparent: %s", qtcore_Smoke->classes[*parents].className);
1701
+ rb_ary_push(parents_list, rb_str_new2(smoke->classes[*parents++].className));
1702
+ }
1703
+ return parents_list;
1704
+ }
1705
+
1706
+ // Return the class name of a QObject. Note that the name will be in the
1707
+ // form of Qt::Widget rather than QWidget. Is this a bug or a feature?
1708
+ static VALUE
1709
+ class_name(VALUE self)
1710
+ {
1711
+ VALUE klass = rb_funcall(self, rb_intern("class"), 0);
1712
+ return rb_funcall(klass, rb_intern("name"), 0);
1713
+ }
1714
+
1715
+ // Allow classnames in both 'Qt::Widget' and 'QWidget' formats to be
1716
+ // used as an argument to Qt::Object.inherits()
1717
+ static VALUE
1718
+ inherits_qobject(int argc, VALUE * argv, VALUE /*self*/)
1719
+ {
1720
+ if (argc != 1) {
1721
+ return rb_call_super(argc, argv);
1722
+ }
1723
+
1724
+ Smoke::ModuleIndex * classId = classcache.value(StringValuePtr(argv[0]));
1725
+
1726
+ if (classId == 0) {
1727
+ return rb_call_super(argc, argv);
1728
+ } else {
1729
+ VALUE super_class = rb_str_new2(classId->smoke->classes[classId->index].className);
1730
+ return rb_call_super(argc, &super_class);
1731
+ }
1732
+ }
1733
+
1734
+ /* Adapted from the internal function qt_qFindChildren() in qobject.cpp */
1735
+ static void
1736
+ rb_qFindChildren_helper(VALUE parent, const QString &name, VALUE re,
1737
+ const QMetaObject &mo, VALUE list)
1738
+ {
1739
+ if (parent == Qnil || list == Qnil)
1740
+ return;
1741
+ VALUE children = rb_funcall(parent, rb_intern("children"), 0);
1742
+ VALUE rv = Qnil;
1743
+ for (int i = 0; i < RARRAY_LEN(children); ++i) {
1744
+ rv = RARRAY_PTR(children)[i];
1745
+ smokeruby_object *o = value_obj_info(rv);
1746
+ QObject * obj = (QObject *) o->smoke->cast(o->ptr, o->classId, o->smoke->idClass("QObject").index);
1747
+
1748
+ // The original code had 'if (mo.cast(obj))' as a test, but it doesn't work here
1749
+ if (obj->qt_metacast(mo.className()) != 0) {
1750
+ if (re != Qnil) {
1751
+ VALUE re_test = rb_funcall(re, rb_intern("=~"), 1, rb_funcall(rv, rb_intern("objectName"), 0));
1752
+ if (re_test != Qnil && re_test != Qfalse) {
1753
+ rb_ary_push(list, rv);
1754
+ }
1755
+ } else {
1756
+ if (name.isNull() || obj->objectName() == name) {
1757
+ rb_ary_push(list, rv);
1758
+ }
1759
+ }
1760
+ }
1761
+ rb_qFindChildren_helper(rv, name, re, mo, list);
1762
+ }
1763
+ return;
1764
+ }
1765
+
1766
+ /* Should mimic Qt4's QObject::findChildren method with this syntax:
1767
+ obj.findChildren(Qt::Widget, "Optional Widget Name")
1768
+ */
1769
+ static VALUE
1770
+ find_qobject_children(int argc, VALUE *argv, VALUE self)
1771
+ {
1772
+ if (argc < 1 || argc > 2) rb_raise(rb_eArgError, "Invalid argument list");
1773
+ Check_Type(argv[0], T_CLASS);
1774
+
1775
+ QString name;
1776
+ VALUE re = Qnil;
1777
+ if (argc == 2) {
1778
+ // If the second arg isn't a String, assume it's a regular expression
1779
+ if (TYPE(argv[1]) == T_STRING) {
1780
+ name = QString::fromLatin1(StringValuePtr(argv[1]));
1781
+ } else {
1782
+ re = argv[1];
1783
+ }
1784
+ }
1785
+
1786
+ VALUE metaObject = rb_funcall(argv[0], rb_intern("staticMetaObject"), 0);
1787
+ smokeruby_object *o = value_obj_info(metaObject);
1788
+ QMetaObject * mo = (QMetaObject*) o->ptr;
1789
+ VALUE result = rb_ary_new();
1790
+ rb_qFindChildren_helper(self, name, re, *mo, result);
1791
+ return result;
1792
+ }
1793
+
1794
+ /* Adapted from the internal function qt_qFindChild() in qobject.cpp */
1795
+ static VALUE
1796
+ rb_qFindChild_helper(VALUE parent, const QString &name, const QMetaObject &mo)
1797
+ {
1798
+ if (parent == Qnil)
1799
+ return Qnil;
1800
+ VALUE children = rb_funcall(parent, rb_intern("children"), 0);
1801
+ VALUE rv;
1802
+ int i;
1803
+ for (i = 0; i < RARRAY_LEN(children); ++i) {
1804
+ rv = RARRAY_PTR(children)[i];
1805
+ smokeruby_object *o = value_obj_info(rv);
1806
+ QObject * obj = (QObject *) o->smoke->cast(o->ptr, o->classId, o->smoke->idClass("QObject").index);
1807
+ if (obj->qt_metacast(mo.className()) != 0 && (name.isNull() || obj->objectName() == name))
1808
+ return rv;
1809
+ }
1810
+ for (i = 0; i < RARRAY_LEN(children); ++i) {
1811
+ rv = rb_qFindChild_helper(RARRAY_PTR(children)[i], name, mo);
1812
+ if (rv != Qnil)
1813
+ return rv;
1814
+ }
1815
+ return Qnil;
1816
+ }
1817
+
1818
+ static VALUE
1819
+ find_qobject_child(int argc, VALUE *argv, VALUE self)
1820
+ {
1821
+ if (argc < 1 || argc > 2) rb_raise(rb_eArgError, "Invalid argument list");
1822
+ Check_Type(argv[0], T_CLASS);
1823
+
1824
+ QString name;
1825
+ if (argc == 2) {
1826
+ name = QString::fromLatin1(StringValuePtr(argv[1]));
1827
+ }
1828
+
1829
+ VALUE metaObject = rb_funcall(argv[0], rb_intern("staticMetaObject"), 0);
1830
+ smokeruby_object *o = value_obj_info(metaObject);
1831
+ QMetaObject * mo = (QMetaObject*) o->ptr;
1832
+ return rb_qFindChild_helper(self, name, *mo);
1833
+ }
1834
+
1835
+ static VALUE
1836
+ setDebug(VALUE self, VALUE on_value)
1837
+ {
1838
+ int on = NUM2INT(on_value);
1839
+ do_debug = on;
1840
+ return self;
1841
+ }
1842
+
1843
+ static VALUE
1844
+ debugging(VALUE /*self*/)
1845
+ {
1846
+ return INT2NUM(do_debug);
1847
+ }
1848
+
1849
+ static VALUE
1850
+ get_arg_type_name(VALUE /*self*/, VALUE method_value, VALUE idx_value)
1851
+ {
1852
+ int method = NUM2INT(rb_funcall(method_value, rb_intern("index"), 0));
1853
+ int smokeIndex = NUM2INT(rb_funcall(method_value, rb_intern("smoke"), 0));
1854
+ Smoke * smoke = smokeList[smokeIndex];
1855
+ int idx = NUM2INT(idx_value);
1856
+ const Smoke::Method &m = smoke->methods[method];
1857
+ Smoke::Index *args = smoke->argumentList + m.args;
1858
+ return rb_str_new2((char*)smoke->types[args[idx]].name);
1859
+ }
1860
+
1861
+ static VALUE
1862
+ classIsa(VALUE /*self*/, VALUE className_value, VALUE base_value)
1863
+ {
1864
+ char *className = StringValuePtr(className_value);
1865
+ char *base = StringValuePtr(base_value);
1866
+ return Smoke::isDerivedFrom(className, base) ? Qtrue : Qfalse;
1867
+ }
1868
+
1869
+ static VALUE
1870
+ isEnum(VALUE /*self*/, VALUE enumName_value)
1871
+ {
1872
+ char *enumName = StringValuePtr(enumName_value);
1873
+ Smoke::Index typeId = 0;
1874
+ Smoke* s = 0;
1875
+ for (int i = 0; i < smokeList.count(); i++) {
1876
+ typeId = smokeList[i]->idType(enumName);
1877
+ if (typeId > 0) {
1878
+ s = smokeList[i];
1879
+ break;
1880
+ }
1881
+ }
1882
+ return typeId > 0
1883
+ && ( (s->types[typeId].flags & Smoke::tf_elem) == Smoke::t_enum
1884
+ || (s->types[typeId].flags & Smoke::tf_elem) == Smoke::t_ulong
1885
+ || (s->types[typeId].flags & Smoke::tf_elem) == Smoke::t_long
1886
+ || (s->types[typeId].flags & Smoke::tf_elem) == Smoke::t_uint
1887
+ || (s->types[typeId].flags & Smoke::tf_elem) == Smoke::t_int ) ? Qtrue : Qfalse;
1888
+ }
1889
+
1890
+ static VALUE
1891
+ insert_pclassid(VALUE self, VALUE p_value, VALUE mi_value)
1892
+ {
1893
+ char *p = StringValuePtr(p_value);
1894
+ int ix = NUM2INT(rb_funcall(mi_value, rb_intern("index"), 0));
1895
+ int smokeidx = NUM2INT(rb_funcall(mi_value, rb_intern("smoke"), 0));
1896
+ Smoke::ModuleIndex mi(smokeList[smokeidx], ix);
1897
+ classcache.insert(QByteArray(p), new Smoke::ModuleIndex(mi));
1898
+ IdToClassNameMap.insert(mi, new QByteArray(p));
1899
+ return self;
1900
+ }
1901
+
1902
+ static VALUE
1903
+ classid2name(VALUE /*self*/, VALUE mi_value)
1904
+ {
1905
+ int ix = NUM2INT(rb_funcall(mi_value, rb_intern("index"), 0));
1906
+ int smokeidx = NUM2INT(rb_funcall(mi_value, rb_intern("smoke"), 0));
1907
+ Smoke::ModuleIndex mi(smokeList[smokeidx], ix);
1908
+ return rb_str_new2(IdToClassNameMap[mi]->constData());
1909
+ }
1910
+
1911
+ static VALUE
1912
+ find_pclassid(VALUE /*self*/, VALUE p_value)
1913
+ {
1914
+ if (NIL_P(p_value)) {
1915
+ return rb_funcall(moduleindex_class, rb_intern("new"), 2, 0, 0);
1916
+ }
1917
+
1918
+ char *p = StringValuePtr(p_value);
1919
+ Smoke::ModuleIndex *r = classcache.value(QByteArray(p));
1920
+ if (r != 0) {
1921
+ return rb_funcall(moduleindex_class, rb_intern("new"), 2, INT2NUM(smokeList.indexOf(r->smoke)), INT2NUM(r->index));
1922
+ } else {
1923
+ return rb_funcall(moduleindex_class, rb_intern("new"), 2, Qnil, Qnil);
1924
+ }
1925
+ }
1926
+
1927
+ static VALUE
1928
+ get_value_type(VALUE /*self*/, VALUE ruby_value)
1929
+ {
1930
+ return rb_str_new2(value_to_type_flag(ruby_value));
1931
+ }
1932
+
1933
+ static QMetaObject*
1934
+ parent_meta_object(VALUE obj)
1935
+ {
1936
+ smokeruby_object* o = value_obj_info(obj);
1937
+ Smoke::ModuleIndex nameId = o->smoke->idMethodName("metaObject");
1938
+ Smoke::ModuleIndex classIdx(o->smoke, o->classId);
1939
+ Smoke::ModuleIndex meth = o->smoke->findMethod(classIdx, nameId);
1940
+ if (meth.index <= 0) {
1941
+ // Should never happen..
1942
+ }
1943
+
1944
+ const Smoke::Method &methodId = meth.smoke->methods[meth.smoke->methodMaps[meth.index].method];
1945
+ Smoke::ClassFn fn = o->smoke->classes[methodId.classId].classFn;
1946
+ Smoke::StackItem i[1];
1947
+ (*fn)(methodId.method, o->ptr, i);
1948
+ return (QMetaObject*) i[0].s_voidp;
1949
+ }
1950
+
1951
+ static VALUE
1952
+ make_metaObject(VALUE /*self*/, VALUE obj, VALUE parentMeta, VALUE stringdata_value, VALUE data_value)
1953
+ {
1954
+ QMetaObject* superdata = 0;
1955
+
1956
+ if (parentMeta == Qnil) {
1957
+ // The parent class is a Smoke class, so call metaObject() on the
1958
+ // instance to get it via a smoke library call
1959
+ superdata = parent_meta_object(obj);
1960
+ } else {
1961
+ // The parent class is a custom Ruby class whose metaObject
1962
+ // was constructed at runtime
1963
+ smokeruby_object* p = value_obj_info(parentMeta);
1964
+ superdata = (QMetaObject *) p->ptr;
1965
+ }
1966
+
1967
+ char *stringdata = new char[RSTRING_LEN(stringdata_value)];
1968
+
1969
+ int count = RARRAY_LEN(data_value);
1970
+ uint * data = new uint[count];
1971
+
1972
+ memcpy( (void *) stringdata, RSTRING_PTR(stringdata_value), RSTRING_LEN(stringdata_value) );
1973
+
1974
+ for (long i = 0; i < count; i++) {
1975
+ VALUE rv = rb_ary_entry(data_value, i);
1976
+ data[i] = NUM2UINT(rv);
1977
+ }
1978
+
1979
+ QMetaObject ob = {
1980
+ { superdata, stringdata, data, 0 }
1981
+ } ;
1982
+
1983
+ QMetaObject * meta = new QMetaObject;
1984
+ *meta = ob;
1985
+
1986
+ #ifdef DEBUG
1987
+ printf("make_metaObject() superdata: %p %s\n", meta->d.superdata, superdata->className());
1988
+
1989
+ printf(
1990
+ " // content:\n"
1991
+ " %d, // revision\n"
1992
+ " %d, // classname\n"
1993
+ " %d, %d, // classinfo\n"
1994
+ " %d, %d, // methods\n"
1995
+ " %d, %d, // properties\n"
1996
+ " %d, %d, // enums/sets\n",
1997
+ data[0], data[1], data[2], data[3],
1998
+ data[4], data[5], data[6], data[7], data[8], data[9]);
1999
+
2000
+ int s = data[3];
2001
+
2002
+ if (data[2] > 0) {
2003
+ printf("\n // classinfo: key, value\n");
2004
+ for (uint j = 0; j < data[2]; j++) {
2005
+ printf(" %d, %d\n", data[s + (j * 2)], data[s + (j * 2) + 1]);
2006
+ }
2007
+ }
2008
+
2009
+ s = data[5];
2010
+ bool signal_headings = true;
2011
+ bool slot_headings = true;
2012
+
2013
+ for (uint j = 0; j < data[4]; j++) {
2014
+ if (signal_headings && (data[s + (j * 5) + 4] & 0x04) != 0) {
2015
+ printf("\n // signals: signature, parameters, type, tag, flags\n");
2016
+ signal_headings = false;
2017
+ }
2018
+
2019
+ if (slot_headings && (data[s + (j * 5) + 4] & 0x08) != 0) {
2020
+ printf("\n // slots: signature, parameters, type, tag, flags\n");
2021
+ slot_headings = false;
2022
+ }
2023
+
2024
+ printf(" %d, %d, %d, %d, 0x%2.2x\n",
2025
+ data[s + (j * 5)], data[s + (j * 5) + 1], data[s + (j * 5) + 2],
2026
+ data[s + (j * 5) + 3], data[s + (j * 5) + 4]);
2027
+ }
2028
+
2029
+ s += (data[4] * 5);
2030
+ for (uint j = 0; j < data[6]; j++) {
2031
+ printf("\n // properties: name, type, flags\n");
2032
+ printf(" %d, %d, 0x%8.8x\n",
2033
+ data[s + (j * 3)], data[s + (j * 3) + 1], data[s + (j * 3) + 2]);
2034
+ }
2035
+
2036
+ s += (data[6] * 3);
2037
+ for (int i = s; i < count; i++) {
2038
+ printf("\n %d // eod\n", data[i]);
2039
+ }
2040
+
2041
+ printf("\nqt_meta_stringdata:\n \"");
2042
+
2043
+ int strlength = 0;
2044
+ for (int j = 0; j < RSTRING_LEN(stringdata_value); j++) {
2045
+ strlength++;
2046
+ if (meta->d.stringdata[j] == 0) {
2047
+ printf("\\0");
2048
+ if (strlength > 40) {
2049
+ printf("\"\n \"");
2050
+ strlength = 0;
2051
+ }
2052
+ } else {
2053
+ printf("%c", meta->d.stringdata[j]);
2054
+ }
2055
+ }
2056
+ printf("\"\n\n");
2057
+
2058
+ #endif
2059
+ smokeruby_object * m = alloc_smokeruby_object( true,
2060
+ qtcore_Smoke,
2061
+ qtcore_Smoke->idClass("QMetaObject").index,
2062
+ meta );
2063
+
2064
+ return Data_Wrap_Struct(qmetaobject_class, smokeruby_mark, smokeruby_free, m);
2065
+ }
2066
+
2067
+ static VALUE
2068
+ add_metaobject_methods(VALUE self, VALUE klass)
2069
+ {
2070
+ rb_define_method(klass, "qt_metacall", (VALUE (*) (...)) qt_metacall, -1);
2071
+ rb_define_method(klass, "metaObject", (VALUE (*) (...)) metaObject, 0);
2072
+ return self;
2073
+ }
2074
+
2075
+ static VALUE
2076
+ add_signal_methods(VALUE self, VALUE klass, VALUE signalNames)
2077
+ {
2078
+ for (long index = 0; index < RARRAY_LEN(signalNames); index++) {
2079
+ VALUE signal = rb_ary_entry(signalNames, index);
2080
+ rb_define_method(klass, StringValuePtr(signal), (VALUE (*) (...)) qt_signal, -1);
2081
+ }
2082
+ return self;
2083
+ }
2084
+
2085
+ static VALUE
2086
+ dispose(VALUE self)
2087
+ {
2088
+ smokeruby_object *o = value_obj_info(self);
2089
+ if (o == 0 || o->ptr == 0) { return Qnil; }
2090
+
2091
+ const char *className = o->smoke->classes[o->classId].className;
2092
+ if(do_debug & qtdb_gc) printf("Deleting (%s*)%p\n", className, o->ptr);
2093
+
2094
+ unmapPointer(o, o->classId, 0);
2095
+ object_count--;
2096
+
2097
+ char *methodName = new char[strlen(className) + 2];
2098
+ methodName[0] = '~';
2099
+ strcpy(methodName + 1, className);
2100
+ Smoke::ModuleIndex nameId = o->smoke->findMethodName(className, methodName);
2101
+ Smoke::ModuleIndex classIdx(o->smoke, o->classId);
2102
+ Smoke::ModuleIndex meth = nameId.smoke->findMethod(classIdx, nameId);
2103
+ if(meth.index > 0) {
2104
+ const Smoke::Method &m = meth.smoke->methods[meth.smoke->methodMaps[meth.index].method];
2105
+ Smoke::ClassFn fn = meth.smoke->classes[m.classId].classFn;
2106
+ Smoke::StackItem i[1];
2107
+ (*fn)(m.method, o->ptr, i);
2108
+ }
2109
+ delete[] methodName;
2110
+ o->ptr = 0;
2111
+ o->allocated = false;
2112
+
2113
+ return Qnil;
2114
+ }
2115
+
2116
+ static VALUE
2117
+ is_disposed(VALUE self)
2118
+ {
2119
+ smokeruby_object *o = value_obj_info(self);
2120
+ return (o != 0 && o->ptr != 0) ? Qfalse : Qtrue;
2121
+ }
2122
+
2123
+ VALUE
2124
+ isQObject(VALUE /*self*/, VALUE c)
2125
+ {
2126
+ return Smoke::isDerivedFrom(StringValuePtr(c), "QObject");
2127
+ }
2128
+
2129
+ // Returns the Smoke classId of a ruby instance
2130
+ static VALUE
2131
+ idInstance(VALUE /*self*/, VALUE instance)
2132
+ {
2133
+ smokeruby_object *o = value_obj_info(instance);
2134
+ if(!o)
2135
+ return Qnil;
2136
+
2137
+ return rb_funcall(moduleindex_class, rb_intern("new"), 2, INT2NUM(smokeList.indexOf(o->smoke)), INT2NUM(o->classId));
2138
+ }
2139
+
2140
+ static VALUE
2141
+ findClass(VALUE /*self*/, VALUE name_value)
2142
+ {
2143
+ char *name = StringValuePtr(name_value);
2144
+ Smoke::ModuleIndex mi = Smoke::findClass(name);
2145
+ return rb_funcall(moduleindex_class, rb_intern("new"), 2, INT2NUM(smokeList.indexOf(mi.smoke)), INT2NUM(mi.index));
2146
+ }
2147
+
2148
+ // static VALUE
2149
+ // idMethodName(VALUE /*self*/, VALUE name_value)
2150
+ // {
2151
+ // char *name = StringValuePtr(name_value);
2152
+ // return INT2NUM(qtcore_Smoke->idMethodName(name).index);
2153
+ // }
2154
+ //
2155
+ // static VALUE
2156
+ // idMethod(VALUE /*self*/, VALUE idclass_value, VALUE idmethodname_value)
2157
+ // {
2158
+ // int idclass = NUM2INT(idclass_value);
2159
+ // int idmethodname = NUM2INT(idmethodname_value);
2160
+ // return INT2NUM(qtcore_Smoke->idMethod(idclass, idmethodname).index);
2161
+ // }
2162
+
2163
+ static VALUE
2164
+ dumpCandidates(VALUE /*self*/, VALUE rmeths)
2165
+ {
2166
+ VALUE errmsg = rb_str_new2("");
2167
+ if(rmeths != Qnil) {
2168
+ int count = RARRAY_LEN(rmeths);
2169
+ for(int i = 0; i < count; i++) {
2170
+ qt_rb_str_catf(errmsg, "\t");
2171
+ int id = NUM2INT(rb_funcall(rb_ary_entry(rmeths, i), rb_intern("index"), 0));
2172
+ Smoke* smoke = smokeList[NUM2INT(rb_funcall(rb_ary_entry(rmeths, i), rb_intern("smoke"), 0))];
2173
+ const Smoke::Method &meth = smoke->methods[id];
2174
+ const char *tname = smoke->types[meth.ret].name;
2175
+ if(meth.flags & Smoke::mf_enum) {
2176
+ qt_rb_str_catf(errmsg, "enum ");
2177
+ qt_rb_str_catf(errmsg, "%s::%s", smoke->classes[meth.classId].className, smoke->methodNames[meth.name]);
2178
+ qt_rb_str_catf(errmsg, "\n");
2179
+ } else {
2180
+ if(meth.flags & Smoke::mf_static) qt_rb_str_catf(errmsg, "static ");
2181
+ qt_rb_str_catf(errmsg, "%s ", (tname ? tname:"void"));
2182
+ qt_rb_str_catf(errmsg, "%s::%s(", smoke->classes[meth.classId].className, smoke->methodNames[meth.name]);
2183
+ for(int i = 0; i < meth.numArgs; i++) {
2184
+ if(i) qt_rb_str_catf(errmsg, ", ");
2185
+ tname = smoke->types[smoke->argumentList[meth.args+i]].name;
2186
+ qt_rb_str_catf(errmsg, "%s", (tname ? tname:"void"));
2187
+ }
2188
+ qt_rb_str_catf(errmsg, ")");
2189
+ if(meth.flags & Smoke::mf_const) qt_rb_str_catf(errmsg, " const");
2190
+ qt_rb_str_catf(errmsg, "\n");
2191
+ }
2192
+ }
2193
+ }
2194
+ return errmsg;
2195
+ }
2196
+
2197
+ static VALUE
2198
+ isConstMethod(VALUE /*self*/, VALUE idx)
2199
+ {
2200
+ int id = NUM2INT(rb_funcall(idx, rb_intern("index"), 0));
2201
+ Smoke* smoke = smokeList[NUM2INT(rb_funcall(idx, rb_intern("smoke"), 0))];
2202
+ const Smoke::Method &meth = smoke->methods[id];
2203
+ return (meth.flags & Smoke::mf_const) ? Qtrue : Qfalse;
2204
+ }
2205
+
2206
+ static VALUE
2207
+ isObject(VALUE /*self*/, VALUE obj)
2208
+ {
2209
+ void * ptr = 0;
2210
+ ptr = value_to_ptr(obj);
2211
+ return (ptr > (void *)0 ? Qtrue : Qfalse);
2212
+ }
2213
+
2214
+ static VALUE
2215
+ setCurrentMethod(VALUE self, VALUE meth_value)
2216
+ {
2217
+ int smokeidx = NUM2INT(rb_funcall(meth_value, rb_intern("smoke"), 0));
2218
+ int meth = NUM2INT(rb_funcall(meth_value, rb_intern("index"), 0));
2219
+ // FIXME: damn, this is lame, and it doesn't handle ambiguous methods
2220
+ _current_method.smoke = smokeList[smokeidx]; //qtcore_Smoke->methodMaps[meth].method;
2221
+ _current_method.index = meth;
2222
+ return self;
2223
+ }
2224
+
2225
+ static VALUE
2226
+ getClassList(VALUE /*self*/)
2227
+ {
2228
+ VALUE class_list = rb_ary_new();
2229
+
2230
+ for (int i = 1; i <= qtcore_Smoke->numClasses; i++) {
2231
+ if (qtcore_Smoke->classes[i].className && !qtcore_Smoke->classes[i].external)
2232
+ rb_ary_push(class_list, rb_str_new2(qtcore_Smoke->classes[i].className));
2233
+ }
2234
+
2235
+ for (int i = 1; i <= qtgui_Smoke->numClasses; i++) {
2236
+ if (qtgui_Smoke->classes[i].className && !qtgui_Smoke->classes[i].external)
2237
+ rb_ary_push(class_list, rb_str_new2(qtgui_Smoke->classes[i].className));
2238
+ }
2239
+
2240
+ for (int i = 1; i <= qtxml_Smoke->numClasses; i++) {
2241
+ if (qtxml_Smoke->classes[i].className && !qtxml_Smoke->classes[i].external)
2242
+ rb_ary_push(class_list, rb_str_new2(qtxml_Smoke->classes[i].className));
2243
+ }
2244
+
2245
+ for (int i = 1; i <= qtsql_Smoke->numClasses; i++) {
2246
+ if (qtsql_Smoke->classes[i].className && !qtsql_Smoke->classes[i].external)
2247
+ rb_ary_push(class_list, rb_str_new2(qtsql_Smoke->classes[i].className));
2248
+ }
2249
+
2250
+ for (int i = 1; i <= qtopengl_Smoke->numClasses; i++) {
2251
+ if (qtopengl_Smoke->classes[i].className && !qtopengl_Smoke->classes[i].external)
2252
+ rb_ary_push(class_list, rb_str_new2(qtopengl_Smoke->classes[i].className));
2253
+ }
2254
+
2255
+ for (int i = 1; i <= qtnetwork_Smoke->numClasses; i++) {
2256
+ if (qtnetwork_Smoke->classes[i].className && !qtnetwork_Smoke->classes[i].external)
2257
+ rb_ary_push(class_list, rb_str_new2(qtnetwork_Smoke->classes[i].className));
2258
+ }
2259
+
2260
+ for (int i = 1; i <= qtsvg_Smoke->numClasses; i++) {
2261
+ if (qtsvg_Smoke->classes[i].className && !qtsvg_Smoke->classes[i].external)
2262
+ rb_ary_push(class_list, rb_str_new2(qtsvg_Smoke->classes[i].className));
2263
+ }
2264
+
2265
+ #ifdef QT_QTDBUS
2266
+ for (int i = 1; i <= qtdbus_Smoke->numClasses; i++) {
2267
+ if (qtdbus_Smoke->classes[i].className && !qtdbus_Smoke->classes[i].external)
2268
+ rb_ary_push(class_list, rb_str_new2(qtdbus_Smoke->classes[i].className));
2269
+ }
2270
+ #endif
2271
+
2272
+ return class_list;
2273
+ }
2274
+
2275
+ static VALUE
2276
+ create_qobject_class(VALUE /*self*/, VALUE package_value, VALUE module_value)
2277
+ {
2278
+ const char *package = strdup(StringValuePtr(package_value));
2279
+ // this won't work:
2280
+ // strdup(StringValuePtr(rb_funcall(module_value, rb_intern("name"), 0)))
2281
+ // any ideas why?
2282
+ VALUE value_moduleName = rb_funcall(module_value, rb_intern("name"), 0);
2283
+ const char *moduleName = strdup(StringValuePtr(value_moduleName));
2284
+ VALUE klass = module_value;
2285
+
2286
+ QString packageName(package);
2287
+
2288
+ foreach(QString s, packageName.mid(strlen(moduleName) + 2).split("::")) {
2289
+ klass = rb_define_class_under(klass, (const char*) s.toLatin1(), qt_base_class);
2290
+ }
2291
+
2292
+ if (packageName == "Qt::Application" || packageName == "Qt::CoreApplication" ) {
2293
+ rb_define_method(klass, "ARGV", (VALUE (*) (...)) qapplication_argv, 0);
2294
+ } else if (packageName == "Qt::Object") {
2295
+ rb_define_singleton_method(klass, "staticMetaObject", (VALUE (*) (...)) qobject_staticmetaobject, 0);
2296
+ } else if (packageName == "Qt::AbstractTableModel") {
2297
+ qtablemodel_class = rb_define_class_under(qt_module, "TableModel", klass);
2298
+ rb_define_method(qtablemodel_class, "rowCount", (VALUE (*) (...)) qabstract_item_model_rowcount, -1);
2299
+ rb_define_method(qtablemodel_class, "row_count", (VALUE (*) (...)) qabstract_item_model_rowcount, -1);
2300
+ rb_define_method(qtablemodel_class, "columnCount", (VALUE (*) (...)) qabstract_item_model_columncount, -1);
2301
+ rb_define_method(qtablemodel_class, "column_count", (VALUE (*) (...)) qabstract_item_model_columncount, -1);
2302
+ rb_define_method(qtablemodel_class, "data", (VALUE (*) (...)) qabstract_item_model_data, -1);
2303
+ rb_define_method(qtablemodel_class, "setData", (VALUE (*) (...)) qabstract_item_model_setdata, -1);
2304
+ rb_define_method(qtablemodel_class, "set_data", (VALUE (*) (...)) qabstract_item_model_setdata, -1);
2305
+ rb_define_method(qtablemodel_class, "flags", (VALUE (*) (...)) qabstract_item_model_flags, 1);
2306
+ rb_define_method(qtablemodel_class, "insertRows", (VALUE (*) (...)) qabstract_item_model_insertrows, -1);
2307
+ rb_define_method(qtablemodel_class, "insert_rows", (VALUE (*) (...)) qabstract_item_model_insertrows, -1);
2308
+ rb_define_method(qtablemodel_class, "insertColumns", (VALUE (*) (...)) qabstract_item_model_insertcolumns, -1);
2309
+ rb_define_method(qtablemodel_class, "insert_columns", (VALUE (*) (...)) qabstract_item_model_insertcolumns, -1);
2310
+ rb_define_method(qtablemodel_class, "removeRows", (VALUE (*) (...)) qabstract_item_model_removerows, -1);
2311
+ rb_define_method(qtablemodel_class, "remove_rows", (VALUE (*) (...)) qabstract_item_model_removerows, -1);
2312
+ rb_define_method(qtablemodel_class, "removeColumns", (VALUE (*) (...)) qabstract_item_model_removecolumns, -1);
2313
+ rb_define_method(qtablemodel_class, "remove_columns", (VALUE (*) (...)) qabstract_item_model_removecolumns, -1);
2314
+
2315
+ qlistmodel_class = rb_define_class_under(qt_module, "ListModel", klass);
2316
+ rb_define_method(qlistmodel_class, "rowCount", (VALUE (*) (...)) qabstract_item_model_rowcount, -1);
2317
+ rb_define_method(qlistmodel_class, "row_count", (VALUE (*) (...)) qabstract_item_model_rowcount, -1);
2318
+ rb_define_method(qlistmodel_class, "columnCount", (VALUE (*) (...)) qabstract_item_model_columncount, -1);
2319
+ rb_define_method(qlistmodel_class, "column_count", (VALUE (*) (...)) qabstract_item_model_columncount, -1);
2320
+ rb_define_method(qlistmodel_class, "data", (VALUE (*) (...)) qabstract_item_model_data, -1);
2321
+ rb_define_method(qlistmodel_class, "setData", (VALUE (*) (...)) qabstract_item_model_setdata, -1);
2322
+ rb_define_method(qlistmodel_class, "set_data", (VALUE (*) (...)) qabstract_item_model_setdata, -1);
2323
+ rb_define_method(qlistmodel_class, "flags", (VALUE (*) (...)) qabstract_item_model_flags, 1);
2324
+ rb_define_method(qlistmodel_class, "insertRows", (VALUE (*) (...)) qabstract_item_model_insertrows, -1);
2325
+ rb_define_method(qlistmodel_class, "insert_rows", (VALUE (*) (...)) qabstract_item_model_insertrows, -1);
2326
+ rb_define_method(qlistmodel_class, "insertColumns", (VALUE (*) (...)) qabstract_item_model_insertcolumns, -1);
2327
+ rb_define_method(qlistmodel_class, "insert_columns", (VALUE (*) (...)) qabstract_item_model_insertcolumns, -1);
2328
+ rb_define_method(qlistmodel_class, "removeRows", (VALUE (*) (...)) qabstract_item_model_removerows, -1);
2329
+ rb_define_method(qlistmodel_class, "remove_rows", (VALUE (*) (...)) qabstract_item_model_removerows, -1);
2330
+ rb_define_method(qlistmodel_class, "removeColumns", (VALUE (*) (...)) qabstract_item_model_removecolumns, -1);
2331
+ rb_define_method(qlistmodel_class, "remove_columns", (VALUE (*) (...)) qabstract_item_model_removecolumns, -1);
2332
+ #if QT_VERSION >= 0x040600
2333
+ // make it work with qml
2334
+ rb_define_method(qlistmodel_class, "roleNames", (VALUE (*) (...)) qabstractitemmodel_rolenames, -1);
2335
+ rb_define_method(qlistmodel_class, "role_names", (VALUE (*) (...)) qabstractitemmodel_rolenames, -1);
2336
+ rb_define_method(qlistmodel_class, "setRoleNames", (VALUE (*) (...)) qabstractitemmodel_setrolenames, -1);
2337
+ rb_define_method(qlistmodel_class, "set_role_names", (VALUE (*) (...)) qabstractitemmodel_setrolenames, -1);
2338
+ #endif
2339
+ }
2340
+ else if (packageName == "Qt::AbstractItemModel") {
2341
+ rb_define_method(klass, "createIndex", (VALUE (*) (...)) qabstractitemmodel_createindex, -1);
2342
+ rb_define_method(klass, "create_index", (VALUE (*) (...)) qabstractitemmodel_createindex, -1);
2343
+ } else if (packageName == "Qt::Timer") {
2344
+ rb_define_singleton_method(klass, "singleShot", (VALUE (*) (...)) qtimer_single_shot, -1);
2345
+ rb_define_singleton_method(klass, "single_shot", (VALUE (*) (...)) qtimer_single_shot, -1);
2346
+ }
2347
+
2348
+
2349
+ rb_define_method(klass, "qobject_cast", (VALUE (*) (...)) qobject_qt_metacast, 1);
2350
+ rb_define_method(klass, "inspect", (VALUE (*) (...)) inspect_qobject, 0);
2351
+ rb_define_method(klass, "pretty_print", (VALUE (*) (...)) pretty_print_qobject, 1);
2352
+ rb_define_method(klass, "className", (VALUE (*) (...)) class_name, 0);
2353
+ rb_define_method(klass, "class_name", (VALUE (*) (...)) class_name, 0);
2354
+ rb_define_method(klass, "inherits", (VALUE (*) (...)) inherits_qobject, -1);
2355
+ rb_define_method(klass, "findChildren", (VALUE (*) (...)) find_qobject_children, -1);
2356
+ rb_define_method(klass, "find_children", (VALUE (*) (...)) find_qobject_children, -1);
2357
+ rb_define_method(klass, "findChild", (VALUE (*) (...)) find_qobject_child, -1);
2358
+ rb_define_method(klass, "find_child", (VALUE (*) (...)) find_qobject_child, -1);
2359
+ rb_define_method(klass, "connect", (VALUE (*) (...)) qobject_connect, -1);
2360
+ rb_define_singleton_method(klass, "connect", (VALUE (*) (...)) qobject_connect, -1);
2361
+
2362
+ foreach(QtRubyModule m, qtruby_modules.values()) {
2363
+ if (m.class_created)
2364
+ m.class_created(package, module_value, klass);
2365
+ }
2366
+
2367
+ free((void *) package);
2368
+ return klass;
2369
+ }
2370
+
2371
+ static VALUE
2372
+ create_qt_class(VALUE /*self*/, VALUE package_value, VALUE module_value)
2373
+ {
2374
+ const char *package = strdup(StringValuePtr(package_value));
2375
+ // this won't work:
2376
+ // strdup(StringValuePtr(rb_funcall(module_value, rb_intern("name"), 0)))
2377
+ // any ideas why?
2378
+ VALUE value_moduleName = rb_funcall(module_value, rb_intern("name"), 0);
2379
+ const char *moduleName = strdup(StringValuePtr(value_moduleName));
2380
+ VALUE klass = module_value;
2381
+ QString packageName(package);
2382
+
2383
+ /*
2384
+ rb_define_singleton_method(module_value, "method_missing", (VALUE (*) (...)) module_method_missing, -1);
2385
+ rb_define_singleton_method(module_value, "const_missing", (VALUE (*) (...)) module_method_missing, -1);
2386
+ */
2387
+ foreach(QString s, packageName.mid(strlen(moduleName) + 2).split("::")) {
2388
+ klass = rb_define_class_under(klass, (const char*) s.toLatin1(), qt_base_class);
2389
+ }
2390
+
2391
+ if (packageName == "Qt::MetaObject") {
2392
+ qmetaobject_class = klass;
2393
+ } else if (packageName == "Qt::Variant") {
2394
+ qvariant_class = klass;
2395
+ rb_define_singleton_method(qvariant_class, "fromValue", (VALUE (*) (...)) qvariant_from_value, -1);
2396
+ rb_define_singleton_method(qvariant_class, "from_value", (VALUE (*) (...)) qvariant_from_value, -1);
2397
+ rb_define_singleton_method(qvariant_class, "new", (VALUE (*) (...)) new_qvariant, -1);
2398
+ } else if (packageName == "Qt::ByteArray") {
2399
+ rb_define_method(klass, "+", (VALUE (*) (...)) qbytearray_append, 1);
2400
+ rb_define_method(klass, "data", (VALUE (*) (...)) qbytearray_data, 0);
2401
+ rb_define_method(klass, "constData", (VALUE (*) (...)) qbytearray_data, 0);
2402
+ rb_define_method(klass, "const_data", (VALUE (*) (...)) qbytearray_data, 0);
2403
+ } else if (packageName == "Qt::Char") {
2404
+ rb_define_method(klass, "to_s", (VALUE (*) (...)) qchar_to_s, 0);
2405
+ } else if (packageName == "Qt::Image") {
2406
+ rb_define_method(klass, "bits", (VALUE (*) (...)) qimage_bits, 0);
2407
+ rb_define_method(klass, "scanLine", (VALUE (*) (...)) qimage_scan_line, 1);
2408
+ } else if (packageName == "Qt::ItemSelection") {
2409
+ rb_define_method(klass, "[]", (VALUE (*) (...)) qitemselection_at, 1);
2410
+ rb_define_method(klass, "at", (VALUE (*) (...)) qitemselection_at, 1);
2411
+ rb_define_method(klass, "count", (VALUE (*) (...)) qitemselection_count, 0);
2412
+ rb_define_method(klass, "length", (VALUE (*) (...)) qitemselection_count, 0);
2413
+ } else if (packageName == "Qt::Polygon") {
2414
+ rb_define_method(klass, "[]", (VALUE (*) (...)) qpolygon_at, 1);
2415
+ rb_define_method(klass, "at", (VALUE (*) (...)) qpolygon_at, 1);
2416
+ rb_define_method(klass, "count", (VALUE (*) (...)) qpolygon_count, 0);
2417
+ rb_define_method(klass, "length", (VALUE (*) (...)) qpolygon_count, 0);
2418
+ } else if (packageName == "Qt::PolygonF") {
2419
+ rb_define_method(klass, "[]", (VALUE (*) (...)) qpolygonf_at, 1);
2420
+ rb_define_method(klass, "at", (VALUE (*) (...)) qpolygonf_at, 1);
2421
+ rb_define_method(klass, "count", (VALUE (*) (...)) qpolygonf_count, 0);
2422
+ rb_define_method(klass, "length", (VALUE (*) (...)) qpolygonf_count, 0);
2423
+ rb_define_method(klass, "point", (VALUE (*) (...)) qpolygonf_at, 1);
2424
+ } else if (packageName == "Qt::Painter") {
2425
+ rb_define_method(klass, "drawLines", (VALUE (*) (...)) qpainter_drawlines, -1);
2426
+ rb_define_method(klass, "draw_lines", (VALUE (*) (...)) qpainter_drawlines, -1);
2427
+ rb_define_method(klass, "drawRects", (VALUE (*) (...)) qpainter_drawrects, -1);
2428
+ rb_define_method(klass, "draw_rects", (VALUE (*) (...)) qpainter_drawrects, -1);
2429
+ } else if (packageName == "Qt::ModelIndex") {
2430
+ rb_define_method(klass, "internalPointer", (VALUE (*) (...)) qmodelindex_internalpointer, 0);
2431
+ rb_define_method(klass, "internal_pointer", (VALUE (*) (...)) qmodelindex_internalpointer, 0);
2432
+ } else if (packageName == "Qt::SignalMapper") {
2433
+ rb_define_method(klass, "mapping", (VALUE (*) (...)) qsignalmapper_mapping, -1);
2434
+ rb_define_method(klass, "setMapping", (VALUE (*) (...)) qsignalmapper_set_mapping, -1);
2435
+ rb_define_method(klass, "set_mapping", (VALUE (*) (...)) qsignalmapper_set_mapping, -1);
2436
+ #ifdef QT_QTDBUS
2437
+ } else if (packageName == "Qt::DBusArgument") {
2438
+ rb_define_method(klass, "endArrayWrite", (VALUE (*) (...)) qdbusargument_endarraywrite, 0);
2439
+ rb_define_method(klass, "end_array_write", (VALUE (*) (...)) qdbusargument_endarraywrite, 0);
2440
+ rb_define_method(klass, "endMapEntryWrite", (VALUE (*) (...)) qdbusargument_endmapentrywrite, 0);
2441
+ rb_define_method(klass, "end_map_entry_write", (VALUE (*) (...)) qdbusargument_endmapentrywrite, 0);
2442
+ rb_define_method(klass, "endMapWrite", (VALUE (*) (...)) qdbusargument_endmapwrite, 0);
2443
+ rb_define_method(klass, "end_map_write", (VALUE (*) (...)) qdbusargument_endmapwrite, 0);
2444
+ rb_define_method(klass, "endStructureWrite", (VALUE (*) (...)) qdbusargument_endstructurewrite, 0);
2445
+ rb_define_method(klass, "end_structure_write", (VALUE (*) (...)) qdbusargument_endstructurewrite, 0);
2446
+ #endif
2447
+ }
2448
+
2449
+ foreach(QtRubyModule m, qtruby_modules.values()) {
2450
+ if (m.class_created)
2451
+ m.class_created(package, module_value, klass);
2452
+ }
2453
+
2454
+ free((void *) package);
2455
+ return klass;
2456
+ }
2457
+
2458
+ static VALUE
2459
+ version(VALUE /*self*/)
2460
+ {
2461
+ return rb_str_new2(QT_VERSION_STR);
2462
+ }
2463
+
2464
+ static VALUE
2465
+ qtruby_version(VALUE /*self*/)
2466
+ {
2467
+ return rb_str_new2(QTRUBY_VERSION);
2468
+ }
2469
+
2470
+ static VALUE
2471
+ set_application_terminated(VALUE /*self*/, VALUE yn)
2472
+ {
2473
+ application_terminated = (yn == Qtrue ? true : false);
2474
+ return Qnil;
2475
+ }
2476
+
2477
+ static VALUE
2478
+ set_qtruby_embedded_wrapped(VALUE /*self*/, VALUE yn)
2479
+ {
2480
+ set_qtruby_embedded( yn == Qtrue );
2481
+ return Qnil;
2482
+ }
2483
+
2484
+ #define INIT_BINDING(module) \
2485
+ static QtRuby::Binding module##_binding = QtRuby::Binding(module##_Smoke); \
2486
+ QtRubyModule module = { "QtRuby_" #module, resolve_classname_qt, 0, &module##_binding }; \
2487
+ qtruby_modules[module##_Smoke] = module; \
2488
+ smokeList << module##_Smoke;
2489
+
2490
+ extern Q_DECL_EXPORT void
2491
+ Init_qtruby4()
2492
+ {
2493
+ init_qtcore_Smoke();
2494
+ init_qtgui_Smoke();
2495
+ init_qtxml_Smoke();
2496
+ init_qtsql_Smoke();
2497
+ init_qtopengl_Smoke();
2498
+ init_qtnetwork_Smoke();
2499
+ init_qtsvg_Smoke();
2500
+ #ifdef QT_QTDBUS
2501
+ init_qtdbus_Smoke();
2502
+ #endif
2503
+ install_handlers(Qt_handlers);
2504
+
2505
+ INIT_BINDING(qtcore)
2506
+ INIT_BINDING(qtgui)
2507
+ INIT_BINDING(qtxml)
2508
+ INIT_BINDING(qtsql)
2509
+ INIT_BINDING(qtopengl)
2510
+ INIT_BINDING(qtnetwork)
2511
+ INIT_BINDING(qtsvg)
2512
+ #ifdef QT_QTDBUS
2513
+ INIT_BINDING(qtdbus)
2514
+ #endif
2515
+
2516
+ if (qt_module == Qnil) {
2517
+ qt_module = rb_define_module("Qt");
2518
+ qt_internal_module = rb_define_module_under(qt_module, "Internal");
2519
+ qt_base_class = rb_define_class_under(qt_module, "Base", rb_cObject);
2520
+ moduleindex_class = rb_define_class_under(qt_internal_module, "ModuleIndex", rb_cObject);
2521
+ }
2522
+
2523
+ rb_define_singleton_method(qt_base_class, "new", (VALUE (*) (...)) new_qt, -1);
2524
+ rb_define_method(qt_base_class, "initialize", (VALUE (*) (...)) initialize_qt, -1);
2525
+ rb_define_singleton_method(qt_base_class, "method_missing", (VALUE (*) (...)) class_method_missing, -1);
2526
+ rb_define_singleton_method(qt_module, "method_missing", (VALUE (*) (...)) module_method_missing, -1);
2527
+ rb_define_method(qt_base_class, "method_missing", (VALUE (*) (...)) method_missing, -1);
2528
+
2529
+ rb_define_singleton_method(qt_base_class, "const_missing", (VALUE (*) (...)) class_method_missing, -1);
2530
+ rb_define_singleton_method(qt_module, "const_missing", (VALUE (*) (...)) module_method_missing, -1);
2531
+ rb_define_method(qt_base_class, "const_missing", (VALUE (*) (...)) method_missing, -1);
2532
+
2533
+ rb_define_method(qt_base_class, "dispose", (VALUE (*) (...)) dispose, 0);
2534
+ rb_define_method(qt_base_class, "isDisposed", (VALUE (*) (...)) is_disposed, 0);
2535
+ rb_define_method(qt_base_class, "disposed?", (VALUE (*) (...)) is_disposed, 0);
2536
+
2537
+ rb_define_method(qt_base_class, "qVariantValue", (VALUE (*) (...)) qvariant_value, 2);
2538
+ rb_define_method(qt_base_class, "qVariantFromValue", (VALUE (*) (...)) qvariant_from_value, -1);
2539
+
2540
+ rb_define_method(rb_cObject, "qDebug", (VALUE (*) (...)) qdebug, 1);
2541
+ rb_define_method(rb_cObject, "qFatal", (VALUE (*) (...)) qfatal, 1);
2542
+ rb_define_method(rb_cObject, "qWarning", (VALUE (*) (...)) qwarning, 1);
2543
+
2544
+ rb_define_module_function(qt_internal_module, "getMethStat", (VALUE (*) (...)) getMethStat, 0);
2545
+ rb_define_module_function(qt_internal_module, "getClassStat", (VALUE (*) (...)) getClassStat, 0);
2546
+ rb_define_module_function(qt_internal_module, "getIsa", (VALUE (*) (...)) getIsa, 1);
2547
+ rb_define_module_function(qt_internal_module, "setDebug", (VALUE (*) (...)) setDebug, 1);
2548
+ rb_define_module_function(qt_internal_module, "debug", (VALUE (*) (...)) debugging, 0);
2549
+ rb_define_module_function(qt_internal_module, "get_arg_type_name", (VALUE (*) (...)) get_arg_type_name, 2);
2550
+ rb_define_module_function(qt_internal_module, "classIsa", (VALUE (*) (...)) classIsa, 2);
2551
+ rb_define_module_function(qt_internal_module, "isEnum", (VALUE (*) (...)) isEnum, 1);
2552
+ rb_define_module_function(qt_internal_module, "insert_pclassid", (VALUE (*) (...)) insert_pclassid, 2);
2553
+ rb_define_module_function(qt_internal_module, "classid2name", (VALUE (*) (...)) classid2name, 1);
2554
+ rb_define_module_function(qt_internal_module, "find_pclassid", (VALUE (*) (...)) find_pclassid, 1);
2555
+ rb_define_module_function(qt_internal_module, "get_value_type", (VALUE (*) (...)) get_value_type, 1);
2556
+
2557
+ rb_define_module_function(qt_internal_module, "make_metaObject", (VALUE (*) (...)) make_metaObject, 4);
2558
+ rb_define_module_function(qt_internal_module, "addMetaObjectMethods", (VALUE (*) (...)) add_metaobject_methods, 1);
2559
+ rb_define_module_function(qt_internal_module, "addSignalMethods", (VALUE (*) (...)) add_signal_methods, 2);
2560
+ rb_define_module_function(qt_internal_module, "mapObject", (VALUE (*) (...)) mapObject, 1);
2561
+
2562
+ rb_define_module_function(qt_internal_module, "isQObject", (VALUE (*) (...)) isQObject, 1);
2563
+ rb_define_module_function(qt_internal_module, "idInstance", (VALUE (*) (...)) idInstance, 1);
2564
+ rb_define_module_function(qt_internal_module, "findClass", (VALUE (*) (...)) findClass, 1);
2565
+ // rb_define_module_function(qt_internal_module, "idMethodName", (VALUE (*) (...)) idMethodName, 1);
2566
+ // rb_define_module_function(qt_internal_module, "idMethod", (VALUE (*) (...)) idMethod, 2);
2567
+ rb_define_module_function(qt_internal_module, "findMethod", (VALUE (*) (...)) findMethod, 2);
2568
+ rb_define_module_function(qt_internal_module, "findAllMethods", (VALUE (*) (...)) findAllMethods, -1);
2569
+ rb_define_module_function(qt_internal_module, "findAllMethodNames", (VALUE (*) (...)) findAllMethodNames, 3);
2570
+ rb_define_module_function(qt_internal_module, "dumpCandidates", (VALUE (*) (...)) dumpCandidates, 1);
2571
+ rb_define_module_function(qt_internal_module, "isConstMethod", (VALUE (*) (...)) isConstMethod, 1);
2572
+ rb_define_module_function(qt_internal_module, "isObject", (VALUE (*) (...)) isObject, 1);
2573
+ rb_define_module_function(qt_internal_module, "setCurrentMethod", (VALUE (*) (...)) setCurrentMethod, 1);
2574
+ rb_define_module_function(qt_internal_module, "getClassList", (VALUE (*) (...)) getClassList, 0);
2575
+ rb_define_module_function(qt_internal_module, "create_qt_class", (VALUE (*) (...)) create_qt_class, 2);
2576
+ rb_define_module_function(qt_internal_module, "create_qobject_class", (VALUE (*) (...)) create_qobject_class, 2);
2577
+ rb_define_module_function(qt_internal_module, "cast_object_to", (VALUE (*) (...)) cast_object_to, 2);
2578
+ rb_define_module_function(qt_module, "dynamic_cast", (VALUE (*) (...)) cast_object_to, 2);
2579
+ rb_define_module_function(qt_internal_module, "kross2smoke", (VALUE (*) (...)) kross2smoke, 2);
2580
+ rb_define_module_function(qt_internal_module, "set_qtruby_embedded", (VALUE (*) (...)) set_qtruby_embedded_wrapped, 1);
2581
+
2582
+ rb_define_module_function(qt_internal_module, "application_terminated=", (VALUE (*) (...)) set_application_terminated, 1);
2583
+
2584
+ rb_define_module_function(qt_module, "version", (VALUE (*) (...)) version, 0);
2585
+ rb_define_module_function(qt_module, "qtruby_version", (VALUE (*) (...)) qtruby_version, 0);
2586
+
2587
+ rb_define_module_function(qt_module, "qRegisterResourceData", (VALUE (*) (...)) q_register_resource_data, 4);
2588
+ rb_define_module_function(qt_module, "qUnregisterResourceData", (VALUE (*) (...)) q_unregister_resource_data, 4);
2589
+
2590
+ // A problem has been found with QtRuby when it is run with Ruby 1.9.1
2591
+ // and GC.stess is true.
2592
+ // In the smokeruby_mark() function called during garbage collection,
2593
+ // any virtual methods which are called on the instances being checked
2594
+ // could have overriden by Ruby methods. So the Wt::Ruby runtime uses
2595
+ // 'respond_to()' to find out whether they have been overriden.
2596
+ // However, this involves calling 'rb_intern()' on the method name,
2597
+ // which means memory could be allocated, giving an error when running under
2598
+ // GC.stress mode. So workround it by pre-allocating any strings with
2599
+ // rb_intern() for all the C++ methods used in smokeruby_mark()
2600
+ rb_intern("children");
2601
+ rb_intern("childItems");
2602
+ rb_intern("childCount");
2603
+ rb_intern("child");
2604
+ rb_intern("hasChildren");
2605
+ rb_intern("parent");
2606
+ rb_intern("parentItem");
2607
+ rb_intern("item");
2608
+ rb_intern("items");
2609
+ rb_intern("rowCount");
2610
+ rb_intern("rowAt");
2611
+ rb_intern("columnCount");
2612
+ rb_intern("elementAt");
2613
+ rb_intern("columnAt");
2614
+ rb_intern("topLevelItem");
2615
+ rb_intern("itemAt");
2616
+ rb_intern("internalPointer");
2617
+
2618
+ rb_require("Qt/qtruby4.rb");
2619
+
2620
+ rObject_typeId = QMetaType::registerType("rObject", &delete_ruby_object, &create_ruby_object);
2621
+
2622
+ // Do package initialization
2623
+ rb_funcall(qt_internal_module, rb_intern("init_all_classes"), 0);
2624
+ }
2625
+
2626
+ }
2627
+ // kate: space-indent false;