psychopy 2025.2.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3127) hide show
  1. psychopy/CHANGELOG.txt +3981 -0
  2. psychopy/GIT_SHA +1 -0
  3. psychopy/LICENSE.txt +11 -0
  4. psychopy/LICENSES.txt +55 -0
  5. psychopy/VERSION +1 -0
  6. psychopy/__init__.py +148 -0
  7. psychopy/alerts/__init__.py +65 -0
  8. psychopy/alerts/_alerts.py +224 -0
  9. psychopy/alerts/_errorHandler.py +50 -0
  10. psychopy/alerts/alertsCatalogue/1000.yaml +0 -0
  11. psychopy/alerts/alertsCatalogue/1100.yaml +0 -0
  12. psychopy/alerts/alertsCatalogue/1500.yaml +0 -0
  13. psychopy/alerts/alertsCatalogue/2000.yaml +0 -0
  14. psychopy/alerts/alertsCatalogue/2100.yaml +0 -0
  15. psychopy/alerts/alertsCatalogue/2110.yaml +0 -0
  16. psychopy/alerts/alertsCatalogue/2115.yaml +21 -0
  17. psychopy/alerts/alertsCatalogue/2120.yaml +22 -0
  18. psychopy/alerts/alertsCatalogue/2150.yaml +0 -0
  19. psychopy/alerts/alertsCatalogue/2155.yaml +21 -0
  20. psychopy/alerts/alertsCatalogue/2300.yaml +0 -0
  21. psychopy/alerts/alertsCatalogue/2500.yaml +0 -0
  22. psychopy/alerts/alertsCatalogue/3000.yaml +0 -0
  23. psychopy/alerts/alertsCatalogue/3100.yaml +0 -0
  24. psychopy/alerts/alertsCatalogue/3110.yaml +25 -0
  25. psychopy/alerts/alertsCatalogue/3115.yaml +24 -0
  26. psychopy/alerts/alertsCatalogue/3200.yaml +0 -0
  27. psychopy/alerts/alertsCatalogue/3210.yaml +27 -0
  28. psychopy/alerts/alertsCatalogue/3400.yaml +0 -0
  29. psychopy/alerts/alertsCatalogue/3600.yaml +0 -0
  30. psychopy/alerts/alertsCatalogue/3610.yaml +19 -0
  31. psychopy/alerts/alertsCatalogue/4000.yaml +0 -0
  32. psychopy/alerts/alertsCatalogue/4051.yaml +19 -0
  33. psychopy/alerts/alertsCatalogue/4052.yaml +19 -0
  34. psychopy/alerts/alertsCatalogue/4100.yaml +0 -0
  35. psychopy/alerts/alertsCatalogue/4105.yaml +18 -0
  36. psychopy/alerts/alertsCatalogue/4115.yaml +21 -0
  37. psychopy/alerts/alertsCatalogue/4120.yaml +19 -0
  38. psychopy/alerts/alertsCatalogue/4125.yaml +23 -0
  39. psychopy/alerts/alertsCatalogue/4130.yaml +19 -0
  40. psychopy/alerts/alertsCatalogue/4160.yaml +25 -0
  41. psychopy/alerts/alertsCatalogue/4200.yaml +0 -0
  42. psychopy/alerts/alertsCatalogue/4205.yaml +19 -0
  43. psychopy/alerts/alertsCatalogue/4210.yaml +19 -0
  44. psychopy/alerts/alertsCatalogue/4305.yaml +21 -0
  45. psychopy/alerts/alertsCatalogue/4310.yaml +21 -0
  46. psychopy/alerts/alertsCatalogue/4315.yaml +21 -0
  47. psychopy/alerts/alertsCatalogue/4320.yaml +19 -0
  48. psychopy/alerts/alertsCatalogue/4325.yaml +23 -0
  49. psychopy/alerts/alertsCatalogue/4330.yaml +19 -0
  50. psychopy/alerts/alertsCatalogue/4335.yaml +19 -0
  51. psychopy/alerts/alertsCatalogue/4340.yaml +19 -0
  52. psychopy/alerts/alertsCatalogue/4405.yaml +24 -0
  53. psychopy/alerts/alertsCatalogue/4505.yaml +22 -0
  54. psychopy/alerts/alertsCatalogue/4510.yaml +25 -0
  55. psychopy/alerts/alertsCatalogue/4520.yaml +26 -0
  56. psychopy/alerts/alertsCatalogue/4530.yaml +23 -0
  57. psychopy/alerts/alertsCatalogue/4540.yaml +19 -0
  58. psychopy/alerts/alertsCatalogue/4545.yaml +22 -0
  59. psychopy/alerts/alertsCatalogue/4550.yaml +19 -0
  60. psychopy/alerts/alertsCatalogue/4605.yaml +22 -0
  61. psychopy/alerts/alertsCatalogue/4610.yaml +22 -0
  62. psychopy/alerts/alertsCatalogue/4615.yaml +19 -0
  63. psychopy/alerts/alertsCatalogue/4705.yaml +19 -0
  64. psychopy/alerts/alertsCatalogue/4710.yaml +19 -0
  65. psychopy/alerts/alertsCatalogue/4810.yaml +19 -0
  66. psychopy/alerts/alertsCatalogue/5000.yaml +0 -0
  67. psychopy/alerts/alertsCatalogue/5055.yaml +25 -0
  68. psychopy/alerts/alertsCatalogue/6000.yaml +0 -0
  69. psychopy/alerts/alertsCatalogue/6105.yaml +18 -0
  70. psychopy/alerts/alertsCatalogue/7105.yaml +19 -0
  71. psychopy/alerts/alertsCatalogue/8105.yaml +21 -0
  72. psychopy/alerts/alertsCatalogue/8110.yaml +21 -0
  73. psychopy/alerts/alertsCatalogue/9998.yaml +19 -0
  74. psychopy/alerts/alertsCatalogue/9999.yaml +19 -0
  75. psychopy/alerts/alertsCatalogue/alertCategories.yaml +123 -0
  76. psychopy/alerts/alertsCatalogue/alertTemplate.yaml +19 -0
  77. psychopy/alerts/alertsCatalogue/alertmsg.py +173 -0
  78. psychopy/alerts/alertsCatalogue/generateAlertmsg.py +34 -0
  79. psychopy/alerts/alerttools.py +322 -0
  80. psychopy/app/Resources/README.md +12 -0
  81. psychopy/app/Resources/__init__.py +0 -0
  82. psychopy/app/Resources/betasplash.png +0 -0
  83. psychopy/app/Resources/betasplash@2x.png +0 -0
  84. psychopy/app/Resources/builder.ico +0 -0
  85. psychopy/app/Resources/classic/FlowBottom_CompLeft.png +0 -0
  86. psychopy/app/Resources/classic/FlowBottom_CompRight.png +0 -0
  87. psychopy/app/Resources/classic/FlowTop_CompLeft.png +0 -0
  88. psychopy/app/Resources/classic/FlowTop_CompRight.png +0 -0
  89. psychopy/app/Resources/classic/README.txt +9 -0
  90. psychopy/app/Resources/classic/__init__.py +0 -0
  91. psychopy/app/Resources/classic/_layouts.ai +1138 -1
  92. psychopy/app/Resources/classic/add.png +0 -0
  93. psychopy/app/Resources/classic/add@2x.png +0 -0
  94. psychopy/app/Resources/classic/addExp32.png +0 -0
  95. psychopy/app/Resources/classic/add_many.png +0 -0
  96. psychopy/app/Resources/classic/add_many@2x.png +0 -0
  97. psychopy/app/Resources/classic/alerts.png +0 -0
  98. psychopy/app/Resources/classic/beta.png +0 -0
  99. psychopy/app/Resources/classic/browser.png +0 -0
  100. psychopy/app/Resources/classic/browser@2x.png +0 -0
  101. psychopy/app/Resources/classic/bug16.png +0 -0
  102. psychopy/app/Resources/classic/case.png +0 -0
  103. psychopy/app/Resources/classic/case@2x.png +0 -0
  104. psychopy/app/Resources/classic/circle_mask.png +0 -0
  105. psychopy/app/Resources/classic/circle_mask@2x.png +0 -0
  106. psychopy/app/Resources/classic/clear.png +0 -0
  107. psychopy/app/Resources/classic/clear@2x.png +0 -0
  108. psychopy/app/Resources/classic/coderclass16.png +0 -0
  109. psychopy/app/Resources/classic/coderfunc16.png +0 -0
  110. psychopy/app/Resources/classic/coderimport16.png +0 -0
  111. psychopy/app/Resources/classic/coderjs16.png +0 -0
  112. psychopy/app/Resources/classic/coderpython16.png +0 -0
  113. psychopy/app/Resources/classic/codervar16.png +0 -0
  114. psychopy/app/Resources/classic/cogwindow32.png +0 -0
  115. psychopy/app/Resources/classic/color32.png +0 -0
  116. psychopy/app/Resources/classic/compile32.png +0 -0
  117. psychopy/app/Resources/classic/compile_js.png +0 -0
  118. psychopy/app/Resources/classic/compile_js@2x.png +0 -0
  119. psychopy/app/Resources/classic/compile_py.png +0 -0
  120. psychopy/app/Resources/classic/compile_py@2x.png +0 -0
  121. psychopy/app/Resources/classic/copy16.png +0 -0
  122. psychopy/app/Resources/classic/currentFile.png +0 -0
  123. psychopy/app/Resources/classic/currentFile@2x.png +0 -0
  124. psychopy/app/Resources/classic/delete16.png +0 -0
  125. psychopy/app/Resources/classic/desktop.png +0 -0
  126. psychopy/app/Resources/classic/desktop@2x.png +0 -0
  127. psychopy/app/Resources/classic/devices.png +0 -0
  128. psychopy/app/Resources/classic/devices@2x.png +0 -0
  129. psychopy/app/Resources/classic/dirup16.png +0 -0
  130. psychopy/app/Resources/classic/docclose16.png +0 -0
  131. psychopy/app/Resources/classic/download.png +0 -0
  132. psychopy/app/Resources/classic/edit.png +0 -0
  133. psychopy/app/Resources/classic/edit@2x.png +0 -0
  134. psychopy/app/Resources/classic/editbtn.png +0 -0
  135. psychopy/app/Resources/classic/editbtn16.png +0 -0
  136. psychopy/app/Resources/classic/editbtn16@2x.png +0 -0
  137. psychopy/app/Resources/classic/editbtn@2x.png +0 -0
  138. psychopy/app/Resources/classic/email.png +0 -0
  139. psychopy/app/Resources/classic/email@2x.png +0 -0
  140. psychopy/app/Resources/classic/experiment.png +0 -0
  141. psychopy/app/Resources/classic/experiment@2x.png +0 -0
  142. psychopy/app/Resources/classic/expsettings.png +0 -0
  143. psychopy/app/Resources/classic/expsettings@2x.png +0 -0
  144. psychopy/app/Resources/classic/file.png +0 -0
  145. psychopy/app/Resources/classic/file@2x.png +0 -0
  146. psychopy/app/Resources/classic/fileaudio.png +0 -0
  147. psychopy/app/Resources/classic/fileaudio@2x.png +0 -0
  148. psychopy/app/Resources/classic/filecss.png +0 -0
  149. psychopy/app/Resources/classic/filecss@2x.png +0 -0
  150. psychopy/app/Resources/classic/filecsv.png +0 -0
  151. psychopy/app/Resources/classic/filecsv@2x.png +0 -0
  152. psychopy/app/Resources/classic/filedesign.png +0 -0
  153. psychopy/app/Resources/classic/filedesign@2x.png +0 -0
  154. psychopy/app/Resources/classic/filefont.png +0 -0
  155. psychopy/app/Resources/classic/filefont@2x.png +0 -0
  156. psychopy/app/Resources/classic/filegit.png +0 -0
  157. psychopy/app/Resources/classic/filegit@2x.png +0 -0
  158. psychopy/app/Resources/classic/filehtml.png +0 -0
  159. psychopy/app/Resources/classic/filehtml@2x.png +0 -0
  160. psychopy/app/Resources/classic/fileimage.png +0 -0
  161. psychopy/app/Resources/classic/fileimage@2x.png +0 -0
  162. psychopy/app/Resources/classic/fileinfo.png +0 -0
  163. psychopy/app/Resources/classic/fileinfo@2x.png +0 -0
  164. psychopy/app/Resources/classic/filejs.png +0 -0
  165. psychopy/app/Resources/classic/filejs@2x.png +0 -0
  166. psychopy/app/Resources/classic/filejson.png +0 -0
  167. psychopy/app/Resources/classic/filejson@2x.png +0 -0
  168. psychopy/app/Resources/classic/filenew.png +0 -0
  169. psychopy/app/Resources/classic/filenew32.png +0 -0
  170. psychopy/app/Resources/classic/filenew@2x.png +0 -0
  171. psychopy/app/Resources/classic/fileopen.png +0 -0
  172. psychopy/app/Resources/classic/fileopen32.png +0 -0
  173. psychopy/app/Resources/classic/fileopen@2x.png +0 -0
  174. psychopy/app/Resources/classic/filepkg.png +0 -0
  175. psychopy/app/Resources/classic/filepkg@2x.png +0 -0
  176. psychopy/app/Resources/classic/filepsyexp.png +0 -0
  177. psychopy/app/Resources/classic/filepsyexp@2x.png +0 -0
  178. psychopy/app/Resources/classic/filepy.png +0 -0
  179. psychopy/app/Resources/classic/filepy@2x.png +0 -0
  180. psychopy/app/Resources/classic/filesave.png +0 -0
  181. psychopy/app/Resources/classic/filesave32.png +0 -0
  182. psychopy/app/Resources/classic/filesave@2x.png +0 -0
  183. psychopy/app/Resources/classic/filesaveas.png +0 -0
  184. psychopy/app/Resources/classic/filesaveas32.png +0 -0
  185. psychopy/app/Resources/classic/filesaveas@2x.png +0 -0
  186. psychopy/app/Resources/classic/filetxt.png +0 -0
  187. psychopy/app/Resources/classic/filetxt@2x.png +0 -0
  188. psychopy/app/Resources/classic/fileunknown.png +0 -0
  189. psychopy/app/Resources/classic/fileunknown@2x.png +0 -0
  190. psychopy/app/Resources/classic/filevideo.png +0 -0
  191. psychopy/app/Resources/classic/filevideo@2x.png +0 -0
  192. psychopy/app/Resources/classic/filter.png +0 -0
  193. psychopy/app/Resources/classic/filter@2x.png +0 -0
  194. psychopy/app/Resources/classic/find.png +0 -0
  195. psychopy/app/Resources/classic/find@2x.png +0 -0
  196. psychopy/app/Resources/classic/folder-open16.png +0 -0
  197. psychopy/app/Resources/classic/folder16.png +0 -0
  198. psychopy/app/Resources/classic/foldernew16.png +0 -0
  199. psychopy/app/Resources/classic/fork.png +0 -0
  200. psychopy/app/Resources/classic/fork@2x.png +0 -0
  201. psychopy/app/Resources/classic/github.png +0 -0
  202. psychopy/app/Resources/classic/github@2x.png +0 -0
  203. psychopy/app/Resources/classic/globe.png +0 -0
  204. psychopy/app/Resources/classic/globe@2x.png +0 -0
  205. psychopy/app/Resources/classic/globe_bug.png +0 -0
  206. psychopy/app/Resources/classic/globe_bug@2x.png +0 -0
  207. psychopy/app/Resources/classic/globe_greensync.png +0 -0
  208. psychopy/app/Resources/classic/globe_greensync@2x.png +0 -0
  209. psychopy/app/Resources/classic/globe_info.png +0 -0
  210. psychopy/app/Resources/classic/globe_info@2x.png +0 -0
  211. psychopy/app/Resources/classic/globe_magnifier.png +0 -0
  212. psychopy/app/Resources/classic/globe_magnifier@2x.png +0 -0
  213. psychopy/app/Resources/classic/globe_run.png +0 -0
  214. psychopy/app/Resources/classic/globe_run@2x.png +0 -0
  215. psychopy/app/Resources/classic/globe_user.png +0 -0
  216. psychopy/app/Resources/classic/globe_user@2x.png +0 -0
  217. psychopy/app/Resources/classic/goto16.png +0 -0
  218. psychopy/app/Resources/classic/greendot.png +0 -0
  219. psychopy/app/Resources/classic/greendot@2x.png +0 -0
  220. psychopy/app/Resources/classic/greenglobe.png +0 -0
  221. psychopy/app/Resources/classic/greenglobe@2x.png +0 -0
  222. psychopy/app/Resources/classic/greenglobe_bug.png +0 -0
  223. psychopy/app/Resources/classic/greenglobe_bug@2x.png +0 -0
  224. psychopy/app/Resources/classic/greenglobe_greensync.png +0 -0
  225. psychopy/app/Resources/classic/greenglobe_greensync@2x.png +0 -0
  226. psychopy/app/Resources/classic/greenglobe_info.png +0 -0
  227. psychopy/app/Resources/classic/greenglobe_info@2x.png +0 -0
  228. psychopy/app/Resources/classic/greenglobe_magnifier.png +0 -0
  229. psychopy/app/Resources/classic/greenglobe_magnifier@2x.png +0 -0
  230. psychopy/app/Resources/classic/greenglobe_run.png +0 -0
  231. psychopy/app/Resources/classic/greenglobe_run@2x.png +0 -0
  232. psychopy/app/Resources/classic/greenglobe_user.png +0 -0
  233. psychopy/app/Resources/classic/greenglobe_user@2x.png +0 -0
  234. psychopy/app/Resources/classic/greydot.png +0 -0
  235. psychopy/app/Resources/classic/greydot@2x.png +0 -0
  236. psychopy/app/Resources/classic/greytick.png +0 -0
  237. psychopy/app/Resources/classic/greytick@2x.png +0 -0
  238. psychopy/app/Resources/classic/invalid_img.png +0 -0
  239. psychopy/app/Resources/classic/jsPilot.png +0 -0
  240. psychopy/app/Resources/classic/jsPilot@2x.png +0 -0
  241. psychopy/app/Resources/classic/jsRun.png +0 -0
  242. psychopy/app/Resources/classic/jsRun@2x.png +0 -0
  243. psychopy/app/Resources/classic/libroot.png +0 -0
  244. psychopy/app/Resources/classic/libroot@2x.png +0 -0
  245. psychopy/app/Resources/classic/loop.png +0 -0
  246. psychopy/app/Resources/classic/loop@2x.png +0 -0
  247. psychopy/app/Resources/classic/monitor16.png +0 -0
  248. psychopy/app/Resources/classic/monitors.png +0 -0
  249. psychopy/app/Resources/classic/monitors16.png +0 -0
  250. psychopy/app/Resources/classic/monitors32.png +0 -0
  251. psychopy/app/Resources/classic/monitors@2x.png +0 -0
  252. psychopy/app/Resources/classic/orangedot.png +0 -0
  253. psychopy/app/Resources/classic/orangedot@2x.png +0 -0
  254. psychopy/app/Resources/classic/pavlovia.png +0 -0
  255. psychopy/app/Resources/classic/pavlovia16.png +0 -0
  256. psychopy/app/Resources/classic/pavlovia16@2x.png +0 -0
  257. psychopy/app/Resources/classic/pavlovia@2x.png +0 -0
  258. psychopy/app/Resources/classic/pavsync.png +0 -0
  259. psychopy/app/Resources/classic/pavsync@2x.png +0 -0
  260. psychopy/app/Resources/classic/person_off.png +0 -0
  261. psychopy/app/Resources/classic/person_off@2x.png +0 -0
  262. psychopy/app/Resources/classic/person_on.png +0 -0
  263. psychopy/app/Resources/classic/person_on@2x.png +0 -0
  264. psychopy/app/Resources/classic/photometer.png +0 -0
  265. psychopy/app/Resources/classic/photometer@2x.png +0 -0
  266. psychopy/app/Resources/classic/plugin16.png +0 -0
  267. psychopy/app/Resources/classic/plugin16@2x.png +0 -0
  268. psychopy/app/Resources/classic/plugins32.png +0 -0
  269. psychopy/app/Resources/classic/plus.png +0 -0
  270. psychopy/app/Resources/classic/plus@2x.png +0 -0
  271. psychopy/app/Resources/classic/preferences-app.png +0 -0
  272. psychopy/app/Resources/classic/preferences-app48.png +0 -0
  273. psychopy/app/Resources/classic/preferences-app@2x.png +0 -0
  274. psychopy/app/Resources/classic/preferences-conn.png +0 -0
  275. psychopy/app/Resources/classic/preferences-conn48.png +0 -0
  276. psychopy/app/Resources/classic/preferences-conn@2x.png +0 -0
  277. psychopy/app/Resources/classic/preferences-debug.png +0 -0
  278. psychopy/app/Resources/classic/preferences-debug@2x.png +0 -0
  279. psychopy/app/Resources/classic/preferences-general.png +0 -0
  280. psychopy/app/Resources/classic/preferences-general48.png +0 -0
  281. psychopy/app/Resources/classic/preferences-general@2x.png +0 -0
  282. psychopy/app/Resources/classic/preferences-hardware.png +0 -0
  283. psychopy/app/Resources/classic/preferences-hardware48.png +0 -0
  284. psychopy/app/Resources/classic/preferences-hardware@2x.png +0 -0
  285. psychopy/app/Resources/classic/preferences-keyboard.png +0 -0
  286. psychopy/app/Resources/classic/preferences-keyboard48.png +0 -0
  287. psychopy/app/Resources/classic/preferences-keyboard@2x.png +0 -0
  288. psychopy/app/Resources/classic/preferences-pilot.png +0 -0
  289. psychopy/app/Resources/classic/preferences-pilot@2x.png +0 -0
  290. psychopy/app/Resources/classic/preferences32.png +0 -0
  291. psychopy/app/Resources/classic/pyPilot.png +0 -0
  292. psychopy/app/Resources/classic/pyPilot@2x.png +0 -0
  293. psychopy/app/Resources/classic/pyRun.png +0 -0
  294. psychopy/app/Resources/classic/pyRun@2x.png +0 -0
  295. psychopy/app/Resources/classic/reddot.png +0 -0
  296. psychopy/app/Resources/classic/reddot@2x.png +0 -0
  297. psychopy/app/Resources/classic/redglobe.png +0 -0
  298. psychopy/app/Resources/classic/redglobe@2x.png +0 -0
  299. psychopy/app/Resources/classic/redglobe_bug.png +0 -0
  300. psychopy/app/Resources/classic/redglobe_bug@2x.png +0 -0
  301. psychopy/app/Resources/classic/redglobe_greensync.png +0 -0
  302. psychopy/app/Resources/classic/redglobe_greensync@2x.png +0 -0
  303. psychopy/app/Resources/classic/redglobe_info.png +0 -0
  304. psychopy/app/Resources/classic/redglobe_info@2x.png +0 -0
  305. psychopy/app/Resources/classic/redglobe_magnifier.png +0 -0
  306. psychopy/app/Resources/classic/redglobe_magnifier@2x.png +0 -0
  307. psychopy/app/Resources/classic/redglobe_run.png +0 -0
  308. psychopy/app/Resources/classic/redglobe_run@2x.png +0 -0
  309. psychopy/app/Resources/classic/redglobe_user.png +0 -0
  310. psychopy/app/Resources/classic/redglobe_user@2x.png +0 -0
  311. psychopy/app/Resources/classic/redo.png +0 -0
  312. psychopy/app/Resources/classic/redo32.png +0 -0
  313. psychopy/app/Resources/classic/redo@2x.png +0 -0
  314. psychopy/app/Resources/classic/regex.png +0 -0
  315. psychopy/app/Resources/classic/regex@2x.png +0 -0
  316. psychopy/app/Resources/classic/removeExp32.png +0 -0
  317. psychopy/app/Resources/classic/rename16.png +0 -0
  318. psychopy/app/Resources/classic/restart.png +0 -0
  319. psychopy/app/Resources/classic/restart@2x.png +0 -0
  320. psychopy/app/Resources/classic/run.png +0 -0
  321. psychopy/app/Resources/classic/run@2x.png +0 -0
  322. psychopy/app/Resources/classic/runner.png +0 -0
  323. psychopy/app/Resources/classic/runner@2x.png +0 -0
  324. psychopy/app/Resources/classic/runnerPilot.png +0 -0
  325. psychopy/app/Resources/classic/runnerPilot@2x.png +0 -0
  326. psychopy/app/Resources/classic/savebtn.png +0 -0
  327. psychopy/app/Resources/classic/savebtn16.png +0 -0
  328. psychopy/app/Resources/classic/savebtn16@2x.png +0 -0
  329. psychopy/app/Resources/classic/savebtn@2x.png +0 -0
  330. psychopy/app/Resources/classic/search.png +0 -0
  331. psychopy/app/Resources/classic/search@2x.png +0 -0
  332. psychopy/app/Resources/classic/showBuilder.png +0 -0
  333. psychopy/app/Resources/classic/showBuilder@2x.png +0 -0
  334. psychopy/app/Resources/classic/showCoder.png +0 -0
  335. psychopy/app/Resources/classic/showCoder@2x.png +0 -0
  336. psychopy/app/Resources/classic/showRunner.png +0 -0
  337. psychopy/app/Resources/classic/showRunner@2x.png +0 -0
  338. psychopy/app/Resources/classic/starred.png +0 -0
  339. psychopy/app/Resources/classic/starred@2x.png +0 -0
  340. psychopy/app/Resources/classic/start.png +0 -0
  341. psychopy/app/Resources/classic/start@2x.png +0 -0
  342. psychopy/app/Resources/classic/stdout.png +0 -0
  343. psychopy/app/Resources/classic/stop.png +0 -0
  344. psychopy/app/Resources/classic/stop32.png +0 -0
  345. psychopy/app/Resources/classic/stop@2x.png +0 -0
  346. psychopy/app/Resources/classic/switchCtrlBot.png +0 -0
  347. psychopy/app/Resources/classic/switchCtrlBot@2x.png +0 -0
  348. psychopy/app/Resources/classic/switchCtrlLeft.png +0 -0
  349. psychopy/app/Resources/classic/switchCtrlLeft@2x.png +0 -0
  350. psychopy/app/Resources/classic/switchCtrlRight.png +0 -0
  351. psychopy/app/Resources/classic/switchCtrlRight@2x.png +0 -0
  352. psychopy/app/Resources/classic/switchCtrlTop.png +0 -0
  353. psychopy/app/Resources/classic/switchCtrlTop@2x.png +0 -0
  354. psychopy/app/Resources/classic/tick.png +0 -0
  355. psychopy/app/Resources/classic/tick@2x.png +0 -0
  356. psychopy/app/Resources/classic/undo.png +0 -0
  357. psychopy/app/Resources/classic/undo32.png +0 -0
  358. psychopy/app/Resources/classic/undo@2x.png +0 -0
  359. psychopy/app/Resources/classic/unstarred.png +0 -0
  360. psychopy/app/Resources/classic/unstarred@2x.png +0 -0
  361. psychopy/app/Resources/classic/user_none.png +0 -0
  362. psychopy/app/Resources/classic/view-refresh16.png +0 -0
  363. psychopy/app/Resources/classic/viewbtn.png +0 -0
  364. psychopy/app/Resources/classic/viewbtn16.png +0 -0
  365. psychopy/app/Resources/classic/viewbtn16@2x.png +0 -0
  366. psychopy/app/Resources/classic/viewbtn@2x.png +0 -0
  367. psychopy/app/Resources/classic/windows16.png +0 -0
  368. psychopy/app/Resources/classic/windows16@2x.png +0 -0
  369. psychopy/app/Resources/coder.ico +0 -0
  370. psychopy/app/Resources/dark/FlowBottom_CompLeft.png +0 -0
  371. psychopy/app/Resources/dark/FlowBottom_CompRight.png +0 -0
  372. psychopy/app/Resources/dark/FlowTop_CompLeft.png +0 -0
  373. psychopy/app/Resources/dark/FlowTop_CompRight.png +0 -0
  374. psychopy/app/Resources/dark/README.txt +3 -0
  375. psychopy/app/Resources/dark/__init__.py +0 -0
  376. psychopy/app/Resources/dark/add.png +0 -0
  377. psychopy/app/Resources/dark/add@2x.png +0 -0
  378. psychopy/app/Resources/dark/addExp32.png +0 -0
  379. psychopy/app/Resources/dark/addExp32@2x.png +0 -0
  380. psychopy/app/Resources/dark/add_many.png +0 -0
  381. psychopy/app/Resources/dark/add_many@2x.png +0 -0
  382. psychopy/app/Resources/dark/alerts.png +0 -0
  383. psychopy/app/Resources/dark/alerts@2x.png +0 -0
  384. psychopy/app/Resources/dark/beta.png +0 -0
  385. psychopy/app/Resources/dark/beta@2x.png +0 -0
  386. psychopy/app/Resources/dark/browser.png +0 -0
  387. psychopy/app/Resources/dark/browser@2x.png +0 -0
  388. psychopy/app/Resources/dark/bug16.png +0 -0
  389. psychopy/app/Resources/dark/bug16@2x.png +0 -0
  390. psychopy/app/Resources/dark/case.png +0 -0
  391. psychopy/app/Resources/dark/case@2x.png +0 -0
  392. psychopy/app/Resources/dark/circle_mask.png +0 -0
  393. psychopy/app/Resources/dark/circle_mask@2x.png +0 -0
  394. psychopy/app/Resources/dark/clear.png +0 -0
  395. psychopy/app/Resources/dark/clear@2x.png +0 -0
  396. psychopy/app/Resources/dark/coderclass16.png +0 -0
  397. psychopy/app/Resources/dark/coderclass16@2x.png +0 -0
  398. psychopy/app/Resources/dark/coderfunc16.png +0 -0
  399. psychopy/app/Resources/dark/coderfunc16@2x.png +0 -0
  400. psychopy/app/Resources/dark/coderimport16.png +0 -0
  401. psychopy/app/Resources/dark/coderimport16@2x.png +0 -0
  402. psychopy/app/Resources/dark/coderjs.png +0 -0
  403. psychopy/app/Resources/dark/coderjs@2x.png +0 -0
  404. psychopy/app/Resources/dark/coderpython.png +0 -0
  405. psychopy/app/Resources/dark/coderpython@2x.png +0 -0
  406. psychopy/app/Resources/dark/codervar16.png +0 -0
  407. psychopy/app/Resources/dark/codervar16@2x.png +0 -0
  408. psychopy/app/Resources/dark/cogwindow32.png +0 -0
  409. psychopy/app/Resources/dark/cogwindow32@2x.png +0 -0
  410. psychopy/app/Resources/dark/color32.png +0 -0
  411. psychopy/app/Resources/dark/color32@2x.png +0 -0
  412. psychopy/app/Resources/dark/compile_js.png +0 -0
  413. psychopy/app/Resources/dark/compile_js@2x.png +0 -0
  414. psychopy/app/Resources/dark/compile_py.png +0 -0
  415. psychopy/app/Resources/dark/compile_py@2x.png +0 -0
  416. psychopy/app/Resources/dark/copy16.png +0 -0
  417. psychopy/app/Resources/dark/copy16@2x.png +0 -0
  418. psychopy/app/Resources/dark/currentFile16.png +0 -0
  419. psychopy/app/Resources/dark/currentFile16@2x.png +0 -0
  420. psychopy/app/Resources/dark/delete16.png +0 -0
  421. psychopy/app/Resources/dark/delete16@2x.png +0 -0
  422. psychopy/app/Resources/dark/desktop.png +0 -0
  423. psychopy/app/Resources/dark/desktop@2x.png +0 -0
  424. psychopy/app/Resources/dark/devices.png +0 -0
  425. psychopy/app/Resources/dark/devices@2x.png +0 -0
  426. psychopy/app/Resources/dark/dirup16.png +0 -0
  427. psychopy/app/Resources/dark/dirup16@2x.png +0 -0
  428. psychopy/app/Resources/dark/docclose16.png +0 -0
  429. psychopy/app/Resources/dark/docclose16@2x.png +0 -0
  430. psychopy/app/Resources/dark/download.png +0 -0
  431. psychopy/app/Resources/dark/download@2x.png +0 -0
  432. psychopy/app/Resources/dark/edit.png +0 -0
  433. psychopy/app/Resources/dark/edit@2x.png +0 -0
  434. psychopy/app/Resources/dark/editbtn16.png +0 -0
  435. psychopy/app/Resources/dark/editbtn16@2x.png +0 -0
  436. psychopy/app/Resources/dark/email.png +0 -0
  437. psychopy/app/Resources/dark/email@2x.png +0 -0
  438. psychopy/app/Resources/dark/experiment.png +0 -0
  439. psychopy/app/Resources/dark/experiment@2x.png +0 -0
  440. psychopy/app/Resources/dark/expsettings.png +0 -0
  441. psychopy/app/Resources/dark/expsettings@2x.png +0 -0
  442. psychopy/app/Resources/dark/file.png +0 -0
  443. psychopy/app/Resources/dark/file@16w.png +0 -0
  444. psychopy/app/Resources/dark/file@16w@2x.png +0 -0
  445. psychopy/app/Resources/dark/file@2x.png +0 -0
  446. psychopy/app/Resources/dark/fileaudio.png +0 -0
  447. psychopy/app/Resources/dark/fileaudio@2x.png +0 -0
  448. psychopy/app/Resources/dark/filecss.png +0 -0
  449. psychopy/app/Resources/dark/filecss@2x.png +0 -0
  450. psychopy/app/Resources/dark/filecsv.png +0 -0
  451. psychopy/app/Resources/dark/filecsv@2x.png +0 -0
  452. psychopy/app/Resources/dark/filedesign.png +0 -0
  453. psychopy/app/Resources/dark/filedesign@2x.png +0 -0
  454. psychopy/app/Resources/dark/filefont.png +0 -0
  455. psychopy/app/Resources/dark/filefont@2x.png +0 -0
  456. psychopy/app/Resources/dark/filegit.png +0 -0
  457. psychopy/app/Resources/dark/filegit@2x.png +0 -0
  458. psychopy/app/Resources/dark/filehtml.png +0 -0
  459. psychopy/app/Resources/dark/filehtml@2x.png +0 -0
  460. psychopy/app/Resources/dark/fileimage.png +0 -0
  461. psychopy/app/Resources/dark/fileimage@2x.png +0 -0
  462. psychopy/app/Resources/dark/fileinfo.png +0 -0
  463. psychopy/app/Resources/dark/fileinfo@2x.png +0 -0
  464. psychopy/app/Resources/dark/filejs.png +0 -0
  465. psychopy/app/Resources/dark/filejs@2x.png +0 -0
  466. psychopy/app/Resources/dark/filejson.png +0 -0
  467. psychopy/app/Resources/dark/filejson@2x.png +0 -0
  468. psychopy/app/Resources/dark/filenew.png +0 -0
  469. psychopy/app/Resources/dark/filenew32.png +0 -0
  470. psychopy/app/Resources/dark/filenew32@2x.png +0 -0
  471. psychopy/app/Resources/dark/filenew@2x.png +0 -0
  472. psychopy/app/Resources/dark/fileopen.png +0 -0
  473. psychopy/app/Resources/dark/fileopen32.png +0 -0
  474. psychopy/app/Resources/dark/fileopen32@2x.png +0 -0
  475. psychopy/app/Resources/dark/fileopen@2x.png +0 -0
  476. psychopy/app/Resources/dark/filepkg.png +0 -0
  477. psychopy/app/Resources/dark/filepkg@2x.png +0 -0
  478. psychopy/app/Resources/dark/filepsyexp.png +0 -0
  479. psychopy/app/Resources/dark/filepsyexp@2x.png +0 -0
  480. psychopy/app/Resources/dark/filepy.png +0 -0
  481. psychopy/app/Resources/dark/filepy@2x.png +0 -0
  482. psychopy/app/Resources/dark/filesave.png +0 -0
  483. psychopy/app/Resources/dark/filesave32.png +0 -0
  484. psychopy/app/Resources/dark/filesave32@2x.png +0 -0
  485. psychopy/app/Resources/dark/filesave@2x.png +0 -0
  486. psychopy/app/Resources/dark/filesaveas.png +0 -0
  487. psychopy/app/Resources/dark/filesaveas32.png +0 -0
  488. psychopy/app/Resources/dark/filesaveas32@2x.png +0 -0
  489. psychopy/app/Resources/dark/filesaveas@2x.png +0 -0
  490. psychopy/app/Resources/dark/filetxt.png +0 -0
  491. psychopy/app/Resources/dark/filetxt@2x.png +0 -0
  492. psychopy/app/Resources/dark/fileunknown.png +0 -0
  493. psychopy/app/Resources/dark/fileunknown@2x.png +0 -0
  494. psychopy/app/Resources/dark/filevideo.png +0 -0
  495. psychopy/app/Resources/dark/filevideo@2x.png +0 -0
  496. psychopy/app/Resources/dark/filter.png +0 -0
  497. psychopy/app/Resources/dark/filter@2x.png +0 -0
  498. psychopy/app/Resources/dark/find.png +0 -0
  499. psychopy/app/Resources/dark/find@2x.png +0 -0
  500. psychopy/app/Resources/dark/folder-open16.png +0 -0
  501. psychopy/app/Resources/dark/folder-open16@2x.png +0 -0
  502. psychopy/app/Resources/dark/folder16.png +0 -0
  503. psychopy/app/Resources/dark/folder16@2x.png +0 -0
  504. psychopy/app/Resources/dark/foldernew16.png +0 -0
  505. psychopy/app/Resources/dark/foldernew16@2x.png +0 -0
  506. psychopy/app/Resources/dark/fork.png +0 -0
  507. psychopy/app/Resources/dark/fork@2x.png +0 -0
  508. psychopy/app/Resources/dark/github.png +0 -0
  509. psychopy/app/Resources/dark/github@2x.png +0 -0
  510. psychopy/app/Resources/dark/globe.png +0 -0
  511. psychopy/app/Resources/dark/globe@2x.png +0 -0
  512. psychopy/app/Resources/dark/globe_bug.png +0 -0
  513. psychopy/app/Resources/dark/globe_bug@2x.png +0 -0
  514. psychopy/app/Resources/dark/globe_greensync.png +0 -0
  515. psychopy/app/Resources/dark/globe_greensync@2x.png +0 -0
  516. psychopy/app/Resources/dark/globe_info.png +0 -0
  517. psychopy/app/Resources/dark/globe_info@2x.png +0 -0
  518. psychopy/app/Resources/dark/globe_magnifier.png +0 -0
  519. psychopy/app/Resources/dark/globe_magnifier@2x.png +0 -0
  520. psychopy/app/Resources/dark/globe_run.png +0 -0
  521. psychopy/app/Resources/dark/globe_run@2x.png +0 -0
  522. psychopy/app/Resources/dark/globe_user.png +0 -0
  523. psychopy/app/Resources/dark/globe_user@2x.png +0 -0
  524. psychopy/app/Resources/dark/goto.png +0 -0
  525. psychopy/app/Resources/dark/goto@2x.png +0 -0
  526. psychopy/app/Resources/dark/greendot.png +0 -0
  527. psychopy/app/Resources/dark/greendot@2x.png +0 -0
  528. psychopy/app/Resources/dark/greenglobe.png +0 -0
  529. psychopy/app/Resources/dark/greenglobe@2x.png +0 -0
  530. psychopy/app/Resources/dark/greenglobe_bug.png +0 -0
  531. psychopy/app/Resources/dark/greenglobe_bug@2x.png +0 -0
  532. psychopy/app/Resources/dark/greenglobe_greensync.png +0 -0
  533. psychopy/app/Resources/dark/greenglobe_greensync@2x.png +0 -0
  534. psychopy/app/Resources/dark/greenglobe_info.png +0 -0
  535. psychopy/app/Resources/dark/greenglobe_info@2x.png +0 -0
  536. psychopy/app/Resources/dark/greenglobe_magnifier.png +0 -0
  537. psychopy/app/Resources/dark/greenglobe_magnifier@2x.png +0 -0
  538. psychopy/app/Resources/dark/greenglobe_run.png +0 -0
  539. psychopy/app/Resources/dark/greenglobe_run@2x.png +0 -0
  540. psychopy/app/Resources/dark/greenglobe_user.png +0 -0
  541. psychopy/app/Resources/dark/greenglobe_user@2x.png +0 -0
  542. psychopy/app/Resources/dark/greydot.png +0 -0
  543. psychopy/app/Resources/dark/greydot@2x.png +0 -0
  544. psychopy/app/Resources/dark/greytick.png +0 -0
  545. psychopy/app/Resources/dark/greytick@2x.png +0 -0
  546. psychopy/app/Resources/dark/invalid_img.png +0 -0
  547. psychopy/app/Resources/dark/jsPilot.png +0 -0
  548. psychopy/app/Resources/dark/jsPilot@2x.png +0 -0
  549. psychopy/app/Resources/dark/jsRun.png +0 -0
  550. psychopy/app/Resources/dark/jsRun@2x.png +0 -0
  551. psychopy/app/Resources/dark/libroot16.png +0 -0
  552. psychopy/app/Resources/dark/libroot16@2x.png +0 -0
  553. psychopy/app/Resources/dark/loop.png +0 -0
  554. psychopy/app/Resources/dark/loop@2x.png +0 -0
  555. psychopy/app/Resources/dark/monitor16.png +0 -0
  556. psychopy/app/Resources/dark/monitor16@2x.png +0 -0
  557. psychopy/app/Resources/dark/monitors.png +0 -0
  558. psychopy/app/Resources/dark/monitors32.png +0 -0
  559. psychopy/app/Resources/dark/monitors32@2x.png +0 -0
  560. psychopy/app/Resources/dark/monitors@2x.png +0 -0
  561. psychopy/app/Resources/dark/orangedot.png +0 -0
  562. psychopy/app/Resources/dark/orangedot@2x.png +0 -0
  563. psychopy/app/Resources/dark/pavlovia.png +0 -0
  564. psychopy/app/Resources/dark/pavlovia16.png +0 -0
  565. psychopy/app/Resources/dark/pavlovia16@2x.png +0 -0
  566. psychopy/app/Resources/dark/pavlovia@2x.png +0 -0
  567. psychopy/app/Resources/dark/pavsync.png +0 -0
  568. psychopy/app/Resources/dark/pavsync@2x.png +0 -0
  569. psychopy/app/Resources/dark/person_off.png +0 -0
  570. psychopy/app/Resources/dark/person_off@2x.png +0 -0
  571. psychopy/app/Resources/dark/person_on.png +0 -0
  572. psychopy/app/Resources/dark/person_on@2x.png +0 -0
  573. psychopy/app/Resources/dark/photometer.png +0 -0
  574. psychopy/app/Resources/dark/photometer@2x.png +0 -0
  575. psychopy/app/Resources/dark/plugin16.png +0 -0
  576. psychopy/app/Resources/dark/plugin16@2x.png +0 -0
  577. psychopy/app/Resources/dark/plugins32.png +0 -0
  578. psychopy/app/Resources/dark/plugins32@2x.png +0 -0
  579. psychopy/app/Resources/dark/plus.png +0 -0
  580. psychopy/app/Resources/dark/plus@2x.png +0 -0
  581. psychopy/app/Resources/dark/preferences-app.png +0 -0
  582. psychopy/app/Resources/dark/preferences-app48.png +0 -0
  583. psychopy/app/Resources/dark/preferences-app48@2x.png +0 -0
  584. psychopy/app/Resources/dark/preferences-app@2x.png +0 -0
  585. psychopy/app/Resources/dark/preferences-conn.png +0 -0
  586. psychopy/app/Resources/dark/preferences-conn48.png +0 -0
  587. psychopy/app/Resources/dark/preferences-conn48@2x.png +0 -0
  588. psychopy/app/Resources/dark/preferences-conn@2x.png +0 -0
  589. psychopy/app/Resources/dark/preferences-debug.png +0 -0
  590. psychopy/app/Resources/dark/preferences-debug@2x.png +0 -0
  591. psychopy/app/Resources/dark/preferences-general.png +0 -0
  592. psychopy/app/Resources/dark/preferences-general48.png +0 -0
  593. psychopy/app/Resources/dark/preferences-general48@2x.png +0 -0
  594. psychopy/app/Resources/dark/preferences-general@2x.png +0 -0
  595. psychopy/app/Resources/dark/preferences-hardware.png +0 -0
  596. psychopy/app/Resources/dark/preferences-hardware48.png +0 -0
  597. psychopy/app/Resources/dark/preferences-hardware48@2x.png +0 -0
  598. psychopy/app/Resources/dark/preferences-hardware@2x.png +0 -0
  599. psychopy/app/Resources/dark/preferences-keyboard.png +0 -0
  600. psychopy/app/Resources/dark/preferences-keyboard48.png +0 -0
  601. psychopy/app/Resources/dark/preferences-keyboard48@2x.png +0 -0
  602. psychopy/app/Resources/dark/preferences-keyboard@2x.png +0 -0
  603. psychopy/app/Resources/dark/preferences-pilot.png +0 -0
  604. psychopy/app/Resources/dark/preferences-pilot@2x.png +0 -0
  605. psychopy/app/Resources/dark/preferences32.png +0 -0
  606. psychopy/app/Resources/dark/preferences32@2x.png +0 -0
  607. psychopy/app/Resources/dark/pyPilot.png +0 -0
  608. psychopy/app/Resources/dark/pyPilot@2x.png +0 -0
  609. psychopy/app/Resources/dark/pyRun.png +0 -0
  610. psychopy/app/Resources/dark/pyRun@2x.png +0 -0
  611. psychopy/app/Resources/dark/reddot.png +0 -0
  612. psychopy/app/Resources/dark/reddot@2x.png +0 -0
  613. psychopy/app/Resources/dark/redglobe.png +0 -0
  614. psychopy/app/Resources/dark/redglobe@2x.png +0 -0
  615. psychopy/app/Resources/dark/redglobe_bug.png +0 -0
  616. psychopy/app/Resources/dark/redglobe_bug@2x.png +0 -0
  617. psychopy/app/Resources/dark/redglobe_greensync.png +0 -0
  618. psychopy/app/Resources/dark/redglobe_greensync@2x.png +0 -0
  619. psychopy/app/Resources/dark/redglobe_info.png +0 -0
  620. psychopy/app/Resources/dark/redglobe_info@2x.png +0 -0
  621. psychopy/app/Resources/dark/redglobe_magnifier.png +0 -0
  622. psychopy/app/Resources/dark/redglobe_magnifier@2x.png +0 -0
  623. psychopy/app/Resources/dark/redglobe_run.png +0 -0
  624. psychopy/app/Resources/dark/redglobe_run@2x.png +0 -0
  625. psychopy/app/Resources/dark/redglobe_user.png +0 -0
  626. psychopy/app/Resources/dark/redglobe_user@2x.png +0 -0
  627. psychopy/app/Resources/dark/redo.png +0 -0
  628. psychopy/app/Resources/dark/redo32.png +0 -0
  629. psychopy/app/Resources/dark/redo32@2x.png +0 -0
  630. psychopy/app/Resources/dark/redo@2x.png +0 -0
  631. psychopy/app/Resources/dark/regex.png +0 -0
  632. psychopy/app/Resources/dark/regex@2x.png +0 -0
  633. psychopy/app/Resources/dark/removeExp32.png +0 -0
  634. psychopy/app/Resources/dark/removeExp32@2x.png +0 -0
  635. psychopy/app/Resources/dark/rename16.png +0 -0
  636. psychopy/app/Resources/dark/rename16@2x.png +0 -0
  637. psychopy/app/Resources/dark/restart.png +0 -0
  638. psychopy/app/Resources/dark/restart@2x.png +0 -0
  639. psychopy/app/Resources/dark/runner.png +0 -0
  640. psychopy/app/Resources/dark/runner@2x.png +0 -0
  641. psychopy/app/Resources/dark/runnerPilot.png +0 -0
  642. psychopy/app/Resources/dark/runnerPilot@2x.png +0 -0
  643. psychopy/app/Resources/dark/savebtn16.png +0 -0
  644. psychopy/app/Resources/dark/savebtn16@2x.png +0 -0
  645. psychopy/app/Resources/dark/search.png +0 -0
  646. psychopy/app/Resources/dark/search@2x.png +0 -0
  647. psychopy/app/Resources/dark/showBuilder.png +0 -0
  648. psychopy/app/Resources/dark/showBuilder@2x.png +0 -0
  649. psychopy/app/Resources/dark/showCoder.png +0 -0
  650. psychopy/app/Resources/dark/showCoder@2x.png +0 -0
  651. psychopy/app/Resources/dark/showRunner.png +0 -0
  652. psychopy/app/Resources/dark/showRunner@2x.png +0 -0
  653. psychopy/app/Resources/dark/starred.png +0 -0
  654. psychopy/app/Resources/dark/starred@2x.png +0 -0
  655. psychopy/app/Resources/dark/start.png +0 -0
  656. psychopy/app/Resources/dark/start@2x.png +0 -0
  657. psychopy/app/Resources/dark/stdout.png +0 -0
  658. psychopy/app/Resources/dark/stdout@2x.png +0 -0
  659. psychopy/app/Resources/dark/stop.png +0 -0
  660. psychopy/app/Resources/dark/stop32.png +0 -0
  661. psychopy/app/Resources/dark/stop32@2x.png +0 -0
  662. psychopy/app/Resources/dark/stop@2x.png +0 -0
  663. psychopy/app/Resources/dark/switchCtrlBot.png +0 -0
  664. psychopy/app/Resources/dark/switchCtrlBot@2x.png +0 -0
  665. psychopy/app/Resources/dark/switchCtrlLeft.png +0 -0
  666. psychopy/app/Resources/dark/switchCtrlLeft@2x.png +0 -0
  667. psychopy/app/Resources/dark/switchCtrlRight.png +0 -0
  668. psychopy/app/Resources/dark/switchCtrlRight@2x.png +0 -0
  669. psychopy/app/Resources/dark/switchCtrlTop.png +0 -0
  670. psychopy/app/Resources/dark/switchCtrlTop@2x.png +0 -0
  671. psychopy/app/Resources/dark/tick.png +0 -0
  672. psychopy/app/Resources/dark/tick@2x.png +0 -0
  673. psychopy/app/Resources/dark/undo.png +0 -0
  674. psychopy/app/Resources/dark/undo32.png +0 -0
  675. psychopy/app/Resources/dark/undo32@2x.png +0 -0
  676. psychopy/app/Resources/dark/undo@2x.png +0 -0
  677. psychopy/app/Resources/dark/unstarred.png +0 -0
  678. psychopy/app/Resources/dark/unstarred@2x.png +0 -0
  679. psychopy/app/Resources/dark/user_none.png +0 -0
  680. psychopy/app/Resources/dark/view-refresh16.png +0 -0
  681. psychopy/app/Resources/dark/view-refresh16@2x.png +0 -0
  682. psychopy/app/Resources/dark/viewbtn16.png +0 -0
  683. psychopy/app/Resources/dark/viewbtn16@2x.png +0 -0
  684. psychopy/app/Resources/dark/windows16.png +0 -0
  685. psychopy/app/Resources/dark/windows16@2x.png +0 -0
  686. psychopy/app/Resources/light/FlowBottom_CompLeft.png +0 -0
  687. psychopy/app/Resources/light/FlowBottom_CompRight.png +0 -0
  688. psychopy/app/Resources/light/FlowTop_CompLeft.png +0 -0
  689. psychopy/app/Resources/light/FlowTop_CompRight.png +0 -0
  690. psychopy/app/Resources/light/README.txt +3 -0
  691. psychopy/app/Resources/light/__init__.py +0 -0
  692. psychopy/app/Resources/light/add.png +0 -0
  693. psychopy/app/Resources/light/add@2x.png +0 -0
  694. psychopy/app/Resources/light/addExp32.png +0 -0
  695. psychopy/app/Resources/light/addExp32@2x.png +0 -0
  696. psychopy/app/Resources/light/add_many.png +0 -0
  697. psychopy/app/Resources/light/add_many@2x.png +0 -0
  698. psychopy/app/Resources/light/alerts.png +0 -0
  699. psychopy/app/Resources/light/alerts@2x.png +0 -0
  700. psychopy/app/Resources/light/beta.png +0 -0
  701. psychopy/app/Resources/light/beta@2x.png +0 -0
  702. psychopy/app/Resources/light/browser.png +0 -0
  703. psychopy/app/Resources/light/browser@2x.png +0 -0
  704. psychopy/app/Resources/light/bug16.png +0 -0
  705. psychopy/app/Resources/light/bug16@2x.png +0 -0
  706. psychopy/app/Resources/light/case.png +0 -0
  707. psychopy/app/Resources/light/case@2x.png +0 -0
  708. psychopy/app/Resources/light/circle_mask.png +0 -0
  709. psychopy/app/Resources/light/circle_mask@2x.png +0 -0
  710. psychopy/app/Resources/light/clear.png +0 -0
  711. psychopy/app/Resources/light/clear@2x.png +0 -0
  712. psychopy/app/Resources/light/coderclass16.png +0 -0
  713. psychopy/app/Resources/light/coderclass16@2x.png +0 -0
  714. psychopy/app/Resources/light/coderfunc16.png +0 -0
  715. psychopy/app/Resources/light/coderfunc16@2x.png +0 -0
  716. psychopy/app/Resources/light/coderimport16.png +0 -0
  717. psychopy/app/Resources/light/coderimport16@2x.png +0 -0
  718. psychopy/app/Resources/light/coderjs.png +0 -0
  719. psychopy/app/Resources/light/coderjs@2x.png +0 -0
  720. psychopy/app/Resources/light/coderpython.png +0 -0
  721. psychopy/app/Resources/light/coderpython@2x.png +0 -0
  722. psychopy/app/Resources/light/codervar16.png +0 -0
  723. psychopy/app/Resources/light/codervar16@2x.png +0 -0
  724. psychopy/app/Resources/light/cogwindow32.png +0 -0
  725. psychopy/app/Resources/light/cogwindow32@2x.png +0 -0
  726. psychopy/app/Resources/light/color16.png +0 -0
  727. psychopy/app/Resources/light/color16@2x.png +0 -0
  728. psychopy/app/Resources/light/color32.png +0 -0
  729. psychopy/app/Resources/light/color32@2x.png +0 -0
  730. psychopy/app/Resources/light/compile_js.png +0 -0
  731. psychopy/app/Resources/light/compile_js@2x.png +0 -0
  732. psychopy/app/Resources/light/compile_py.png +0 -0
  733. psychopy/app/Resources/light/compile_py@2x.png +0 -0
  734. psychopy/app/Resources/light/copy16.png +0 -0
  735. psychopy/app/Resources/light/copy16@2x.png +0 -0
  736. psychopy/app/Resources/light/currentFile16.png +0 -0
  737. psychopy/app/Resources/light/currentFile16@2x.png +0 -0
  738. psychopy/app/Resources/light/delete16.png +0 -0
  739. psychopy/app/Resources/light/delete16@2x.png +0 -0
  740. psychopy/app/Resources/light/delete8.png +0 -0
  741. psychopy/app/Resources/light/desktop.png +0 -0
  742. psychopy/app/Resources/light/desktop@2x.png +0 -0
  743. psychopy/app/Resources/light/devices.png +0 -0
  744. psychopy/app/Resources/light/devices@2x.png +0 -0
  745. psychopy/app/Resources/light/dirup16.png +0 -0
  746. psychopy/app/Resources/light/dirup16@2x.png +0 -0
  747. psychopy/app/Resources/light/docclose16.png +0 -0
  748. psychopy/app/Resources/light/docclose16@2x.png +0 -0
  749. psychopy/app/Resources/light/download.png +0 -0
  750. psychopy/app/Resources/light/download@2x.png +0 -0
  751. psychopy/app/Resources/light/edit.png +0 -0
  752. psychopy/app/Resources/light/edit@2x.png +0 -0
  753. psychopy/app/Resources/light/editbtn16.png +0 -0
  754. psychopy/app/Resources/light/editbtn16@2x.png +0 -0
  755. psychopy/app/Resources/light/email.png +0 -0
  756. psychopy/app/Resources/light/email@2x.png +0 -0
  757. psychopy/app/Resources/light/experiment.png +0 -0
  758. psychopy/app/Resources/light/experiment@2x.png +0 -0
  759. psychopy/app/Resources/light/expsettings.png +0 -0
  760. psychopy/app/Resources/light/expsettings@2x.png +0 -0
  761. psychopy/app/Resources/light/file.png +0 -0
  762. psychopy/app/Resources/light/file@2x.png +0 -0
  763. psychopy/app/Resources/light/fileaudio.png +0 -0
  764. psychopy/app/Resources/light/fileaudio@2x.png +0 -0
  765. psychopy/app/Resources/light/filecss.png +0 -0
  766. psychopy/app/Resources/light/filecss@2x.png +0 -0
  767. psychopy/app/Resources/light/filecsv.png +0 -0
  768. psychopy/app/Resources/light/filecsv@2x.png +0 -0
  769. psychopy/app/Resources/light/filedesign.png +0 -0
  770. psychopy/app/Resources/light/filedesign@2x.png +0 -0
  771. psychopy/app/Resources/light/filefont.png +0 -0
  772. psychopy/app/Resources/light/filefont@2x.png +0 -0
  773. psychopy/app/Resources/light/filegit.png +0 -0
  774. psychopy/app/Resources/light/filegit@2x.png +0 -0
  775. psychopy/app/Resources/light/filehtml.png +0 -0
  776. psychopy/app/Resources/light/filehtml@2x.png +0 -0
  777. psychopy/app/Resources/light/fileimage.png +0 -0
  778. psychopy/app/Resources/light/fileimage@2x.png +0 -0
  779. psychopy/app/Resources/light/fileinfo.png +0 -0
  780. psychopy/app/Resources/light/fileinfo@2x.png +0 -0
  781. psychopy/app/Resources/light/filejs.png +0 -0
  782. psychopy/app/Resources/light/filejs@2x.png +0 -0
  783. psychopy/app/Resources/light/filejson.png +0 -0
  784. psychopy/app/Resources/light/filejson@2x.png +0 -0
  785. psychopy/app/Resources/light/filenew.png +0 -0
  786. psychopy/app/Resources/light/filenew32.png +0 -0
  787. psychopy/app/Resources/light/filenew32@2x.png +0 -0
  788. psychopy/app/Resources/light/filenew@2x.png +0 -0
  789. psychopy/app/Resources/light/fileopen.png +0 -0
  790. psychopy/app/Resources/light/fileopen32.png +0 -0
  791. psychopy/app/Resources/light/fileopen32@2x.png +0 -0
  792. psychopy/app/Resources/light/fileopen@2x.png +0 -0
  793. psychopy/app/Resources/light/filepkg.png +0 -0
  794. psychopy/app/Resources/light/filepkg@2x.png +0 -0
  795. psychopy/app/Resources/light/filepsyexp.png +0 -0
  796. psychopy/app/Resources/light/filepsyexp@2x.png +0 -0
  797. psychopy/app/Resources/light/filepy.png +0 -0
  798. psychopy/app/Resources/light/filepy@2x.png +0 -0
  799. psychopy/app/Resources/light/filesave.png +0 -0
  800. psychopy/app/Resources/light/filesave32.png +0 -0
  801. psychopy/app/Resources/light/filesave32@2x.png +0 -0
  802. psychopy/app/Resources/light/filesave@2x.png +0 -0
  803. psychopy/app/Resources/light/filesaveas.png +0 -0
  804. psychopy/app/Resources/light/filesaveas32.png +0 -0
  805. psychopy/app/Resources/light/filesaveas32@2x.png +0 -0
  806. psychopy/app/Resources/light/filesaveas@2x.png +0 -0
  807. psychopy/app/Resources/light/filetxt.png +0 -0
  808. psychopy/app/Resources/light/filetxt@2x.png +0 -0
  809. psychopy/app/Resources/light/fileunknown.png +0 -0
  810. psychopy/app/Resources/light/fileunknown@2x.png +0 -0
  811. psychopy/app/Resources/light/filevideo.png +0 -0
  812. psychopy/app/Resources/light/filevideo@2x.png +0 -0
  813. psychopy/app/Resources/light/filter.png +0 -0
  814. psychopy/app/Resources/light/filter@2x.png +0 -0
  815. psychopy/app/Resources/light/find.png +0 -0
  816. psychopy/app/Resources/light/find@2x.png +0 -0
  817. psychopy/app/Resources/light/folder-open16.png +0 -0
  818. psychopy/app/Resources/light/folder-open16@2x.png +0 -0
  819. psychopy/app/Resources/light/folder16.png +0 -0
  820. psychopy/app/Resources/light/folder16@2x.png +0 -0
  821. psychopy/app/Resources/light/foldernew16.png +0 -0
  822. psychopy/app/Resources/light/foldernew16@2x.png +0 -0
  823. psychopy/app/Resources/light/fork.png +0 -0
  824. psychopy/app/Resources/light/fork@2x.png +0 -0
  825. psychopy/app/Resources/light/github.png +0 -0
  826. psychopy/app/Resources/light/github@2x.png +0 -0
  827. psychopy/app/Resources/light/globe.png +0 -0
  828. psychopy/app/Resources/light/globe@2x.png +0 -0
  829. psychopy/app/Resources/light/globe_bug.png +0 -0
  830. psychopy/app/Resources/light/globe_bug@2x.png +0 -0
  831. psychopy/app/Resources/light/globe_greensync.png +0 -0
  832. psychopy/app/Resources/light/globe_greensync@2x.png +0 -0
  833. psychopy/app/Resources/light/globe_info.png +0 -0
  834. psychopy/app/Resources/light/globe_info@2x.png +0 -0
  835. psychopy/app/Resources/light/globe_magnifier.png +0 -0
  836. psychopy/app/Resources/light/globe_magnifier@2x.png +0 -0
  837. psychopy/app/Resources/light/globe_run.png +0 -0
  838. psychopy/app/Resources/light/globe_run@2x.png +0 -0
  839. psychopy/app/Resources/light/globe_user.png +0 -0
  840. psychopy/app/Resources/light/globe_user@2x.png +0 -0
  841. psychopy/app/Resources/light/goto16.png +0 -0
  842. psychopy/app/Resources/light/goto16@2x.png +0 -0
  843. psychopy/app/Resources/light/greendot.png +0 -0
  844. psychopy/app/Resources/light/greendot@2x.png +0 -0
  845. psychopy/app/Resources/light/greenglobe.png +0 -0
  846. psychopy/app/Resources/light/greenglobe@2x.png +0 -0
  847. psychopy/app/Resources/light/greenglobe_bug.png +0 -0
  848. psychopy/app/Resources/light/greenglobe_bug@2x.png +0 -0
  849. psychopy/app/Resources/light/greenglobe_greensync.png +0 -0
  850. psychopy/app/Resources/light/greenglobe_greensync@2x.png +0 -0
  851. psychopy/app/Resources/light/greenglobe_info.png +0 -0
  852. psychopy/app/Resources/light/greenglobe_info@2x.png +0 -0
  853. psychopy/app/Resources/light/greenglobe_magnifier.png +0 -0
  854. psychopy/app/Resources/light/greenglobe_magnifier@2x.png +0 -0
  855. psychopy/app/Resources/light/greenglobe_run.png +0 -0
  856. psychopy/app/Resources/light/greenglobe_run@2x.png +0 -0
  857. psychopy/app/Resources/light/greenglobe_user.png +0 -0
  858. psychopy/app/Resources/light/greenglobe_user@2x.png +0 -0
  859. psychopy/app/Resources/light/greydot.png +0 -0
  860. psychopy/app/Resources/light/greydot@2x.png +0 -0
  861. psychopy/app/Resources/light/greytick.png +0 -0
  862. psychopy/app/Resources/light/greytick@2x.png +0 -0
  863. psychopy/app/Resources/light/invalid_img.png +0 -0
  864. psychopy/app/Resources/light/jsPilot.png +0 -0
  865. psychopy/app/Resources/light/jsPilot@2x.png +0 -0
  866. psychopy/app/Resources/light/jsRun.png +0 -0
  867. psychopy/app/Resources/light/jsRun@2x.png +0 -0
  868. psychopy/app/Resources/light/libroot16.png +0 -0
  869. psychopy/app/Resources/light/libroot16@2x.png +0 -0
  870. psychopy/app/Resources/light/loop.png +0 -0
  871. psychopy/app/Resources/light/loop@2x.png +0 -0
  872. psychopy/app/Resources/light/monitor16.png +0 -0
  873. psychopy/app/Resources/light/monitor16@2x.png +0 -0
  874. psychopy/app/Resources/light/monitors.png +0 -0
  875. psychopy/app/Resources/light/monitors32.png +0 -0
  876. psychopy/app/Resources/light/monitors32@2x.png +0 -0
  877. psychopy/app/Resources/light/monitors@2x.png +0 -0
  878. psychopy/app/Resources/light/orangedot.png +0 -0
  879. psychopy/app/Resources/light/orangedot@2x.png +0 -0
  880. psychopy/app/Resources/light/pavlovia.png +0 -0
  881. psychopy/app/Resources/light/pavlovia16.png +0 -0
  882. psychopy/app/Resources/light/pavlovia16@2x.png +0 -0
  883. psychopy/app/Resources/light/pavlovia@2x.png +0 -0
  884. psychopy/app/Resources/light/pavsync.png +0 -0
  885. psychopy/app/Resources/light/pavsync@2x.png +0 -0
  886. psychopy/app/Resources/light/person_off.png +0 -0
  887. psychopy/app/Resources/light/person_off@2x.png +0 -0
  888. psychopy/app/Resources/light/person_on.png +0 -0
  889. psychopy/app/Resources/light/person_on@2x.png +0 -0
  890. psychopy/app/Resources/light/photometer.png +0 -0
  891. psychopy/app/Resources/light/photometer@2x.png +0 -0
  892. psychopy/app/Resources/light/plugin16.png +0 -0
  893. psychopy/app/Resources/light/plugin16@2x.png +0 -0
  894. psychopy/app/Resources/light/plugins32.png +0 -0
  895. psychopy/app/Resources/light/plugins32@2x.png +0 -0
  896. psychopy/app/Resources/light/plus.png +0 -0
  897. psychopy/app/Resources/light/plus@2x.png +0 -0
  898. psychopy/app/Resources/light/preferences-app.png +0 -0
  899. psychopy/app/Resources/light/preferences-app48.png +0 -0
  900. psychopy/app/Resources/light/preferences-app48@2x.png +0 -0
  901. psychopy/app/Resources/light/preferences-app@2x.png +0 -0
  902. psychopy/app/Resources/light/preferences-conn.png +0 -0
  903. psychopy/app/Resources/light/preferences-conn48.png +0 -0
  904. psychopy/app/Resources/light/preferences-conn48@2x.png +0 -0
  905. psychopy/app/Resources/light/preferences-conn@2x.png +0 -0
  906. psychopy/app/Resources/light/preferences-general.png +0 -0
  907. psychopy/app/Resources/light/preferences-general48.png +0 -0
  908. psychopy/app/Resources/light/preferences-general48@2x.png +0 -0
  909. psychopy/app/Resources/light/preferences-general@2x.png +0 -0
  910. psychopy/app/Resources/light/preferences-hardware.png +0 -0
  911. psychopy/app/Resources/light/preferences-hardware48.png +0 -0
  912. psychopy/app/Resources/light/preferences-hardware48@2x.png +0 -0
  913. psychopy/app/Resources/light/preferences-hardware@2x.png +0 -0
  914. psychopy/app/Resources/light/preferences-keyboard.png +0 -0
  915. psychopy/app/Resources/light/preferences-keyboard48.png +0 -0
  916. psychopy/app/Resources/light/preferences-keyboard48@2x.png +0 -0
  917. psychopy/app/Resources/light/preferences-keyboard@2x.png +0 -0
  918. psychopy/app/Resources/light/preferences-pilot.png +0 -0
  919. psychopy/app/Resources/light/preferences-pilot@2x.png +0 -0
  920. psychopy/app/Resources/light/preferences32.png +0 -0
  921. psychopy/app/Resources/light/preferences32@2x.png +0 -0
  922. psychopy/app/Resources/light/pyPilot.png +0 -0
  923. psychopy/app/Resources/light/pyPilot@2x.png +0 -0
  924. psychopy/app/Resources/light/pyRun.png +0 -0
  925. psychopy/app/Resources/light/pyRun@2x.png +0 -0
  926. psychopy/app/Resources/light/reddot.png +0 -0
  927. psychopy/app/Resources/light/reddot@2x.png +0 -0
  928. psychopy/app/Resources/light/redglobe.png +0 -0
  929. psychopy/app/Resources/light/redglobe@2x.png +0 -0
  930. psychopy/app/Resources/light/redglobe_bug.png +0 -0
  931. psychopy/app/Resources/light/redglobe_bug@2x.png +0 -0
  932. psychopy/app/Resources/light/redglobe_greensync.png +0 -0
  933. psychopy/app/Resources/light/redglobe_greensync@2x.png +0 -0
  934. psychopy/app/Resources/light/redglobe_info.png +0 -0
  935. psychopy/app/Resources/light/redglobe_info@2x.png +0 -0
  936. psychopy/app/Resources/light/redglobe_magnifier.png +0 -0
  937. psychopy/app/Resources/light/redglobe_magnifier@2x.png +0 -0
  938. psychopy/app/Resources/light/redglobe_run.png +0 -0
  939. psychopy/app/Resources/light/redglobe_run@2x.png +0 -0
  940. psychopy/app/Resources/light/redglobe_user.png +0 -0
  941. psychopy/app/Resources/light/redglobe_user@2x.png +0 -0
  942. psychopy/app/Resources/light/redo.png +0 -0
  943. psychopy/app/Resources/light/redo32.png +0 -0
  944. psychopy/app/Resources/light/redo32@2x.png +0 -0
  945. psychopy/app/Resources/light/redo@2x.png +0 -0
  946. psychopy/app/Resources/light/regex.png +0 -0
  947. psychopy/app/Resources/light/regex@2x.png +0 -0
  948. psychopy/app/Resources/light/removeExp32.png +0 -0
  949. psychopy/app/Resources/light/removeExp32@2x.png +0 -0
  950. psychopy/app/Resources/light/rename16.png +0 -0
  951. psychopy/app/Resources/light/rename16@2x.png +0 -0
  952. psychopy/app/Resources/light/restart.png +0 -0
  953. psychopy/app/Resources/light/restart@2x.png +0 -0
  954. psychopy/app/Resources/light/runner.png +0 -0
  955. psychopy/app/Resources/light/runner@2x.png +0 -0
  956. psychopy/app/Resources/light/runnerPilot.png +0 -0
  957. psychopy/app/Resources/light/runnerPilot@2x.png +0 -0
  958. psychopy/app/Resources/light/savebtn16.png +0 -0
  959. psychopy/app/Resources/light/savebtn16@2x.png +0 -0
  960. psychopy/app/Resources/light/search.png +0 -0
  961. psychopy/app/Resources/light/search@2x.png +0 -0
  962. psychopy/app/Resources/light/showBuilder.png +0 -0
  963. psychopy/app/Resources/light/showBuilder@2x.png +0 -0
  964. psychopy/app/Resources/light/showCoder.png +0 -0
  965. psychopy/app/Resources/light/showCoder@2x.png +0 -0
  966. psychopy/app/Resources/light/showRunner.png +0 -0
  967. psychopy/app/Resources/light/showRunner@2x.png +0 -0
  968. psychopy/app/Resources/light/starred.png +0 -0
  969. psychopy/app/Resources/light/starred@2x.png +0 -0
  970. psychopy/app/Resources/light/start.png +0 -0
  971. psychopy/app/Resources/light/start@2x.png +0 -0
  972. psychopy/app/Resources/light/stdout.png +0 -0
  973. psychopy/app/Resources/light/stdout@2x.png +0 -0
  974. psychopy/app/Resources/light/stop.png +0 -0
  975. psychopy/app/Resources/light/stop32.png +0 -0
  976. psychopy/app/Resources/light/stop32@2x.png +0 -0
  977. psychopy/app/Resources/light/stop@2x.png +0 -0
  978. psychopy/app/Resources/light/switchCtrlBot.png +0 -0
  979. psychopy/app/Resources/light/switchCtrlBot@2x.png +0 -0
  980. psychopy/app/Resources/light/switchCtrlLeft.png +0 -0
  981. psychopy/app/Resources/light/switchCtrlLeft@2x.png +0 -0
  982. psychopy/app/Resources/light/switchCtrlRight.png +0 -0
  983. psychopy/app/Resources/light/switchCtrlRight@2x.png +0 -0
  984. psychopy/app/Resources/light/switchCtrlTop.png +0 -0
  985. psychopy/app/Resources/light/switchCtrlTop@2x.png +0 -0
  986. psychopy/app/Resources/light/tick.png +0 -0
  987. psychopy/app/Resources/light/tick@2x.png +0 -0
  988. psychopy/app/Resources/light/undo.png +0 -0
  989. psychopy/app/Resources/light/undo32.png +0 -0
  990. psychopy/app/Resources/light/undo32@2x.png +0 -0
  991. psychopy/app/Resources/light/undo@2x.png +0 -0
  992. psychopy/app/Resources/light/unstarred.png +0 -0
  993. psychopy/app/Resources/light/unstarred@2x.png +0 -0
  994. psychopy/app/Resources/light/user_none.png +0 -0
  995. psychopy/app/Resources/light/view-refresh16.png +0 -0
  996. psychopy/app/Resources/light/view-refresh16@2x.png +0 -0
  997. psychopy/app/Resources/light/viewbtn16.png +0 -0
  998. psychopy/app/Resources/light/viewbtn16@2x.png +0 -0
  999. psychopy/app/Resources/light/windows16.png +0 -0
  1000. psychopy/app/Resources/light/windows16@2x.png +0 -0
  1001. psychopy/app/Resources/moveComponentIcons.py +50 -0
  1002. psychopy/app/Resources/psychopy.desktop +13 -0
  1003. psychopy/app/Resources/psychopy.icns +0 -0
  1004. psychopy/app/Resources/psychopy.ico +0 -0
  1005. psychopy/app/Resources/psychopy.png +0 -0
  1006. psychopy/app/Resources/psychopy.xml +9 -0
  1007. psychopy/app/Resources/psychopy@2x.png +0 -0
  1008. psychopy/app/Resources/routine_templates/Basic.psyexp +344 -0
  1009. psychopy/app/Resources/routine_templates/Misc.psyexp +228 -0
  1010. psychopy/app/Resources/routine_templates/Online.psyexp +200 -0
  1011. psychopy/app/Resources/routine_templates/Trials.psyexp +735 -0
  1012. psychopy/app/Resources/routine_templates/readme.md +14 -0
  1013. psychopy/app/Resources/runner.ico +0 -0
  1014. psychopy/app/Resources/splash.png +0 -0
  1015. psychopy/app/Resources/splash@2x.png +0 -0
  1016. psychopy/app/Resources/tips.txt +45 -0
  1017. psychopy/app/Resources/tips_ar_001.txt +45 -0
  1018. psychopy/app/Resources/tips_fr_FR.txt +45 -0
  1019. psychopy/app/Resources/tips_ja_JP.txt +42 -0
  1020. psychopy/app/Resources/tips_zh_CN.txt +45 -0
  1021. psychopy/app/Resources/window.ico +0 -0
  1022. psychopy/app/__init__.py +339 -0
  1023. psychopy/app/__main__.py +3 -0
  1024. psychopy/app/_psychopyApp.py +1298 -0
  1025. psychopy/app/appData.spec +58 -0
  1026. psychopy/app/builder/__init__.py +5 -0
  1027. psychopy/app/builder/builder.py +4738 -0
  1028. psychopy/app/builder/dialogs/__init__.py +1910 -0
  1029. psychopy/app/builder/dialogs/dlgsCode.py +631 -0
  1030. psychopy/app/builder/dialogs/dlgsConditions.py +669 -0
  1031. psychopy/app/builder/dialogs/findDlg.py +275 -0
  1032. psychopy/app/builder/dialogs/paramCtrls.py +1802 -0
  1033. psychopy/app/builder/validators.py +589 -0
  1034. psychopy/app/coder/__init__.py +8 -0
  1035. psychopy/app/coder/codeEditorBase.py +460 -0
  1036. psychopy/app/coder/coder.py +3100 -0
  1037. psychopy/app/coder/fileBrowser.py +714 -0
  1038. psychopy/app/coder/folding.py +128 -0
  1039. psychopy/app/coder/psychoParser.py +139 -0
  1040. psychopy/app/coder/repl.py +496 -0
  1041. psychopy/app/coder/sourceTree.py +302 -0
  1042. psychopy/app/colorpicker/__init__.py +594 -0
  1043. psychopy/app/colorpicker/ui.py +336 -0
  1044. psychopy/app/connections/__init__.py +10 -0
  1045. psychopy/app/connections/news.py +104 -0
  1046. psychopy/app/connections/sendusage.py +61 -0
  1047. psychopy/app/connections/updates.py +642 -0
  1048. psychopy/app/console.py +164 -0
  1049. psychopy/app/deviceManager/__init__.py +1 -0
  1050. psychopy/app/deviceManager/addDialog.py +218 -0
  1051. psychopy/app/deviceManager/dialog.py +185 -0
  1052. psychopy/app/deviceManager/panel.py +191 -0
  1053. psychopy/app/deviceManager/utils.py +60 -0
  1054. psychopy/app/dialogs.py +664 -0
  1055. psychopy/app/errorDlg.py +238 -0
  1056. psychopy/app/frametracker.py +8 -0
  1057. psychopy/app/idle.py +181 -0
  1058. psychopy/app/jobs.py +676 -0
  1059. psychopy/app/linuxconfig/__init__.py +153 -0
  1060. psychopy/app/linuxconfig/ui.py +88 -0
  1061. psychopy/app/locale/ar_001/LC_MESSAGE/messages.mo +0 -0
  1062. psychopy/app/locale/ar_001/LC_MESSAGE/messages.po +12695 -0
  1063. psychopy/app/locale/cs_CZ/LC_MESSAGE/messages.mo +0 -0
  1064. psychopy/app/locale/cs_CZ/LC_MESSAGE/messages.po +10199 -0
  1065. psychopy/app/locale/da_DK/LC_MESSAGE/messages.mo +0 -0
  1066. psychopy/app/locale/da_DK/LC_MESSAGE/messages.po +10199 -0
  1067. psychopy/app/locale/de_DE/LC_MESSAGE/messages.mo +0 -0
  1068. psychopy/app/locale/de_DE/LC_MESSAGE/messages.po +11221 -0
  1069. psychopy/app/locale/el_GR/LC_MESSAGE/messages.mo +0 -0
  1070. psychopy/app/locale/el_GR/LC_MESSAGE/messages.po +10200 -0
  1071. psychopy/app/locale/en_NZ/LC_MESSAGE/messages.mo +0 -0
  1072. psychopy/app/locale/en_NZ/LC_MESSAGE/messages.po +10200 -0
  1073. psychopy/app/locale/en_US/LC_MESSAGE/messages.mo +0 -0
  1074. psychopy/app/locale/en_US/LC_MESSAGE/messages.po +10195 -0
  1075. psychopy/app/locale/es_CO/LC_MESSAGE/messages.mo +0 -0
  1076. psychopy/app/locale/es_CO/LC_MESSAGE/messages.po +11917 -0
  1077. psychopy/app/locale/es_ES/LC_MESSAGE/messages.mo +0 -0
  1078. psychopy/app/locale/es_ES/LC_MESSAGE/messages.po +11924 -0
  1079. psychopy/app/locale/es_US/LC_MESSAGE/messages.mo +0 -0
  1080. psychopy/app/locale/es_US/LC_MESSAGE/messages.po +11917 -0
  1081. psychopy/app/locale/et_EE/LC_MESSAGE/messages.mo +0 -0
  1082. psychopy/app/locale/et_EE/LC_MESSAGE/messages.po +11084 -0
  1083. psychopy/app/locale/fa_IR/LC_MESSAGE/messages.mo +0 -0
  1084. psychopy/app/locale/fa_IR/LC_MESSAGE/messages.po +11590 -0
  1085. psychopy/app/locale/fi_FI/LC_MESSAGE/messages.mo +0 -0
  1086. psychopy/app/locale/fi_FI/LC_MESSAGE/messages.po +10199 -0
  1087. psychopy/app/locale/fr_FR/LC_MESSAGE/messages.mo +0 -0
  1088. psychopy/app/locale/fr_FR/LC_MESSAGE/messages.po +11091 -0
  1089. psychopy/app/locale/he_IL/LC_MESSAGE/messages.mo +0 -0
  1090. psychopy/app/locale/he_IL/LC_MESSAGE/messages.po +11072 -0
  1091. psychopy/app/locale/hi_IN/LC_MESSAGE/messages.mo +0 -0
  1092. psychopy/app/locale/hi_IN/LC_MESSAGE/messages.po +11071 -0
  1093. psychopy/app/locale/hu_HU/LC_MESSAGE/messages.mo +0 -0
  1094. psychopy/app/locale/hu_HU/LC_MESSAGE/messages.po +10200 -0
  1095. psychopy/app/locale/it_IT/LC_MESSAGE/messages.mo +0 -0
  1096. psychopy/app/locale/it_IT/LC_MESSAGE/messages.po +11072 -0
  1097. psychopy/app/locale/ja_JP/LC_MESSAGE/messages.mo +0 -0
  1098. psychopy/app/locale/ja_JP/LC_MESSAGE/messages.po +11268 -0
  1099. psychopy/app/locale/ko_KR/LC_MESSAGE/messages.mo +0 -0
  1100. psychopy/app/locale/ko_KR/LC_MESSAGE/messages.po +10199 -0
  1101. psychopy/app/locale/ms_MY/LC_MESSAGE/messages.mo +0 -0
  1102. psychopy/app/locale/ms_MY/LC_MESSAGE/messages.po +11463 -0
  1103. psychopy/app/locale/nl_NL/LC_MESSAGE/messages.mo +0 -0
  1104. psychopy/app/locale/nl_NL/LC_MESSAGE/messages.po +10200 -0
  1105. psychopy/app/locale/nn_NO/LC_MESSAGE/messages.mo +0 -0
  1106. psychopy/app/locale/nn_NO/LC_MESSAGE/messages.po +10200 -0
  1107. psychopy/app/locale/pl_PL/LC_MESSAGE/messages.mo +0 -0
  1108. psychopy/app/locale/pl_PL/LC_MESSAGE/messages.po +10200 -0
  1109. psychopy/app/locale/pt_PT/LC_MESSAGE/messages.mo +0 -0
  1110. psychopy/app/locale/pt_PT/LC_MESSAGE/messages.po +11288 -0
  1111. psychopy/app/locale/ro_RO/LC_MESSAGE/messages.mo +0 -0
  1112. psychopy/app/locale/ro_RO/LC_MESSAGE/messages.po +10200 -0
  1113. psychopy/app/locale/ru_RU/LC_MESSAGE/messages.mo +0 -0
  1114. psychopy/app/locale/ru_RU/LC_MESSAGE/messages.po +10199 -0
  1115. psychopy/app/locale/sv_SE/LC_MESSAGE/messages.mo +0 -0
  1116. psychopy/app/locale/sv_SE/LC_MESSAGE/messages.po +11441 -0
  1117. psychopy/app/locale/tr_TR/LC_MESSAGE/messages.mo +0 -0
  1118. psychopy/app/locale/tr_TR/LC_MESSAGE/messages.po +11069 -0
  1119. psychopy/app/locale/zh_CN/LC_MESSAGE/messages.mo +0 -0
  1120. psychopy/app/locale/zh_CN/LC_MESSAGE/messages.po +12085 -0
  1121. psychopy/app/locale/zh_TW/LC_MESSAGE/messages.mo +0 -0
  1122. psychopy/app/locale/zh_TW/LC_MESSAGE/messages.po +11929 -0
  1123. psychopy/app/localizedStrings.py +386 -0
  1124. psychopy/app/pavlovia_ui/__init__.py +22 -0
  1125. psychopy/app/pavlovia_ui/_base.py +268 -0
  1126. psychopy/app/pavlovia_ui/functions.py +176 -0
  1127. psychopy/app/pavlovia_ui/menu.py +140 -0
  1128. psychopy/app/pavlovia_ui/project.py +943 -0
  1129. psychopy/app/pavlovia_ui/search.py +444 -0
  1130. psychopy/app/pavlovia_ui/sync.py +137 -0
  1131. psychopy/app/pavlovia_ui/user.py +264 -0
  1132. psychopy/app/plugin_manager/__init__.py +5 -0
  1133. psychopy/app/plugin_manager/dialog.py +402 -0
  1134. psychopy/app/plugin_manager/output.py +132 -0
  1135. psychopy/app/plugin_manager/packageIndex.py +303 -0
  1136. psychopy/app/plugin_manager/packages.py +643 -0
  1137. psychopy/app/plugin_manager/plugins.py +1363 -0
  1138. psychopy/app/plugin_manager/utils.py +115 -0
  1139. psychopy/app/preferencesDlg.py +771 -0
  1140. psychopy/app/psychopyApp.py +207 -0
  1141. psychopy/app/ribbon.py +1019 -0
  1142. psychopy/app/runner/__init__.py +1 -0
  1143. psychopy/app/runner/runner.py +1299 -0
  1144. psychopy/app/runner/scriptProcess.py +363 -0
  1145. psychopy/app/stdout/__init__.py +1 -0
  1146. psychopy/app/stdout/stdOutRich.py +410 -0
  1147. psychopy/app/sysInfoDlg.py +242 -0
  1148. psychopy/app/themes/__init__.py +78 -0
  1149. psychopy/app/themes/colors.py +201 -0
  1150. psychopy/app/themes/css/contrast_black.css +112 -0
  1151. psychopy/app/themes/css/contrast_white.css +115 -0
  1152. psychopy/app/themes/css/dark.css +112 -0
  1153. psychopy/app/themes/css/light.css +115 -0
  1154. psychopy/app/themes/fonts.py +629 -0
  1155. psychopy/app/themes/handlers.py +321 -0
  1156. psychopy/app/themes/icons.py +267 -0
  1157. psychopy/app/themes/spec/Classic.json +154 -0
  1158. psychopy/app/themes/spec/ClassicDark.json +154 -0
  1159. psychopy/app/themes/spec/GitHub.json +154 -0
  1160. psychopy/app/themes/spec/HiVisDark.json +153 -0
  1161. psychopy/app/themes/spec/HiVisLight.json +154 -0
  1162. psychopy/app/themes/spec/MinimalDark.json +154 -0
  1163. psychopy/app/themes/spec/MinimalLight.json +153 -0
  1164. psychopy/app/themes/spec/PsychopyDark.json +231 -0
  1165. psychopy/app/themes/spec/PsychopyLight.json +236 -0
  1166. psychopy/app/themes/ui.py +74 -0
  1167. psychopy/app/ui/__init__.py +184 -0
  1168. psychopy/app/urls.py +31 -0
  1169. psychopy/app/utils.py +1741 -0
  1170. psychopy/app/viewer/__init__.py +0 -0
  1171. psychopy/assets/Psychopy Window Favicon@16w.png +0 -0
  1172. psychopy/assets/Psychopy Window Favicon@32w.png +0 -0
  1173. psychopy/assets/USB-C.png +0 -0
  1174. psychopy/assets/USB.png +0 -0
  1175. psychopy/assets/__init__.py +0 -0
  1176. psychopy/assets/click.png +0 -0
  1177. psychopy/assets/clicknext.png +0 -0
  1178. psychopy/assets/creditCard.png +0 -0
  1179. psychopy/assets/default.mp3 +0 -0
  1180. psychopy/assets/default.mp4 +0 -0
  1181. psychopy/assets/default.png +0 -0
  1182. psychopy/assets/fonts/Arvo-Bold.ttf +0 -0
  1183. psychopy/assets/fonts/Arvo-BoldItalic.ttf +0 -0
  1184. psychopy/assets/fonts/Arvo-Italic.ttf +0 -0
  1185. psychopy/assets/fonts/Arvo-Regular.ttf +0 -0
  1186. psychopy/assets/fonts/DejaVuSerif.ttf +0 -0
  1187. psychopy/assets/fonts/IndieFlower-Regular.ttf +0 -0
  1188. psychopy/assets/fonts/JetBrainsMono-Italic-VariableFont_wght.ttf +0 -0
  1189. psychopy/assets/fonts/JetBrainsMono-VariableFont_wght.ttf +0 -0
  1190. psychopy/assets/fonts/NotoSans-Bold.ttf +0 -0
  1191. psychopy/assets/fonts/NotoSans-BoldItalic.ttf +0 -0
  1192. psychopy/assets/fonts/NotoSans-Italic.ttf +0 -0
  1193. psychopy/assets/fonts/NotoSans-Regular.ttf +0 -0
  1194. psychopy/assets/next.png +0 -0
  1195. psychopy/assets/psychopy.ico +0 -0
  1196. psychopy/assets/psychopy.png +0 -0
  1197. psychopy/assets/templates/__init__.py +0 -0
  1198. psychopy/assets/templates/instruct1.png +0 -0
  1199. psychopy/assets/templates/instruct2.png +0 -0
  1200. psychopy/assets/touch.png +0 -0
  1201. psychopy/assets/touchnext.png +0 -0
  1202. psychopy/assets/voicekeyThresholdStim.wav +0 -0
  1203. psychopy/assets/window.ico +0 -0
  1204. psychopy/changes/2023.1.0.md +9 -0
  1205. psychopy/changes/2024.1.0.md +16 -0
  1206. psychopy/changes/__init__.py +0 -0
  1207. psychopy/clock.py +619 -0
  1208. psychopy/colors.py +1058 -0
  1209. psychopy/compatibility.py +147 -0
  1210. psychopy/constants.py +87 -0
  1211. psychopy/contrib/__init__.py +0 -0
  1212. psychopy/contrib/configobj/LICENSE +39 -0
  1213. psychopy/contrib/configobj/__init__.py +2455 -0
  1214. psychopy/contrib/configobj/_version.py +2 -0
  1215. psychopy/contrib/configobj/validate.py +1458 -0
  1216. psychopy/contrib/lazy_import.py +402 -0
  1217. psychopy/contrib/mseq.py +273 -0
  1218. psychopy/contrib/mseqSearch.py +183 -0
  1219. psychopy/contrib/psi.py +100 -0
  1220. psychopy/contrib/quest.py +484 -0
  1221. psychopy/contrib/tesselate.py +188 -0
  1222. psychopy/core.py +167 -0
  1223. psychopy/data/__init__.py +45 -0
  1224. psychopy/data/base.py +566 -0
  1225. psychopy/data/counterbalance.py +210 -0
  1226. psychopy/data/experiment.py +1049 -0
  1227. psychopy/data/fit.py +248 -0
  1228. psychopy/data/routine.py +94 -0
  1229. psychopy/data/shelf.py +237 -0
  1230. psychopy/data/staircase.py +2270 -0
  1231. psychopy/data/trial.py +2505 -0
  1232. psychopy/data/utils.py +858 -0
  1233. psychopy/demos/__init__.py +0 -0
  1234. psychopy/demos/builder/Design Templates/branchedExperiment/README.md +5 -0
  1235. psychopy/demos/builder/Design Templates/branchedExperiment/branchedExperiment.psyexp +354 -0
  1236. psychopy/demos/builder/Design Templates/branchedExperiment/trialTypes.xlsx +0 -0
  1237. psychopy/demos/builder/Design Templates/psychophysicsStaircase/README.md +20 -0
  1238. psychopy/demos/builder/Design Templates/psychophysicsStaircase/psychophysicsStaircase.psyexp +286 -0
  1239. psychopy/demos/builder/Design Templates/psychophysicsStairsInterleaved/README.md +14 -0
  1240. psychopy/demos/builder/Design Templates/psychophysicsStairsInterleaved/psychophysicsStaircaseInterleaved.psyexp +340 -0
  1241. psychopy/demos/builder/Design Templates/psychophysicsStairsInterleaved/stairDefinitions.xlsx +0 -0
  1242. psychopy/demos/builder/Design Templates/randomisedBlocks/README.md +18 -0
  1243. psychopy/demos/builder/Design Templates/randomisedBlocks/chooseBlock.xlsx +0 -0
  1244. psychopy/demos/builder/Design Templates/randomisedBlocks/facesBlock.xlsx +0 -0
  1245. psychopy/demos/builder/Design Templates/randomisedBlocks/housesBlock.xlsx +0 -0
  1246. psychopy/demos/builder/Design Templates/randomisedBlocks/randomisedBlocks.psyexp +219 -0
  1247. psychopy/demos/builder/Design Templates/randomisedBlocks/stims/face01.jpg +0 -0
  1248. psychopy/demos/builder/Design Templates/randomisedBlocks/stims/face02.jpg +0 -0
  1249. psychopy/demos/builder/Design Templates/randomisedBlocks/stims/face03.jpg +0 -0
  1250. psychopy/demos/builder/Design Templates/randomisedBlocks/stims/house01.jpg +0 -0
  1251. psychopy/demos/builder/Design Templates/randomisedBlocks/stims/house02.jpg +0 -0
  1252. psychopy/demos/builder/Design Templates/randomisedBlocks/stims/house03.jpg +0 -0
  1253. psychopy/demos/builder/Experiments/BART/README.md +30 -0
  1254. psychopy/demos/builder/Experiments/BART/assets/background.jpg +0 -0
  1255. psychopy/demos/builder/Experiments/BART/assets/background.png +0 -0
  1256. psychopy/demos/builder/Experiments/BART/assets/bang.mp3 +0 -0
  1257. psychopy/demos/builder/Experiments/BART/assets/bang.wav +0 -0
  1258. psychopy/demos/builder/Experiments/BART/assets/blueBalloon.png +0 -0
  1259. psychopy/demos/builder/Experiments/BART/assets/greenBalloon.png +0 -0
  1260. psychopy/demos/builder/Experiments/BART/assets/redBalloon.png +0 -0
  1261. psychopy/demos/builder/Experiments/BART/bart.psyexp +844 -0
  1262. psychopy/demos/builder/Experiments/BART/spreadsheets/conditions.xlsx +0 -0
  1263. psychopy/demos/builder/Experiments/BigFiveInventory/BFI.psyexp +255 -0
  1264. psychopy/demos/builder/Experiments/BigFiveInventory/README.md +23 -0
  1265. psychopy/demos/builder/Experiments/BigFiveInventory/TIPI.xlsx +0 -0
  1266. psychopy/demos/builder/Experiments/BigFiveInventory/bigFiveItems.xlsx +0 -0
  1267. psychopy/demos/builder/Experiments/BigFiveInventory/demographics.xlsx +0 -0
  1268. psychopy/demos/builder/Experiments/BigFiveInventory/mini_IPIP.xlsx +0 -0
  1269. psychopy/demos/builder/Experiments/GoNoGo/conditions.xlsx +0 -0
  1270. psychopy/demos/builder/Experiments/GoNoGo/gng.psyexp +462 -0
  1271. psychopy/demos/builder/Experiments/GoNoGo/go.png +0 -0
  1272. psychopy/demos/builder/Experiments/GoNoGo/nogo.png +0 -0
  1273. psychopy/demos/builder/Experiments/dragAndDrop/README.md +5 -0
  1274. psychopy/demos/builder/Experiments/dragAndDrop/drag_and_drop.psyexp +494 -0
  1275. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/blank_grid.png +0 -0
  1276. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/make_shapes.psyexp +221 -0
  1277. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/readme.md +4 -0
  1278. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_1.png +0 -0
  1279. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_10.png +0 -0
  1280. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_2.png +0 -0
  1281. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_3.png +0 -0
  1282. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_4.png +0 -0
  1283. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_5.png +0 -0
  1284. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_6.png +0 -0
  1285. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_7.png +0 -0
  1286. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_8.png +0 -0
  1287. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_9.png +0 -0
  1288. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solutions.xlsx +0 -0
  1289. psychopy/demos/builder/Experiments/goNoGo/readme.md +14 -0
  1290. psychopy/demos/builder/Experiments/mentalRotation/F.png +0 -0
  1291. psychopy/demos/builder/Experiments/mentalRotation/FR.png +0 -0
  1292. psychopy/demos/builder/Experiments/mentalRotation/MentalRot.csv +33 -0
  1293. psychopy/demos/builder/Experiments/mentalRotation/MentalRotation.psyexp +646 -0
  1294. psychopy/demos/builder/Experiments/mentalRotation/README.md +23 -0
  1295. psychopy/demos/builder/Experiments/navon/NavonTask.psyexp +509 -0
  1296. psychopy/demos/builder/Experiments/navon/README.md +26 -0
  1297. psychopy/demos/builder/Experiments/navon/bigHsmallH.png +0 -0
  1298. psychopy/demos/builder/Experiments/navon/bigHsmallS.png +0 -0
  1299. psychopy/demos/builder/Experiments/navon/bigSsmallH.png +0 -0
  1300. psychopy/demos/builder/Experiments/navon/bigSsmallS.png +0 -0
  1301. psychopy/demos/builder/Experiments/navon/mask.png +0 -0
  1302. psychopy/demos/builder/Experiments/navon/stimuli.pptx +0 -0
  1303. psychopy/demos/builder/Experiments/navon/trialTypes.xlsx +0 -0
  1304. psychopy/demos/builder/Experiments/sternberg/README.md +14 -0
  1305. psychopy/demos/builder/Experiments/sternberg/mainTrials.xlsx +0 -0
  1306. psychopy/demos/builder/Experiments/sternberg/pracTrials.xlsx +0 -0
  1307. psychopy/demos/builder/Experiments/sternberg/sternberg.psyexp +649 -0
  1308. psychopy/demos/builder/Experiments/stroop/README.md +15 -0
  1309. psychopy/demos/builder/Experiments/stroop/stroop.psyexp +321 -0
  1310. psychopy/demos/builder/Experiments/stroop/trialTypes.csv +7 -0
  1311. psychopy/demos/builder/Experiments/stroopExtended/README.md +14 -0
  1312. psychopy/demos/builder/Experiments/stroopExtended/stroop.psyexp +418 -0
  1313. psychopy/demos/builder/Experiments/stroopExtended/stroopReverse.psyexp +418 -0
  1314. psychopy/demos/builder/Experiments/stroopExtended/trialTypes.xlsx +0 -0
  1315. psychopy/demos/builder/Experiments/stroopExtended/trialTypesReverse.xlsx +0 -0
  1316. psychopy/demos/builder/Experiments/stroopVoice/README.md +27 -0
  1317. psychopy/demos/builder/Experiments/stroopVoice/conditions.xlsx +0 -0
  1318. psychopy/demos/builder/Experiments/stroopVoice/stroopVoice.psyexp +382 -0
  1319. psychopy/demos/builder/Feature Demos/buttonBox/buttonBoxDemo.psyexp +371 -0
  1320. psychopy/demos/builder/Feature Demos/buttonBox/readme.md +5 -0
  1321. psychopy/demos/builder/Feature Demos/counterbalance/counterbalance.psyexp +308 -0
  1322. psychopy/demos/builder/Feature Demos/gratings/gratings.psyexp +391 -0
  1323. psychopy/demos/builder/Feature Demos/gratings/readme.md +8 -0
  1324. psychopy/demos/builder/Feature Demos/movies/movie.psyexp +220 -0
  1325. psychopy/demos/builder/Feature Demos/movies/readme.md +3 -0
  1326. psychopy/demos/builder/Feature Demos/noise/face.jpg +0 -0
  1327. psychopy/demos/builder/Feature Demos/noise/noise.psyexp +477 -0
  1328. psychopy/demos/builder/Feature Demos/noise/readme.md +3 -0
  1329. psychopy/demos/builder/Feature Demos/panorama/panImg.jpg +0 -0
  1330. psychopy/demos/builder/Feature Demos/panorama/panorama.psyexp +177 -0
  1331. psychopy/demos/builder/Feature Demos/pilotMode/pilotMode.psyexp +434 -0
  1332. psychopy/demos/builder/Feature Demos/pilotMode/readme.md +7 -0
  1333. psychopy/demos/builder/Feature Demos/progress/progressBar.psyexp +451 -0
  1334. psychopy/demos/builder/Feature Demos/progress/readme.md +1 -0
  1335. psychopy/demos/builder/Feature Demos/sliders/README.md +8 -0
  1336. psychopy/demos/builder/Feature Demos/sliders/fruitConditions.xlsx +0 -0
  1337. psychopy/demos/builder/Feature Demos/sliders/sliders.psyexp +984 -0
  1338. psychopy/demos/builder/Feature Demos/visualValidator/readme.md +7 -0
  1339. psychopy/demos/builder/Feature Demos/visualValidator/visualValidator.psyexp +199 -0
  1340. psychopy/demos/builder/Hardware/EEG_parallel_component/EEG_triggers_parallel_comp.psyexp +639 -0
  1341. psychopy/demos/builder/Hardware/EEG_serial_code/EEG_triggers_serial_code.psyexp +415 -0
  1342. psychopy/demos/builder/Hardware/EEG_serial_component/EEG_triggers_serial_comp.psyexp +659 -0
  1343. psychopy/demos/builder/Hardware/EGI_netstation/README.md +17 -0
  1344. psychopy/demos/builder/Hardware/EGI_netstation/stroop.psyexp +339 -0
  1345. psychopy/demos/builder/Hardware/EGI_netstation/trialTypesEEG.csv +7 -0
  1346. psychopy/demos/builder/Hardware/Eyetracking_visual_search/readme.md +19 -0
  1347. psychopy/demos/builder/Hardware/Eyetracking_visual_search/trials_params.xlsx +0 -0
  1348. psychopy/demos/builder/Hardware/Eyetracking_visual_search/visualSearch.psyexp +830 -0
  1349. psychopy/demos/builder/Hardware/camera/camera.psyexp +330 -0
  1350. psychopy/demos/builder/Hardware/camera/readme.md +6 -0
  1351. psychopy/demos/builder/Hardware/eyetracking/eyetracking.psyexp +459 -0
  1352. psychopy/demos/builder/Hardware/eyetracking/readme.md +7 -0
  1353. psychopy/demos/builder/Hardware/eyetracking_custom_cal/Bullseye_grey.mov +0 -0
  1354. psychopy/demos/builder/Hardware/eyetracking_custom_cal/eyetracking_custom_cal.psyexp +468 -0
  1355. psychopy/demos/builder/Hardware/eyetracking_custom_cal/readme.md +7 -0
  1356. psychopy/demos/builder/Hardware/fMRI/fMRI_demo.psyexp +211 -0
  1357. psychopy/demos/builder/Hardware/fMRI/readme.md +7 -0
  1358. psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo.psyexp +360 -0
  1359. psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo_legacy.psyexp +360 -0
  1360. psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo_legacy_legacy.psyexp +312 -0
  1361. psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy.psyexp +360 -0
  1362. psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy_legacy.psyexp +360 -0
  1363. psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy_legacy_legacy.psyexp +312 -0
  1364. psychopy/demos/builder/Hardware/microphone/microphone.psyexp +484 -0
  1365. psychopy/demos/builder/Hardware/microphone/phrases.xlsx +0 -0
  1366. psychopy/demos/builder/Hardware/microphone/readme.md +9 -0
  1367. psychopy/demos/builder/Hardware/pump/README.md +19 -0
  1368. psychopy/demos/builder/Hardware/pump/pump.psyexp +646 -0
  1369. psychopy/demos/builder/Helper Tools/achorVSalignment/FlowCircular-Regular.ttf +0 -0
  1370. psychopy/demos/builder/Helper Tools/achorVSalignment/anchorAlignment.psyexp +350 -0
  1371. psychopy/demos/builder/Helper Tools/achorVSalignment/readme.md +5 -0
  1372. psychopy/demos/builder/Helper Tools/clockFace/README.md +3 -0
  1373. psychopy/demos/builder/Helper Tools/clockFace/clockFace.psyexp +211 -0
  1374. psychopy/demos/builder/Helper Tools/colors/README.md +5 -0
  1375. psychopy/demos/builder/Helper Tools/colors/colors.psyexp +321 -0
  1376. psychopy/demos/builder/Helper Tools/drawPolygon/README.md +5 -0
  1377. psychopy/demos/builder/Helper Tools/drawPolygon/drawPolygon.psyexp +704 -0
  1378. psychopy/demos/builder/Helper Tools/keyNameFinder/README.md +14 -0
  1379. psychopy/demos/builder/Helper Tools/keyNameFinder/keyNameFinder.psyexp +225 -0
  1380. psychopy/demos/builder/Helper Tools/spatialUnits/README.md +6 -0
  1381. psychopy/demos/builder/Helper Tools/spatialUnits/unitDemo.psyexp +206 -0
  1382. psychopy/demos/builder/README.txt +43 -0
  1383. psychopy/demos/builder/__init__.py +0 -0
  1384. psychopy/demos/coder/__init__.py +0 -0
  1385. psychopy/demos/coder/basic/hello_world.py +37 -0
  1386. psychopy/demos/coder/csvFromPsydat.py +29 -0
  1387. psychopy/demos/coder/experiment control/JND_staircase_analysis.py +85 -0
  1388. psychopy/demos/coder/experiment control/JND_staircase_exp.py +110 -0
  1389. psychopy/demos/coder/experiment control/TrialHandler.py +64 -0
  1390. psychopy/demos/coder/experiment control/TrialHandler2.py +42 -0
  1391. psychopy/demos/coder/experiment control/__init__.py +0 -0
  1392. psychopy/demos/coder/experiment control/autoDraw_autoLog.py +50 -0
  1393. psychopy/demos/coder/experiment control/experimentHandler.py +57 -0
  1394. psychopy/demos/coder/experiment control/fMRI_launchScan.py +74 -0
  1395. psychopy/demos/coder/experiment control/gammaMotionAnalysis.py +68 -0
  1396. psychopy/demos/coder/experiment control/gammaMotionNull.py +169 -0
  1397. psychopy/demos/coder/experiment control/logFiles.py +55 -0
  1398. psychopy/demos/coder/experiment control/piloting.py +65 -0
  1399. psychopy/demos/coder/experiment control/runtimeInfo.py +79 -0
  1400. psychopy/demos/coder/hardware/CRS_BitsBox.py +75 -0
  1401. psychopy/demos/coder/hardware/CRS_BitsPlusPlus.py +73 -0
  1402. psychopy/demos/coder/hardware/RiftHeadTrackingExample.py +95 -0
  1403. psychopy/demos/coder/hardware/RiftMinimal.py +44 -0
  1404. psychopy/demos/coder/hardware/VSHD_Distortion.py +49 -0
  1405. psychopy/demos/coder/hardware/__init__.py +0 -0
  1406. psychopy/demos/coder/hardware/camera.py +90 -0
  1407. psychopy/demos/coder/hardware/cedrusRB730.py +38 -0
  1408. psychopy/demos/coder/hardware/crsBitsAdvancedDemo.py +780 -0
  1409. psychopy/demos/coder/hardware/egi_netstation.py +45 -0
  1410. psychopy/demos/coder/hardware/hdf5_extract.py +133 -0
  1411. psychopy/demos/coder/hardware/ioLab_bbox.py +62 -0
  1412. psychopy/demos/coder/hardware/labjack_u3.py +61 -0
  1413. psychopy/demos/coder/hardware/monitorDemo.py +28 -0
  1414. psychopy/demos/coder/hardware/parallelPortOutput.py +49 -0
  1415. psychopy/demos/coder/hardware/qmixPump.py +79 -0
  1416. psychopy/demos/coder/hardware/testSoundLatency.py +127 -0
  1417. psychopy/demos/coder/input/GUI.py +52 -0
  1418. psychopy/demos/coder/input/__init__.py +0 -0
  1419. psychopy/demos/coder/input/customMouse.py +51 -0
  1420. psychopy/demos/coder/input/joystick_universal.py +84 -0
  1421. psychopy/demos/coder/input/keyNameFinder.py +39 -0
  1422. psychopy/demos/coder/input/mic.png +0 -0
  1423. psychopy/demos/coder/input/mouse.py +66 -0
  1424. psychopy/demos/coder/iohub/delaytest.py +231 -0
  1425. psychopy/demos/coder/iohub/eyetracking/gcCursor/images/canal.jpg +0 -0
  1426. psychopy/demos/coder/iohub/eyetracking/gcCursor/images/fall.jpg +0 -0
  1427. psychopy/demos/coder/iohub/eyetracking/gcCursor/images/lake.jpg +0 -0
  1428. psychopy/demos/coder/iohub/eyetracking/gcCursor/images/party.jpg +0 -0
  1429. psychopy/demos/coder/iohub/eyetracking/gcCursor/images/swimming.jpg +0 -0
  1430. psychopy/demos/coder/iohub/eyetracking/gcCursor/readTrialEventsByConditionVariables.py +67 -0
  1431. psychopy/demos/coder/iohub/eyetracking/gcCursor/readTrialEventsByMessages.py +34 -0
  1432. psychopy/demos/coder/iohub/eyetracking/gcCursor/run.py +323 -0
  1433. psychopy/demos/coder/iohub/eyetracking/gcCursor/trial_conditions.xlsx +0 -0
  1434. psychopy/demos/coder/iohub/eyetracking/simple.py +147 -0
  1435. psychopy/demos/coder/iohub/eyetracking/validation.py +251 -0
  1436. psychopy/demos/coder/iohub/iodatastore/saveEventReport.py +56 -0
  1437. psychopy/demos/coder/iohub/keyboard.py +189 -0
  1438. psychopy/demos/coder/iohub/keyboardreactiontime.py +88 -0
  1439. psychopy/demos/coder/iohub/launchHub.py +160 -0
  1440. psychopy/demos/coder/iohub/mouse.py +112 -0
  1441. psychopy/demos/coder/iohub/mouse_multi_window.py +124 -0
  1442. psychopy/demos/coder/iohub/serial/_parseserial.py +53 -0
  1443. psychopy/demos/coder/iohub/serial/customparser.py +84 -0
  1444. psychopy/demos/coder/iohub/serial/pstbox.py +166 -0
  1445. psychopy/demos/coder/iohub/wintab/_wintabgraphics.py +281 -0
  1446. psychopy/demos/coder/iohub/wintab/pen_demo.py +260 -0
  1447. psychopy/demos/coder/misc/encrypt_data.py +48 -0
  1448. psychopy/demos/coder/misc/hdf5_2_csv +33 -0
  1449. psychopy/demos/coder/misc/makeMovie.py +28 -0
  1450. psychopy/demos/coder/misc/rigidBodyTransform.py +76 -0
  1451. psychopy/demos/coder/stimuli/Campaign.ttf +0 -0
  1452. psychopy/demos/coder/stimuli/MovieStim.py +65 -0
  1453. psychopy/demos/coder/stimuli/__init__.py +0 -0
  1454. psychopy/demos/coder/stimuli/aperture.py +37 -0
  1455. psychopy/demos/coder/stimuli/beach.jpg +0 -0
  1456. psychopy/demos/coder/stimuli/bufferImageStim.py +78 -0
  1457. psychopy/demos/coder/stimuli/clockface.py +43 -0
  1458. psychopy/demos/coder/stimuli/colorPalette.py +134 -0
  1459. psychopy/demos/coder/stimuli/compare_text_timing.py +193 -0
  1460. psychopy/demos/coder/stimuli/counterphase.py +43 -0
  1461. psychopy/demos/coder/stimuli/customTextures.py +57 -0
  1462. psychopy/demos/coder/stimuli/dot_gabors.py +35 -0
  1463. psychopy/demos/coder/stimuli/dots.py +35 -0
  1464. psychopy/demos/coder/stimuli/elementArrays.py +92 -0
  1465. psychopy/demos/coder/stimuli/embeddedOpenGL.py +35 -0
  1466. psychopy/demos/coder/stimuli/face.jpg +0 -0
  1467. psychopy/demos/coder/stimuli/face_jpg.py +48 -0
  1468. psychopy/demos/coder/stimuli/gabor.py +30 -0
  1469. psychopy/demos/coder/stimuli/imagesAndPatches.py +51 -0
  1470. psychopy/demos/coder/stimuli/jwpIntro.mp4 +0 -0
  1471. psychopy/demos/coder/stimuli/kanizsa.py +41 -0
  1472. psychopy/demos/coder/stimuli/maskReveal.py +63 -0
  1473. psychopy/demos/coder/stimuli/plaid.py +43 -0
  1474. psychopy/demos/coder/stimuli/ratingScale.py +183 -0
  1475. psychopy/demos/coder/stimuli/rotatingFlashingWedge.py +37 -0
  1476. psychopy/demos/coder/stimuli/screensAndWindows.py +58 -0
  1477. psychopy/demos/coder/stimuli/secondOrderGratings.py +66 -0
  1478. psychopy/demos/coder/stimuli/shapeContains.py +50 -0
  1479. psychopy/demos/coder/stimuli/shapes.py +63 -0
  1480. psychopy/demos/coder/stimuli/soundStimuli.py +49 -0
  1481. psychopy/demos/coder/stimuli/starField.py +48 -0
  1482. psychopy/demos/coder/stimuli/stim3d.py +107 -0
  1483. psychopy/demos/coder/stimuli/textBoxStim/textbox_glyph_placement.py +93 -0
  1484. psychopy/demos/coder/stimuli/textBoxStim/textbox_simple.py +71 -0
  1485. psychopy/demos/coder/stimuli/textStimuli.py +106 -0
  1486. psychopy/demos/coder/stimuli/textbox_editable.py +64 -0
  1487. psychopy/demos/coder/stimuli/variousVisualStims.py +47 -0
  1488. psychopy/demos/coder/stimuli/visual_noise.py +31 -0
  1489. psychopy/demos/coder/sysInfo.py +56 -0
  1490. psychopy/demos/coder/timing/__init__.py +0 -0
  1491. psychopy/demos/coder/timing/callOnFlip.py +39 -0
  1492. psychopy/demos/coder/timing/clocksAndTimers.py +46 -0
  1493. psychopy/demos/coder/timing/millikeyKeyboardTimingTest.py +323 -0
  1494. psychopy/demos/coder/timing/timeByFrames.py +80 -0
  1495. psychopy/demos/coder/timing/timeByFramesEx.py +107 -0
  1496. psychopy/demos/coder/understanding psychopy/colors.py +70 -0
  1497. psychopy/demos/coder/understanding psychopy/fontLayout.py +69 -0
  1498. psychopy/demos/demo_migration.py +214 -0
  1499. psychopy/demos/modernizeDemos.py +16 -0
  1500. psychopy/demos/test_demo_migration.py +155 -0
  1501. psychopy/devices/__init__.py +8 -0
  1502. psychopy/event.py +1339 -0
  1503. psychopy/exceptions.py +59 -0
  1504. psychopy/experiment/__init__.py +51 -0
  1505. psychopy/experiment/_experiment.py +1514 -0
  1506. psychopy/experiment/blankTemplate.xltx +0 -0
  1507. psychopy/experiment/components/__init__.py +402 -0
  1508. psychopy/experiment/components/_base.py +1689 -0
  1509. psychopy/experiment/components/aperture/__init__.py +153 -0
  1510. psychopy/experiment/components/aperture/classic/aperture.png +0 -0
  1511. psychopy/experiment/components/aperture/classic/aperture@2x.png +0 -0
  1512. psychopy/experiment/components/aperture/dark/aperture.png +0 -0
  1513. psychopy/experiment/components/aperture/dark/aperture@2x.png +0 -0
  1514. psychopy/experiment/components/aperture/light/aperture.png +0 -0
  1515. psychopy/experiment/components/aperture/light/aperture@2x.png +0 -0
  1516. psychopy/experiment/components/brush/__init__.py +165 -0
  1517. psychopy/experiment/components/brush/classic/brush.png +0 -0
  1518. psychopy/experiment/components/brush/classic/brush@2x.png +0 -0
  1519. psychopy/experiment/components/brush/dark/brush.png +0 -0
  1520. psychopy/experiment/components/brush/dark/brush@2x.png +0 -0
  1521. psychopy/experiment/components/brush/light/brush.png +0 -0
  1522. psychopy/experiment/components/brush/light/brush@2x.png +0 -0
  1523. psychopy/experiment/components/button/__init__.py +493 -0
  1524. psychopy/experiment/components/button/classic/button.png +0 -0
  1525. psychopy/experiment/components/button/classic/button@2x.png +0 -0
  1526. psychopy/experiment/components/button/dark/button.png +0 -0
  1527. psychopy/experiment/components/button/dark/button@2x.png +0 -0
  1528. psychopy/experiment/components/button/light/button.png +0 -0
  1529. psychopy/experiment/components/button/light/button@2x.png +0 -0
  1530. psychopy/experiment/components/buttonBox/__init__.py +322 -0
  1531. psychopy/experiment/components/buttonBox/classic/buttonBox.png +0 -0
  1532. psychopy/experiment/components/buttonBox/classic/buttonBox@2x.png +0 -0
  1533. psychopy/experiment/components/buttonBox/dark/buttonBox.png +0 -0
  1534. psychopy/experiment/components/buttonBox/dark/buttonBox@2x.png +0 -0
  1535. psychopy/experiment/components/buttonBox/light/buttonBox.png +0 -0
  1536. psychopy/experiment/components/buttonBox/light/buttonBox@2x.png +0 -0
  1537. psychopy/experiment/components/camera/__init__.py +381 -0
  1538. psychopy/experiment/components/camera/classic/webcam.png +0 -0
  1539. psychopy/experiment/components/camera/classic/webcam@2x.png +0 -0
  1540. psychopy/experiment/components/camera/dark/webcam.png +0 -0
  1541. psychopy/experiment/components/camera/dark/webcam@2x.png +0 -0
  1542. psychopy/experiment/components/camera/light/webcam.png +0 -0
  1543. psychopy/experiment/components/camera/light/webcam@2x.png +0 -0
  1544. psychopy/experiment/components/code/__init__.py +299 -0
  1545. psychopy/experiment/components/code/classic/code.png +0 -0
  1546. psychopy/experiment/components/code/classic/code@2x.png +0 -0
  1547. psychopy/experiment/components/code/dark/code.png +0 -0
  1548. psychopy/experiment/components/code/dark/code@2x.png +0 -0
  1549. psychopy/experiment/components/code/light/code.png +0 -0
  1550. psychopy/experiment/components/code/light/code@2x.png +0 -0
  1551. psychopy/experiment/components/dots/__init__.py +199 -0
  1552. psychopy/experiment/components/dots/classic/dots.png +0 -0
  1553. psychopy/experiment/components/dots/classic/dots@2x.png +0 -0
  1554. psychopy/experiment/components/dots/dark/dots.png +0 -0
  1555. psychopy/experiment/components/dots/dark/dots@2x.png +0 -0
  1556. psychopy/experiment/components/dots/dots.xcf +0 -0
  1557. psychopy/experiment/components/dots/light/dots.png +0 -0
  1558. psychopy/experiment/components/dots/light/dots@2x.png +0 -0
  1559. psychopy/experiment/components/eyetracker_record/__init__.py +194 -0
  1560. psychopy/experiment/components/eyetracker_record/classic/eyetracker_record.png +0 -0
  1561. psychopy/experiment/components/eyetracker_record/classic/eyetracker_record@2x.png +0 -0
  1562. psychopy/experiment/components/eyetracker_record/dark/eyetracker_record.png +0 -0
  1563. psychopy/experiment/components/eyetracker_record/dark/eyetracker_record@2x.png +0 -0
  1564. psychopy/experiment/components/eyetracker_record/light/eyetracker_record.png +0 -0
  1565. psychopy/experiment/components/eyetracker_record/light/eyetracker_record@2x.png +0 -0
  1566. psychopy/experiment/components/form/__init__.py +227 -0
  1567. psychopy/experiment/components/form/classic/form.png +0 -0
  1568. psychopy/experiment/components/form/classic/form@2x.png +0 -0
  1569. psychopy/experiment/components/form/dark/form.png +0 -0
  1570. psychopy/experiment/components/form/dark/form@2x.png +0 -0
  1571. psychopy/experiment/components/form/formItems.xltx +0 -0
  1572. psychopy/experiment/components/form/light/form.png +0 -0
  1573. psychopy/experiment/components/form/light/form@2x.png +0 -0
  1574. psychopy/experiment/components/grating/__init__.py +203 -0
  1575. psychopy/experiment/components/grating/classic/grating.png +0 -0
  1576. psychopy/experiment/components/grating/classic/grating@2x.png +0 -0
  1577. psychopy/experiment/components/grating/dark/grating.png +0 -0
  1578. psychopy/experiment/components/grating/dark/grating@2x.png +0 -0
  1579. psychopy/experiment/components/grating/light/grating.png +0 -0
  1580. psychopy/experiment/components/grating/light/grating@2x.png +0 -0
  1581. psychopy/experiment/components/image/__init__.py +195 -0
  1582. psychopy/experiment/components/image/classic/image.png +0 -0
  1583. psychopy/experiment/components/image/classic/image@2x.png +0 -0
  1584. psychopy/experiment/components/image/dark/image.png +0 -0
  1585. psychopy/experiment/components/image/dark/image@2x.png +0 -0
  1586. psychopy/experiment/components/image/light/image.png +0 -0
  1587. psychopy/experiment/components/image/light/image@2x.png +0 -0
  1588. psychopy/experiment/components/joyButtons/__init__.py +453 -0
  1589. psychopy/experiment/components/joyButtons/classic/joyButtons.png +0 -0
  1590. psychopy/experiment/components/joyButtons/classic/joybuttons@2x.png +0 -0
  1591. psychopy/experiment/components/joyButtons/dark/joyButtons.png +0 -0
  1592. psychopy/experiment/components/joyButtons/dark/joyButtons@2x.png +0 -0
  1593. psychopy/experiment/components/joyButtons/light/joyButtons.png +0 -0
  1594. psychopy/experiment/components/joyButtons/light/joyButtons@2x.png +0 -0
  1595. psychopy/experiment/components/joyButtons/virtualJoyButtons.py +34 -0
  1596. psychopy/experiment/components/joystick/__init__.py +572 -0
  1597. psychopy/experiment/components/joystick/classic/joystick.png +0 -0
  1598. psychopy/experiment/components/joystick/classic/joystick@2x.png +0 -0
  1599. psychopy/experiment/components/joystick/dark/joystick.png +0 -0
  1600. psychopy/experiment/components/joystick/dark/joystick@2x.png +0 -0
  1601. psychopy/experiment/components/joystick/light/joystick.png +0 -0
  1602. psychopy/experiment/components/joystick/light/joystick@2x.png +0 -0
  1603. psychopy/experiment/components/joystick/virtualJoystick.py +40 -0
  1604. psychopy/experiment/components/keyboard/__init__.py +568 -0
  1605. psychopy/experiment/components/keyboard/classic/keyboard.png +0 -0
  1606. psychopy/experiment/components/keyboard/classic/keyboard@2x.png +0 -0
  1607. psychopy/experiment/components/keyboard/dark/keyboard.png +0 -0
  1608. psychopy/experiment/components/keyboard/dark/keyboard@2x.png +0 -0
  1609. psychopy/experiment/components/keyboard/light/keyboard.png +0 -0
  1610. psychopy/experiment/components/keyboard/light/keyboard@2x.png +0 -0
  1611. psychopy/experiment/components/keyboard.xcf +0 -0
  1612. psychopy/experiment/components/microphone/__init__.py +600 -0
  1613. psychopy/experiment/components/microphone/classic/microphone.png +0 -0
  1614. psychopy/experiment/components/microphone/classic/microphone@2x.png +0 -0
  1615. psychopy/experiment/components/microphone/dark/microphone.png +0 -0
  1616. psychopy/experiment/components/microphone/dark/microphone@2x.png +0 -0
  1617. psychopy/experiment/components/microphone/light/microphone.png +0 -0
  1618. psychopy/experiment/components/microphone/light/microphone@2x.png +0 -0
  1619. psychopy/experiment/components/mouse/__init__.py +773 -0
  1620. psychopy/experiment/components/mouse/classic/mouse.png +0 -0
  1621. psychopy/experiment/components/mouse/classic/mouse@2x.png +0 -0
  1622. psychopy/experiment/components/mouse/dark/mouse.png +0 -0
  1623. psychopy/experiment/components/mouse/dark/mouse@2x.png +0 -0
  1624. psychopy/experiment/components/mouse/light/mouse.png +0 -0
  1625. psychopy/experiment/components/mouse/light/mouse@2x.png +0 -0
  1626. psychopy/experiment/components/movie/__init__.py +348 -0
  1627. psychopy/experiment/components/movie/classic/movie.png +0 -0
  1628. psychopy/experiment/components/movie/classic/movie@2x.png +0 -0
  1629. psychopy/experiment/components/movie/dark/movie.png +0 -0
  1630. psychopy/experiment/components/movie/dark/movie@2x.png +0 -0
  1631. psychopy/experiment/components/movie/light/movie.png +0 -0
  1632. psychopy/experiment/components/movie/light/movie@2x.png +0 -0
  1633. psychopy/experiment/components/panorama/__init__.py +456 -0
  1634. psychopy/experiment/components/panorama/classic/panorama.png +0 -0
  1635. psychopy/experiment/components/panorama/classic/panorama@2x.png +0 -0
  1636. psychopy/experiment/components/panorama/dark/panorama.png +0 -0
  1637. psychopy/experiment/components/panorama/dark/panorama@2x.png +0 -0
  1638. psychopy/experiment/components/panorama/light/panorama.png +0 -0
  1639. psychopy/experiment/components/panorama/light/panorama@2x.png +0 -0
  1640. psychopy/experiment/components/parallelOut/__init__.py +178 -0
  1641. psychopy/experiment/components/parallelOut/classic/parallel.png +0 -0
  1642. psychopy/experiment/components/parallelOut/classic/parallel@2x.png +0 -0
  1643. psychopy/experiment/components/parallelOut/dark/parallel.png +0 -0
  1644. psychopy/experiment/components/parallelOut/dark/parallel@2x.png +0 -0
  1645. psychopy/experiment/components/parallelOut/light/parallel.png +0 -0
  1646. psychopy/experiment/components/parallelOut/light/parallel@2x.png +0 -0
  1647. psychopy/experiment/components/polygon/__init__.py +332 -0
  1648. psychopy/experiment/components/polygon/classic/polygon.png +0 -0
  1649. psychopy/experiment/components/polygon/classic/polygon@2x.png +0 -0
  1650. psychopy/experiment/components/polygon/dark/polygon.png +0 -0
  1651. psychopy/experiment/components/polygon/dark/polygon@2x.png +0 -0
  1652. psychopy/experiment/components/polygon/light/polygon.png +0 -0
  1653. psychopy/experiment/components/polygon/light/polygon@2x.png +0 -0
  1654. psychopy/experiment/components/progress/__init__.py +130 -0
  1655. psychopy/experiment/components/progress/classic/progress.png +0 -0
  1656. psychopy/experiment/components/progress/classic/progress@2x.png +0 -0
  1657. psychopy/experiment/components/progress/dark/progress.png +0 -0
  1658. psychopy/experiment/components/progress/dark/progress@2x.png +0 -0
  1659. psychopy/experiment/components/progress/light/progress.png +0 -0
  1660. psychopy/experiment/components/progress/light/progress@2x.png +0 -0
  1661. psychopy/experiment/components/resourceManager/__init__.py +176 -0
  1662. psychopy/experiment/components/resourceManager/classic/resource_manager.png +0 -0
  1663. psychopy/experiment/components/resourceManager/classic/resource_manager@2x.png +0 -0
  1664. psychopy/experiment/components/resourceManager/dark/resource_manager.png +0 -0
  1665. psychopy/experiment/components/resourceManager/dark/resource_manager@2x.png +0 -0
  1666. psychopy/experiment/components/resourceManager/light/resource_manager.png +0 -0
  1667. psychopy/experiment/components/resourceManager/light/resource_manager@2x.png +0 -0
  1668. psychopy/experiment/components/roi/__init__.py +316 -0
  1669. psychopy/experiment/components/roi/classic/eyetracker_roi.png +0 -0
  1670. psychopy/experiment/components/roi/classic/eyetracker_roi@2x.png +0 -0
  1671. psychopy/experiment/components/roi/dark/eyetracker_roi.png +0 -0
  1672. psychopy/experiment/components/roi/dark/eyetracker_roi@2X.png +0 -0
  1673. psychopy/experiment/components/roi/light/eyetracker_roi.png +0 -0
  1674. psychopy/experiment/components/roi/light/eyetracker_roi@2X.png +0 -0
  1675. psychopy/experiment/components/routineSettings/__init__.py +387 -0
  1676. psychopy/experiment/components/routineSettings/classic/routineSettings.png +0 -0
  1677. psychopy/experiment/components/routineSettings/classic/routineSettings@2x.png +0 -0
  1678. psychopy/experiment/components/routineSettings/dark/routineSettings.png +0 -0
  1679. psychopy/experiment/components/routineSettings/dark/routineSettings@2x.png +0 -0
  1680. psychopy/experiment/components/routineSettings/light/routineSettings.png +0 -0
  1681. psychopy/experiment/components/routineSettings/light/routineSettings@2x.png +0 -0
  1682. psychopy/experiment/components/serialOut/__init__.py +304 -0
  1683. psychopy/experiment/components/serialOut/classic/serial.png +0 -0
  1684. psychopy/experiment/components/serialOut/classic/serial@2x.png +0 -0
  1685. psychopy/experiment/components/serialOut/dark/serial.png +0 -0
  1686. psychopy/experiment/components/serialOut/dark/serial@2x.png +0 -0
  1687. psychopy/experiment/components/serialOut/light/serial.png +0 -0
  1688. psychopy/experiment/components/serialOut/light/serial@2x.png +0 -0
  1689. psychopy/experiment/components/settings/JS_htmlHeader.tmpl +23 -0
  1690. psychopy/experiment/components/settings/JS_setupExp.tmpl +28 -0
  1691. psychopy/experiment/components/settings/__init__.py +2254 -0
  1692. psychopy/experiment/components/settings/classic/settings.png +0 -0
  1693. psychopy/experiment/components/settings/classic/settings@2x.png +0 -0
  1694. psychopy/experiment/components/settings/dark/settings.png +0 -0
  1695. psychopy/experiment/components/settings/dark/settings@2x.png +0 -0
  1696. psychopy/experiment/components/settings/eyetracking.py +108 -0
  1697. psychopy/experiment/components/settings/light/settings.png +0 -0
  1698. psychopy/experiment/components/settings/light/settings@2x.png +0 -0
  1699. psychopy/experiment/components/slider/__init__.py +410 -0
  1700. psychopy/experiment/components/slider/classic/slider.png +0 -0
  1701. psychopy/experiment/components/slider/classic/slider@2x.png +0 -0
  1702. psychopy/experiment/components/slider/dark/slider.png +0 -0
  1703. psychopy/experiment/components/slider/dark/slider@2x.png +0 -0
  1704. psychopy/experiment/components/slider/light/slider.png +0 -0
  1705. psychopy/experiment/components/slider/light/slider@2x.png +0 -0
  1706. psychopy/experiment/components/sound/__init__.py +441 -0
  1707. psychopy/experiment/components/sound/classic/sound.png +0 -0
  1708. psychopy/experiment/components/sound/classic/sound@2x.png +0 -0
  1709. psychopy/experiment/components/sound/dark/sound.png +0 -0
  1710. psychopy/experiment/components/sound/dark/sound@2x.png +0 -0
  1711. psychopy/experiment/components/sound/light/sound.png +0 -0
  1712. psychopy/experiment/components/sound/light/sound@2x.png +0 -0
  1713. psychopy/experiment/components/soundsensor/__init__.py +324 -0
  1714. psychopy/experiment/components/soundsensor/classic/soundsensor.png +0 -0
  1715. psychopy/experiment/components/soundsensor/classic/soundsensor@2x.png +0 -0
  1716. psychopy/experiment/components/soundsensor/dark/soundsensor.png +0 -0
  1717. psychopy/experiment/components/soundsensor/dark/soundsensor@2x.png +0 -0
  1718. psychopy/experiment/components/soundsensor/light/soundsensor.png +0 -0
  1719. psychopy/experiment/components/soundsensor/light/soundsensor@2x.png +0 -0
  1720. psychopy/experiment/components/static/__init__.py +293 -0
  1721. psychopy/experiment/components/static/classic/static.png +0 -0
  1722. psychopy/experiment/components/static/classic/static@2x.png +0 -0
  1723. psychopy/experiment/components/static/dark/static.png +0 -0
  1724. psychopy/experiment/components/static/dark/static@2x.png +0 -0
  1725. psychopy/experiment/components/static/light/static.png +0 -0
  1726. psychopy/experiment/components/static/light/static@2x.png +0 -0
  1727. psychopy/experiment/components/text/__init__.py +190 -0
  1728. psychopy/experiment/components/text/classic/text.png +0 -0
  1729. psychopy/experiment/components/text/classic/text@2x.png +0 -0
  1730. psychopy/experiment/components/text/dark/text.png +0 -0
  1731. psychopy/experiment/components/text/dark/text@2x.png +0 -0
  1732. psychopy/experiment/components/text/light/text.png +0 -0
  1733. psychopy/experiment/components/text/light/text@2x.png +0 -0
  1734. psychopy/experiment/components/textbox/__init__.py +336 -0
  1735. psychopy/experiment/components/textbox/classic/textbox.png +0 -0
  1736. psychopy/experiment/components/textbox/classic/textbox@2x.png +0 -0
  1737. psychopy/experiment/components/textbox/dark/textbox.png +0 -0
  1738. psychopy/experiment/components/textbox/dark/textbox@2x.png +0 -0
  1739. psychopy/experiment/components/textbox/light/textbox.png +0 -0
  1740. psychopy/experiment/components/textbox/light/textbox@2x.png +0 -0
  1741. psychopy/experiment/components/unknown/__init__.py +87 -0
  1742. psychopy/experiment/components/unknown/classic/unknown.png +0 -0
  1743. psychopy/experiment/components/unknown/classic/unknown@2x.png +0 -0
  1744. psychopy/experiment/components/unknown/dark/unknown.png +0 -0
  1745. psychopy/experiment/components/unknown/dark/unknown@2x.png +0 -0
  1746. psychopy/experiment/components/unknown/light/unknown.png +0 -0
  1747. psychopy/experiment/components/unknown/light/unknown@2x.png +0 -0
  1748. psychopy/experiment/components/unknownPlugin/__init__.py +86 -0
  1749. psychopy/experiment/components/unknownPlugin/classic/unknownPlugin.png +0 -0
  1750. psychopy/experiment/components/unknownPlugin/classic/unknownPlugin@2x.png +0 -0
  1751. psychopy/experiment/components/unknownPlugin/dark/unknownPlugin.png +0 -0
  1752. psychopy/experiment/components/unknownPlugin/dark/unknownPlugin@2x.png +0 -0
  1753. psychopy/experiment/components/unknownPlugin/light/unknownPlugin.png +0 -0
  1754. psychopy/experiment/components/unknownPlugin/light/unknownPlugin@2x.png +0 -0
  1755. psychopy/experiment/components/utils.py +0 -0
  1756. psychopy/experiment/components/variable/__init__.py +184 -0
  1757. psychopy/experiment/components/variable/classic/variable.png +0 -0
  1758. psychopy/experiment/components/variable/classic/variable@2x.png +0 -0
  1759. psychopy/experiment/components/variable/dark/variable.png +0 -0
  1760. psychopy/experiment/components/variable/dark/variable@2x.png +0 -0
  1761. psychopy/experiment/components/variable/light/variable.png +0 -0
  1762. psychopy/experiment/components/variable/light/variable@2x.png +0 -0
  1763. psychopy/experiment/devices.py +303 -0
  1764. psychopy/experiment/experiment.xsd +223 -0
  1765. psychopy/experiment/exports.py +390 -0
  1766. psychopy/experiment/flow.py +547 -0
  1767. psychopy/experiment/localization.py +11 -0
  1768. psychopy/experiment/loopTemplate.xltx +0 -0
  1769. psychopy/experiment/loops.py +1051 -0
  1770. psychopy/experiment/monitor.py +74 -0
  1771. psychopy/experiment/params.py +541 -0
  1772. psychopy/experiment/plugins.py +42 -0
  1773. psychopy/experiment/py2js.py +183 -0
  1774. psychopy/experiment/py2js_transpiler.py +613 -0
  1775. psychopy/experiment/questPlusTemplate.xltx +0 -0
  1776. psychopy/experiment/questTemplate.xltx +0 -0
  1777. psychopy/experiment/routines/__init__.py +108 -0
  1778. psychopy/experiment/routines/_base.py +1172 -0
  1779. psychopy/experiment/routines/audioValidator/__init__.py +229 -0
  1780. psychopy/experiment/routines/audioValidator/classic/audio_validator.png +0 -0
  1781. psychopy/experiment/routines/audioValidator/classic/audio_validator@2x.png +0 -0
  1782. psychopy/experiment/routines/audioValidator/dark/audio_validator.png +0 -0
  1783. psychopy/experiment/routines/audioValidator/dark/audio_validator@2x.png +0 -0
  1784. psychopy/experiment/routines/audioValidator/light/audio_validator.png +0 -0
  1785. psychopy/experiment/routines/audioValidator/light/audio_validator@2x.png +0 -0
  1786. psychopy/experiment/routines/counterbalance/__init__.py +320 -0
  1787. psychopy/experiment/routines/counterbalance/classic/counterbalance.png +0 -0
  1788. psychopy/experiment/routines/counterbalance/classic/counterbalance@2x.png +0 -0
  1789. psychopy/experiment/routines/counterbalance/counterbalanceItems.xltx +0 -0
  1790. psychopy/experiment/routines/counterbalance/dark/counterbalance.png +0 -0
  1791. psychopy/experiment/routines/counterbalance/dark/counterbalance@2x.png +0 -0
  1792. psychopy/experiment/routines/counterbalance/light/counterbalance.png +0 -0
  1793. psychopy/experiment/routines/counterbalance/light/counterbalance@2x.png +0 -0
  1794. psychopy/experiment/routines/eyetracker_calibrate/__init__.py +334 -0
  1795. psychopy/experiment/routines/eyetracker_calibrate/classic/eyetracker_calib.png +0 -0
  1796. psychopy/experiment/routines/eyetracker_calibrate/dark/eyetracker_calib.png +0 -0
  1797. psychopy/experiment/routines/eyetracker_calibrate/dark/eyetracker_calib@2x.png +0 -0
  1798. psychopy/experiment/routines/eyetracker_calibrate/light/eyetracker_calib.png +0 -0
  1799. psychopy/experiment/routines/eyetracker_calibrate/light/eyetracker_calib@2x.png +0 -0
  1800. psychopy/experiment/routines/eyetracker_validate/__init__.py +354 -0
  1801. psychopy/experiment/routines/eyetracker_validate/classic/eyetracker_valid.png +0 -0
  1802. psychopy/experiment/routines/eyetracker_validate/dark/eyetracker_valid.png +0 -0
  1803. psychopy/experiment/routines/eyetracker_validate/dark/eyetracker_valid@2x.png +0 -0
  1804. psychopy/experiment/routines/eyetracker_validate/light/eyetracker_valid.png +0 -0
  1805. psychopy/experiment/routines/eyetracker_validate/light/eyetracker_valid@2x.png +0 -0
  1806. psychopy/experiment/routines/pavlovia_survey/__init__.py +236 -0
  1807. psychopy/experiment/routines/pavlovia_survey/classic/survey.png +0 -0
  1808. psychopy/experiment/routines/pavlovia_survey/classic/survey@2x.png +0 -0
  1809. psychopy/experiment/routines/pavlovia_survey/dark/survey.png +0 -0
  1810. psychopy/experiment/routines/pavlovia_survey/dark/survey@2x.png +0 -0
  1811. psychopy/experiment/routines/pavlovia_survey/light/survey.png +0 -0
  1812. psychopy/experiment/routines/pavlovia_survey/light/survey@2x.png +0 -0
  1813. psychopy/experiment/routines/unknown/__init__.py +30 -0
  1814. psychopy/experiment/routines/unknown/classic/eyetracker_record.png +0 -0
  1815. psychopy/experiment/routines/unknown/classic/unknown.png +0 -0
  1816. psychopy/experiment/routines/unknown/dark/eyetracker_record.png +0 -0
  1817. psychopy/experiment/routines/unknown/dark/eyetracker_record@2x.png +0 -0
  1818. psychopy/experiment/routines/unknown/dark/unknown.png +0 -0
  1819. psychopy/experiment/routines/unknown/dark/unknown@2x.png +0 -0
  1820. psychopy/experiment/routines/unknown/light/eyetracker_record.png +0 -0
  1821. psychopy/experiment/routines/unknown/light/eyetracker_record@2x.png +0 -0
  1822. psychopy/experiment/routines/unknown/light/unknown.png +0 -0
  1823. psychopy/experiment/routines/unknown/light/unknown@2x.png +0 -0
  1824. psychopy/experiment/routines/utils.py +0 -0
  1825. psychopy/experiment/routines/visualValidator/__init__.py +395 -0
  1826. psychopy/experiment/routines/visualValidator/classic/visual_validator.png +0 -0
  1827. psychopy/experiment/routines/visualValidator/classic/visual_validator@2x.png +0 -0
  1828. psychopy/experiment/routines/visualValidator/dark/visual_validator.png +0 -0
  1829. psychopy/experiment/routines/visualValidator/dark/visual_validator@2x.png +0 -0
  1830. psychopy/experiment/routines/visualValidator/light/visual_validator.png +0 -0
  1831. psychopy/experiment/routines/visualValidator/light/visual_validator@2x.png +0 -0
  1832. psychopy/experiment/staircaseTemplate.xltx +0 -0
  1833. psychopy/experiment/utils.py +44 -0
  1834. psychopy/filters.py +11 -0
  1835. psychopy/gamma.py +9 -0
  1836. psychopy/gui/__init__.py +47 -0
  1837. psychopy/gui/qtgui.py +882 -0
  1838. psychopy/gui/util.py +74 -0
  1839. psychopy/gui/wxgui.py +420 -0
  1840. psychopy/hardware/__init__.py +178 -0
  1841. psychopy/hardware/base.py +466 -0
  1842. psychopy/hardware/bbtk/__init__.py +24 -0
  1843. psychopy/hardware/brainproducts.py +25 -0
  1844. psychopy/hardware/button.py +238 -0
  1845. psychopy/hardware/buttonbox/__init__.py +122 -0
  1846. psychopy/hardware/camera/__init__.py +3657 -0
  1847. psychopy/hardware/cedrus.py +24 -0
  1848. psychopy/hardware/crs/__init__.py +46 -0
  1849. psychopy/hardware/crs/bits.py +37 -0
  1850. psychopy/hardware/crs/colorcal.py +18 -0
  1851. psychopy/hardware/crs/optical.py +33 -0
  1852. psychopy/hardware/crs/shaders.py +34 -0
  1853. psychopy/hardware/emotiv.py +33 -0
  1854. psychopy/hardware/emulator.py +46 -0
  1855. psychopy/hardware/exceptions.py +86 -0
  1856. psychopy/hardware/eyetracker.py +132 -0
  1857. psychopy/hardware/forp.py +37 -0
  1858. psychopy/hardware/gammasci.py +26 -0
  1859. psychopy/hardware/iolab.py +24 -0
  1860. psychopy/hardware/joystick/__init__.py +1196 -0
  1861. psychopy/hardware/joystick/_base.py +251 -0
  1862. psychopy/hardware/joystick/backend_glfw.py +306 -0
  1863. psychopy/hardware/joystick/backend_pyglet.py +309 -0
  1864. psychopy/hardware/joystick/mappings.py +287 -0
  1865. psychopy/hardware/keyboard.py +975 -0
  1866. psychopy/hardware/knownDevices.json +52 -0
  1867. psychopy/hardware/labhackers.py +27 -0
  1868. psychopy/hardware/labjacks.py +26 -0
  1869. psychopy/hardware/lightsensor.py +789 -0
  1870. psychopy/hardware/listener.py +330 -0
  1871. psychopy/hardware/manager.py +992 -0
  1872. psychopy/hardware/microphone.py +1630 -0
  1873. psychopy/hardware/minolta.py +33 -0
  1874. psychopy/hardware/monitor.py +144 -0
  1875. psychopy/hardware/mouse/__init__.py +885 -0
  1876. psychopy/hardware/photometer/__init__.py +207 -0
  1877. psychopy/hardware/pr.py +33 -0
  1878. psychopy/hardware/qmix.py +32 -0
  1879. psychopy/hardware/serialdevice.py +387 -0
  1880. psychopy/hardware/soundsensor.py +476 -0
  1881. psychopy/hardware/spatial/__init__.py +231 -0
  1882. psychopy/hardware/speaker.py +351 -0
  1883. psychopy/hardware/triggerbox/__init__.py +56 -0
  1884. psychopy/hardware/triggerbox/base.py +170 -0
  1885. psychopy/hardware/triggerbox/parallel.py +362 -0
  1886. psychopy/info.py +719 -0
  1887. psychopy/iohub/__init__.py +50 -0
  1888. psychopy/iohub/client/__init__.py +1481 -0
  1889. psychopy/iohub/client/connect.py +260 -0
  1890. psychopy/iohub/client/eyetracker/__init__.py +4 -0
  1891. psychopy/iohub/client/eyetracker/validation/__init__.py +8 -0
  1892. psychopy/iohub/client/eyetracker/validation/posgrid.py +274 -0
  1893. psychopy/iohub/client/eyetracker/validation/procedure.py +1292 -0
  1894. psychopy/iohub/client/eyetracker/validation/trigger.py +240 -0
  1895. psychopy/iohub/client/keyboard.py +513 -0
  1896. psychopy/iohub/client/wintab.py +378 -0
  1897. psychopy/iohub/constants.py +1176 -0
  1898. psychopy/iohub/datastore/__init__.py +439 -0
  1899. psychopy/iohub/datastore/default_datastore.yaml +8 -0
  1900. psychopy/iohub/datastore/util.py +868 -0
  1901. psychopy/iohub/default_config.yaml +17 -0
  1902. psychopy/iohub/devices/__init__.py +1047 -0
  1903. psychopy/iohub/devices/computer.py +607 -0
  1904. psychopy/iohub/devices/default_device.yaml +15 -0
  1905. psychopy/iohub/devices/deviceConfigValidation.py +519 -0
  1906. psychopy/iohub/devices/display/__init__.py +755 -0
  1907. psychopy/iohub/devices/display/default_display.yaml +118 -0
  1908. psychopy/iohub/devices/display/supported_config_settings.yaml +69 -0
  1909. psychopy/iohub/devices/eventfilters.py +3572 -0
  1910. psychopy/iohub/devices/experiment/__init__.py +316 -0
  1911. psychopy/iohub/devices/experiment/default_experiment.yaml +74 -0
  1912. psychopy/iohub/devices/experiment/supported_config_settings.yaml +26 -0
  1913. psychopy/iohub/devices/eyetracker/__init__.py +474 -0
  1914. psychopy/iohub/devices/eyetracker/calibration/__init__.py +1 -0
  1915. psychopy/iohub/devices/eyetracker/calibration/procedure.py +391 -0
  1916. psychopy/iohub/devices/eyetracker/default_eyetracker.yaml +18 -0
  1917. psychopy/iohub/devices/eyetracker/eye_events.py +1751 -0
  1918. psychopy/iohub/devices/eyetracker/filters/__init__.py +4 -0
  1919. psychopy/iohub/devices/eyetracker/filters/parser.py +913 -0
  1920. psychopy/iohub/devices/eyetracker/hw/__init__.py +4 -0
  1921. psychopy/iohub/devices/eyetracker/hw/gazepoint/__init__.py +29 -0
  1922. psychopy/iohub/devices/eyetracker/hw/gazepoint/gp3/__init__.py +29 -0
  1923. psychopy/iohub/devices/eyetracker/hw/gazepoint/gp3/calibration.py +18 -0
  1924. psychopy/iohub/devices/eyetracker/hw/gazepoint/gp3/eyetracker.py +31 -0
  1925. psychopy/iohub/devices/eyetracker/hw/mouse/__init__.py +8 -0
  1926. psychopy/iohub/devices/eyetracker/hw/mouse/calibration.py +10 -0
  1927. psychopy/iohub/devices/eyetracker/hw/mouse/default_eyetracker.yaml +102 -0
  1928. psychopy/iohub/devices/eyetracker/hw/mouse/eyetracker.py +443 -0
  1929. psychopy/iohub/devices/eyetracker/hw/mouse/supported_config_settings.yaml +110 -0
  1930. psychopy/iohub/devices/eyetracker/hw/pupil_labs/__init__.py +4 -0
  1931. psychopy/iohub/devices/eyetracker/hw/pupil_labs/neon/__init__.py +27 -0
  1932. psychopy/iohub/devices/eyetracker/hw/pupil_labs/neon/eyetracker.py +18 -0
  1933. psychopy/iohub/devices/eyetracker/hw/pupil_labs/pupil_core/__init__.py +29 -0
  1934. psychopy/iohub/devices/eyetracker/hw/pupil_labs/pupil_core/bisector.py +20 -0
  1935. psychopy/iohub/devices/eyetracker/hw/pupil_labs/pupil_core/constants.py +19 -0
  1936. psychopy/iohub/devices/eyetracker/hw/pupil_labs/pupil_core/data_parse.py +22 -0
  1937. psychopy/iohub/devices/eyetracker/hw/pupil_labs/pupil_core/eyetracker.py +18 -0
  1938. psychopy/iohub/devices/eyetracker/hw/pupil_labs/pupil_core/pupil_remote.py +18 -0
  1939. psychopy/iohub/devices/eyetracker/hw/sr_research/__init__.py +4 -0
  1940. psychopy/iohub/devices/eyetracker/hw/sr_research/eyelink/__init__.py +28 -0
  1941. psychopy/iohub/devices/eyetracker/hw/sr_research/eyelink/calibration.py +22 -0
  1942. psychopy/iohub/devices/eyetracker/hw/sr_research/eyelink/eyetracker.py +38 -0
  1943. psychopy/iohub/devices/eyetracker/hw/tobii/__init__.py +29 -0
  1944. psychopy/iohub/devices/eyetracker/hw/tobii/calibration.py +19 -0
  1945. psychopy/iohub/devices/eyetracker/hw/tobii/eyetracker.py +17 -0
  1946. psychopy/iohub/devices/eyetracker/hw/tobii/tobiiwrapper.py +19 -0
  1947. psychopy/iohub/devices/eyetracker/supported_config_settings.yaml +44 -0
  1948. psychopy/iohub/devices/keyboard/__init__.py +309 -0
  1949. psychopy/iohub/devices/keyboard/darwin.py +431 -0
  1950. psychopy/iohub/devices/keyboard/darwinkey.py +94 -0
  1951. psychopy/iohub/devices/keyboard/default_keyboard.yaml +94 -0
  1952. psychopy/iohub/devices/keyboard/linux2.py +102 -0
  1953. psychopy/iohub/devices/keyboard/supported_config_settings.yaml +39 -0
  1954. psychopy/iohub/devices/keyboard/win32.py +356 -0
  1955. psychopy/iohub/devices/mouse/__init__.py +709 -0
  1956. psychopy/iohub/devices/mouse/darwin.py +414 -0
  1957. psychopy/iohub/devices/mouse/default_mouse.yaml +92 -0
  1958. psychopy/iohub/devices/mouse/linux2.py +172 -0
  1959. psychopy/iohub/devices/mouse/supported_config_settings.yaml +39 -0
  1960. psychopy/iohub/devices/mouse/win32.py +284 -0
  1961. psychopy/iohub/devices/pyXHook.py +619 -0
  1962. psychopy/iohub/devices/serial/__init__.py +779 -0
  1963. psychopy/iohub/devices/serial/default_pstbox.yaml +108 -0
  1964. psychopy/iohub/devices/serial/default_serial.yaml +108 -0
  1965. psychopy/iohub/devices/serial/supported_config_settings.yaml +85 -0
  1966. psychopy/iohub/devices/serial/supported_config_settings_pstbox.yaml +85 -0
  1967. psychopy/iohub/devices/supported_config_settings.yaml +36 -0
  1968. psychopy/iohub/devices/wintab/__init__.py +580 -0
  1969. psychopy/iohub/devices/wintab/default_wintab.yaml +89 -0
  1970. psychopy/iohub/devices/wintab/supported_config_settings.yaml +42 -0
  1971. psychopy/iohub/devices/wintab/win32.py +722 -0
  1972. psychopy/iohub/devices/xlib.py +6795 -0
  1973. psychopy/iohub/errors.py +61 -0
  1974. psychopy/iohub/lazy_import.py +582 -0
  1975. psychopy/iohub/net.py +349 -0
  1976. psychopy/iohub/server.py +1075 -0
  1977. psychopy/iohub/start_iohub_process.py +121 -0
  1978. psychopy/iohub/util/__init__.py +832 -0
  1979. psychopy/iohub/util/visualangle.py +126 -0
  1980. psychopy/layout.py +916 -0
  1981. psychopy/liaison.py +471 -0
  1982. psychopy/locale_setup.py +41 -0
  1983. psychopy/localization/__init__.py +22 -0
  1984. psychopy/localization/_localization.py +155 -0
  1985. psychopy/localization/generateTranslationTemplate.py +257 -0
  1986. psychopy/localization/mappings.txt +170 -0
  1987. psychopy/localization/messages.pot +9950 -0
  1988. psychopy/localization/readme.txt +68 -0
  1989. psychopy/logging.py +415 -0
  1990. psychopy/microphone.py +28 -0
  1991. psychopy/misc.py +40 -0
  1992. psychopy/monitors/MonitorCenter.py +1354 -0
  1993. psychopy/monitors/__init__.py +30 -0
  1994. psychopy/monitors/calibData.py +78 -0
  1995. psychopy/monitors/calibTools.py +1301 -0
  1996. psychopy/monitors/getLumSeries.py +50 -0
  1997. psychopy/monitors/psychopy-icon.svg +395 -0
  1998. psychopy/monitors/psychopy.ico +0 -0
  1999. psychopy/parallel/__init__.py +206 -0
  2000. psychopy/parallel/_dlportio.py +150 -0
  2001. psychopy/parallel/_inpout.py +120 -0
  2002. psychopy/parallel/_linux.py +105 -0
  2003. psychopy/piloting.py +61 -0
  2004. psychopy/platform_specific/__init__.py +46 -0
  2005. psychopy/platform_specific/darwin.py +326 -0
  2006. psychopy/platform_specific/linux.py +77 -0
  2007. psychopy/platform_specific/win32.py +124 -0
  2008. psychopy/plugins/__init__.py +1397 -0
  2009. psychopy/plugins/util.py +104 -0
  2010. psychopy/preferences/Darwin.spec +294 -0
  2011. psychopy/preferences/FreeBSD.spec +294 -0
  2012. psychopy/preferences/Linux.spec +294 -0
  2013. psychopy/preferences/Windows.spec +294 -0
  2014. psychopy/preferences/__init__.py +20 -0
  2015. psychopy/preferences/baseNoArch.spec +290 -0
  2016. psychopy/preferences/devices.py +80 -0
  2017. psychopy/preferences/generateHints.py +93 -0
  2018. psychopy/preferences/generateSpec.py +80 -0
  2019. psychopy/preferences/hints.py +367 -0
  2020. psychopy/preferences/preferences.py +448 -0
  2021. psychopy/projects/__init__.py +11 -0
  2022. psychopy/projects/gitignore.py +45 -0
  2023. psychopy/projects/pavlovia.py +1674 -0
  2024. psychopy/projects/sshkeys.py +107 -0
  2025. psychopy/psychojs.zip +0 -0
  2026. psychopy/pylintrc +69 -0
  2027. psychopy/scripts/__init__.py +0 -0
  2028. psychopy/scripts/psychopy-pkgutil.py +969 -0
  2029. psychopy/scripts/psyexpCompile.py +229 -0
  2030. psychopy/session.py +1651 -0
  2031. psychopy/sound/__init__.py +50 -0
  2032. psychopy/sound/_base.py +399 -0
  2033. psychopy/sound/audioclip.py +1325 -0
  2034. psychopy/sound/audiodevice.py +857 -0
  2035. psychopy/sound/backend_ptb.py +406 -0
  2036. psychopy/sound/backend_pygame.py +323 -0
  2037. psychopy/sound/backend_pyo.py +64 -0
  2038. psychopy/sound/backend_pysound.py +324 -0
  2039. psychopy/sound/backend_sounddevice.py +44 -0
  2040. psychopy/sound/backends/__init__.py +0 -0
  2041. psychopy/sound/exceptions.py +115 -0
  2042. psychopy/sound/microphone.py +357 -0
  2043. psychopy/sound/sound.py +58 -0
  2044. psychopy/sound/transcribe.py +1321 -0
  2045. psychopy/tests/README.md +344 -0
  2046. psychopy/tests/__init__.py +47 -0
  2047. psychopy/tests/data/Electronic_Chime-KevanGC-495939803.wav +0 -0
  2048. psychopy/tests/data/TestCircle_w128h128_bottom_left.png +0 -0
  2049. psychopy/tests/data/TestCircle_w128h128_bottom_right.png +0 -0
  2050. psychopy/tests/data/TestCircle_w128h128_center_center.png +0 -0
  2051. psychopy/tests/data/TestCircle_w128h128_top_left.png +0 -0
  2052. psychopy/tests/data/TestCircle_w128h128_top_right.png +0 -0
  2053. psychopy/tests/data/TestCircle_w128h64_bottom_left.png +0 -0
  2054. psychopy/tests/data/TestCircle_w128h64_bottom_right.png +0 -0
  2055. psychopy/tests/data/TestCircle_w128h64_center_center.png +0 -0
  2056. psychopy/tests/data/TestCircle_w128h64_top_left.png +0 -0
  2057. psychopy/tests/data/TestCircle_w128h64_top_right.png +0 -0
  2058. psychopy/tests/data/TestCircle_w64h128_bottom_left.png +0 -0
  2059. psychopy/tests/data/TestCircle_w64h128_bottom_right.png +0 -0
  2060. psychopy/tests/data/TestCircle_w64h128_center_center.png +0 -0
  2061. psychopy/tests/data/TestCircle_w64h128_top_left.png +0 -0
  2062. psychopy/tests/data/TestCircle_w64h128_top_right.png +0 -0
  2063. psychopy/tests/data/TestCircle_w64h64_bottom_left.png +0 -0
  2064. psychopy/tests/data/TestCircle_w64h64_bottom_right.png +0 -0
  2065. psychopy/tests/data/TestCircle_w64h64_center_center.png +0 -0
  2066. psychopy/tests/data/TestCircle_w64h64_top_left.png +0 -0
  2067. psychopy/tests/data/TestCircle_w64h64_top_right.png +0 -0
  2068. psychopy/tests/data/TestForm_scrolling_nq10_s0.5.png +0 -0
  2069. psychopy/tests/data/TestForm_scrolling_nq10_s0.png +0 -0
  2070. psychopy/tests/data/TestForm_scrolling_nq10_s1.png +0 -0
  2071. psychopy/tests/data/TestForm_scrolling_nq1_s0.5.png +0 -0
  2072. psychopy/tests/data/TestForm_scrolling_nq1_s0.png +0 -0
  2073. psychopy/tests/data/TestForm_scrolling_nq1_s1.png +0 -0
  2074. psychopy/tests/data/TestForm_scrolling_nq3_s0.5.png +0 -0
  2075. psychopy/tests/data/TestForm_scrolling_nq3_s0.png +0 -0
  2076. psychopy/tests/data/TestForm_scrolling_nq3_s1.png +0 -0
  2077. psychopy/tests/data/TestImage_w128h128_bottom_left.png +0 -0
  2078. psychopy/tests/data/TestImage_w128h128_bottom_right.png +0 -0
  2079. psychopy/tests/data/TestImage_w128h128_center_center.png +0 -0
  2080. psychopy/tests/data/TestImage_w128h128_top_left.png +0 -0
  2081. psychopy/tests/data/TestImage_w128h128_top_right.png +0 -0
  2082. psychopy/tests/data/TestImage_w128h64_bottom_left.png +0 -0
  2083. psychopy/tests/data/TestImage_w128h64_bottom_right.png +0 -0
  2084. psychopy/tests/data/TestImage_w128h64_center_center.png +0 -0
  2085. psychopy/tests/data/TestImage_w128h64_top_left.png +0 -0
  2086. psychopy/tests/data/TestImage_w128h64_top_right.png +0 -0
  2087. psychopy/tests/data/TestImage_w64h128_bottom_left.png +0 -0
  2088. psychopy/tests/data/TestImage_w64h128_bottom_right.png +0 -0
  2089. psychopy/tests/data/TestImage_w64h128_center_center.png +0 -0
  2090. psychopy/tests/data/TestImage_w64h128_top_left.png +0 -0
  2091. psychopy/tests/data/TestImage_w64h128_top_right.png +0 -0
  2092. psychopy/tests/data/TestImage_w64h64_bottom_left.png +0 -0
  2093. psychopy/tests/data/TestImage_w64h64_bottom_right.png +0 -0
  2094. psychopy/tests/data/TestImage_w64h64_center_center.png +0 -0
  2095. psychopy/tests/data/TestImage_w64h64_top_left.png +0 -0
  2096. psychopy/tests/data/TestImage_w64h64_top_right.png +0 -0
  2097. psychopy/tests/data/TestProgress_testValue_horizontal_center center_0.3.png +0 -0
  2098. psychopy/tests/data/TestProgress_testValue_horizontal_center center_0.6.png +0 -0
  2099. psychopy/tests/data/TestProgress_testValue_horizontal_left center_0.3.png +0 -0
  2100. psychopy/tests/data/TestProgress_testValue_horizontal_left center_0.6.png +0 -0
  2101. psychopy/tests/data/TestProgress_testValue_horizontal_right center_0.3.png +0 -0
  2102. psychopy/tests/data/TestProgress_testValue_horizontal_right center_0.6.png +0 -0
  2103. psychopy/tests/data/TestProgress_testValue_minmax_0.png +0 -0
  2104. psychopy/tests/data/TestProgress_testValue_minmax_1.png +0 -0
  2105. psychopy/tests/data/TestProgress_testValue_vertical_bottom center_0.3.png +0 -0
  2106. psychopy/tests/data/TestProgress_testValue_vertical_bottom center_0.6.png +0 -0
  2107. psychopy/tests/data/TestProgress_testValue_vertical_center center_0.3.png +0 -0
  2108. psychopy/tests/data/TestProgress_testValue_vertical_center center_0.6.png +0 -0
  2109. psychopy/tests/data/TestProgress_testValue_vertical_top center_0.3.png +0 -0
  2110. psychopy/tests/data/TestProgress_testValue_vertical_top center_0.6.png +0 -0
  2111. psychopy/tests/data/TestProgress_w128h128_bottom_left.png +0 -0
  2112. psychopy/tests/data/TestProgress_w128h128_bottom_right.png +0 -0
  2113. psychopy/tests/data/TestProgress_w128h128_center_center.png +0 -0
  2114. psychopy/tests/data/TestProgress_w128h128_top_left.png +0 -0
  2115. psychopy/tests/data/TestProgress_w128h128_top_right.png +0 -0
  2116. psychopy/tests/data/TestProgress_w128h64_bottom_left.png +0 -0
  2117. psychopy/tests/data/TestProgress_w128h64_bottom_right.png +0 -0
  2118. psychopy/tests/data/TestProgress_w128h64_center_center.png +0 -0
  2119. psychopy/tests/data/TestProgress_w128h64_top_left.png +0 -0
  2120. psychopy/tests/data/TestProgress_w128h64_top_right.png +0 -0
  2121. psychopy/tests/data/TestProgress_w64h128_bottom_left.png +0 -0
  2122. psychopy/tests/data/TestProgress_w64h128_bottom_right.png +0 -0
  2123. psychopy/tests/data/TestProgress_w64h128_center_center.png +0 -0
  2124. psychopy/tests/data/TestProgress_w64h128_top_left.png +0 -0
  2125. psychopy/tests/data/TestProgress_w64h128_top_right.png +0 -0
  2126. psychopy/tests/data/TestProgress_w64h64_bottom_left.png +0 -0
  2127. psychopy/tests/data/TestProgress_w64h64_bottom_right.png +0 -0
  2128. psychopy/tests/data/TestProgress_w64h64_center_center.png +0 -0
  2129. psychopy/tests/data/TestProgress_w64h64_top_left.png +0 -0
  2130. psychopy/tests/data/TestProgress_w64h64_top_right.png +0 -0
  2131. psychopy/tests/data/TestROI_w128h128_bottom_left.png +0 -0
  2132. psychopy/tests/data/TestROI_w128h128_bottom_right.png +0 -0
  2133. psychopy/tests/data/TestROI_w128h128_center_center.png +0 -0
  2134. psychopy/tests/data/TestROI_w128h128_top_left.png +0 -0
  2135. psychopy/tests/data/TestROI_w128h128_top_right.png +0 -0
  2136. psychopy/tests/data/TestROI_w128h64_bottom_left.png +0 -0
  2137. psychopy/tests/data/TestROI_w128h64_bottom_right.png +0 -0
  2138. psychopy/tests/data/TestROI_w128h64_center_center.png +0 -0
  2139. psychopy/tests/data/TestROI_w128h64_top_left.png +0 -0
  2140. psychopy/tests/data/TestROI_w128h64_top_right.png +0 -0
  2141. psychopy/tests/data/TestROI_w64h128_bottom_left.png +0 -0
  2142. psychopy/tests/data/TestROI_w64h128_bottom_right.png +0 -0
  2143. psychopy/tests/data/TestROI_w64h128_center_center.png +0 -0
  2144. psychopy/tests/data/TestROI_w64h128_top_left.png +0 -0
  2145. psychopy/tests/data/TestROI_w64h128_top_right.png +0 -0
  2146. psychopy/tests/data/TestROI_w64h64_bottom_left.png +0 -0
  2147. psychopy/tests/data/TestROI_w64h64_bottom_right.png +0 -0
  2148. psychopy/tests/data/TestROI_w64h64_center_center.png +0 -0
  2149. psychopy/tests/data/TestROI_w64h64_top_left.png +0 -0
  2150. psychopy/tests/data/TestROI_w64h64_top_right.png +0 -0
  2151. psychopy/tests/data/TestSession_exp1.png +0 -0
  2152. psychopy/tests/data/TestSession_exp2.png +0 -0
  2153. psychopy/tests/data/TestShape_w128h128_bottom_left.png +0 -0
  2154. psychopy/tests/data/TestShape_w128h128_bottom_right.png +0 -0
  2155. psychopy/tests/data/TestShape_w128h128_center_center.png +0 -0
  2156. psychopy/tests/data/TestShape_w128h128_top_left.png +0 -0
  2157. psychopy/tests/data/TestShape_w128h128_top_right.png +0 -0
  2158. psychopy/tests/data/TestShape_w128h64_bottom_left.png +0 -0
  2159. psychopy/tests/data/TestShape_w128h64_bottom_right.png +0 -0
  2160. psychopy/tests/data/TestShape_w128h64_center_center.png +0 -0
  2161. psychopy/tests/data/TestShape_w128h64_top_left.png +0 -0
  2162. psychopy/tests/data/TestShape_w128h64_top_right.png +0 -0
  2163. psychopy/tests/data/TestShape_w64h128_bottom_left.png +0 -0
  2164. psychopy/tests/data/TestShape_w64h128_bottom_right.png +0 -0
  2165. psychopy/tests/data/TestShape_w64h128_center_center.png +0 -0
  2166. psychopy/tests/data/TestShape_w64h128_top_left.png +0 -0
  2167. psychopy/tests/data/TestShape_w64h128_top_right.png +0 -0
  2168. psychopy/tests/data/TestShape_w64h64_bottom_left.png +0 -0
  2169. psychopy/tests/data/TestShape_w64h64_bottom_right.png +0 -0
  2170. psychopy/tests/data/TestShape_w64h64_center_center.png +0 -0
  2171. psychopy/tests/data/TestShape_w64h64_top_left.png +0 -0
  2172. psychopy/tests/data/TestShape_w64h64_top_right.png +0 -0
  2173. psychopy/tests/data/TestTarget_w128h128_bottom_left.png +0 -0
  2174. psychopy/tests/data/TestTarget_w128h128_bottom_right.png +0 -0
  2175. psychopy/tests/data/TestTarget_w128h128_center_center.png +0 -0
  2176. psychopy/tests/data/TestTarget_w128h128_top_left.png +0 -0
  2177. psychopy/tests/data/TestTarget_w128h128_top_right.png +0 -0
  2178. psychopy/tests/data/TestTarget_w128h64_bottom_left.png +0 -0
  2179. psychopy/tests/data/TestTarget_w128h64_bottom_right.png +0 -0
  2180. psychopy/tests/data/TestTarget_w128h64_center_center.png +0 -0
  2181. psychopy/tests/data/TestTarget_w128h64_top_left.png +0 -0
  2182. psychopy/tests/data/TestTarget_w128h64_top_right.png +0 -0
  2183. psychopy/tests/data/TestTarget_w64h128_bottom_left.png +0 -0
  2184. psychopy/tests/data/TestTarget_w64h128_bottom_right.png +0 -0
  2185. psychopy/tests/data/TestTarget_w64h128_center_center.png +0 -0
  2186. psychopy/tests/data/TestTarget_w64h128_top_left.png +0 -0
  2187. psychopy/tests/data/TestTarget_w64h128_top_right.png +0 -0
  2188. psychopy/tests/data/TestTarget_w64h64_bottom_left.png +0 -0
  2189. psychopy/tests/data/TestTarget_w64h64_bottom_right.png +0 -0
  2190. psychopy/tests/data/TestTarget_w64h64_center_center.png +0 -0
  2191. psychopy/tests/data/TestTarget_w64h64_top_left.png +0 -0
  2192. psychopy/tests/data/TestTarget_w64h64_top_right.png +0 -0
  2193. psychopy/tests/data/TestTextbox_testLetterSpacing_0p6.png +0 -0
  2194. psychopy/tests/data/TestTextbox_testLetterSpacing_0p8.png +0 -0
  2195. psychopy/tests/data/TestTextbox_testLetterSpacing_1.png +0 -0
  2196. psychopy/tests/data/TestTextbox_testLetterSpacing_1p2.png +0 -0
  2197. psychopy/tests/data/TestTextbox_testLetterSpacing_1p4.png +0 -0
  2198. psychopy/tests/data/TestTextbox_testLetterSpacing_1p6.png +0 -0
  2199. psychopy/tests/data/TestTextbox_testLetterSpacing_1p8.png +0 -0
  2200. psychopy/tests/data/TestTextbox_testLetterSpacing_2p0.png +0 -0
  2201. psychopy/tests/data/TestTextbox_testLetterSpacing_None.png +0 -0
  2202. psychopy/tests/data/TestUnknownPluginComponent_load_resave.psyexp +135 -0
  2203. psychopy/tests/data/Test_textbox/test_ori_0_bottom right.png +0 -0
  2204. psychopy/tests/data/Test_textbox/test_ori_0_center.png +0 -0
  2205. psychopy/tests/data/Test_textbox/test_ori_0_top left.png +0 -0
  2206. psychopy/tests/data/Test_textbox/test_ori_120_bottom right.png +0 -0
  2207. psychopy/tests/data/Test_textbox/test_ori_120_center.png +0 -0
  2208. psychopy/tests/data/Test_textbox/test_ori_120_top left.png +0 -0
  2209. psychopy/tests/data/Test_textbox/test_ori_180_bottom right.png +0 -0
  2210. psychopy/tests/data/Test_textbox/test_ori_180_center.png +0 -0
  2211. psychopy/tests/data/Test_textbox/test_ori_180_top left.png +0 -0
  2212. psychopy/tests/data/Test_textbox/test_ori_240_bottom right.png +0 -0
  2213. psychopy/tests/data/Test_textbox/test_ori_240_center.png +0 -0
  2214. psychopy/tests/data/Test_textbox/test_ori_240_top left.png +0 -0
  2215. psychopy/tests/data/Test_textbox_testSpeechpoint_-3ovr8_0ovr8.png +0 -0
  2216. psychopy/tests/data/Test_textbox_testSpeechpoint_0ovr8_-3ovr8.png +0 -0
  2217. psychopy/tests/data/Test_textbox_testSpeechpoint_0ovr8_3ovr8.png +0 -0
  2218. psychopy/tests/data/Test_textbox_testSpeechpoint_3ovr8_0ovr8.png +0 -0
  2219. psychopy/tests/data/Test_textbox_w128h128_bottom_left.png +0 -0
  2220. psychopy/tests/data/Test_textbox_w128h128_bottom_right.png +0 -0
  2221. psychopy/tests/data/Test_textbox_w128h128_center_center.png +0 -0
  2222. psychopy/tests/data/Test_textbox_w128h128_top_left.png +0 -0
  2223. psychopy/tests/data/Test_textbox_w128h128_top_right.png +0 -0
  2224. psychopy/tests/data/Test_textbox_w128h64_bottom_left.png +0 -0
  2225. psychopy/tests/data/Test_textbox_w128h64_bottom_right.png +0 -0
  2226. psychopy/tests/data/Test_textbox_w128h64_center_center.png +0 -0
  2227. psychopy/tests/data/Test_textbox_w128h64_top_left.png +0 -0
  2228. psychopy/tests/data/Test_textbox_w128h64_top_right.png +0 -0
  2229. psychopy/tests/data/Test_textbox_w64h128_bottom_left.png +0 -0
  2230. psychopy/tests/data/Test_textbox_w64h128_bottom_right.png +0 -0
  2231. psychopy/tests/data/Test_textbox_w64h128_center_center.png +0 -0
  2232. psychopy/tests/data/Test_textbox_w64h128_top_left.png +0 -0
  2233. psychopy/tests/data/Test_textbox_w64h128_top_right.png +0 -0
  2234. psychopy/tests/data/Test_textbox_w64h64_bottom_left.png +0 -0
  2235. psychopy/tests/data/Test_textbox_w64h64_bottom_right.png +0 -0
  2236. psychopy/tests/data/Test_textbox_w64h64_center_center.png +0 -0
  2237. psychopy/tests/data/Test_textbox_w64h64_top_left.png +0 -0
  2238. psychopy/tests/data/Test_textbox_w64h64_top_right.png +0 -0
  2239. psychopy/tests/data/Test_uax14_textbox_w128h128_bottom_left.png +0 -0
  2240. psychopy/tests/data/Test_uax14_textbox_w128h128_bottom_right.png +0 -0
  2241. psychopy/tests/data/Test_uax14_textbox_w128h128_center_center.png +0 -0
  2242. psychopy/tests/data/Test_uax14_textbox_w128h128_top_left.png +0 -0
  2243. psychopy/tests/data/Test_uax14_textbox_w128h128_top_right.png +0 -0
  2244. psychopy/tests/data/Test_uax14_textbox_w128h64_bottom_left.png +0 -0
  2245. psychopy/tests/data/Test_uax14_textbox_w128h64_bottom_right.png +0 -0
  2246. psychopy/tests/data/Test_uax14_textbox_w128h64_center_center.png +0 -0
  2247. psychopy/tests/data/Test_uax14_textbox_w128h64_top_left.png +0 -0
  2248. psychopy/tests/data/Test_uax14_textbox_w128h64_top_right.png +0 -0
  2249. psychopy/tests/data/Test_uax14_textbox_w64h128_bottom_left.png +0 -0
  2250. psychopy/tests/data/Test_uax14_textbox_w64h128_bottom_right.png +0 -0
  2251. psychopy/tests/data/Test_uax14_textbox_w64h128_center_center.png +0 -0
  2252. psychopy/tests/data/Test_uax14_textbox_w64h128_top_left.png +0 -0
  2253. psychopy/tests/data/Test_uax14_textbox_w64h128_top_right.png +0 -0
  2254. psychopy/tests/data/Test_uax14_textbox_w64h64_bottom_left.png +0 -0
  2255. psychopy/tests/data/Test_uax14_textbox_w64h64_bottom_right.png +0 -0
  2256. psychopy/tests/data/Test_uax14_textbox_w64h64_center_center.png +0 -0
  2257. psychopy/tests/data/Test_uax14_textbox_w64h64_top_left.png +0 -0
  2258. psychopy/tests/data/Test_uax14_textbox_w64h64_top_right.png +0 -0
  2259. psychopy/tests/data/TextComponent_disabled.psyexp +63 -0
  2260. psychopy/tests/data/TextComponent_not_disabled.psyexp +63 -0
  2261. psychopy/tests/data/aperture1_deg.png +0 -0
  2262. psychopy/tests/data/aperture1_degFlat.png +0 -0
  2263. psychopy/tests/data/aperture1_degFlatPos.png +0 -0
  2264. psychopy/tests/data/aperture1_norm.png +0 -0
  2265. psychopy/tests/data/aperture1_normHexbackground.png +0 -0
  2266. psychopy/tests/data/aperture1_normNoShade.png +0 -0
  2267. psychopy/tests/data/aperture1_pix.png +0 -0
  2268. psychopy/tests/data/aperture1_stencil.png +0 -0
  2269. psychopy/tests/data/aperture2_deg.png +0 -0
  2270. psychopy/tests/data/aperture2_degFlat.png +0 -0
  2271. psychopy/tests/data/aperture2_degFlatPos.png +0 -0
  2272. psychopy/tests/data/aperture2_norm.png +0 -0
  2273. psychopy/tests/data/aperture2_normHexbackground.png +0 -0
  2274. psychopy/tests/data/aperture2_normNoShade.png +0 -0
  2275. psychopy/tests/data/aperture2_pix.png +0 -0
  2276. psychopy/tests/data/aperture2_stencil.png +0 -0
  2277. psychopy/tests/data/beatandrcos_cm.png +0 -0
  2278. psychopy/tests/data/beatandrcos_deg.png +0 -0
  2279. psychopy/tests/data/beatandrcos_degFlat.png +0 -0
  2280. psychopy/tests/data/beatandrcos_degFlatPos.png +0 -0
  2281. psychopy/tests/data/beatandrcos_height.png +0 -0
  2282. psychopy/tests/data/beatandrcos_norm.png +0 -0
  2283. psychopy/tests/data/beatandrcos_normAddBlend.png +0 -0
  2284. psychopy/tests/data/beatandrcos_normHexbackground.png +0 -0
  2285. psychopy/tests/data/beatandrcos_pix.png +0 -0
  2286. psychopy/tests/data/beatandrcos_stencil.png +0 -0
  2287. psychopy/tests/data/blend_add_cm.png +0 -0
  2288. psychopy/tests/data/blend_add_deg.png +0 -0
  2289. psychopy/tests/data/blend_add_degFlat.png +0 -0
  2290. psychopy/tests/data/blend_add_degFlatPos.png +0 -0
  2291. psychopy/tests/data/blend_add_height.png +0 -0
  2292. psychopy/tests/data/blend_add_norm.png +0 -0
  2293. psychopy/tests/data/blend_add_normAddBlend.png +0 -0
  2294. psychopy/tests/data/blend_add_normHexbackground.png +0 -0
  2295. psychopy/tests/data/blend_add_normNoShade.png +0 -0
  2296. psychopy/tests/data/blend_add_pix.png +0 -0
  2297. psychopy/tests/data/blend_add_stencil.png +0 -0
  2298. psychopy/tests/data/broken2020_2_5_resources/broken_resources.psyexp +84 -0
  2299. psychopy/tests/data/broken2020_2_5_resources/psychopy72.png +0 -0
  2300. psychopy/tests/data/bufferimg_gabor_cm.png +0 -0
  2301. psychopy/tests/data/bufferimg_gabor_deg.png +0 -0
  2302. psychopy/tests/data/bufferimg_gabor_degFlat.png +0 -0
  2303. psychopy/tests/data/bufferimg_gabor_degFlatPos.png +0 -0
  2304. psychopy/tests/data/bufferimg_gabor_height.png +0 -0
  2305. psychopy/tests/data/bufferimg_gabor_norm.png +0 -0
  2306. psychopy/tests/data/bufferimg_gabor_normAddBlend.png +0 -0
  2307. psychopy/tests/data/bufferimg_gabor_normHexbackground.png +0 -0
  2308. psychopy/tests/data/bufferimg_gabor_normNoShade.png +0 -0
  2309. psychopy/tests/data/bufferimg_gabor_pix.png +0 -0
  2310. psychopy/tests/data/bufferimg_gabor_stencil.png +0 -0
  2311. psychopy/tests/data/circleHex_cm.png +0 -0
  2312. psychopy/tests/data/circleHex_deg.png +0 -0
  2313. psychopy/tests/data/circleHex_degFlat.png +0 -0
  2314. psychopy/tests/data/circleHex_degFlatPos.png +0 -0
  2315. psychopy/tests/data/circleHex_height.png +0 -0
  2316. psychopy/tests/data/circleHex_norm.png +0 -0
  2317. psychopy/tests/data/circleHex_normAddBlend.png +0 -0
  2318. psychopy/tests/data/circleHex_normHexbackground.png +0 -0
  2319. psychopy/tests/data/circleHex_normNoShade.png +0 -0
  2320. psychopy/tests/data/circleHex_pix.png +0 -0
  2321. psychopy/tests/data/circleHex_stencil.png +0 -0
  2322. psychopy/tests/data/corrFullRandom.csv +16 -0
  2323. psychopy/tests/data/corrFullRandom.tsv +6 -0
  2324. psychopy/tests/data/corrFullRandomTH2.csv +16 -0
  2325. psychopy/tests/data/corrMultiKeyExpWide.csv +3 -0
  2326. psychopy/tests/data/corrMultiKeyTrials.csv +8 -0
  2327. psychopy/tests/data/corrMultiKeyTrials.xlsx +0 -0
  2328. psychopy/tests/data/corrRandom.csv +16 -0
  2329. psychopy/tests/data/corrRandom.tsv +6 -0
  2330. psychopy/tests/data/corrRandomTH2.csv +16 -0
  2331. psychopy/tests/data/corrXlsx.xlsx +0 -0
  2332. psychopy/tests/data/correctScript/js/correctCodeComponent.js +181 -0
  2333. psychopy/tests/data/correctScript/js/correctImageComponent.js +204 -0
  2334. psychopy/tests/data/correctScript/js/correctKeyboardComponent.js +225 -0
  2335. psychopy/tests/data/correctScript/js/correctMouseComponent.js +221 -0
  2336. psychopy/tests/data/correctScript/js/correctMovieComponent.js +210 -0
  2337. psychopy/tests/data/correctScript/js/correctPolygonComponent.js +205 -0
  2338. psychopy/tests/data/correctScript/js/correctSliderComponent.js +209 -0
  2339. psychopy/tests/data/correctScript/js/correctSoundComponent.js +205 -0
  2340. psychopy/tests/data/correctScript/js/correctTextComponent.js +207 -0
  2341. psychopy/tests/data/correctScript/python/correctApertureComponent.py +157 -0
  2342. psychopy/tests/data/correctScript/python/correctCodeComponent.py +135 -0
  2343. psychopy/tests/data/correctScript/python/correctDotsComponent.py +161 -0
  2344. psychopy/tests/data/correctScript/python/correctEnvGratingComponent.py +167 -0
  2345. psychopy/tests/data/correctScript/python/correctFormComponent.py +150 -0
  2346. psychopy/tests/data/correctScript/python/correctGratingComponent.py +158 -0
  2347. psychopy/tests/data/correctScript/python/correctImageComponent.py +160 -0
  2348. psychopy/tests/data/correctScript/python/correctJoyButtonsComponent.py +204 -0
  2349. psychopy/tests/data/correctScript/python/correctJoystickComponent.py +214 -0
  2350. psychopy/tests/data/correctScript/python/correctKeyboardComponent.py +169 -0
  2351. psychopy/tests/data/correctScript/python/correctMicrophoneComponent.py +163 -0
  2352. psychopy/tests/data/correctScript/python/correctMouseComponent.py +174 -0
  2353. psychopy/tests/data/correctScript/python/correctMovieComponent.py +160 -0
  2354. psychopy/tests/data/correctScript/python/correctNoiseStimComponent.py +169 -0
  2355. psychopy/tests/data/correctScript/python/correctParallelOutComponent.py +156 -0
  2356. psychopy/tests/data/correctScript/python/correctPatchComponent.py +159 -0
  2357. psychopy/tests/data/correctScript/python/correctPolygonComponent.py +159 -0
  2358. psychopy/tests/data/correctScript/python/correctQmixPumpComponent.py +174 -0
  2359. psychopy/tests/data/correctScript/python/correctRatingScaleComponent.py +152 -0
  2360. psychopy/tests/data/correctScript/python/correctSliderComponent.py +159 -0
  2361. psychopy/tests/data/correctScript/python/correctSoundComponent.py +157 -0
  2362. psychopy/tests/data/correctScript/python/correctStaticComponent.py +176 -0
  2363. psychopy/tests/data/correctScript/python/correctTextComponent.py +159 -0
  2364. psychopy/tests/data/correctScript/python/correctVariableComponent.py +139 -0
  2365. psychopy/tests/data/correctScript/python/correctcedrusButtonBoxComponent.py +199 -0
  2366. psychopy/tests/data/correctScript/python/correctioLabsButtonBoxComponent.py +187 -0
  2367. psychopy/tests/data/dataTest.xlsx +0 -0
  2368. psychopy/tests/data/dots_cm.png +0 -0
  2369. psychopy/tests/data/dots_deg.png +0 -0
  2370. psychopy/tests/data/dots_degFlat.png +0 -0
  2371. psychopy/tests/data/dots_degFlatPos.png +0 -0
  2372. psychopy/tests/data/dots_height.png +0 -0
  2373. psychopy/tests/data/dots_norm.png +0 -0
  2374. psychopy/tests/data/dots_normAddBlend.png +0 -0
  2375. psychopy/tests/data/dots_normHexbackground.png +0 -0
  2376. psychopy/tests/data/dots_normNoShade.png +0 -0
  2377. psychopy/tests/data/dots_pix.png +0 -0
  2378. psychopy/tests/data/dots_stencil.png +0 -0
  2379. psychopy/tests/data/duplicateHeaders.csv +2 -0
  2380. psychopy/tests/data/elarray1_cm.png +0 -0
  2381. psychopy/tests/data/elarray1_deg.png +0 -0
  2382. psychopy/tests/data/elarray1_degFlat.png +0 -0
  2383. psychopy/tests/data/elarray1_degFlatPos.png +0 -0
  2384. psychopy/tests/data/elarray1_height.png +0 -0
  2385. psychopy/tests/data/elarray1_norm.png +0 -0
  2386. psychopy/tests/data/elarray1_normAddBlend.png +0 -0
  2387. psychopy/tests/data/elarray1_normHexbackground.png +0 -0
  2388. psychopy/tests/data/elarray1_pix.png +0 -0
  2389. psychopy/tests/data/elarray1_stencil.png +0 -0
  2390. psychopy/tests/data/envelopeandrcos_cm.png +0 -0
  2391. psychopy/tests/data/envelopeandrcos_deg.png +0 -0
  2392. psychopy/tests/data/envelopeandrcos_degFlat.png +0 -0
  2393. psychopy/tests/data/envelopeandrcos_degFlatPos.png +0 -0
  2394. psychopy/tests/data/envelopeandrcos_height.png +0 -0
  2395. psychopy/tests/data/envelopeandrcos_norm.png +0 -0
  2396. psychopy/tests/data/envelopeandrcos_normAddBlend.png +0 -0
  2397. psychopy/tests/data/envelopeandrcos_normHexbackground.png +0 -0
  2398. psychopy/tests/data/envelopeandrcos_pix.png +0 -0
  2399. psychopy/tests/data/envelopeandrcos_stencil.png +0 -0
  2400. psychopy/tests/data/envelopepowerandrcos_cm.png +0 -0
  2401. psychopy/tests/data/envelopepowerandrcos_deg.png +0 -0
  2402. psychopy/tests/data/envelopepowerandrcos_degFlat.png +0 -0
  2403. psychopy/tests/data/envelopepowerandrcos_degFlatPos.png +0 -0
  2404. psychopy/tests/data/envelopepowerandrcos_height.png +0 -0
  2405. psychopy/tests/data/envelopepowerandrcos_norm.png +0 -0
  2406. psychopy/tests/data/envelopepowerandrcos_normAddBlend.png +0 -0
  2407. psychopy/tests/data/envelopepowerandrcos_normHexbackground.png +0 -0
  2408. psychopy/tests/data/envelopepowerandrcos_pix.png +0 -0
  2409. psychopy/tests/data/envelopepowerandrcos_stencil.png +0 -0
  2410. psychopy/tests/data/filltext.png +0 -0
  2411. psychopy/tests/data/form_font_demographics.png +0 -0
  2412. psychopy/tests/data/form_font_demographics.xlsx +0 -0
  2413. psychopy/tests/data/form_font_languages.png +0 -0
  2414. psychopy/tests/data/form_font_languages.xlsx +0 -0
  2415. psychopy/tests/data/form_font_nonstandard.png +0 -0
  2416. psychopy/tests/data/futureParams.psyexp +150 -0
  2417. psychopy/tests/data/gabor1_cm.png +0 -0
  2418. psychopy/tests/data/gabor1_deg.png +0 -0
  2419. psychopy/tests/data/gabor1_degFlat.png +0 -0
  2420. psychopy/tests/data/gabor1_degFlatPos.png +0 -0
  2421. psychopy/tests/data/gabor1_height.png +0 -0
  2422. psychopy/tests/data/gabor1_norm.png +0 -0
  2423. psychopy/tests/data/gabor1_normAddBlend.png +0 -0
  2424. psychopy/tests/data/gabor1_normHexbackground.png +0 -0
  2425. psychopy/tests/data/gabor1_normNoShade.png +0 -0
  2426. psychopy/tests/data/gabor1_pix.png +0 -0
  2427. psychopy/tests/data/gabor1_stencil.png +0 -0
  2428. psychopy/tests/data/gabor2_cm.png +0 -0
  2429. psychopy/tests/data/gabor2_deg.png +0 -0
  2430. psychopy/tests/data/gabor2_degFlat.png +0 -0
  2431. psychopy/tests/data/gabor2_degFlatPos.png +0 -0
  2432. psychopy/tests/data/gabor2_height.png +0 -0
  2433. psychopy/tests/data/gabor2_norm.png +0 -0
  2434. psychopy/tests/data/gabor2_normAddBlend.png +0 -0
  2435. psychopy/tests/data/gabor2_normHexbackground.png +0 -0
  2436. psychopy/tests/data/gabor2_normNoShade.png +0 -0
  2437. psychopy/tests/data/gabor2_pix.png +0 -0
  2438. psychopy/tests/data/gabor2_stencil.png +0 -0
  2439. psychopy/tests/data/ghost_stroop.psyexp +131 -0
  2440. psychopy/tests/data/ghost_trialTypes.xlsx +0 -0
  2441. psychopy/tests/data/green_48000.flac.dist +0 -0
  2442. psychopy/tests/data/greyscale.jpg +0 -0
  2443. psychopy/tests/data/greyscale2.png +0 -0
  2444. psychopy/tests/data/greyscale2_cm.png +0 -0
  2445. psychopy/tests/data/greyscale2_deg.png +0 -0
  2446. psychopy/tests/data/greyscale2_degFlat.png +0 -0
  2447. psychopy/tests/data/greyscale2_degFlatPos.png +0 -0
  2448. psychopy/tests/data/greyscale2_height.png +0 -0
  2449. psychopy/tests/data/greyscale2_norm.png +0 -0
  2450. psychopy/tests/data/greyscale2_normAddBlend.png +0 -0
  2451. psychopy/tests/data/greyscale2_normHexbackground.png +0 -0
  2452. psychopy/tests/data/greyscale2_normNoShade.png +0 -0
  2453. psychopy/tests/data/greyscale2_pix.png +0 -0
  2454. psychopy/tests/data/greyscale2_stencil.png +0 -0
  2455. psychopy/tests/data/greyscaleLowContr_cm.png +0 -0
  2456. psychopy/tests/data/greyscaleLowContr_deg.png +0 -0
  2457. psychopy/tests/data/greyscaleLowContr_degFlat.png +0 -0
  2458. psychopy/tests/data/greyscaleLowContr_degFlatPos.png +0 -0
  2459. psychopy/tests/data/greyscaleLowContr_height.png +0 -0
  2460. psychopy/tests/data/greyscaleLowContr_norm.png +0 -0
  2461. psychopy/tests/data/greyscaleLowContr_normAddBlend.png +0 -0
  2462. psychopy/tests/data/greyscaleLowContr_normHexbackground.png +0 -0
  2463. psychopy/tests/data/greyscaleLowContr_normNoShade.png +0 -0
  2464. psychopy/tests/data/greyscaleLowContr_pix.png +0 -0
  2465. psychopy/tests/data/greyscaleLowContr_stencil.png +0 -0
  2466. psychopy/tests/data/greyscale_cm.png +0 -0
  2467. psychopy/tests/data/greyscale_deg.png +0 -0
  2468. psychopy/tests/data/greyscale_degFlat.png +0 -0
  2469. psychopy/tests/data/greyscale_degFlatPos.png +0 -0
  2470. psychopy/tests/data/greyscale_height.png +0 -0
  2471. psychopy/tests/data/greyscale_norm.png +0 -0
  2472. psychopy/tests/data/greyscale_normAddBlend.png +0 -0
  2473. psychopy/tests/data/greyscale_normHexbackground.png +0 -0
  2474. psychopy/tests/data/greyscale_normNoShade.png +0 -0
  2475. psychopy/tests/data/greyscale_pix.png +0 -0
  2476. psychopy/tests/data/greyscale_stencil.png +0 -0
  2477. psychopy/tests/data/imageAndGauss_cm.png +0 -0
  2478. psychopy/tests/data/imageAndGauss_deg.png +0 -0
  2479. psychopy/tests/data/imageAndGauss_degFlat.png +0 -0
  2480. psychopy/tests/data/imageAndGauss_degFlatPos.png +0 -0
  2481. psychopy/tests/data/imageAndGauss_height.png +0 -0
  2482. psychopy/tests/data/imageAndGauss_norm.png +0 -0
  2483. psychopy/tests/data/imageAndGauss_normAddBlend.png +0 -0
  2484. psychopy/tests/data/imageAndGauss_normHexbackground.png +0 -0
  2485. psychopy/tests/data/imageAndGauss_normNoShade.png +0 -0
  2486. psychopy/tests/data/imageAndGauss_pix.png +0 -0
  2487. psychopy/tests/data/imageAndGauss_stencil.png +0 -0
  2488. psychopy/tests/data/movFrame1_cm.png +0 -0
  2489. psychopy/tests/data/movFrame1_deg.png +0 -0
  2490. psychopy/tests/data/movFrame1_degFlat.png +0 -0
  2491. psychopy/tests/data/movFrame1_degFlatPos.png +0 -0
  2492. psychopy/tests/data/movFrame1_height.png +0 -0
  2493. psychopy/tests/data/movFrame1_norm.png +0 -0
  2494. psychopy/tests/data/movFrame1_normAddBlend.png +0 -0
  2495. psychopy/tests/data/movFrame1_normHexbackground.png +0 -0
  2496. psychopy/tests/data/movFrame1_normNoShade.png +0 -0
  2497. psychopy/tests/data/movFrame1_pix.png +0 -0
  2498. psychopy/tests/data/movFrame1_stencil.png +0 -0
  2499. psychopy/tests/data/multiKeypressExperiment.psydat +357 -0
  2500. psychopy/tests/data/multiKeypressTrialhandler.psydat +252 -0
  2501. psychopy/tests/data/multiStairConds.xlsx +0 -0
  2502. psychopy/tests/data/multiStairQuestPlus.xlsx +0 -0
  2503. psychopy/tests/data/newstyle.psydat +6155 -0
  2504. psychopy/tests/data/noiseAndRcos_cm.png +0 -0
  2505. psychopy/tests/data/noiseAndRcos_deg.png +0 -0
  2506. psychopy/tests/data/noiseAndRcos_degFlat.png +0 -0
  2507. psychopy/tests/data/noiseAndRcos_degFlatPos.png +0 -0
  2508. psychopy/tests/data/noiseAndRcos_height.png +0 -0
  2509. psychopy/tests/data/noiseAndRcos_norm.png +0 -0
  2510. psychopy/tests/data/noiseAndRcos_normAddBlend.png +0 -0
  2511. psychopy/tests/data/noiseAndRcos_normHexbackground.png +0 -0
  2512. psychopy/tests/data/noiseAndRcos_normNoShade.png +0 -0
  2513. psychopy/tests/data/noiseAndRcos_pix.png +0 -0
  2514. psychopy/tests/data/noiseAndRcos_stencil.png +0 -0
  2515. psychopy/tests/data/noiseFiltersAndRcos_cm.png +0 -0
  2516. psychopy/tests/data/noiseFiltersAndRcos_deg.png +0 -0
  2517. psychopy/tests/data/noiseFiltersAndRcos_degFlat.png +0 -0
  2518. psychopy/tests/data/noiseFiltersAndRcos_degFlatPos.png +0 -0
  2519. psychopy/tests/data/noiseFiltersAndRcos_height.png +0 -0
  2520. psychopy/tests/data/noiseFiltersAndRcos_norm.png +0 -0
  2521. psychopy/tests/data/noiseFiltersAndRcos_normAddBlend.png +0 -0
  2522. psychopy/tests/data/noiseFiltersAndRcos_normHexbackground.png +0 -0
  2523. psychopy/tests/data/noiseFiltersAndRcos_normNoShade.png +0 -0
  2524. psychopy/tests/data/noiseFiltersAndRcos_pix.png +0 -0
  2525. psychopy/tests/data/noiseFiltersAndRcos_stencil.png +0 -0
  2526. psychopy/tests/data/numpyImage_cm.png +0 -0
  2527. psychopy/tests/data/numpyImage_deg.png +0 -0
  2528. psychopy/tests/data/numpyImage_degFlat.png +0 -0
  2529. psychopy/tests/data/numpyImage_degFlatPos.png +0 -0
  2530. psychopy/tests/data/numpyImage_height.png +0 -0
  2531. psychopy/tests/data/numpyImage_norm.png +0 -0
  2532. psychopy/tests/data/numpyImage_normAddBlend.png +0 -0
  2533. psychopy/tests/data/numpyImage_normHexbackground.png +0 -0
  2534. psychopy/tests/data/numpyImage_normNoShade.png +0 -0
  2535. psychopy/tests/data/numpyImage_pix.png +0 -0
  2536. psychopy/tests/data/numpyImage_stencil.png +0 -0
  2537. psychopy/tests/data/numpyLowContr_cm.png +0 -0
  2538. psychopy/tests/data/numpyLowContr_deg.png +0 -0
  2539. psychopy/tests/data/numpyLowContr_degFlat.png +0 -0
  2540. psychopy/tests/data/numpyLowContr_degFlatPos.png +0 -0
  2541. psychopy/tests/data/numpyLowContr_height.png +0 -0
  2542. psychopy/tests/data/numpyLowContr_norm.png +0 -0
  2543. psychopy/tests/data/numpyLowContr_normAddBlend.png +0 -0
  2544. psychopy/tests/data/numpyLowContr_normHexbackground.png +0 -0
  2545. psychopy/tests/data/numpyLowContr_normNoShade.png +0 -0
  2546. psychopy/tests/data/numpyLowContr_pix.png +0 -0
  2547. psychopy/tests/data/numpyLowContr_stencil.png +0 -0
  2548. psychopy/tests/data/oldstyle.psydat +1534 -0
  2549. psychopy/tests/data/oldstyle_stair.psydat +263 -0
  2550. psychopy/tests/data/ratingscale1_cm.png +0 -0
  2551. psychopy/tests/data/ratingscale1_deg.png +0 -0
  2552. psychopy/tests/data/ratingscale1_degFlat.png +0 -0
  2553. psychopy/tests/data/ratingscale1_degFlatPos.png +0 -0
  2554. psychopy/tests/data/ratingscale1_height.png +0 -0
  2555. psychopy/tests/data/ratingscale1_norm.png +0 -0
  2556. psychopy/tests/data/ratingscale1_normAddBlend.png +0 -0
  2557. psychopy/tests/data/ratingscale1_normHexbackground.png +0 -0
  2558. psychopy/tests/data/ratingscale1_normNoShade.png +0 -0
  2559. psychopy/tests/data/ratingscale1_pix.png +0 -0
  2560. psychopy/tests/data/ratingscale1_stencil.png +0 -0
  2561. psychopy/tests/data/red_16000.flac.dist +0 -0
  2562. psychopy/tests/data/retroListParam.psyexp +82 -0
  2563. psychopy/tests/data/right_to_left_unidcode.xlsx +0 -0
  2564. psychopy/tests/data/sample.meshwarp.data +11522 -0
  2565. psychopy/tests/data/shape2_1_cm.png +0 -0
  2566. psychopy/tests/data/shape2_1_deg.png +0 -0
  2567. psychopy/tests/data/shape2_1_degFlat.png +0 -0
  2568. psychopy/tests/data/shape2_1_degFlatPos.png +0 -0
  2569. psychopy/tests/data/shape2_1_height.png +0 -0
  2570. psychopy/tests/data/shape2_1_norm.png +0 -0
  2571. psychopy/tests/data/shape2_1_normAddBlend.png +0 -0
  2572. psychopy/tests/data/shape2_1_normHexbackground.png +0 -0
  2573. psychopy/tests/data/shape2_1_normNoShade.png +0 -0
  2574. psychopy/tests/data/shape2_1_pix.png +0 -0
  2575. psychopy/tests/data/shape2_1_stencil.png +0 -0
  2576. psychopy/tests/data/shape2_2_cm.png +0 -0
  2577. psychopy/tests/data/shape2_2_deg.png +0 -0
  2578. psychopy/tests/data/shape2_2_degFlat.png +0 -0
  2579. psychopy/tests/data/shape2_2_degFlatPos.png +0 -0
  2580. psychopy/tests/data/shape2_2_height.png +0 -0
  2581. psychopy/tests/data/shape2_2_norm.png +0 -0
  2582. psychopy/tests/data/shape2_2_normAddBlend.png +0 -0
  2583. psychopy/tests/data/shape2_2_normHexbackground.png +0 -0
  2584. psychopy/tests/data/shape2_2_normNoShade.png +0 -0
  2585. psychopy/tests/data/shape2_2_pix.png +0 -0
  2586. psychopy/tests/data/shape2_2_stencil.png +0 -0
  2587. psychopy/tests/data/simpleimage1_cm.png +0 -0
  2588. psychopy/tests/data/simpleimage1_deg.png +0 -0
  2589. psychopy/tests/data/simpleimage1_degFlat.png +0 -0
  2590. psychopy/tests/data/simpleimage1_degFlatPos.png +0 -0
  2591. psychopy/tests/data/simpleimage1_height.png +0 -0
  2592. psychopy/tests/data/simpleimage1_norm.png +0 -0
  2593. psychopy/tests/data/simpleimage1_normAddBlend.png +0 -0
  2594. psychopy/tests/data/simpleimage1_normHexbackground.png +0 -0
  2595. psychopy/tests/data/simpleimage1_normNoShade.png +0 -0
  2596. psychopy/tests/data/simpleimage1_pix.png +0 -0
  2597. psychopy/tests/data/simpleimage1_stencil.png +0 -0
  2598. psychopy/tests/data/test001EntryImporting.psyexp +66 -0
  2599. psychopy/tests/data/testMovie.mp4 +0 -0
  2600. psychopy/tests/data/test_basic_run.py +1 -0
  2601. psychopy/tests/data/test_circle_radius_.1height.png +0 -0
  2602. psychopy/tests/data/test_circle_radius_.2height.png +0 -0
  2603. psychopy/tests/data/test_circle_radius_10pix.png +0 -0
  2604. psychopy/tests/data/test_circle_radius_20pix.png +0 -0
  2605. psychopy/tests/data/test_components/testClearKeyboard/testClearKeyboard.psyexp +200 -0
  2606. psychopy/tests/data/test_form_combinations_choice_bigItem.png +0 -0
  2607. psychopy/tests/data/test_form_combinations_choice_bigItemOverflow.png +0 -0
  2608. psychopy/tests/data/test_form_combinations_choice_bigResp.png +0 -0
  2609. psychopy/tests/data/test_form_combinations_choice_bigRespOverflow.png +0 -0
  2610. psychopy/tests/data/test_form_combinations_description_bigItem.png +0 -0
  2611. psychopy/tests/data/test_form_combinations_description_bigItemOverflow.png +0 -0
  2612. psychopy/tests/data/test_form_combinations_description_bigResp.png +0 -0
  2613. psychopy/tests/data/test_form_combinations_description_bigRespOverflow.png +0 -0
  2614. psychopy/tests/data/test_form_combinations_free text_bigItem.png +0 -0
  2615. psychopy/tests/data/test_form_combinations_free text_bigItemOverflow.png +0 -0
  2616. psychopy/tests/data/test_form_combinations_free text_bigResp.png +0 -0
  2617. psychopy/tests/data/test_form_combinations_free text_bigRespOverflow.png +0 -0
  2618. psychopy/tests/data/test_form_combinations_heading_bigItem.png +0 -0
  2619. psychopy/tests/data/test_form_combinations_heading_bigItemOverflow.png +0 -0
  2620. psychopy/tests/data/test_form_combinations_heading_bigResp.png +0 -0
  2621. psychopy/tests/data/test_form_combinations_heading_bigRespOverflow.png +0 -0
  2622. psychopy/tests/data/test_form_combinations_radio_bigItem.png +0 -0
  2623. psychopy/tests/data/test_form_combinations_radio_bigItemOverflow.png +0 -0
  2624. psychopy/tests/data/test_form_combinations_radio_bigResp.png +0 -0
  2625. psychopy/tests/data/test_form_combinations_radio_bigRespOverflow.png +0 -0
  2626. psychopy/tests/data/test_form_combinations_rating_bigItem.png +0 -0
  2627. psychopy/tests/data/test_form_combinations_rating_bigItemOverflow.png +0 -0
  2628. psychopy/tests/data/test_form_combinations_rating_bigResp.png +0 -0
  2629. psychopy/tests/data/test_form_combinations_rating_bigRespOverflow.png +0 -0
  2630. psychopy/tests/data/test_form_combinations_slider_bigItem.png +0 -0
  2631. psychopy/tests/data/test_form_combinations_slider_bigItemOverflow.png +0 -0
  2632. psychopy/tests/data/test_form_combinations_slider_bigResp.png +0 -0
  2633. psychopy/tests/data/test_form_combinations_slider_bigRespOverflow.png +0 -0
  2634. psychopy/tests/data/test_get_resources/blue.png +0 -0
  2635. psychopy/tests/data/test_get_resources/groupA.csv +3 -0
  2636. psychopy/tests/data/test_get_resources/groupB.csv +3 -0
  2637. psychopy/tests/data/test_get_resources/groups.csv +3 -0
  2638. psychopy/tests/data/test_get_resources/handledbyrm_constrloop.psyexp +143 -0
  2639. psychopy/tests/data/test_get_resources/handledbyrm_noloop.psyexp +114 -0
  2640. psychopy/tests/data/test_get_resources/handledbyrm_recurloop.psyexp +138 -0
  2641. psychopy/tests/data/test_get_resources/handledbyrm_strloop.psyexp +126 -0
  2642. psychopy/tests/data/test_get_resources/handledbystatic_constrloop.psyexp +141 -0
  2643. psychopy/tests/data/test_get_resources/handledbystatic_noloop.psyexp +112 -0
  2644. psychopy/tests/data/test_get_resources/handledbystatic_recurloop.psyexp +136 -0
  2645. psychopy/tests/data/test_get_resources/handledbystatic_strloop.psyexp +124 -0
  2646. psychopy/tests/data/test_get_resources/unhandled_constrloop.psyexp +128 -0
  2647. psychopy/tests/data/test_get_resources/unhandled_noloop.psyexp +99 -0
  2648. psychopy/tests/data/test_get_resources/unhandled_recurloop.psyexp +123 -0
  2649. psychopy/tests/data/test_get_resources/unhandled_strloop.psyexp +111 -0
  2650. psychopy/tests/data/test_get_resources/white.png +0 -0
  2651. psychopy/tests/data/test_get_resources/yellow.png +0 -0
  2652. psychopy/tests/data/test_image_aspect_default_None.png +0 -0
  2653. psychopy/tests/data/test_image_aspect_default_xFull_yNone.png +0 -0
  2654. psychopy/tests/data/test_image_aspect_default_xNone_yFull.png +0 -0
  2655. psychopy/tests/data/test_image_aspect_default_xNone_yNone.png +0 -0
  2656. psychopy/tests/data/test_image_flip_anchor_horiz.png +0 -0
  2657. psychopy/tests/data/test_image_flip_anchor_vert.png +0 -0
  2658. psychopy/tests/data/test_loaded_namespace/test_counterbalance.psyexp +142 -0
  2659. psychopy/tests/data/test_loaded_namespace/test_custom_missing.psyexp +129 -0
  2660. psychopy/tests/data/test_loaded_namespace/test_missing_counterbalance.psyexp +116 -0
  2661. psychopy/tests/data/test_loaded_namespace/test_mix_exp.psyexp +181 -0
  2662. psychopy/tests/data/test_loaded_namespace/test_mix_missing.psyexp +140 -0
  2663. psychopy/tests/data/test_loaded_namespace/test_mix_name_calibration.psyexp +164 -0
  2664. psychopy/tests/data/test_loops/testLoopsBlocks.psyexp +161 -0
  2665. psychopy/tests/data/test_loops/testStaircase.psyexp +105 -0
  2666. psychopy/tests/data/test_loops/test_current_loop_attr.psyexp +185 -0
  2667. psychopy/tests/data/test_panorama/panoramaTestImage.png +0 -0
  2668. psychopy/tests/data/test_panorama/panoramaTestImage.svg +1 -0
  2669. psychopy/tests/data/test_panorama/testPanorama_mvmt_-0.3_-0.3.png +0 -0
  2670. psychopy/tests/data/test_panorama/testPanorama_mvmt_-0.3_0.3.png +0 -0
  2671. psychopy/tests/data/test_panorama/testPanorama_mvmt_-1.0_-0.3.png +0 -0
  2672. psychopy/tests/data/test_panorama/testPanorama_mvmt_-1.0_0.3.png +0 -0
  2673. psychopy/tests/data/test_panorama/testPanorama_mvmt_0.0_-1.0.png +0 -0
  2674. psychopy/tests/data/test_panorama/testPanorama_mvmt_0.0_1.0.png +0 -0
  2675. psychopy/tests/data/test_panorama/testPanorama_mvmt_0.3_-0.3.png +0 -0
  2676. psychopy/tests/data/test_panorama/testPanorama_mvmt_0.3_0.3.png +0 -0
  2677. psychopy/tests/data/test_resources.psyexp +491 -0
  2678. psychopy/tests/data/test_session/outside_root/externalExp.psyexp +116 -0
  2679. psychopy/tests/data/test_session/root/annotation/annotation.psyexp +161 -0
  2680. psychopy/tests/data/test_session/root/error/error.psyexp +93 -0
  2681. psychopy/tests/data/test_session/root/exp1/exp1.psyexp +133 -0
  2682. psychopy/tests/data/test_session/root/exp2/exp2.psyexp +133 -0
  2683. psychopy/tests/data/test_session/root/frameRate/frameRate.psyexp +114 -0
  2684. psychopy/tests/data/test_session/root/invUseVersion/invUseVersion.psyexp +133 -0
  2685. psychopy/tests/data/test_session/root/testClockFormat/testClockFormat.psyexp +122 -0
  2686. psychopy/tests/data/test_session/root/testCtrls/testCtrls.psyexp +115 -0
  2687. psychopy/tests/data/test_session/root/testEditExpInfo/testEditExpInfo.psyexp +135 -0
  2688. psychopy/tests/data/test_session/root/testFutureTrials/testFutureTrials.psyexp +155 -0
  2689. psychopy/tests/data/test_session/root/testNamedButtonBox/testNamedButtonBox.psyexp +145 -0
  2690. psychopy/tests/data/test_session/root/testTrialNav/trialNav.psyexp +158 -0
  2691. psychopy/tests/data/test_slider_horiz_accute_horiz.png +0 -0
  2692. psychopy/tests/data/test_slider_horiz_accute_vert.png +0 -0
  2693. psychopy/tests/data/test_slider_horiz_horiz.png +0 -0
  2694. psychopy/tests/data/test_slider_horiz_obtuse_horiz.png +0 -0
  2695. psychopy/tests/data/test_slider_horiz_obtuse_vert.png +0 -0
  2696. psychopy/tests/data/test_slider_horiz_vert.png +0 -0
  2697. psychopy/tests/data/test_slider_ticklabelloc_blanks.png +0 -0
  2698. psychopy/tests/data/test_slider_ticklabelloc_clustered.png +0 -0
  2699. psychopy/tests/data/test_slider_ticklabelloc_morelabels.png +0 -0
  2700. psychopy/tests/data/test_slider_ticklabelloc_morelabelsclustered.png +0 -0
  2701. psychopy/tests/data/test_slider_ticklabelloc_moreticks.png +0 -0
  2702. psychopy/tests/data/test_slider_ticklabelloc_moreticksclustered.png +0 -0
  2703. psychopy/tests/data/test_slider_ticklabelloc_nolabels.png +0 -0
  2704. psychopy/tests/data/test_slider_ticklabelloc_noticks.png +0 -0
  2705. psychopy/tests/data/test_slider_ticklabelloc_simple.png +0 -0
  2706. psychopy/tests/data/test_slider_triangle_horiz_False_flip_False.png +0 -0
  2707. psychopy/tests/data/test_slider_triangle_horiz_False_flip_True.png +0 -0
  2708. psychopy/tests/data/test_slider_triangle_horiz_True_flip_False.png +0 -0
  2709. psychopy/tests/data/test_slider_triangle_horiz_True_flip_True.png +0 -0
  2710. psychopy/tests/data/test_sounds/default_16000.wav +0 -0
  2711. psychopy/tests/data/test_sounds/default_192000.wav +0 -0
  2712. psychopy/tests/data/test_sounds/default_22050.wav +0 -0
  2713. psychopy/tests/data/test_sounds/default_32000.wav +0 -0
  2714. psychopy/tests/data/test_sounds/default_44100.wav +0 -0
  2715. psychopy/tests/data/test_sounds/default_48000.wav +0 -0
  2716. psychopy/tests/data/test_sounds/default_8000.wav +0 -0
  2717. psychopy/tests/data/test_sounds/default_96000.wav +0 -0
  2718. psychopy/tests/data/test_static_component_script.psyexp +76 -0
  2719. psychopy/tests/data/test_win_bg_large_256_default.png +0 -0
  2720. psychopy/tests/data/test_win_bg_large_500_default.png +0 -0
  2721. psychopy/tests/data/test_win_bg_small_200_default.png +0 -0
  2722. psychopy/tests/data/test_win_bg_small_256_default.png +0 -0
  2723. psychopy/tests/data/test_win_bg_tall_200_default.png +0 -0
  2724. psychopy/tests/data/test_win_bg_tall_256_default.png +0 -0
  2725. psychopy/tests/data/test_win_bg_tall_500_default.png +0 -0
  2726. psychopy/tests/data/test_win_bg_tall_fill_default.png +0 -0
  2727. psychopy/tests/data/test_win_bg_wide_200_default.png +0 -0
  2728. psychopy/tests/data/test_win_bg_wide_256_default.png +0 -0
  2729. psychopy/tests/data/test_win_bg_wide_500_default.png +0 -0
  2730. psychopy/tests/data/test_win_bg_wide_fill_default.png +0 -0
  2731. psychopy/tests/data/test_win_bgcolor_blue.png +0 -0
  2732. psychopy/tests/data/test_win_bgcolor_green.png +0 -0
  2733. psychopy/tests/data/test_win_bgcolor_red.png +0 -0
  2734. psychopy/tests/data/testimage.jpg +0 -0
  2735. psychopy/tests/data/testimagegray.jpg +0 -0
  2736. psychopy/tests/data/testpixels.png +0 -0
  2737. psychopy/tests/data/testwedges.png +0 -0
  2738. psychopy/tests/data/text1_cm.png +0 -0
  2739. psychopy/tests/data/text1_deg.png +0 -0
  2740. psychopy/tests/data/text1_degFlat.png +0 -0
  2741. psychopy/tests/data/text1_degFlatPos.png +0 -0
  2742. psychopy/tests/data/text1_height.png +0 -0
  2743. psychopy/tests/data/text1_norm.png +0 -0
  2744. psychopy/tests/data/text1_normAddBlend.png +0 -0
  2745. psychopy/tests/data/text1_normHexbackground.png +0 -0
  2746. psychopy/tests/data/text1_normNoShade.png +0 -0
  2747. psychopy/tests/data/text1_pix.png +0 -0
  2748. psychopy/tests/data/text1_stencil.png +0 -0
  2749. psychopy/tests/data/text2_cm.png +0 -0
  2750. psychopy/tests/data/text2_deg.png +0 -0
  2751. psychopy/tests/data/text2_degFlat.png +0 -0
  2752. psychopy/tests/data/text2_degFlatPos.png +0 -0
  2753. psychopy/tests/data/text2_norm.png +0 -0
  2754. psychopy/tests/data/text2_normNoShade.png +0 -0
  2755. psychopy/tests/data/text2_pix.png +0 -0
  2756. psychopy/tests/data/textbox_charcolors_default_roygbiv.png +0 -0
  2757. psychopy/tests/data/textbox_charcolors_default_white_hello_black_there.png +0 -0
  2758. psychopy/tests/data/textbox_default_align_bottom_center.png +0 -0
  2759. psychopy/tests/data/textbox_default_align_bottom_left.png +0 -0
  2760. psychopy/tests/data/textbox_default_align_bottom_right.png +0 -0
  2761. psychopy/tests/data/textbox_default_align_center.png +0 -0
  2762. psychopy/tests/data/textbox_default_align_center_center.png +0 -0
  2763. psychopy/tests/data/textbox_default_align_center_left.png +0 -0
  2764. psychopy/tests/data/textbox_default_align_center_right.png +0 -0
  2765. psychopy/tests/data/textbox_default_align_centre.png +0 -0
  2766. psychopy/tests/data/textbox_default_align_centre_centre.png +0 -0
  2767. psychopy/tests/data/textbox_default_align_more_than_two_words.png +0 -0
  2768. psychopy/tests/data/textbox_default_align_someword.png +0 -0
  2769. psychopy/tests/data/textbox_default_align_top_center.png +0 -0
  2770. psychopy/tests/data/textbox_default_align_top_left.png +0 -0
  2771. psychopy/tests/data/textbox_default_align_top_right.png +0 -0
  2772. psychopy/tests/data/textbox_default_colors_WOB.png +0 -0
  2773. psychopy/tests/data/textbox_default_colors_exemplar1.png +0 -0
  2774. psychopy/tests/data/textbox_default_colors_exemplar2.png +0 -0
  2775. psychopy/tests/data/textbox_default_colors_exemplar3.png +0 -0
  2776. psychopy/tests/data/textbox_default_colors_tyke1.png +0 -0
  2777. psychopy/tests/data/textbox_default_colors_tyke2.png +0 -0
  2778. psychopy/tests/data/textbox_default_colors_tyke3.png +0 -0
  2779. psychopy/tests/data/textbox_default_cutoff_top.png +0 -0
  2780. psychopy/tests/data/textbox_default_exemplar_1.png +0 -0
  2781. psychopy/tests/data/textbox_default_exemplar_2.png +0 -0
  2782. psychopy/tests/data/textbox_default_exemplar_3.png +0 -0
  2783. psychopy/tests/data/textbox_default_exemplar_4.png +0 -0
  2784. psychopy/tests/data/textbox_default_tyke_1.png +0 -0
  2785. psychopy/tests/data/textbox_default_tyke_2.png +0 -0
  2786. psychopy/tests/data/textbox_typing_blank.png +0 -0
  2787. psychopy/tests/data/textbox_typing_longKoeran.png +0 -0
  2788. psychopy/tests/data/textbox_typing_longWord.png +0 -0
  2789. psychopy/tests/data/textbox_typing_navDel.png +0 -0
  2790. psychopy/tests/data/textbox_typing_navLR.png +0 -0
  2791. psychopy/tests/data/textbox_typing_newline.png +0 -0
  2792. psychopy/tests/data/textbox_typing_pangram.png +0 -0
  2793. psychopy/tests/data/textbox_uax14_align_bottom_center.png +0 -0
  2794. psychopy/tests/data/textbox_uax14_align_bottom_left.png +0 -0
  2795. psychopy/tests/data/textbox_uax14_align_bottom_right.png +0 -0
  2796. psychopy/tests/data/textbox_uax14_align_center.png +0 -0
  2797. psychopy/tests/data/textbox_uax14_align_center_center.png +0 -0
  2798. psychopy/tests/data/textbox_uax14_align_center_left.png +0 -0
  2799. psychopy/tests/data/textbox_uax14_align_center_right.png +0 -0
  2800. psychopy/tests/data/textbox_uax14_align_centre.png +0 -0
  2801. psychopy/tests/data/textbox_uax14_align_centre_centre.png +0 -0
  2802. psychopy/tests/data/textbox_uax14_align_more_than_two_words.png +0 -0
  2803. psychopy/tests/data/textbox_uax14_align_someword.png +0 -0
  2804. psychopy/tests/data/textbox_uax14_align_top_center.png +0 -0
  2805. psychopy/tests/data/textbox_uax14_align_top_left.png +0 -0
  2806. psychopy/tests/data/textbox_uax14_align_top_right.png +0 -0
  2807. psychopy/tests/data/textbox_uax14_colors_WOB.png +0 -0
  2808. psychopy/tests/data/textbox_uax14_colors_exemplar1.png +0 -0
  2809. psychopy/tests/data/textbox_uax14_colors_exemplar2.png +0 -0
  2810. psychopy/tests/data/textbox_uax14_colors_exemplar3.png +0 -0
  2811. psychopy/tests/data/textbox_uax14_colors_tyke1.png +0 -0
  2812. psychopy/tests/data/textbox_uax14_colors_tyke2.png +0 -0
  2813. psychopy/tests/data/textbox_uax14_colors_tyke3.png +0 -0
  2814. psychopy/tests/data/textbox_uax14_cutoff_top.png +0 -0
  2815. psychopy/tests/data/textbox_uax14_exemplar_1.png +0 -0
  2816. psychopy/tests/data/textbox_uax14_exemplar_2.png +0 -0
  2817. psychopy/tests/data/textbox_uax14_exemplar_3.png +0 -0
  2818. psychopy/tests/data/textbox_uax14_exemplar_4.png +0 -0
  2819. psychopy/tests/data/textbox_uax14_tyke_1.png +0 -0
  2820. psychopy/tests/data/textbox_uax14_tyke_2.png +0 -0
  2821. psychopy/tests/data/trialTypes.csv +1 -0
  2822. psychopy/tests/data/trialTypes.docx +0 -0
  2823. psychopy/tests/data/trialTypes.pkl +0 -0
  2824. psychopy/tests/data/trialTypes.tsv +7 -0
  2825. psychopy/tests/data/trialTypes.xls +0 -0
  2826. psychopy/tests/data/trialTypes.xlsx +0 -0
  2827. psychopy/tests/data/trialTypes_eu.csv +7 -0
  2828. psychopy/tests/data/trialsBlankCols.xlsx +0 -0
  2829. psychopy/tests/data/wedge1_cm.png +0 -0
  2830. psychopy/tests/data/wedge1_deg.png +0 -0
  2831. psychopy/tests/data/wedge1_degFlat.png +0 -0
  2832. psychopy/tests/data/wedge1_degFlatPos.png +0 -0
  2833. psychopy/tests/data/wedge1_height.png +0 -0
  2834. psychopy/tests/data/wedge1_norm.png +0 -0
  2835. psychopy/tests/data/wedge1_normAddBlend.png +0 -0
  2836. psychopy/tests/data/wedge1_normHexbackground.png +0 -0
  2837. psychopy/tests/data/wedge1_normNoShade.png +0 -0
  2838. psychopy/tests/data/wedge1_pix.png +0 -0
  2839. psychopy/tests/data/wedge1_stencil.png +0 -0
  2840. psychopy/tests/data/wedge2_cm.png +0 -0
  2841. psychopy/tests/data/wedge2_deg.png +0 -0
  2842. psychopy/tests/data/wedge2_degFlat.png +0 -0
  2843. psychopy/tests/data/wedge2_degFlatPos.png +0 -0
  2844. psychopy/tests/data/wedge2_height.png +0 -0
  2845. psychopy/tests/data/wedge2_norm.png +0 -0
  2846. psychopy/tests/data/wedge2_normAddBlend.png +0 -0
  2847. psychopy/tests/data/wedge2_normHexbackground.png +0 -0
  2848. psychopy/tests/data/wedge2_normNoShade.png +0 -0
  2849. psychopy/tests/data/wedge2_pix.png +0 -0
  2850. psychopy/tests/data/wedge2_stencil.png +0 -0
  2851. psychopy/tests/data/winScalePos_ori0_scale-1_-1_pos-0.4_0.png +0 -0
  2852. psychopy/tests/data/winScalePos_ori0_scale-1_-1_pos0_0.png +0 -0
  2853. psychopy/tests/data/winScalePos_ori0_scale-1_1_pos-0.4_0.png +0 -0
  2854. psychopy/tests/data/winScalePos_ori0_scale-1_1_pos0_0.png +0 -0
  2855. psychopy/tests/data/winScalePos_ori0_scale-2_-2_pos-0.4_0.png +0 -0
  2856. psychopy/tests/data/winScalePos_ori0_scale-2_-2_pos0_0.png +0 -0
  2857. psychopy/tests/data/winScalePos_ori0_scale-2_2_pos-0.4_0.png +0 -0
  2858. psychopy/tests/data/winScalePos_ori0_scale-2_2_pos0_0.png +0 -0
  2859. psychopy/tests/data/winScalePos_ori0_scale1_-1_pos-0.4_0.png +0 -0
  2860. psychopy/tests/data/winScalePos_ori0_scale1_-1_pos0_0.png +0 -0
  2861. psychopy/tests/data/winScalePos_ori0_scale1_1_pos-0.4_0.png +0 -0
  2862. psychopy/tests/data/winScalePos_ori0_scale1_1_pos0_0.png +0 -0
  2863. psychopy/tests/data/winScalePos_ori0_scale2_-2_pos-0.4_0.png +0 -0
  2864. psychopy/tests/data/winScalePos_ori0_scale2_-2_pos0_0.png +0 -0
  2865. psychopy/tests/data/winScalePos_ori0_scale2_2_pos-0.4_0.png +0 -0
  2866. psychopy/tests/data/winScalePos_ori0_scale2_2_pos0_0.png +0 -0
  2867. psychopy/tests/data/winScalePos_ori45_scale-1_-1_pos0_0.png +0 -0
  2868. psychopy/tests/data/winScalePos_ori45_scale-1_1_pos0_0.png +0 -0
  2869. psychopy/tests/data/winScalePos_ori45_scale-2_-2_pos0_0.png +0 -0
  2870. psychopy/tests/data/winScalePos_ori45_scale-2_2_pos0_0.png +0 -0
  2871. psychopy/tests/data/winScalePos_ori45_scale1_-1_pos0_0.png +0 -0
  2872. psychopy/tests/data/winScalePos_ori45_scale1_1_pos0_0.png +0 -0
  2873. psychopy/tests/data/winScalePos_ori45_scale2_-2_pos0_0.png +0 -0
  2874. psychopy/tests/data/winScalePos_ori45_scale2_2_pos0_0.png +0 -0
  2875. psychopy/tests/doc/run_btn.png +0 -0
  2876. psychopy/tests/doc/test-suite-bugs.jpg +0 -0
  2877. psychopy/tests/doc/user-bugs.jpg +0 -0
  2878. psychopy/tests/dummy_xorg.conf +21 -0
  2879. psychopy/tests/run.py +50 -0
  2880. psychopy/tests/test_Installation.py +38 -0
  2881. psychopy/tests/test_alerts/test_alerts.py +37 -0
  2882. psychopy/tests/test_alerts/test_alerttools.py +132 -0
  2883. psychopy/tests/test_app/__init__.py +0 -0
  2884. psychopy/tests/test_app/conftest.py +40 -0
  2885. psychopy/tests/test_app/test_builder/__init__.py +0 -0
  2886. psychopy/tests/test_app/test_builder/test_BuilderFrame.py +166 -0
  2887. psychopy/tests/test_app/test_builder/test_CompileFromBuilder.py +133 -0
  2888. psychopy/tests/test_app/test_builder/test_ComponentDialogs.py +98 -0
  2889. psychopy/tests/test_app/test_command_line.py +65 -0
  2890. psychopy/tests/test_app/test_runner/__init__.py +0 -0
  2891. psychopy/tests/test_app/test_runner/test_RunnerFrame.py +166 -0
  2892. psychopy/tests/test_app/test_speed.py +147 -0
  2893. psychopy/tests/test_app/test_themes/test_icons.py +79 -0
  2894. psychopy/tests/test_codecov.py +29 -0
  2895. psychopy/tests/test_colors/test_Color.py +41 -0
  2896. psychopy/tests/test_data/dataPrev.xlsx +0 -0
  2897. psychopy/tests/test_data/test_ExperimentHandler.py +171 -0
  2898. psychopy/tests/test_data/test_MultiStairHandler.py +174 -0
  2899. psychopy/tests/test_data/test_StairHandlers.py +1241 -0
  2900. psychopy/tests/test_data/test_TrialHandler.py +335 -0
  2901. psychopy/tests/test_data/test_TrialHandler2.py +584 -0
  2902. psychopy/tests/test_data/test_TrialHandlerExt.py +359 -0
  2903. psychopy/tests/test_data/test_fitFunctions.py +101 -0
  2904. psychopy/tests/test_data/test_utils.py +173 -0
  2905. psychopy/tests/test_data/test_xlsx.py +92 -0
  2906. psychopy/tests/test_demos/test_builder_demos.py +52 -0
  2907. psychopy/tests/test_experiment/__init__.py +0 -0
  2908. psychopy/tests/test_experiment/known_py_diffs.txt +47 -0
  2909. psychopy/tests/test_experiment/needs_wx/__init__.py +0 -0
  2910. psychopy/tests/test_experiment/needs_wx/componsTemplate.txt +14780 -0
  2911. psychopy/tests/test_experiment/needs_wx/genComponsTemplate.py +130 -0
  2912. psychopy/tests/test_experiment/needs_wx/test_Experiment.py +406 -0
  2913. psychopy/tests/test_experiment/needs_wx/test_components.py +170 -0
  2914. psychopy/tests/test_experiment/test_component_compile_js.py +59 -0
  2915. psychopy/tests/test_experiment/test_component_compile_python.py +165 -0
  2916. psychopy/tests/test_experiment/test_components/__init__.py +1 -0
  2917. psychopy/tests/test_experiment/test_components/test_ButtonBoxComponent.py +218 -0
  2918. psychopy/tests/test_experiment/test_components/test_CodeComponent.py +70 -0
  2919. psychopy/tests/test_experiment/test_components/test_GratingComponent.py +7 -0
  2920. psychopy/tests/test_experiment/test_components/test_ImageComponent.py +8 -0
  2921. psychopy/tests/test_experiment/test_components/test_KeyboardComponent.py +28 -0
  2922. psychopy/tests/test_experiment/test_components/test_MouseComponent.py +136 -0
  2923. psychopy/tests/test_experiment/test_components/test_PolygonComponent.py +65 -0
  2924. psychopy/tests/test_experiment/test_components/test_ResourceManagerComponent.py +50 -0
  2925. psychopy/tests/test_experiment/test_components/test_RoutineSettingsComponent.py +16 -0
  2926. psychopy/tests/test_experiment/test_components/test_SettingsComponent.py +80 -0
  2927. psychopy/tests/test_experiment/test_components/test_StaticComponent.py +51 -0
  2928. psychopy/tests/test_experiment/test_components/test_UnknownPluginComponent.py +27 -0
  2929. psychopy/tests/test_experiment/test_components/test_all_components.py +104 -0
  2930. psychopy/tests/test_experiment/test_components/test_base_components.py +477 -0
  2931. psychopy/tests/test_experiment/test_experiment.py +199 -0
  2932. psychopy/tests/test_experiment/test_loops.py +103 -0
  2933. psychopy/tests/test_experiment/test_params.py +363 -0
  2934. psychopy/tests/test_experiment/test_py2js.py +230 -0
  2935. psychopy/tests/test_experiment/test_routines/__init__.py +1 -0
  2936. psychopy/tests/test_experiment/test_routines/test_EyetrackerCalibrationRoutine.py +9 -0
  2937. psychopy/tests/test_experiment/test_routines/test_PhotodiodeValidationRoutine.py +9 -0
  2938. psychopy/tests/test_experiment/test_routines/test_all_routines.py +23 -0
  2939. psychopy/tests/test_experiment/test_routines/test_base_routine.py +154 -0
  2940. psychopy/tests/test_experiment/test_routines/test_standalone_routines.py +36 -0
  2941. psychopy/tests/test_gui/test_DlgFromDictQt.py +82 -0
  2942. psychopy/tests/test_gui/test_DlgFromDictWx.py +82 -0
  2943. psychopy/tests/test_hardware/__init__.py +0 -0
  2944. psychopy/tests/test_hardware/test_device_manager.py +36 -0
  2945. psychopy/tests/test_hardware/test_emulator.py +106 -0
  2946. psychopy/tests/test_hardware/test_gammasci.py +35 -0
  2947. psychopy/tests/test_hardware/test_keyboard.py +241 -0
  2948. psychopy/tests/test_hardware/test_keyboard_events.py +362 -0
  2949. psychopy/tests/test_hardware/test_photodiode.py +66 -0
  2950. psychopy/tests/test_hardware/test_ports.py +129 -0
  2951. psychopy/tests/test_iohub/__init__.py +1 -0
  2952. psychopy/tests/test_iohub/test_computer.py +124 -0
  2953. psychopy/tests/test_iohub/test_event_get_and_clear.py +94 -0
  2954. psychopy/tests/test_iohub/test_keyboard.py +91 -0
  2955. psychopy/tests/test_iohub/test_launch.py +19 -0
  2956. psychopy/tests/test_iohub/testutil.py +54 -0
  2957. psychopy/tests/test_liaison/test_Liaison.py +275 -0
  2958. psychopy/tests/test_misc/__init__.py +0 -0
  2959. psychopy/tests/test_misc/memory_usage.py +164 -0
  2960. psychopy/tests/test_misc/test_GammaFun.py +15 -0
  2961. psychopy/tests/test_misc/test_clock.py +63 -0
  2962. psychopy/tests/test_misc/test_color.py +205 -0
  2963. psychopy/tests/test_misc/test_core.py +451 -0
  2964. psychopy/tests/test_misc/test_event.py +308 -0
  2965. psychopy/tests/test_misc/test_info.py +18 -0
  2966. psychopy/tests/test_misc/test_layout.py +49 -0
  2967. psychopy/tests/test_misc/test_locale.py +38 -0
  2968. psychopy/tests/test_misc/test_web.py +22 -0
  2969. psychopy/tests/test_monitors/test_monitors.py +91 -0
  2970. psychopy/tests/test_plugins/__init__.py +0 -0
  2971. psychopy/tests/test_plugins/test_plugin_stubs.py +125 -0
  2972. psychopy/tests/test_preferences/__init__.py +0 -0
  2973. psychopy/tests/test_preferences/test_prefs.py +28 -0
  2974. psychopy/tests/test_session/test_Session.py +257 -0
  2975. psychopy/tests/test_sound/__init__.py +0 -0
  2976. psychopy/tests/test_sound/test_audioclip.py +331 -0
  2977. psychopy/tests/test_sound/test_hamming.py +45 -0
  2978. psychopy/tests/test_sound/test_sound.py +138 -0
  2979. psychopy/tests/test_sound/test_sound_pygame.py +67 -0
  2980. psychopy/tests/test_tools/test_animationtools.py +51 -0
  2981. psychopy/tests/test_tools/test_arraytools.py +242 -0
  2982. psychopy/tests/test_tools/test_attributetools.py +257 -0
  2983. psychopy/tests/test_tools/test_colorspacetools.py +150 -0
  2984. psychopy/tests/test_tools/test_environmenttools.py +52 -0
  2985. psychopy/tests/test_tools/test_fileerrortools.py +97 -0
  2986. psychopy/tests/test_tools/test_filetools.py +104 -0
  2987. psychopy/tests/test_tools/test_imagetools.py +57 -0
  2988. psychopy/tests/test_tools/test_mathtools.py +688 -0
  2989. psychopy/tests/test_tools/test_stringtools.py +143 -0
  2990. psychopy/tests/test_tools/test_versionchooser.py +209 -0
  2991. psychopy/tests/test_tools/test_viewtools.py +168 -0
  2992. psychopy/tests/test_validators/__init__.py +0 -0
  2993. psychopy/tests/test_validators/test_voicekeyValidator.py +95 -0
  2994. psychopy/tests/test_visual/__init__.py +0 -0
  2995. psychopy/tests/test_visual/measure_parity.py +243 -0
  2996. psychopy/tests/test_visual/test_all_stimuli.py +655 -0
  2997. psychopy/tests/test_visual/test_basevisual.py +564 -0
  2998. psychopy/tests/test_visual/test_brush.py +68 -0
  2999. psychopy/tests/test_visual/test_button.py +15 -0
  3000. psychopy/tests/test_visual/test_circle.py +74 -0
  3001. psychopy/tests/test_visual/test_contains_overlaps.py +242 -0
  3002. psychopy/tests/test_visual/test_custommouse.py +47 -0
  3003. psychopy/tests/test_visual/test_dots.py +155 -0
  3004. psychopy/tests/test_visual/test_form.py +414 -0
  3005. psychopy/tests/test_visual/test_framepacking.py +41 -0
  3006. psychopy/tests/test_visual/test_gamma.py +152 -0
  3007. psychopy/tests/test_visual/test_glfw_backend.py +14 -0
  3008. psychopy/tests/test_visual/test_image.py +219 -0
  3009. psychopy/tests/test_visual/test_panorama.py +41 -0
  3010. psychopy/tests/test_visual/test_progress.py +96 -0
  3011. psychopy/tests/test_visual/test_projections.py +215 -0
  3012. psychopy/tests/test_visual/test_projections_interactive.py +163 -0
  3013. psychopy/tests/test_visual/test_roi.py +105 -0
  3014. psychopy/tests/test_visual/test_shape.py +23 -0
  3015. psychopy/tests/test_visual/test_slider.py +328 -0
  3016. psychopy/tests/test_visual/test_target.py +35 -0
  3017. psychopy/tests/test_visual/test_textbox.py +508 -0
  3018. psychopy/tests/test_visual/test_winFlipTiming.py +95 -0
  3019. psychopy/tests/test_visual/test_winScalePos.py +78 -0
  3020. psychopy/tests/test_visual/test_window.py +124 -0
  3021. psychopy/tests/utils.py +372 -0
  3022. psychopy/tools/LineBreak.txt +3597 -0
  3023. psychopy/tools/__init__.py +9 -0
  3024. psychopy/tools/animationtools.py +49 -0
  3025. psychopy/tools/apptools.py +32 -0
  3026. psychopy/tools/arraytools.py +561 -0
  3027. psychopy/tools/attributetools.py +263 -0
  3028. psychopy/tools/audiotools.py +361 -0
  3029. psychopy/tools/colorspacetools.py +717 -0
  3030. psychopy/tools/coordinatetools.py +104 -0
  3031. psychopy/tools/environmenttools.py +62 -0
  3032. psychopy/tools/fileerrortools.py +66 -0
  3033. psychopy/tools/filetools.py +406 -0
  3034. psychopy/tools/fontmanager.py +1065 -0
  3035. psychopy/tools/gltools.py +7367 -0
  3036. psychopy/tools/imagetools.py +65 -0
  3037. psychopy/tools/linebreak.py +322 -0
  3038. psychopy/tools/mathtools.py +4910 -0
  3039. psychopy/tools/monitorunittools.py +276 -0
  3040. psychopy/tools/movietools.py +1111 -0
  3041. psychopy/tools/pkgtools.py +654 -0
  3042. psychopy/tools/plottools.py +25 -0
  3043. psychopy/tools/rifttools.py +76 -0
  3044. psychopy/tools/stereotools.py +9 -0
  3045. psychopy/tools/stimulustools.py +198 -0
  3046. psychopy/tools/stringtools.py +466 -0
  3047. psychopy/tools/systemtools.py +1331 -0
  3048. psychopy/tools/typetools.py +52 -0
  3049. psychopy/tools/unittools.py +16 -0
  3050. psychopy/tools/versionchooser.py +604 -0
  3051. psychopy/tools/viewtools.py +1068 -0
  3052. psychopy/tools/wizard.py +804 -0
  3053. psychopy/validation/__init__.py +6 -0
  3054. psychopy/validation/audio.py +78 -0
  3055. psychopy/validation/visual.py +119 -0
  3056. psychopy/visual/__init__.py +121 -0
  3057. psychopy/visual/aperture.py +333 -0
  3058. psychopy/visual/backends/__init__.py +77 -0
  3059. psychopy/visual/backends/_base.py +481 -0
  3060. psychopy/visual/backends/gamma.py +349 -0
  3061. psychopy/visual/backends/glfwbackend.py +24 -0
  3062. psychopy/visual/backends/pygamebackend.py +343 -0
  3063. psychopy/visual/backends/pygletbackend.py +970 -0
  3064. psychopy/visual/basevisual.py +2027 -0
  3065. psychopy/visual/brush.py +204 -0
  3066. psychopy/visual/bufferimage.py +311 -0
  3067. psychopy/visual/button.py +194 -0
  3068. psychopy/visual/circle.py +165 -0
  3069. psychopy/visual/custommouse.py +263 -0
  3070. psychopy/visual/dot.py +734 -0
  3071. psychopy/visual/dropdown.py +165 -0
  3072. psychopy/visual/elementarray.py +802 -0
  3073. psychopy/visual/filters.py +419 -0
  3074. psychopy/visual/form.py +1195 -0
  3075. psychopy/visual/globalVars.py +24 -0
  3076. psychopy/visual/grating.py +581 -0
  3077. psychopy/visual/helpers.py +336 -0
  3078. psychopy/visual/image.py +438 -0
  3079. psychopy/visual/line.py +227 -0
  3080. psychopy/visual/movie.py +12 -0
  3081. psychopy/visual/movie2.py +21 -0
  3082. psychopy/visual/movie3.py +18 -0
  3083. psychopy/visual/movies/__init__.py +2334 -0
  3084. psychopy/visual/movies/frame.py +258 -0
  3085. psychopy/visual/movies/metadata.py +242 -0
  3086. psychopy/visual/movies/players/_base.py +364 -0
  3087. psychopy/visual/nnlvs.py +830 -0
  3088. psychopy/visual/noise.py +32 -0
  3089. psychopy/visual/panorama.py +313 -0
  3090. psychopy/visual/patch.py +21 -0
  3091. psychopy/visual/pie.py +237 -0
  3092. psychopy/visual/polygon.py +226 -0
  3093. psychopy/visual/progress.py +313 -0
  3094. psychopy/visual/radial.py +29 -0
  3095. psychopy/visual/ratingscale.py +18 -0
  3096. psychopy/visual/rect.py +195 -0
  3097. psychopy/visual/rift.py +2660 -0
  3098. psychopy/visual/roi.py +141 -0
  3099. psychopy/visual/secondorder.py +27 -0
  3100. psychopy/visual/shaders.py +787 -0
  3101. psychopy/visual/shape.py +897 -0
  3102. psychopy/visual/simpleimage.py +303 -0
  3103. psychopy/visual/slider.py +1222 -0
  3104. psychopy/visual/stim3d.py +2109 -0
  3105. psychopy/visual/target.py +278 -0
  3106. psychopy/visual/text.py +769 -0
  3107. psychopy/visual/textbox/__init__.py +1280 -0
  3108. psychopy/visual/textbox/fontmanager.py +574 -0
  3109. psychopy/visual/textbox/parsedtext.py +317 -0
  3110. psychopy/visual/textbox/textgrid.py +278 -0
  3111. psychopy/visual/textbox/textureatlas.py +248 -0
  3112. psychopy/visual/textbox2/__init__.py +4 -0
  3113. psychopy/visual/textbox2/textbox2.py +1970 -0
  3114. psychopy/visual/vlcmoviestim.py +1294 -0
  3115. psychopy/visual/window.py +3910 -0
  3116. psychopy/visual/windowframepack.py +86 -0
  3117. psychopy/visual/windowwarp.py +457 -0
  3118. psychopy/voicekey/__init__.py +56 -0
  3119. psychopy/voicekey/labjack_vks.py +9 -0
  3120. psychopy/voicekey/parallel_vks.py +9 -0
  3121. psychopy/voicekey/vk_tools.py +131 -0
  3122. psychopy/web.py +289 -0
  3123. psychopy-2025.2.4.dist-info/METADATA +160 -0
  3124. psychopy-2025.2.4.dist-info/RECORD +3127 -0
  3125. psychopy-2025.2.4.dist-info/WHEEL +4 -0
  3126. psychopy-2025.2.4.dist-info/entry_points.txt +5 -0
  3127. psychopy-2025.2.4.dist-info/licenses/LICENSE +674 -0
@@ -0,0 +1,3100 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+
4
+ # Part of the PsychoPy library
5
+ # Copyright (C) 2009 Jonathan Peirce
6
+ # Distributed under the terms of the GNU General Public License (GPL).
7
+
8
+ from pathlib import Path
9
+
10
+ import wx
11
+ import wx.stc
12
+ import wx.richtext
13
+ import wx.py
14
+ import psychopy.app
15
+ from ..pavlovia_ui.search import SearchFrame
16
+ from ..pavlovia_ui.user import UserFrame
17
+ from ..themes.ui import ThemeSwitcher
18
+ from wx.html import HtmlEasyPrinting
19
+ from wx._core import wxAssertionError
20
+
21
+ import wx.lib.agw.aui as aui # some versions of phoenix
22
+
23
+ import os
24
+ import sys
25
+ import glob
26
+ import io
27
+ import threading
28
+ import bdb
29
+ import pickle
30
+ import time
31
+ import textwrap
32
+ import codecs
33
+
34
+ from .. import dialogs, ribbon
35
+ from ..stdout import stdOutRich
36
+ from .. import pavlovia_ui
37
+ from psychopy import logging, prefs
38
+ from psychopy.alerts._alerts import alert
39
+ from psychopy.localization import _translate
40
+ from ..utils import FileDropTarget, BasePsychopyToolbar, FrameSwitcher, updateDemosMenu
41
+ from ..ui import BaseAuiFrame
42
+ from psychopy.projects import pavlovia
43
+ import psychopy.app.pavlovia_ui.menu
44
+ import psychopy.app.plugin_manager.dialog
45
+ from psychopy.app.errorDlg import exceptionCallback
46
+ from psychopy.app.coder.codeEditorBase import BaseCodeEditor
47
+ from psychopy.app.coder.fileBrowser import FileBrowserPanel
48
+ from psychopy.app.coder.sourceTree import SourceTreePanel
49
+ from psychopy.app.themes import handlers, colors
50
+ from psychopy.app.coder.folding import CodeEditorFoldingMixin
51
+ from psychopy.app.stdout.stdOutRich import ScriptOutputPanel
52
+ from psychopy.app.coder.repl import PythonREPLCtrl
53
+ # from ..plugin_manager import PluginManagerFrame
54
+
55
+ try:
56
+ import jedi
57
+ if jedi.__version__ < "0.16":
58
+ logging.error(
59
+ "Need a newer version of package `jedi`. Currently using {}"
60
+ .format(jedi.__version__)
61
+ )
62
+ _hasJedi = True
63
+ jedi.settings.fast_parser = True
64
+ except ImportError:
65
+ logging.error(
66
+ "Package `jedi` not installed, code auto-completion and calltips will "
67
+ "not be available.")
68
+ _hasJedi = False
69
+
70
+ # advanced prefs (not set in prefs files)
71
+ prefTestSubset = ""
72
+ analysisLevel = 1
73
+ analyseAuto = True
74
+ runScripts = 'process'
75
+
76
+ try: # needed for wx.py shell
77
+ import code
78
+ haveCode = True
79
+ except Exception:
80
+ haveCode = False
81
+
82
+
83
+ def toPickle(filename, data):
84
+ """save data (of any sort) as a pickle file
85
+
86
+ simple wrapper of the cPickle module in core python
87
+ """
88
+ with io.open(filename, 'wb') as f:
89
+ pickle.dump(data, f)
90
+
91
+
92
+ def fromPickle(filename):
93
+ """load data (of any sort) from a pickle file
94
+
95
+ simple wrapper of the cPickle module in core python
96
+ """
97
+ with io.open(filename, 'rb') as f:
98
+ contents = pickle.load(f)
99
+
100
+ return contents
101
+
102
+
103
+ class Printer(HtmlEasyPrinting):
104
+ """bare-bones printing, no control over anything
105
+
106
+ from https://wiki.wxpython.org/Printing
107
+ """
108
+
109
+ def __init__(self):
110
+ HtmlEasyPrinting.__init__(self)
111
+
112
+ def GetHtmlText(self, text):
113
+ """Simple conversion of text."""
114
+
115
+ text = text.replace('&', '&amp;')
116
+ text = text.replace('<P>', '&#60;P&#62;')
117
+ text = text.replace('<BR>', '&#60;BR&#62;')
118
+ text = text.replace('<HR>', '&#60;HR&#62;')
119
+ text = text.replace('<p>', '&#60;p&#62;')
120
+ text = text.replace('<br>', '&#60;br&#62;')
121
+ text = text.replace('<hr>', '&#60;hr&#62;')
122
+ text = text.replace('\n\n', '<P>')
123
+ text = text.replace('\t', ' ') # tabs -> 4 spaces
124
+ text = text.replace(' ', '&nbsp;') # preserve indentation
125
+ html_text = text.replace('\n', '<BR>')
126
+ return html_text
127
+
128
+ def Print(self, text, doc_name):
129
+ self.SetStandardFonts(size=prefs.coder['codeFontSize'], normal_face="",
130
+ fixed_face=prefs.coder['codeFont'])
131
+
132
+ _, fname = os.path.split(doc_name)
133
+ self.SetHeader("Page @PAGENUM@ of @PAGESCNT@ - " + fname +
134
+ " (@DATE@ @TIME@)<HR>")
135
+ # use <tt> tag since we're dealing with old school HTML here
136
+ self.PrintText("<tt>" + self.GetHtmlText(text) + '</tt>', doc_name)
137
+
138
+
139
+ class ScriptThread(threading.Thread):
140
+ """A subclass of threading.Thread, with a kill() method.
141
+ """
142
+
143
+ def __init__(self, target, gui):
144
+ threading.Thread.__init__(self, target=target)
145
+ self.killed = False
146
+ self.gui = gui
147
+
148
+ def start(self):
149
+ """Start the thread.
150
+ """
151
+ self.__run_backup = self.run
152
+ self.run = self.__run # force the Thread to install our trace.
153
+ threading.Thread.start(self)
154
+
155
+ def __run(self):
156
+ """Hacked run function, which installs the trace.
157
+ """
158
+ sys.settrace(self.globaltrace)
159
+ self.__run_backup()
160
+ self.run = self.__run_backup
161
+ # we're done - send the App a message
162
+ self.gui.onProcessEnded(event=None)
163
+
164
+ def globaltrace(self, frame, why, arg):
165
+ if why == 'call':
166
+ return self.localtrace
167
+ else:
168
+ return None
169
+
170
+ def localtrace(self, frame, why, arg):
171
+ if self.killed:
172
+ if why == 'line':
173
+ raise SystemExit()
174
+ return self.localtrace
175
+
176
+ def kill(self):
177
+ self.killed = True
178
+
179
+
180
+ class PsychoDebugger(bdb.Bdb):
181
+ # this is based on effbot: http://effbot.org/librarybook/bdb.htm
182
+
183
+ def __init__(self):
184
+ bdb.Bdb.__init__(self)
185
+ self.starting = True
186
+
187
+ def user_call(self, frame, args):
188
+ name = frame.f_code.co_name or "<unknown>"
189
+ self.set_continue() # continue
190
+
191
+ def user_line(self, frame):
192
+ if self.starting:
193
+ self.starting = False
194
+ self.set_trace() # start tracing
195
+ else:
196
+ # arrived at breakpoint
197
+ name = frame.f_code.co_name or "<unknown>"
198
+ filename = self.canonic(frame.f_code.co_filename)
199
+ print("break at %s %i in %s" % (filename, frame.f_lineno, name))
200
+ self.set_continue() # continue to next breakpoint
201
+
202
+ def user_return(self, frame, value):
203
+ name = frame.f_code.co_name or "<unknown>"
204
+ self.set_continue() # continue
205
+
206
+ def user_exception(self, frame, exception):
207
+ name = frame.f_code.co_name or "<unknown>"
208
+ self.set_continue() # continue
209
+
210
+ def quit(self):
211
+ self._user_requested_quit = 1
212
+ self.set_quit()
213
+ return 1
214
+
215
+
216
+ class UnitTestFrame(wx.Frame):
217
+ class _unitTestOutRich(stdOutRich.StdOutRich):
218
+ """richTextCtrl window for unit test output"""
219
+
220
+ def __init__(self, parent, style, size=None, **kwargs):
221
+ stdOutRich.StdOutRich.__init__(self, parent=parent, style=style,
222
+ size=size)
223
+ self.bad = [150, 0, 0]
224
+ self.good = [0, 150, 0]
225
+ self.skip = [170, 170, 170]
226
+ self.png = []
227
+
228
+ def write(self, inStr):
229
+ self.MoveEnd() # always 'append' text rather than 'writing' it
230
+ for thisLine in inStr.splitlines(True):
231
+ if not isinstance(thisLine, str):
232
+ thisLine = str(thisLine)
233
+ if thisLine.startswith('OK'):
234
+ self.BeginBold()
235
+ self.BeginTextColour(self.good)
236
+ self.WriteText("OK")
237
+ self.EndTextColour()
238
+ self.EndBold()
239
+ self.WriteText(thisLine[2:]) # for OK (SKIP=xx)
240
+ self.parent.status = 1
241
+ elif thisLine.startswith('#####'):
242
+ self.BeginBold()
243
+ self.WriteText(thisLine)
244
+ self.EndBold()
245
+ elif 'FAIL' in thisLine or 'ERROR' in thisLine:
246
+ self.BeginTextColour(self.bad)
247
+ self.WriteText(thisLine)
248
+ self.EndTextColour()
249
+ self.parent.status = -1
250
+ elif thisLine.find('SKIP') > -1:
251
+ self.BeginTextColour(self.skip)
252
+ self.WriteText(thisLine.strip())
253
+ # show the new image, double size for easier viewing:
254
+ if thisLine.strip().endswith('.png'):
255
+ newImg = thisLine.split()[-1]
256
+ img = os.path.join(self.parent.paths['tests'],
257
+ 'data', newImg)
258
+ self.png.append(wx.Image(img, wx.BITMAP_TYPE_ANY))
259
+ self.MoveEnd()
260
+ self.WriteImage(self.png[-1])
261
+ self.MoveEnd()
262
+ self.WriteText('\n')
263
+ self.EndTextColour()
264
+ else: # line to write as simple text
265
+ self.WriteText(thisLine)
266
+ if thisLine.find('Saved copy of actual frame') > -1:
267
+ # show the new images, double size for easier viewing:
268
+ newImg = [f for f in thisLine.split()
269
+ if f.find('_local.png') > -1]
270
+ newFile = newImg[0]
271
+ origFile = newFile.replace('_local.png', '.png')
272
+ img = os.path.join(self.parent.paths['tests'], origFile)
273
+ self.png.append(wx.Image(img, wx.BITMAP_TYPE_ANY))
274
+ self.MoveEnd()
275
+ self.WriteImage(self.png[-1])
276
+ self.MoveEnd()
277
+ self.WriteText('= ' + origFile + '; ')
278
+ img = os.path.join(self.parent.paths['tests'], newFile)
279
+ self.png.append(wx.Image(img, wx.BITMAP_TYPE_ANY))
280
+ self.MoveEnd()
281
+ self.WriteImage(self.png[-1])
282
+ self.MoveEnd()
283
+ self.WriteText('= ' + newFile + '; ')
284
+
285
+ self.MoveEnd() # go to end of stdout so user can see updated text
286
+ self.ShowPosition(self.GetLastPosition())
287
+
288
+ def __init__(self, parent=None, ID=-1,
289
+ title=_translate('PsychoPy unit testing'),
290
+ files=(), app=None):
291
+ self.app = app
292
+ self.frameType = 'unittest'
293
+ self.prefs = self.app.prefs
294
+ self.paths = self.app.prefs.paths
295
+ # deduce the script for running the tests
296
+ try:
297
+ import pytest
298
+ havePytest = True
299
+ except Exception:
300
+ havePytest = False
301
+ self.runpyPath = os.path.join(self.prefs.paths['tests'], 'run.py')
302
+ if sys.platform != 'win32':
303
+ self.runpyPath = self.runpyPath.replace(' ', r'\ ')
304
+ # setup the frame
305
+ self.IDs = self.app.IDs
306
+ # to right, so Cancel button is clickable during a long test
307
+ wx.Frame.__init__(self, parent, ID, title, pos=(450, 45))
308
+ self.scriptProcess = None
309
+ self.runAllText = 'all tests'
310
+ border = 10
311
+ # status = outcome of the last test run: -1 fail, 0 not run, +1 ok:
312
+ self.status = 0
313
+
314
+ # create menu items
315
+ menuBar = wx.MenuBar()
316
+ self.menuTests = wx.Menu()
317
+ menuBar.Append(self.menuTests, _translate('&Tests'))
318
+ _run = self.app.keys['runScript']
319
+ self.menuTests.Append(wx.ID_APPLY,
320
+ _translate("&Run tests\t%s") % _run)
321
+ self.Bind(wx.EVT_MENU, self.onRunTests, id=wx.ID_APPLY)
322
+ self.menuTests.AppendSeparator()
323
+ self.menuTests.Append(wx.ID_CLOSE, _translate(
324
+ "&Close tests panel\t%s") % self.app.keys['close'])
325
+ self.Bind(wx.EVT_MENU, self.onCloseTests, id=wx.ID_CLOSE)
326
+ _switch = self.app.keys['switchToCoder']
327
+ self.menuTests.Append(wx.ID_ANY,
328
+ _translate("Go to &Coder view\t%s") % _switch,
329
+ _translate("Go to the Coder view"))
330
+ self.Bind(wx.EVT_MENU, self.app.showCoder)
331
+ # -------------quit
332
+ self.menuTests.AppendSeparator()
333
+ _quit = self.app.keys['quit']
334
+ self.menuTests.Append(wx.ID_EXIT,
335
+ _translate("&Quit\t%s") % _quit,
336
+ _translate("Terminate PsychoPy"))
337
+ self.Bind(wx.EVT_MENU, self.app.quit, id=wx.ID_EXIT)
338
+ item = self.menuTests.Append(
339
+ wx.ID_PREFERENCES, _translate("&Preferences"))
340
+ self.Bind(wx.EVT_MENU, self.app.showPrefs, item)
341
+
342
+ self.SetMenuBar(menuBar)
343
+
344
+ # create controls
345
+ buttonsSizer = wx.BoxSizer(wx.HORIZONTAL)
346
+ _style = wx.TE_MULTILINE | wx.TE_READONLY | wx.EXPAND | wx.GROW
347
+ _font = self.prefs.coder['outputFont']
348
+ _fsize = self.prefs.coder['outputFontSize']
349
+ self.outputWindow = self._unitTestOutRich(self, style=_style,
350
+ size=wx.Size(750, 500),
351
+ font=_font, fontSize=_fsize)
352
+
353
+ knownTests = glob.glob(os.path.join(self.paths['tests'], 'test*'))
354
+ knownTestList = [t.split(os.sep)[-1] for t in knownTests
355
+ if t.endswith('.py') or os.path.isdir(t)]
356
+ self.knownTestList = [self.runAllText] + knownTestList
357
+ self.testSelect = wx.Choice(parent=self, id=-1, pos=(border, border),
358
+ choices=self.knownTestList)
359
+ tip = _translate(
360
+ "Select the test(s) to run, from:\npsychopy/tests/test*")
361
+ self.testSelect.SetToolTip(wx.ToolTip(tip))
362
+ prefTestSubset = self.prefs.appData['testSubset']
363
+ # preselect the testGroup in the drop-down menu for display:
364
+ if prefTestSubset in self.knownTestList:
365
+ self.testSelect.SetStringSelection(prefTestSubset)
366
+
367
+ self.btnRun = wx.Button(parent=self, label=_translate("Run tests"))
368
+ self.btnRun.Bind(wx.EVT_BUTTON, self.onRunTests)
369
+ self.btnCancel = wx.Button(parent=self, label=_translate("Cancel"))
370
+ self.btnCancel.Bind(wx.EVT_BUTTON, self.onCancelTests)
371
+ self.btnCancel.Disable()
372
+ self.Bind(wx.EVT_END_PROCESS, self.onTestsEnded)
373
+
374
+ self.chkCoverage = wx.CheckBox(
375
+ parent=self, label=_translate("Coverage Report"))
376
+ _tip = _translate("Include coverage report (requires coverage module)")
377
+ self.chkCoverage.SetToolTip(wx.ToolTip(_tip))
378
+ self.chkCoverage.Disable()
379
+ self.chkAllStdOut = wx.CheckBox(
380
+ parent=self, label=_translate("ALL stdout"))
381
+ _tip = _translate(
382
+ "Report all printed output & show any new rms-test images")
383
+ self.chkAllStdOut.SetToolTip(wx.ToolTip(_tip))
384
+ self.chkAllStdOut.Disable()
385
+ self.Bind(wx.EVT_IDLE, self.onIdle)
386
+ self.SetDefaultItem(self.btnRun)
387
+
388
+ # arrange controls
389
+ buttonsSizer.Add(self.chkCoverage, 0, wx.LEFT |
390
+ wx.RIGHT | wx.TOP, border=border)
391
+ buttonsSizer.Add(self.chkAllStdOut, 0, wx.LEFT |
392
+ wx.RIGHT | wx.TOP, border=border)
393
+ buttonsSizer.Add(self.btnRun, 0, wx.LEFT |
394
+ wx.RIGHT | wx.TOP, border=border)
395
+ buttonsSizer.Add(self.btnCancel, 0, wx.LEFT |
396
+ wx.RIGHT | wx.TOP, border=border)
397
+ self.sizer = wx.BoxSizer(orient=wx.VERTICAL)
398
+ self.sizer.Add(buttonsSizer, 0, wx.ALIGN_RIGHT)
399
+ self.sizer.Add(self.outputWindow, 0, wx.ALL |
400
+ wx.EXPAND | wx.GROW, border=border)
401
+ self.SetSizerAndFit(self.sizer)
402
+ self.Show()
403
+
404
+ def onRunTests(self, event=None):
405
+ """Run the unit tests
406
+ """
407
+ self.status = 0
408
+
409
+ # create process
410
+ # self is the parent (which will receive an event when the process
411
+ # ends)
412
+ self.scriptProcess = wx.Process(self)
413
+ self.scriptProcess.Redirect() # catch the stdout/stdin
414
+ # include coverage report?
415
+ if self.chkCoverage.GetValue():
416
+ coverage = ' cover'
417
+ else:
418
+ coverage = ''
419
+ # printing ALL output?
420
+ if self.chkAllStdOut.GetValue():
421
+ allStdout = ' -s'
422
+ else:
423
+ allStdout = ''
424
+ # what subset of tests? (all tests == '')
425
+ tselect = self.knownTestList[self.testSelect.GetCurrentSelection()]
426
+ if tselect == self.runAllText:
427
+ tselect = ''
428
+ testSubset = tselect
429
+ # self.prefs.appData['testSubset'] = tselect # in onIdle
430
+
431
+ # launch the tests using wx.Execute():
432
+ self.btnRun.Disable()
433
+ self.btnCancel.Enable()
434
+ if sys.platform == 'win32':
435
+ testSubset = ' ' + testSubset
436
+ args = (sys.executable, self.runpyPath, coverage,
437
+ allStdout, testSubset)
438
+ command = '"%s" -u "%s" %s%s%s' % args # quotes handle spaces
439
+ print(command)
440
+ self.scriptProcessID = wx.Execute(
441
+ command, wx.EXEC_ASYNC, self.scriptProcess)
442
+ # self.scriptProcessID = wx.Execute(command,
443
+ # # wx.EXEC_ASYNC| wx.EXEC_NOHIDE, self.scriptProcess)
444
+ else:
445
+ testSubset = ' ' + testSubset.replace(' ', r'\ ') # protect spaces
446
+ args = (sys.executable, self.runpyPath, coverage,
447
+ allStdout, testSubset)
448
+ command = '%s -u %s%s%s%s' % args
449
+ _opt = wx.EXEC_ASYNC | wx.EXEC_MAKE_GROUP_LEADER
450
+ self.scriptProcessID = wx.Execute(command,
451
+ _opt, self.scriptProcess)
452
+ msg = "\n##### Testing: %s%s%s%s #####\n\n" % (
453
+ self.runpyPath, coverage, allStdout, testSubset)
454
+ self.outputWindow.write(msg)
455
+ _notNormUnits = self.app.prefs.general['units'] != 'norm'
456
+ if _notNormUnits and 'testVisual' in testSubset:
457
+ msg = "Note: default window units = '%s' (in prefs); for visual tests 'norm' is recommended.\n\n"
458
+ self.outputWindow.write(msg % self.app.prefs.general['units'])
459
+
460
+ def onCancelTests(self, event=None):
461
+ if self.scriptProcess != None:
462
+ self.scriptProcess.Kill(
463
+ self.scriptProcessID, wx.SIGTERM, wx.SIGKILL)
464
+ self.scriptProcess = None
465
+ self.scriptProcessID = None
466
+ self.outputWindow.write("\n --->> cancelled <<---\n\n")
467
+ self.status = 0
468
+ self.onTestsEnded()
469
+
470
+ def onIdle(self, event=None):
471
+ # auto-save last selected subset:
472
+ self.prefs.appData['testSubset'] = self.knownTestList[
473
+ self.testSelect.GetCurrentSelection()]
474
+ if self.scriptProcess != None:
475
+ if self.scriptProcess.IsInputAvailable():
476
+ stream = self.scriptProcess.GetInputStream()
477
+ text = stream.read()
478
+ self.outputWindow.write(text)
479
+ if self.scriptProcess.IsErrorAvailable():
480
+ stream = self.scriptProcess.GetErrorStream()
481
+ text = stream.read()
482
+ self.outputWindow.write(text)
483
+
484
+ def onTestsEnded(self, event=None):
485
+ self.onIdle() # so that any final stdout/err gets written
486
+ self.outputWindow.flush()
487
+ self.btnRun.Enable()
488
+ self.btnCancel.Disable()
489
+
490
+ def onURL(self, evt):
491
+ """decompose the URL of a file and line number"""
492
+ # "C:\Program Files\wxPython2.8 Docs and Demos\samples\hangman\hangman.py"
493
+ tmpFilename, tmpLineNumber = evt.GetString().rsplit('", line ', 1)
494
+ filename = tmpFilename.split('File "', 1)[1]
495
+ try:
496
+ lineNumber = int(tmpLineNumber.split(',')[0])
497
+ except ValueError:
498
+ lineNumber = int(tmpLineNumber.split()[0])
499
+ self.app.coder.gotoLine(filename, lineNumber)
500
+
501
+ def onCloseTests(self, evt):
502
+ self.Destroy()
503
+
504
+
505
+ class CodeEditor(BaseCodeEditor, CodeEditorFoldingMixin, handlers.ThemeMixin):
506
+ """Code editor class for the Coder GUI.
507
+ """
508
+ def __init__(self, parent, ID, frame,
509
+ # set the viewer to be small, then it will increase with aui
510
+ # control
511
+ pos=wx.DefaultPosition, size=wx.Size(100, 100),
512
+ style=wx.BORDER_NONE, readonly=False):
513
+ BaseCodeEditor.__init__(self, parent, ID, pos, size, style)
514
+
515
+ self.coder = frame
516
+ self.prefs = self.coder.prefs
517
+ self.paths = self.coder.paths
518
+ self.app = self.coder.app
519
+ self.SetViewWhiteSpace(self.coder.appData['showWhitespace'])
520
+ self.SetViewEOL(self.coder.appData['showEOLs'])
521
+ self.Bind(wx.stc.EVT_STC_MODIFIED, self.onModified)
522
+ self.Bind(wx.stc.EVT_STC_UPDATEUI, self.OnUpdateUI)
523
+ self.Bind(wx.EVT_KEY_DOWN, self.OnKeyPressed)
524
+ self.Bind(wx.EVT_KEY_UP, self.OnKeyReleased)
525
+
526
+ if hasattr(self, 'OnMarginClick'):
527
+ self.Bind(wx.stc.EVT_STC_MARGINCLICK, self.OnMarginClick)
528
+
529
+ # black-and-white text signals read-only file open in Coder window
530
+ # if not readonly:
531
+ # self.setFonts()
532
+ self.SetDropTarget(FileDropTarget(targetFrame=self.coder))
533
+
534
+ # set to python syntax code coloring
535
+ self.setLexerFromFileName()
536
+
537
+ # Keep track of visual aspects of the source tree viewer when working
538
+ # with this document. This makes sure the tree maintains it's state when
539
+ # moving between documents.
540
+ self.expandedItems = {}
541
+
542
+ # show the long line edge guide, enabled if >0
543
+ self.edgeGuideColumn = self.coder.prefs['edgeGuideColumn']
544
+ self.edgeGuideVisible = self.edgeGuideColumn > 0
545
+
546
+ # give a little space between the margin and text
547
+ self.SetMarginLeft(4)
548
+
549
+ # whitespace information
550
+ self.indentSize = self.GetIndent()
551
+ self.newlines = '/n'
552
+
553
+ # caret info, these are updated by calling updateCaretInfo()
554
+ self.caretCurrentPos = self.GetCurrentPos()
555
+ self.caretVisible, caretColumn, caretLine = self.PositionToXY(
556
+ self.caretCurrentPos)
557
+
558
+ if self.caretVisible:
559
+ self.caretColumn = caretColumn
560
+ self.caretLine = caretLine
561
+ else:
562
+ self.caretLine = self.GetCurrentLine()
563
+ self.caretColumn = self.GetLineLength(self.caretLine)
564
+
565
+ # where does the line text start?
566
+ self.caretLineIndentCol = \
567
+ self.GetColumn(self.GetLineIndentPosition(self.caretLine))
568
+
569
+ # what is the indent level of the line the caret is located
570
+ self.caretLineIndentLevel = self.caretLineIndentCol / self.indentSize
571
+
572
+ # is the caret at an indentation level?
573
+ self.caretAtIndentLevel = \
574
+ (self.caretLineIndentCol % self.indentSize) == 0
575
+
576
+ # # should hitting backspace result in an untab?
577
+ # self.shouldBackspaceUntab = \
578
+ # self.caretAtIndentLevel and \
579
+ # 0 < self.caretColumn <= self.caretLineIndentCol
580
+ self.SetBackSpaceUnIndents(True)
581
+
582
+ # set the current line and column in the status bar
583
+ self.coder.SetStatusText(
584
+ 'Line: {} Col: {}'.format(
585
+ self.caretLine + 1, self.caretColumn + 1), 1)
586
+
587
+ # calltips
588
+ self.CallTipSetBackground(colors.app['tab_bg'])
589
+ self.CallTipSetForeground(colors.app['text'])
590
+ self.CallTipSetForegroundHighlight(colors.app['text'])
591
+ self.AutoCompSetIgnoreCase(True)
592
+ self.AutoCompSetAutoHide(True)
593
+ self.AutoCompStops('. ')
594
+ self.openBrackets = 0
595
+
596
+ # better font rendering and less flicker on Windows by using Direct2D
597
+ # for rendering instead of GDI
598
+ if wx.Platform == '__WXMSW__':
599
+ self.SetTechnology(3)
600
+
601
+ # double buffered better rendering except if retina
602
+ self.SetDoubleBuffered(not self.coder.isRetina)
603
+
604
+ self.theme = self.app.prefs.app['theme']
605
+
606
+ def setFonts(self):
607
+ """Make some styles, The lexer defines what each style is used for,
608
+ we just have to define what each style looks like. This set is
609
+ adapted from Scintilla sample property files."""
610
+
611
+ if wx.Platform == '__WXMSW__':
612
+ faces = {'size': 10}
613
+ elif wx.Platform == '__WXMAC__':
614
+ faces = {'size': 14}
615
+ else:
616
+ faces = {'size': 12}
617
+ if self.coder.prefs['codeFontSize']:
618
+ faces['size'] = int(self.coder.prefs['codeFontSize'])
619
+ faces['small'] = faces['size'] - 2
620
+ # Global default styles for all languages
621
+ # ,'Arial'] # use arial as backup
622
+ faces['code'] = self.coder.prefs['codeFont']
623
+ # ,'Arial'] # use arial as backup
624
+ faces['comment'] = self.coder.prefs['codeFont']
625
+
626
+ # apply the theme to the lexer
627
+ self.theme = self.coder.app.prefs.app['theme']
628
+
629
+ def setLexerFromFileName(self):
630
+ """Set the lexer to one that best matches the file name."""
631
+ # best matching lexers for a given file type
632
+ lexers = {'Python': 'python',
633
+ 'HTML': 'html',
634
+ 'C/C++': 'cpp',
635
+ 'GLSL': 'cpp',
636
+ 'Arduino': 'cpp',
637
+ 'MATLAB': 'matlab',
638
+ 'YAML': 'yaml',
639
+ 'R': 'R',
640
+ 'JavaScript': 'cpp',
641
+ 'JSON': 'json',
642
+ 'Markdown': 'markdown',
643
+ 'Plain Text': 'null',
644
+ }
645
+ self.setLexer(lexers[self.getFileType()])
646
+
647
+ def getFileType(self):
648
+ """Get the file type from the extension."""
649
+ if os.path.isabs(self.filename):
650
+ _, filen = os.path.split(self.filename)
651
+ else:
652
+ filen = self.filename
653
+
654
+ # lower case the file name
655
+ filen = filen.lower()
656
+
657
+ if any([filen.endswith(i) for i in ( # python/cython files
658
+ '.py', '.pyx', '.pxd', '.pxi')]):
659
+ return 'Python'
660
+ elif filen.endswith('html'): # html file
661
+ return 'HTML'
662
+ elif any([filen.endswith(i) for i in (
663
+ '.cpp', '.c', '.h', '.cxx', '.hxx' '.mex', '.hpp')]): # c-like
664
+ return 'C/C++'
665
+ elif any([filen.endswith(i) for i in (
666
+ '.glsl', '.vert', '.frag')]): # OpenGL shader program
667
+ return 'GLSL'
668
+ elif filen.endswith('.m'): # MATLAB
669
+ return 'MATLAB'
670
+ elif filen.endswith('.ino'): # Arduino
671
+ return 'Arduino'
672
+ elif filen.endswith('.r'): # R
673
+ return 'R'
674
+ elif filen.endswith('.yaml'): # YAML
675
+ return 'YAML'
676
+ elif filen.endswith('.js'): # JavaScript
677
+ return 'JavaScript'
678
+ elif filen.endswith('.json'): # JSON
679
+ return 'JSON'
680
+ elif filen.endswith('.md'): # Markdown
681
+ return 'Markdown'
682
+ else:
683
+ return 'Plain Text' # default, null lexer used
684
+
685
+ def getTextUptoCaret(self):
686
+ """Get the text up to the caret."""
687
+ return self.GetTextRange(0, self.caretCurrentPos)
688
+
689
+ def OnKeyReleased(self, event):
690
+ """Called after a key is released."""
691
+ if hasattr(self.coder, "useAutoComp"):
692
+ keyCode = event.GetKeyCode()
693
+ _mods = event.GetModifiers()
694
+ if keyCode == ord('.'):
695
+ if self.coder.useAutoComp:
696
+ # A dot was entered, get suggestions if part of a qualified name
697
+ wx.CallAfter(self.ShowAutoCompleteList) # defer
698
+ else:
699
+ self.coder.SetStatusText(
700
+ 'Press Ctrl+Space to show code completions', 0)
701
+ elif keyCode == ord('9') and wx.MOD_SHIFT == _mods:
702
+ # A left bracket was entered, check if there is a calltip available
703
+ if self.coder.useAutoComp:
704
+ if not self.CallTipActive():
705
+ wx.CallAfter(self.ShowCalltip)
706
+
707
+ self.openBrackets += 1
708
+ else:
709
+ self.coder.SetStatusText(
710
+ 'Press Ctrl+Space to show calltip', 0)
711
+ elif keyCode == ord('0') and wx.MOD_SHIFT == _mods: # close if brace matches
712
+ if self.CallTipActive():
713
+ self.openBrackets -= 1
714
+ if self.openBrackets <= 0:
715
+ self.CallTipCancel()
716
+ self.openBrackets = 0
717
+ else:
718
+ self.coder.SetStatusText('', 0)
719
+
720
+ event.Skip()
721
+
722
+ def OnKeyPressed(self, event):
723
+ """Called when a key is pressed."""
724
+ # various stuff to handle code completion and tooltips
725
+ # enable in the _-init__
726
+ keyCode = event.GetKeyCode()
727
+ _mods = event.GetModifiers()
728
+ # handle some special keys
729
+ if keyCode == ord('[') and wx.MOD_CONTROL == _mods:
730
+ self.indentSelection(-4)
731
+ # if there are no characters on the line then also move caret to
732
+ # end of indentation
733
+ txt, charPos = self.GetCurLine()
734
+ if charPos == 0:
735
+ # if caret is at start of line, move to start of text instead
736
+ self.VCHome()
737
+ elif keyCode == ord(']') and wx.MOD_CONTROL == _mods:
738
+ self.indentSelection(4)
739
+ # if there are no characters on the line then also move caret to
740
+ # end of indentation
741
+ txt, charPos = self.GetCurLine()
742
+ if charPos == 0:
743
+ # if caret is at start of line, move to start of text instead
744
+ self.VCHome()
745
+
746
+ elif keyCode == ord('/') and wx.MOD_CONTROL == _mods:
747
+ self.commentLines()
748
+ elif keyCode == ord('/') and wx.MOD_CONTROL | wx.MOD_SHIFT == _mods:
749
+ self.uncommentLines()
750
+
751
+ # show completions, very simple at this point
752
+ elif keyCode == wx.WXK_SPACE and wx.MOD_CONTROL == _mods:
753
+ self.ShowAutoCompleteList()
754
+
755
+ # show a calltip with signiture
756
+ elif keyCode == wx.WXK_SPACE and wx.MOD_CONTROL | wx.MOD_SHIFT == _mods:
757
+ self.ShowCalltip()
758
+
759
+ elif keyCode == wx.WXK_ESCAPE: # close overlays
760
+ if self.AutoCompActive():
761
+ self.AutoCompCancel() # close the auto completion list
762
+ if self.CallTipActive():
763
+ self.CallTipCancel()
764
+ self.openBrackets = 0
765
+
766
+ elif keyCode == wx.WXK_BACK:
767
+ if self.CallTipActive():
768
+ # check if we deleted any brackets
769
+ if self.GetCharAt(self.GetCurrentPos()-1) == ord('('):
770
+ self.openBrackets -= 1
771
+ elif self.GetCharAt(self.GetCurrentPos()-1) == ord(')'):
772
+ self.openBrackets += 1
773
+
774
+ # cancel the calltip if we deleted al the brackets
775
+ if self.openBrackets <= 0:
776
+ self.CallTipCancel()
777
+ self.openBrackets = 0
778
+
779
+ elif keyCode == wx.WXK_RETURN: # and not self.AutoCompActive():
780
+ if not self.AutoCompActive():
781
+ # process end of line and then do smart indentation
782
+ event.Skip(False)
783
+ self.CmdKeyExecute(wx.stc.STC_CMD_NEWLINE)
784
+ self.smartIdentThisLine()
785
+ # only analyse on new line if not at end of file
786
+ if self.GetCurrentPos() < self.GetLastPosition() - 1:
787
+ self.analyseScript()
788
+ return # so that we don't reach the skip line at end
789
+
790
+ if self.CallTipActive():
791
+ self.CallTipCancel()
792
+ self.openBrackets = 0
793
+
794
+ # quote line
795
+ elif keyCode == ord("'"):
796
+ #raise RuntimeError
797
+ start, end = self.GetSelection()
798
+ if end - start > 0:
799
+ txt = self.GetSelectedText()
800
+ txt = "'" + txt.replace('\n', "'\n'") + "'"
801
+ self.ReplaceSelection(txt)
802
+ event.Skip(False)
803
+ return
804
+
805
+ event.Skip()
806
+
807
+ def ShowAutoCompleteList(self):
808
+ """Show autocomplete list at the current caret position."""
809
+ if _hasJedi and self.getFileType() == 'Python':
810
+ self.coder.SetStatusText(
811
+ 'Retrieving code completions, please wait ...', 0)
812
+ script = jedi.Script(
813
+ self.GetText(),
814
+ path=self.filename if os.path.isabs(self.filename) else
815
+ None)
816
+ # todo - create Script() periodically
817
+ compList = [i.name for i in script.complete(
818
+ self.caretLine + 1, self.caretColumn, fuzzy=False)]
819
+ # todo - check if have a perfect match and veto AC
820
+ self.coder.SetStatusText('', 0)
821
+ if compList:
822
+ self.AutoCompShow(0, " ".join(compList))
823
+
824
+ def ShowCalltip(self):
825
+ """Show a calltip at the current caret position."""
826
+ if _hasJedi and self.getFileType() == 'Python':
827
+ self.coder.SetStatusText('Retrieving calltip, please wait ...', 0)
828
+ thisObj = jedi.Script(self.getTextUptoCaret())
829
+ if hasattr(thisObj, 'get_signatures'):
830
+ foundRefs = thisObj.get_signatures()
831
+ elif hasattr(thisObj, 'call_signatures'):
832
+ # call_signatures deprecated in jedi 0.16.0 (2020)
833
+ foundRefs = thisObj.call_signatures()
834
+ else:
835
+ foundRefs = None
836
+ self.coder.SetStatusText('', 0)
837
+
838
+ if foundRefs:
839
+ # enable text wrapping
840
+ calltipText = foundRefs[0].to_string()
841
+ if calltipText:
842
+ calltipText = '\n '.join(
843
+ textwrap.wrap(calltipText, 76)) # 80 cols after indent
844
+ y, x = foundRefs[0].bracket_start
845
+ callTipPos = self.XYToPosition(x, y)
846
+ self.CallTipShow(callTipPos, calltipText)
847
+
848
+ def MacOpenFile(self, evt):
849
+ logging.debug('PsychoPyCoder: got MacOpenFile event')
850
+
851
+ def OnUpdateUI(self, evt):
852
+ """Runs when the editor is changed in any way."""
853
+ # check for matching braces
854
+ braceAtCaret = -1
855
+ braceOpposite = -1
856
+ charBefore = None
857
+ caretPos = self.GetCurrentPos()
858
+
859
+ if caretPos > 0:
860
+ charBefore = self.GetCharAt(caretPos - 1)
861
+ styleBefore = self.GetStyleAt(caretPos - 1)
862
+
863
+ # check before
864
+ if charBefore and chr(charBefore) in "[]{}()":
865
+ if styleBefore == wx.stc.STC_P_OPERATOR:
866
+ braceAtCaret = caretPos - 1
867
+
868
+ # check after
869
+ if braceAtCaret < 0:
870
+ charAfter = self.GetCharAt(caretPos)
871
+ styleAfter = self.GetStyleAt(caretPos)
872
+ if charAfter and chr(charAfter) in "[]{}()":
873
+ if styleAfter == wx.stc.STC_P_OPERATOR:
874
+ braceAtCaret = caretPos
875
+
876
+ if braceAtCaret >= 0:
877
+ braceOpposite = self.BraceMatch(braceAtCaret)
878
+
879
+ if braceAtCaret != -1 and braceOpposite == -1:
880
+ self.BraceBadLight(braceAtCaret)
881
+ else:
882
+ self.BraceHighlight(braceAtCaret, braceOpposite)
883
+
884
+ # Update data about caret position, this can be done once per UI update
885
+ # to eliminate the need to recalculate these values when needed
886
+ # elsewhere.
887
+ self.updateCaretInfo()
888
+
889
+ # set the current line and column in the status bar
890
+ self.coder.SetStatusText('Line: {} Col: {}'.format(
891
+ self.caretLine + 1, self.caretColumn + 1), 1)
892
+
893
+ def updateCaretInfo(self):
894
+ """Update information related to the current caret position in the text.
895
+
896
+ This is done once per UI update which reduces redundant calculations of
897
+ these values.
898
+
899
+ """
900
+ self.indentSize = self.GetIndent()
901
+ self.caretCurrentPos = self.GetCurrentPos()
902
+ self.caretVisible, caretColumn, caretLine = self.PositionToXY(
903
+ self.caretCurrentPos)
904
+
905
+ if self.caretVisible:
906
+ self.caretColumn = caretColumn
907
+ self.caretLine = caretLine
908
+ else:
909
+ self.caretLine = self.GetCurrentLine()
910
+ self.caretColumn = self.GetLineLength(self.caretLine)
911
+
912
+ self.caretLineIndentCol = \
913
+ self.GetColumn(self.GetLineIndentPosition(self.caretLine))
914
+ self.caretLineIndentLevel = self.caretLineIndentCol / self.indentSize
915
+ self.caretAtIndentLevel = \
916
+ (self.caretLineIndentCol % self.indentSize) == 0
917
+ # self.shouldBackspaceUntab = \
918
+ # self.caretAtIndentLevel and \
919
+ # 0 < self.caretColumn <= self.caretLineIndentCol
920
+
921
+ def commentLines(self):
922
+ # used for the comment/uncomment machinery from ActiveGrid
923
+ newText = ""
924
+ for lineNo in self._GetSelectedLineNumbers():
925
+ lineText = self.GetLine(lineNo)
926
+ oneSharp = bool(len(lineText) > 1 and lineText[0] == '#')
927
+ # todo: is twoSharp ever True when oneSharp is not?
928
+ twoSharp = bool(len(lineText) > 2 and lineText[:2] == '##')
929
+ lastLine = bool(lineNo == self.GetLineCount() - 1
930
+ and self.GetLineLength(lineNo) == 0)
931
+ if oneSharp or twoSharp or lastLine:
932
+ newText = newText + lineText
933
+ else:
934
+ newText = newText + "#" + lineText
935
+
936
+ self._ReplaceSelectedLines(newText)
937
+
938
+ def uncommentLines(self):
939
+ # used for the comment/uncomment machinery from ActiveGrid
940
+ newText = ""
941
+ for lineNo in self._GetSelectedLineNumbers():
942
+ lineText = self.GetLine(lineNo)
943
+ # todo: is the next line ever True? seems like should be == '##'
944
+ if len(lineText) >= 2 and lineText[:2] == "#":
945
+ lineText = lineText[2:]
946
+ elif len(lineText) >= 1 and lineText[:1] == "#":
947
+ lineText = lineText[1:]
948
+ newText = newText + lineText
949
+ self._ReplaceSelectedLines(newText)
950
+
951
+ def increaseFontSize(self):
952
+ self.SetZoom(self.GetZoom() + 1)
953
+
954
+ def decreaseFontSize(self):
955
+ # Minimum zoom set to - 6
956
+ if self.GetZoom() == -6:
957
+ self.SetZoom(self.GetZoom())
958
+ else:
959
+ self.SetZoom(self.GetZoom() - 1)
960
+
961
+ def resetFontSize(self):
962
+ """Reset the zoom level."""
963
+ self.SetZoom(0)
964
+
965
+ def analyseScript(self):
966
+ """Parse the document and update the source tree if present.
967
+
968
+ The script is analysed when loaded or when the user interact with it in
969
+ a way that can potentially change the number of lines of executable
970
+ code (cutting, pasting, newline, etc.)
971
+
972
+ This may get slow on larger files on older machines. So we may want to
973
+ change there heuristic a bit to determine when to analyse code in the
974
+ future.
975
+
976
+ """
977
+ if hasattr(self.coder, 'structureWindow'):
978
+ self.coder.statusBar.SetStatusText(_translate('Analyzing code'))
979
+ self.coder.structureWindow.refresh()
980
+ self.coder.statusBar.SetStatusText('')
981
+
982
+ def setLexer(self, lexer=None):
983
+ """Lexer is a simple string (e.g. 'python', 'html')
984
+ that will be converted to use the right STC_LEXER_XXXX value
985
+ """
986
+ lexer = 'null' if lexer is None else lexer
987
+ try:
988
+ lex = getattr(wx.stc, "STC_LEX_%s" % (lexer.upper()))
989
+ except AttributeError:
990
+ logging.warn("Unknown lexer %r. Using plain text." % lexer)
991
+ lex = wx.stc.STC_LEX_NULL
992
+ lexer = 'null'
993
+
994
+ # then actually set it
995
+ self.SetLexer(lex)
996
+ self.setFonts()
997
+
998
+ if lexer == 'python':
999
+ self.SetIndentationGuides(self.coder.appData['showIndentGuides'])
1000
+ self.SetProperty("fold", "1") # allow folding
1001
+ self.SetProperty("tab.timmy.whinge.level", "1")
1002
+ elif lexer.lower() == 'html':
1003
+ self.SetProperty("fold", "1") # allow folding
1004
+ # 4 means 'tabs are bad'; 1 means 'flag inconsistency'
1005
+ self.SetProperty("tab.timmy.whinge.level", "1")
1006
+ elif lexer == 'cpp': # JS, C/C++, GLSL, mex, arduino
1007
+ self.SetIndentationGuides(self.coder.appData['showIndentGuides'])
1008
+ self.SetProperty("fold", "1")
1009
+ self.SetProperty("tab.timmy.whinge.level", "1")
1010
+ # don't grey out preprocessor lines
1011
+ self.SetProperty("lexer.cpp.track.preprocessor", "0")
1012
+ elif lexer == 'R':
1013
+ self.SetIndentationGuides(self.coder.appData['showIndentGuides'])
1014
+ self.SetProperty("fold", "1")
1015
+ self.SetProperty("tab.timmy.whinge.level", "1")
1016
+ else:
1017
+ self.SetIndentationGuides(0)
1018
+ self.SetProperty("tab.timmy.whinge.level", "0")
1019
+
1020
+ # deprecated in newer versions of Scintilla
1021
+ self.SetStyleBits(self.GetStyleBitsNeeded())
1022
+
1023
+ # keep text from being squashed and hard to read
1024
+ spacing = self.coder.prefs['lineSpacing'] / 2.
1025
+ self.SetExtraAscent(int(spacing))
1026
+ self.SetExtraDescent(int(spacing))
1027
+ self.Colourise(0, -1)
1028
+
1029
+ self._applyAppTheme()
1030
+
1031
+ def onModified(self, event):
1032
+ # update the UNSAVED flag and the save icons
1033
+ #notebook = self.GetParent()
1034
+ #mainFrame = notebook.GetParent()
1035
+ self.coder.setFileModified(True)
1036
+
1037
+ def DoFindNext(self, findData, findDlg=None):
1038
+ # this comes straight from wx.py.editwindow (which is a subclass of
1039
+ # STC control)
1040
+ backward = not (findData.GetFlags() & wx.FR_DOWN)
1041
+ matchcase = (findData.GetFlags() & wx.FR_MATCHCASE) != 0
1042
+ end = self.GetLength()
1043
+ # Byte string is necessary to let SetSelection() work properly
1044
+ textstring = self.GetTextRangeRaw(0, end)
1045
+ findstring = findData.GetFindString().encode('utf-8')
1046
+ if not matchcase:
1047
+ textstring = textstring.lower()
1048
+ findstring = findstring.lower()
1049
+ if backward:
1050
+ start = self.GetSelection()[0]
1051
+ loc = textstring.rfind(findstring, 0, start)
1052
+ else:
1053
+ start = self.GetSelection()[1]
1054
+ loc = textstring.find(findstring, start)
1055
+
1056
+ # if it wasn't found then restart at beginning
1057
+ if loc == -1 and start != 0:
1058
+ if backward:
1059
+ start = end
1060
+ loc = textstring.rfind(findstring, 0, start)
1061
+ else:
1062
+ start = 0
1063
+ loc = textstring.find(findstring, start)
1064
+
1065
+ # was it still not found?
1066
+ if loc == -1:
1067
+ dlg = dialogs.MessageDialog(self, message=_translate(
1068
+ 'Unable to find "%s"') % findstring.decode('utf-8'), type='Info')
1069
+ dlg.ShowModal()
1070
+ dlg.Destroy()
1071
+ else:
1072
+ # show and select the found text
1073
+ line = self.LineFromPosition(loc)
1074
+ # self.EnsureVisible(line)
1075
+ self.GotoLine(line)
1076
+ self.SetSelection(loc, loc + len(findstring))
1077
+ if findDlg:
1078
+ if loc == -1:
1079
+ wx.CallAfter(findDlg.SetFocus)
1080
+ return
1081
+ # else:
1082
+ # findDlg.Close()
1083
+
1084
+
1085
+ class CoderFrame(BaseAuiFrame, handlers.ThemeMixin):
1086
+
1087
+ def __init__(self, parent, ID, title, files=(), app=None):
1088
+ self.app = app # type: psychopy.app.PsychoPyApp
1089
+ self.frameType = 'coder'
1090
+ # things the user doesn't set like winsize etc
1091
+ self.appData = self.app.prefs.appData['coder']
1092
+ self.prefs = self.app.prefs.coder # things about coder that get set
1093
+ self.appPrefs = self.app.prefs.app
1094
+ self.paths = self.app.prefs.paths
1095
+ self.IDs = self.app.IDs
1096
+ self.currentDoc = None
1097
+ self.project = None
1098
+ self.ignoreErrors = False
1099
+ self.fileStatusLastChecked = time.time()
1100
+ self.fileStatusCheckInterval = 5 * 60 # sec
1101
+ self.showingReloadDialog = False
1102
+
1103
+ # default window title string
1104
+ self.winTitle = title
1105
+
1106
+ # we didn't have the key or the win was minimized/invalid
1107
+ if self.appData['winH'] == 0 or self.appData['winW'] == 0:
1108
+ self.appData['winH'], self.appData['winW'] = wx.DefaultSize
1109
+ self.appData['winX'], self.appData['winY'] = wx.DefaultPosition
1110
+ if self.appData['winY'] < 20:
1111
+ self.appData['winY'] = 20
1112
+ # fix issue in Windows when frame was closed while iconized
1113
+ if self.appData['winX'] == -32000:
1114
+ self.appData['winX'], self.appData['winY'] = wx.DefaultPosition
1115
+ self.appData['winH'], self.appData['winW'] = wx.DefaultSize
1116
+
1117
+ BaseAuiFrame.__init__(
1118
+ self, parent, ID, title,
1119
+ (self.appData['winX'], self.appData['winY']),
1120
+ (self.appData['winW'], self.appData['winH']))
1121
+
1122
+ # detect retina displays (then don't use double-buffering)
1123
+ self.isRetina = \
1124
+ self.GetContentScaleFactor() != 1 and wx.Platform == '__WXMAC__'
1125
+
1126
+ self.Hide() # ugly to see it all initialise
1127
+ # create icon
1128
+ if sys.platform == 'darwin':
1129
+ pass # doesn't work and not necessary - handled by app bundle
1130
+ else:
1131
+ iconFile = os.path.join(self.paths['resources'], 'coder.ico')
1132
+ if os.path.isfile(iconFile):
1133
+ self.SetIcon(wx.Icon(iconFile, wx.BITMAP_TYPE_ICO))
1134
+ # NB not the same as quit - just close the window
1135
+ self.Bind(wx.EVT_CLOSE, self.closeFrame)
1136
+ self.Bind(wx.EVT_IDLE, self.onIdle)
1137
+
1138
+ if 'state' in self.appData and self.appData['state'] == 'maxim':
1139
+ self.Maximize()
1140
+ # initialise some attributes
1141
+ self.modulesLoaded = False # goes true when loading thread completes
1142
+ self.findDlg = None
1143
+ self.findData = wx.FindReplaceData()
1144
+ self.findData.SetFlags(wx.FR_DOWN)
1145
+ self.importedScripts = {}
1146
+ self.scriptProcess = None
1147
+ self.scriptProcessID = None
1148
+ self.db = None # debugger
1149
+ self._lastCaretPos = None
1150
+
1151
+ # setup universal shortcuts
1152
+ accelTable = self.app.makeAccelTable()
1153
+ self.SetAcceleratorTable(accelTable)
1154
+
1155
+ # Setup pane and art managers
1156
+ self.paneManager = self.getAuiManager()
1157
+
1158
+ # Create menus and status bar
1159
+ self.fileMenu = self.editMenu = self.viewMenu = None
1160
+ self.helpMenu = self.toolsMenu = None
1161
+ self.makeMenus()
1162
+ self.makeStatusBar()
1163
+ self.pavloviaMenu.syncBtn.Enable(bool(self.filename))
1164
+ self.pavloviaMenu.newBtn.Enable(bool(self.filename))
1165
+ # Link to file drop function
1166
+ self.SetDropTarget(FileDropTarget(targetFrame=self))
1167
+
1168
+ # Create editor notebook
1169
+ self.notebook = StyledNotebook(
1170
+ self, -1, size=wx.Size(480, 480),
1171
+ agwStyle=aui.AUI_NB_TAB_MOVE | aui.AUI_NB_CLOSE_ON_ACTIVE_TAB)
1172
+
1173
+ # add ribbon
1174
+ self.ribbon = CoderRibbon(self)
1175
+ self.paneManager.AddPane(self.ribbon,
1176
+ aui.AuiPaneInfo().
1177
+ Name("Ribbon").
1178
+ DockFixed(True).
1179
+ CloseButton(False).MaximizeButton(True).PaneBorder(False).CaptionVisible(False).
1180
+ Top())
1181
+ # Add editor panel
1182
+ self.paneManager.AddPane(self.notebook, aui.AuiPaneInfo().
1183
+ Name("Editor").
1184
+ Caption(_translate("Editor")).
1185
+ BestSize((480, 480)).
1186
+ Floatable(False).
1187
+ Movable(False).
1188
+ Center().
1189
+ PaneBorder(True). # 'center panes' expand
1190
+ CloseButton(False).
1191
+ MaximizeButton(True))
1192
+
1193
+ # Create source assistant notebook
1194
+ self.sourceAsst = StyledNotebook(
1195
+ self,
1196
+ wx.ID_ANY,
1197
+ size=wx.Size(500, 600),
1198
+ agwStyle=aui.AUI_NB_CLOSE_ON_ALL_TABS |
1199
+ aui.AUI_NB_TAB_SPLIT |
1200
+ aui.AUI_NB_TAB_MOVE)
1201
+ self.sourceAsst.GetAuiManager().SetArtProvider(handlers.PsychopyDockArt())
1202
+
1203
+ self.structureWindow = SourceTreePanel(self.sourceAsst, self)
1204
+ self.fileBrowserWindow = FileBrowserPanel(self.sourceAsst, self)
1205
+
1206
+ # Add structure page to source assistant
1207
+ self.structureWindow.SetName("Structure")
1208
+ self.sourceAsst.AddPage(self.structureWindow, "Structure")
1209
+ # Add file browser page to source assistant
1210
+ self.fileBrowserWindow.SetName("FileBrowser")
1211
+ self.sourceAsst.AddPage(self.fileBrowserWindow, "File Browser")
1212
+
1213
+ # remove close buttons
1214
+ for i in range(self.sourceAsst.GetPageCount()):
1215
+ self.sourceAsst.SetCloseButton(i, False)
1216
+
1217
+ # Add source assistant panel
1218
+ self.paneManager.AddPane(self.sourceAsst,
1219
+ aui.AuiPaneInfo().
1220
+ BestSize((500, 600)).
1221
+ Floatable(False).
1222
+ BottomDockable(False).TopDockable(False).
1223
+ CloseButton(False).PaneBorder(False).
1224
+ Name("SourceAsst").
1225
+ Caption(_translate("Source Assistant")).
1226
+ Left())
1227
+
1228
+ self.notebook.SetFocus()
1229
+ # Link functions
1230
+ self.notebook.Bind(aui.EVT_AUINOTEBOOK_PAGE_CLOSE, self.fileClose)
1231
+ self.notebook.Bind(aui.EVT_AUINOTEBOOK_PAGE_CHANGED, self.pageChanged)
1232
+ self.Bind(wx.EVT_FIND, self.OnFindNext)
1233
+ self.Bind(wx.EVT_FIND_NEXT, self.OnFindNext)
1234
+ #self.Bind(wx.EVT_FIND_CLOSE, self.OnFindClose)
1235
+ self.Bind(wx.EVT_END_PROCESS, self.onProcessEnded)
1236
+
1237
+ # take files from arguments and append the previously opened files
1238
+ filename = ""
1239
+ if files not in [None, [], ()]:
1240
+ for filename in files:
1241
+ if not os.path.isfile(filename):
1242
+ continue
1243
+ self.setCurrentDoc(filename, keepHidden=True)
1244
+
1245
+ # Create shelf notebook
1246
+ self.shelf = StyledNotebook(
1247
+ self, wx.ID_ANY, size=wx.Size(600, 600),
1248
+ agwStyle=aui.AUI_NB_CLOSE_ON_ALL_TABS)
1249
+ self.shelf.GetAuiManager().SetArtProvider(handlers.PsychopyDockArt())
1250
+
1251
+ # Create shell
1252
+ self._useShell = 'pyshell'
1253
+ self.shell = PythonREPLCtrl(self)
1254
+
1255
+ # Add shell to output pane
1256
+ self.shell.SetName("PythonShell")
1257
+ self.shelf.AddPage(self.shell, _translate('Shell'))
1258
+
1259
+ # script output panel
1260
+ self.consoleOutputPanel = ScriptOutputPanel(self.shelf)
1261
+ self.consoleOutput = self.consoleOutputPanel.ctrl
1262
+ self.consoleOutput.SetName("ConsoleOutput")
1263
+ self.shelf.AddPage(self.consoleOutputPanel, _translate('Output'))
1264
+
1265
+ for i in range(self.shelf.GetPageCount()):
1266
+ self.shelf.SetCloseButton(i, False)
1267
+
1268
+ # Add shelf panel
1269
+ self.paneManager.AddPane(self.shelf,
1270
+ aui.AuiPaneInfo().
1271
+ Name("Shelf").
1272
+ Caption(_translate("Shelf")).
1273
+ BestSize((600, 250)).PaneBorder(False).
1274
+ Floatable(False).
1275
+ Movable(True).
1276
+ BottomDockable(True).TopDockable(True).
1277
+ CloseButton(False).
1278
+ Bottom())
1279
+ self.unitTestFrame = None
1280
+
1281
+ # Link to Runner output
1282
+ if self.app.runner is None:
1283
+ self.app.showRunner()
1284
+ self.outputWindow = self.consoleOutput
1285
+ self.outputWindow.write(_translate('Welcome to PsychoPy3!') + '\n')
1286
+ self.outputWindow.write("v%s\n" % self.app.version)
1287
+
1288
+ # Manage perspective
1289
+ self.SetMinSize(wx.Size(640, 480)) # min size for whole window
1290
+ if (self.appData['auiPerspective'] and
1291
+ 'Shelf' in self.appData['auiPerspective']):
1292
+ try:
1293
+ self.paneManager.LoadPerspective(self.appData['auiPerspective'])
1294
+ except Exception as err:
1295
+ logging.error("Error loading perspective: %s" % err)
1296
+ # defaults for the window if the perspective fails
1297
+ self.SetSize(wx.Size(1024, 800))
1298
+ self.Fit()
1299
+ self.paneManager.GetPane('SourceAsst').Caption(_translate("Source Assistant"))
1300
+ self.paneManager.GetPane('Editor').Caption(_translate("Editor"))
1301
+ else:
1302
+ self.SetSize(wx.Size(1024, 800))
1303
+ self.Fit()
1304
+ # Update panes PsychopyToolbar
1305
+ isExp = filename.endswith(".py") or filename.endswith(".psyexp")
1306
+
1307
+ # Hide panels as specified
1308
+ self.paneManager.GetPane("SourceAsst").Show(self.prefs['showSourceAsst'])
1309
+ self.paneManager.GetPane("Shelf").Show(self.prefs['showOutput'])
1310
+ self.paneManager.GetPane("Ribbon").Show()
1311
+ self.paneManager.Update()
1312
+ #self.chkShowAutoComp.Check(self.prefs['autocomplete'])
1313
+ self.SendSizeEvent()
1314
+ self.app.trackFrame(self)
1315
+
1316
+ self.theme = colors.theme
1317
+
1318
+ # disable save buttons if currentDoc is None
1319
+ if self.currentDoc is None:
1320
+ self.ribbon.buttons['save'].Disable()
1321
+ self.ribbon.buttons['saveas'].Disable()
1322
+
1323
+ @property
1324
+ def useAutoComp(self):
1325
+ """Show autocomplete while typing."""
1326
+ return self.prefs['autocomplete']
1327
+
1328
+ def GetAuiManager(self):
1329
+ return self.paneManager
1330
+
1331
+ @property
1332
+ def session(self):
1333
+ """
1334
+ Current Pavlovia session
1335
+ """
1336
+ return pavlovia.getCurrentSession()
1337
+
1338
+ def outputContextMenu(self, event):
1339
+ """Custom context menu for output window.
1340
+
1341
+ Provides menu items to clear all, select all and copy selected text."""
1342
+ if not hasattr(self, "outputMenuID1"):
1343
+ self.outputMenuID1 = wx.NewIdRef(count=1)
1344
+ self.outputMenuID2 = wx.NewIdRef(count=1)
1345
+ self.outputMenuID3 = wx.NewIdRef(count=1)
1346
+
1347
+ self.Bind(wx.EVT_MENU, self.outputClear, id=self.outputMenuID1)
1348
+ self.Bind(wx.EVT_MENU, self.outputSelectAll, id=self.outputMenuID2)
1349
+ self.Bind(wx.EVT_MENU, self.outputCopy, id=self.outputMenuID3)
1350
+
1351
+ menu = wx.Menu()
1352
+ itemClear = wx.MenuItem(menu, self.outputMenuID1, "Clear All")
1353
+ itemSelect = wx.MenuItem(menu, self.outputMenuID2, "Select All")
1354
+ itemCopy = wx.MenuItem(menu, self.outputMenuID3, "Copy")
1355
+
1356
+ menu.Append(itemClear)
1357
+ menu.AppendSeparator()
1358
+ menu.Append(itemSelect)
1359
+ menu.Append(itemCopy)
1360
+ # Popup the menu. If an item is selected then its handler
1361
+ # will be called before PopupMenu returns.
1362
+ self.PopupMenu(menu)
1363
+ menu.Destroy()
1364
+
1365
+ def outputClear(self, event):
1366
+ """Clears the output window in Coder"""
1367
+ self.outputWindow.Clear()
1368
+
1369
+ def outputSelectAll(self, event):
1370
+ """Selects all text from the output window in Coder"""
1371
+ self.outputWindow.SelectAll()
1372
+
1373
+ def outputCopy(self, event):
1374
+ """Copies all text from the output window in Coder"""
1375
+ self.outputWindow.Copy()
1376
+
1377
+ def makeMenus(self):
1378
+ # ---Menus---#000000#FFFFFF-------------------------------------------
1379
+ menuBar = wx.MenuBar()
1380
+ # ---_file---#000000#FFFFFF-------------------------------------------
1381
+ self.fileMenu = wx.Menu()
1382
+ menuBar.Append(self.fileMenu, _translate('&File'))
1383
+
1384
+ # create a file history submenu
1385
+ self.fileHistory = wx.FileHistory(maxFiles=10)
1386
+ self.recentFilesMenu = wx.Menu()
1387
+ self.fileHistory.UseMenu(self.recentFilesMenu)
1388
+ for filename in self.appData['fileHistory']:
1389
+ self.fileHistory.AddFileToHistory(filename)
1390
+ self.Bind(wx.EVT_MENU_RANGE, self.OnFileHistory,
1391
+ id=wx.ID_FILE1, id2=wx.ID_FILE9)
1392
+
1393
+ # add items to file menu
1394
+ keyCodes = self.app.keys
1395
+ menu = self.fileMenu
1396
+ menu.Append(wx.ID_NEW, _translate("&New\t%s") % keyCodes['new'])
1397
+ menu.Append(wx.ID_OPEN, _translate("&Open...\t%s") % keyCodes['open'])
1398
+ menu.AppendSubMenu(self.recentFilesMenu, _translate("Open &Recent"))
1399
+ menu.Append(wx.ID_SAVE,
1400
+ _translate("&Save\t%s") % keyCodes['save'],
1401
+ _translate("Save current file"))
1402
+ menu.Enable(wx.ID_SAVE, False)
1403
+ menu.Append(wx.ID_SAVEAS,
1404
+ _translate("Save &as...\t%s") % keyCodes['saveAs'],
1405
+ _translate("Save current python file as..."))
1406
+ menu.Enable(wx.ID_SAVEAS, False)
1407
+ menu.Append(wx.ID_CLOSE,
1408
+ _translate("&Close file\t%s") % keyCodes['close'],
1409
+ _translate("Close current file"))
1410
+ menu.Append(wx.ID_CLOSE_ALL,
1411
+ _translate("Close all files"),
1412
+ _translate("Close all files in the editor."))
1413
+ menu.AppendSeparator()
1414
+ self.Bind(wx.EVT_MENU, self.fileNew, id=wx.ID_NEW)
1415
+ self.Bind(wx.EVT_MENU, self.fileOpen, id=wx.ID_OPEN)
1416
+ self.Bind(wx.EVT_MENU, self.fileSave, id=wx.ID_SAVE)
1417
+ self.Bind(wx.EVT_MENU, self.fileSaveAs, id=wx.ID_SAVEAS)
1418
+ self.Bind(wx.EVT_MENU, self.fileClose, id=wx.ID_CLOSE)
1419
+ self.Bind(wx.EVT_MENU, self.fileCloseAll, id=wx.ID_CLOSE_ALL)
1420
+ item = menu.Append(wx.ID_ANY,
1421
+ _translate("Print\t%s") % keyCodes['print'])
1422
+ self.Bind(wx.EVT_MENU, self.filePrint, id=item.GetId())
1423
+ menu.AppendSeparator()
1424
+ msg = _translate("&Preferences\t%s")
1425
+ item = menu.Append(wx.ID_PREFERENCES,
1426
+ msg % keyCodes['preferences'])
1427
+ self.Bind(wx.EVT_MENU, self.app.showPrefs, id=item.GetId())
1428
+ item = menu.Append(
1429
+ wx.ID_ANY, _translate("Reset preferences...")
1430
+ )
1431
+ self.Bind(wx.EVT_MENU, self.resetPrefs, item)
1432
+ # item = menu.Append(wx.NewIdRef(count=1), "Plug&ins")
1433
+ # self.Bind(wx.EVT_MENU, self.pluginManager, id=item.GetId())
1434
+ # -------------Close coder frame
1435
+ menu.AppendSeparator()
1436
+ msg = _translate("Close PsychoPy Coder")
1437
+ item = menu.Append(wx.ID_ANY, msg)
1438
+ self.Bind(wx.EVT_MENU, self.closeFrame, id=item.GetId())
1439
+ # -------------quit
1440
+ menu.AppendSeparator()
1441
+ menu.Append(wx.ID_EXIT,
1442
+ _translate("&Quit\t%s") % keyCodes['quit'],
1443
+ _translate("Terminate the program"))
1444
+ self.Bind(wx.EVT_MENU, self.quit, id=wx.ID_EXIT)
1445
+
1446
+ # ---_edit---#000000#FFFFFF-------------------------------------------
1447
+ self.editMenu = wx.Menu()
1448
+ menu = self.editMenu
1449
+ menuBar.Append(self.editMenu, _translate('&Edit'))
1450
+ menu.Append(wx.ID_CUT, _translate("Cu&t\t%s") % keyCodes['cut'])
1451
+ self.Bind(wx.EVT_MENU, self.cut, id=wx.ID_CUT)
1452
+ menu.Append(wx.ID_COPY, _translate("&Copy\t%s") % keyCodes['copy'])
1453
+ self.Bind(wx.EVT_MENU, self.copy, id=wx.ID_COPY)
1454
+ menu.Append(wx.ID_PASTE, _translate("&Paste\t%s") % keyCodes['paste'])
1455
+ self.Bind(wx.EVT_MENU, self.paste, id=wx.ID_PASTE)
1456
+ hnt = _translate("Duplicate the current line (or current selection)")
1457
+ menu.Append(wx.ID_DUPLICATE,
1458
+ _translate("&Duplicate\t%s") % keyCodes['duplicate'],
1459
+ hnt)
1460
+ self.Bind(wx.EVT_MENU, self.duplicateLine, id=wx.ID_DUPLICATE)
1461
+
1462
+ menu.AppendSeparator()
1463
+ item = menu.Append(wx.ID_ANY,
1464
+ _translate("&Find\t%s") % keyCodes['find'])
1465
+ self.Bind(wx.EVT_MENU, self.OnFindOpen, id=item.GetId())
1466
+ item = menu.Append(wx.ID_ANY,
1467
+ _translate("Find &Next\t%s") % keyCodes['findAgain'])
1468
+ self.Bind(wx.EVT_MENU, self.OnFindNext, id=item.GetId())
1469
+
1470
+ menu.AppendSeparator()
1471
+ item = menu.Append(wx.ID_ANY,
1472
+ _translate("Comment\t%s") % keyCodes['comment'],
1473
+ _translate("Comment selected lines"),
1474
+ wx.ITEM_NORMAL)
1475
+ self.Bind(wx.EVT_MENU, self.commentSelected, id=item.GetId())
1476
+ item = menu.Append(wx.ID_ANY,
1477
+ _translate("Uncomment\t%s") % keyCodes['uncomment'],
1478
+ _translate("Un-comment selected lines"),
1479
+ wx.ITEM_NORMAL)
1480
+ self.Bind(wx.EVT_MENU, self.uncommentSelected, id=item.GetId())
1481
+
1482
+ item = menu.Append(wx.ID_ANY,
1483
+ _translate("Toggle comment\t%s") % keyCodes['toggle comment'],
1484
+ _translate("Toggle commenting of selected lines"),
1485
+ wx.ITEM_NORMAL)
1486
+ self.Bind(wx.EVT_MENU, self.toggleComments, id=item.GetId())
1487
+
1488
+ item = menu.Append(wx.ID_ANY,
1489
+ _translate("Toggle fold\t%s") % keyCodes['fold'],
1490
+ _translate("Toggle folding of top level"),
1491
+ wx.ITEM_NORMAL)
1492
+ self.Bind(wx.EVT_MENU, self.foldAll, id=item.GetId())
1493
+
1494
+ menu.AppendSeparator()
1495
+ item = menu.Append(wx.ID_ANY,
1496
+ _translate("Indent selection\t%s") % keyCodes['indent'],
1497
+ _translate("Increase indentation of current line"),
1498
+ wx.ITEM_NORMAL)
1499
+ self.Bind(wx.EVT_MENU, self.indent, id=item.GetId())
1500
+ item = menu.Append(wx.ID_ANY,
1501
+ _translate("Dedent selection\t%s") % keyCodes['dedent'],
1502
+ _translate("Decrease indentation of current line"),
1503
+ wx.ITEM_NORMAL)
1504
+ self.Bind(wx.EVT_MENU, self.dedent, id=item.GetId())
1505
+ hnt = _translate("Try to indent to the correct position w.r.t. "
1506
+ "last line")
1507
+ item = menu.Append(wx.ID_ANY,
1508
+ _translate("SmartIndent\t%s") % keyCodes['smartIndent'],
1509
+ hnt,
1510
+ wx.ITEM_NORMAL)
1511
+ self.Bind(wx.EVT_MENU, self.smartIndent, id=item.GetId())
1512
+
1513
+ menu.AppendSeparator()
1514
+ menu.Append(wx.ID_UNDO,
1515
+ _translate("Undo\t%s") % self.app.keys['undo'],
1516
+ _translate("Undo last action"),
1517
+ wx.ITEM_NORMAL)
1518
+ self.Bind(wx.EVT_MENU, self.undo, id=wx.ID_UNDO)
1519
+ menu.Append(wx.ID_REDO,
1520
+ _translate("Redo\t%s") % self.app.keys['redo'],
1521
+ _translate("Redo last action"),
1522
+ wx.ITEM_NORMAL)
1523
+ self.Bind(wx.EVT_MENU, self.redo, id=wx.ID_REDO)
1524
+
1525
+ menu.AppendSeparator()
1526
+ item = menu.Append(wx.ID_ANY,
1527
+ _translate("Enlarge font\t%s") % self.app.keys['enlargeFont'],
1528
+ _translate("Increase font size"),
1529
+ wx.ITEM_NORMAL)
1530
+ self.Bind(wx.EVT_MENU, self.bigFont, id=item.GetId())
1531
+ item = menu.Append(wx.ID_ANY,
1532
+ _translate("Shrink font\t%s") % self.app.keys['shrinkFont'],
1533
+ _translate("Decrease font size"),
1534
+ wx.ITEM_NORMAL)
1535
+ self.Bind(wx.EVT_MENU, self.smallFont, id=item.GetId())
1536
+ item = menu.Append(wx.ID_ANY,
1537
+ _translate("Reset font"),
1538
+ _translate("Return fonts to their original size."),
1539
+ wx.ITEM_NORMAL)
1540
+ self.Bind(wx.EVT_MENU, self.resetFont, id=item.GetId())
1541
+ menu.AppendSeparator()
1542
+
1543
+ # submenu for changing working directory
1544
+ sm = wx.Menu()
1545
+ item = sm.Append(
1546
+ wx.ID_ANY,
1547
+ _translate("Editor file location"),
1548
+ "",
1549
+ wx.ITEM_NORMAL)
1550
+ self.Bind(wx.EVT_MENU, self.onSetCWDFromEditor, id=item.GetId())
1551
+ item = sm.Append(
1552
+ wx.ID_ANY,
1553
+ _translate("File browser pane location"),
1554
+ "",
1555
+ wx.ITEM_NORMAL)
1556
+ self.Bind(wx.EVT_MENU, self.onSetCWDFromBrowserPane, id=item.GetId())
1557
+ sm.AppendSeparator()
1558
+ item = sm.Append(
1559
+ wx.ID_ANY,
1560
+ _translate("Choose directory ..."),
1561
+ "",
1562
+ wx.ITEM_NORMAL)
1563
+ self.Bind(wx.EVT_MENU, self.onSetCWDFromBrowse, id=item.GetId())
1564
+ menu.Append(wx.ID_ANY, _translate("Change working directory to ..."), sm)
1565
+
1566
+ # ---_view---#000000#FFFFFF-------------------------------------------
1567
+ self.viewMenu = wx.Menu()
1568
+ menu = self.viewMenu
1569
+ menuBar.Append(self.viewMenu, _translate('&View'))
1570
+
1571
+ # Panel switcher
1572
+ self.panelsMenu = wx.Menu()
1573
+ menu.AppendSubMenu(self.panelsMenu,
1574
+ _translate("Panels"))
1575
+ # output window
1576
+ key = keyCodes['toggleOutputPanel']
1577
+ hint = _translate("Shows the output and shell panes (and starts "
1578
+ "capturing stdout)")
1579
+ self.outputChk = self.panelsMenu.AppendCheckItem(
1580
+ wx.ID_ANY, _translate("&Output/Shell\t%s") % key, hint)
1581
+ self.outputChk.Check(self.prefs['showOutput'])
1582
+ self.Bind(wx.EVT_MENU, self.setOutputWindow, id=self.outputChk.GetId())
1583
+ # source assistant
1584
+ hint = _translate("Hide/show the source assistant pane.")
1585
+ self.sourceAsstChk = self.panelsMenu.AppendCheckItem(wx.ID_ANY,
1586
+ _translate("Source Assistant"),
1587
+ hint)
1588
+ self.sourceAsstChk.Check(self.prefs['showSourceAsst'])
1589
+ self.Bind(wx.EVT_MENU, self.setSourceAsst,
1590
+ id=self.sourceAsstChk.GetId())
1591
+
1592
+ # indent guides
1593
+ key = keyCodes['toggleIndentGuides']
1594
+ hint = _translate("Shows guides in the editor for your "
1595
+ "indentation level")
1596
+ self.indentGuideChk = menu.AppendCheckItem(wx.ID_ANY,
1597
+ _translate("&Indentation guides\t%s") % key,
1598
+ hint)
1599
+ self.indentGuideChk.Check(self.appData['showIndentGuides'])
1600
+ self.Bind(wx.EVT_MENU, self.setShowIndentGuides, self.indentGuideChk)
1601
+ # whitespace
1602
+ key = keyCodes['toggleWhitespace']
1603
+ hint = _translate("Show whitespace characters in the code")
1604
+ self.showWhitespaceChk = menu.AppendCheckItem(wx.ID_ANY,
1605
+ _translate("&Whitespace\t%s") % key,
1606
+ hint)
1607
+ self.showWhitespaceChk.Check(self.appData['showWhitespace'])
1608
+ self.Bind(wx.EVT_MENU, self.setShowWhitespace, self.showWhitespaceChk)
1609
+ # EOL markers
1610
+ key = keyCodes['toggleEOLs']
1611
+ hint = _translate("Show End Of Line markers in the code")
1612
+ self.showEOLsChk = menu.AppendCheckItem(
1613
+ wx.ID_ANY,
1614
+ _translate("Show &EOLs\t%s") % key,
1615
+ hint)
1616
+ self.showEOLsChk.Check(self.appData['showEOLs'])
1617
+ self.Bind(wx.EVT_MENU, self.setShowEOLs, id=self.showEOLsChk.GetId())
1618
+ menu.AppendSeparator()
1619
+ hint = _translate("Enable/disable line wrapping in editors.")
1620
+ self.lineWrapChk = menu.AppendCheckItem(
1621
+ wx.ID_ANY,
1622
+ _translate("Line wrapping"),
1623
+ hint)
1624
+ self.lineWrapChk.Check(False)
1625
+ self.Bind(wx.EVT_MENU, self.onWordWrapCheck, self.lineWrapChk)
1626
+ menu.AppendSeparator()
1627
+ # Theme Switcher
1628
+ self.themesMenu = ThemeSwitcher(app=self.app)
1629
+ menu.AppendSubMenu(self.themesMenu,
1630
+ _translate("&Themes"))
1631
+
1632
+ # Frame switcher
1633
+ FrameSwitcher.makeViewSwitcherButtons(menu, frame=self, app=self.app)
1634
+
1635
+ # ---_view---#000000#FFFFFF-------------------------------------------
1636
+ # self.shellMenu = wx.Menu()
1637
+ # menuBar.Append(self.shellMenu, _translate('&Shell'))
1638
+ #
1639
+ # menu = self.shellMenu
1640
+ # item = menu.Append(
1641
+ # wx.ID_ANY,
1642
+ # _translate("Start Python Session"),
1643
+ # _translate("Start a new Python session in the shell."),
1644
+ # wx.ITEM_NORMAL)
1645
+ # self.Bind(wx.EVT_MENU, self.onStartShellSession, id=item.GetId())
1646
+ # menu.AppendSeparator()
1647
+ # item = menu.Append(
1648
+ # wx.ID_ANY,
1649
+ # _translate("Run Line\tF6"),
1650
+ # _translate("Push the line at the caret to the shell."),
1651
+ # wx.ITEM_NORMAL)
1652
+ # self.Bind(wx.EVT_MENU, self.onPushLineToShell, id=item.GetId())
1653
+
1654
+ # menu.Append(ID_UNFOLDALL, "Unfold All\tF3",
1655
+ # "Unfold all lines", wx.ITEM_NORMAL)
1656
+ # self.Bind(wx.EVT_MENU, self.unfoldAll, id=ID_UNFOLDALL)
1657
+ # ---_tools---#000000#FFFFFF------------------------------------------
1658
+ self.toolsMenu = wx.Menu()
1659
+ menu = self.toolsMenu
1660
+ menuBar.Append(self.toolsMenu, _translate('&Tools'))
1661
+ item = menu.Append(wx.ID_ANY,
1662
+ _translate("Monitor Center"),
1663
+ _translate("To set information about your monitor"))
1664
+ self.Bind(wx.EVT_MENU, self.app.openMonitorCenter, id=item.GetId())
1665
+ # self.analyseAutoChk = self.toolsMenu.AppendCheckItem(self.IDs.analyzeAuto,
1666
+ # "Analyse on file save/open",
1667
+ # "Automatically analyse source (for autocomplete etc...).
1668
+ # Can slow down the editor on a slow machine or with large files")
1669
+ # self.Bind(wx.EVT_MENU, self.setAnalyseAuto, id=self.IDs.analyzeAuto)
1670
+ # self.analyseAutoChk.Check(self.prefs['analyseAuto'])
1671
+ # self.toolsMenu.Append(self.IDs.analyzeNow,
1672
+ # "Analyse now\t%s" %self.app.keys['analyseCode'],
1673
+ # "Force a reananalysis of the code now")
1674
+ # self.Bind(wx.EVT_MENU, self.analyseCodeNow, id=self.IDs.analyzeNow)
1675
+
1676
+ self.IDs.cdrRun = menu.Append(wx.ID_ANY,
1677
+ _translate("Run/pilot\t%s") % keyCodes['runScript'],
1678
+ _translate("Run the current script")).GetId()
1679
+ self.Bind(wx.EVT_MENU, self.onRunShortcut, id=self.IDs.cdrRun)
1680
+ item = menu.Append(wx.ID_ANY,
1681
+ _translate("Send to runner\t%s") % keyCodes['runnerScript'],
1682
+ _translate("Send current script to runner")).GetId()
1683
+ self.Bind(wx.EVT_MENU, self.runFile, id=item)
1684
+
1685
+ menu.AppendSeparator()
1686
+ item = menu.Append(wx.ID_ANY,
1687
+ _translate("PsychoPy updates..."),
1688
+ _translate("Update PsychoPy to the latest, or a specific, version"))
1689
+ self.Bind(wx.EVT_MENU, self.app.openUpdater, id=item.GetId())
1690
+ item = menu.Append(wx.ID_ANY,
1691
+ _translate("Plugin/packages manager..."),
1692
+ _translate("Manage Python packages and optional plugins for PsychoPy"))
1693
+ self.Bind(wx.EVT_MENU, self.openPluginManager, item)
1694
+ item = menu.Append(wx.ID_ANY,
1695
+ _translate("Benchmark wizard"),
1696
+ _translate("Check software & hardware, generate report"))
1697
+ self.Bind(wx.EVT_MENU, self.app.benchmarkWizard, id=item.GetId())
1698
+ item = menu.Append(wx.ID_ANY,
1699
+ _translate("csv from psydat"),
1700
+ _translate("Create a .csv file from an existing .psydat file"))
1701
+ self.Bind(wx.EVT_MENU, self.app.csvFromPsydat, id=item.GetId())
1702
+
1703
+ if self.appPrefs['debugMode']:
1704
+ item = menu.Append(wx.ID_ANY,
1705
+ _translate("Unit &testing...\tCtrl-T"),
1706
+ _translate("Show dialog to run unit tests"))
1707
+ self.Bind(wx.EVT_MENU, self.onUnitTests, id=item.GetId())
1708
+
1709
+ # ---_demos---#000000#FFFFFF------------------------------------------
1710
+ self.demosMenu = wx.Menu()
1711
+ menuBar.Append(self.demosMenu, _translate('&Demos'))
1712
+ # Make demos menu
1713
+ updateDemosMenu(self, self.demosMenu, str(Path(self.paths['demos']) / "coder"), ext=".py")
1714
+ # also add simple demos to root
1715
+ self.demosMenu.AppendSeparator()
1716
+ demos = glob.glob(os.path.join(self.paths['demos'], 'coder', '*.py'))
1717
+ for thisFile in demos:
1718
+ shortname = thisFile.split(os.path.sep)[-1]
1719
+ if shortname.startswith('_'):
1720
+ continue # remove any 'private' files
1721
+ item = self.demosMenu.Append(wx.ID_ANY, shortname)
1722
+ thisID = item.GetId()
1723
+ self.demos[thisID] = thisFile
1724
+ self.Bind(wx.EVT_MENU, self.demoLoad, id=thisID)
1725
+
1726
+ # ---_shell---#000000#FFFFFF--------------------------------------------
1727
+ # self.shellMenu = wx.Menu()
1728
+ # menu = self.shellMenu
1729
+ # menuBar.Append(menu, '&Shell')
1730
+ #
1731
+ # item = menu.Append(
1732
+ # wx.ID_ANY,
1733
+ # "Run selected line\tCtrl+Enter",
1734
+ # "Pushes selected lines to the shell and executes them.")
1735
+ # self.Bind(wx.EVT_MENU, self.onPushLineToShell, id=item.GetId())
1736
+
1737
+ # ---_projects---#000000#FFFFFF---------------------------------------
1738
+ self.pavloviaMenu = psychopy.app.pavlovia_ui.menu.PavloviaMenu(parent=self)
1739
+ menuBar.Append(self.pavloviaMenu, _translate("&Pavlovia.org"))
1740
+
1741
+ # ---_window---#000000#FFFFFF-----------------------------------------
1742
+ self.windowMenu = FrameSwitcher(self)
1743
+ menuBar.Append(self.windowMenu,
1744
+ _translate("&Window"))
1745
+
1746
+ # ---_help---#000000#FFFFFF-------------------------------------------
1747
+ self.helpMenu = wx.Menu()
1748
+ menuBar.Append(self.helpMenu, _translate('&Help'))
1749
+ item = self.helpMenu.Append(wx.ID_ANY,
1750
+ _translate("&PsychoPy Homepage"),
1751
+ _translate("Go to the PsychoPy homepage"))
1752
+ self.Bind(wx.EVT_MENU, self.app.followLink, id=item.GetId())
1753
+ self.app.urls[item.GetId()] = self.app.urls['psychopyHome']
1754
+ item = self.helpMenu.Append(wx.ID_ANY,
1755
+ _translate("&PsychoPy Coder Tutorial"),
1756
+ _translate("Go to the online PsychoPy tutorial"))
1757
+ self.Bind(wx.EVT_MENU, self.app.followLink, id=item.GetId())
1758
+ self.app.urls[item.GetId()] = self.app.urls['coderTutorial']
1759
+ item = self.helpMenu.Append(wx.ID_ANY,
1760
+ _translate("&PsychoPy API (reference)"),
1761
+ _translate("Go to the online PsychoPy reference manual"))
1762
+ self.Bind(wx.EVT_MENU, self.app.followLink, id=item.GetId())
1763
+ self.app.urls[item.GetId()] = self.app.urls['psychopyReference']
1764
+ self.helpMenu.AppendSeparator()
1765
+ item = self.helpMenu.Append(wx.ID_ANY,
1766
+ _translate("&System Info..."),
1767
+ _translate("Get system information."))
1768
+ self.Bind(wx.EVT_MENU, self.app.showSystemInfo, id=item.GetId())
1769
+ self.helpMenu.AppendSeparator()
1770
+ # on mac this will move to the application menu
1771
+ self.helpMenu.Append(wx.ID_ABOUT,
1772
+ _translate("&About..."),
1773
+ _translate("About PsychoPy"))
1774
+ self.Bind(wx.EVT_MENU, self.app.showAbout, id=wx.ID_ABOUT)
1775
+
1776
+ item = self.helpMenu.Append(wx.ID_ANY,
1777
+ _translate("&News..."),
1778
+ _translate("News"))
1779
+ self.Bind(wx.EVT_MENU, self.app.showNews, id=item.GetId())
1780
+
1781
+ self.SetMenuBar(menuBar)
1782
+
1783
+ def makeStatusBar(self):
1784
+ """Make the status bar for Coder."""
1785
+ self.statusBar = wx.StatusBar(self, wx.ID_ANY)
1786
+ self.statusBar.SetFieldsCount(4)
1787
+ self.statusBar.SetStatusWidths([-2, 160, 160, 160])
1788
+
1789
+ self.SetStatusBar(self.statusBar)
1790
+
1791
+ def onWordWrapCheck(self, event):
1792
+ """Enable/disable word wrapping when the menu item is checked."""
1793
+ checked = event.IsChecked()
1794
+ for pageId in range(self.notebook.GetPageCount()):
1795
+ page = self.notebook.GetPage(pageId)
1796
+ page.SetWrapMode(
1797
+ wx.stc.STC_WRAP_WORD if checked else wx.stc.STC_WRAP_NONE)
1798
+
1799
+ event.Skip()
1800
+
1801
+ def onSetCWDFromEditor(self, event):
1802
+ """Set the current working directory to the location of the current file
1803
+ in the editor."""
1804
+ if self.currentDoc is None:
1805
+ dlg = wx.MessageDialog(
1806
+ self,
1807
+ "Cannot set working directory, no document open in editor.",
1808
+ style=wx.ICON_ERROR | wx.OK)
1809
+ dlg.ShowModal()
1810
+ dlg.Destroy()
1811
+ event.Skip()
1812
+ return
1813
+
1814
+ if not os.path.isabs(self.currentDoc.filename):
1815
+ dlg = wx.MessageDialog(
1816
+ self,
1817
+ "Cannot change working directory to location of file `{}`. It"
1818
+ " needs to be saved first.".format(self.currentDoc.filename),
1819
+ style=wx.ICON_ERROR | wx.OK)
1820
+ dlg.ShowModal()
1821
+ dlg.Destroy()
1822
+ event.Skip()
1823
+ return
1824
+
1825
+ # split the file off the path
1826
+ cwdpath, _ = os.path.split(self.currentDoc.filename)
1827
+
1828
+ # set the working directory
1829
+ try:
1830
+ os.chdir(cwdpath)
1831
+ except OSError:
1832
+ dlg = wx.MessageDialog(
1833
+ self,
1834
+ "Cannot set `{}` as working directory.".format(cwdpath),
1835
+ style=wx.ICON_ERROR | wx.OK)
1836
+ dlg.ShowModal()
1837
+ dlg.Destroy()
1838
+ event.Skip()
1839
+ return
1840
+
1841
+ if hasattr(self, 'fileBrowserWindow'):
1842
+ dlg = wx.MessageDialog(
1843
+ self,
1844
+ "Working directory changed, would you like to display it in "
1845
+ "the file browser pane?",
1846
+ 'Question', style=wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION)
1847
+
1848
+ if dlg.ShowModal() == wx.ID_YES:
1849
+ self.fileBrowserWindow.gotoDir(cwdpath)
1850
+
1851
+ def onStartShellSession(self, event):
1852
+ """Start a new Python session in the shell."""
1853
+ if hasattr(self, 'shell'):
1854
+ self.shell.start()
1855
+ self.shell.SetFocus()
1856
+
1857
+ def onPushLineToShell(self, event):
1858
+ """Push the currently selected line in the editor to the console and
1859
+ run it.."""
1860
+ if hasattr(self, 'shell'):
1861
+ ed = self.currentDoc
1862
+ if ed is None: # no document selected
1863
+ return
1864
+
1865
+ lineText, _ = ed.GetCurLine()
1866
+ self.shell.clearAndReplaceTyped(lineText)
1867
+ self.shell.submit(self.shell.getTyped())
1868
+ ed.LineDown()
1869
+
1870
+ def onSetCWDFromBrowserPane(self, event):
1871
+ """Set the current working directory by browsing for it."""
1872
+
1873
+ if not hasattr(self, 'fileBrowserWindow'):
1874
+ dlg = wx.MessageDialog(
1875
+ self,
1876
+ "Cannot set working directory, file browser pane unavailable.",
1877
+ "Error",
1878
+ style=wx.ICON_ERROR | wx.OK)
1879
+ dlg.ShowModal()
1880
+ dlg.Destroy()
1881
+ event.Skip()
1882
+
1883
+ cwdpath = self.fileBrowserWindow.currentPath
1884
+ try:
1885
+ os.chdir(cwdpath)
1886
+ except OSError:
1887
+ dlg = wx.MessageDialog(
1888
+ self,
1889
+ "Cannot set `{}` as working directory.".format(cwdpath),
1890
+ "Error",
1891
+ style=wx.ICON_ERROR | wx.OK)
1892
+ dlg.ShowModal()
1893
+ dlg.Destroy()
1894
+ event.Skip()
1895
+ return
1896
+
1897
+ def onSetCWDFromBrowse(self, event):
1898
+ """Set the current working directory by browsing for it."""
1899
+ dlg = wx.DirDialog(self, "Choose directory ...", "",
1900
+ wx.DD_DEFAULT_STYLE | wx.DD_DIR_MUST_EXIST)
1901
+
1902
+ if dlg.ShowModal() == wx.ID_OK:
1903
+ cwdpath = dlg.GetPath()
1904
+ dlg.Destroy()
1905
+ else:
1906
+ dlg.Destroy()
1907
+ event.Skip() # user canceled
1908
+ return
1909
+
1910
+ try:
1911
+ os.chdir(cwdpath)
1912
+ except OSError:
1913
+ dlg = wx.MessageDialog(
1914
+ self,
1915
+ "Cannot set `{}` as working directory.".format(cwdpath),
1916
+ "Error",
1917
+ style=wx.ICON_ERROR | wx.OK)
1918
+ dlg.ShowModal()
1919
+ dlg.Destroy()
1920
+ event.Skip()
1921
+ return
1922
+
1923
+ if hasattr(self, 'fileBrowserWindow'):
1924
+ dlg = wx.MessageDialog(
1925
+ self,
1926
+ "Working directory changed, would you like to display it in "
1927
+ "the file browser pane?",
1928
+ 'Question', style=wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION)
1929
+
1930
+ if dlg.ShowModal() == wx.ID_YES:
1931
+ self.fileBrowserWindow.gotoDir(cwdpath)
1932
+
1933
+ # mdc - potential feature for the future
1934
+ # def onPushLineToShell(self, event=None):
1935
+ # """Run a line in the code editor in the shell."""
1936
+ # if self.currentDoc is None:
1937
+ # return
1938
+ #
1939
+ # lineno = self.currentDoc.GetCurrentLine()
1940
+ # cmdText = self.currentDoc.GetLineText(lineno)
1941
+ #
1942
+ # if self._useShell == 'pyshell':
1943
+ # self.shell.run(cmdText, prompt=False)
1944
+ #
1945
+ # self.currentDoc.GotoLine(lineno + 1)
1946
+
1947
+ def onIdle(self, event):
1948
+ # check the script outputs to see if anything has been written to
1949
+ # stdout
1950
+ if self.scriptProcess is not None:
1951
+ if self.scriptProcess.IsInputAvailable():
1952
+ stream = self.scriptProcess.GetInputStream()
1953
+ text = stream.read()
1954
+ self.outputWindow.write(text)
1955
+ if self.scriptProcess.IsErrorAvailable():
1956
+ stream = self.scriptProcess.GetErrorStream()
1957
+ text = stream.read()
1958
+ self.outputWindow.write(text)
1959
+ # check if we're in the same place as before
1960
+ if self.currentDoc is not None:
1961
+ if hasattr(self.currentDoc, 'GetCurrentPos'):
1962
+ pos = self.currentDoc.GetCurrentPos()
1963
+ if self._lastCaretPos != pos:
1964
+ self.currentDoc.OnUpdateUI(evt=None)
1965
+ self._lastCaretPos = pos
1966
+ # if file has been modified externally, show message
1967
+ if (
1968
+ time.time() - self.fileStatusLastChecked > self.fileStatusCheckInterval
1969
+ and not self.showingReloadDialog
1970
+ ):
1971
+ self.checkExternallyModified(event)
1972
+
1973
+ def pageChanged(self, event):
1974
+ """Event called when the user switches between editor tabs."""
1975
+ old = event.GetOldSelection()
1976
+ # close any auto-complete or calltips when switching pages
1977
+ if old != wx.NOT_FOUND:
1978
+ oldPage = None
1979
+
1980
+ try: # last page was closed, this will raise and error
1981
+ oldPage = self.notebook.GetPage(old)
1982
+ except Exception:
1983
+ pass
1984
+
1985
+ if oldPage is not None:
1986
+ if hasattr(oldPage, 'CallTipActive'):
1987
+ if oldPage.CallTipActive():
1988
+ oldPage.CallTipCancel()
1989
+ oldPage.openBrackets = 0
1990
+ if hasattr(oldPage, 'AutoCompActive'):
1991
+ if oldPage.AutoCompActive():
1992
+ oldPage.AutoCompCancel()
1993
+
1994
+ new = event.GetSelection()
1995
+ self.currentDoc = self.notebook.GetPage(new)
1996
+ self.app.updateWindowMenu()
1997
+ self.setFileModified(self.currentDoc.UNSAVED)
1998
+ self.setTitle(title=self.winTitle, document=self.currentDoc.filename)
1999
+
2000
+ self.currentDoc.analyseScript()
2001
+
2002
+ fileType = self.currentDoc.getFileType()
2003
+ # enable run buttons if current file is a Python script
2004
+ if 'sendRunner' in self.ribbon.buttons:
2005
+ isExp = fileType == 'Python'
2006
+ self.ribbon.buttons['sendRunner'].Enable(isExp)
2007
+ self.ribbon.buttons['pilotRunner'].Enable(isExp)
2008
+
2009
+ self.statusBar.SetStatusText(fileType, 2)
2010
+ # check for external modified
2011
+ self.checkExternallyModified(event)
2012
+
2013
+ def checkExternallyModified(self, event=None):
2014
+ """
2015
+ Check whether the current file has been modified externally, and show a message dialog if
2016
+ so.
2017
+ """
2018
+ if not self.expectedModTime(self.currentDoc):
2019
+ self.showingReloadDialog = True
2020
+ filename = os.path.basename(self.currentDoc.filename)
2021
+ msg = _translate("'%s' was modified outside of PsychoPy:\n\n"
2022
+ "Reload (without saving)?") % filename
2023
+ dlg = dialogs.MessageDialog(self, message=msg, type='Warning')
2024
+ dlg.Raise()
2025
+ if dlg.ShowModal() == wx.ID_YES:
2026
+ self.statusBar.SetStatusText(_translate('Reloading file'))
2027
+ self.fileReload(event,
2028
+ filename=self.currentDoc.filename,
2029
+ checkSave=False)
2030
+ self.showingReloadDialog = False
2031
+ self.statusBar.SetStatusText('')
2032
+ dlg.Destroy()
2033
+ self.fileStatusLastChecked = time.time()
2034
+ # Enable / disable save button
2035
+ self.ribbon.buttons['save'].Enable(self.currentDoc.UNSAVED)
2036
+ self.fileMenu.Enable(wx.ID_SAVE, self.currentDoc.UNSAVED)
2037
+
2038
+ # def pluginManager(self, evt=None, value=True):
2039
+ # """Show the plugin manager frame."""
2040
+ # PluginManagerFrame(self).ShowModal()
2041
+
2042
+ def OnFindOpen(self, event):
2043
+ if not self.currentDoc:
2044
+ # don't do anything if there's no document to search
2045
+ return
2046
+ if self.findDlg is not None:
2047
+ # if find dlg already exists, show it and give it focus
2048
+ self.findDlg.Show()
2049
+ self.findDlg.Raise()
2050
+ self.findDlg.SetFocus()
2051
+ else:
2052
+ # if not, make one now
2053
+ win = wx.Window.FindFocus()
2054
+ self.findData.SetFindString(self.currentDoc.GetSelectedText())
2055
+ self.findDlg = wx.FindReplaceDialog(win, self.findData, "Find",
2056
+ wx.FR_NOWHOLEWORD)
2057
+ self.findDlg.Bind(wx.EVT_FIND_CLOSE, self.OnFindClose)
2058
+ self.findDlg.Show()
2059
+
2060
+ def OnFindNext(self, event):
2061
+ # find the next occurrence of text according to last find dialogue data
2062
+ if not self.findData.GetFindString():
2063
+ self.OnFindOpen(event)
2064
+ return
2065
+ self.currentDoc.DoFindNext(self.findData, self.findDlg)
2066
+ # if self.findDlg is not None:
2067
+ # self.OnFindClose(None)
2068
+
2069
+ def OnFindClose(self, event):
2070
+ self.findDlg.Destroy()
2071
+ self.findDlg = None
2072
+
2073
+ def OnFileHistory(self, evt=None):
2074
+ # get the file based on the menu ID
2075
+ fileNum = evt.GetId() - wx.ID_FILE1
2076
+ path = self.fileHistory.GetHistoryFile(fileNum)
2077
+ self.setCurrentDoc(path) # load the file
2078
+ # add it back to the history so it will be moved up the list
2079
+ self.fileHistory.AddFileToHistory(path)
2080
+
2081
+ def gotoLine(self, filename=None, line=0):
2082
+ # goto a specific line in a specific file and select all text in it
2083
+ self.setCurrentDoc(filename)
2084
+ self.currentDoc.EnsureVisible(line)
2085
+ self.currentDoc.GotoLine(line)
2086
+ endPos = self.currentDoc.GetCurrentPos()
2087
+
2088
+ self.currentDoc.GotoLine(line - 1)
2089
+ stPos = self.currentDoc.GetCurrentPos()
2090
+
2091
+ self.currentDoc.SetSelection(stPos, endPos)
2092
+
2093
+ def getOpenFilenames(self):
2094
+ """Return the full filename of each open tab"""
2095
+ names = []
2096
+ for ii in range(self.notebook.GetPageCount()):
2097
+ names.append(self.notebook.GetPage(ii).filename)
2098
+ return names
2099
+
2100
+ def quit(self, event):
2101
+ self.app.quit()
2102
+
2103
+ def checkSave(self):
2104
+ """Loop through all open files checking whether they need save
2105
+ """
2106
+ for ii in range(self.notebook.GetPageCount()):
2107
+ doc = self.notebook.GetPage(ii)
2108
+ filename = doc.filename
2109
+ if doc.UNSAVED:
2110
+ self.notebook.SetSelection(ii) # fetch that page and show it
2111
+ # make sure frame is at front
2112
+ self.Show(True)
2113
+ self.Raise()
2114
+ self.app.SetTopWindow(self)
2115
+ # then bring up dialog
2116
+ msg = _translate('Save changes to %s before quitting?')
2117
+ dlg = dialogs.MessageDialog(self, message=msg % filename,
2118
+ type='Warning')
2119
+ resp = dlg.ShowModal()
2120
+ sys.stdout.flush()
2121
+ dlg.Destroy()
2122
+ if resp == wx.ID_CANCEL:
2123
+ return 0 # return, don't quit
2124
+ elif resp == wx.ID_YES:
2125
+ self.fileSave() # save then quit
2126
+ elif resp == wx.ID_NO:
2127
+ pass # don't save just quit
2128
+ return 1
2129
+
2130
+ def closeFrame(self, event=None, checkSave=True):
2131
+ """Close open windows, update prefs.appData (but don't save)
2132
+ and either close the frame or hide it
2133
+ """
2134
+ if (len(self.app.getAllFrames(frameType="builder")) == 0
2135
+ and len(self.app.getAllFrames(frameType="runner")) == 0
2136
+ and sys.platform != 'darwin'):
2137
+ if not self.app.quitting:
2138
+ # send the event so it can be vetoed if needed
2139
+ self.app.quit(event)
2140
+ return # app.quit() will have closed the frame already
2141
+
2142
+ # check all files before initiating close of any
2143
+ if checkSave and self.checkSave() == 0:
2144
+ return 0 # this signals user cancelled
2145
+
2146
+ wasShown = self.IsShown()
2147
+ self.Hide() # ugly to see it close all the files independently
2148
+
2149
+ # store current appData
2150
+ self.appData['prevFiles'] = []
2151
+ currFiles = self.getOpenFilenames()
2152
+ for thisFileName in currFiles:
2153
+ self.appData['prevFiles'].append(thisFileName)
2154
+ # get size and window layout info
2155
+ if self.IsIconized():
2156
+ self.Iconize(False) # will return to normal mode to get size info
2157
+ self.appData['state'] = 'normal'
2158
+ elif self.IsMaximized():
2159
+ # will briefly return to normal mode to get size info
2160
+ self.Maximize(False)
2161
+ self.appData['state'] = 'maxim'
2162
+ else:
2163
+ self.appData['state'] = 'normal'
2164
+ self.appData['auiPerspective'] = self.paneManager.SavePerspective()
2165
+ self.appData['winW'], self.appData['winH'] = self.GetSize()
2166
+ self.appData['winX'], self.appData['winY'] = self.GetPosition()
2167
+ if sys.platform == 'darwin':
2168
+ # for some reason mac wxpython <=2.8 gets this wrong (toolbar?)
2169
+ self.appData['winH'] -= 39
2170
+ self.appData['fileHistory'] = []
2171
+ for ii in range(self.fileHistory.GetCount()):
2172
+ self.appData['fileHistory'].append(
2173
+ self.fileHistory.GetHistoryFile(ii))
2174
+
2175
+ # as of wx3.0 the AUI manager needs to be uninitialised explicitly
2176
+ self.paneManager.UnInit()
2177
+
2178
+ self.app.forgetFrame(self)
2179
+ self.Destroy()
2180
+ self.app.coder = None
2181
+ self.app.updateWindowMenu()
2182
+
2183
+ def filePrint(self, event=None):
2184
+ pr = Printer()
2185
+ docName = self.currentDoc.filename
2186
+ text = codecs.open(docName, 'r', 'utf-8').read()
2187
+ pr.Print(text, docName)
2188
+
2189
+ def fileNew(self, event=None, filepath=""):
2190
+ self.setCurrentDoc(filepath)
2191
+
2192
+ def fileReload(self, event, filename=None, checkSave=False):
2193
+ if filename is None:
2194
+ return # should raise an exception
2195
+
2196
+ docId = self.findDocID(filename)
2197
+ if docId == -1:
2198
+ return
2199
+ doc = self.notebook.GetPage(docId)
2200
+
2201
+ # is the file still there
2202
+ if os.path.isfile(filename):
2203
+ with io.open(filename, 'r', encoding='utf-8-sig') as f:
2204
+ doc.SetText(f.read())
2205
+ doc.fileModTime = os.path.getmtime(filename)
2206
+ doc.EmptyUndoBuffer()
2207
+ doc.Colourise(0, -1)
2208
+ doc.UNSAVED = False
2209
+ else:
2210
+ # file was removed after we found the changes, lets
2211
+ # give the user a chance to save his file.
2212
+ self.UNSAVED = True
2213
+
2214
+ if doc == self.currentDoc:
2215
+ # Enable / disable save button
2216
+ self.ribbon.buttons['save'].Enable(self.currentDoc.UNSAVED)
2217
+ self.fileMenu.Enable(wx.ID_SAVE, self.currentDoc.UNSAVED)
2218
+
2219
+ self.currentDoc.analyseScript()
2220
+
2221
+ @property
2222
+ def filename(self):
2223
+ if self.currentDoc:
2224
+ return self.currentDoc.filename
2225
+
2226
+ def findDocID(self, filename):
2227
+ # find the ID of the current doc
2228
+ for ii in range(self.notebook.GetPageCount()):
2229
+ if self.notebook.GetPage(ii).filename == filename:
2230
+ return ii
2231
+ return -1
2232
+
2233
+ def setCurrentDoc(self, filename, keepHidden=False):
2234
+ # check if this file is already open
2235
+ docID = self.findDocID(filename)
2236
+ readOnlyPref = 'readonly' in self.app.prefs.coder
2237
+ readonly = readOnlyPref and self.app.prefs.coder['readonly']
2238
+ path, shortName = os.path.split(filename)
2239
+ if docID >= 0:
2240
+ self.currentDoc = self.notebook.GetPage(docID)
2241
+ self.notebook.SetSelection(docID)
2242
+ else: # create new page and load document
2243
+ # if there is only a placeholder document then close it
2244
+ if len(self.getOpenFilenames()) == 1:
2245
+ if (len(self.currentDoc.GetText()) == 0 and
2246
+ self.currentDoc.filename.startswith('untitled')):
2247
+ self.fileClose(self.currentDoc.filename)
2248
+
2249
+ # load text from document
2250
+ if os.path.isfile(filename):
2251
+ try:
2252
+ with io.open(filename, 'r', encoding='utf-8-sig') as f:
2253
+ fileText = f.read()
2254
+ newlines = f.newlines
2255
+ except UnicodeDecodeError:
2256
+ dlg = dialogs.MessageDialog(self, message=_translate(
2257
+ 'Failed to open `{}`. Make sure that encoding of '
2258
+ 'the file is utf-8.').format(filename), type='Info')
2259
+ dlg.ShowModal()
2260
+ dlg.Destroy()
2261
+ return
2262
+ elif filename == '':
2263
+ pass # user requested a new document
2264
+ else:
2265
+ dlg = dialogs.MessageDialog(
2266
+ self,
2267
+ message='Failed to open {}. Not a file.'.format(filename),
2268
+ type='Info')
2269
+ dlg.ShowModal()
2270
+ dlg.Destroy()
2271
+ return # do nothing
2272
+
2273
+ # create an editor window to put the text in
2274
+ p = self.currentDoc = CodeEditor(self.notebook, -1, frame=self,
2275
+ readonly=readonly)
2276
+
2277
+ # load text
2278
+ if filename != '':
2279
+ # put the text in editor
2280
+ self.currentDoc.SetText(fileText)
2281
+ self.currentDoc.newlines = newlines
2282
+ del fileText # delete the buffer
2283
+ self.currentDoc.fileModTime = os.path.getmtime(filename)
2284
+ self.fileHistory.AddFileToHistory(filename)
2285
+ else:
2286
+ # set name for an untitled document
2287
+ filename = shortName = 'untitled.py'
2288
+ allFileNames = self.getOpenFilenames()
2289
+ n = 1
2290
+ while filename in allFileNames:
2291
+ filename = 'untitled%i.py' % n
2292
+ n += 1
2293
+
2294
+ # create modification time for in memory document
2295
+ self.currentDoc.fileModTime = time.time()
2296
+
2297
+ self.currentDoc.EmptyUndoBuffer()
2298
+
2299
+ self.notebook.AddPage(p, shortName)
2300
+ nbIndex = len(self.getOpenFilenames()) - 1
2301
+ if isinstance(self.notebook, wx.Notebook):
2302
+ self.notebook.ChangeSelection(nbIndex)
2303
+ elif isinstance(self.notebook, aui.AuiNotebook):
2304
+ self.notebook.SetSelection(nbIndex)
2305
+ self.currentDoc.filename = filename
2306
+ self.currentDoc.setLexerFromFileName() # chose the best lexer
2307
+ #self.currentDoc.cacheAutoComplete()
2308
+
2309
+ self.setFileModified(False)
2310
+ self.currentDoc.SetFocus()
2311
+
2312
+ fileType = self.currentDoc.getFileType()
2313
+
2314
+ # line wrapping
2315
+ self.currentDoc.SetWrapMode(
2316
+ wx.stc.STC_WRAP_WORD if self.lineWrapChk.IsChecked() else wx.stc.STC_WRAP_NONE)
2317
+ self.statusBar.SetStatusText(fileType, 2)
2318
+ fname = Path(self.currentDoc.filename).name
2319
+ self.setTitle(title=self.winTitle, document=fname)
2320
+ #if len(self.getOpenFilenames()) > 0:
2321
+ self.currentDoc.analyseScript()
2322
+ if os.path.isdir(path):
2323
+ self.fileBrowserWindow.gotoDir(path)
2324
+
2325
+ if not keepHidden:
2326
+ self.Show() # if the user had closed the frame it might be hidden
2327
+ if readonly:
2328
+ self.currentDoc.SetReadOnly(True)
2329
+ #self.currentDoc._applyAppTheme()
2330
+ isExp = filename.endswith(".py") or filename.endswith(".psyexp")
2331
+
2332
+ # if the toolbar is done then adjust buttons
2333
+ for key in ("sendRunner", "pilotRunner", "pyrun", "pypilot"):
2334
+ if key in self.ribbon.buttons:
2335
+ self.ribbon.buttons[key].Enable(isExp)
2336
+ # update save/saveas buttons
2337
+ self.ribbon.buttons['save'].Enable(readonly and self.currentDoc.UNSAVED)
2338
+ self.fileMenu.Enable(wx.ID_SAVE, readonly and self.currentDoc.UNSAVED)
2339
+ self.ribbon.buttons['saveas'].Enable(bool(self.filename))
2340
+ self.fileMenu.Enable(wx.ID_SAVEAS, bool(self.filename))
2341
+ # update menu items
2342
+ self.pavloviaMenu.syncBtn.Enable(bool(self.filename))
2343
+ self.pavloviaMenu.newBtn.Enable(bool(self.filename))
2344
+ self.app.updateWindowMenu()
2345
+ self.fileBrowserWindow.updateFileBrowser()
2346
+ # update pavlovia project
2347
+ self.project = pavlovia.getProject(self.currentDoc.filename)
2348
+ self.ribbon.buttons['pavproject'].updateInfo()
2349
+
2350
+ def fileOpen(self, event=None, filename=None):
2351
+ if not filename:
2352
+ # get path of current file (empty if current file is '')
2353
+ if hasattr(self.currentDoc, 'filename'):
2354
+ initPath = str(Path(self.currentDoc.filename).parent)
2355
+ else:
2356
+ initPath = ""
2357
+ # Open dlg
2358
+ dlg = wx.FileDialog(
2359
+ self, message=_translate("Open file ..."),
2360
+ defaultDir=initPath, style=wx.FD_OPEN
2361
+ )
2362
+
2363
+ if dlg.ShowModal() == wx.ID_OK:
2364
+ filename = dlg.GetPath()
2365
+ self.statusBar.SetStatusText(_translate('Loading file'))
2366
+ else:
2367
+ return -1
2368
+
2369
+ if filename and os.path.isfile(filename):
2370
+ if filename.lower().endswith('.psyexp'):
2371
+ self.app.newBuilderFrame(fileName=filename)
2372
+ else:
2373
+ self.setCurrentDoc(filename)
2374
+ # don't do the next step if no file was opened (hack!!)
2375
+ if self.notebook.GetPageCount() > 0:
2376
+ if self.notebook.GetCurrentPage().filename == filename:
2377
+ self.setFileModified(False)
2378
+
2379
+ self.statusBar.SetStatusText('')
2380
+
2381
+ # don't do this, this will add unwanted files to the task list - mdc
2382
+ # self.app.runner.addTask(fileName=filename)
2383
+
2384
+ def expectedModTime(self, doc):
2385
+ # check for possible external changes to the file, based on
2386
+ # mtime-stamps
2387
+ if doc is None:
2388
+ return True # we have no file loaded
2389
+ # files that don't exist DO have the expected mod-time
2390
+ filename = Path(doc.filename)
2391
+ if not filename.is_file():
2392
+ return True
2393
+ actualModTime = os.path.getmtime(filename)
2394
+ expectedModTime = doc.fileModTime
2395
+ if abs(float(actualModTime) - float(expectedModTime)) > 1:
2396
+ msg = 'File %s modified outside of the Coder (IDE).' % filename
2397
+ print(msg)
2398
+ return False
2399
+ return True
2400
+
2401
+ def fileSave(self, event=None, filename=None, doc=None):
2402
+ """Save a ``doc`` with a particular ``filename``.
2403
+ If ``doc`` is ``None`` then the current active doc is used.
2404
+ If the current active doc is also ``None``, then quit early.
2405
+ If the ``filename`` is ``None`` then the ``doc``'s current filename
2406
+ is used or a dlg is presented to get a new filename.
2407
+ """
2408
+ if hasattr(self.currentDoc, 'AutoCompActive'):
2409
+ if self.currentDoc.AutoCompActive():
2410
+ self.currentDoc.AutoCompCancel()
2411
+
2412
+ if doc is None:
2413
+ if self.currentDoc is None:
2414
+ return
2415
+ doc = self.currentDoc
2416
+ if filename is None:
2417
+ filename = doc.filename
2418
+ if filename.startswith('untitled'):
2419
+ self.fileSaveAs(filename)
2420
+ # self.setFileModified(False) # done in save-as if saved; don't
2421
+ # want here if not saved there
2422
+ else:
2423
+ # here detect odd conditions, and set failToSave = True to try
2424
+ # 'Save-as' rather than 'Save'
2425
+ failToSave = False
2426
+ if not self.expectedModTime(doc) and os.path.exists(filename):
2427
+ msg = _translate("File appears to have been modified outside "
2428
+ "of PsychoPy:\n %s\nOK to overwrite?")
2429
+ basefile = os.path.basename(doc.filename)
2430
+ dlg = dialogs.MessageDialog(self, message=msg % basefile,
2431
+ type='Warning')
2432
+ if dlg.ShowModal() != wx.ID_YES:
2433
+ failToSave = True
2434
+ dlg.Destroy()
2435
+ if os.path.exists(filename) and not os.access(filename, os.W_OK):
2436
+ msg = _translate("File '%s' lacks write-permission:\n"
2437
+ "Will try save-as instead.")
2438
+ basefile = os.path.basename(doc.filename)
2439
+ dlg = dialogs.MessageDialog(self, message=msg % basefile,
2440
+ type='Info')
2441
+ dlg.ShowModal()
2442
+ failToSave = True
2443
+ dlg.Destroy()
2444
+ try:
2445
+ if failToSave:
2446
+ raise IOError
2447
+ self.statusBar.SetStatusText(_translate('Saving file'))
2448
+ newlines = '\n' # system default, os.linesep
2449
+ with io.open(filename, 'w', encoding='utf-8', newline=newlines) as f:
2450
+ f.write(doc.GetText())
2451
+ self.setFileModified(False)
2452
+ doc.fileModTime = os.path.getmtime(filename) # JRG
2453
+ except Exception:
2454
+ print("Unable to save %s... trying save-as instead." %
2455
+ os.path.basename(doc.filename))
2456
+ self.fileSaveAs(filename)
2457
+
2458
+ if analyseAuto and len(self.getOpenFilenames()) > 0:
2459
+ self.currentDoc.analyseScript()
2460
+
2461
+ # reset status text
2462
+ self.statusBar.SetStatusText('')
2463
+ self.fileHistory.AddFileToHistory(filename)
2464
+
2465
+ def fileSaveAs(self, event, filename=None, doc=None):
2466
+ """Save a ``doc`` with a new ``filename``, after presenting a dlg
2467
+ to get a new filename.
2468
+
2469
+ If ``doc`` is ``None`` then the current active doc is used.
2470
+
2471
+ If the ``filename`` is not ``None`` then this will be the initial
2472
+ value for the filename in the dlg.
2473
+ """
2474
+ # cancel autocomplete if active
2475
+ if self.currentDoc.AutoCompActive():
2476
+ self.currentDoc.AutoCompCancel()
2477
+
2478
+ if doc is None:
2479
+ doc = self.currentDoc
2480
+ docId = self.notebook.GetSelection()
2481
+ else:
2482
+ docId = self.findDocID(doc.filename)
2483
+ if filename is None:
2484
+ filename = doc.filename
2485
+
2486
+ # if we have an absolute path then split it
2487
+ initPath, filename = os.path.split(filename)
2488
+ # set wildcards; need strings to appear inside _translate
2489
+ if sys.platform != 'darwin':
2490
+ wildcard = _translate("Python script (*.py)|*.py|"
2491
+ "JavaScript file (*.js)|*.js|"
2492
+ "Text file (*.txt)|*.txt|"
2493
+ "Any file (*.*)|*.*")
2494
+ else:
2495
+ wildcard = _translate("Python script (*.py)|*.py|"
2496
+ "JavaScript file (*.js)|*.js|"
2497
+ "Text file (*.txt)|*.txt|"
2498
+ "Any file (*.*)|*")
2499
+
2500
+ dlg = wx.FileDialog(
2501
+ self, message=_translate("Save file as ..."), defaultDir=initPath,
2502
+ defaultFile=filename, style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT,
2503
+ wildcard=wildcard)
2504
+
2505
+ if dlg.ShowModal() == wx.ID_OK:
2506
+ newPath = dlg.GetPath()
2507
+ doc.filename = newPath
2508
+ self.fileSave(event=None, filename=newPath, doc=doc)
2509
+ path, shortName = os.path.split(newPath)
2510
+ self.notebook.SetPageText(docId, shortName)
2511
+ self.setFileModified(False)
2512
+ # JRG: 'doc.filename' should = newPath = dlg.getPath()
2513
+ doc.fileModTime = os.path.getmtime(doc.filename)
2514
+ # update the lexer since the extension could have changed
2515
+ self.currentDoc.setLexerFromFileName()
2516
+ # re-analyse the document
2517
+ self.currentDoc.analyseScript()
2518
+ # Update status bar and title bar labels
2519
+ self.statusBar.SetStatusText(self.currentDoc.getFileType(), 2)
2520
+
2521
+ self.setTitle(title=self.winTitle, document=self.currentDoc.filename)
2522
+
2523
+ dlg.Destroy()
2524
+
2525
+ def fileClose(self, event, filename=None, checkSave=True):
2526
+ if self.currentDoc is None:
2527
+ # so a coder window with no files responds like the builder window
2528
+ # to self.keys.close
2529
+ self.closeFrame()
2530
+ return
2531
+ if filename is None:
2532
+ filename = self.currentDoc.filename
2533
+ self.currentDoc = self.notebook.GetPage(self.notebook.GetSelection())
2534
+ if self.currentDoc.UNSAVED and checkSave:
2535
+ sys.stdout.flush()
2536
+ msg = _translate('Save changes to %s before quitting?') % filename
2537
+ dlg = dialogs.MessageDialog(self, message=msg, type='Warning')
2538
+ resp = dlg.ShowModal()
2539
+ sys.stdout.flush()
2540
+ dlg.Destroy()
2541
+ if resp == wx.ID_CANCEL:
2542
+ if isinstance(event, aui.AuiNotebookEvent):
2543
+ event.Veto()
2544
+ return -1 # return, don't quit
2545
+ elif resp == wx.ID_YES:
2546
+ # save then quit
2547
+ self.fileSave(None)
2548
+ elif resp == wx.ID_NO:
2549
+ pass # don't save just quit
2550
+ # remove the document and its record
2551
+ currId = self.notebook.GetSelection()
2552
+ # if this was called by AuiNotebookEvent, then page has closed already
2553
+ if not isinstance(event, aui.AuiNotebookEvent):
2554
+ self.notebook.DeletePage(currId)
2555
+ newPageID = self.notebook.GetSelection()
2556
+ else:
2557
+ newPageID = self.notebook.GetSelection() - 1
2558
+ # set new current doc
2559
+ if newPageID < 0:
2560
+ self.currentDoc = None
2561
+ self.statusBar.SetStatusText("", 1) # clear line pos
2562
+ self.statusBar.SetStatusText("", 2) # clear file type in status bar
2563
+ self.statusBar.SetStatusText("", 3) # psyhcopy version
2564
+ # set window title
2565
+ self.setTitle(title=self.winTitle, document=self.currentDoc)
2566
+ # clear the source tree
2567
+ self.structureWindow.srcTree.DeleteAllItems()
2568
+ # disable save buttons
2569
+ self.ribbon.buttons['save'].Disable()
2570
+ self.ribbon.buttons['saveas'].Disable()
2571
+ else:
2572
+ self.setCurrentDoc(self.getOpenFilenames()[newPageID])
2573
+ self.structureWindow.refresh()
2574
+ # set to current file status
2575
+ self.setFileModified(self.currentDoc.UNSAVED)
2576
+ # update file browser buttons
2577
+ self.fileBrowserWindow.updateFileBrowser()
2578
+
2579
+ def fileCloseAll(self, event, checkSave=True):
2580
+ """Close all files open in the editor."""
2581
+ if self.currentDoc is None:
2582
+ event.Skip()
2583
+ return
2584
+
2585
+ for fname in self.getOpenFilenames():
2586
+ self.fileClose(event, fname, checkSave)
2587
+
2588
+ def sendToRunner(self, evt=None):
2589
+ """
2590
+ Send the current file to the Runner.
2591
+ """
2592
+ fullPath = Path(self.currentDoc.filename)
2593
+ # does the file need saving before running?
2594
+ if self.currentDoc.UNSAVED or not fullPath.is_file():
2595
+ sys.stdout.flush()
2596
+ msg = _translate('Save changes to %s before running?') % fullPath.name
2597
+ dlg = dialogs.MessageDialog(self, message=msg, type='Warning')
2598
+ resp = dlg.ShowModal()
2599
+ sys.stdout.flush()
2600
+ dlg.Destroy()
2601
+ if resp == wx.ID_CANCEL:
2602
+ return False # return, don't run
2603
+ elif resp == wx.ID_YES:
2604
+ self.fileSave(None) # save then run
2605
+ elif resp == wx.ID_NO:
2606
+ pass # just run
2607
+ fullPath = Path(self.currentDoc.filename) # Get full path again in case it has changed
2608
+ if self.app.runner == None:
2609
+ self.app.showRunner()
2610
+ if fullPath.is_file():
2611
+ if self.ribbon.buttons['pyswitch'].mode:
2612
+ runMode = "run"
2613
+ else:
2614
+ runMode = "pilot"
2615
+ self.app.runner.addTask(fileName=fullPath, runMode=runMode)
2616
+ else:
2617
+ alert(code=6105, strFields={'path': str(fullPath)})
2618
+ self.app.runner.Raise()
2619
+ self.app.showRunner()
2620
+
2621
+ return True
2622
+
2623
+ def onRunShortcut(self, evt=None):
2624
+ """
2625
+ Callback for when the run shortcut is pressed - will either run or pilot
2626
+ depending on run mode
2627
+ """
2628
+ if self.currentDoc is None:
2629
+ return
2630
+
2631
+ # run/pilot according to mode
2632
+ if self.ribbon.buttons['pyswitch'].mode:
2633
+ self.runFile(evt)
2634
+ else:
2635
+ self.pilotFile(evt)
2636
+
2637
+ def runFile(self, event=None):
2638
+ """
2639
+ Send the current file to the Runner and run it.
2640
+ """
2641
+ if self.currentDoc is None: # do nothing if no file is present
2642
+ return
2643
+
2644
+ if self.sendToRunner(event):
2645
+ self.app.runner.panel.runLocal(event, focusOnExit='coder')
2646
+ self.Raise()
2647
+
2648
+ def pilotFile(self, event=None):
2649
+ if self.currentDoc is None:
2650
+ return
2651
+
2652
+ if self.sendToRunner(event):
2653
+ self.app.runner.panel.pilotLocal(event, focusOnExit='coder')
2654
+ self.Raise()
2655
+
2656
+ def duplicateLine(self, event):
2657
+ """Duplicate the current line."""
2658
+ self.currentDoc.LineDuplicate()
2659
+
2660
+ def copy(self, event):
2661
+ """Copy text to the clipboard from the focused widget."""
2662
+ foc = self.FindFocus()
2663
+ if isinstance(foc, CodeEditor):
2664
+ self.currentDoc.Copy() # let the text ctrl handle this
2665
+ elif hasattr(foc, 'Copy'): # handle any other widget
2666
+ foc.Copy()
2667
+
2668
+ def cut(self, event):
2669
+ """Cut text from the focused widget to clipboard."""
2670
+ foc = self.FindFocus()
2671
+ if isinstance(foc, CodeEditor):
2672
+ self.currentDoc.Cut()
2673
+ self.currentDoc.analyseScript()
2674
+ elif hasattr(foc, 'Cut'):
2675
+ foc.Cut()
2676
+
2677
+ def paste(self, event):
2678
+ """Paste text from the clipboard to the focused object."""
2679
+ foc = self.FindFocus()
2680
+ if isinstance(foc, CodeEditor):
2681
+ self.currentDoc.Paste()
2682
+ self.currentDoc.analyseScript()
2683
+ elif hasattr(foc, 'Paste'):
2684
+ foc.Paste()
2685
+
2686
+ def undo(self, event):
2687
+ if self.currentDoc:
2688
+ self.currentDoc.Undo()
2689
+ self.currentDoc.analyseScript()
2690
+
2691
+ def redo(self, event):
2692
+ if self.currentDoc:
2693
+ self.currentDoc.Redo()
2694
+ self.currentDoc.analyseScript()
2695
+
2696
+ def commentSelected(self, event):
2697
+ self.currentDoc.commentLines()
2698
+ self.currentDoc.analyseScript()
2699
+
2700
+ def uncommentSelected(self, event):
2701
+ self.currentDoc.uncommentLines()
2702
+ self.currentDoc.analyseScript()
2703
+
2704
+ def toggleComments(self, event):
2705
+ self.currentDoc.toggleCommentLines()
2706
+ self.currentDoc.analyseScript()
2707
+
2708
+ def bigFont(self, event):
2709
+ self.currentDoc.increaseFontSize()
2710
+
2711
+ def smallFont(self, event):
2712
+ self.currentDoc.decreaseFontSize()
2713
+
2714
+ def resetFont(self, event):
2715
+ self.currentDoc.resetFontSize()
2716
+
2717
+ def foldAll(self, event):
2718
+ self.currentDoc.FoldAll(wx.stc.STC_FOLDACTION_TOGGLE)
2719
+
2720
+ # def unfoldAll(self, event):
2721
+ # self.currentDoc.ToggleFoldAll(expand = False)
2722
+
2723
+ def setOutputWindow(self, event=None, value=None):
2724
+ # show/hide the output window (from the view menu control)
2725
+ if value is None:
2726
+ value = self.outputChk.IsChecked()
2727
+ self.outputChk.Check(value)
2728
+ if value:
2729
+ # show the pane
2730
+ self.prefs['showOutput'] = True
2731
+ self.paneManager.GetPane('Shelf').Show()
2732
+ else:
2733
+ # hide the pane
2734
+ self.prefs['showOutput'] = False
2735
+ self.paneManager.GetPane('Shelf').Hide()
2736
+ self.app.prefs.saveUserPrefs()
2737
+ try: # includes a validation
2738
+ self.paneManager.Update()
2739
+ except wxAssertionError as err:
2740
+ logging.warn("Exception caught: " + str(err))
2741
+
2742
+ def setShowIndentGuides(self, event):
2743
+ # show/hide the source assistant (from the view menu control)
2744
+ newVal = self.indentGuideChk.IsChecked()
2745
+ self.appData['showIndentGuides'] = newVal
2746
+ for ii in range(self.notebook.GetPageCount()):
2747
+ self.notebook.GetPage(ii).SetIndentationGuides(newVal)
2748
+
2749
+ def setShowWhitespace(self, event):
2750
+ newVal = self.showWhitespaceChk.IsChecked()
2751
+ self.appData['showWhitespace'] = newVal
2752
+ for ii in range(self.notebook.GetPageCount()):
2753
+ self.notebook.GetPage(ii).SetViewWhiteSpace(newVal)
2754
+
2755
+ def setShowEOLs(self, event):
2756
+ newVal = self.showEOLsChk.IsChecked()
2757
+ self.appData['showEOLs'] = newVal
2758
+ for ii in range(self.notebook.GetPageCount()):
2759
+ self.notebook.GetPage(ii).SetViewEOL(newVal)
2760
+
2761
+ def onCloseSourceAsst(self, event):
2762
+ """Called when the source assisant is closed."""
2763
+ pass
2764
+
2765
+ def setSourceAsst(self, event):
2766
+ # show/hide the source assistant (from the view menu control)
2767
+ if not self.sourceAsstChk.IsChecked():
2768
+ self.paneManager.GetPane("SourceAsst").Hide()
2769
+ self.prefs['showSourceAsst'] = False
2770
+ else:
2771
+ self.paneManager.GetPane("SourceAsst").Show()
2772
+ self.prefs['showSourceAsst'] = True
2773
+ self.paneManager.Update()
2774
+
2775
+ # def setAutoComplete(self, event=None):
2776
+ # # show/hide the source assistant (from the view menu control)
2777
+ # self.prefs['autocomplete'] = self.useAutoComp = \
2778
+ # self.chkShowAutoComp.IsChecked()
2779
+
2780
+ # def setFileBrowser(self, event):
2781
+ # # show/hide the source file browser
2782
+ # if not self.fileBrowserChk.IsChecked():
2783
+ # self.paneManager.GetPane("FileBrowser").Hide()
2784
+ # self.prefs['showFileBrowser'] = False
2785
+ # else:
2786
+ # self.paneManager.GetPane("FileBrowser").Show()
2787
+ # self.prefs['showFileBrowser'] = True
2788
+ # self.paneManager.Update()
2789
+
2790
+ def analyseCodeNow(self, event):
2791
+ self.currentDoc.analyseScript()
2792
+
2793
+ # def setAnalyseAuto(self, event):
2794
+ # set autoanalysis (from the check control in the tools menu)
2795
+ # if self.analyseAutoChk.IsChecked():
2796
+ # self.prefs['analyseAuto']=True
2797
+ # else:
2798
+ # self.prefs['analyseAuto']=False
2799
+
2800
+ def demoLoad(self, event):
2801
+ self.setCurrentDoc(str(self.demos[event.GetId()]))
2802
+
2803
+ def tabKeyPressed(self, event):
2804
+ # if several chars are selected then smartIndent
2805
+ # if we're at the start of the line then smartIndent
2806
+ if self.currentDoc.shouldTrySmartIndent():
2807
+ self.smartIndent(event=None)
2808
+ else:
2809
+ # self.currentDoc.CmdKeyExecute(wx.stc.STC_CMD_TAB)
2810
+ pos = self.currentDoc.GetCurrentPos()
2811
+ self.currentDoc.InsertText(pos, '\t')
2812
+ self.currentDoc.SetCurrentPos(pos + 1)
2813
+ self.currentDoc.SetSelection(pos + 1, pos + 1)
2814
+
2815
+ def smartIndent(self, event):
2816
+ self.currentDoc.smartIndent()
2817
+
2818
+ def indent(self, event):
2819
+ self.currentDoc.indentSelection(4)
2820
+
2821
+ def dedent(self, event):
2822
+ self.currentDoc.indentSelection(-4)
2823
+
2824
+ def setFileModified(self, isModified):
2825
+ # changes the document flag, updates save buttons
2826
+ self.currentDoc.UNSAVED = isModified
2827
+ # Enable / disable save button
2828
+ self.ribbon.buttons['save'].Enable(self.currentDoc.UNSAVED)
2829
+ self.fileMenu.Enable(wx.ID_SAVE, self.currentDoc.UNSAVED)
2830
+
2831
+ def onProcessEnded(self, event):
2832
+ # this is will check the stdout and stderr for any last messages
2833
+ self.onIdle(event=None)
2834
+ self.scriptProcess = None
2835
+ self.scriptProcessID = None
2836
+ self.ribbon.buttons['sendRunner'].Enable(True)
2837
+ self.ribbon.buttons['pilotRunner'].Enable(True)
2838
+
2839
+ def onURL(self, evt):
2840
+ """decompose the URL of a file and line number"""
2841
+ # "C:\Program Files\wxPython2.8 Docs and Demos\samples\hangman\hangman.py"
2842
+ tmpFilename, tmpLineNumber = evt.GetString().rsplit('", line ', 1)
2843
+ filename = tmpFilename.split('File "', 1)[1]
2844
+ try:
2845
+ lineNumber = int(tmpLineNumber.split(',')[0])
2846
+ except ValueError:
2847
+ lineNumber = int(tmpLineNumber.split()[0])
2848
+ self.gotoLine(filename, lineNumber)
2849
+
2850
+ def onUnitTests(self, evt=None):
2851
+ """Show the unit tests frame"""
2852
+ if self.unitTestFrame:
2853
+ self.unitTestFrame.Raise()
2854
+ else:
2855
+ self.unitTestFrame = UnitTestFrame(app=self.app)
2856
+ # UnitTestFrame.Show()
2857
+
2858
+ def openPluginManager(self, evt=None):
2859
+ import psychopy.app.plugin_manager.packageIndex as packageIndex
2860
+ if packageIndex.isIndexing():
2861
+ msg = _translate("The package index is currently being updated. "
2862
+ "Please try again later.")
2863
+ wx.MessageBox(
2864
+ msg,
2865
+ _translate("Package indexing in progress"),
2866
+ style=wx.OK | wx.ICON_INFORMATION
2867
+ )
2868
+ return
2869
+
2870
+ dlg = psychopy.app.plugin_manager.dialog.EnvironmentManagerDlg(self)
2871
+ dlg.Show()
2872
+ # Do post-close checks
2873
+ dlg.onClose()
2874
+
2875
+ def onPavloviaSync(self, evt=None):
2876
+ """Push changes to project repo, or create new proj if proj is None"""
2877
+ self.project = pavlovia.getProject(self.currentDoc.filename)
2878
+ self.fileSave(self.currentDoc.filename) # Must save on sync else changes not pushed
2879
+ pavlovia_ui.syncProject(parent=self, file=self.currentDoc.filename, project=self.project)
2880
+
2881
+ def onPavloviaRun(self, evt=None):
2882
+ # TODO: Allow user to run project from coder
2883
+ pass
2884
+
2885
+ def resetPrefs(self, event):
2886
+ """Reset preferences to default"""
2887
+ # Present "are you sure" dialog
2888
+ dlg = wx.MessageDialog(
2889
+ self,
2890
+ _translate("Are you sure you want to reset your preferences? This "
2891
+ "cannot be undone."),
2892
+ caption="Reset Preferences...", style=wx.ICON_WARNING | wx.CANCEL)
2893
+ dlg.SetOKCancelLabels(
2894
+ _translate("I'm sure"),
2895
+ _translate("Wait, go back!")
2896
+ )
2897
+ if dlg.ShowModal() == wx.ID_OK:
2898
+ # If okay is pressed, remove prefs file (meaning a new one will be
2899
+ # created on next restart)
2900
+ os.remove(prefs.paths['userPrefsFile'])
2901
+ # Show confirmation
2902
+ dlg = wx.MessageDialog(
2903
+ self,
2904
+ _translate("Done! Your preferences have been reset. Changes "
2905
+ "will be applied when you next open PsychoPy."))
2906
+ dlg.ShowModal()
2907
+ else:
2908
+ pass
2909
+
2910
+
2911
+ class StyledNotebook(aui.AuiNotebook, handlers.ThemeMixin):
2912
+ """
2913
+ Exactly the same as an aui.AuiNotebook, but with methods from handlers.ThemeMixin
2914
+ """
2915
+ pass
2916
+
2917
+
2918
+ class CoderRibbon(ribbon.FrameRibbon):
2919
+ def __init__(self, parent):
2920
+ # initialize
2921
+ ribbon.FrameRibbon.__init__(self, parent)
2922
+
2923
+ # --- File ---
2924
+ self.addSection(
2925
+ "file", label=_translate("File"), icon="file"
2926
+ )
2927
+ # file new
2928
+ self.addButton(
2929
+ section="file", name="new", label=_translate("New"), icon="filenew",
2930
+ tooltip=_translate("Create new text file"),
2931
+ callback=parent.fileNew
2932
+ )
2933
+ # file open
2934
+ self.addButton(
2935
+ section="file", name="open", label=_translate("Open"), icon="fileopen",
2936
+ tooltip=_translate("Open an existing text file"),
2937
+ callback=parent.fileOpen
2938
+ )
2939
+ # file save
2940
+ self.addButton(
2941
+ section="file", name="save", label=_translate("Save"), icon="filesave",
2942
+ tooltip=_translate("Save current text file"),
2943
+ callback=parent.fileSave
2944
+ ).Disable()
2945
+ # file save as
2946
+ self.addButton(
2947
+ section="file", name="saveas", label=_translate("Save as..."), icon="filesaveas",
2948
+ tooltip=_translate("Save current text file as..."),
2949
+ callback=parent.fileSaveAs
2950
+ ).Disable()
2951
+
2952
+ self.addSeparator()
2953
+
2954
+ # --- Edit ---
2955
+ self.addSection(
2956
+ "edit", label=_translate("Edit"), icon="edit"
2957
+ )
2958
+ # undo
2959
+ self.addButton(
2960
+ section="edit", name="undo", label=_translate("Undo"), icon="undo",
2961
+ tooltip=_translate("Undo last action"),
2962
+ callback=parent.undo
2963
+ )
2964
+ # redo
2965
+ self.addButton(
2966
+ section="edit", name="redo", label=_translate("Redo"), icon="redo",
2967
+ tooltip=_translate("Redo last action"),
2968
+ callback=parent.redo
2969
+ )
2970
+ # find
2971
+ self.addButton(
2972
+ section="edit", name="find", label=_translate("Find"), icon="find",
2973
+ tooltip=_translate("Search the current file for a specific term"),
2974
+ callback=parent.OnFindNext
2975
+ )
2976
+
2977
+ self.addSeparator()
2978
+
2979
+ # --- Tools ---
2980
+ self.addSection(
2981
+ "experiment", label=_translate("Experiment"), icon="experiment"
2982
+ )
2983
+ # settings
2984
+ self.addButton(
2985
+ section="experiment", name='color', label=_translate('Color picker'), icon="color",
2986
+ tooltip=_translate("Open a tool for choosing colors"),
2987
+ callback=parent.app.colorPicker
2988
+ )
2989
+ # switch run/pilot
2990
+ runPilotSwitch = self.addSwitchCtrl(
2991
+ section="experiment", name="pyswitch",
2992
+ labels=(_translate("Pilot"), _translate("Run")),
2993
+ style=wx.HORIZONTAL
2994
+ )
2995
+ # send to runner
2996
+ self.addButton(
2997
+ section="experiment", name='sendRunner', label=_translate('Runner'), icon="runner",
2998
+ tooltip=_translate("Send experiment to Runner"),
2999
+ callback=parent.sendToRunner
3000
+ ).Disable()
3001
+ # send to runner (pilot icon)
3002
+ self.addButton(
3003
+ section="experiment", name='pilotRunner', label=_translate('Runner'),
3004
+ icon="runnerPilot",
3005
+ tooltip=_translate("Send experiment to Runner"),
3006
+ callback=parent.sendToRunner
3007
+ ).Disable()
3008
+ # link runner buttons to switch
3009
+ runPilotSwitch.addDependant(self.buttons['sendRunner'], mode=1, action="show")
3010
+ runPilotSwitch.addDependant(self.buttons['pilotRunner'], mode=0, action="show")
3011
+
3012
+ self.addSeparator()
3013
+
3014
+ # --- Python ---
3015
+ self.addSection(name="py", label=_translate("Desktop"), icon="desktop")
3016
+
3017
+ # monitor center
3018
+ self.addButton(
3019
+ section="py", name='monitor', label=_translate('Monitor center'), icon="monitors",
3020
+ tooltip=_translate("Monitor settings and calibration"),
3021
+ callback=parent.app.openMonitorCenter
3022
+ )
3023
+ # pilot Py
3024
+ self.addButton(
3025
+ section="py", name="pypilot", label=_translate("Pilot"), icon='pyPilot',
3026
+ tooltip=_translate("Run the current script in Python with piloting features on"),
3027
+ callback=parent.pilotFile
3028
+ ).Disable()
3029
+ # run Py
3030
+ self.addButton(
3031
+ section="py", name="pyrun", label=_translate("Run"), icon='pyRun',
3032
+ tooltip=_translate("Run the current script in Python"),
3033
+ callback=parent.runFile
3034
+ ).Disable()
3035
+ # link run buttons to switch
3036
+ runPilotSwitch.addDependant(self.buttons['pyrun'], mode=1, action="show")
3037
+ runPilotSwitch.addDependant(self.buttons['pypilot'], mode=0, action="show")
3038
+
3039
+ self.addSeparator()
3040
+
3041
+ # --- Browser ---
3042
+ self.addSection(
3043
+ name="browser", label=_translate("Browser"), icon="browser"
3044
+ )
3045
+
3046
+ # sync project
3047
+ self.addButton(
3048
+ section="browser", name="pavsync", label=_translate("Sync"), icon='pavsync',
3049
+ tooltip=_translate("Sync project with Pavlovia"),
3050
+ callback=parent.onPavloviaSync
3051
+ )
3052
+
3053
+ self.addSeparator()
3054
+
3055
+ # --- Pavlovia ---
3056
+ self.addSection(
3057
+ name="pavlovia", label=_translate("Pavlovia"), icon="pavlovia"
3058
+ )
3059
+ # pavlovia user
3060
+ self.addPavloviaUserCtrl(
3061
+ section="pavlovia", name="pavuser", frame=parent
3062
+ )
3063
+ # pavlovia project
3064
+ self.addPavloviaProjectCtrl(
3065
+ section="pavlovia", name="pavproject", frame=parent
3066
+ )
3067
+
3068
+ self.addSeparator()
3069
+
3070
+ # --- Plugin sections ---
3071
+ self.addPluginSections("psychopy.app.builder")
3072
+
3073
+ # --- Views ---
3074
+ self.addStretchSpacer()
3075
+ self.addSeparator()
3076
+
3077
+ self.addSection(
3078
+ "views", label=_translate("Views"), icon="windows"
3079
+ )
3080
+ # show Builder
3081
+ self.addButton(
3082
+ section="views", name="builder", label=_translate("Show Builder"), icon="showBuilder",
3083
+ tooltip=_translate("Switch to Builder view"),
3084
+ callback=parent.app.showBuilder
3085
+ )
3086
+ # show Coder
3087
+ self.addButton(
3088
+ section="views", name="coder", label=_translate("Show Coder"), icon="showCoder",
3089
+ tooltip=_translate("Switch to Coder view"),
3090
+ callback=parent.app.showCoder
3091
+ ).Disable()
3092
+ # show Runner
3093
+ self.addButton(
3094
+ section="views", name="runner", label=_translate("Show Runner"), icon="showRunner",
3095
+ tooltip=_translate("Switch to Runner view"),
3096
+ callback=parent.app.showRunner
3097
+ )
3098
+
3099
+ # start off in run mode
3100
+ runPilotSwitch.setMode(1)