psychopy 2024.1.0__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.

Potentially problematic release.


This version of psychopy might be problematic. Click here for more details.

Files changed (2950) hide show
  1. psychopy/CHANGELOG.txt +3571 -0
  2. psychopy/LICENSE.txt +11 -0
  3. psychopy/LICENSES.txt +55 -0
  4. psychopy/__init__.py +74 -0
  5. psychopy/alerts/__init__.py +65 -0
  6. psychopy/alerts/_alerts.py +184 -0
  7. psychopy/alerts/_errorHandler.py +51 -0
  8. psychopy/alerts/alertsCatalogue/1000.yaml +0 -0
  9. psychopy/alerts/alertsCatalogue/1100.yaml +0 -0
  10. psychopy/alerts/alertsCatalogue/1500.yaml +0 -0
  11. psychopy/alerts/alertsCatalogue/2000.yaml +0 -0
  12. psychopy/alerts/alertsCatalogue/2100.yaml +0 -0
  13. psychopy/alerts/alertsCatalogue/2110.yaml +0 -0
  14. psychopy/alerts/alertsCatalogue/2115.yaml +21 -0
  15. psychopy/alerts/alertsCatalogue/2120.yaml +22 -0
  16. psychopy/alerts/alertsCatalogue/2150.yaml +0 -0
  17. psychopy/alerts/alertsCatalogue/2155.yaml +21 -0
  18. psychopy/alerts/alertsCatalogue/2300.yaml +0 -0
  19. psychopy/alerts/alertsCatalogue/2500.yaml +0 -0
  20. psychopy/alerts/alertsCatalogue/3000.yaml +0 -0
  21. psychopy/alerts/alertsCatalogue/3100.yaml +0 -0
  22. psychopy/alerts/alertsCatalogue/3110.yaml +25 -0
  23. psychopy/alerts/alertsCatalogue/3115.yaml +24 -0
  24. psychopy/alerts/alertsCatalogue/3200.yaml +0 -0
  25. psychopy/alerts/alertsCatalogue/3400.yaml +0 -0
  26. psychopy/alerts/alertsCatalogue/4000.yaml +0 -0
  27. psychopy/alerts/alertsCatalogue/4051.yaml +19 -0
  28. psychopy/alerts/alertsCatalogue/4052.yaml +19 -0
  29. psychopy/alerts/alertsCatalogue/4100.yaml +0 -0
  30. psychopy/alerts/alertsCatalogue/4105.yaml +18 -0
  31. psychopy/alerts/alertsCatalogue/4115.yaml +21 -0
  32. psychopy/alerts/alertsCatalogue/4120.yaml +19 -0
  33. psychopy/alerts/alertsCatalogue/4125.yaml +23 -0
  34. psychopy/alerts/alertsCatalogue/4200.yaml +0 -0
  35. psychopy/alerts/alertsCatalogue/4205.yaml +19 -0
  36. psychopy/alerts/alertsCatalogue/4210.yaml +19 -0
  37. psychopy/alerts/alertsCatalogue/4305.yaml +21 -0
  38. psychopy/alerts/alertsCatalogue/4310.yaml +21 -0
  39. psychopy/alerts/alertsCatalogue/4315.yaml +21 -0
  40. psychopy/alerts/alertsCatalogue/4320.yaml +19 -0
  41. psychopy/alerts/alertsCatalogue/4325.yaml +23 -0
  42. psychopy/alerts/alertsCatalogue/4330.yaml +19 -0
  43. psychopy/alerts/alertsCatalogue/4335.yaml +19 -0
  44. psychopy/alerts/alertsCatalogue/4340.yaml +19 -0
  45. psychopy/alerts/alertsCatalogue/4405.yaml +24 -0
  46. psychopy/alerts/alertsCatalogue/4505.yaml +22 -0
  47. psychopy/alerts/alertsCatalogue/4510.yaml +25 -0
  48. psychopy/alerts/alertsCatalogue/4520.yaml +26 -0
  49. psychopy/alerts/alertsCatalogue/4530.yaml +23 -0
  50. psychopy/alerts/alertsCatalogue/4540.yaml +19 -0
  51. psychopy/alerts/alertsCatalogue/4545.yaml +22 -0
  52. psychopy/alerts/alertsCatalogue/4550.yaml +19 -0
  53. psychopy/alerts/alertsCatalogue/4605.yaml +22 -0
  54. psychopy/alerts/alertsCatalogue/4610.yaml +22 -0
  55. psychopy/alerts/alertsCatalogue/4615.yaml +19 -0
  56. psychopy/alerts/alertsCatalogue/4705.yaml +19 -0
  57. psychopy/alerts/alertsCatalogue/4710.yaml +19 -0
  58. psychopy/alerts/alertsCatalogue/5000.yaml +0 -0
  59. psychopy/alerts/alertsCatalogue/5055.yaml +25 -0
  60. psychopy/alerts/alertsCatalogue/6000.yaml +0 -0
  61. psychopy/alerts/alertsCatalogue/6105.yaml +18 -0
  62. psychopy/alerts/alertsCatalogue/7105.yaml +19 -0
  63. psychopy/alerts/alertsCatalogue/8105.yaml +21 -0
  64. psychopy/alerts/alertsCatalogue/8110.yaml +21 -0
  65. psychopy/alerts/alertsCatalogue/9998.yaml +19 -0
  66. psychopy/alerts/alertsCatalogue/9999.yaml +19 -0
  67. psychopy/alerts/alertsCatalogue/alertCategories.yaml +109 -0
  68. psychopy/alerts/alertsCatalogue/alertTemplate.yaml +19 -0
  69. psychopy/alerts/alertsCatalogue/alertmsg.py +144 -0
  70. psychopy/alerts/alertsCatalogue/generateAlertmsg.py +34 -0
  71. psychopy/alerts/alerttools.py +338 -0
  72. psychopy/app/Resources/Psychopy Window Favicon@16w.png +0 -0
  73. psychopy/app/Resources/Psychopy Window Favicon@32w.png +0 -0
  74. psychopy/app/Resources/README.md +12 -0
  75. psychopy/app/Resources/USB-C.png +0 -0
  76. psychopy/app/Resources/USB.png +0 -0
  77. psychopy/app/Resources/__init__.py +0 -0
  78. psychopy/app/Resources/builder.ico +0 -0
  79. psychopy/app/Resources/classic/FlowBottom_CompLeft.png +0 -0
  80. psychopy/app/Resources/classic/FlowBottom_CompRight.png +0 -0
  81. psychopy/app/Resources/classic/FlowTop_CompLeft.png +0 -0
  82. psychopy/app/Resources/classic/FlowTop_CompRight.png +0 -0
  83. psychopy/app/Resources/classic/README.txt +9 -0
  84. psychopy/app/Resources/classic/__init__.py +0 -0
  85. psychopy/app/Resources/classic/_layouts.ai +1138 -1
  86. psychopy/app/Resources/classic/add.png +0 -0
  87. psychopy/app/Resources/classic/add@2x.png +0 -0
  88. psychopy/app/Resources/classic/addExp32.png +0 -0
  89. psychopy/app/Resources/classic/alerts.png +0 -0
  90. psychopy/app/Resources/classic/beta.png +0 -0
  91. psychopy/app/Resources/classic/browser.png +0 -0
  92. psychopy/app/Resources/classic/browser@2x.png +0 -0
  93. psychopy/app/Resources/classic/bug16.png +0 -0
  94. psychopy/app/Resources/classic/circle_mask.png +0 -0
  95. psychopy/app/Resources/classic/circle_mask@2x.png +0 -0
  96. psychopy/app/Resources/classic/clear.png +0 -0
  97. psychopy/app/Resources/classic/clear@2x.png +0 -0
  98. psychopy/app/Resources/classic/coderclass16.png +0 -0
  99. psychopy/app/Resources/classic/coderfunc16.png +0 -0
  100. psychopy/app/Resources/classic/coderimport16.png +0 -0
  101. psychopy/app/Resources/classic/coderjs16.png +0 -0
  102. psychopy/app/Resources/classic/coderpython16.png +0 -0
  103. psychopy/app/Resources/classic/codervar16.png +0 -0
  104. psychopy/app/Resources/classic/cogwindow32.png +0 -0
  105. psychopy/app/Resources/classic/color32.png +0 -0
  106. psychopy/app/Resources/classic/compile32.png +0 -0
  107. psychopy/app/Resources/classic/compile_js.png +0 -0
  108. psychopy/app/Resources/classic/compile_js@2x.png +0 -0
  109. psychopy/app/Resources/classic/compile_py.png +0 -0
  110. psychopy/app/Resources/classic/compile_py@2x.png +0 -0
  111. psychopy/app/Resources/classic/copy16.png +0 -0
  112. psychopy/app/Resources/classic/currentFile.png +0 -0
  113. psychopy/app/Resources/classic/currentFile@2x.png +0 -0
  114. psychopy/app/Resources/classic/delete16.png +0 -0
  115. psychopy/app/Resources/classic/desktop.png +0 -0
  116. psychopy/app/Resources/classic/desktop@2x.png +0 -0
  117. psychopy/app/Resources/classic/dirup16.png +0 -0
  118. psychopy/app/Resources/classic/docclose16.png +0 -0
  119. psychopy/app/Resources/classic/download.png +0 -0
  120. psychopy/app/Resources/classic/edit.png +0 -0
  121. psychopy/app/Resources/classic/edit@2x.png +0 -0
  122. psychopy/app/Resources/classic/editbtn.png +0 -0
  123. psychopy/app/Resources/classic/editbtn16.png +0 -0
  124. psychopy/app/Resources/classic/editbtn16@2x.png +0 -0
  125. psychopy/app/Resources/classic/editbtn@2x.png +0 -0
  126. psychopy/app/Resources/classic/email.png +0 -0
  127. psychopy/app/Resources/classic/email@2x.png +0 -0
  128. psychopy/app/Resources/classic/experiment.png +0 -0
  129. psychopy/app/Resources/classic/experiment@2x.png +0 -0
  130. psychopy/app/Resources/classic/expsettings.png +0 -0
  131. psychopy/app/Resources/classic/expsettings@2x.png +0 -0
  132. psychopy/app/Resources/classic/file.png +0 -0
  133. psychopy/app/Resources/classic/file@2x.png +0 -0
  134. psychopy/app/Resources/classic/filecsv16.png +0 -0
  135. psychopy/app/Resources/classic/fileimage16.png +0 -0
  136. psychopy/app/Resources/classic/filenew.png +0 -0
  137. psychopy/app/Resources/classic/filenew32.png +0 -0
  138. psychopy/app/Resources/classic/filenew@2x.png +0 -0
  139. psychopy/app/Resources/classic/fileopen.png +0 -0
  140. psychopy/app/Resources/classic/fileopen32.png +0 -0
  141. psychopy/app/Resources/classic/fileopen@2x.png +0 -0
  142. psychopy/app/Resources/classic/filesave.png +0 -0
  143. psychopy/app/Resources/classic/filesave32.png +0 -0
  144. psychopy/app/Resources/classic/filesave@2x.png +0 -0
  145. psychopy/app/Resources/classic/filesaveas.png +0 -0
  146. psychopy/app/Resources/classic/filesaveas32.png +0 -0
  147. psychopy/app/Resources/classic/filesaveas@2x.png +0 -0
  148. psychopy/app/Resources/classic/fileunknown16.png +0 -0
  149. psychopy/app/Resources/classic/filter.png +0 -0
  150. psychopy/app/Resources/classic/filter@2x.png +0 -0
  151. psychopy/app/Resources/classic/folder-open16.png +0 -0
  152. psychopy/app/Resources/classic/folder16.png +0 -0
  153. psychopy/app/Resources/classic/foldernew16.png +0 -0
  154. psychopy/app/Resources/classic/fork.png +0 -0
  155. psychopy/app/Resources/classic/fork@2x.png +0 -0
  156. psychopy/app/Resources/classic/github.png +0 -0
  157. psychopy/app/Resources/classic/github@2x.png +0 -0
  158. psychopy/app/Resources/classic/globe.png +0 -0
  159. psychopy/app/Resources/classic/globe@2x.png +0 -0
  160. psychopy/app/Resources/classic/globe_bug.png +0 -0
  161. psychopy/app/Resources/classic/globe_bug@2x.png +0 -0
  162. psychopy/app/Resources/classic/globe_greensync.png +0 -0
  163. psychopy/app/Resources/classic/globe_greensync@2x.png +0 -0
  164. psychopy/app/Resources/classic/globe_info.png +0 -0
  165. psychopy/app/Resources/classic/globe_info@2x.png +0 -0
  166. psychopy/app/Resources/classic/globe_magnifier.png +0 -0
  167. psychopy/app/Resources/classic/globe_magnifier@2x.png +0 -0
  168. psychopy/app/Resources/classic/globe_run.png +0 -0
  169. psychopy/app/Resources/classic/globe_run@2x.png +0 -0
  170. psychopy/app/Resources/classic/globe_user.png +0 -0
  171. psychopy/app/Resources/classic/globe_user@2x.png +0 -0
  172. psychopy/app/Resources/classic/goto16.png +0 -0
  173. psychopy/app/Resources/classic/greendot.png +0 -0
  174. psychopy/app/Resources/classic/greendot@2x.png +0 -0
  175. psychopy/app/Resources/classic/greenglobe.png +0 -0
  176. psychopy/app/Resources/classic/greenglobe@2x.png +0 -0
  177. psychopy/app/Resources/classic/greenglobe_bug.png +0 -0
  178. psychopy/app/Resources/classic/greenglobe_bug@2x.png +0 -0
  179. psychopy/app/Resources/classic/greenglobe_greensync.png +0 -0
  180. psychopy/app/Resources/classic/greenglobe_greensync@2x.png +0 -0
  181. psychopy/app/Resources/classic/greenglobe_info.png +0 -0
  182. psychopy/app/Resources/classic/greenglobe_info@2x.png +0 -0
  183. psychopy/app/Resources/classic/greenglobe_magnifier.png +0 -0
  184. psychopy/app/Resources/classic/greenglobe_magnifier@2x.png +0 -0
  185. psychopy/app/Resources/classic/greenglobe_run.png +0 -0
  186. psychopy/app/Resources/classic/greenglobe_run@2x.png +0 -0
  187. psychopy/app/Resources/classic/greenglobe_user.png +0 -0
  188. psychopy/app/Resources/classic/greenglobe_user@2x.png +0 -0
  189. psychopy/app/Resources/classic/greydot.png +0 -0
  190. psychopy/app/Resources/classic/greydot@2x.png +0 -0
  191. psychopy/app/Resources/classic/greytick.png +0 -0
  192. psychopy/app/Resources/classic/greytick@2x.png +0 -0
  193. psychopy/app/Resources/classic/invalid_img.png +0 -0
  194. psychopy/app/Resources/classic/jsPilot.png +0 -0
  195. psychopy/app/Resources/classic/jsPilot@2x.png +0 -0
  196. psychopy/app/Resources/classic/jsRun.png +0 -0
  197. psychopy/app/Resources/classic/jsRun@2x.png +0 -0
  198. psychopy/app/Resources/classic/libroot.png +0 -0
  199. psychopy/app/Resources/classic/libroot@2x.png +0 -0
  200. psychopy/app/Resources/classic/monitor16.png +0 -0
  201. psychopy/app/Resources/classic/monitors.png +0 -0
  202. psychopy/app/Resources/classic/monitors16.png +0 -0
  203. psychopy/app/Resources/classic/monitors32.png +0 -0
  204. psychopy/app/Resources/classic/monitors@2x.png +0 -0
  205. psychopy/app/Resources/classic/orangedot.png +0 -0
  206. psychopy/app/Resources/classic/orangedot@2x.png +0 -0
  207. psychopy/app/Resources/classic/pavlovia.png +0 -0
  208. psychopy/app/Resources/classic/pavlovia16.png +0 -0
  209. psychopy/app/Resources/classic/pavlovia16@2x.png +0 -0
  210. psychopy/app/Resources/classic/pavlovia@2x.png +0 -0
  211. psychopy/app/Resources/classic/pavsync.png +0 -0
  212. psychopy/app/Resources/classic/pavsync@2x.png +0 -0
  213. psychopy/app/Resources/classic/person_off.png +0 -0
  214. psychopy/app/Resources/classic/person_off@2x.png +0 -0
  215. psychopy/app/Resources/classic/person_on.png +0 -0
  216. psychopy/app/Resources/classic/person_on@2x.png +0 -0
  217. psychopy/app/Resources/classic/plugins32.png +0 -0
  218. psychopy/app/Resources/classic/plus.png +0 -0
  219. psychopy/app/Resources/classic/plus@2x.png +0 -0
  220. psychopy/app/Resources/classic/preferences-app.png +0 -0
  221. psychopy/app/Resources/classic/preferences-app48.png +0 -0
  222. psychopy/app/Resources/classic/preferences-app@2x.png +0 -0
  223. psychopy/app/Resources/classic/preferences-conn.png +0 -0
  224. psychopy/app/Resources/classic/preferences-conn48.png +0 -0
  225. psychopy/app/Resources/classic/preferences-conn@2x.png +0 -0
  226. psychopy/app/Resources/classic/preferences-debug.png +0 -0
  227. psychopy/app/Resources/classic/preferences-debug@2x.png +0 -0
  228. psychopy/app/Resources/classic/preferences-general.png +0 -0
  229. psychopy/app/Resources/classic/preferences-general48.png +0 -0
  230. psychopy/app/Resources/classic/preferences-general@2x.png +0 -0
  231. psychopy/app/Resources/classic/preferences-hardware.png +0 -0
  232. psychopy/app/Resources/classic/preferences-hardware48.png +0 -0
  233. psychopy/app/Resources/classic/preferences-hardware@2x.png +0 -0
  234. psychopy/app/Resources/classic/preferences-keyboard.png +0 -0
  235. psychopy/app/Resources/classic/preferences-keyboard48.png +0 -0
  236. psychopy/app/Resources/classic/preferences-keyboard@2x.png +0 -0
  237. psychopy/app/Resources/classic/preferences-pilot.png +0 -0
  238. psychopy/app/Resources/classic/preferences-pilot@2x.png +0 -0
  239. psychopy/app/Resources/classic/preferences32.png +0 -0
  240. psychopy/app/Resources/classic/pyPilot.png +0 -0
  241. psychopy/app/Resources/classic/pyPilot@2x.png +0 -0
  242. psychopy/app/Resources/classic/pyRun.png +0 -0
  243. psychopy/app/Resources/classic/pyRun@2x.png +0 -0
  244. psychopy/app/Resources/classic/reddot.png +0 -0
  245. psychopy/app/Resources/classic/reddot@2x.png +0 -0
  246. psychopy/app/Resources/classic/redglobe.png +0 -0
  247. psychopy/app/Resources/classic/redglobe@2x.png +0 -0
  248. psychopy/app/Resources/classic/redglobe_bug.png +0 -0
  249. psychopy/app/Resources/classic/redglobe_bug@2x.png +0 -0
  250. psychopy/app/Resources/classic/redglobe_greensync.png +0 -0
  251. psychopy/app/Resources/classic/redglobe_greensync@2x.png +0 -0
  252. psychopy/app/Resources/classic/redglobe_info.png +0 -0
  253. psychopy/app/Resources/classic/redglobe_info@2x.png +0 -0
  254. psychopy/app/Resources/classic/redglobe_magnifier.png +0 -0
  255. psychopy/app/Resources/classic/redglobe_magnifier@2x.png +0 -0
  256. psychopy/app/Resources/classic/redglobe_run.png +0 -0
  257. psychopy/app/Resources/classic/redglobe_run@2x.png +0 -0
  258. psychopy/app/Resources/classic/redglobe_user.png +0 -0
  259. psychopy/app/Resources/classic/redglobe_user@2x.png +0 -0
  260. psychopy/app/Resources/classic/redo.png +0 -0
  261. psychopy/app/Resources/classic/redo32.png +0 -0
  262. psychopy/app/Resources/classic/redo@2x.png +0 -0
  263. psychopy/app/Resources/classic/removeExp32.png +0 -0
  264. psychopy/app/Resources/classic/rename16.png +0 -0
  265. psychopy/app/Resources/classic/restart.png +0 -0
  266. psychopy/app/Resources/classic/restart@2x.png +0 -0
  267. psychopy/app/Resources/classic/run.png +0 -0
  268. psychopy/app/Resources/classic/run@2x.png +0 -0
  269. psychopy/app/Resources/classic/runner.png +0 -0
  270. psychopy/app/Resources/classic/runner@2x.png +0 -0
  271. psychopy/app/Resources/classic/runnerPilot.png +0 -0
  272. psychopy/app/Resources/classic/runnerPilot@2x.png +0 -0
  273. psychopy/app/Resources/classic/savebtn.png +0 -0
  274. psychopy/app/Resources/classic/savebtn16.png +0 -0
  275. psychopy/app/Resources/classic/savebtn16@2x.png +0 -0
  276. psychopy/app/Resources/classic/savebtn@2x.png +0 -0
  277. psychopy/app/Resources/classic/search.png +0 -0
  278. psychopy/app/Resources/classic/search@2x.png +0 -0
  279. psychopy/app/Resources/classic/showBuilder.png +0 -0
  280. psychopy/app/Resources/classic/showBuilder@2x.png +0 -0
  281. psychopy/app/Resources/classic/showCoder.png +0 -0
  282. psychopy/app/Resources/classic/showCoder@2x.png +0 -0
  283. psychopy/app/Resources/classic/showRunner.png +0 -0
  284. psychopy/app/Resources/classic/showRunner@2x.png +0 -0
  285. psychopy/app/Resources/classic/starred.png +0 -0
  286. psychopy/app/Resources/classic/starred@2x.png +0 -0
  287. psychopy/app/Resources/classic/start.png +0 -0
  288. psychopy/app/Resources/classic/start@2x.png +0 -0
  289. psychopy/app/Resources/classic/stdout.png +0 -0
  290. psychopy/app/Resources/classic/stop.png +0 -0
  291. psychopy/app/Resources/classic/stop32.png +0 -0
  292. psychopy/app/Resources/classic/stop@2x.png +0 -0
  293. psychopy/app/Resources/classic/switchCtrlBot.png +0 -0
  294. psychopy/app/Resources/classic/switchCtrlBot@2x.png +0 -0
  295. psychopy/app/Resources/classic/switchCtrlLeft.png +0 -0
  296. psychopy/app/Resources/classic/switchCtrlLeft@2x.png +0 -0
  297. psychopy/app/Resources/classic/switchCtrlRight.png +0 -0
  298. psychopy/app/Resources/classic/switchCtrlRight@2x.png +0 -0
  299. psychopy/app/Resources/classic/switchCtrlTop.png +0 -0
  300. psychopy/app/Resources/classic/switchCtrlTop@2x.png +0 -0
  301. psychopy/app/Resources/classic/tick.png +0 -0
  302. psychopy/app/Resources/classic/tick@2x.png +0 -0
  303. psychopy/app/Resources/classic/undo.png +0 -0
  304. psychopy/app/Resources/classic/undo32.png +0 -0
  305. psychopy/app/Resources/classic/undo@2x.png +0 -0
  306. psychopy/app/Resources/classic/unstarred.png +0 -0
  307. psychopy/app/Resources/classic/unstarred@2x.png +0 -0
  308. psychopy/app/Resources/classic/user_none.png +0 -0
  309. psychopy/app/Resources/classic/view-refresh16.png +0 -0
  310. psychopy/app/Resources/classic/viewbtn.png +0 -0
  311. psychopy/app/Resources/classic/viewbtn16.png +0 -0
  312. psychopy/app/Resources/classic/viewbtn16@2x.png +0 -0
  313. psychopy/app/Resources/classic/viewbtn@2x.png +0 -0
  314. psychopy/app/Resources/classic/windows16.png +0 -0
  315. psychopy/app/Resources/classic/windows16@2x.png +0 -0
  316. psychopy/app/Resources/click.png +0 -0
  317. psychopy/app/Resources/coder.ico +0 -0
  318. psychopy/app/Resources/creditCard.png +0 -0
  319. psychopy/app/Resources/dark/FlowBottom_CompLeft.png +0 -0
  320. psychopy/app/Resources/dark/FlowBottom_CompRight.png +0 -0
  321. psychopy/app/Resources/dark/FlowTop_CompLeft.png +0 -0
  322. psychopy/app/Resources/dark/FlowTop_CompRight.png +0 -0
  323. psychopy/app/Resources/dark/README.txt +3 -0
  324. psychopy/app/Resources/dark/__init__.py +0 -0
  325. psychopy/app/Resources/dark/add.png +0 -0
  326. psychopy/app/Resources/dark/add@2x.png +0 -0
  327. psychopy/app/Resources/dark/addExp32.png +0 -0
  328. psychopy/app/Resources/dark/addExp32@2x.png +0 -0
  329. psychopy/app/Resources/dark/alerts.png +0 -0
  330. psychopy/app/Resources/dark/alerts@2x.png +0 -0
  331. psychopy/app/Resources/dark/beta.png +0 -0
  332. psychopy/app/Resources/dark/beta@2x.png +0 -0
  333. psychopy/app/Resources/dark/browser.png +0 -0
  334. psychopy/app/Resources/dark/browser@2x.png +0 -0
  335. psychopy/app/Resources/dark/bug16.png +0 -0
  336. psychopy/app/Resources/dark/bug16@2x.png +0 -0
  337. psychopy/app/Resources/dark/circle_mask.png +0 -0
  338. psychopy/app/Resources/dark/circle_mask@2x.png +0 -0
  339. psychopy/app/Resources/dark/clear.png +0 -0
  340. psychopy/app/Resources/dark/clear@2x.png +0 -0
  341. psychopy/app/Resources/dark/coderclass16.png +0 -0
  342. psychopy/app/Resources/dark/coderclass16@2x.png +0 -0
  343. psychopy/app/Resources/dark/coderfunc16.png +0 -0
  344. psychopy/app/Resources/dark/coderfunc16@2x.png +0 -0
  345. psychopy/app/Resources/dark/coderimport16.png +0 -0
  346. psychopy/app/Resources/dark/coderimport16@2x.png +0 -0
  347. psychopy/app/Resources/dark/coderjs.png +0 -0
  348. psychopy/app/Resources/dark/coderjs@2x.png +0 -0
  349. psychopy/app/Resources/dark/coderpython.png +0 -0
  350. psychopy/app/Resources/dark/coderpython@2x.png +0 -0
  351. psychopy/app/Resources/dark/codervar16.png +0 -0
  352. psychopy/app/Resources/dark/codervar16@2x.png +0 -0
  353. psychopy/app/Resources/dark/cogwindow32.png +0 -0
  354. psychopy/app/Resources/dark/cogwindow32@2x.png +0 -0
  355. psychopy/app/Resources/dark/color32.png +0 -0
  356. psychopy/app/Resources/dark/color32@2x.png +0 -0
  357. psychopy/app/Resources/dark/compile_js.png +0 -0
  358. psychopy/app/Resources/dark/compile_js@2x.png +0 -0
  359. psychopy/app/Resources/dark/compile_py.png +0 -0
  360. psychopy/app/Resources/dark/compile_py@2x.png +0 -0
  361. psychopy/app/Resources/dark/copy16.png +0 -0
  362. psychopy/app/Resources/dark/copy16@2x.png +0 -0
  363. psychopy/app/Resources/dark/currentFile16.png +0 -0
  364. psychopy/app/Resources/dark/currentFile16@2x.png +0 -0
  365. psychopy/app/Resources/dark/delete16.png +0 -0
  366. psychopy/app/Resources/dark/delete16@2x.png +0 -0
  367. psychopy/app/Resources/dark/desktop.png +0 -0
  368. psychopy/app/Resources/dark/desktop@2x.png +0 -0
  369. psychopy/app/Resources/dark/dirup16.png +0 -0
  370. psychopy/app/Resources/dark/dirup16@2x.png +0 -0
  371. psychopy/app/Resources/dark/docclose16.png +0 -0
  372. psychopy/app/Resources/dark/docclose16@2x.png +0 -0
  373. psychopy/app/Resources/dark/download.png +0 -0
  374. psychopy/app/Resources/dark/download@2x.png +0 -0
  375. psychopy/app/Resources/dark/edit.png +0 -0
  376. psychopy/app/Resources/dark/edit@2x.png +0 -0
  377. psychopy/app/Resources/dark/editbtn16.png +0 -0
  378. psychopy/app/Resources/dark/editbtn16@2x.png +0 -0
  379. psychopy/app/Resources/dark/email.png +0 -0
  380. psychopy/app/Resources/dark/email@2x.png +0 -0
  381. psychopy/app/Resources/dark/experiment.png +0 -0
  382. psychopy/app/Resources/dark/experiment@2x.png +0 -0
  383. psychopy/app/Resources/dark/expsettings.png +0 -0
  384. psychopy/app/Resources/dark/expsettings@2x.png +0 -0
  385. psychopy/app/Resources/dark/file.png +0 -0
  386. psychopy/app/Resources/dark/file@16w.png +0 -0
  387. psychopy/app/Resources/dark/file@16w@2x.png +0 -0
  388. psychopy/app/Resources/dark/file@2x.png +0 -0
  389. psychopy/app/Resources/dark/filecsv16.png +0 -0
  390. psychopy/app/Resources/dark/filecsv16@2x.png +0 -0
  391. psychopy/app/Resources/dark/fileimage16.png +0 -0
  392. psychopy/app/Resources/dark/fileimage16@2x.png +0 -0
  393. psychopy/app/Resources/dark/filenew.png +0 -0
  394. psychopy/app/Resources/dark/filenew32.png +0 -0
  395. psychopy/app/Resources/dark/filenew32@2x.png +0 -0
  396. psychopy/app/Resources/dark/filenew@2x.png +0 -0
  397. psychopy/app/Resources/dark/fileopen.png +0 -0
  398. psychopy/app/Resources/dark/fileopen32.png +0 -0
  399. psychopy/app/Resources/dark/fileopen32@2x.png +0 -0
  400. psychopy/app/Resources/dark/fileopen@2x.png +0 -0
  401. psychopy/app/Resources/dark/filesave.png +0 -0
  402. psychopy/app/Resources/dark/filesave32.png +0 -0
  403. psychopy/app/Resources/dark/filesave32@2x.png +0 -0
  404. psychopy/app/Resources/dark/filesave@2x.png +0 -0
  405. psychopy/app/Resources/dark/filesaveas.png +0 -0
  406. psychopy/app/Resources/dark/filesaveas32.png +0 -0
  407. psychopy/app/Resources/dark/filesaveas32@2x.png +0 -0
  408. psychopy/app/Resources/dark/filesaveas@2x.png +0 -0
  409. psychopy/app/Resources/dark/fileunknown16.png +0 -0
  410. psychopy/app/Resources/dark/fileunknown16@2x.png +0 -0
  411. psychopy/app/Resources/dark/filter.png +0 -0
  412. psychopy/app/Resources/dark/filter@2x.png +0 -0
  413. psychopy/app/Resources/dark/folder-open16.png +0 -0
  414. psychopy/app/Resources/dark/folder-open16@2x.png +0 -0
  415. psychopy/app/Resources/dark/folder16.png +0 -0
  416. psychopy/app/Resources/dark/folder16@2x.png +0 -0
  417. psychopy/app/Resources/dark/foldernew16.png +0 -0
  418. psychopy/app/Resources/dark/foldernew16@2x.png +0 -0
  419. psychopy/app/Resources/dark/fork.png +0 -0
  420. psychopy/app/Resources/dark/fork@2x.png +0 -0
  421. psychopy/app/Resources/dark/github.png +0 -0
  422. psychopy/app/Resources/dark/github@2x.png +0 -0
  423. psychopy/app/Resources/dark/globe.png +0 -0
  424. psychopy/app/Resources/dark/globe@2x.png +0 -0
  425. psychopy/app/Resources/dark/globe_bug.png +0 -0
  426. psychopy/app/Resources/dark/globe_bug@2x.png +0 -0
  427. psychopy/app/Resources/dark/globe_greensync.png +0 -0
  428. psychopy/app/Resources/dark/globe_greensync@2x.png +0 -0
  429. psychopy/app/Resources/dark/globe_info.png +0 -0
  430. psychopy/app/Resources/dark/globe_info@2x.png +0 -0
  431. psychopy/app/Resources/dark/globe_magnifier.png +0 -0
  432. psychopy/app/Resources/dark/globe_magnifier@2x.png +0 -0
  433. psychopy/app/Resources/dark/globe_run.png +0 -0
  434. psychopy/app/Resources/dark/globe_run@2x.png +0 -0
  435. psychopy/app/Resources/dark/globe_user.png +0 -0
  436. psychopy/app/Resources/dark/globe_user@2x.png +0 -0
  437. psychopy/app/Resources/dark/goto.png +0 -0
  438. psychopy/app/Resources/dark/goto@2x.png +0 -0
  439. psychopy/app/Resources/dark/greendot.png +0 -0
  440. psychopy/app/Resources/dark/greendot@2x.png +0 -0
  441. psychopy/app/Resources/dark/greenglobe.png +0 -0
  442. psychopy/app/Resources/dark/greenglobe@2x.png +0 -0
  443. psychopy/app/Resources/dark/greenglobe_bug.png +0 -0
  444. psychopy/app/Resources/dark/greenglobe_bug@2x.png +0 -0
  445. psychopy/app/Resources/dark/greenglobe_greensync.png +0 -0
  446. psychopy/app/Resources/dark/greenglobe_greensync@2x.png +0 -0
  447. psychopy/app/Resources/dark/greenglobe_info.png +0 -0
  448. psychopy/app/Resources/dark/greenglobe_info@2x.png +0 -0
  449. psychopy/app/Resources/dark/greenglobe_magnifier.png +0 -0
  450. psychopy/app/Resources/dark/greenglobe_magnifier@2x.png +0 -0
  451. psychopy/app/Resources/dark/greenglobe_run.png +0 -0
  452. psychopy/app/Resources/dark/greenglobe_run@2x.png +0 -0
  453. psychopy/app/Resources/dark/greenglobe_user.png +0 -0
  454. psychopy/app/Resources/dark/greenglobe_user@2x.png +0 -0
  455. psychopy/app/Resources/dark/greydot.png +0 -0
  456. psychopy/app/Resources/dark/greydot@2x.png +0 -0
  457. psychopy/app/Resources/dark/greytick.png +0 -0
  458. psychopy/app/Resources/dark/greytick@2x.png +0 -0
  459. psychopy/app/Resources/dark/invalid_img.png +0 -0
  460. psychopy/app/Resources/dark/jsPilot.png +0 -0
  461. psychopy/app/Resources/dark/jsPilot@2x.png +0 -0
  462. psychopy/app/Resources/dark/jsRun.png +0 -0
  463. psychopy/app/Resources/dark/jsRun@2x.png +0 -0
  464. psychopy/app/Resources/dark/libroot16.png +0 -0
  465. psychopy/app/Resources/dark/libroot16@2x.png +0 -0
  466. psychopy/app/Resources/dark/monitor16.png +0 -0
  467. psychopy/app/Resources/dark/monitor16@2x.png +0 -0
  468. psychopy/app/Resources/dark/monitors.png +0 -0
  469. psychopy/app/Resources/dark/monitors32.png +0 -0
  470. psychopy/app/Resources/dark/monitors32@2x.png +0 -0
  471. psychopy/app/Resources/dark/monitors@2x.png +0 -0
  472. psychopy/app/Resources/dark/orangedot.png +0 -0
  473. psychopy/app/Resources/dark/orangedot@2x.png +0 -0
  474. psychopy/app/Resources/dark/pavlovia.png +0 -0
  475. psychopy/app/Resources/dark/pavlovia16.png +0 -0
  476. psychopy/app/Resources/dark/pavlovia16@2x.png +0 -0
  477. psychopy/app/Resources/dark/pavlovia@2x.png +0 -0
  478. psychopy/app/Resources/dark/pavsync.png +0 -0
  479. psychopy/app/Resources/dark/pavsync@2x.png +0 -0
  480. psychopy/app/Resources/dark/person_off.png +0 -0
  481. psychopy/app/Resources/dark/person_off@2x.png +0 -0
  482. psychopy/app/Resources/dark/person_on.png +0 -0
  483. psychopy/app/Resources/dark/person_on@2x.png +0 -0
  484. psychopy/app/Resources/dark/plugins32.png +0 -0
  485. psychopy/app/Resources/dark/plugins32@2x.png +0 -0
  486. psychopy/app/Resources/dark/plus.png +0 -0
  487. psychopy/app/Resources/dark/plus@2x.png +0 -0
  488. psychopy/app/Resources/dark/preferences-app.png +0 -0
  489. psychopy/app/Resources/dark/preferences-app48.png +0 -0
  490. psychopy/app/Resources/dark/preferences-app48@2x.png +0 -0
  491. psychopy/app/Resources/dark/preferences-app@2x.png +0 -0
  492. psychopy/app/Resources/dark/preferences-conn.png +0 -0
  493. psychopy/app/Resources/dark/preferences-conn48.png +0 -0
  494. psychopy/app/Resources/dark/preferences-conn48@2x.png +0 -0
  495. psychopy/app/Resources/dark/preferences-conn@2x.png +0 -0
  496. psychopy/app/Resources/dark/preferences-debug.png +0 -0
  497. psychopy/app/Resources/dark/preferences-debug@2x.png +0 -0
  498. psychopy/app/Resources/dark/preferences-general.png +0 -0
  499. psychopy/app/Resources/dark/preferences-general48.png +0 -0
  500. psychopy/app/Resources/dark/preferences-general48@2x.png +0 -0
  501. psychopy/app/Resources/dark/preferences-general@2x.png +0 -0
  502. psychopy/app/Resources/dark/preferences-hardware.png +0 -0
  503. psychopy/app/Resources/dark/preferences-hardware48.png +0 -0
  504. psychopy/app/Resources/dark/preferences-hardware48@2x.png +0 -0
  505. psychopy/app/Resources/dark/preferences-hardware@2x.png +0 -0
  506. psychopy/app/Resources/dark/preferences-keyboard.png +0 -0
  507. psychopy/app/Resources/dark/preferences-keyboard48.png +0 -0
  508. psychopy/app/Resources/dark/preferences-keyboard48@2x.png +0 -0
  509. psychopy/app/Resources/dark/preferences-keyboard@2x.png +0 -0
  510. psychopy/app/Resources/dark/preferences-pilot.png +0 -0
  511. psychopy/app/Resources/dark/preferences-pilot@2x.png +0 -0
  512. psychopy/app/Resources/dark/preferences32.png +0 -0
  513. psychopy/app/Resources/dark/preferences32@2x.png +0 -0
  514. psychopy/app/Resources/dark/pyPilot.png +0 -0
  515. psychopy/app/Resources/dark/pyPilot@2x.png +0 -0
  516. psychopy/app/Resources/dark/pyRun.png +0 -0
  517. psychopy/app/Resources/dark/pyRun@2x.png +0 -0
  518. psychopy/app/Resources/dark/reddot.png +0 -0
  519. psychopy/app/Resources/dark/reddot@2x.png +0 -0
  520. psychopy/app/Resources/dark/redglobe.png +0 -0
  521. psychopy/app/Resources/dark/redglobe@2x.png +0 -0
  522. psychopy/app/Resources/dark/redglobe_bug.png +0 -0
  523. psychopy/app/Resources/dark/redglobe_bug@2x.png +0 -0
  524. psychopy/app/Resources/dark/redglobe_greensync.png +0 -0
  525. psychopy/app/Resources/dark/redglobe_greensync@2x.png +0 -0
  526. psychopy/app/Resources/dark/redglobe_info.png +0 -0
  527. psychopy/app/Resources/dark/redglobe_info@2x.png +0 -0
  528. psychopy/app/Resources/dark/redglobe_magnifier.png +0 -0
  529. psychopy/app/Resources/dark/redglobe_magnifier@2x.png +0 -0
  530. psychopy/app/Resources/dark/redglobe_run.png +0 -0
  531. psychopy/app/Resources/dark/redglobe_run@2x.png +0 -0
  532. psychopy/app/Resources/dark/redglobe_user.png +0 -0
  533. psychopy/app/Resources/dark/redglobe_user@2x.png +0 -0
  534. psychopy/app/Resources/dark/redo.png +0 -0
  535. psychopy/app/Resources/dark/redo32.png +0 -0
  536. psychopy/app/Resources/dark/redo32@2x.png +0 -0
  537. psychopy/app/Resources/dark/redo@2x.png +0 -0
  538. psychopy/app/Resources/dark/removeExp32.png +0 -0
  539. psychopy/app/Resources/dark/removeExp32@2x.png +0 -0
  540. psychopy/app/Resources/dark/rename16.png +0 -0
  541. psychopy/app/Resources/dark/rename16@2x.png +0 -0
  542. psychopy/app/Resources/dark/restart.png +0 -0
  543. psychopy/app/Resources/dark/restart@2x.png +0 -0
  544. psychopy/app/Resources/dark/runner.png +0 -0
  545. psychopy/app/Resources/dark/runner@2x.png +0 -0
  546. psychopy/app/Resources/dark/runnerPilot.png +0 -0
  547. psychopy/app/Resources/dark/runnerPilot@2x.png +0 -0
  548. psychopy/app/Resources/dark/savebtn16.png +0 -0
  549. psychopy/app/Resources/dark/savebtn16@2x.png +0 -0
  550. psychopy/app/Resources/dark/search.png +0 -0
  551. psychopy/app/Resources/dark/search@2x.png +0 -0
  552. psychopy/app/Resources/dark/showBuilder.png +0 -0
  553. psychopy/app/Resources/dark/showBuilder@2x.png +0 -0
  554. psychopy/app/Resources/dark/showCoder.png +0 -0
  555. psychopy/app/Resources/dark/showCoder@2x.png +0 -0
  556. psychopy/app/Resources/dark/showRunner.png +0 -0
  557. psychopy/app/Resources/dark/showRunner@2x.png +0 -0
  558. psychopy/app/Resources/dark/starred.png +0 -0
  559. psychopy/app/Resources/dark/starred@2x.png +0 -0
  560. psychopy/app/Resources/dark/start.png +0 -0
  561. psychopy/app/Resources/dark/start@2x.png +0 -0
  562. psychopy/app/Resources/dark/stdout.png +0 -0
  563. psychopy/app/Resources/dark/stdout@2x.png +0 -0
  564. psychopy/app/Resources/dark/stop.png +0 -0
  565. psychopy/app/Resources/dark/stop32.png +0 -0
  566. psychopy/app/Resources/dark/stop32@2x.png +0 -0
  567. psychopy/app/Resources/dark/stop@2x.png +0 -0
  568. psychopy/app/Resources/dark/switchCtrlBot.png +0 -0
  569. psychopy/app/Resources/dark/switchCtrlBot@2x.png +0 -0
  570. psychopy/app/Resources/dark/switchCtrlLeft.png +0 -0
  571. psychopy/app/Resources/dark/switchCtrlLeft@2x.png +0 -0
  572. psychopy/app/Resources/dark/switchCtrlRight.png +0 -0
  573. psychopy/app/Resources/dark/switchCtrlRight@2x.png +0 -0
  574. psychopy/app/Resources/dark/switchCtrlTop.png +0 -0
  575. psychopy/app/Resources/dark/switchCtrlTop@2x.png +0 -0
  576. psychopy/app/Resources/dark/tick.png +0 -0
  577. psychopy/app/Resources/dark/tick@2x.png +0 -0
  578. psychopy/app/Resources/dark/undo.png +0 -0
  579. psychopy/app/Resources/dark/undo32.png +0 -0
  580. psychopy/app/Resources/dark/undo32@2x.png +0 -0
  581. psychopy/app/Resources/dark/undo@2x.png +0 -0
  582. psychopy/app/Resources/dark/unstarred.png +0 -0
  583. psychopy/app/Resources/dark/unstarred@2x.png +0 -0
  584. psychopy/app/Resources/dark/user_none.png +0 -0
  585. psychopy/app/Resources/dark/view-refresh16.png +0 -0
  586. psychopy/app/Resources/dark/view-refresh16@2x.png +0 -0
  587. psychopy/app/Resources/dark/viewbtn16.png +0 -0
  588. psychopy/app/Resources/dark/viewbtn16@2x.png +0 -0
  589. psychopy/app/Resources/dark/windows16.png +0 -0
  590. psychopy/app/Resources/dark/windows16@2x.png +0 -0
  591. psychopy/app/Resources/default.mp3 +0 -0
  592. psychopy/app/Resources/default.mp4 +0 -0
  593. psychopy/app/Resources/default.png +0 -0
  594. psychopy/app/Resources/fonts/Arvo-Bold.ttf +0 -0
  595. psychopy/app/Resources/fonts/Arvo-BoldItalic.ttf +0 -0
  596. psychopy/app/Resources/fonts/Arvo-Italic.ttf +0 -0
  597. psychopy/app/Resources/fonts/Arvo-Regular.ttf +0 -0
  598. psychopy/app/Resources/fonts/DejaVuSerif.ttf +0 -0
  599. psychopy/app/Resources/fonts/IndieFlower-Regular.ttf +0 -0
  600. psychopy/app/Resources/fonts/JetBrainsMono-Italic-VariableFont_wght.ttf +0 -0
  601. psychopy/app/Resources/fonts/JetBrainsMono-VariableFont_wght.ttf +0 -0
  602. psychopy/app/Resources/fonts/OpenSans-Bold.ttf +0 -0
  603. psychopy/app/Resources/fonts/OpenSans-BoldItalic.ttf +0 -0
  604. psychopy/app/Resources/fonts/OpenSans-ExtraBold.ttf +0 -0
  605. psychopy/app/Resources/fonts/OpenSans-ExtraBoldItalic.ttf +0 -0
  606. psychopy/app/Resources/fonts/OpenSans-Italic.ttf +0 -0
  607. psychopy/app/Resources/fonts/OpenSans-Light.ttf +0 -0
  608. psychopy/app/Resources/fonts/OpenSans-LightItalic.ttf +0 -0
  609. psychopy/app/Resources/fonts/OpenSans-Regular.ttf +0 -0
  610. psychopy/app/Resources/fonts/OpenSans-SemiBold.ttf +0 -0
  611. psychopy/app/Resources/fonts/OpenSans-SemiBoldItalic.ttf +0 -0
  612. psychopy/app/Resources/instruct1.png +0 -0
  613. psychopy/app/Resources/instruct2.png +0 -0
  614. psychopy/app/Resources/light/FlowBottom_CompLeft.png +0 -0
  615. psychopy/app/Resources/light/FlowBottom_CompRight.png +0 -0
  616. psychopy/app/Resources/light/FlowTop_CompLeft.png +0 -0
  617. psychopy/app/Resources/light/FlowTop_CompRight.png +0 -0
  618. psychopy/app/Resources/light/README.txt +3 -0
  619. psychopy/app/Resources/light/__init__.py +0 -0
  620. psychopy/app/Resources/light/add.png +0 -0
  621. psychopy/app/Resources/light/add@2x.png +0 -0
  622. psychopy/app/Resources/light/addExp32.png +0 -0
  623. psychopy/app/Resources/light/addExp32@2x.png +0 -0
  624. psychopy/app/Resources/light/alerts.png +0 -0
  625. psychopy/app/Resources/light/alerts@2x.png +0 -0
  626. psychopy/app/Resources/light/beta.png +0 -0
  627. psychopy/app/Resources/light/beta@2x.png +0 -0
  628. psychopy/app/Resources/light/browser.png +0 -0
  629. psychopy/app/Resources/light/browser@2x.png +0 -0
  630. psychopy/app/Resources/light/bug16.png +0 -0
  631. psychopy/app/Resources/light/bug16@2x.png +0 -0
  632. psychopy/app/Resources/light/circle_mask.png +0 -0
  633. psychopy/app/Resources/light/circle_mask@2x.png +0 -0
  634. psychopy/app/Resources/light/clear.png +0 -0
  635. psychopy/app/Resources/light/clear@2x.png +0 -0
  636. psychopy/app/Resources/light/coderclass16.png +0 -0
  637. psychopy/app/Resources/light/coderclass16@2x.png +0 -0
  638. psychopy/app/Resources/light/coderfunc16.png +0 -0
  639. psychopy/app/Resources/light/coderfunc16@2x.png +0 -0
  640. psychopy/app/Resources/light/coderimport16.png +0 -0
  641. psychopy/app/Resources/light/coderimport16@2x.png +0 -0
  642. psychopy/app/Resources/light/coderjs.png +0 -0
  643. psychopy/app/Resources/light/coderjs@2x.png +0 -0
  644. psychopy/app/Resources/light/coderpython.png +0 -0
  645. psychopy/app/Resources/light/coderpython@2x.png +0 -0
  646. psychopy/app/Resources/light/codervar16.png +0 -0
  647. psychopy/app/Resources/light/codervar16@2x.png +0 -0
  648. psychopy/app/Resources/light/cogwindow32.png +0 -0
  649. psychopy/app/Resources/light/cogwindow32@2x.png +0 -0
  650. psychopy/app/Resources/light/color16.png +0 -0
  651. psychopy/app/Resources/light/color16@2x.png +0 -0
  652. psychopy/app/Resources/light/color32.png +0 -0
  653. psychopy/app/Resources/light/color32@2x.png +0 -0
  654. psychopy/app/Resources/light/compile_js.png +0 -0
  655. psychopy/app/Resources/light/compile_js@2x.png +0 -0
  656. psychopy/app/Resources/light/compile_py.png +0 -0
  657. psychopy/app/Resources/light/compile_py@2x.png +0 -0
  658. psychopy/app/Resources/light/copy16.png +0 -0
  659. psychopy/app/Resources/light/copy16@2x.png +0 -0
  660. psychopy/app/Resources/light/currentFile16.png +0 -0
  661. psychopy/app/Resources/light/currentFile16@2x.png +0 -0
  662. psychopy/app/Resources/light/delete16.png +0 -0
  663. psychopy/app/Resources/light/delete16@2x.png +0 -0
  664. psychopy/app/Resources/light/delete8.png +0 -0
  665. psychopy/app/Resources/light/desktop.png +0 -0
  666. psychopy/app/Resources/light/desktop@2x.png +0 -0
  667. psychopy/app/Resources/light/dirup16.png +0 -0
  668. psychopy/app/Resources/light/dirup16@2x.png +0 -0
  669. psychopy/app/Resources/light/docclose16.png +0 -0
  670. psychopy/app/Resources/light/docclose16@2x.png +0 -0
  671. psychopy/app/Resources/light/download.png +0 -0
  672. psychopy/app/Resources/light/download@2x.png +0 -0
  673. psychopy/app/Resources/light/edit.png +0 -0
  674. psychopy/app/Resources/light/edit@2x.png +0 -0
  675. psychopy/app/Resources/light/editbtn16.png +0 -0
  676. psychopy/app/Resources/light/editbtn16@2x.png +0 -0
  677. psychopy/app/Resources/light/email.png +0 -0
  678. psychopy/app/Resources/light/email@2x.png +0 -0
  679. psychopy/app/Resources/light/experiment.png +0 -0
  680. psychopy/app/Resources/light/experiment@2x.png +0 -0
  681. psychopy/app/Resources/light/expsettings.png +0 -0
  682. psychopy/app/Resources/light/expsettings@2x.png +0 -0
  683. psychopy/app/Resources/light/file.png +0 -0
  684. psychopy/app/Resources/light/file@2x.png +0 -0
  685. psychopy/app/Resources/light/filecsv16.png +0 -0
  686. psychopy/app/Resources/light/filecsv16@2x.png +0 -0
  687. psychopy/app/Resources/light/fileimage16.png +0 -0
  688. psychopy/app/Resources/light/fileimage16@2x.png +0 -0
  689. psychopy/app/Resources/light/filenew.png +0 -0
  690. psychopy/app/Resources/light/filenew32.png +0 -0
  691. psychopy/app/Resources/light/filenew32@2x.png +0 -0
  692. psychopy/app/Resources/light/filenew@2x.png +0 -0
  693. psychopy/app/Resources/light/fileopen.png +0 -0
  694. psychopy/app/Resources/light/fileopen32.png +0 -0
  695. psychopy/app/Resources/light/fileopen32@2x.png +0 -0
  696. psychopy/app/Resources/light/fileopen@2x.png +0 -0
  697. psychopy/app/Resources/light/filesave.png +0 -0
  698. psychopy/app/Resources/light/filesave32.png +0 -0
  699. psychopy/app/Resources/light/filesave32@2x.png +0 -0
  700. psychopy/app/Resources/light/filesave@2x.png +0 -0
  701. psychopy/app/Resources/light/filesaveas.png +0 -0
  702. psychopy/app/Resources/light/filesaveas32.png +0 -0
  703. psychopy/app/Resources/light/filesaveas32@2x.png +0 -0
  704. psychopy/app/Resources/light/filesaveas@2x.png +0 -0
  705. psychopy/app/Resources/light/fileunknown16.png +0 -0
  706. psychopy/app/Resources/light/fileunknown16@2x.png +0 -0
  707. psychopy/app/Resources/light/filter.png +0 -0
  708. psychopy/app/Resources/light/filter@2x.png +0 -0
  709. psychopy/app/Resources/light/folder-open16.png +0 -0
  710. psychopy/app/Resources/light/folder-open16@2x.png +0 -0
  711. psychopy/app/Resources/light/folder16.png +0 -0
  712. psychopy/app/Resources/light/folder16@2x.png +0 -0
  713. psychopy/app/Resources/light/foldernew16.png +0 -0
  714. psychopy/app/Resources/light/foldernew16@2x.png +0 -0
  715. psychopy/app/Resources/light/fork.png +0 -0
  716. psychopy/app/Resources/light/fork@2x.png +0 -0
  717. psychopy/app/Resources/light/github.png +0 -0
  718. psychopy/app/Resources/light/github@2x.png +0 -0
  719. psychopy/app/Resources/light/globe.png +0 -0
  720. psychopy/app/Resources/light/globe@2x.png +0 -0
  721. psychopy/app/Resources/light/globe_bug.png +0 -0
  722. psychopy/app/Resources/light/globe_bug@2x.png +0 -0
  723. psychopy/app/Resources/light/globe_greensync.png +0 -0
  724. psychopy/app/Resources/light/globe_greensync@2x.png +0 -0
  725. psychopy/app/Resources/light/globe_info.png +0 -0
  726. psychopy/app/Resources/light/globe_info@2x.png +0 -0
  727. psychopy/app/Resources/light/globe_magnifier.png +0 -0
  728. psychopy/app/Resources/light/globe_magnifier@2x.png +0 -0
  729. psychopy/app/Resources/light/globe_run.png +0 -0
  730. psychopy/app/Resources/light/globe_run@2x.png +0 -0
  731. psychopy/app/Resources/light/globe_user.png +0 -0
  732. psychopy/app/Resources/light/globe_user@2x.png +0 -0
  733. psychopy/app/Resources/light/goto16.png +0 -0
  734. psychopy/app/Resources/light/goto16@2x.png +0 -0
  735. psychopy/app/Resources/light/greendot.png +0 -0
  736. psychopy/app/Resources/light/greendot@2x.png +0 -0
  737. psychopy/app/Resources/light/greenglobe.png +0 -0
  738. psychopy/app/Resources/light/greenglobe@2x.png +0 -0
  739. psychopy/app/Resources/light/greenglobe_bug.png +0 -0
  740. psychopy/app/Resources/light/greenglobe_bug@2x.png +0 -0
  741. psychopy/app/Resources/light/greenglobe_greensync.png +0 -0
  742. psychopy/app/Resources/light/greenglobe_greensync@2x.png +0 -0
  743. psychopy/app/Resources/light/greenglobe_info.png +0 -0
  744. psychopy/app/Resources/light/greenglobe_info@2x.png +0 -0
  745. psychopy/app/Resources/light/greenglobe_magnifier.png +0 -0
  746. psychopy/app/Resources/light/greenglobe_magnifier@2x.png +0 -0
  747. psychopy/app/Resources/light/greenglobe_run.png +0 -0
  748. psychopy/app/Resources/light/greenglobe_run@2x.png +0 -0
  749. psychopy/app/Resources/light/greenglobe_user.png +0 -0
  750. psychopy/app/Resources/light/greenglobe_user@2x.png +0 -0
  751. psychopy/app/Resources/light/greydot.png +0 -0
  752. psychopy/app/Resources/light/greydot@2x.png +0 -0
  753. psychopy/app/Resources/light/greytick.png +0 -0
  754. psychopy/app/Resources/light/greytick@2x.png +0 -0
  755. psychopy/app/Resources/light/invalid_img.png +0 -0
  756. psychopy/app/Resources/light/jsPilot.png +0 -0
  757. psychopy/app/Resources/light/jsPilot@2x.png +0 -0
  758. psychopy/app/Resources/light/jsRun.png +0 -0
  759. psychopy/app/Resources/light/jsRun@2x.png +0 -0
  760. psychopy/app/Resources/light/libroot16.png +0 -0
  761. psychopy/app/Resources/light/libroot16@2x.png +0 -0
  762. psychopy/app/Resources/light/monitor16.png +0 -0
  763. psychopy/app/Resources/light/monitor16@2x.png +0 -0
  764. psychopy/app/Resources/light/monitors.png +0 -0
  765. psychopy/app/Resources/light/monitors32.png +0 -0
  766. psychopy/app/Resources/light/monitors32@2x.png +0 -0
  767. psychopy/app/Resources/light/monitors@2x.png +0 -0
  768. psychopy/app/Resources/light/orangedot.png +0 -0
  769. psychopy/app/Resources/light/orangedot@2x.png +0 -0
  770. psychopy/app/Resources/light/pavlovia.png +0 -0
  771. psychopy/app/Resources/light/pavlovia16.png +0 -0
  772. psychopy/app/Resources/light/pavlovia16@2x.png +0 -0
  773. psychopy/app/Resources/light/pavlovia@2x.png +0 -0
  774. psychopy/app/Resources/light/pavsync.png +0 -0
  775. psychopy/app/Resources/light/pavsync@2x.png +0 -0
  776. psychopy/app/Resources/light/person_off.png +0 -0
  777. psychopy/app/Resources/light/person_off@2x.png +0 -0
  778. psychopy/app/Resources/light/person_on.png +0 -0
  779. psychopy/app/Resources/light/person_on@2x.png +0 -0
  780. psychopy/app/Resources/light/plugins32.png +0 -0
  781. psychopy/app/Resources/light/plugins32@2x.png +0 -0
  782. psychopy/app/Resources/light/plus.png +0 -0
  783. psychopy/app/Resources/light/plus@2x.png +0 -0
  784. psychopy/app/Resources/light/preferences-app.png +0 -0
  785. psychopy/app/Resources/light/preferences-app48.png +0 -0
  786. psychopy/app/Resources/light/preferences-app48@2x.png +0 -0
  787. psychopy/app/Resources/light/preferences-app@2x.png +0 -0
  788. psychopy/app/Resources/light/preferences-conn.png +0 -0
  789. psychopy/app/Resources/light/preferences-conn48.png +0 -0
  790. psychopy/app/Resources/light/preferences-conn48@2x.png +0 -0
  791. psychopy/app/Resources/light/preferences-conn@2x.png +0 -0
  792. psychopy/app/Resources/light/preferences-general.png +0 -0
  793. psychopy/app/Resources/light/preferences-general48.png +0 -0
  794. psychopy/app/Resources/light/preferences-general48@2x.png +0 -0
  795. psychopy/app/Resources/light/preferences-general@2x.png +0 -0
  796. psychopy/app/Resources/light/preferences-hardware.png +0 -0
  797. psychopy/app/Resources/light/preferences-hardware48.png +0 -0
  798. psychopy/app/Resources/light/preferences-hardware48@2x.png +0 -0
  799. psychopy/app/Resources/light/preferences-hardware@2x.png +0 -0
  800. psychopy/app/Resources/light/preferences-keyboard.png +0 -0
  801. psychopy/app/Resources/light/preferences-keyboard48.png +0 -0
  802. psychopy/app/Resources/light/preferences-keyboard48@2x.png +0 -0
  803. psychopy/app/Resources/light/preferences-keyboard@2x.png +0 -0
  804. psychopy/app/Resources/light/preferences-pilot.png +0 -0
  805. psychopy/app/Resources/light/preferences-pilot@2x.png +0 -0
  806. psychopy/app/Resources/light/preferences32.png +0 -0
  807. psychopy/app/Resources/light/preferences32@2x.png +0 -0
  808. psychopy/app/Resources/light/pyPilot.png +0 -0
  809. psychopy/app/Resources/light/pyPilot@2x.png +0 -0
  810. psychopy/app/Resources/light/pyRun.png +0 -0
  811. psychopy/app/Resources/light/pyRun@2x.png +0 -0
  812. psychopy/app/Resources/light/reddot.png +0 -0
  813. psychopy/app/Resources/light/reddot@2x.png +0 -0
  814. psychopy/app/Resources/light/redglobe.png +0 -0
  815. psychopy/app/Resources/light/redglobe@2x.png +0 -0
  816. psychopy/app/Resources/light/redglobe_bug.png +0 -0
  817. psychopy/app/Resources/light/redglobe_bug@2x.png +0 -0
  818. psychopy/app/Resources/light/redglobe_greensync.png +0 -0
  819. psychopy/app/Resources/light/redglobe_greensync@2x.png +0 -0
  820. psychopy/app/Resources/light/redglobe_info.png +0 -0
  821. psychopy/app/Resources/light/redglobe_info@2x.png +0 -0
  822. psychopy/app/Resources/light/redglobe_magnifier.png +0 -0
  823. psychopy/app/Resources/light/redglobe_magnifier@2x.png +0 -0
  824. psychopy/app/Resources/light/redglobe_run.png +0 -0
  825. psychopy/app/Resources/light/redglobe_run@2x.png +0 -0
  826. psychopy/app/Resources/light/redglobe_user.png +0 -0
  827. psychopy/app/Resources/light/redglobe_user@2x.png +0 -0
  828. psychopy/app/Resources/light/redo.png +0 -0
  829. psychopy/app/Resources/light/redo32.png +0 -0
  830. psychopy/app/Resources/light/redo32@2x.png +0 -0
  831. psychopy/app/Resources/light/redo@2x.png +0 -0
  832. psychopy/app/Resources/light/removeExp32.png +0 -0
  833. psychopy/app/Resources/light/removeExp32@2x.png +0 -0
  834. psychopy/app/Resources/light/rename16.png +0 -0
  835. psychopy/app/Resources/light/rename16@2x.png +0 -0
  836. psychopy/app/Resources/light/restart.png +0 -0
  837. psychopy/app/Resources/light/restart@2x.png +0 -0
  838. psychopy/app/Resources/light/runner.png +0 -0
  839. psychopy/app/Resources/light/runner@2x.png +0 -0
  840. psychopy/app/Resources/light/runnerPilot.png +0 -0
  841. psychopy/app/Resources/light/runnerPilot@2x.png +0 -0
  842. psychopy/app/Resources/light/savebtn16.png +0 -0
  843. psychopy/app/Resources/light/savebtn16@2x.png +0 -0
  844. psychopy/app/Resources/light/search.png +0 -0
  845. psychopy/app/Resources/light/search@2x.png +0 -0
  846. psychopy/app/Resources/light/showBuilder.png +0 -0
  847. psychopy/app/Resources/light/showBuilder@2x.png +0 -0
  848. psychopy/app/Resources/light/showCoder.png +0 -0
  849. psychopy/app/Resources/light/showCoder@2x.png +0 -0
  850. psychopy/app/Resources/light/showRunner.png +0 -0
  851. psychopy/app/Resources/light/showRunner@2x.png +0 -0
  852. psychopy/app/Resources/light/starred.png +0 -0
  853. psychopy/app/Resources/light/starred@2x.png +0 -0
  854. psychopy/app/Resources/light/start.png +0 -0
  855. psychopy/app/Resources/light/start@2x.png +0 -0
  856. psychopy/app/Resources/light/stdout.png +0 -0
  857. psychopy/app/Resources/light/stdout@2x.png +0 -0
  858. psychopy/app/Resources/light/stop.png +0 -0
  859. psychopy/app/Resources/light/stop32.png +0 -0
  860. psychopy/app/Resources/light/stop32@2x.png +0 -0
  861. psychopy/app/Resources/light/stop@2x.png +0 -0
  862. psychopy/app/Resources/light/switchCtrlBot.png +0 -0
  863. psychopy/app/Resources/light/switchCtrlBot@2x.png +0 -0
  864. psychopy/app/Resources/light/switchCtrlLeft.png +0 -0
  865. psychopy/app/Resources/light/switchCtrlLeft@2x.png +0 -0
  866. psychopy/app/Resources/light/switchCtrlRight.png +0 -0
  867. psychopy/app/Resources/light/switchCtrlRight@2x.png +0 -0
  868. psychopy/app/Resources/light/switchCtrlTop.png +0 -0
  869. psychopy/app/Resources/light/switchCtrlTop@2x.png +0 -0
  870. psychopy/app/Resources/light/tick.png +0 -0
  871. psychopy/app/Resources/light/tick@2x.png +0 -0
  872. psychopy/app/Resources/light/undo.png +0 -0
  873. psychopy/app/Resources/light/undo32.png +0 -0
  874. psychopy/app/Resources/light/undo32@2x.png +0 -0
  875. psychopy/app/Resources/light/undo@2x.png +0 -0
  876. psychopy/app/Resources/light/unstarred.png +0 -0
  877. psychopy/app/Resources/light/unstarred@2x.png +0 -0
  878. psychopy/app/Resources/light/user_none.png +0 -0
  879. psychopy/app/Resources/light/view-refresh16.png +0 -0
  880. psychopy/app/Resources/light/view-refresh16@2x.png +0 -0
  881. psychopy/app/Resources/light/viewbtn16.png +0 -0
  882. psychopy/app/Resources/light/viewbtn16@2x.png +0 -0
  883. psychopy/app/Resources/light/windows16.png +0 -0
  884. psychopy/app/Resources/light/windows16@2x.png +0 -0
  885. psychopy/app/Resources/moveComponentIcons.py +50 -0
  886. psychopy/app/Resources/next.png +0 -0
  887. psychopy/app/Resources/psychopy.desktop +13 -0
  888. psychopy/app/Resources/psychopy.icns +0 -0
  889. psychopy/app/Resources/psychopy.ico +0 -0
  890. psychopy/app/Resources/psychopy.png +0 -0
  891. psychopy/app/Resources/psychopy.xml +9 -0
  892. psychopy/app/Resources/psychopy@2x.png +0 -0
  893. psychopy/app/Resources/psychopySplash.png +0 -0
  894. psychopy/app/Resources/psychopySplash@2x.png +0 -0
  895. psychopy/app/Resources/routine_templates/Basic.psyexp +345 -0
  896. psychopy/app/Resources/routine_templates/Misc.psyexp +229 -0
  897. psychopy/app/Resources/routine_templates/Online.psyexp +202 -0
  898. psychopy/app/Resources/routine_templates/Trials.psyexp +736 -0
  899. psychopy/app/Resources/routine_templates/readme.md +14 -0
  900. psychopy/app/Resources/runner.ico +0 -0
  901. psychopy/app/Resources/tips.txt +45 -0
  902. psychopy/app/Resources/tips_ar_001.txt +45 -0
  903. psychopy/app/Resources/tips_fr_FR.txt +45 -0
  904. psychopy/app/Resources/tips_ja_JP.txt +42 -0
  905. psychopy/app/Resources/tips_zh_CN.txt +45 -0
  906. psychopy/app/Resources/window.ico +0 -0
  907. psychopy/app/__init__.py +224 -0
  908. psychopy/app/_psychopyApp.py +1224 -0
  909. psychopy/app/appData.spec +58 -0
  910. psychopy/app/builder/__init__.py +5 -0
  911. psychopy/app/builder/builder.py +4658 -0
  912. psychopy/app/builder/dialogs/__init__.py +2014 -0
  913. psychopy/app/builder/dialogs/dlgsCode.py +610 -0
  914. psychopy/app/builder/dialogs/dlgsConditions.py +670 -0
  915. psychopy/app/builder/dialogs/findDlg.py +189 -0
  916. psychopy/app/builder/dialogs/paramCtrls.py +1213 -0
  917. psychopy/app/builder/localizedStrings.py +225 -0
  918. psychopy/app/builder/validators.py +581 -0
  919. psychopy/app/coder/__init__.py +8 -0
  920. psychopy/app/coder/codeEditorBase.py +460 -0
  921. psychopy/app/coder/coder.py +3086 -0
  922. psychopy/app/coder/fileBrowser.py +668 -0
  923. psychopy/app/coder/folding.py +128 -0
  924. psychopy/app/coder/psychoParser.py +139 -0
  925. psychopy/app/coder/repl.py +493 -0
  926. psychopy/app/coder/sourceTree.py +302 -0
  927. psychopy/app/colorpicker/__init__.py +594 -0
  928. psychopy/app/colorpicker/ui.py +336 -0
  929. psychopy/app/connections/__init__.py +10 -0
  930. psychopy/app/connections/news.py +104 -0
  931. psychopy/app/connections/sendusage.py +61 -0
  932. psychopy/app/connections/updates.py +642 -0
  933. psychopy/app/console.py +164 -0
  934. psychopy/app/dialogs.py +632 -0
  935. psychopy/app/errorDlg.py +238 -0
  936. psychopy/app/frametracker.py +8 -0
  937. psychopy/app/idle.py +143 -0
  938. psychopy/app/jobs.py +648 -0
  939. psychopy/app/linuxconfig/__init__.py +144 -0
  940. psychopy/app/linuxconfig/ui.py +88 -0
  941. psychopy/app/locale/ar_001/LC_MESSAGE/messages.mo +0 -0
  942. psychopy/app/locale/ar_001/LC_MESSAGE/messages.po +9554 -0
  943. psychopy/app/locale/cs_CZ/LC_MESSAGE/messages.mo +0 -0
  944. psychopy/app/locale/cs_CZ/LC_MESSAGE/messages.po +24 -0
  945. psychopy/app/locale/da_DK/LC_MESSAGE/messages.mo +0 -0
  946. psychopy/app/locale/da_DK/LC_MESSAGE/messages.po +24 -0
  947. psychopy/app/locale/de_DE/LC_MESSAGE/messages.mo +0 -0
  948. psychopy/app/locale/de_DE/LC_MESSAGE/messages.po +9712 -0
  949. psychopy/app/locale/el_GR/LC_MESSAGE/messages.mo +0 -0
  950. psychopy/app/locale/el_GR/LC_MESSAGE/messages.po +25 -0
  951. psychopy/app/locale/en_NZ/LC_MESSAGE/messages.mo +0 -0
  952. psychopy/app/locale/en_NZ/LC_MESSAGE/messages.po +25 -0
  953. psychopy/app/locale/en_US/LC_MESSAGE/messages.mo +0 -0
  954. psychopy/app/locale/en_US/LC_MESSAGE/messages.po +18 -0
  955. psychopy/app/locale/es_CO/LC_MESSAGE/messages.mo +0 -0
  956. psychopy/app/locale/es_CO/LC_MESSAGE/messages.po +9100 -0
  957. psychopy/app/locale/es_ES/LC_MESSAGE/messages.mo +0 -0
  958. psychopy/app/locale/es_ES/LC_MESSAGE/messages.po +9094 -0
  959. psychopy/app/locale/es_US/LC_MESSAGE/messages.mo +0 -0
  960. psychopy/app/locale/es_US/LC_MESSAGE/messages.po +9100 -0
  961. psychopy/app/locale/et_EE/LC_MESSAGE/messages.mo +0 -0
  962. psychopy/app/locale/et_EE/LC_MESSAGE/messages.po +9569 -0
  963. psychopy/app/locale/fa_IR/LC_MESSAGE/messages.mo +0 -0
  964. psychopy/app/locale/fa_IR/LC_MESSAGE/messages.po +5806 -0
  965. psychopy/app/locale/fi_FI/LC_MESSAGE/messages.mo +0 -0
  966. psychopy/app/locale/fi_FI/LC_MESSAGE/messages.po +24 -0
  967. psychopy/app/locale/fr_FR/LC_MESSAGE/messages.mo +0 -0
  968. psychopy/app/locale/fr_FR/LC_MESSAGE/messages.po +9577 -0
  969. psychopy/app/locale/he_IL/LC_MESSAGE/messages.mo +0 -0
  970. psychopy/app/locale/he_IL/LC_MESSAGE/messages.po +9549 -0
  971. psychopy/app/locale/hi_IN/LC_MESSAGE/messages.mo +0 -0
  972. psychopy/app/locale/hi_IN/LC_MESSAGE/messages.po +9559 -0
  973. psychopy/app/locale/hu_HU/LC_MESSAGE/messages.mo +0 -0
  974. psychopy/app/locale/hu_HU/LC_MESSAGE/messages.po +25 -0
  975. psychopy/app/locale/it_IT/LC_MESSAGE/messages.mo +0 -0
  976. psychopy/app/locale/it_IT/LC_MESSAGE/messages.po +9560 -0
  977. psychopy/app/locale/ja_JP/LC_MESSAGE/messages.mo +0 -0
  978. psychopy/app/locale/ja_JP/LC_MESSAGE/messages.po +11687 -0
  979. psychopy/app/locale/ko_KR/LC_MESSAGE/messages.mo +0 -0
  980. psychopy/app/locale/ko_KR/LC_MESSAGE/messages.po +24 -0
  981. psychopy/app/locale/ms_MY/LC_MESSAGE/messages.mo +0 -0
  982. psychopy/app/locale/ms_MY/LC_MESSAGE/messages.po +8757 -0
  983. psychopy/app/locale/nl_NL/LC_MESSAGE/messages.mo +0 -0
  984. psychopy/app/locale/nl_NL/LC_MESSAGE/messages.po +25 -0
  985. psychopy/app/locale/nn_NO/LC_MESSAGE/messages.mo +0 -0
  986. psychopy/app/locale/nn_NO/LC_MESSAGE/messages.po +25 -0
  987. psychopy/app/locale/pl_PL/LC_MESSAGE/messages.mo +0 -0
  988. psychopy/app/locale/pl_PL/LC_MESSAGE/messages.po +25 -0
  989. psychopy/app/locale/pt_PT/LC_MESSAGE/messages.mo +0 -0
  990. psychopy/app/locale/pt_PT/LC_MESSAGE/messages.po +24 -0
  991. psychopy/app/locale/ro_RO/LC_MESSAGE/messages.mo +0 -0
  992. psychopy/app/locale/ro_RO/LC_MESSAGE/messages.po +25 -0
  993. psychopy/app/locale/ru_RU/LC_MESSAGE/messages.mo +0 -0
  994. psychopy/app/locale/ru_RU/LC_MESSAGE/messages.po +24 -0
  995. psychopy/app/locale/sv_SE/LC_MESSAGE/messages.mo +0 -0
  996. psychopy/app/locale/sv_SE/LC_MESSAGE/messages.po +8747 -0
  997. psychopy/app/locale/tr_TR/LC_MESSAGE/messages.mo +0 -0
  998. psychopy/app/locale/tr_TR/LC_MESSAGE/messages.po +9545 -0
  999. psychopy/app/locale/zh_CN/LC_MESSAGE/messages.mo +0 -0
  1000. psychopy/app/locale/zh_CN/LC_MESSAGE/messages.po +8268 -0
  1001. psychopy/app/locale/zh_TW/LC_MESSAGE/messages.mo +0 -0
  1002. psychopy/app/locale/zh_TW/LC_MESSAGE/messages.po +8022 -0
  1003. psychopy/app/pavlovia_ui/__init__.py +22 -0
  1004. psychopy/app/pavlovia_ui/_base.py +237 -0
  1005. psychopy/app/pavlovia_ui/functions.py +176 -0
  1006. psychopy/app/pavlovia_ui/menu.py +140 -0
  1007. psychopy/app/pavlovia_ui/project.py +943 -0
  1008. psychopy/app/pavlovia_ui/search.py +445 -0
  1009. psychopy/app/pavlovia_ui/sync.py +137 -0
  1010. psychopy/app/pavlovia_ui/user.py +264 -0
  1011. psychopy/app/plugin_manager/__init__.py +5 -0
  1012. psychopy/app/plugin_manager/dialog.py +400 -0
  1013. psychopy/app/plugin_manager/output.py +132 -0
  1014. psychopy/app/plugin_manager/packages.py +502 -0
  1015. psychopy/app/plugin_manager/plugins.py +1315 -0
  1016. psychopy/app/plugin_manager/utils.py +115 -0
  1017. psychopy/app/preferencesDlg.py +790 -0
  1018. psychopy/app/psychopyApp.py +103 -0
  1019. psychopy/app/ribbon.py +907 -0
  1020. psychopy/app/runner/__init__.py +1 -0
  1021. psychopy/app/runner/runner.py +1262 -0
  1022. psychopy/app/runner/scriptProcess.py +353 -0
  1023. psychopy/app/stdout/__init__.py +1 -0
  1024. psychopy/app/stdout/stdOutRich.py +380 -0
  1025. psychopy/app/sysInfoDlg.py +242 -0
  1026. psychopy/app/themes/__init__.py +78 -0
  1027. psychopy/app/themes/colors.py +201 -0
  1028. psychopy/app/themes/css/contrast_black.css +112 -0
  1029. psychopy/app/themes/css/contrast_white.css +115 -0
  1030. psychopy/app/themes/css/dark.css +112 -0
  1031. psychopy/app/themes/css/light.css +115 -0
  1032. psychopy/app/themes/fonts.py +629 -0
  1033. psychopy/app/themes/handlers.py +321 -0
  1034. psychopy/app/themes/icons.py +250 -0
  1035. psychopy/app/themes/spec/Classic.json +154 -0
  1036. psychopy/app/themes/spec/ClassicDark.json +154 -0
  1037. psychopy/app/themes/spec/GitHub.json +154 -0
  1038. psychopy/app/themes/spec/HiVisDark.json +153 -0
  1039. psychopy/app/themes/spec/HiVisLight.json +154 -0
  1040. psychopy/app/themes/spec/MinimalDark.json +154 -0
  1041. psychopy/app/themes/spec/MinimalLight.json +153 -0
  1042. psychopy/app/themes/spec/PsychopyDark.json +231 -0
  1043. psychopy/app/themes/spec/PsychopyLight.json +236 -0
  1044. psychopy/app/themes/ui.py +74 -0
  1045. psychopy/app/ui/__init__.py +184 -0
  1046. psychopy/app/urls.py +31 -0
  1047. psychopy/app/utils.py +1680 -0
  1048. psychopy/app/viewer/__init__.py +0 -0
  1049. psychopy/clock.py +612 -0
  1050. psychopy/colors.py +1050 -0
  1051. psychopy/compatibility.py +95 -0
  1052. psychopy/constants.py +87 -0
  1053. psychopy/contrib/__init__.py +0 -0
  1054. psychopy/contrib/configobj/LICENSE +39 -0
  1055. psychopy/contrib/configobj/__init__.py +2453 -0
  1056. psychopy/contrib/configobj/_version.py +2 -0
  1057. psychopy/contrib/configobj/validate.py +1458 -0
  1058. psychopy/contrib/lazy_import.py +402 -0
  1059. psychopy/contrib/mseq.py +273 -0
  1060. psychopy/contrib/mseqSearch.py +183 -0
  1061. psychopy/contrib/psi.py +100 -0
  1062. psychopy/contrib/quest.py +484 -0
  1063. psychopy/contrib/tesselate.py +188 -0
  1064. psychopy/core.py +167 -0
  1065. psychopy/data/__init__.py +44 -0
  1066. psychopy/data/base.py +566 -0
  1067. psychopy/data/counterbalance.py +210 -0
  1068. psychopy/data/experiment.py +708 -0
  1069. psychopy/data/fit.py +248 -0
  1070. psychopy/data/shelf.py +237 -0
  1071. psychopy/data/staircase.py +2247 -0
  1072. psychopy/data/trial.py +1978 -0
  1073. psychopy/data/utils.py +783 -0
  1074. psychopy/demos/__init__.py +0 -0
  1075. psychopy/demos/builder/Design Templates/branchedExperiment/README.md +5 -0
  1076. psychopy/demos/builder/Design Templates/branchedExperiment/branchedExperiment.psyexp +239 -0
  1077. psychopy/demos/builder/Design Templates/branchedExperiment/trialTypes.xlsx +0 -0
  1078. psychopy/demos/builder/Design Templates/psychophysicsStaircase/README.md +20 -0
  1079. psychopy/demos/builder/Design Templates/psychophysicsStaircase/psychophysicsStaircase.psyexp +264 -0
  1080. psychopy/demos/builder/Design Templates/psychophysicsStairsInterleaved/README.md +14 -0
  1081. psychopy/demos/builder/Design Templates/psychophysicsStairsInterleaved/psychophysicsStaircaseInterleaved.psyexp +201 -0
  1082. psychopy/demos/builder/Design Templates/psychophysicsStairsInterleaved/stairDefinitions.xlsx +0 -0
  1083. psychopy/demos/builder/Design Templates/randomisedBlocks/README.md +18 -0
  1084. psychopy/demos/builder/Design Templates/randomisedBlocks/chooseBlock.xlsx +0 -0
  1085. psychopy/demos/builder/Design Templates/randomisedBlocks/facesBlock.xlsx +0 -0
  1086. psychopy/demos/builder/Design Templates/randomisedBlocks/housesBlock.xlsx +0 -0
  1087. psychopy/demos/builder/Design Templates/randomisedBlocks/randomisedBlocks.psyexp +131 -0
  1088. psychopy/demos/builder/Design Templates/randomisedBlocks/stims/face01.jpg +0 -0
  1089. psychopy/demos/builder/Design Templates/randomisedBlocks/stims/face02.jpg +0 -0
  1090. psychopy/demos/builder/Design Templates/randomisedBlocks/stims/face03.jpg +0 -0
  1091. psychopy/demos/builder/Design Templates/randomisedBlocks/stims/house01.jpg +0 -0
  1092. psychopy/demos/builder/Design Templates/randomisedBlocks/stims/house02.jpg +0 -0
  1093. psychopy/demos/builder/Design Templates/randomisedBlocks/stims/house03.jpg +0 -0
  1094. psychopy/demos/builder/Experiments/BART/README.md +30 -0
  1095. psychopy/demos/builder/Experiments/BART/assets/background.png +0 -0
  1096. psychopy/demos/builder/Experiments/BART/assets/bang.mp3 +0 -0
  1097. psychopy/demos/builder/Experiments/BART/assets/bang.wav +0 -0
  1098. psychopy/demos/builder/Experiments/BART/assets/blueBalloon.png +0 -0
  1099. psychopy/demos/builder/Experiments/BART/assets/greenBalloon.png +0 -0
  1100. psychopy/demos/builder/Experiments/BART/assets/redBalloon.png +0 -0
  1101. psychopy/demos/builder/Experiments/BART/bart.psyexp +931 -0
  1102. psychopy/demos/builder/Experiments/BART/spreadsheets/conditions.xlsx +0 -0
  1103. psychopy/demos/builder/Experiments/BigFiveInventory/BFI.psyexp +193 -0
  1104. psychopy/demos/builder/Experiments/BigFiveInventory/README.md +23 -0
  1105. psychopy/demos/builder/Experiments/BigFiveInventory/TIPI.xlsx +0 -0
  1106. psychopy/demos/builder/Experiments/BigFiveInventory/bigFiveItems.xlsx +0 -0
  1107. psychopy/demos/builder/Experiments/BigFiveInventory/demographics.xlsx +0 -0
  1108. psychopy/demos/builder/Experiments/BigFiveInventory/mini_IPIP.xlsx +0 -0
  1109. psychopy/demos/builder/Experiments/dragAndDrop/README.md +40 -0
  1110. psychopy/demos/builder/Experiments/dragAndDrop/archived_conditions.xlsx +0 -0
  1111. psychopy/demos/builder/Experiments/dragAndDrop/drag_and_drop.psyexp +1221 -0
  1112. psychopy/demos/builder/Experiments/dragAndDrop/draw grid stim.py +61 -0
  1113. psychopy/demos/builder/Experiments/dragAndDrop/shapeMaker.psyexp +91 -0
  1114. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_1.png +0 -0
  1115. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_10.png +0 -0
  1116. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_2.png +0 -0
  1117. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_3.png +0 -0
  1118. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_4.png +0 -0
  1119. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_5.png +0 -0
  1120. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_6.png +0 -0
  1121. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_7.png +0 -0
  1122. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_8.png +0 -0
  1123. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_9.png +0 -0
  1124. psychopy/demos/builder/Experiments/dragAndDrop/updated_conditions.xlsx +0 -0
  1125. psychopy/demos/builder/Experiments/goNoGo/conditions.xlsx +0 -0
  1126. psychopy/demos/builder/Experiments/goNoGo/gng.psyexp +449 -0
  1127. psychopy/demos/builder/Experiments/goNoGo/go.png +0 -0
  1128. psychopy/demos/builder/Experiments/goNoGo/nogo.png +0 -0
  1129. psychopy/demos/builder/Experiments/goNoGo/readme.md +14 -0
  1130. psychopy/demos/builder/Experiments/mentalRotation/F.png +0 -0
  1131. psychopy/demos/builder/Experiments/mentalRotation/FR.png +0 -0
  1132. psychopy/demos/builder/Experiments/mentalRotation/MentalRot.csv +33 -0
  1133. psychopy/demos/builder/Experiments/mentalRotation/MentalRotation.psyexp +605 -0
  1134. psychopy/demos/builder/Experiments/mentalRotation/README.md +23 -0
  1135. psychopy/demos/builder/Experiments/navon/NavonTask.psyexp +478 -0
  1136. psychopy/demos/builder/Experiments/navon/README.md +26 -0
  1137. psychopy/demos/builder/Experiments/navon/bigHsmallH.png +0 -0
  1138. psychopy/demos/builder/Experiments/navon/bigHsmallS.png +0 -0
  1139. psychopy/demos/builder/Experiments/navon/bigSsmallH.png +0 -0
  1140. psychopy/demos/builder/Experiments/navon/bigSsmallS.png +0 -0
  1141. psychopy/demos/builder/Experiments/navon/mask.png +0 -0
  1142. psychopy/demos/builder/Experiments/navon/stimuli.pptx +0 -0
  1143. psychopy/demos/builder/Experiments/navon/trialTypes.xlsx +0 -0
  1144. psychopy/demos/builder/Experiments/sternberg/README.md +14 -0
  1145. psychopy/demos/builder/Experiments/sternberg/mainTrials.xlsx +0 -0
  1146. psychopy/demos/builder/Experiments/sternberg/pracTrials.xlsx +0 -0
  1147. psychopy/demos/builder/Experiments/sternberg/sternberg.psyexp +611 -0
  1148. psychopy/demos/builder/Experiments/stroop/README.md +15 -0
  1149. psychopy/demos/builder/Experiments/stroop/stroop.psyexp +225 -0
  1150. psychopy/demos/builder/Experiments/stroop/trialTypes.csv +7 -0
  1151. psychopy/demos/builder/Experiments/stroopExtended/README.md +14 -0
  1152. psychopy/demos/builder/Experiments/stroopExtended/stroop.psyexp +243 -0
  1153. psychopy/demos/builder/Experiments/stroopExtended/stroopReverse.psyexp +243 -0
  1154. psychopy/demos/builder/Experiments/stroopExtended/trialTypes.xlsx +0 -0
  1155. psychopy/demos/builder/Experiments/stroopExtended/trialTypesReverse.xlsx +0 -0
  1156. psychopy/demos/builder/Experiments/stroopVoice/README.md +27 -0
  1157. psychopy/demos/builder/Experiments/stroopVoice/conditions.xlsx +0 -0
  1158. psychopy/demos/builder/Experiments/stroopVoice/stroopVoice.psyexp +366 -0
  1159. psychopy/demos/builder/Feature Demos/counterbalance/counterbalance.psyexp +298 -0
  1160. psychopy/demos/builder/Feature Demos/gratings/gratings.psyexp +341 -0
  1161. psychopy/demos/builder/Feature Demos/gratings/readme.md +8 -0
  1162. psychopy/demos/builder/Feature Demos/noise/face.jpg +0 -0
  1163. psychopy/demos/builder/Feature Demos/noise/noise.psyexp +424 -0
  1164. psychopy/demos/builder/Feature Demos/noise/readme.md +3 -0
  1165. psychopy/demos/builder/Feature Demos/panorama/panImg.jpg +0 -0
  1166. psychopy/demos/builder/Feature Demos/panorama/panorama.psyexp +142 -0
  1167. psychopy/demos/builder/Feature Demos/progress/progressBar.psyexp +423 -0
  1168. psychopy/demos/builder/Feature Demos/progress/readme.md +1 -0
  1169. psychopy/demos/builder/Feature Demos/sliders/README.md +8 -0
  1170. psychopy/demos/builder/Feature Demos/sliders/fruitConditions.xlsx +0 -0
  1171. psychopy/demos/builder/Feature Demos/sliders/sliders.psyexp +938 -0
  1172. psychopy/demos/builder/Hardware/EEG_parallel_component/EEG_triggers_parallel_comp.psyexp +621 -0
  1173. psychopy/demos/builder/Hardware/EEG_serial_code/EEG_triggers_serial_code.psyexp +404 -0
  1174. psychopy/demos/builder/Hardware/EEG_serial_component/EEG_triggers_serial_comp.psyexp +641 -0
  1175. psychopy/demos/builder/Hardware/EGI_netstation/README.md +17 -0
  1176. psychopy/demos/builder/Hardware/EGI_netstation/stroop.psyexp +254 -0
  1177. psychopy/demos/builder/Hardware/EGI_netstation/trialTypesEEG.csv +7 -0
  1178. psychopy/demos/builder/Hardware/Eyetracking_visual_search/readme.md +19 -0
  1179. psychopy/demos/builder/Hardware/Eyetracking_visual_search/trials_params.xlsx +0 -0
  1180. psychopy/demos/builder/Hardware/Eyetracking_visual_search/visualSearch.psyexp +691 -0
  1181. psychopy/demos/builder/Hardware/camera/camera.psyexp +263 -0
  1182. psychopy/demos/builder/Hardware/camera/readme.md +6 -0
  1183. psychopy/demos/builder/Hardware/eyetracking/eyetracking.psyexp +354 -0
  1184. psychopy/demos/builder/Hardware/eyetracking/readme.md +7 -0
  1185. psychopy/demos/builder/Hardware/eyetracking_custom_cal/Bullseye_grey.mov +0 -0
  1186. psychopy/demos/builder/Hardware/eyetracking_custom_cal/eyetracking_custom_cal.psyexp +349 -0
  1187. psychopy/demos/builder/Hardware/eyetracking_custom_cal/readme.md +7 -0
  1188. psychopy/demos/builder/Hardware/fMRI/fMRI_demo.psyexp +202 -0
  1189. psychopy/demos/builder/Hardware/fMRI/readme.md +7 -0
  1190. psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo.psyexp +349 -0
  1191. psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy.psyexp +304 -0
  1192. psychopy/demos/builder/Hardware/microphone/microphone.psyexp +451 -0
  1193. psychopy/demos/builder/Hardware/microphone/phrases.xlsx +0 -0
  1194. psychopy/demos/builder/Hardware/microphone/readme.md +9 -0
  1195. psychopy/demos/builder/Hardware/pump/README.md +19 -0
  1196. psychopy/demos/builder/Hardware/pump/pump.psyexp +382 -0
  1197. psychopy/demos/builder/Helper Tools/achorVSalignment/anchorAlignment.psyexp +288 -0
  1198. psychopy/demos/builder/Helper Tools/achorVSalignment/readme.md +5 -0
  1199. psychopy/demos/builder/Helper Tools/clockFace/README.md +3 -0
  1200. psychopy/demos/builder/Helper Tools/clockFace/clockFace.psyexp +160 -0
  1201. psychopy/demos/builder/Helper Tools/colors/README.md +5 -0
  1202. psychopy/demos/builder/Helper Tools/colors/colors.psyexp +300 -0
  1203. psychopy/demos/builder/Helper Tools/drawPolygon/README.md +5 -0
  1204. psychopy/demos/builder/Helper Tools/drawPolygon/drawPolygon.psyexp +591 -0
  1205. psychopy/demos/builder/Helper Tools/keyNameFinder/README.md +14 -0
  1206. psychopy/demos/builder/Helper Tools/keyNameFinder/keyNameFinder.psyexp +169 -0
  1207. psychopy/demos/builder/Helper Tools/spatialUnits/README.md +6 -0
  1208. psychopy/demos/builder/Helper Tools/spatialUnits/unitDemo.psyexp +157 -0
  1209. psychopy/demos/builder/README.txt +43 -0
  1210. psychopy/demos/builder/__init__.py +0 -0
  1211. psychopy/demos/coder/__init__.py +0 -0
  1212. psychopy/demos/coder/basic/hello_world.py +37 -0
  1213. psychopy/demos/coder/csvFromPsydat.py +29 -0
  1214. psychopy/demos/coder/experiment control/JND_staircase_analysis.py +85 -0
  1215. psychopy/demos/coder/experiment control/JND_staircase_exp.py +110 -0
  1216. psychopy/demos/coder/experiment control/TrialHandler.py +64 -0
  1217. psychopy/demos/coder/experiment control/TrialHandler2.py +42 -0
  1218. psychopy/demos/coder/experiment control/__init__.py +0 -0
  1219. psychopy/demos/coder/experiment control/autoDraw_autoLog.py +50 -0
  1220. psychopy/demos/coder/experiment control/experimentHandler.py +57 -0
  1221. psychopy/demos/coder/experiment control/fMRI_launchScan.py +74 -0
  1222. psychopy/demos/coder/experiment control/gammaMotionAnalysis.py +68 -0
  1223. psychopy/demos/coder/experiment control/gammaMotionNull.py +169 -0
  1224. psychopy/demos/coder/experiment control/logFiles.py +55 -0
  1225. psychopy/demos/coder/experiment control/piloting.py +65 -0
  1226. psychopy/demos/coder/experiment control/runtimeInfo.py +79 -0
  1227. psychopy/demos/coder/hardware/CRS_BitsBox.py +75 -0
  1228. psychopy/demos/coder/hardware/CRS_BitsPlusPlus.py +73 -0
  1229. psychopy/demos/coder/hardware/RiftHeadTrackingExample.py +95 -0
  1230. psychopy/demos/coder/hardware/RiftMinimal.py +44 -0
  1231. psychopy/demos/coder/hardware/VSHD_Distortion.py +49 -0
  1232. psychopy/demos/coder/hardware/__init__.py +0 -0
  1233. psychopy/demos/coder/hardware/camera.py +90 -0
  1234. psychopy/demos/coder/hardware/cedrusRB730.py +38 -0
  1235. psychopy/demos/coder/hardware/crsBitsAdvancedDemo.py +780 -0
  1236. psychopy/demos/coder/hardware/egi_netstation.py +45 -0
  1237. psychopy/demos/coder/hardware/ioLab_bbox.py +62 -0
  1238. psychopy/demos/coder/hardware/labjack_u3.py +61 -0
  1239. psychopy/demos/coder/hardware/monitorDemo.py +28 -0
  1240. psychopy/demos/coder/hardware/parallelPortOutput.py +49 -0
  1241. psychopy/demos/coder/hardware/qmixPump.py +79 -0
  1242. psychopy/demos/coder/hardware/testSoundLatency.py +127 -0
  1243. psychopy/demos/coder/input/GUI.py +52 -0
  1244. psychopy/demos/coder/input/__init__.py +0 -0
  1245. psychopy/demos/coder/input/customMouse.py +51 -0
  1246. psychopy/demos/coder/input/joystick_universal.py +84 -0
  1247. psychopy/demos/coder/input/keyNameFinder.py +39 -0
  1248. psychopy/demos/coder/input/mic.png +0 -0
  1249. psychopy/demos/coder/input/mouse.py +66 -0
  1250. psychopy/demos/coder/iohub/delaytest.py +231 -0
  1251. psychopy/demos/coder/iohub/eyetracking/gcCursor/images/canal.jpg +0 -0
  1252. psychopy/demos/coder/iohub/eyetracking/gcCursor/images/fall.jpg +0 -0
  1253. psychopy/demos/coder/iohub/eyetracking/gcCursor/images/lake.jpg +0 -0
  1254. psychopy/demos/coder/iohub/eyetracking/gcCursor/images/party.jpg +0 -0
  1255. psychopy/demos/coder/iohub/eyetracking/gcCursor/images/swimming.jpg +0 -0
  1256. psychopy/demos/coder/iohub/eyetracking/gcCursor/readTrialEventsByConditionVariables.py +67 -0
  1257. psychopy/demos/coder/iohub/eyetracking/gcCursor/readTrialEventsByMessages.py +34 -0
  1258. psychopy/demos/coder/iohub/eyetracking/gcCursor/run.py +323 -0
  1259. psychopy/demos/coder/iohub/eyetracking/gcCursor/trial_conditions.xlsx +0 -0
  1260. psychopy/demos/coder/iohub/eyetracking/simple.py +147 -0
  1261. psychopy/demos/coder/iohub/eyetracking/validation.py +251 -0
  1262. psychopy/demos/coder/iohub/iodatastore/saveEventReport.py +56 -0
  1263. psychopy/demos/coder/iohub/keyboard.py +189 -0
  1264. psychopy/demos/coder/iohub/keyboardreactiontime.py +88 -0
  1265. psychopy/demos/coder/iohub/launchHub.py +160 -0
  1266. psychopy/demos/coder/iohub/mouse.py +112 -0
  1267. psychopy/demos/coder/iohub/mouse_multi_window.py +124 -0
  1268. psychopy/demos/coder/iohub/serial/_parseserial.py +53 -0
  1269. psychopy/demos/coder/iohub/serial/customparser.py +84 -0
  1270. psychopy/demos/coder/iohub/serial/pstbox.py +166 -0
  1271. psychopy/demos/coder/iohub/wintab/_wintabgraphics.py +281 -0
  1272. psychopy/demos/coder/iohub/wintab/pen_demo.py +260 -0
  1273. psychopy/demos/coder/misc/encrypt_data.py +48 -0
  1274. psychopy/demos/coder/misc/makeMovie.py +28 -0
  1275. psychopy/demos/coder/misc/rigidBodyTransform.py +76 -0
  1276. psychopy/demos/coder/stimuli/Campaign.ttf +0 -0
  1277. psychopy/demos/coder/stimuli/MovieStim.py +65 -0
  1278. psychopy/demos/coder/stimuli/__init__.py +0 -0
  1279. psychopy/demos/coder/stimuli/aperture.py +37 -0
  1280. psychopy/demos/coder/stimuli/beach.jpg +0 -0
  1281. psychopy/demos/coder/stimuli/bufferImageStim.py +78 -0
  1282. psychopy/demos/coder/stimuli/clockface.py +43 -0
  1283. psychopy/demos/coder/stimuli/colorPalette.py +134 -0
  1284. psychopy/demos/coder/stimuli/compare_text_timing.py +193 -0
  1285. psychopy/demos/coder/stimuli/counterphase.py +43 -0
  1286. psychopy/demos/coder/stimuli/customTextures.py +57 -0
  1287. psychopy/demos/coder/stimuli/dot_gabors.py +35 -0
  1288. psychopy/demos/coder/stimuli/dots.py +35 -0
  1289. psychopy/demos/coder/stimuli/elementArrays.py +92 -0
  1290. psychopy/demos/coder/stimuli/embeddedOpenGL.py +35 -0
  1291. psychopy/demos/coder/stimuli/face.jpg +0 -0
  1292. psychopy/demos/coder/stimuli/face_jpg.py +48 -0
  1293. psychopy/demos/coder/stimuli/gabor.py +30 -0
  1294. psychopy/demos/coder/stimuli/imagesAndPatches.py +51 -0
  1295. psychopy/demos/coder/stimuli/jwpIntro.mp4 +0 -0
  1296. psychopy/demos/coder/stimuli/kanizsa.py +41 -0
  1297. psychopy/demos/coder/stimuli/maskReveal.py +63 -0
  1298. psychopy/demos/coder/stimuli/plaid.py +43 -0
  1299. psychopy/demos/coder/stimuli/ratingScale.py +183 -0
  1300. psychopy/demos/coder/stimuli/rotatingFlashingWedge.py +37 -0
  1301. psychopy/demos/coder/stimuli/screensAndWindows.py +58 -0
  1302. psychopy/demos/coder/stimuli/secondOrderGratings.py +66 -0
  1303. psychopy/demos/coder/stimuli/shapeContains.py +50 -0
  1304. psychopy/demos/coder/stimuli/shapes.py +63 -0
  1305. psychopy/demos/coder/stimuli/soundStimuli.py +49 -0
  1306. psychopy/demos/coder/stimuli/starField.py +48 -0
  1307. psychopy/demos/coder/stimuli/stim3d.py +107 -0
  1308. psychopy/demos/coder/stimuli/textBoxStim/textbox_glyph_placement.py +93 -0
  1309. psychopy/demos/coder/stimuli/textBoxStim/textbox_simple.py +71 -0
  1310. psychopy/demos/coder/stimuli/textStimuli.py +106 -0
  1311. psychopy/demos/coder/stimuli/textbox_editable.py +64 -0
  1312. psychopy/demos/coder/stimuli/variousVisualStims.py +47 -0
  1313. psychopy/demos/coder/stimuli/visual_noise.py +31 -0
  1314. psychopy/demos/coder/sysInfo.py +56 -0
  1315. psychopy/demos/coder/timing/__init__.py +0 -0
  1316. psychopy/demos/coder/timing/callOnFlip.py +39 -0
  1317. psychopy/demos/coder/timing/clocksAndTimers.py +46 -0
  1318. psychopy/demos/coder/timing/millikeyKeyboardTimingTest.py +323 -0
  1319. psychopy/demos/coder/timing/timeByFrames.py +74 -0
  1320. psychopy/demos/coder/timing/timeByFramesEx.py +107 -0
  1321. psychopy/demos/coder/understanding psychopy/colors.py +70 -0
  1322. psychopy/demos/coder/understanding psychopy/fontLayout.py +69 -0
  1323. psychopy/demos/demo_migration.py +214 -0
  1324. psychopy/demos/modernizeDemos.py +16 -0
  1325. psychopy/demos/test_demo_migration.py +155 -0
  1326. psychopy/devices/__init__.py +8 -0
  1327. psychopy/event.py +1333 -0
  1328. psychopy/exceptions.py +59 -0
  1329. psychopy/experiment/__init__.py +51 -0
  1330. psychopy/experiment/_experiment.py +1392 -0
  1331. psychopy/experiment/blankTemplate.xltx +0 -0
  1332. psychopy/experiment/components/__init__.py +411 -0
  1333. psychopy/experiment/components/_base.py +1351 -0
  1334. psychopy/experiment/components/aperture/__init__.py +149 -0
  1335. psychopy/experiment/components/aperture/classic/aperture.png +0 -0
  1336. psychopy/experiment/components/aperture/classic/aperture@2x.png +0 -0
  1337. psychopy/experiment/components/aperture/dark/aperture.png +0 -0
  1338. psychopy/experiment/components/aperture/dark/aperture@2x.png +0 -0
  1339. psychopy/experiment/components/aperture/light/aperture.png +0 -0
  1340. psychopy/experiment/components/aperture/light/aperture@2x.png +0 -0
  1341. psychopy/experiment/components/brush/__init__.py +163 -0
  1342. psychopy/experiment/components/brush/classic/brush.png +0 -0
  1343. psychopy/experiment/components/brush/classic/brush@2x.png +0 -0
  1344. psychopy/experiment/components/brush/dark/brush.png +0 -0
  1345. psychopy/experiment/components/brush/dark/brush@2x.png +0 -0
  1346. psychopy/experiment/components/brush/light/brush.png +0 -0
  1347. psychopy/experiment/components/brush/light/brush@2x.png +0 -0
  1348. psychopy/experiment/components/button/__init__.py +489 -0
  1349. psychopy/experiment/components/button/classic/button.png +0 -0
  1350. psychopy/experiment/components/button/classic/button@2x.png +0 -0
  1351. psychopy/experiment/components/button/dark/button.png +0 -0
  1352. psychopy/experiment/components/button/dark/button@2x.png +0 -0
  1353. psychopy/experiment/components/button/light/button.png +0 -0
  1354. psychopy/experiment/components/button/light/button@2x.png +0 -0
  1355. psychopy/experiment/components/buttonBox/__init__.py +316 -0
  1356. psychopy/experiment/components/buttonBox/classic/buttonBox.png +0 -0
  1357. psychopy/experiment/components/buttonBox/classic/buttonBox@2x.png +0 -0
  1358. psychopy/experiment/components/buttonBox/dark/buttonBox.png +0 -0
  1359. psychopy/experiment/components/buttonBox/dark/buttonBox@2x.png +0 -0
  1360. psychopy/experiment/components/buttonBox/light/buttonBox.png +0 -0
  1361. psychopy/experiment/components/buttonBox/light/buttonBox@2x.png +0 -0
  1362. psychopy/experiment/components/camera/__init__.py +591 -0
  1363. psychopy/experiment/components/camera/classic/webcam.png +0 -0
  1364. psychopy/experiment/components/camera/classic/webcam@2x.png +0 -0
  1365. psychopy/experiment/components/camera/dark/webcam.png +0 -0
  1366. psychopy/experiment/components/camera/dark/webcam@2x.png +0 -0
  1367. psychopy/experiment/components/camera/light/webcam.png +0 -0
  1368. psychopy/experiment/components/camera/light/webcam@2x.png +0 -0
  1369. psychopy/experiment/components/code/__init__.py +266 -0
  1370. psychopy/experiment/components/code/classic/code.png +0 -0
  1371. psychopy/experiment/components/code/classic/code@2x.png +0 -0
  1372. psychopy/experiment/components/code/dark/code.png +0 -0
  1373. psychopy/experiment/components/code/dark/code@2x.png +0 -0
  1374. psychopy/experiment/components/code/light/code.png +0 -0
  1375. psychopy/experiment/components/code/light/code@2x.png +0 -0
  1376. psychopy/experiment/components/dots/__init__.py +199 -0
  1377. psychopy/experiment/components/dots/classic/dots.png +0 -0
  1378. psychopy/experiment/components/dots/classic/dots@2x.png +0 -0
  1379. psychopy/experiment/components/dots/dark/dots.png +0 -0
  1380. psychopy/experiment/components/dots/dark/dots@2x.png +0 -0
  1381. psychopy/experiment/components/dots/dots.xcf +0 -0
  1382. psychopy/experiment/components/dots/light/dots.png +0 -0
  1383. psychopy/experiment/components/dots/light/dots@2x.png +0 -0
  1384. psychopy/experiment/components/eyetracker_record/__init__.py +128 -0
  1385. psychopy/experiment/components/eyetracker_record/classic/eyetracker_record.png +0 -0
  1386. psychopy/experiment/components/eyetracker_record/classic/eyetracker_record@2x.png +0 -0
  1387. psychopy/experiment/components/eyetracker_record/dark/eyetracker_record.png +0 -0
  1388. psychopy/experiment/components/eyetracker_record/dark/eyetracker_record@2x.png +0 -0
  1389. psychopy/experiment/components/eyetracker_record/light/eyetracker_record.png +0 -0
  1390. psychopy/experiment/components/eyetracker_record/light/eyetracker_record@2x.png +0 -0
  1391. psychopy/experiment/components/form/__init__.py +223 -0
  1392. psychopy/experiment/components/form/classic/form.png +0 -0
  1393. psychopy/experiment/components/form/classic/form@2x.png +0 -0
  1394. psychopy/experiment/components/form/dark/form.png +0 -0
  1395. psychopy/experiment/components/form/dark/form@2x.png +0 -0
  1396. psychopy/experiment/components/form/formItems.xltx +0 -0
  1397. psychopy/experiment/components/form/light/form.png +0 -0
  1398. psychopy/experiment/components/form/light/form@2x.png +0 -0
  1399. psychopy/experiment/components/grating/__init__.py +192 -0
  1400. psychopy/experiment/components/grating/classic/grating.png +0 -0
  1401. psychopy/experiment/components/grating/classic/grating@2x.png +0 -0
  1402. psychopy/experiment/components/grating/dark/grating.png +0 -0
  1403. psychopy/experiment/components/grating/dark/grating@2x.png +0 -0
  1404. psychopy/experiment/components/grating/light/grating.png +0 -0
  1405. psychopy/experiment/components/grating/light/grating@2x.png +0 -0
  1406. psychopy/experiment/components/image/__init__.py +184 -0
  1407. psychopy/experiment/components/image/classic/image.png +0 -0
  1408. psychopy/experiment/components/image/classic/image@2x.png +0 -0
  1409. psychopy/experiment/components/image/dark/image.png +0 -0
  1410. psychopy/experiment/components/image/dark/image@2x.png +0 -0
  1411. psychopy/experiment/components/image/light/image.png +0 -0
  1412. psychopy/experiment/components/image/light/image@2x.png +0 -0
  1413. psychopy/experiment/components/joyButtons/__init__.py +453 -0
  1414. psychopy/experiment/components/joyButtons/classic/joyButtons.png +0 -0
  1415. psychopy/experiment/components/joyButtons/classic/joybuttons@2x.png +0 -0
  1416. psychopy/experiment/components/joyButtons/dark/joyButtons.png +0 -0
  1417. psychopy/experiment/components/joyButtons/dark/joyButtons@2x.png +0 -0
  1418. psychopy/experiment/components/joyButtons/light/joyButtons.png +0 -0
  1419. psychopy/experiment/components/joyButtons/light/joyButtons@2x.png +0 -0
  1420. psychopy/experiment/components/joyButtons/virtualJoyButtons.py +34 -0
  1421. psychopy/experiment/components/joystick/__init__.py +572 -0
  1422. psychopy/experiment/components/joystick/classic/joystick.png +0 -0
  1423. psychopy/experiment/components/joystick/classic/joystick@2x.png +0 -0
  1424. psychopy/experiment/components/joystick/dark/joystick.png +0 -0
  1425. psychopy/experiment/components/joystick/dark/joystick@2x.png +0 -0
  1426. psychopy/experiment/components/joystick/light/joystick.png +0 -0
  1427. psychopy/experiment/components/joystick/light/joystick@2x.png +0 -0
  1428. psychopy/experiment/components/joystick/virtualJoystick.py +40 -0
  1429. psychopy/experiment/components/keyboard/__init__.py +587 -0
  1430. psychopy/experiment/components/keyboard/classic/keyboard.png +0 -0
  1431. psychopy/experiment/components/keyboard/classic/keyboard@2x.png +0 -0
  1432. psychopy/experiment/components/keyboard/dark/keyboard.png +0 -0
  1433. psychopy/experiment/components/keyboard/dark/keyboard@2x.png +0 -0
  1434. psychopy/experiment/components/keyboard/light/keyboard.png +0 -0
  1435. psychopy/experiment/components/keyboard/light/keyboard@2x.png +0 -0
  1436. psychopy/experiment/components/keyboard.xcf +0 -0
  1437. psychopy/experiment/components/microphone/__init__.py +664 -0
  1438. psychopy/experiment/components/microphone/classic/microphone.png +0 -0
  1439. psychopy/experiment/components/microphone/classic/microphone@2x.png +0 -0
  1440. psychopy/experiment/components/microphone/dark/microphone.png +0 -0
  1441. psychopy/experiment/components/microphone/dark/microphone@2x.png +0 -0
  1442. psychopy/experiment/components/microphone/light/microphone.png +0 -0
  1443. psychopy/experiment/components/microphone/light/microphone@2x.png +0 -0
  1444. psychopy/experiment/components/mouse/__init__.py +747 -0
  1445. psychopy/experiment/components/mouse/classic/mouse.png +0 -0
  1446. psychopy/experiment/components/mouse/classic/mouse@2x.png +0 -0
  1447. psychopy/experiment/components/mouse/dark/mouse.png +0 -0
  1448. psychopy/experiment/components/mouse/dark/mouse@2x.png +0 -0
  1449. psychopy/experiment/components/mouse/light/mouse.png +0 -0
  1450. psychopy/experiment/components/mouse/light/mouse@2x.png +0 -0
  1451. psychopy/experiment/components/movie/__init__.py +367 -0
  1452. psychopy/experiment/components/movie/classic/movie.png +0 -0
  1453. psychopy/experiment/components/movie/classic/movie@2x.png +0 -0
  1454. psychopy/experiment/components/movie/dark/movie.png +0 -0
  1455. psychopy/experiment/components/movie/dark/movie@2x.png +0 -0
  1456. psychopy/experiment/components/movie/light/movie.png +0 -0
  1457. psychopy/experiment/components/movie/light/movie@2x.png +0 -0
  1458. psychopy/experiment/components/panorama/__init__.py +456 -0
  1459. psychopy/experiment/components/panorama/classic/panorama.png +0 -0
  1460. psychopy/experiment/components/panorama/classic/panorama@2x.png +0 -0
  1461. psychopy/experiment/components/panorama/dark/panorama.png +0 -0
  1462. psychopy/experiment/components/panorama/dark/panorama@2x.png +0 -0
  1463. psychopy/experiment/components/panorama/light/panorama.png +0 -0
  1464. psychopy/experiment/components/panorama/light/panorama@2x.png +0 -0
  1465. psychopy/experiment/components/parallelOut/__init__.py +178 -0
  1466. psychopy/experiment/components/parallelOut/classic/parallel.png +0 -0
  1467. psychopy/experiment/components/parallelOut/classic/parallel@2x.png +0 -0
  1468. psychopy/experiment/components/parallelOut/dark/parallel.png +0 -0
  1469. psychopy/experiment/components/parallelOut/dark/parallel@2x.png +0 -0
  1470. psychopy/experiment/components/parallelOut/light/parallel.png +0 -0
  1471. psychopy/experiment/components/parallelOut/light/parallel@2x.png +0 -0
  1472. psychopy/experiment/components/patch/__init__.py +121 -0
  1473. psychopy/experiment/components/patch/classic/patch.png +0 -0
  1474. psychopy/experiment/components/patch/dark/patch.png +0 -0
  1475. psychopy/experiment/components/patch/dark/patch@2x.png +0 -0
  1476. psychopy/experiment/components/patch/light/patch.png +0 -0
  1477. psychopy/experiment/components/patch/light/patch@2x.png +0 -0
  1478. psychopy/experiment/components/polygon/__init__.py +303 -0
  1479. psychopy/experiment/components/polygon/classic/polygon.png +0 -0
  1480. psychopy/experiment/components/polygon/classic/polygon@2x.png +0 -0
  1481. psychopy/experiment/components/polygon/dark/polygon.png +0 -0
  1482. psychopy/experiment/components/polygon/dark/polygon@2x.png +0 -0
  1483. psychopy/experiment/components/polygon/light/polygon.png +0 -0
  1484. psychopy/experiment/components/polygon/light/polygon@2x.png +0 -0
  1485. psychopy/experiment/components/progress/__init__.py +130 -0
  1486. psychopy/experiment/components/progress/classic/progress.png +0 -0
  1487. psychopy/experiment/components/progress/classic/progress@2x.png +0 -0
  1488. psychopy/experiment/components/progress/dark/progress.png +0 -0
  1489. psychopy/experiment/components/progress/dark/progress@2x.png +0 -0
  1490. psychopy/experiment/components/progress/light/progress.png +0 -0
  1491. psychopy/experiment/components/progress/light/progress@2x.png +0 -0
  1492. psychopy/experiment/components/ratingScale/__init__.py +337 -0
  1493. psychopy/experiment/components/ratingScale/classic/ratingscale.png +0 -0
  1494. psychopy/experiment/components/ratingScale/classic/ratingscale@2x.png +0 -0
  1495. psychopy/experiment/components/ratingScale/dark/ratingScale@2x.png +0 -0
  1496. psychopy/experiment/components/ratingScale/dark/ratingscale.png +0 -0
  1497. psychopy/experiment/components/ratingScale/light/ratingScale@2x.png +0 -0
  1498. psychopy/experiment/components/ratingScale/light/ratingscale.png +0 -0
  1499. psychopy/experiment/components/resourceManager/__init__.py +176 -0
  1500. psychopy/experiment/components/resourceManager/classic/resource_manager.png +0 -0
  1501. psychopy/experiment/components/resourceManager/classic/resource_manager@2x.png +0 -0
  1502. psychopy/experiment/components/resourceManager/dark/resource_manager.png +0 -0
  1503. psychopy/experiment/components/resourceManager/dark/resource_manager@2x.png +0 -0
  1504. psychopy/experiment/components/resourceManager/light/resource_manager.png +0 -0
  1505. psychopy/experiment/components/resourceManager/light/resource_manager@2x.png +0 -0
  1506. psychopy/experiment/components/roi/__init__.py +311 -0
  1507. psychopy/experiment/components/roi/classic/eyetracker_roi.png +0 -0
  1508. psychopy/experiment/components/roi/classic/eyetracker_roi@2x.png +0 -0
  1509. psychopy/experiment/components/roi/dark/eyetracker_roi.png +0 -0
  1510. psychopy/experiment/components/roi/dark/eyetracker_roi@2X.png +0 -0
  1511. psychopy/experiment/components/roi/light/eyetracker_roi.png +0 -0
  1512. psychopy/experiment/components/roi/light/eyetracker_roi@2X.png +0 -0
  1513. psychopy/experiment/components/routineSettings/__init__.py +338 -0
  1514. psychopy/experiment/components/routineSettings/classic/routineSettings.png +0 -0
  1515. psychopy/experiment/components/routineSettings/classic/routineSettings@2x.png +0 -0
  1516. psychopy/experiment/components/routineSettings/dark/routineSettings.png +0 -0
  1517. psychopy/experiment/components/routineSettings/dark/routineSettings@2x.png +0 -0
  1518. psychopy/experiment/components/routineSettings/light/routineSettings.png +0 -0
  1519. psychopy/experiment/components/routineSettings/light/routineSettings@2x.png +0 -0
  1520. psychopy/experiment/components/serialOut/__init__.py +205 -0
  1521. psychopy/experiment/components/serialOut/classic/serial.png +0 -0
  1522. psychopy/experiment/components/serialOut/classic/serial@2x.png +0 -0
  1523. psychopy/experiment/components/serialOut/dark/serial.png +0 -0
  1524. psychopy/experiment/components/serialOut/dark/serial@2x.png +0 -0
  1525. psychopy/experiment/components/serialOut/light/serial.png +0 -0
  1526. psychopy/experiment/components/serialOut/light/serial@2x.png +0 -0
  1527. psychopy/experiment/components/settings/JS_htmlHeader.tmpl +23 -0
  1528. psychopy/experiment/components/settings/JS_setupExp.tmpl +28 -0
  1529. psychopy/experiment/components/settings/__init__.py +2155 -0
  1530. psychopy/experiment/components/settings/classic/settings.png +0 -0
  1531. psychopy/experiment/components/settings/classic/settings@2x.png +0 -0
  1532. psychopy/experiment/components/settings/dark/settings.png +0 -0
  1533. psychopy/experiment/components/settings/dark/settings@2x.png +0 -0
  1534. psychopy/experiment/components/settings/light/settings.png +0 -0
  1535. psychopy/experiment/components/settings/light/settings@2x.png +0 -0
  1536. psychopy/experiment/components/slider/__init__.py +410 -0
  1537. psychopy/experiment/components/slider/classic/slider.png +0 -0
  1538. psychopy/experiment/components/slider/classic/slider@2x.png +0 -0
  1539. psychopy/experiment/components/slider/dark/slider.png +0 -0
  1540. psychopy/experiment/components/slider/dark/slider@2x.png +0 -0
  1541. psychopy/experiment/components/slider/light/slider.png +0 -0
  1542. psychopy/experiment/components/slider/light/slider@2x.png +0 -0
  1543. psychopy/experiment/components/sound/__init__.py +307 -0
  1544. psychopy/experiment/components/sound/classic/sound.png +0 -0
  1545. psychopy/experiment/components/sound/classic/sound@2x.png +0 -0
  1546. psychopy/experiment/components/sound/dark/sound.png +0 -0
  1547. psychopy/experiment/components/sound/dark/sound@2x.png +0 -0
  1548. psychopy/experiment/components/sound/light/sound.png +0 -0
  1549. psychopy/experiment/components/sound/light/sound@2x.png +0 -0
  1550. psychopy/experiment/components/static/__init__.py +267 -0
  1551. psychopy/experiment/components/static/classic/static.png +0 -0
  1552. psychopy/experiment/components/static/classic/static@2x.png +0 -0
  1553. psychopy/experiment/components/static/dark/static.png +0 -0
  1554. psychopy/experiment/components/static/dark/static@2x.png +0 -0
  1555. psychopy/experiment/components/static/light/static.png +0 -0
  1556. psychopy/experiment/components/static/light/static@2x.png +0 -0
  1557. psychopy/experiment/components/text/__init__.py +169 -0
  1558. psychopy/experiment/components/text/classic/text.png +0 -0
  1559. psychopy/experiment/components/text/classic/text@2x.png +0 -0
  1560. psychopy/experiment/components/text/dark/text.png +0 -0
  1561. psychopy/experiment/components/text/dark/text@2x.png +0 -0
  1562. psychopy/experiment/components/text/light/text.png +0 -0
  1563. psychopy/experiment/components/text/light/text@2x.png +0 -0
  1564. psychopy/experiment/components/textbox/__init__.py +330 -0
  1565. psychopy/experiment/components/textbox/classic/textbox.png +0 -0
  1566. psychopy/experiment/components/textbox/classic/textbox@2x.png +0 -0
  1567. psychopy/experiment/components/textbox/dark/textbox.png +0 -0
  1568. psychopy/experiment/components/textbox/dark/textbox@2x.png +0 -0
  1569. psychopy/experiment/components/textbox/light/textbox.png +0 -0
  1570. psychopy/experiment/components/textbox/light/textbox@2x.png +0 -0
  1571. psychopy/experiment/components/unknown/__init__.py +86 -0
  1572. psychopy/experiment/components/unknown/classic/unknown.png +0 -0
  1573. psychopy/experiment/components/unknown/classic/unknown@2x.png +0 -0
  1574. psychopy/experiment/components/unknown/dark/unknown.png +0 -0
  1575. psychopy/experiment/components/unknown/dark/unknown@2x.png +0 -0
  1576. psychopy/experiment/components/unknown/light/unknown.png +0 -0
  1577. psychopy/experiment/components/unknown/light/unknown@2x.png +0 -0
  1578. psychopy/experiment/components/unknownPlugin/__init__.py +84 -0
  1579. psychopy/experiment/components/unknownPlugin/classic/unknownPlugin.png +0 -0
  1580. psychopy/experiment/components/unknownPlugin/classic/unknownPlugin@2x.png +0 -0
  1581. psychopy/experiment/components/unknownPlugin/dark/unknownPlugin.png +0 -0
  1582. psychopy/experiment/components/unknownPlugin/dark/unknownPlugin@2x.png +0 -0
  1583. psychopy/experiment/components/unknownPlugin/light/unknownPlugin.png +0 -0
  1584. psychopy/experiment/components/unknownPlugin/light/unknownPlugin@2x.png +0 -0
  1585. psychopy/experiment/components/utils.py +0 -0
  1586. psychopy/experiment/components/variable/__init__.py +184 -0
  1587. psychopy/experiment/components/variable/classic/variable.png +0 -0
  1588. psychopy/experiment/components/variable/classic/variable@2x.png +0 -0
  1589. psychopy/experiment/components/variable/dark/variable.png +0 -0
  1590. psychopy/experiment/components/variable/dark/variable@2x.png +0 -0
  1591. psychopy/experiment/components/variable/light/variable.png +0 -0
  1592. psychopy/experiment/components/variable/light/variable@2x.png +0 -0
  1593. psychopy/experiment/experiment.xsd +223 -0
  1594. psychopy/experiment/exports.py +388 -0
  1595. psychopy/experiment/flow.py +531 -0
  1596. psychopy/experiment/localization.py +11 -0
  1597. psychopy/experiment/loopTemplate.xltx +0 -0
  1598. psychopy/experiment/loops.py +952 -0
  1599. psychopy/experiment/params.py +437 -0
  1600. psychopy/experiment/plugins.py +115 -0
  1601. psychopy/experiment/py2js.py +183 -0
  1602. psychopy/experiment/py2js_transpiler.py +606 -0
  1603. psychopy/experiment/questPlusTemplate.xltx +0 -0
  1604. psychopy/experiment/questTemplate.xltx +0 -0
  1605. psychopy/experiment/routines/__init__.py +108 -0
  1606. psychopy/experiment/routines/_base.py +907 -0
  1607. psychopy/experiment/routines/counterbalance/__init__.py +315 -0
  1608. psychopy/experiment/routines/counterbalance/classic/counterbalance.png +0 -0
  1609. psychopy/experiment/routines/counterbalance/classic/counterbalance@2x.png +0 -0
  1610. psychopy/experiment/routines/counterbalance/counterbalanceItems.xltx +0 -0
  1611. psychopy/experiment/routines/counterbalance/dark/counterbalance.png +0 -0
  1612. psychopy/experiment/routines/counterbalance/dark/counterbalance@2x.png +0 -0
  1613. psychopy/experiment/routines/counterbalance/light/counterbalance.png +0 -0
  1614. psychopy/experiment/routines/counterbalance/light/counterbalance@2x.png +0 -0
  1615. psychopy/experiment/routines/eyetracker_calibrate/__init__.py +275 -0
  1616. psychopy/experiment/routines/eyetracker_calibrate/classic/eyetracker_calib.png +0 -0
  1617. psychopy/experiment/routines/eyetracker_calibrate/dark/eyetracker_calib.png +0 -0
  1618. psychopy/experiment/routines/eyetracker_calibrate/dark/eyetracker_calib@2x.png +0 -0
  1619. psychopy/experiment/routines/eyetracker_calibrate/light/eyetracker_calib.png +0 -0
  1620. psychopy/experiment/routines/eyetracker_calibrate/light/eyetracker_calib@2x.png +0 -0
  1621. psychopy/experiment/routines/eyetracker_validate/__init__.py +354 -0
  1622. psychopy/experiment/routines/eyetracker_validate/classic/eyetracker_valid.png +0 -0
  1623. psychopy/experiment/routines/eyetracker_validate/dark/eyetracker_valid.png +0 -0
  1624. psychopy/experiment/routines/eyetracker_validate/dark/eyetracker_valid@2x.png +0 -0
  1625. psychopy/experiment/routines/eyetracker_validate/light/eyetracker_valid.png +0 -0
  1626. psychopy/experiment/routines/eyetracker_validate/light/eyetracker_valid@2x.png +0 -0
  1627. psychopy/experiment/routines/pavlovia_survey/__init__.py +236 -0
  1628. psychopy/experiment/routines/pavlovia_survey/classic/survey.png +0 -0
  1629. psychopy/experiment/routines/pavlovia_survey/classic/survey@2x.png +0 -0
  1630. psychopy/experiment/routines/pavlovia_survey/dark/survey.png +0 -0
  1631. psychopy/experiment/routines/pavlovia_survey/dark/survey@2x.png +0 -0
  1632. psychopy/experiment/routines/pavlovia_survey/light/survey.png +0 -0
  1633. psychopy/experiment/routines/pavlovia_survey/light/survey@2x.png +0 -0
  1634. psychopy/experiment/routines/photodiodeValidator/__init__.py +429 -0
  1635. psychopy/experiment/routines/photodiodeValidator/classic/photodiode_validator.png +0 -0
  1636. psychopy/experiment/routines/photodiodeValidator/classic/photodiode_validator@2x.png +0 -0
  1637. psychopy/experiment/routines/photodiodeValidator/dark/photodiode_validator.png +0 -0
  1638. psychopy/experiment/routines/photodiodeValidator/dark/photodiode_validator@2x.png +0 -0
  1639. psychopy/experiment/routines/photodiodeValidator/light/photodiode_validator.png +0 -0
  1640. psychopy/experiment/routines/photodiodeValidator/light/photodiode_validator@2x.png +0 -0
  1641. psychopy/experiment/routines/unknown/__init__.py +28 -0
  1642. psychopy/experiment/routines/unknown/classic/eyetracker_record.png +0 -0
  1643. psychopy/experiment/routines/unknown/classic/unknown.png +0 -0
  1644. psychopy/experiment/routines/unknown/dark/eyetracker_record.png +0 -0
  1645. psychopy/experiment/routines/unknown/dark/eyetracker_record@2x.png +0 -0
  1646. psychopy/experiment/routines/unknown/dark/unknown.png +0 -0
  1647. psychopy/experiment/routines/unknown/dark/unknown@2x.png +0 -0
  1648. psychopy/experiment/routines/unknown/light/eyetracker_record.png +0 -0
  1649. psychopy/experiment/routines/unknown/light/eyetracker_record@2x.png +0 -0
  1650. psychopy/experiment/routines/unknown/light/unknown.png +0 -0
  1651. psychopy/experiment/routines/unknown/light/unknown@2x.png +0 -0
  1652. psychopy/experiment/routines/utils.py +0 -0
  1653. psychopy/experiment/staircaseTemplate.xltx +0 -0
  1654. psychopy/experiment/utils.py +44 -0
  1655. psychopy/filters.py +11 -0
  1656. psychopy/gamma.py +9 -0
  1657. psychopy/gui/__init__.py +47 -0
  1658. psychopy/gui/qtgui.py +866 -0
  1659. psychopy/gui/util.py +78 -0
  1660. psychopy/gui/wxgui.py +414 -0
  1661. psychopy/hardware/__init__.py +216 -0
  1662. psychopy/hardware/base.py +323 -0
  1663. psychopy/hardware/bbtk/__init__.py +30 -0
  1664. psychopy/hardware/brainproducts.py +31 -0
  1665. psychopy/hardware/button.py +205 -0
  1666. psychopy/hardware/buttonbox/__init__.py +122 -0
  1667. psychopy/hardware/camera/__init__.py +2809 -0
  1668. psychopy/hardware/cedrus.py +36 -0
  1669. psychopy/hardware/crs/__init__.py +46 -0
  1670. psychopy/hardware/crs/bits.py +34 -0
  1671. psychopy/hardware/crs/colorcal.py +30 -0
  1672. psychopy/hardware/crs/optical.py +46 -0
  1673. psychopy/hardware/crs/shaders.py +21 -0
  1674. psychopy/hardware/emotiv.py +33 -0
  1675. psychopy/hardware/emulator.py +37 -0
  1676. psychopy/hardware/eyetracker.py +208 -0
  1677. psychopy/hardware/forp.py +42 -0
  1678. psychopy/hardware/gammasci.py +32 -0
  1679. psychopy/hardware/iolab.py +35 -0
  1680. psychopy/hardware/joystick/__init__.py +597 -0
  1681. psychopy/hardware/keyboard.py +880 -0
  1682. psychopy/hardware/knownDevices.json +52 -0
  1683. psychopy/hardware/labhackers.py +27 -0
  1684. psychopy/hardware/labjacks.py +30 -0
  1685. psychopy/hardware/listener.py +323 -0
  1686. psychopy/hardware/manager.py +963 -0
  1687. psychopy/hardware/microphone.py +1074 -0
  1688. psychopy/hardware/minolta.py +30 -0
  1689. psychopy/hardware/mouse/__init__.py +885 -0
  1690. psychopy/hardware/photodiode.py +639 -0
  1691. psychopy/hardware/photometer/__init__.py +176 -0
  1692. psychopy/hardware/pr.py +30 -0
  1693. psychopy/hardware/qmix.py +41 -0
  1694. psychopy/hardware/serialdevice.py +342 -0
  1695. psychopy/hardware/speaker.py +54 -0
  1696. psychopy/hardware/triggerbox/__init__.py +56 -0
  1697. psychopy/hardware/triggerbox/base.py +170 -0
  1698. psychopy/hardware/triggerbox/parallel.py +362 -0
  1699. psychopy/info.py +790 -0
  1700. psychopy/iohub/__init__.py +45 -0
  1701. psychopy/iohub/client/__init__.py +1454 -0
  1702. psychopy/iohub/client/connect.py +260 -0
  1703. psychopy/iohub/client/eyetracker/__init__.py +4 -0
  1704. psychopy/iohub/client/eyetracker/validation/__init__.py +8 -0
  1705. psychopy/iohub/client/eyetracker/validation/posgrid.py +274 -0
  1706. psychopy/iohub/client/eyetracker/validation/procedure.py +1292 -0
  1707. psychopy/iohub/client/eyetracker/validation/trigger.py +240 -0
  1708. psychopy/iohub/client/keyboard.py +508 -0
  1709. psychopy/iohub/client/wintab.py +378 -0
  1710. psychopy/iohub/constants.py +1176 -0
  1711. psychopy/iohub/datastore/__init__.py +439 -0
  1712. psychopy/iohub/datastore/default_datastore.yaml +8 -0
  1713. psychopy/iohub/datastore/util.py +868 -0
  1714. psychopy/iohub/default_config.yaml +17 -0
  1715. psychopy/iohub/devices/__init__.py +960 -0
  1716. psychopy/iohub/devices/computer.py +607 -0
  1717. psychopy/iohub/devices/default_device.yaml +15 -0
  1718. psychopy/iohub/devices/deviceConfigValidation.py +517 -0
  1719. psychopy/iohub/devices/display/__init__.py +755 -0
  1720. psychopy/iohub/devices/display/default_display.yaml +118 -0
  1721. psychopy/iohub/devices/display/supported_config_settings.yaml +69 -0
  1722. psychopy/iohub/devices/eventfilters.py +3572 -0
  1723. psychopy/iohub/devices/experiment/__init__.py +316 -0
  1724. psychopy/iohub/devices/experiment/default_experiment.yaml +63 -0
  1725. psychopy/iohub/devices/experiment/supported_config_settings.yaml +22 -0
  1726. psychopy/iohub/devices/eyetracker/__init__.py +436 -0
  1727. psychopy/iohub/devices/eyetracker/calibration/__init__.py +1 -0
  1728. psychopy/iohub/devices/eyetracker/calibration/procedure.py +409 -0
  1729. psychopy/iohub/devices/eyetracker/default_eyetracker.yaml +18 -0
  1730. psychopy/iohub/devices/eyetracker/eye_events.py +1751 -0
  1731. psychopy/iohub/devices/eyetracker/filters/__init__.py +4 -0
  1732. psychopy/iohub/devices/eyetracker/filters/parser.py +913 -0
  1733. psychopy/iohub/devices/eyetracker/hw/__init__.py +4 -0
  1734. psychopy/iohub/devices/eyetracker/hw/gazepoint/__init__.py +17 -0
  1735. psychopy/iohub/devices/eyetracker/hw/gazepoint/gp3/__init__.py +28 -0
  1736. psychopy/iohub/devices/eyetracker/hw/gazepoint/gp3/calibration.py +18 -0
  1737. psychopy/iohub/devices/eyetracker/hw/gazepoint/gp3/eyetracker.py +21 -0
  1738. psychopy/iohub/devices/eyetracker/hw/mouse/__init__.py +8 -0
  1739. psychopy/iohub/devices/eyetracker/hw/mouse/calibration.py +10 -0
  1740. psychopy/iohub/devices/eyetracker/hw/mouse/default_eyetracker.yaml +102 -0
  1741. psychopy/iohub/devices/eyetracker/hw/mouse/eyetracker.py +444 -0
  1742. psychopy/iohub/devices/eyetracker/hw/mouse/supported_config_settings.yaml +110 -0
  1743. psychopy/iohub/devices/eyetracker/hw/pupil_labs/__init__.py +4 -0
  1744. psychopy/iohub/devices/eyetracker/hw/pupil_labs/neon/__init__.py +26 -0
  1745. psychopy/iohub/devices/eyetracker/hw/pupil_labs/neon/eyetracker.py +18 -0
  1746. psychopy/iohub/devices/eyetracker/hw/pupil_labs/pupil_core/__init__.py +29 -0
  1747. psychopy/iohub/devices/eyetracker/hw/pupil_labs/pupil_core/bisector.py +20 -0
  1748. psychopy/iohub/devices/eyetracker/hw/pupil_labs/pupil_core/constants.py +19 -0
  1749. psychopy/iohub/devices/eyetracker/hw/pupil_labs/pupil_core/data_parse.py +22 -0
  1750. psychopy/iohub/devices/eyetracker/hw/pupil_labs/pupil_core/eyetracker.py +18 -0
  1751. psychopy/iohub/devices/eyetracker/hw/pupil_labs/pupil_core/pupil_remote.py +18 -0
  1752. psychopy/iohub/devices/eyetracker/hw/sr_research/__init__.py +4 -0
  1753. psychopy/iohub/devices/eyetracker/hw/sr_research/eyelink/__init__.py +28 -0
  1754. psychopy/iohub/devices/eyetracker/hw/sr_research/eyelink/calibration.py +22 -0
  1755. psychopy/iohub/devices/eyetracker/hw/sr_research/eyelink/eyetracker.py +38 -0
  1756. psychopy/iohub/devices/eyetracker/hw/tobii/__init__.py +29 -0
  1757. psychopy/iohub/devices/eyetracker/hw/tobii/calibration.py +19 -0
  1758. psychopy/iohub/devices/eyetracker/hw/tobii/eyetracker.py +17 -0
  1759. psychopy/iohub/devices/eyetracker/hw/tobii/tobiiwrapper.py +19 -0
  1760. psychopy/iohub/devices/eyetracker/supported_config_settings.yaml +44 -0
  1761. psychopy/iohub/devices/keyboard/__init__.py +309 -0
  1762. psychopy/iohub/devices/keyboard/darwin.py +428 -0
  1763. psychopy/iohub/devices/keyboard/darwinkey.py +94 -0
  1764. psychopy/iohub/devices/keyboard/default_keyboard.yaml +94 -0
  1765. psychopy/iohub/devices/keyboard/linux2.py +102 -0
  1766. psychopy/iohub/devices/keyboard/supported_config_settings.yaml +39 -0
  1767. psychopy/iohub/devices/keyboard/win32.py +356 -0
  1768. psychopy/iohub/devices/mouse/__init__.py +709 -0
  1769. psychopy/iohub/devices/mouse/darwin.py +414 -0
  1770. psychopy/iohub/devices/mouse/default_mouse.yaml +92 -0
  1771. psychopy/iohub/devices/mouse/linux2.py +167 -0
  1772. psychopy/iohub/devices/mouse/supported_config_settings.yaml +39 -0
  1773. psychopy/iohub/devices/mouse/win32.py +279 -0
  1774. psychopy/iohub/devices/pyXHook.py +619 -0
  1775. psychopy/iohub/devices/serial/__init__.py +779 -0
  1776. psychopy/iohub/devices/serial/default_pstbox.yaml +108 -0
  1777. psychopy/iohub/devices/serial/default_serial.yaml +108 -0
  1778. psychopy/iohub/devices/serial/supported_config_settings.yaml +85 -0
  1779. psychopy/iohub/devices/serial/supported_config_settings_pstbox.yaml +85 -0
  1780. psychopy/iohub/devices/supported_config_settings.yaml +36 -0
  1781. psychopy/iohub/devices/wintab/__init__.py +580 -0
  1782. psychopy/iohub/devices/wintab/default_wintab.yaml +89 -0
  1783. psychopy/iohub/devices/wintab/supported_config_settings.yaml +42 -0
  1784. psychopy/iohub/devices/wintab/win32.py +722 -0
  1785. psychopy/iohub/devices/xlib.py +6795 -0
  1786. psychopy/iohub/errors.py +61 -0
  1787. psychopy/iohub/lazy_import.py +582 -0
  1788. psychopy/iohub/net.py +349 -0
  1789. psychopy/iohub/server.py +1075 -0
  1790. psychopy/iohub/start_iohub_process.py +118 -0
  1791. psychopy/iohub/util/__init__.py +841 -0
  1792. psychopy/iohub/util/visualangle.py +126 -0
  1793. psychopy/layout.py +916 -0
  1794. psychopy/liaison.py +419 -0
  1795. psychopy/locale_setup.py +31 -0
  1796. psychopy/localization/__init__.py +22 -0
  1797. psychopy/localization/_localization.py +155 -0
  1798. psychopy/localization/generateTranslationTemplate.py +139 -0
  1799. psychopy/localization/mappings.txt +170 -0
  1800. psychopy/localization/messages.pot +7516 -0
  1801. psychopy/localization/readme.txt +68 -0
  1802. psychopy/logging.py +406 -0
  1803. psychopy/microphone.py +54 -0
  1804. psychopy/misc.py +40 -0
  1805. psychopy/monitors/MonitorCenter.py +1254 -0
  1806. psychopy/monitors/__init__.py +30 -0
  1807. psychopy/monitors/calibData.py +78 -0
  1808. psychopy/monitors/calibTools.py +1300 -0
  1809. psychopy/monitors/getLumSeries.py +50 -0
  1810. psychopy/monitors/psychopy-icon.svg +395 -0
  1811. psychopy/monitors/psychopy.ico +0 -0
  1812. psychopy/parallel/__init__.py +206 -0
  1813. psychopy/parallel/_dlportio.py +150 -0
  1814. psychopy/parallel/_inpout.py +120 -0
  1815. psychopy/parallel/_linux.py +105 -0
  1816. psychopy/piloting.py +61 -0
  1817. psychopy/platform_specific/__init__.py +48 -0
  1818. psychopy/platform_specific/darwin.py +328 -0
  1819. psychopy/platform_specific/linux.py +79 -0
  1820. psychopy/platform_specific/posix.py +16 -0
  1821. psychopy/platform_specific/win32.py +99 -0
  1822. psychopy/plugins/__init__.py +1354 -0
  1823. psychopy/preferences/Darwin.spec +282 -0
  1824. psychopy/preferences/FreeBSD.spec +282 -0
  1825. psychopy/preferences/Linux.spec +282 -0
  1826. psychopy/preferences/Windows.spec +282 -0
  1827. psychopy/preferences/__init__.py +20 -0
  1828. psychopy/preferences/baseNoArch.spec +278 -0
  1829. psychopy/preferences/generateHints.py +91 -0
  1830. psychopy/preferences/generateSpec.py +80 -0
  1831. psychopy/preferences/hints.py +329 -0
  1832. psychopy/preferences/preferences.py +332 -0
  1833. psychopy/projects/__init__.py +11 -0
  1834. psychopy/projects/gitignore.py +45 -0
  1835. psychopy/projects/pavlovia.py +1566 -0
  1836. psychopy/projects/sshkeys.py +107 -0
  1837. psychopy/psychojs.zip +0 -0
  1838. psychopy/pylintrc +69 -0
  1839. psychopy/scripts/__init__.py +0 -0
  1840. psychopy/scripts/psyexpCompile.py +233 -0
  1841. psychopy/session.py +1450 -0
  1842. psychopy/sound/__init__.py +279 -0
  1843. psychopy/sound/_base.py +282 -0
  1844. psychopy/sound/audioclip.py +851 -0
  1845. psychopy/sound/audiodevice.py +857 -0
  1846. psychopy/sound/backend_ptb.py +660 -0
  1847. psychopy/sound/backend_pygame.py +309 -0
  1848. psychopy/sound/backend_pyo.py +33 -0
  1849. psychopy/sound/backend_pysound.py +341 -0
  1850. psychopy/sound/backend_sounddevice.py +32 -0
  1851. psychopy/sound/exceptions.py +115 -0
  1852. psychopy/sound/microphone.py +274 -0
  1853. psychopy/sound/transcribe.py +1248 -0
  1854. psychopy/tests/.DS_Store +0 -0
  1855. psychopy/tests/README.md +344 -0
  1856. psychopy/tests/__init__.py +47 -0
  1857. psychopy/tests/data/Electronic_Chime-KevanGC-495939803.wav +0 -0
  1858. psychopy/tests/data/TestCircle_w128h128_bottom_left.png +0 -0
  1859. psychopy/tests/data/TestCircle_w128h128_bottom_right.png +0 -0
  1860. psychopy/tests/data/TestCircle_w128h128_center_center.png +0 -0
  1861. psychopy/tests/data/TestCircle_w128h128_top_left.png +0 -0
  1862. psychopy/tests/data/TestCircle_w128h128_top_right.png +0 -0
  1863. psychopy/tests/data/TestCircle_w128h64_bottom_left.png +0 -0
  1864. psychopy/tests/data/TestCircle_w128h64_bottom_right.png +0 -0
  1865. psychopy/tests/data/TestCircle_w128h64_center_center.png +0 -0
  1866. psychopy/tests/data/TestCircle_w128h64_top_left.png +0 -0
  1867. psychopy/tests/data/TestCircle_w128h64_top_right.png +0 -0
  1868. psychopy/tests/data/TestCircle_w64h128_bottom_left.png +0 -0
  1869. psychopy/tests/data/TestCircle_w64h128_bottom_right.png +0 -0
  1870. psychopy/tests/data/TestCircle_w64h128_center_center.png +0 -0
  1871. psychopy/tests/data/TestCircle_w64h128_top_left.png +0 -0
  1872. psychopy/tests/data/TestCircle_w64h128_top_right.png +0 -0
  1873. psychopy/tests/data/TestCircle_w64h64_bottom_left.png +0 -0
  1874. psychopy/tests/data/TestCircle_w64h64_bottom_right.png +0 -0
  1875. psychopy/tests/data/TestCircle_w64h64_center_center.png +0 -0
  1876. psychopy/tests/data/TestCircle_w64h64_top_left.png +0 -0
  1877. psychopy/tests/data/TestCircle_w64h64_top_right.png +0 -0
  1878. psychopy/tests/data/TestForm_scrolling_nq10_s0.5.png +0 -0
  1879. psychopy/tests/data/TestForm_scrolling_nq10_s0.png +0 -0
  1880. psychopy/tests/data/TestForm_scrolling_nq10_s1.png +0 -0
  1881. psychopy/tests/data/TestForm_scrolling_nq1_s0.5.png +0 -0
  1882. psychopy/tests/data/TestForm_scrolling_nq1_s0.png +0 -0
  1883. psychopy/tests/data/TestForm_scrolling_nq1_s1.png +0 -0
  1884. psychopy/tests/data/TestForm_scrolling_nq3_s0.5.png +0 -0
  1885. psychopy/tests/data/TestForm_scrolling_nq3_s0.png +0 -0
  1886. psychopy/tests/data/TestForm_scrolling_nq3_s1.png +0 -0
  1887. psychopy/tests/data/TestImage_w128h128_bottom_left.png +0 -0
  1888. psychopy/tests/data/TestImage_w128h128_bottom_right.png +0 -0
  1889. psychopy/tests/data/TestImage_w128h128_center_center.png +0 -0
  1890. psychopy/tests/data/TestImage_w128h128_top_left.png +0 -0
  1891. psychopy/tests/data/TestImage_w128h128_top_right.png +0 -0
  1892. psychopy/tests/data/TestImage_w128h64_bottom_left.png +0 -0
  1893. psychopy/tests/data/TestImage_w128h64_bottom_right.png +0 -0
  1894. psychopy/tests/data/TestImage_w128h64_center_center.png +0 -0
  1895. psychopy/tests/data/TestImage_w128h64_top_left.png +0 -0
  1896. psychopy/tests/data/TestImage_w128h64_top_right.png +0 -0
  1897. psychopy/tests/data/TestImage_w64h128_bottom_left.png +0 -0
  1898. psychopy/tests/data/TestImage_w64h128_bottom_right.png +0 -0
  1899. psychopy/tests/data/TestImage_w64h128_center_center.png +0 -0
  1900. psychopy/tests/data/TestImage_w64h128_top_left.png +0 -0
  1901. psychopy/tests/data/TestImage_w64h128_top_right.png +0 -0
  1902. psychopy/tests/data/TestImage_w64h64_bottom_left.png +0 -0
  1903. psychopy/tests/data/TestImage_w64h64_bottom_right.png +0 -0
  1904. psychopy/tests/data/TestImage_w64h64_center_center.png +0 -0
  1905. psychopy/tests/data/TestImage_w64h64_top_left.png +0 -0
  1906. psychopy/tests/data/TestImage_w64h64_top_right.png +0 -0
  1907. psychopy/tests/data/TestProgress_testValue_horizontal_center center_0.3.png +0 -0
  1908. psychopy/tests/data/TestProgress_testValue_horizontal_center center_0.6.png +0 -0
  1909. psychopy/tests/data/TestProgress_testValue_horizontal_left center_0.3.png +0 -0
  1910. psychopy/tests/data/TestProgress_testValue_horizontal_left center_0.6.png +0 -0
  1911. psychopy/tests/data/TestProgress_testValue_horizontal_right center_0.3.png +0 -0
  1912. psychopy/tests/data/TestProgress_testValue_horizontal_right center_0.6.png +0 -0
  1913. psychopy/tests/data/TestProgress_testValue_minmax_0.png +0 -0
  1914. psychopy/tests/data/TestProgress_testValue_minmax_1.png +0 -0
  1915. psychopy/tests/data/TestProgress_testValue_vertical_bottom center_0.3.png +0 -0
  1916. psychopy/tests/data/TestProgress_testValue_vertical_bottom center_0.6.png +0 -0
  1917. psychopy/tests/data/TestProgress_testValue_vertical_center center_0.3.png +0 -0
  1918. psychopy/tests/data/TestProgress_testValue_vertical_center center_0.6.png +0 -0
  1919. psychopy/tests/data/TestProgress_testValue_vertical_top center_0.3.png +0 -0
  1920. psychopy/tests/data/TestProgress_testValue_vertical_top center_0.6.png +0 -0
  1921. psychopy/tests/data/TestProgress_w128h128_bottom_left.png +0 -0
  1922. psychopy/tests/data/TestProgress_w128h128_bottom_right.png +0 -0
  1923. psychopy/tests/data/TestProgress_w128h128_center_center.png +0 -0
  1924. psychopy/tests/data/TestProgress_w128h128_top_left.png +0 -0
  1925. psychopy/tests/data/TestProgress_w128h128_top_right.png +0 -0
  1926. psychopy/tests/data/TestProgress_w128h64_bottom_left.png +0 -0
  1927. psychopy/tests/data/TestProgress_w128h64_bottom_right.png +0 -0
  1928. psychopy/tests/data/TestProgress_w128h64_center_center.png +0 -0
  1929. psychopy/tests/data/TestProgress_w128h64_top_left.png +0 -0
  1930. psychopy/tests/data/TestProgress_w128h64_top_right.png +0 -0
  1931. psychopy/tests/data/TestProgress_w64h128_bottom_left.png +0 -0
  1932. psychopy/tests/data/TestProgress_w64h128_bottom_right.png +0 -0
  1933. psychopy/tests/data/TestProgress_w64h128_center_center.png +0 -0
  1934. psychopy/tests/data/TestProgress_w64h128_top_left.png +0 -0
  1935. psychopy/tests/data/TestProgress_w64h128_top_right.png +0 -0
  1936. psychopy/tests/data/TestProgress_w64h64_bottom_left.png +0 -0
  1937. psychopy/tests/data/TestProgress_w64h64_bottom_right.png +0 -0
  1938. psychopy/tests/data/TestProgress_w64h64_center_center.png +0 -0
  1939. psychopy/tests/data/TestProgress_w64h64_top_left.png +0 -0
  1940. psychopy/tests/data/TestProgress_w64h64_top_right.png +0 -0
  1941. psychopy/tests/data/TestROI_w128h128_bottom_left.png +0 -0
  1942. psychopy/tests/data/TestROI_w128h128_bottom_right.png +0 -0
  1943. psychopy/tests/data/TestROI_w128h128_center_center.png +0 -0
  1944. psychopy/tests/data/TestROI_w128h128_top_left.png +0 -0
  1945. psychopy/tests/data/TestROI_w128h128_top_right.png +0 -0
  1946. psychopy/tests/data/TestROI_w128h64_bottom_left.png +0 -0
  1947. psychopy/tests/data/TestROI_w128h64_bottom_right.png +0 -0
  1948. psychopy/tests/data/TestROI_w128h64_center_center.png +0 -0
  1949. psychopy/tests/data/TestROI_w128h64_top_left.png +0 -0
  1950. psychopy/tests/data/TestROI_w128h64_top_right.png +0 -0
  1951. psychopy/tests/data/TestROI_w64h128_bottom_left.png +0 -0
  1952. psychopy/tests/data/TestROI_w64h128_bottom_right.png +0 -0
  1953. psychopy/tests/data/TestROI_w64h128_center_center.png +0 -0
  1954. psychopy/tests/data/TestROI_w64h128_top_left.png +0 -0
  1955. psychopy/tests/data/TestROI_w64h128_top_right.png +0 -0
  1956. psychopy/tests/data/TestROI_w64h64_bottom_left.png +0 -0
  1957. psychopy/tests/data/TestROI_w64h64_bottom_right.png +0 -0
  1958. psychopy/tests/data/TestROI_w64h64_center_center.png +0 -0
  1959. psychopy/tests/data/TestROI_w64h64_top_left.png +0 -0
  1960. psychopy/tests/data/TestROI_w64h64_top_right.png +0 -0
  1961. psychopy/tests/data/TestSession_exp1.png +0 -0
  1962. psychopy/tests/data/TestSession_exp2.png +0 -0
  1963. psychopy/tests/data/TestShape_w128h128_bottom_left.png +0 -0
  1964. psychopy/tests/data/TestShape_w128h128_bottom_right.png +0 -0
  1965. psychopy/tests/data/TestShape_w128h128_center_center.png +0 -0
  1966. psychopy/tests/data/TestShape_w128h128_top_left.png +0 -0
  1967. psychopy/tests/data/TestShape_w128h128_top_right.png +0 -0
  1968. psychopy/tests/data/TestShape_w128h64_bottom_left.png +0 -0
  1969. psychopy/tests/data/TestShape_w128h64_bottom_right.png +0 -0
  1970. psychopy/tests/data/TestShape_w128h64_center_center.png +0 -0
  1971. psychopy/tests/data/TestShape_w128h64_top_left.png +0 -0
  1972. psychopy/tests/data/TestShape_w128h64_top_right.png +0 -0
  1973. psychopy/tests/data/TestShape_w64h128_bottom_left.png +0 -0
  1974. psychopy/tests/data/TestShape_w64h128_bottom_right.png +0 -0
  1975. psychopy/tests/data/TestShape_w64h128_center_center.png +0 -0
  1976. psychopy/tests/data/TestShape_w64h128_top_left.png +0 -0
  1977. psychopy/tests/data/TestShape_w64h128_top_right.png +0 -0
  1978. psychopy/tests/data/TestShape_w64h64_bottom_left.png +0 -0
  1979. psychopy/tests/data/TestShape_w64h64_bottom_right.png +0 -0
  1980. psychopy/tests/data/TestShape_w64h64_center_center.png +0 -0
  1981. psychopy/tests/data/TestShape_w64h64_top_left.png +0 -0
  1982. psychopy/tests/data/TestShape_w64h64_top_right.png +0 -0
  1983. psychopy/tests/data/TestTarget_w128h128_bottom_left.png +0 -0
  1984. psychopy/tests/data/TestTarget_w128h128_bottom_right.png +0 -0
  1985. psychopy/tests/data/TestTarget_w128h128_center_center.png +0 -0
  1986. psychopy/tests/data/TestTarget_w128h128_top_left.png +0 -0
  1987. psychopy/tests/data/TestTarget_w128h128_top_right.png +0 -0
  1988. psychopy/tests/data/TestTarget_w128h64_bottom_left.png +0 -0
  1989. psychopy/tests/data/TestTarget_w128h64_bottom_right.png +0 -0
  1990. psychopy/tests/data/TestTarget_w128h64_center_center.png +0 -0
  1991. psychopy/tests/data/TestTarget_w128h64_top_left.png +0 -0
  1992. psychopy/tests/data/TestTarget_w128h64_top_right.png +0 -0
  1993. psychopy/tests/data/TestTarget_w64h128_bottom_left.png +0 -0
  1994. psychopy/tests/data/TestTarget_w64h128_bottom_right.png +0 -0
  1995. psychopy/tests/data/TestTarget_w64h128_center_center.png +0 -0
  1996. psychopy/tests/data/TestTarget_w64h128_top_left.png +0 -0
  1997. psychopy/tests/data/TestTarget_w64h128_top_right.png +0 -0
  1998. psychopy/tests/data/TestTarget_w64h64_bottom_left.png +0 -0
  1999. psychopy/tests/data/TestTarget_w64h64_bottom_right.png +0 -0
  2000. psychopy/tests/data/TestTarget_w64h64_center_center.png +0 -0
  2001. psychopy/tests/data/TestTarget_w64h64_top_left.png +0 -0
  2002. psychopy/tests/data/TestTarget_w64h64_top_right.png +0 -0
  2003. psychopy/tests/data/TestTextbox_testLetterSpacing_0p6.png +0 -0
  2004. psychopy/tests/data/TestTextbox_testLetterSpacing_0p8.png +0 -0
  2005. psychopy/tests/data/TestTextbox_testLetterSpacing_1.png +0 -0
  2006. psychopy/tests/data/TestTextbox_testLetterSpacing_1p2.png +0 -0
  2007. psychopy/tests/data/TestTextbox_testLetterSpacing_1p4.png +0 -0
  2008. psychopy/tests/data/TestTextbox_testLetterSpacing_1p6.png +0 -0
  2009. psychopy/tests/data/TestTextbox_testLetterSpacing_1p8.png +0 -0
  2010. psychopy/tests/data/TestTextbox_testLetterSpacing_2p0.png +0 -0
  2011. psychopy/tests/data/TestTextbox_testLetterSpacing_None.png +0 -0
  2012. psychopy/tests/data/Test_textbox_testSpeechpoint_-3ovr8_0ovr8.png +0 -0
  2013. psychopy/tests/data/Test_textbox_testSpeechpoint_0ovr8_-3ovr8.png +0 -0
  2014. psychopy/tests/data/Test_textbox_testSpeechpoint_0ovr8_3ovr8.png +0 -0
  2015. psychopy/tests/data/Test_textbox_testSpeechpoint_3ovr8_0ovr8.png +0 -0
  2016. psychopy/tests/data/Test_textbox_w128h128_bottom_left.png +0 -0
  2017. psychopy/tests/data/Test_textbox_w128h128_bottom_right.png +0 -0
  2018. psychopy/tests/data/Test_textbox_w128h128_center_center.png +0 -0
  2019. psychopy/tests/data/Test_textbox_w128h128_top_left.png +0 -0
  2020. psychopy/tests/data/Test_textbox_w128h128_top_right.png +0 -0
  2021. psychopy/tests/data/Test_textbox_w128h64_bottom_left.png +0 -0
  2022. psychopy/tests/data/Test_textbox_w128h64_bottom_right.png +0 -0
  2023. psychopy/tests/data/Test_textbox_w128h64_center_center.png +0 -0
  2024. psychopy/tests/data/Test_textbox_w128h64_top_left.png +0 -0
  2025. psychopy/tests/data/Test_textbox_w128h64_top_right.png +0 -0
  2026. psychopy/tests/data/Test_textbox_w64h128_bottom_left.png +0 -0
  2027. psychopy/tests/data/Test_textbox_w64h128_bottom_right.png +0 -0
  2028. psychopy/tests/data/Test_textbox_w64h128_center_center.png +0 -0
  2029. psychopy/tests/data/Test_textbox_w64h128_top_left.png +0 -0
  2030. psychopy/tests/data/Test_textbox_w64h128_top_right.png +0 -0
  2031. psychopy/tests/data/Test_textbox_w64h64_bottom_left.png +0 -0
  2032. psychopy/tests/data/Test_textbox_w64h64_bottom_right.png +0 -0
  2033. psychopy/tests/data/Test_textbox_w64h64_center_center.png +0 -0
  2034. psychopy/tests/data/Test_textbox_w64h64_top_left.png +0 -0
  2035. psychopy/tests/data/Test_textbox_w64h64_top_right.png +0 -0
  2036. psychopy/tests/data/Test_uax14_textbox_w128h128_bottom_left.png +0 -0
  2037. psychopy/tests/data/Test_uax14_textbox_w128h128_bottom_right.png +0 -0
  2038. psychopy/tests/data/Test_uax14_textbox_w128h128_center_center.png +0 -0
  2039. psychopy/tests/data/Test_uax14_textbox_w128h128_top_left.png +0 -0
  2040. psychopy/tests/data/Test_uax14_textbox_w128h128_top_right.png +0 -0
  2041. psychopy/tests/data/Test_uax14_textbox_w128h64_bottom_left.png +0 -0
  2042. psychopy/tests/data/Test_uax14_textbox_w128h64_bottom_right.png +0 -0
  2043. psychopy/tests/data/Test_uax14_textbox_w128h64_center_center.png +0 -0
  2044. psychopy/tests/data/Test_uax14_textbox_w128h64_top_left.png +0 -0
  2045. psychopy/tests/data/Test_uax14_textbox_w128h64_top_right.png +0 -0
  2046. psychopy/tests/data/Test_uax14_textbox_w64h128_bottom_left.png +0 -0
  2047. psychopy/tests/data/Test_uax14_textbox_w64h128_bottom_right.png +0 -0
  2048. psychopy/tests/data/Test_uax14_textbox_w64h128_center_center.png +0 -0
  2049. psychopy/tests/data/Test_uax14_textbox_w64h128_top_left.png +0 -0
  2050. psychopy/tests/data/Test_uax14_textbox_w64h128_top_right.png +0 -0
  2051. psychopy/tests/data/Test_uax14_textbox_w64h64_bottom_left.png +0 -0
  2052. psychopy/tests/data/Test_uax14_textbox_w64h64_bottom_right.png +0 -0
  2053. psychopy/tests/data/Test_uax14_textbox_w64h64_center_center.png +0 -0
  2054. psychopy/tests/data/Test_uax14_textbox_w64h64_top_left.png +0 -0
  2055. psychopy/tests/data/Test_uax14_textbox_w64h64_top_right.png +0 -0
  2056. psychopy/tests/data/TextComponent_disabled.psyexp +63 -0
  2057. psychopy/tests/data/TextComponent_not_disabled.psyexp +63 -0
  2058. psychopy/tests/data/aperture1_deg.png +0 -0
  2059. psychopy/tests/data/aperture1_degFlat.png +0 -0
  2060. psychopy/tests/data/aperture1_degFlatPos.png +0 -0
  2061. psychopy/tests/data/aperture1_norm.png +0 -0
  2062. psychopy/tests/data/aperture1_normHexbackground.png +0 -0
  2063. psychopy/tests/data/aperture1_normNoShade.png +0 -0
  2064. psychopy/tests/data/aperture1_pix.png +0 -0
  2065. psychopy/tests/data/aperture1_stencil.png +0 -0
  2066. psychopy/tests/data/aperture2_deg.png +0 -0
  2067. psychopy/tests/data/aperture2_degFlat.png +0 -0
  2068. psychopy/tests/data/aperture2_degFlatPos.png +0 -0
  2069. psychopy/tests/data/aperture2_norm.png +0 -0
  2070. psychopy/tests/data/aperture2_normHexbackground.png +0 -0
  2071. psychopy/tests/data/aperture2_normNoShade.png +0 -0
  2072. psychopy/tests/data/aperture2_pix.png +0 -0
  2073. psychopy/tests/data/aperture2_stencil.png +0 -0
  2074. psychopy/tests/data/beatandrcos_cm.png +0 -0
  2075. psychopy/tests/data/beatandrcos_deg.png +0 -0
  2076. psychopy/tests/data/beatandrcos_degFlat.png +0 -0
  2077. psychopy/tests/data/beatandrcos_degFlatPos.png +0 -0
  2078. psychopy/tests/data/beatandrcos_height.png +0 -0
  2079. psychopy/tests/data/beatandrcos_norm.png +0 -0
  2080. psychopy/tests/data/beatandrcos_normAddBlend.png +0 -0
  2081. psychopy/tests/data/beatandrcos_normAddBlend_local.png +0 -0
  2082. psychopy/tests/data/beatandrcos_normHexbackground.png +0 -0
  2083. psychopy/tests/data/beatandrcos_normHexbackground_local.png +0 -0
  2084. psychopy/tests/data/beatandrcos_norm_local.png +0 -0
  2085. psychopy/tests/data/beatandrcos_pix.png +0 -0
  2086. psychopy/tests/data/beatandrcos_stencil.png +0 -0
  2087. psychopy/tests/data/blend_add_cm.png +0 -0
  2088. psychopy/tests/data/blend_add_deg.png +0 -0
  2089. psychopy/tests/data/blend_add_degFlat.png +0 -0
  2090. psychopy/tests/data/blend_add_degFlatPos.png +0 -0
  2091. psychopy/tests/data/blend_add_height.png +0 -0
  2092. psychopy/tests/data/blend_add_norm.png +0 -0
  2093. psychopy/tests/data/blend_add_normAddBlend.png +0 -0
  2094. psychopy/tests/data/blend_add_normAddBlend_local.png +0 -0
  2095. psychopy/tests/data/blend_add_normHexbackground.png +0 -0
  2096. psychopy/tests/data/blend_add_normHexbackground_local.png +0 -0
  2097. psychopy/tests/data/blend_add_normNoShade.png +0 -0
  2098. psychopy/tests/data/blend_add_norm_local.png +0 -0
  2099. psychopy/tests/data/blend_add_pix.png +0 -0
  2100. psychopy/tests/data/blend_add_stencil.png +0 -0
  2101. psychopy/tests/data/broken2020_2_5_resources/broken_resources.psyexp +84 -0
  2102. psychopy/tests/data/broken2020_2_5_resources/psychopy72.png +0 -0
  2103. psychopy/tests/data/bufferimg_gabor_cm.png +0 -0
  2104. psychopy/tests/data/bufferimg_gabor_deg.png +0 -0
  2105. psychopy/tests/data/bufferimg_gabor_degFlat.png +0 -0
  2106. psychopy/tests/data/bufferimg_gabor_degFlatPos.png +0 -0
  2107. psychopy/tests/data/bufferimg_gabor_height.png +0 -0
  2108. psychopy/tests/data/bufferimg_gabor_norm.png +0 -0
  2109. psychopy/tests/data/bufferimg_gabor_normAddBlend.png +0 -0
  2110. psychopy/tests/data/bufferimg_gabor_normAddBlend_local.png +0 -0
  2111. psychopy/tests/data/bufferimg_gabor_normHexbackground.png +0 -0
  2112. psychopy/tests/data/bufferimg_gabor_normHexbackground_local.png +0 -0
  2113. psychopy/tests/data/bufferimg_gabor_normNoShade.png +0 -0
  2114. psychopy/tests/data/bufferimg_gabor_norm_local.png +0 -0
  2115. psychopy/tests/data/bufferimg_gabor_pix.png +0 -0
  2116. psychopy/tests/data/bufferimg_gabor_stencil.png +0 -0
  2117. psychopy/tests/data/circleHex_cm.png +0 -0
  2118. psychopy/tests/data/circleHex_deg.png +0 -0
  2119. psychopy/tests/data/circleHex_degFlat.png +0 -0
  2120. psychopy/tests/data/circleHex_degFlatPos.png +0 -0
  2121. psychopy/tests/data/circleHex_height.png +0 -0
  2122. psychopy/tests/data/circleHex_norm.png +0 -0
  2123. psychopy/tests/data/circleHex_normAddBlend.png +0 -0
  2124. psychopy/tests/data/circleHex_normAddBlend_local.png +0 -0
  2125. psychopy/tests/data/circleHex_normHexbackground.png +0 -0
  2126. psychopy/tests/data/circleHex_normHexbackground_local.png +0 -0
  2127. psychopy/tests/data/circleHex_normNoShade.png +0 -0
  2128. psychopy/tests/data/circleHex_norm_local.png +0 -0
  2129. psychopy/tests/data/circleHex_pix.png +0 -0
  2130. psychopy/tests/data/circleHex_stencil.png +0 -0
  2131. psychopy/tests/data/corrFullRandom.csv +16 -0
  2132. psychopy/tests/data/corrFullRandom.tsv +6 -0
  2133. psychopy/tests/data/corrFullRandomTH2.csv +16 -0
  2134. psychopy/tests/data/corrMultiKeyExpWide.csv +3 -0
  2135. psychopy/tests/data/corrMultiKeyTrials.csv +8 -0
  2136. psychopy/tests/data/corrMultiKeyTrials.xlsx +0 -0
  2137. psychopy/tests/data/corrRandom.csv +16 -0
  2138. psychopy/tests/data/corrRandom.tsv +6 -0
  2139. psychopy/tests/data/corrRandomTH2.csv +16 -0
  2140. psychopy/tests/data/corrXlsx.xlsx +0 -0
  2141. psychopy/tests/data/correctScript/js/correctCodeComponent.js +181 -0
  2142. psychopy/tests/data/correctScript/js/correctImageComponent.js +204 -0
  2143. psychopy/tests/data/correctScript/js/correctKeyboardComponent.js +225 -0
  2144. psychopy/tests/data/correctScript/js/correctMouseComponent.js +221 -0
  2145. psychopy/tests/data/correctScript/js/correctMovieComponent.js +210 -0
  2146. psychopy/tests/data/correctScript/js/correctPolygonComponent.js +205 -0
  2147. psychopy/tests/data/correctScript/js/correctSliderComponent.js +209 -0
  2148. psychopy/tests/data/correctScript/js/correctSoundComponent.js +205 -0
  2149. psychopy/tests/data/correctScript/js/correctTextComponent.js +207 -0
  2150. psychopy/tests/data/correctScript/python/correctApertureComponent.py +157 -0
  2151. psychopy/tests/data/correctScript/python/correctCodeComponent.py +135 -0
  2152. psychopy/tests/data/correctScript/python/correctDotsComponent.py +161 -0
  2153. psychopy/tests/data/correctScript/python/correctEnvGratingComponent.py +167 -0
  2154. psychopy/tests/data/correctScript/python/correctFormComponent.py +150 -0
  2155. psychopy/tests/data/correctScript/python/correctGratingComponent.py +158 -0
  2156. psychopy/tests/data/correctScript/python/correctImageComponent.py +160 -0
  2157. psychopy/tests/data/correctScript/python/correctJoyButtonsComponent.py +204 -0
  2158. psychopy/tests/data/correctScript/python/correctJoystickComponent.py +214 -0
  2159. psychopy/tests/data/correctScript/python/correctKeyboardComponent.py +169 -0
  2160. psychopy/tests/data/correctScript/python/correctMicrophoneComponent.py +163 -0
  2161. psychopy/tests/data/correctScript/python/correctMouseComponent.py +174 -0
  2162. psychopy/tests/data/correctScript/python/correctMovieComponent.py +160 -0
  2163. psychopy/tests/data/correctScript/python/correctNoiseStimComponent.py +169 -0
  2164. psychopy/tests/data/correctScript/python/correctParallelOutComponent.py +156 -0
  2165. psychopy/tests/data/correctScript/python/correctPatchComponent.py +159 -0
  2166. psychopy/tests/data/correctScript/python/correctPolygonComponent.py +159 -0
  2167. psychopy/tests/data/correctScript/python/correctQmixPumpComponent.py +174 -0
  2168. psychopy/tests/data/correctScript/python/correctRatingScaleComponent.py +152 -0
  2169. psychopy/tests/data/correctScript/python/correctSliderComponent.py +159 -0
  2170. psychopy/tests/data/correctScript/python/correctSoundComponent.py +157 -0
  2171. psychopy/tests/data/correctScript/python/correctStaticComponent.py +176 -0
  2172. psychopy/tests/data/correctScript/python/correctTextComponent.py +159 -0
  2173. psychopy/tests/data/correctScript/python/correctVariableComponent.py +139 -0
  2174. psychopy/tests/data/correctScript/python/correctcedrusButtonBoxComponent.py +199 -0
  2175. psychopy/tests/data/correctScript/python/correctioLabsButtonBoxComponent.py +187 -0
  2176. psychopy/tests/data/dataTest.xlsx +0 -0
  2177. psychopy/tests/data/dots_cm.png +0 -0
  2178. psychopy/tests/data/dots_deg.png +0 -0
  2179. psychopy/tests/data/dots_degFlat.png +0 -0
  2180. psychopy/tests/data/dots_degFlatPos.png +0 -0
  2181. psychopy/tests/data/dots_height.png +0 -0
  2182. psychopy/tests/data/dots_norm.png +0 -0
  2183. psychopy/tests/data/dots_normAddBlend.png +0 -0
  2184. psychopy/tests/data/dots_normAddBlend_local.png +0 -0
  2185. psychopy/tests/data/dots_normHexbackground.png +0 -0
  2186. psychopy/tests/data/dots_normHexbackground_local.png +0 -0
  2187. psychopy/tests/data/dots_normNoShade.png +0 -0
  2188. psychopy/tests/data/dots_norm_local.png +0 -0
  2189. psychopy/tests/data/dots_pix.png +0 -0
  2190. psychopy/tests/data/dots_stencil.png +0 -0
  2191. psychopy/tests/data/elarray1_cm.png +0 -0
  2192. psychopy/tests/data/elarray1_deg.png +0 -0
  2193. psychopy/tests/data/elarray1_degFlat.png +0 -0
  2194. psychopy/tests/data/elarray1_degFlatPos.png +0 -0
  2195. psychopy/tests/data/elarray1_height.png +0 -0
  2196. psychopy/tests/data/elarray1_norm.png +0 -0
  2197. psychopy/tests/data/elarray1_normAddBlend.png +0 -0
  2198. psychopy/tests/data/elarray1_normAddBlend_local.png +0 -0
  2199. psychopy/tests/data/elarray1_normHexbackground.png +0 -0
  2200. psychopy/tests/data/elarray1_normHexbackground_local.png +0 -0
  2201. psychopy/tests/data/elarray1_norm_local.png +0 -0
  2202. psychopy/tests/data/elarray1_pix.png +0 -0
  2203. psychopy/tests/data/elarray1_stencil.png +0 -0
  2204. psychopy/tests/data/envelopeandrcos_cm.png +0 -0
  2205. psychopy/tests/data/envelopeandrcos_deg.png +0 -0
  2206. psychopy/tests/data/envelopeandrcos_degFlat.png +0 -0
  2207. psychopy/tests/data/envelopeandrcos_degFlatPos.png +0 -0
  2208. psychopy/tests/data/envelopeandrcos_height.png +0 -0
  2209. psychopy/tests/data/envelopeandrcos_norm.png +0 -0
  2210. psychopy/tests/data/envelopeandrcos_normAddBlend.png +0 -0
  2211. psychopy/tests/data/envelopeandrcos_normAddBlend_local.png +0 -0
  2212. psychopy/tests/data/envelopeandrcos_normHexbackground.png +0 -0
  2213. psychopy/tests/data/envelopeandrcos_normHexbackground_local.png +0 -0
  2214. psychopy/tests/data/envelopeandrcos_norm_local.png +0 -0
  2215. psychopy/tests/data/envelopeandrcos_pix.png +0 -0
  2216. psychopy/tests/data/envelopeandrcos_stencil.png +0 -0
  2217. psychopy/tests/data/envelopepowerandrcos_cm.png +0 -0
  2218. psychopy/tests/data/envelopepowerandrcos_deg.png +0 -0
  2219. psychopy/tests/data/envelopepowerandrcos_degFlat.png +0 -0
  2220. psychopy/tests/data/envelopepowerandrcos_degFlatPos.png +0 -0
  2221. psychopy/tests/data/envelopepowerandrcos_height.png +0 -0
  2222. psychopy/tests/data/envelopepowerandrcos_norm.png +0 -0
  2223. psychopy/tests/data/envelopepowerandrcos_normAddBlend.png +0 -0
  2224. psychopy/tests/data/envelopepowerandrcos_normAddBlend_local.png +0 -0
  2225. psychopy/tests/data/envelopepowerandrcos_normHexbackground.png +0 -0
  2226. psychopy/tests/data/envelopepowerandrcos_normHexbackground_local.png +0 -0
  2227. psychopy/tests/data/envelopepowerandrcos_norm_local.png +0 -0
  2228. psychopy/tests/data/envelopepowerandrcos_pix.png +0 -0
  2229. psychopy/tests/data/envelopepowerandrcos_stencil.png +0 -0
  2230. psychopy/tests/data/filltext.png +0 -0
  2231. psychopy/tests/data/form_font_demographics.png +0 -0
  2232. psychopy/tests/data/form_font_demographics.xlsx +0 -0
  2233. psychopy/tests/data/form_font_languages.png +0 -0
  2234. psychopy/tests/data/form_font_languages.xlsx +0 -0
  2235. psychopy/tests/data/form_font_nonstandard.png +0 -0
  2236. psychopy/tests/data/futureParams.psyexp +150 -0
  2237. psychopy/tests/data/gabor1_cm.png +0 -0
  2238. psychopy/tests/data/gabor1_deg.png +0 -0
  2239. psychopy/tests/data/gabor1_degFlat.png +0 -0
  2240. psychopy/tests/data/gabor1_degFlatPos.png +0 -0
  2241. psychopy/tests/data/gabor1_height.png +0 -0
  2242. psychopy/tests/data/gabor1_norm.png +0 -0
  2243. psychopy/tests/data/gabor1_normAddBlend.png +0 -0
  2244. psychopy/tests/data/gabor1_normAddBlend_local.png +0 -0
  2245. psychopy/tests/data/gabor1_normHexbackground.png +0 -0
  2246. psychopy/tests/data/gabor1_normHexbackground_local.png +0 -0
  2247. psychopy/tests/data/gabor1_normNoShade.png +0 -0
  2248. psychopy/tests/data/gabor1_norm_local.png +0 -0
  2249. psychopy/tests/data/gabor1_pix.png +0 -0
  2250. psychopy/tests/data/gabor1_stencil.png +0 -0
  2251. psychopy/tests/data/gabor2_cm.png +0 -0
  2252. psychopy/tests/data/gabor2_deg.png +0 -0
  2253. psychopy/tests/data/gabor2_degFlat.png +0 -0
  2254. psychopy/tests/data/gabor2_degFlatPos.png +0 -0
  2255. psychopy/tests/data/gabor2_height.png +0 -0
  2256. psychopy/tests/data/gabor2_norm.png +0 -0
  2257. psychopy/tests/data/gabor2_normAddBlend.png +0 -0
  2258. psychopy/tests/data/gabor2_normHexbackground.png +0 -0
  2259. psychopy/tests/data/gabor2_normNoShade.png +0 -0
  2260. psychopy/tests/data/gabor2_pix.png +0 -0
  2261. psychopy/tests/data/gabor2_stencil.png +0 -0
  2262. psychopy/tests/data/ghost_stroop.psyexp +131 -0
  2263. psychopy/tests/data/ghost_trialTypes.xlsx +0 -0
  2264. psychopy/tests/data/green_48000.flac.dist +0 -0
  2265. psychopy/tests/data/greyscale.jpg +0 -0
  2266. psychopy/tests/data/greyscale2.png +0 -0
  2267. psychopy/tests/data/greyscale2_cm.png +0 -0
  2268. psychopy/tests/data/greyscale2_deg.png +0 -0
  2269. psychopy/tests/data/greyscale2_degFlat.png +0 -0
  2270. psychopy/tests/data/greyscale2_degFlatPos.png +0 -0
  2271. psychopy/tests/data/greyscale2_height.png +0 -0
  2272. psychopy/tests/data/greyscale2_norm.png +0 -0
  2273. psychopy/tests/data/greyscale2_normAddBlend.png +0 -0
  2274. psychopy/tests/data/greyscale2_normHexbackground.png +0 -0
  2275. psychopy/tests/data/greyscale2_normNoShade.png +0 -0
  2276. psychopy/tests/data/greyscale2_pix.png +0 -0
  2277. psychopy/tests/data/greyscale2_stencil.png +0 -0
  2278. psychopy/tests/data/greyscaleLowContr_cm.png +0 -0
  2279. psychopy/tests/data/greyscaleLowContr_deg.png +0 -0
  2280. psychopy/tests/data/greyscaleLowContr_degFlat.png +0 -0
  2281. psychopy/tests/data/greyscaleLowContr_degFlatPos.png +0 -0
  2282. psychopy/tests/data/greyscaleLowContr_height.png +0 -0
  2283. psychopy/tests/data/greyscaleLowContr_norm.png +0 -0
  2284. psychopy/tests/data/greyscaleLowContr_normAddBlend.png +0 -0
  2285. psychopy/tests/data/greyscaleLowContr_normHexbackground.png +0 -0
  2286. psychopy/tests/data/greyscaleLowContr_normNoShade.png +0 -0
  2287. psychopy/tests/data/greyscaleLowContr_pix.png +0 -0
  2288. psychopy/tests/data/greyscaleLowContr_stencil.png +0 -0
  2289. psychopy/tests/data/greyscale_cm.png +0 -0
  2290. psychopy/tests/data/greyscale_deg.png +0 -0
  2291. psychopy/tests/data/greyscale_degFlat.png +0 -0
  2292. psychopy/tests/data/greyscale_degFlatPos.png +0 -0
  2293. psychopy/tests/data/greyscale_height.png +0 -0
  2294. psychopy/tests/data/greyscale_norm.png +0 -0
  2295. psychopy/tests/data/greyscale_normAddBlend.png +0 -0
  2296. psychopy/tests/data/greyscale_normHexbackground.png +0 -0
  2297. psychopy/tests/data/greyscale_normNoShade.png +0 -0
  2298. psychopy/tests/data/greyscale_pix.png +0 -0
  2299. psychopy/tests/data/greyscale_stencil.png +0 -0
  2300. psychopy/tests/data/imageAndGauss_cm.png +0 -0
  2301. psychopy/tests/data/imageAndGauss_deg.png +0 -0
  2302. psychopy/tests/data/imageAndGauss_degFlat.png +0 -0
  2303. psychopy/tests/data/imageAndGauss_degFlatPos.png +0 -0
  2304. psychopy/tests/data/imageAndGauss_height.png +0 -0
  2305. psychopy/tests/data/imageAndGauss_norm.png +0 -0
  2306. psychopy/tests/data/imageAndGauss_normAddBlend.png +0 -0
  2307. psychopy/tests/data/imageAndGauss_normAddBlend_local.png +0 -0
  2308. psychopy/tests/data/imageAndGauss_normHexbackground.png +0 -0
  2309. psychopy/tests/data/imageAndGauss_normHexbackground_local.png +0 -0
  2310. psychopy/tests/data/imageAndGauss_normNoShade.png +0 -0
  2311. psychopy/tests/data/imageAndGauss_norm_local.png +0 -0
  2312. psychopy/tests/data/imageAndGauss_pix.png +0 -0
  2313. psychopy/tests/data/imageAndGauss_stencil.png +0 -0
  2314. psychopy/tests/data/movFrame1_cm.png +0 -0
  2315. psychopy/tests/data/movFrame1_deg.png +0 -0
  2316. psychopy/tests/data/movFrame1_degFlat.png +0 -0
  2317. psychopy/tests/data/movFrame1_degFlatPos.png +0 -0
  2318. psychopy/tests/data/movFrame1_height.png +0 -0
  2319. psychopy/tests/data/movFrame1_norm.png +0 -0
  2320. psychopy/tests/data/movFrame1_normAddBlend.png +0 -0
  2321. psychopy/tests/data/movFrame1_normHexbackground.png +0 -0
  2322. psychopy/tests/data/movFrame1_normNoShade.png +0 -0
  2323. psychopy/tests/data/movFrame1_pix.png +0 -0
  2324. psychopy/tests/data/movFrame1_stencil.png +0 -0
  2325. psychopy/tests/data/multiKeypressExperiment.psydat +357 -0
  2326. psychopy/tests/data/multiKeypressTrialhandler.psydat +252 -0
  2327. psychopy/tests/data/multiStairConds.xlsx +0 -0
  2328. psychopy/tests/data/multiStairQuestPlus.xlsx +0 -0
  2329. psychopy/tests/data/newstyle.psydat +6155 -0
  2330. psychopy/tests/data/noiseAndRcos_cm.png +0 -0
  2331. psychopy/tests/data/noiseAndRcos_deg.png +0 -0
  2332. psychopy/tests/data/noiseAndRcos_degFlat.png +0 -0
  2333. psychopy/tests/data/noiseAndRcos_degFlatPos.png +0 -0
  2334. psychopy/tests/data/noiseAndRcos_height.png +0 -0
  2335. psychopy/tests/data/noiseAndRcos_norm.png +0 -0
  2336. psychopy/tests/data/noiseAndRcos_normAddBlend.png +0 -0
  2337. psychopy/tests/data/noiseAndRcos_normAddBlend_local.png +0 -0
  2338. psychopy/tests/data/noiseAndRcos_normHexbackground.png +0 -0
  2339. psychopy/tests/data/noiseAndRcos_normHexbackground_local.png +0 -0
  2340. psychopy/tests/data/noiseAndRcos_normNoShade.png +0 -0
  2341. psychopy/tests/data/noiseAndRcos_norm_local.png +0 -0
  2342. psychopy/tests/data/noiseAndRcos_pix.png +0 -0
  2343. psychopy/tests/data/noiseAndRcos_stencil.png +0 -0
  2344. psychopy/tests/data/noiseFiltersAndRcos_cm.png +0 -0
  2345. psychopy/tests/data/noiseFiltersAndRcos_deg.png +0 -0
  2346. psychopy/tests/data/noiseFiltersAndRcos_degFlat.png +0 -0
  2347. psychopy/tests/data/noiseFiltersAndRcos_degFlatPos.png +0 -0
  2348. psychopy/tests/data/noiseFiltersAndRcos_height.png +0 -0
  2349. psychopy/tests/data/noiseFiltersAndRcos_norm.png +0 -0
  2350. psychopy/tests/data/noiseFiltersAndRcos_normAddBlend.png +0 -0
  2351. psychopy/tests/data/noiseFiltersAndRcos_normAddBlend_local.png +0 -0
  2352. psychopy/tests/data/noiseFiltersAndRcos_normHexbackground.png +0 -0
  2353. psychopy/tests/data/noiseFiltersAndRcos_normHexbackground_local.png +0 -0
  2354. psychopy/tests/data/noiseFiltersAndRcos_normNoShade.png +0 -0
  2355. psychopy/tests/data/noiseFiltersAndRcos_norm_local.png +0 -0
  2356. psychopy/tests/data/noiseFiltersAndRcos_pix.png +0 -0
  2357. psychopy/tests/data/noiseFiltersAndRcos_stencil.png +0 -0
  2358. psychopy/tests/data/numpyImage_cm.png +0 -0
  2359. psychopy/tests/data/numpyImage_deg.png +0 -0
  2360. psychopy/tests/data/numpyImage_degFlat.png +0 -0
  2361. psychopy/tests/data/numpyImage_degFlatPos.png +0 -0
  2362. psychopy/tests/data/numpyImage_height.png +0 -0
  2363. psychopy/tests/data/numpyImage_norm.png +0 -0
  2364. psychopy/tests/data/numpyImage_normAddBlend.png +0 -0
  2365. psychopy/tests/data/numpyImage_normAddBlend_local.png +0 -0
  2366. psychopy/tests/data/numpyImage_normHexbackground.png +0 -0
  2367. psychopy/tests/data/numpyImage_normHexbackground_local.png +0 -0
  2368. psychopy/tests/data/numpyImage_normNoShade.png +0 -0
  2369. psychopy/tests/data/numpyImage_norm_local.png +0 -0
  2370. psychopy/tests/data/numpyImage_pix.png +0 -0
  2371. psychopy/tests/data/numpyImage_stencil.png +0 -0
  2372. psychopy/tests/data/numpyLowContr_cm.png +0 -0
  2373. psychopy/tests/data/numpyLowContr_deg.png +0 -0
  2374. psychopy/tests/data/numpyLowContr_degFlat.png +0 -0
  2375. psychopy/tests/data/numpyLowContr_degFlatPos.png +0 -0
  2376. psychopy/tests/data/numpyLowContr_height.png +0 -0
  2377. psychopy/tests/data/numpyLowContr_norm.png +0 -0
  2378. psychopy/tests/data/numpyLowContr_normAddBlend.png +0 -0
  2379. psychopy/tests/data/numpyLowContr_normHexbackground.png +0 -0
  2380. psychopy/tests/data/numpyLowContr_normNoShade.png +0 -0
  2381. psychopy/tests/data/numpyLowContr_pix.png +0 -0
  2382. psychopy/tests/data/numpyLowContr_stencil.png +0 -0
  2383. psychopy/tests/data/oldstyle.psydat +1534 -0
  2384. psychopy/tests/data/oldstyle_stair.psydat +263 -0
  2385. psychopy/tests/data/ratingscale1_cm.png +0 -0
  2386. psychopy/tests/data/ratingscale1_deg.png +0 -0
  2387. psychopy/tests/data/ratingscale1_degFlat.png +0 -0
  2388. psychopy/tests/data/ratingscale1_degFlatPos.png +0 -0
  2389. psychopy/tests/data/ratingscale1_height.png +0 -0
  2390. psychopy/tests/data/ratingscale1_norm.png +0 -0
  2391. psychopy/tests/data/ratingscale1_normAddBlend.png +0 -0
  2392. psychopy/tests/data/ratingscale1_normHexbackground.png +0 -0
  2393. psychopy/tests/data/ratingscale1_normNoShade.png +0 -0
  2394. psychopy/tests/data/ratingscale1_pix.png +0 -0
  2395. psychopy/tests/data/ratingscale1_stencil.png +0 -0
  2396. psychopy/tests/data/red_16000.flac.dist +0 -0
  2397. psychopy/tests/data/retroListParam.psyexp +82 -0
  2398. psychopy/tests/data/right_to_left_unidcode.xlsx +0 -0
  2399. psychopy/tests/data/sample.meshwarp.data +11522 -0
  2400. psychopy/tests/data/shape2_1_cm.png +0 -0
  2401. psychopy/tests/data/shape2_1_deg.png +0 -0
  2402. psychopy/tests/data/shape2_1_degFlat.png +0 -0
  2403. psychopy/tests/data/shape2_1_degFlatPos.png +0 -0
  2404. psychopy/tests/data/shape2_1_height.png +0 -0
  2405. psychopy/tests/data/shape2_1_norm.png +0 -0
  2406. psychopy/tests/data/shape2_1_normAddBlend.png +0 -0
  2407. psychopy/tests/data/shape2_1_normAddBlend_local.png +0 -0
  2408. psychopy/tests/data/shape2_1_normHexbackground.png +0 -0
  2409. psychopy/tests/data/shape2_1_normNoShade.png +0 -0
  2410. psychopy/tests/data/shape2_1_norm_local.png +0 -0
  2411. psychopy/tests/data/shape2_1_pix.png +0 -0
  2412. psychopy/tests/data/shape2_1_stencil.png +0 -0
  2413. psychopy/tests/data/shape2_2_cm.png +0 -0
  2414. psychopy/tests/data/shape2_2_deg.png +0 -0
  2415. psychopy/tests/data/shape2_2_degFlat.png +0 -0
  2416. psychopy/tests/data/shape2_2_degFlatPos.png +0 -0
  2417. psychopy/tests/data/shape2_2_height.png +0 -0
  2418. psychopy/tests/data/shape2_2_norm.png +0 -0
  2419. psychopy/tests/data/shape2_2_normAddBlend.png +0 -0
  2420. psychopy/tests/data/shape2_2_normHexbackground.png +0 -0
  2421. psychopy/tests/data/shape2_2_normNoShade.png +0 -0
  2422. psychopy/tests/data/shape2_2_pix.png +0 -0
  2423. psychopy/tests/data/shape2_2_stencil.png +0 -0
  2424. psychopy/tests/data/simpleimage1_cm.png +0 -0
  2425. psychopy/tests/data/simpleimage1_deg.png +0 -0
  2426. psychopy/tests/data/simpleimage1_degFlat.png +0 -0
  2427. psychopy/tests/data/simpleimage1_degFlatPos.png +0 -0
  2428. psychopy/tests/data/simpleimage1_height.png +0 -0
  2429. psychopy/tests/data/simpleimage1_norm.png +0 -0
  2430. psychopy/tests/data/simpleimage1_normAddBlend.png +0 -0
  2431. psychopy/tests/data/simpleimage1_normHexbackground.png +0 -0
  2432. psychopy/tests/data/simpleimage1_normNoShade.png +0 -0
  2433. psychopy/tests/data/simpleimage1_pix.png +0 -0
  2434. psychopy/tests/data/simpleimage1_stencil.png +0 -0
  2435. psychopy/tests/data/test001EntryImporting.psyexp +66 -0
  2436. psychopy/tests/data/testMovie.mp4 +0 -0
  2437. psychopy/tests/data/test_circle_radius_.1height.png +0 -0
  2438. psychopy/tests/data/test_circle_radius_.2height.png +0 -0
  2439. psychopy/tests/data/test_circle_radius_10pix.png +0 -0
  2440. psychopy/tests/data/test_circle_radius_20pix.png +0 -0
  2441. psychopy/tests/data/test_form_combinations_choice_bigItem.png +0 -0
  2442. psychopy/tests/data/test_form_combinations_choice_bigItemOverflow.png +0 -0
  2443. psychopy/tests/data/test_form_combinations_choice_bigResp.png +0 -0
  2444. psychopy/tests/data/test_form_combinations_choice_bigRespOverflow.png +0 -0
  2445. psychopy/tests/data/test_form_combinations_description_bigItem.png +0 -0
  2446. psychopy/tests/data/test_form_combinations_description_bigItemOverflow.png +0 -0
  2447. psychopy/tests/data/test_form_combinations_description_bigResp.png +0 -0
  2448. psychopy/tests/data/test_form_combinations_description_bigRespOverflow.png +0 -0
  2449. psychopy/tests/data/test_form_combinations_free text_bigItem.png +0 -0
  2450. psychopy/tests/data/test_form_combinations_free text_bigItemOverflow.png +0 -0
  2451. psychopy/tests/data/test_form_combinations_free text_bigResp.png +0 -0
  2452. psychopy/tests/data/test_form_combinations_free text_bigRespOverflow.png +0 -0
  2453. psychopy/tests/data/test_form_combinations_heading_bigItem.png +0 -0
  2454. psychopy/tests/data/test_form_combinations_heading_bigItemOverflow.png +0 -0
  2455. psychopy/tests/data/test_form_combinations_heading_bigResp.png +0 -0
  2456. psychopy/tests/data/test_form_combinations_heading_bigRespOverflow.png +0 -0
  2457. psychopy/tests/data/test_form_combinations_radio_bigItem.png +0 -0
  2458. psychopy/tests/data/test_form_combinations_radio_bigItemOverflow.png +0 -0
  2459. psychopy/tests/data/test_form_combinations_radio_bigResp.png +0 -0
  2460. psychopy/tests/data/test_form_combinations_radio_bigRespOverflow.png +0 -0
  2461. psychopy/tests/data/test_form_combinations_rating_bigItem.png +0 -0
  2462. psychopy/tests/data/test_form_combinations_rating_bigItemOverflow.png +0 -0
  2463. psychopy/tests/data/test_form_combinations_rating_bigResp.png +0 -0
  2464. psychopy/tests/data/test_form_combinations_rating_bigRespOverflow.png +0 -0
  2465. psychopy/tests/data/test_form_combinations_slider_bigItem.png +0 -0
  2466. psychopy/tests/data/test_form_combinations_slider_bigItemOverflow.png +0 -0
  2467. psychopy/tests/data/test_form_combinations_slider_bigResp.png +0 -0
  2468. psychopy/tests/data/test_form_combinations_slider_bigRespOverflow.png +0 -0
  2469. psychopy/tests/data/test_get_resources/blue.png +0 -0
  2470. psychopy/tests/data/test_get_resources/groupA.csv +3 -0
  2471. psychopy/tests/data/test_get_resources/groupB.csv +3 -0
  2472. psychopy/tests/data/test_get_resources/groups.csv +3 -0
  2473. psychopy/tests/data/test_get_resources/handledbyrm_constrloop.psyexp +143 -0
  2474. psychopy/tests/data/test_get_resources/handledbyrm_noloop.psyexp +114 -0
  2475. psychopy/tests/data/test_get_resources/handledbyrm_recurloop.psyexp +138 -0
  2476. psychopy/tests/data/test_get_resources/handledbyrm_strloop.psyexp +126 -0
  2477. psychopy/tests/data/test_get_resources/handledbystatic_constrloop.psyexp +141 -0
  2478. psychopy/tests/data/test_get_resources/handledbystatic_noloop.psyexp +112 -0
  2479. psychopy/tests/data/test_get_resources/handledbystatic_recurloop.psyexp +136 -0
  2480. psychopy/tests/data/test_get_resources/handledbystatic_strloop.psyexp +124 -0
  2481. psychopy/tests/data/test_get_resources/unhandled_constrloop.psyexp +128 -0
  2482. psychopy/tests/data/test_get_resources/unhandled_noloop.psyexp +99 -0
  2483. psychopy/tests/data/test_get_resources/unhandled_recurloop.psyexp +123 -0
  2484. psychopy/tests/data/test_get_resources/unhandled_strloop.psyexp +111 -0
  2485. psychopy/tests/data/test_get_resources/white.png +0 -0
  2486. psychopy/tests/data/test_get_resources/yellow.png +0 -0
  2487. psychopy/tests/data/test_image_aspect_default_None.png +0 -0
  2488. psychopy/tests/data/test_image_aspect_default_xFull_yNone.png +0 -0
  2489. psychopy/tests/data/test_image_aspect_default_xNone_yFull.png +0 -0
  2490. psychopy/tests/data/test_image_aspect_default_xNone_yNone.png +0 -0
  2491. psychopy/tests/data/test_image_flip_anchor_horiz.png +0 -0
  2492. psychopy/tests/data/test_image_flip_anchor_vert.png +0 -0
  2493. psychopy/tests/data/test_loops/testLoopsBlocks.psyexp +161 -0
  2494. psychopy/tests/data/test_loops/testStaircase.psyexp +105 -0
  2495. psychopy/tests/data/test_loops/test_current_loop_attr.psyexp +185 -0
  2496. psychopy/tests/data/test_panorama/panoramaTestImage.png +0 -0
  2497. psychopy/tests/data/test_panorama/panoramaTestImage.svg +1 -0
  2498. psychopy/tests/data/test_panorama/testPanorama_mvmt_-0.3_-0.3.png +0 -0
  2499. psychopy/tests/data/test_panorama/testPanorama_mvmt_-0.3_0.3.png +0 -0
  2500. psychopy/tests/data/test_panorama/testPanorama_mvmt_-1.0_-0.3.png +0 -0
  2501. psychopy/tests/data/test_panorama/testPanorama_mvmt_-1.0_0.3.png +0 -0
  2502. psychopy/tests/data/test_panorama/testPanorama_mvmt_0.0_-1.0.png +0 -0
  2503. psychopy/tests/data/test_panorama/testPanorama_mvmt_0.0_1.0.png +0 -0
  2504. psychopy/tests/data/test_panorama/testPanorama_mvmt_0.3_-0.3.png +0 -0
  2505. psychopy/tests/data/test_panorama/testPanorama_mvmt_0.3_0.3.png +0 -0
  2506. psychopy/tests/data/test_resources.psyexp +491 -0
  2507. psychopy/tests/data/test_session/outside_root/externalExp.psyexp +116 -0
  2508. psychopy/tests/data/test_session/root/annotation/annotation.psyexp +161 -0
  2509. psychopy/tests/data/test_session/root/error/error.psyexp +93 -0
  2510. psychopy/tests/data/test_session/root/exp1/exp1.psyexp +133 -0
  2511. psychopy/tests/data/test_session/root/exp2/exp2.psyexp +133 -0
  2512. psychopy/tests/data/test_session/root/frameRate/frameRate.psyexp +114 -0
  2513. psychopy/tests/data/test_session/root/invUseVersion/invUseVersion.psyexp +133 -0
  2514. psychopy/tests/data/test_session/root/testClockFormat/testClockFormat.psyexp +122 -0
  2515. psychopy/tests/data/test_session/root/testCtrls/testCtrls.psyexp +115 -0
  2516. psychopy/tests/data/test_session/root/testEditExpInfo/testEditExpInfo.psyexp +135 -0
  2517. psychopy/tests/data/test_session/root/testNamedButtonBox/testNamedButtonBox.psyexp +145 -0
  2518. psychopy/tests/data/test_slider_horiz_accute_horiz.png +0 -0
  2519. psychopy/tests/data/test_slider_horiz_accute_vert.png +0 -0
  2520. psychopy/tests/data/test_slider_horiz_horiz.png +0 -0
  2521. psychopy/tests/data/test_slider_horiz_obtuse_horiz.png +0 -0
  2522. psychopy/tests/data/test_slider_horiz_obtuse_vert.png +0 -0
  2523. psychopy/tests/data/test_slider_horiz_vert.png +0 -0
  2524. psychopy/tests/data/test_slider_ticklabelloc_blanks.png +0 -0
  2525. psychopy/tests/data/test_slider_ticklabelloc_clustered.png +0 -0
  2526. psychopy/tests/data/test_slider_ticklabelloc_morelabels.png +0 -0
  2527. psychopy/tests/data/test_slider_ticklabelloc_morelabelsclustered.png +0 -0
  2528. psychopy/tests/data/test_slider_ticklabelloc_moreticks.png +0 -0
  2529. psychopy/tests/data/test_slider_ticklabelloc_moreticksclustered.png +0 -0
  2530. psychopy/tests/data/test_slider_ticklabelloc_nolabels.png +0 -0
  2531. psychopy/tests/data/test_slider_ticklabelloc_noticks.png +0 -0
  2532. psychopy/tests/data/test_slider_ticklabelloc_simple.png +0 -0
  2533. psychopy/tests/data/test_slider_triangle_horiz_False_flip_False.png +0 -0
  2534. psychopy/tests/data/test_slider_triangle_horiz_False_flip_True.png +0 -0
  2535. psychopy/tests/data/test_slider_triangle_horiz_True_flip_False.png +0 -0
  2536. psychopy/tests/data/test_slider_triangle_horiz_True_flip_True.png +0 -0
  2537. psychopy/tests/data/test_static_component_script.psyexp +76 -0
  2538. psychopy/tests/data/test_win_bg_large_256_default.png +0 -0
  2539. psychopy/tests/data/test_win_bg_large_500_default.png +0 -0
  2540. psychopy/tests/data/test_win_bg_small_200_default.png +0 -0
  2541. psychopy/tests/data/test_win_bg_small_256_default.png +0 -0
  2542. psychopy/tests/data/test_win_bg_tall_200_default.png +0 -0
  2543. psychopy/tests/data/test_win_bg_tall_256_default.png +0 -0
  2544. psychopy/tests/data/test_win_bg_tall_500_default.png +0 -0
  2545. psychopy/tests/data/test_win_bg_tall_fill_default.png +0 -0
  2546. psychopy/tests/data/test_win_bg_wide_200_default.png +0 -0
  2547. psychopy/tests/data/test_win_bg_wide_256_default.png +0 -0
  2548. psychopy/tests/data/test_win_bg_wide_500_default.png +0 -0
  2549. psychopy/tests/data/test_win_bg_wide_fill_default.png +0 -0
  2550. psychopy/tests/data/test_win_bgcolor_blue.png +0 -0
  2551. psychopy/tests/data/test_win_bgcolor_green.png +0 -0
  2552. psychopy/tests/data/test_win_bgcolor_red.png +0 -0
  2553. psychopy/tests/data/testimage.jpg +0 -0
  2554. psychopy/tests/data/testimagegray.jpg +0 -0
  2555. psychopy/tests/data/testpixels.png +0 -0
  2556. psychopy/tests/data/testwedges.png +0 -0
  2557. psychopy/tests/data/text1_cm.png +0 -0
  2558. psychopy/tests/data/text1_deg.png +0 -0
  2559. psychopy/tests/data/text1_degFlat.png +0 -0
  2560. psychopy/tests/data/text1_degFlatPos.png +0 -0
  2561. psychopy/tests/data/text1_height.png +0 -0
  2562. psychopy/tests/data/text1_norm.png +0 -0
  2563. psychopy/tests/data/text1_normAddBlend.png +0 -0
  2564. psychopy/tests/data/text1_normAddBlend_local.png +0 -0
  2565. psychopy/tests/data/text1_normHexbackground.png +0 -0
  2566. psychopy/tests/data/text1_normHexbackground_local.png +0 -0
  2567. psychopy/tests/data/text1_normNoShade.png +0 -0
  2568. psychopy/tests/data/text1_norm_local.png +0 -0
  2569. psychopy/tests/data/text1_pix.png +0 -0
  2570. psychopy/tests/data/text1_stencil.png +0 -0
  2571. psychopy/tests/data/text2_cm.png +0 -0
  2572. psychopy/tests/data/text2_deg.png +0 -0
  2573. psychopy/tests/data/text2_degFlat.png +0 -0
  2574. psychopy/tests/data/text2_degFlatPos.png +0 -0
  2575. psychopy/tests/data/text2_height.png +0 -0
  2576. psychopy/tests/data/text2_norm.png +0 -0
  2577. psychopy/tests/data/text2_normNoShade.png +0 -0
  2578. psychopy/tests/data/text2_pix.png +0 -0
  2579. psychopy/tests/data/text2_stencil.png +0 -0
  2580. psychopy/tests/data/textbox_charcolors_default_roygbiv.png +0 -0
  2581. psychopy/tests/data/textbox_charcolors_default_white_hello_black_there.png +0 -0
  2582. psychopy/tests/data/textbox_default_align_bottom_center.png +0 -0
  2583. psychopy/tests/data/textbox_default_align_bottom_left.png +0 -0
  2584. psychopy/tests/data/textbox_default_align_bottom_right.png +0 -0
  2585. psychopy/tests/data/textbox_default_align_center.png +0 -0
  2586. psychopy/tests/data/textbox_default_align_center_center.png +0 -0
  2587. psychopy/tests/data/textbox_default_align_center_left.png +0 -0
  2588. psychopy/tests/data/textbox_default_align_center_right.png +0 -0
  2589. psychopy/tests/data/textbox_default_align_centre.png +0 -0
  2590. psychopy/tests/data/textbox_default_align_centre_centre.png +0 -0
  2591. psychopy/tests/data/textbox_default_align_more_than_two_words.png +0 -0
  2592. psychopy/tests/data/textbox_default_align_someword.png +0 -0
  2593. psychopy/tests/data/textbox_default_align_top_center.png +0 -0
  2594. psychopy/tests/data/textbox_default_align_top_left.png +0 -0
  2595. psychopy/tests/data/textbox_default_align_top_right.png +0 -0
  2596. psychopy/tests/data/textbox_default_colors_WOB.png +0 -0
  2597. psychopy/tests/data/textbox_default_colors_exemplar1.png +0 -0
  2598. psychopy/tests/data/textbox_default_colors_exemplar2.png +0 -0
  2599. psychopy/tests/data/textbox_default_colors_exemplar3.png +0 -0
  2600. psychopy/tests/data/textbox_default_colors_tyke1.png +0 -0
  2601. psychopy/tests/data/textbox_default_colors_tyke2.png +0 -0
  2602. psychopy/tests/data/textbox_default_colors_tyke3.png +0 -0
  2603. psychopy/tests/data/textbox_default_cutoff_top.png +0 -0
  2604. psychopy/tests/data/textbox_default_exemplar_1.png +0 -0
  2605. psychopy/tests/data/textbox_default_exemplar_2.png +0 -0
  2606. psychopy/tests/data/textbox_default_exemplar_3.png +0 -0
  2607. psychopy/tests/data/textbox_default_exemplar_4.png +0 -0
  2608. psychopy/tests/data/textbox_default_tyke_1.png +0 -0
  2609. psychopy/tests/data/textbox_default_tyke_2.png +0 -0
  2610. psychopy/tests/data/textbox_typing_blank.png +0 -0
  2611. psychopy/tests/data/textbox_typing_longKoeran.png +0 -0
  2612. psychopy/tests/data/textbox_typing_longWord.png +0 -0
  2613. psychopy/tests/data/textbox_typing_navDel.png +0 -0
  2614. psychopy/tests/data/textbox_typing_navLR.png +0 -0
  2615. psychopy/tests/data/textbox_typing_newline.png +0 -0
  2616. psychopy/tests/data/textbox_typing_pangram.png +0 -0
  2617. psychopy/tests/data/textbox_uax14_align_bottom_center.png +0 -0
  2618. psychopy/tests/data/textbox_uax14_align_bottom_left.png +0 -0
  2619. psychopy/tests/data/textbox_uax14_align_bottom_right.png +0 -0
  2620. psychopy/tests/data/textbox_uax14_align_center.png +0 -0
  2621. psychopy/tests/data/textbox_uax14_align_center_center.png +0 -0
  2622. psychopy/tests/data/textbox_uax14_align_center_left.png +0 -0
  2623. psychopy/tests/data/textbox_uax14_align_center_right.png +0 -0
  2624. psychopy/tests/data/textbox_uax14_align_centre.png +0 -0
  2625. psychopy/tests/data/textbox_uax14_align_centre_centre.png +0 -0
  2626. psychopy/tests/data/textbox_uax14_align_more_than_two_words.png +0 -0
  2627. psychopy/tests/data/textbox_uax14_align_someword.png +0 -0
  2628. psychopy/tests/data/textbox_uax14_align_top_center.png +0 -0
  2629. psychopy/tests/data/textbox_uax14_align_top_left.png +0 -0
  2630. psychopy/tests/data/textbox_uax14_align_top_right.png +0 -0
  2631. psychopy/tests/data/textbox_uax14_colors_WOB.png +0 -0
  2632. psychopy/tests/data/textbox_uax14_colors_exemplar1.png +0 -0
  2633. psychopy/tests/data/textbox_uax14_colors_exemplar2.png +0 -0
  2634. psychopy/tests/data/textbox_uax14_colors_exemplar3.png +0 -0
  2635. psychopy/tests/data/textbox_uax14_colors_tyke1.png +0 -0
  2636. psychopy/tests/data/textbox_uax14_colors_tyke2.png +0 -0
  2637. psychopy/tests/data/textbox_uax14_colors_tyke3.png +0 -0
  2638. psychopy/tests/data/textbox_uax14_cutoff_top.png +0 -0
  2639. psychopy/tests/data/textbox_uax14_exemplar_1.png +0 -0
  2640. psychopy/tests/data/textbox_uax14_exemplar_2.png +0 -0
  2641. psychopy/tests/data/textbox_uax14_exemplar_3.png +0 -0
  2642. psychopy/tests/data/textbox_uax14_exemplar_4.png +0 -0
  2643. psychopy/tests/data/textbox_uax14_tyke_1.png +0 -0
  2644. psychopy/tests/data/textbox_uax14_tyke_2.png +0 -0
  2645. psychopy/tests/data/trialTypes.csv +1 -0
  2646. psychopy/tests/data/trialTypes.docx +0 -0
  2647. psychopy/tests/data/trialTypes.pkl +0 -0
  2648. psychopy/tests/data/trialTypes.tsv +7 -0
  2649. psychopy/tests/data/trialTypes.xls +0 -0
  2650. psychopy/tests/data/trialTypes.xlsx +0 -0
  2651. psychopy/tests/data/trialTypes_eu.csv +7 -0
  2652. psychopy/tests/data/trialsBlankCols.xlsx +0 -0
  2653. psychopy/tests/data/wedge1_cm.png +0 -0
  2654. psychopy/tests/data/wedge1_deg.png +0 -0
  2655. psychopy/tests/data/wedge1_degFlat.png +0 -0
  2656. psychopy/tests/data/wedge1_degFlatPos.png +0 -0
  2657. psychopy/tests/data/wedge1_height.png +0 -0
  2658. psychopy/tests/data/wedge1_norm.png +0 -0
  2659. psychopy/tests/data/wedge1_normAddBlend.png +0 -0
  2660. psychopy/tests/data/wedge1_normAddBlend_local.png +0 -0
  2661. psychopy/tests/data/wedge1_normHexbackground.png +0 -0
  2662. psychopy/tests/data/wedge1_normHexbackground_local.png +0 -0
  2663. psychopy/tests/data/wedge1_normNoShade.png +0 -0
  2664. psychopy/tests/data/wedge1_norm_local.png +0 -0
  2665. psychopy/tests/data/wedge1_pix.png +0 -0
  2666. psychopy/tests/data/wedge1_stencil.png +0 -0
  2667. psychopy/tests/data/wedge2_cm.png +0 -0
  2668. psychopy/tests/data/wedge2_deg.png +0 -0
  2669. psychopy/tests/data/wedge2_degFlat.png +0 -0
  2670. psychopy/tests/data/wedge2_degFlatPos.png +0 -0
  2671. psychopy/tests/data/wedge2_height.png +0 -0
  2672. psychopy/tests/data/wedge2_norm.png +0 -0
  2673. psychopy/tests/data/wedge2_normAddBlend.png +0 -0
  2674. psychopy/tests/data/wedge2_normHexbackground.png +0 -0
  2675. psychopy/tests/data/wedge2_normNoShade.png +0 -0
  2676. psychopy/tests/data/wedge2_pix.png +0 -0
  2677. psychopy/tests/data/wedge2_stencil.png +0 -0
  2678. psychopy/tests/data/winScalePos_ori0_scale-1_-1_pos-0.4_0.png +0 -0
  2679. psychopy/tests/data/winScalePos_ori0_scale-1_-1_pos0_0.png +0 -0
  2680. psychopy/tests/data/winScalePos_ori0_scale-1_1_pos-0.4_0.png +0 -0
  2681. psychopy/tests/data/winScalePos_ori0_scale-1_1_pos0_0.png +0 -0
  2682. psychopy/tests/data/winScalePos_ori0_scale-2_-2_pos-0.4_0.png +0 -0
  2683. psychopy/tests/data/winScalePos_ori0_scale-2_-2_pos0_0.png +0 -0
  2684. psychopy/tests/data/winScalePos_ori0_scale-2_2_pos-0.4_0.png +0 -0
  2685. psychopy/tests/data/winScalePos_ori0_scale-2_2_pos0_0.png +0 -0
  2686. psychopy/tests/data/winScalePos_ori0_scale1_-1_pos-0.4_0.png +0 -0
  2687. psychopy/tests/data/winScalePos_ori0_scale1_-1_pos0_0.png +0 -0
  2688. psychopy/tests/data/winScalePos_ori0_scale1_1_pos-0.4_0.png +0 -0
  2689. psychopy/tests/data/winScalePos_ori0_scale1_1_pos0_0.png +0 -0
  2690. psychopy/tests/data/winScalePos_ori0_scale2_-2_pos-0.4_0.png +0 -0
  2691. psychopy/tests/data/winScalePos_ori0_scale2_-2_pos0_0.png +0 -0
  2692. psychopy/tests/data/winScalePos_ori0_scale2_2_pos-0.4_0.png +0 -0
  2693. psychopy/tests/data/winScalePos_ori0_scale2_2_pos0_0.png +0 -0
  2694. psychopy/tests/data/winScalePos_ori45_scale-1_-1_pos0_0.png +0 -0
  2695. psychopy/tests/data/winScalePos_ori45_scale-1_1_pos0_0.png +0 -0
  2696. psychopy/tests/data/winScalePos_ori45_scale-2_-2_pos0_0.png +0 -0
  2697. psychopy/tests/data/winScalePos_ori45_scale-2_2_pos0_0.png +0 -0
  2698. psychopy/tests/data/winScalePos_ori45_scale1_-1_pos0_0.png +0 -0
  2699. psychopy/tests/data/winScalePos_ori45_scale1_1_pos0_0.png +0 -0
  2700. psychopy/tests/data/winScalePos_ori45_scale2_-2_pos0_0.png +0 -0
  2701. psychopy/tests/data/winScalePos_ori45_scale2_2_pos0_0.png +0 -0
  2702. psychopy/tests/doc/run_btn.png +0 -0
  2703. psychopy/tests/doc/test-suite-bugs.jpg +0 -0
  2704. psychopy/tests/doc/user-bugs.jpg +0 -0
  2705. psychopy/tests/dummy_xorg.conf +21 -0
  2706. psychopy/tests/run.py +50 -0
  2707. psychopy/tests/test_Installation.py +38 -0
  2708. psychopy/tests/test_alerts/test_alerts.py +37 -0
  2709. psychopy/tests/test_alerts/test_alerttools.py +131 -0
  2710. psychopy/tests/test_app/__init__.py +0 -0
  2711. psychopy/tests/test_app/conftest.py +41 -0
  2712. psychopy/tests/test_app/test_builder/__init__.py +0 -0
  2713. psychopy/tests/test_app/test_builder/test_BuilderFrame.py +151 -0
  2714. psychopy/tests/test_app/test_builder/test_CompileFromBuilder.py +135 -0
  2715. psychopy/tests/test_app/test_builder/test_ComponentDialogs.py +98 -0
  2716. psychopy/tests/test_app/test_runner/__init__.py +0 -0
  2717. psychopy/tests/test_app/test_runner/test_RunnerFrame.py +166 -0
  2718. psychopy/tests/test_app/test_speed.py +144 -0
  2719. psychopy/tests/test_app/test_themes/test_icons.py +79 -0
  2720. psychopy/tests/test_codecov.py +29 -0
  2721. psychopy/tests/test_colors/test_Color.py +41 -0
  2722. psychopy/tests/test_data/dataPrev.xlsx +0 -0
  2723. psychopy/tests/test_data/test_ExperimentHandler.py +171 -0
  2724. psychopy/tests/test_data/test_MultiStairHandler.py +174 -0
  2725. psychopy/tests/test_data/test_StairHandlers.py +1241 -0
  2726. psychopy/tests/test_data/test_TrialHandler.py +335 -0
  2727. psychopy/tests/test_data/test_TrialHandler2.py +408 -0
  2728. psychopy/tests/test_data/test_TrialHandlerExt.py +359 -0
  2729. psychopy/tests/test_data/test_fitFunctions.py +101 -0
  2730. psychopy/tests/test_data/test_utils.py +169 -0
  2731. psychopy/tests/test_data/test_xlsx.py +92 -0
  2732. psychopy/tests/test_demos/test_builder_demos.py +52 -0
  2733. psychopy/tests/test_experiment/__init__.py +0 -0
  2734. psychopy/tests/test_experiment/known_py_diffs.txt +47 -0
  2735. psychopy/tests/test_experiment/needs_wx/__init__.py +0 -0
  2736. psychopy/tests/test_experiment/needs_wx/componsTemplate.txt +13730 -0
  2737. psychopy/tests/test_experiment/needs_wx/genComponsTemplate.py +130 -0
  2738. psychopy/tests/test_experiment/needs_wx/test_Experiment.py +406 -0
  2739. psychopy/tests/test_experiment/needs_wx/test_components.py +170 -0
  2740. psychopy/tests/test_experiment/test_component_compile_js.py +59 -0
  2741. psychopy/tests/test_experiment/test_component_compile_python.py +165 -0
  2742. psychopy/tests/test_experiment/test_components/__init__.py +1 -0
  2743. psychopy/tests/test_experiment/test_components/test_ButtonBox.py +216 -0
  2744. psychopy/tests/test_experiment/test_components/test_Code.py +82 -0
  2745. psychopy/tests/test_experiment/test_components/test_Image.py +24 -0
  2746. psychopy/tests/test_experiment/test_components/test_Mouse.py +149 -0
  2747. psychopy/tests/test_experiment/test_components/test_Polygon.py +81 -0
  2748. psychopy/tests/test_experiment/test_components/test_ResourceManager.py +60 -0
  2749. psychopy/tests/test_experiment/test_components/test_Settings.py +82 -0
  2750. psychopy/tests/test_experiment/test_components/test_Static.py +60 -0
  2751. psychopy/tests/test_experiment/test_components/test_all_components.py +162 -0
  2752. psychopy/tests/test_experiment/test_components/test_base_components.py +323 -0
  2753. psychopy/tests/test_experiment/test_experiment.py +103 -0
  2754. psychopy/tests/test_experiment/test_loops.py +95 -0
  2755. psychopy/tests/test_experiment/test_params.py +350 -0
  2756. psychopy/tests/test_experiment/test_py2js.py +230 -0
  2757. psychopy/tests/test_experiment/test_routines/__init__.py +1 -0
  2758. psychopy/tests/test_experiment/test_routines/test_EyetrackerCalibrationRoutine.py +9 -0
  2759. psychopy/tests/test_experiment/test_routines/test_PhotodiodeValidationRoutine.py +9 -0
  2760. psychopy/tests/test_experiment/test_routines/test_all_routines.py +23 -0
  2761. psychopy/tests/test_experiment/test_routines/test_base_routine.py +154 -0
  2762. psychopy/tests/test_experiment/test_routines/test_standalone_routines.py +36 -0
  2763. psychopy/tests/test_gui/test_DlgFromDictQt.py +82 -0
  2764. psychopy/tests/test_gui/test_DlgFromDictWx.py +82 -0
  2765. psychopy/tests/test_hardware/__init__.py +0 -0
  2766. psychopy/tests/test_hardware/test_CRS_BitsSharp.py +67 -0
  2767. psychopy/tests/test_hardware/test_CRS_bitsShaders.py +110 -0
  2768. psychopy/tests/test_hardware/test_device_manager.py +36 -0
  2769. psychopy/tests/test_hardware/test_emulator.py +106 -0
  2770. psychopy/tests/test_hardware/test_gammasci.py +35 -0
  2771. psychopy/tests/test_hardware/test_keyboard.py +73 -0
  2772. psychopy/tests/test_hardware/test_keyboard_events.py +362 -0
  2773. psychopy/tests/test_hardware/test_ports.py +151 -0
  2774. psychopy/tests/test_iohub/__init__.py +1 -0
  2775. psychopy/tests/test_iohub/test_computer.py +124 -0
  2776. psychopy/tests/test_iohub/test_event_get_and_clear.py +94 -0
  2777. psychopy/tests/test_iohub/test_keyboard.py +91 -0
  2778. psychopy/tests/test_iohub/test_launch.py +19 -0
  2779. psychopy/tests/test_iohub/testutil.py +54 -0
  2780. psychopy/tests/test_liaison/test_Liaison.py +228 -0
  2781. psychopy/tests/test_misc/__init__.py +0 -0
  2782. psychopy/tests/test_misc/memory_usage.py +164 -0
  2783. psychopy/tests/test_misc/test_GammaFun.py +15 -0
  2784. psychopy/tests/test_misc/test_clock.py +61 -0
  2785. psychopy/tests/test_misc/test_color.py +203 -0
  2786. psychopy/tests/test_misc/test_core.py +446 -0
  2787. psychopy/tests/test_misc/test_event.py +307 -0
  2788. psychopy/tests/test_misc/test_info.py +18 -0
  2789. psychopy/tests/test_misc/test_layout.py +49 -0
  2790. psychopy/tests/test_misc/test_locale.py +38 -0
  2791. psychopy/tests/test_misc/test_web.py +22 -0
  2792. psychopy/tests/test_monitors/test_monitors.py +91 -0
  2793. psychopy/tests/test_preferences/__init__.py +0 -0
  2794. psychopy/tests/test_preferences/test_prefs.py +28 -0
  2795. psychopy/tests/test_session/test_Session.py +253 -0
  2796. psychopy/tests/test_sound/__init__.py +0 -0
  2797. psychopy/tests/test_sound/test_audioclip.py +331 -0
  2798. psychopy/tests/test_sound/test_hamming.py +45 -0
  2799. psychopy/tests/test_sound/test_microphone.py +217 -0
  2800. psychopy/tests/test_sound/test_sound.py +67 -0
  2801. psychopy/tests/test_sound/test_sound_pygame.py +67 -0
  2802. psychopy/tests/test_tools/test_animationtools.py +51 -0
  2803. psychopy/tests/test_tools/test_arraytools.py +130 -0
  2804. psychopy/tests/test_tools/test_attributetools.py +257 -0
  2805. psychopy/tests/test_tools/test_colorspacetools.py +149 -0
  2806. psychopy/tests/test_tools/test_environmenttools.py +52 -0
  2807. psychopy/tests/test_tools/test_fileerrortools.py +97 -0
  2808. psychopy/tests/test_tools/test_filetools.py +104 -0
  2809. psychopy/tests/test_tools/test_imagetools.py +57 -0
  2810. psychopy/tests/test_tools/test_mathtools.py +688 -0
  2811. psychopy/tests/test_tools/test_stringtools.py +143 -0
  2812. psychopy/tests/test_tools/test_versionchooser.py +178 -0
  2813. psychopy/tests/test_tools/test_viewtools.py +67 -0
  2814. psychopy/tests/test_visual/__init__.py +0 -0
  2815. psychopy/tests/test_visual/measure_parity.py +243 -0
  2816. psychopy/tests/test_visual/test_all_stimuli.py +752 -0
  2817. psychopy/tests/test_visual/test_basevisual.py +534 -0
  2818. psychopy/tests/test_visual/test_brush.py +68 -0
  2819. psychopy/tests/test_visual/test_button.py +15 -0
  2820. psychopy/tests/test_visual/test_circle.py +66 -0
  2821. psychopy/tests/test_visual/test_contains_overlaps.py +242 -0
  2822. psychopy/tests/test_visual/test_custommouse.py +47 -0
  2823. psychopy/tests/test_visual/test_dots.py +155 -0
  2824. psychopy/tests/test_visual/test_form.py +414 -0
  2825. psychopy/tests/test_visual/test_framepacking.py +41 -0
  2826. psychopy/tests/test_visual/test_gamma.py +152 -0
  2827. psychopy/tests/test_visual/test_glfw_backend.py +14 -0
  2828. psychopy/tests/test_visual/test_image.py +218 -0
  2829. psychopy/tests/test_visual/test_panorama.py +41 -0
  2830. psychopy/tests/test_visual/test_progress.py +96 -0
  2831. psychopy/tests/test_visual/test_projections.py +215 -0
  2832. psychopy/tests/test_visual/test_projections_interactive.py +163 -0
  2833. psychopy/tests/test_visual/test_ratingScale.py +299 -0
  2834. psychopy/tests/test_visual/test_roi.py +99 -0
  2835. psychopy/tests/test_visual/test_shape.py +23 -0
  2836. psychopy/tests/test_visual/test_slider.py +328 -0
  2837. psychopy/tests/test_visual/test_target.py +35 -0
  2838. psychopy/tests/test_visual/test_textbox.py +474 -0
  2839. psychopy/tests/test_visual/test_winFlipTiming.py +95 -0
  2840. psychopy/tests/test_visual/test_winScalePos.py +77 -0
  2841. psychopy/tests/test_visual/test_window.py +107 -0
  2842. psychopy/tests/utils.py +318 -0
  2843. psychopy/tools/LineBreak.txt +3597 -0
  2844. psychopy/tools/__init__.py +9 -0
  2845. psychopy/tools/animationtools.py +49 -0
  2846. psychopy/tools/apptools.py +32 -0
  2847. psychopy/tools/arraytools.py +514 -0
  2848. psychopy/tools/attributetools.py +205 -0
  2849. psychopy/tools/audiotools.py +358 -0
  2850. psychopy/tools/colorspacetools.py +715 -0
  2851. psychopy/tools/coordinatetools.py +104 -0
  2852. psychopy/tools/environmenttools.py +62 -0
  2853. psychopy/tools/fileerrortools.py +54 -0
  2854. psychopy/tools/filetools.py +406 -0
  2855. psychopy/tools/fontmanager.py +1041 -0
  2856. psychopy/tools/gltools.py +4959 -0
  2857. psychopy/tools/imagetools.py +65 -0
  2858. psychopy/tools/linebreak.py +322 -0
  2859. psychopy/tools/mathtools.py +4040 -0
  2860. psychopy/tools/monitorunittools.py +270 -0
  2861. psychopy/tools/movietools.py +1071 -0
  2862. psychopy/tools/pkgtools.py +601 -0
  2863. psychopy/tools/plottools.py +25 -0
  2864. psychopy/tools/rifttools.py +76 -0
  2865. psychopy/tools/stereotools.py +9 -0
  2866. psychopy/tools/stimulustools.py +28 -0
  2867. psychopy/tools/stringtools.py +421 -0
  2868. psychopy/tools/systemtools.py +1331 -0
  2869. psychopy/tools/typetools.py +52 -0
  2870. psychopy/tools/unittools.py +16 -0
  2871. psychopy/tools/versionchooser.py +602 -0
  2872. psychopy/tools/viewtools.py +1084 -0
  2873. psychopy/tools/wizard.py +804 -0
  2874. psychopy/visual/__init__.py +124 -0
  2875. psychopy/visual/aperture.py +330 -0
  2876. psychopy/visual/backends/__init__.py +77 -0
  2877. psychopy/visual/backends/_base.py +481 -0
  2878. psychopy/visual/backends/gamma.py +349 -0
  2879. psychopy/visual/backends/glfwbackend.py +28 -0
  2880. psychopy/visual/backends/pygamebackend.py +343 -0
  2881. psychopy/visual/backends/pygletbackend.py +920 -0
  2882. psychopy/visual/basevisual.py +1952 -0
  2883. psychopy/visual/brush.py +204 -0
  2884. psychopy/visual/bufferimage.py +231 -0
  2885. psychopy/visual/button.py +206 -0
  2886. psychopy/visual/circle.py +173 -0
  2887. psychopy/visual/custommouse.py +263 -0
  2888. psychopy/visual/dot.py +668 -0
  2889. psychopy/visual/dropdown.py +165 -0
  2890. psychopy/visual/elementarray.py +728 -0
  2891. psychopy/visual/filters.py +419 -0
  2892. psychopy/visual/form.py +1180 -0
  2893. psychopy/visual/globalVars.py +24 -0
  2894. psychopy/visual/grating.py +501 -0
  2895. psychopy/visual/helpers.py +334 -0
  2896. psychopy/visual/image.py +440 -0
  2897. psychopy/visual/line.py +238 -0
  2898. psychopy/visual/movie.py +12 -0
  2899. psychopy/visual/movie2.py +829 -0
  2900. psychopy/visual/movie3.py +599 -0
  2901. psychopy/visual/movies/__init__.py +850 -0
  2902. psychopy/visual/movies/frame.py +255 -0
  2903. psychopy/visual/movies/metadata.py +242 -0
  2904. psychopy/visual/movies/players/__init__.py +62 -0
  2905. psychopy/visual/movies/players/_base.py +364 -0
  2906. psychopy/visual/movies/players/ffpyplayer_player.py +1399 -0
  2907. psychopy/visual/nnlvs.py +827 -0
  2908. psychopy/visual/noise.py +34 -0
  2909. psychopy/visual/panorama.py +313 -0
  2910. psychopy/visual/patch.py +29 -0
  2911. psychopy/visual/pie.py +248 -0
  2912. psychopy/visual/polygon.py +229 -0
  2913. psychopy/visual/progress.py +313 -0
  2914. psychopy/visual/radial.py +33 -0
  2915. psychopy/visual/ratingscale.py +1424 -0
  2916. psychopy/visual/rect.py +204 -0
  2917. psychopy/visual/rift.py +2654 -0
  2918. psychopy/visual/roi.py +141 -0
  2919. psychopy/visual/secondorder.py +29 -0
  2920. psychopy/visual/shaders.py +453 -0
  2921. psychopy/visual/shape.py +701 -0
  2922. psychopy/visual/simpleimage.py +303 -0
  2923. psychopy/visual/slider.py +1169 -0
  2924. psychopy/visual/stim3d.py +2712 -0
  2925. psychopy/visual/target.py +278 -0
  2926. psychopy/visual/text.py +759 -0
  2927. psychopy/visual/textbox/__init__.py +1280 -0
  2928. psychopy/visual/textbox/fontmanager.py +574 -0
  2929. psychopy/visual/textbox/parsedtext.py +317 -0
  2930. psychopy/visual/textbox/textgrid.py +278 -0
  2931. psychopy/visual/textbox/textureatlas.py +248 -0
  2932. psychopy/visual/textbox2/__init__.py +4 -0
  2933. psychopy/visual/textbox2/textbox2.py +1817 -0
  2934. psychopy/visual/vlcmoviestim.py +1294 -0
  2935. psychopy/visual/window.py +3706 -0
  2936. psychopy/visual/windowframepack.py +86 -0
  2937. psychopy/visual/windowwarp.py +457 -0
  2938. psychopy/voicekey/__init__.py +684 -0
  2939. psychopy/voicekey/demo_vks.py +12 -0
  2940. psychopy/voicekey/labjack_vks.py +50 -0
  2941. psychopy/voicekey/parallel_vks.py +44 -0
  2942. psychopy/voicekey/signal.py +42 -0
  2943. psychopy/voicekey/vk_tools.py +280 -0
  2944. psychopy/web.py +286 -0
  2945. psychopy-2024.1.0.dist-info/METADATA +154 -0
  2946. psychopy-2024.1.0.dist-info/RECORD +2950 -0
  2947. psychopy-2024.1.0.dist-info/WHEEL +4 -0
  2948. psychopy-2024.1.0.dist-info/entry_points.txt +3 -0
  2949. psychopy-2024.1.0.dist-info/licenses/AUTHORS.md +138 -0
  2950. psychopy-2024.1.0.dist-info/licenses/LICENSE +674 -0
@@ -0,0 +1,3086 @@
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 = "PsychoPy Coder (v{})".format(self.app.version)
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.NewId()
1344
+ self.outputMenuID2 = wx.NewId()
1345
+ self.outputMenuID3 = wx.NewId()
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.NewId(), "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
+ last = self.fileStatusLastChecked
1967
+ interval = self.fileStatusCheckInterval
1968
+ if time.time() - last > interval and not self.showingReloadDialog:
1969
+ if not self.expectedModTime(self.currentDoc):
1970
+ self.showingReloadDialog = True
1971
+ filename = os.path.basename(self.currentDoc.filename)
1972
+ msg = _translate("'%s' was modified outside of PsychoPy:\n\n"
1973
+ "Reload (without saving)?") % filename
1974
+ dlg = dialogs.MessageDialog(self, message=msg, type='Warning')
1975
+ if dlg.ShowModal() == wx.ID_YES:
1976
+ self.statusBar.SetStatusText(_translate('Reloading file'))
1977
+ self.fileReload(event,
1978
+ filename=self.currentDoc.filename,
1979
+ checkSave=False)
1980
+ self.showingReloadDialog = False
1981
+ self.statusBar.SetStatusText('')
1982
+ dlg.Destroy()
1983
+ self.fileStatusLastChecked = time.time()
1984
+ # Enable / disable save button
1985
+ self.ribbon.buttons['save'].Enable(self.currentDoc.UNSAVED)
1986
+ self.fileMenu.Enable(wx.ID_SAVE, self.currentDoc.UNSAVED)
1987
+
1988
+ def pageChanged(self, event):
1989
+ """Event called when the user switches between editor tabs."""
1990
+ old = event.GetOldSelection()
1991
+ # close any auto-complete or calltips when switching pages
1992
+ if old != wx.NOT_FOUND:
1993
+ oldPage = None
1994
+
1995
+ try: # last page was closed, this will raise and error
1996
+ oldPage = self.notebook.GetPage(old)
1997
+ except Exception:
1998
+ pass
1999
+
2000
+ if oldPage is not None:
2001
+ if hasattr(oldPage, 'CallTipActive'):
2002
+ if oldPage.CallTipActive():
2003
+ oldPage.CallTipCancel()
2004
+ oldPage.openBrackets = 0
2005
+ if hasattr(oldPage, 'AutoCompActive'):
2006
+ if oldPage.AutoCompActive():
2007
+ oldPage.AutoCompCancel()
2008
+
2009
+ new = event.GetSelection()
2010
+ self.currentDoc = self.notebook.GetPage(new)
2011
+ self.app.updateWindowMenu()
2012
+ self.setFileModified(self.currentDoc.UNSAVED)
2013
+ self.setTitle(title=self.winTitle, document=self.currentDoc.filename)
2014
+
2015
+ self.currentDoc.analyseScript()
2016
+
2017
+ fileType = self.currentDoc.getFileType()
2018
+ # enable run buttons if current file is a Python script
2019
+ if 'sendRunner' in self.ribbon.buttons:
2020
+ isExp = fileType == 'Python'
2021
+ self.ribbon.buttons['sendRunner'].Enable(isExp)
2022
+ self.ribbon.buttons['pilotRunner'].Enable(isExp)
2023
+
2024
+ self.statusBar.SetStatusText(fileType, 2)
2025
+
2026
+ # todo: reduce redundancy w.r.t OnIdle()
2027
+ if not self.expectedModTime(self.currentDoc):
2028
+ filename = os.path.basename(self.currentDoc.filename)
2029
+ msg = _translate("'%s' was modified outside of PsychoPy:\n\n"
2030
+ "Reload (without saving)?") % filename
2031
+ dlg = dialogs.MessageDialog(self, message=msg, type='Warning')
2032
+ if dlg.ShowModal() == wx.ID_YES:
2033
+ self.statusBar.SetStatusText(_translate('Reloading file'))
2034
+ self.fileReload(event,
2035
+ filename=self.currentDoc.filename,
2036
+ checkSave=False)
2037
+ self.setFileModified(False)
2038
+ self.statusBar.SetStatusText('')
2039
+ dlg.Destroy()
2040
+
2041
+ # def pluginManager(self, evt=None, value=True):
2042
+ # """Show the plugin manager frame."""
2043
+ # PluginManagerFrame(self).ShowModal()
2044
+
2045
+ def OnFindOpen(self, event):
2046
+ if not self.currentDoc:
2047
+ # don't do anything if there's no document to search
2048
+ return
2049
+ if self.findDlg is not None:
2050
+ # if find dlg already exists, show it and give it focus
2051
+ self.findDlg.Show()
2052
+ self.findDlg.Raise()
2053
+ self.findDlg.SetFocus()
2054
+ else:
2055
+ # if not, make one now
2056
+ win = wx.Window.FindFocus()
2057
+ self.findData.SetFindString(self.currentDoc.GetSelectedText())
2058
+ self.findDlg = wx.FindReplaceDialog(win, self.findData, "Find",
2059
+ wx.FR_NOWHOLEWORD)
2060
+ self.findDlg.Bind(wx.EVT_FIND_CLOSE, self.OnFindClose)
2061
+ self.findDlg.Show()
2062
+
2063
+ def OnFindNext(self, event):
2064
+ # find the next occurrence of text according to last find dialogue data
2065
+ if not self.findData.GetFindString():
2066
+ self.OnFindOpen(event)
2067
+ return
2068
+ self.currentDoc.DoFindNext(self.findData, self.findDlg)
2069
+ # if self.findDlg is not None:
2070
+ # self.OnFindClose(None)
2071
+
2072
+ def OnFindClose(self, event):
2073
+ self.findDlg = None
2074
+
2075
+ def OnFileHistory(self, evt=None):
2076
+ # get the file based on the menu ID
2077
+ fileNum = evt.GetId() - wx.ID_FILE1
2078
+ path = self.fileHistory.GetHistoryFile(fileNum)
2079
+ self.setCurrentDoc(path) # load the file
2080
+ # add it back to the history so it will be moved up the list
2081
+ self.fileHistory.AddFileToHistory(path)
2082
+
2083
+ def gotoLine(self, filename=None, line=0):
2084
+ # goto a specific line in a specific file and select all text in it
2085
+ self.setCurrentDoc(filename)
2086
+ self.currentDoc.EnsureVisible(line)
2087
+ self.currentDoc.GotoLine(line)
2088
+ endPos = self.currentDoc.GetCurrentPos()
2089
+
2090
+ self.currentDoc.GotoLine(line - 1)
2091
+ stPos = self.currentDoc.GetCurrentPos()
2092
+
2093
+ self.currentDoc.SetSelection(stPos, endPos)
2094
+
2095
+ def getOpenFilenames(self):
2096
+ """Return the full filename of each open tab"""
2097
+ names = []
2098
+ for ii in range(self.notebook.GetPageCount()):
2099
+ names.append(self.notebook.GetPage(ii).filename)
2100
+ return names
2101
+
2102
+ def quit(self, event):
2103
+ self.app.quit()
2104
+
2105
+ def checkSave(self):
2106
+ """Loop through all open files checking whether they need save
2107
+ """
2108
+ for ii in range(self.notebook.GetPageCount()):
2109
+ doc = self.notebook.GetPage(ii)
2110
+ filename = doc.filename
2111
+ if doc.UNSAVED:
2112
+ self.notebook.SetSelection(ii) # fetch that page and show it
2113
+ # make sure frame is at front
2114
+ self.Show(True)
2115
+ self.Raise()
2116
+ self.app.SetTopWindow(self)
2117
+ # then bring up dialog
2118
+ msg = _translate('Save changes to %s before quitting?')
2119
+ dlg = dialogs.MessageDialog(self, message=msg % filename,
2120
+ type='Warning')
2121
+ resp = dlg.ShowModal()
2122
+ sys.stdout.flush()
2123
+ dlg.Destroy()
2124
+ if resp == wx.ID_CANCEL:
2125
+ return 0 # return, don't quit
2126
+ elif resp == wx.ID_YES:
2127
+ self.fileSave() # save then quit
2128
+ elif resp == wx.ID_NO:
2129
+ pass # don't save just quit
2130
+ return 1
2131
+
2132
+ def closeFrame(self, event=None, checkSave=True):
2133
+ """Close open windows, update prefs.appData (but don't save)
2134
+ and either close the frame or hide it
2135
+ """
2136
+ if (len(self.app.getAllFrames(frameType="builder")) == 0
2137
+ and len(self.app.getAllFrames(frameType="runner")) == 0
2138
+ and sys.platform != 'darwin'):
2139
+ if not self.app.quitting:
2140
+ # send the event so it can be vetoed if needed
2141
+ self.app.quit(event)
2142
+ return # app.quit() will have closed the frame already
2143
+
2144
+ # check all files before initiating close of any
2145
+ if checkSave and self.checkSave() == 0:
2146
+ return 0 # this signals user cancelled
2147
+
2148
+ wasShown = self.IsShown()
2149
+ self.Hide() # ugly to see it close all the files independently
2150
+
2151
+ # store current appData
2152
+ self.appData['prevFiles'] = []
2153
+ currFiles = self.getOpenFilenames()
2154
+ for thisFileName in currFiles:
2155
+ self.appData['prevFiles'].append(thisFileName)
2156
+ # get size and window layout info
2157
+ if self.IsIconized():
2158
+ self.Iconize(False) # will return to normal mode to get size info
2159
+ self.appData['state'] = 'normal'
2160
+ elif self.IsMaximized():
2161
+ # will briefly return to normal mode to get size info
2162
+ self.Maximize(False)
2163
+ self.appData['state'] = 'maxim'
2164
+ else:
2165
+ self.appData['state'] = 'normal'
2166
+ self.appData['auiPerspective'] = self.paneManager.SavePerspective()
2167
+ self.appData['winW'], self.appData['winH'] = self.GetSize()
2168
+ self.appData['winX'], self.appData['winY'] = self.GetPosition()
2169
+ if sys.platform == 'darwin':
2170
+ # for some reason mac wxpython <=2.8 gets this wrong (toolbar?)
2171
+ self.appData['winH'] -= 39
2172
+ self.appData['fileHistory'] = []
2173
+ for ii in range(self.fileHistory.GetCount()):
2174
+ self.appData['fileHistory'].append(
2175
+ self.fileHistory.GetHistoryFile(ii))
2176
+
2177
+ # as of wx3.0 the AUI manager needs to be uninitialised explicitly
2178
+ self.paneManager.UnInit()
2179
+
2180
+ self.app.forgetFrame(self)
2181
+ self.Destroy()
2182
+ self.app.coder = None
2183
+ self.app.updateWindowMenu()
2184
+
2185
+ def filePrint(self, event=None):
2186
+ pr = Printer()
2187
+ docName = self.currentDoc.filename
2188
+ text = codecs.open(docName, 'r', 'utf-8').read()
2189
+ pr.Print(text, docName)
2190
+
2191
+ def fileNew(self, event=None, filepath=""):
2192
+ self.setCurrentDoc(filepath)
2193
+
2194
+ def fileReload(self, event, filename=None, checkSave=False):
2195
+ if filename is None:
2196
+ return # should raise an exception
2197
+
2198
+ docId = self.findDocID(filename)
2199
+ if docId == -1:
2200
+ return
2201
+ doc = self.notebook.GetPage(docId)
2202
+
2203
+ # is the file still there
2204
+ if os.path.isfile(filename):
2205
+ with io.open(filename, 'r', encoding='utf-8-sig') as f:
2206
+ doc.SetText(f.read())
2207
+ doc.fileModTime = os.path.getmtime(filename)
2208
+ doc.EmptyUndoBuffer()
2209
+ doc.Colourise(0, -1)
2210
+ doc.UNSAVED = False
2211
+ else:
2212
+ # file was removed after we found the changes, lets
2213
+ # give the user a chance to save his file.
2214
+ self.UNSAVED = True
2215
+
2216
+ if doc == self.currentDoc:
2217
+ # Enable / disable save button
2218
+ self.ribbon.buttons['save'].Enable(self.currentDoc.UNSAVED)
2219
+ self.fileMenu.Enable(wx.ID_SAVE, self.currentDoc.UNSAVED)
2220
+
2221
+ self.currentDoc.analyseScript()
2222
+
2223
+ @property
2224
+ def filename(self):
2225
+ if self.currentDoc:
2226
+ return self.currentDoc.filename
2227
+
2228
+ def findDocID(self, filename):
2229
+ # find the ID of the current doc
2230
+ for ii in range(self.notebook.GetPageCount()):
2231
+ if self.notebook.GetPage(ii).filename == filename:
2232
+ return ii
2233
+ return -1
2234
+
2235
+ def setCurrentDoc(self, filename, keepHidden=False):
2236
+ # check if this file is already open
2237
+ docID = self.findDocID(filename)
2238
+ readOnlyPref = 'readonly' in self.app.prefs.coder
2239
+ readonly = readOnlyPref and self.app.prefs.coder['readonly']
2240
+ path, shortName = os.path.split(filename)
2241
+ if docID >= 0:
2242
+ self.currentDoc = self.notebook.GetPage(docID)
2243
+ self.notebook.SetSelection(docID)
2244
+ else: # create new page and load document
2245
+ # if there is only a placeholder document then close it
2246
+ if len(self.getOpenFilenames()) == 1:
2247
+ if (len(self.currentDoc.GetText()) == 0 and
2248
+ self.currentDoc.filename.startswith('untitled')):
2249
+ self.fileClose(self.currentDoc.filename)
2250
+
2251
+ # load text from document
2252
+ if os.path.isfile(filename):
2253
+ try:
2254
+ with io.open(filename, 'r', encoding='utf-8-sig') as f:
2255
+ fileText = f.read()
2256
+ newlines = f.newlines
2257
+ except UnicodeDecodeError:
2258
+ dlg = dialogs.MessageDialog(self, message=_translate(
2259
+ 'Failed to open `{}`. Make sure that encoding of '
2260
+ 'the file is utf-8.').format(filename), type='Info')
2261
+ dlg.ShowModal()
2262
+ dlg.Destroy()
2263
+ return
2264
+ elif filename == '':
2265
+ pass # user requested a new document
2266
+ else:
2267
+ dlg = dialogs.MessageDialog(
2268
+ self,
2269
+ message='Failed to open {}. Not a file.'.format(filename),
2270
+ type='Info')
2271
+ dlg.ShowModal()
2272
+ dlg.Destroy()
2273
+ return # do nothing
2274
+
2275
+ # create an editor window to put the text in
2276
+ p = self.currentDoc = CodeEditor(self.notebook, -1, frame=self,
2277
+ readonly=readonly)
2278
+
2279
+ # load text
2280
+ if filename != '':
2281
+ # put the text in editor
2282
+ self.currentDoc.SetText(fileText)
2283
+ self.currentDoc.newlines = newlines
2284
+ del fileText # delete the buffer
2285
+ self.currentDoc.fileModTime = os.path.getmtime(filename)
2286
+ self.fileHistory.AddFileToHistory(filename)
2287
+ else:
2288
+ # set name for an untitled document
2289
+ filename = shortName = 'untitled.py'
2290
+ allFileNames = self.getOpenFilenames()
2291
+ n = 1
2292
+ while filename in allFileNames:
2293
+ filename = 'untitled%i.py' % n
2294
+ n += 1
2295
+
2296
+ # create modification time for in memory document
2297
+ self.currentDoc.fileModTime = time.time()
2298
+
2299
+ self.currentDoc.EmptyUndoBuffer()
2300
+
2301
+ self.notebook.AddPage(p, shortName)
2302
+ nbIndex = len(self.getOpenFilenames()) - 1
2303
+ if isinstance(self.notebook, wx.Notebook):
2304
+ self.notebook.ChangeSelection(nbIndex)
2305
+ elif isinstance(self.notebook, aui.AuiNotebook):
2306
+ self.notebook.SetSelection(nbIndex)
2307
+ self.currentDoc.filename = filename
2308
+ self.currentDoc.setLexerFromFileName() # chose the best lexer
2309
+ #self.currentDoc.cacheAutoComplete()
2310
+
2311
+ self.setFileModified(False)
2312
+ self.currentDoc.SetFocus()
2313
+
2314
+ fileType = self.currentDoc.getFileType()
2315
+
2316
+ # line wrapping
2317
+ self.currentDoc.SetWrapMode(
2318
+ wx.stc.STC_WRAP_WORD if self.lineWrapChk.IsChecked() else wx.stc.STC_WRAP_NONE)
2319
+ self.statusBar.SetStatusText(fileType, 2)
2320
+ fname = Path(self.currentDoc.filename).name
2321
+ self.setTitle(title=self.winTitle, document=fname)
2322
+ #if len(self.getOpenFilenames()) > 0:
2323
+ self.currentDoc.analyseScript()
2324
+ if os.path.isdir(path):
2325
+ self.fileBrowserWindow.gotoDir(path)
2326
+
2327
+ if not keepHidden:
2328
+ self.Show() # if the user had closed the frame it might be hidden
2329
+ if readonly:
2330
+ self.currentDoc.SetReadOnly(True)
2331
+ #self.currentDoc._applyAppTheme()
2332
+ isExp = filename.endswith(".py") or filename.endswith(".psyexp")
2333
+
2334
+ # if the toolbar is done then adjust buttons
2335
+ for key in ("sendRunner", "pilotRunner", "pyrun", "pypilot"):
2336
+ if key in self.ribbon.buttons:
2337
+ self.ribbon.buttons[key].Enable(isExp)
2338
+ # update save/saveas buttons
2339
+ self.ribbon.buttons['save'].Enable(readonly and self.currentDoc.UNSAVED)
2340
+ self.fileMenu.Enable(wx.ID_SAVE, readonly and self.currentDoc.UNSAVED)
2341
+ self.ribbon.buttons['saveas'].Enable(bool(self.filename))
2342
+ self.fileMenu.Enable(wx.ID_SAVEAS, bool(self.filename))
2343
+ # update menu items
2344
+ self.pavloviaMenu.syncBtn.Enable(bool(self.filename))
2345
+ self.pavloviaMenu.newBtn.Enable(bool(self.filename))
2346
+ self.app.updateWindowMenu()
2347
+ self.fileBrowserWindow.updateFileBrowser()
2348
+ # update pavlovia project
2349
+ self.project = pavlovia.getProject(self.currentDoc.filename)
2350
+ self.ribbon.buttons['pavproject'].updateInfo()
2351
+
2352
+ def fileOpen(self, event=None, filename=None):
2353
+ if not filename:
2354
+ # get path of current file (empty if current file is '')
2355
+ if hasattr(self.currentDoc, 'filename'):
2356
+ initPath = str(Path(self.currentDoc.filename).parent)
2357
+ else:
2358
+ initPath = ""
2359
+ # Open dlg
2360
+ dlg = wx.FileDialog(
2361
+ self, message=_translate("Open file ..."),
2362
+ defaultDir=initPath, style=wx.FD_OPEN
2363
+ )
2364
+
2365
+ if dlg.ShowModal() == wx.ID_OK:
2366
+ filename = dlg.GetPath()
2367
+ self.statusBar.SetStatusText(_translate('Loading file'))
2368
+ else:
2369
+ return -1
2370
+
2371
+ if filename and os.path.isfile(filename):
2372
+ if filename.lower().endswith('.psyexp'):
2373
+ self.app.newBuilderFrame(fileName=filename)
2374
+ else:
2375
+ self.setCurrentDoc(filename)
2376
+ # don't do the next step if no file was opened (hack!!)
2377
+ if self.notebook.GetPageCount() > 0:
2378
+ if self.notebook.GetCurrentPage().filename == filename:
2379
+ self.setFileModified(False)
2380
+
2381
+ self.statusBar.SetStatusText('')
2382
+
2383
+ # don't do this, this will add unwanted files to the task list - mdc
2384
+ # self.app.runner.addTask(fileName=filename)
2385
+
2386
+ def expectedModTime(self, doc):
2387
+ # check for possible external changes to the file, based on
2388
+ # mtime-stamps
2389
+ if doc is None:
2390
+ return True # we have no file loaded
2391
+ # files that don't exist DO have the expected mod-time
2392
+ filename = Path(doc.filename)
2393
+ if not filename.is_file():
2394
+ return True
2395
+ actualModTime = os.path.getmtime(filename)
2396
+ expectedModTime = doc.fileModTime
2397
+ if abs(float(actualModTime) - float(expectedModTime)) > 1:
2398
+ msg = 'File %s modified outside of the Coder (IDE).' % filename
2399
+ print(msg)
2400
+ return False
2401
+ return True
2402
+
2403
+ def fileSave(self, event=None, filename=None, doc=None):
2404
+ """Save a ``doc`` with a particular ``filename``.
2405
+ If ``doc`` is ``None`` then the current active doc is used.
2406
+ If the current active doc is also ``None``, then quit early.
2407
+ If the ``filename`` is ``None`` then the ``doc``'s current filename
2408
+ is used or a dlg is presented to get a new filename.
2409
+ """
2410
+ if hasattr(self.currentDoc, 'AutoCompActive'):
2411
+ if self.currentDoc.AutoCompActive():
2412
+ self.currentDoc.AutoCompCancel()
2413
+
2414
+ if doc is None:
2415
+ if self.currentDoc is None:
2416
+ return
2417
+ doc = self.currentDoc
2418
+ if filename is None:
2419
+ filename = doc.filename
2420
+ if filename.startswith('untitled'):
2421
+ self.fileSaveAs(filename)
2422
+ # self.setFileModified(False) # done in save-as if saved; don't
2423
+ # want here if not saved there
2424
+ else:
2425
+ # here detect odd conditions, and set failToSave = True to try
2426
+ # 'Save-as' rather than 'Save'
2427
+ failToSave = False
2428
+ if not self.expectedModTime(doc) and os.path.exists(filename):
2429
+ msg = _translate("File appears to have been modified outside "
2430
+ "of PsychoPy:\n %s\nOK to overwrite?")
2431
+ basefile = os.path.basename(doc.filename)
2432
+ dlg = dialogs.MessageDialog(self, message=msg % basefile,
2433
+ type='Warning')
2434
+ if dlg.ShowModal() != wx.ID_YES:
2435
+ failToSave = True
2436
+ dlg.Destroy()
2437
+ if os.path.exists(filename) and not os.access(filename, os.W_OK):
2438
+ msg = _translate("File '%s' lacks write-permission:\n"
2439
+ "Will try save-as instead.")
2440
+ basefile = os.path.basename(doc.filename)
2441
+ dlg = dialogs.MessageDialog(self, message=msg % basefile,
2442
+ type='Info')
2443
+ dlg.ShowModal()
2444
+ failToSave = True
2445
+ dlg.Destroy()
2446
+ try:
2447
+ if failToSave:
2448
+ raise IOError
2449
+ self.statusBar.SetStatusText(_translate('Saving file'))
2450
+ newlines = '\n' # system default, os.linesep
2451
+ with io.open(filename, 'w', encoding='utf-8', newline=newlines) as f:
2452
+ f.write(doc.GetText())
2453
+ self.setFileModified(False)
2454
+ doc.fileModTime = os.path.getmtime(filename) # JRG
2455
+ except Exception:
2456
+ print("Unable to save %s... trying save-as instead." %
2457
+ os.path.basename(doc.filename))
2458
+ self.fileSaveAs(filename)
2459
+
2460
+ if analyseAuto and len(self.getOpenFilenames()) > 0:
2461
+ self.currentDoc.analyseScript()
2462
+
2463
+ # reset status text
2464
+ self.statusBar.SetStatusText('')
2465
+ self.fileHistory.AddFileToHistory(filename)
2466
+
2467
+ def fileSaveAs(self, event, filename=None, doc=None):
2468
+ """Save a ``doc`` with a new ``filename``, after presenting a dlg
2469
+ to get a new filename.
2470
+
2471
+ If ``doc`` is ``None`` then the current active doc is used.
2472
+
2473
+ If the ``filename`` is not ``None`` then this will be the initial
2474
+ value for the filename in the dlg.
2475
+ """
2476
+ # cancel autocomplete if active
2477
+ if self.currentDoc.AutoCompActive():
2478
+ self.currentDoc.AutoCompCancel()
2479
+
2480
+ if doc is None:
2481
+ doc = self.currentDoc
2482
+ docId = self.notebook.GetSelection()
2483
+ else:
2484
+ docId = self.findDocID(doc.filename)
2485
+ if filename is None:
2486
+ filename = doc.filename
2487
+
2488
+ # if we have an absolute path then split it
2489
+ initPath, filename = os.path.split(filename)
2490
+ # set wildcards; need strings to appear inside _translate
2491
+ if sys.platform != 'darwin':
2492
+ wildcard = _translate("Python script (*.py)|*.py|"
2493
+ "JavaScript file (*.js)|*.js|"
2494
+ "Text file (*.txt)|*.txt|"
2495
+ "Any file (*.*)|*.*")
2496
+ else:
2497
+ wildcard = _translate("Python script (*.py)|*.py|"
2498
+ "JavaScript file (*.js)|*.js|"
2499
+ "Text file (*.txt)|*.txt|"
2500
+ "Any file (*.*)|*")
2501
+
2502
+ dlg = wx.FileDialog(
2503
+ self, message=_translate("Save file as ..."), defaultDir=initPath,
2504
+ defaultFile=filename, style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT,
2505
+ wildcard=wildcard)
2506
+
2507
+ if dlg.ShowModal() == wx.ID_OK:
2508
+ newPath = dlg.GetPath()
2509
+ doc.filename = newPath
2510
+ self.fileSave(event=None, filename=newPath, doc=doc)
2511
+ path, shortName = os.path.split(newPath)
2512
+ self.notebook.SetPageText(docId, shortName)
2513
+ self.setFileModified(False)
2514
+ # JRG: 'doc.filename' should = newPath = dlg.getPath()
2515
+ doc.fileModTime = os.path.getmtime(doc.filename)
2516
+ # update the lexer since the extension could have changed
2517
+ self.currentDoc.setLexerFromFileName()
2518
+ # re-analyse the document
2519
+ self.currentDoc.analyseScript()
2520
+ # Update status bar and title bar labels
2521
+ self.statusBar.SetStatusText(self.currentDoc.getFileType(), 2)
2522
+
2523
+ self.setTitle(title=self.winTitle, document=self.currentDoc.filename)
2524
+
2525
+ dlg.Destroy()
2526
+
2527
+ def fileClose(self, event, filename=None, checkSave=True):
2528
+ if self.currentDoc is None:
2529
+ # so a coder window with no files responds like the builder window
2530
+ # to self.keys.close
2531
+ self.closeFrame()
2532
+ return
2533
+ if filename is None:
2534
+ filename = self.currentDoc.filename
2535
+ self.currentDoc = self.notebook.GetPage(self.notebook.GetSelection())
2536
+ if self.currentDoc.UNSAVED and checkSave:
2537
+ sys.stdout.flush()
2538
+ msg = _translate('Save changes to %s before quitting?') % filename
2539
+ dlg = dialogs.MessageDialog(self, message=msg, type='Warning')
2540
+ resp = dlg.ShowModal()
2541
+ sys.stdout.flush()
2542
+ dlg.Destroy()
2543
+ if resp == wx.ID_CANCEL:
2544
+ if isinstance(event, aui.AuiNotebookEvent):
2545
+ event.Veto()
2546
+ return -1 # return, don't quit
2547
+ elif resp == wx.ID_YES:
2548
+ # save then quit
2549
+ self.fileSave(None)
2550
+ elif resp == wx.ID_NO:
2551
+ pass # don't save just quit
2552
+ # remove the document and its record
2553
+ currId = self.notebook.GetSelection()
2554
+ # if this was called by AuiNotebookEvent, then page has closed already
2555
+ if not isinstance(event, aui.AuiNotebookEvent):
2556
+ self.notebook.DeletePage(currId)
2557
+ newPageID = self.notebook.GetSelection()
2558
+ else:
2559
+ newPageID = self.notebook.GetSelection() - 1
2560
+ # set new current doc
2561
+ if newPageID < 0:
2562
+ self.currentDoc = None
2563
+ self.statusBar.SetStatusText("", 1) # clear line pos
2564
+ self.statusBar.SetStatusText("", 2) # clear file type in status bar
2565
+ self.statusBar.SetStatusText("", 3) # psyhcopy version
2566
+ # set window title
2567
+ self.setTitle(title=self.winTitle, document=self.currentDoc)
2568
+ # clear the source tree
2569
+ self.structureWindow.srcTree.DeleteAllItems()
2570
+ # disable save buttons
2571
+ self.ribbon.buttons['save'].Disable()
2572
+ self.ribbon.buttons['saveas'].Disable()
2573
+ else:
2574
+ self.setCurrentDoc(self.getOpenFilenames()[newPageID])
2575
+ self.structureWindow.refresh()
2576
+ # set to current file status
2577
+ self.setFileModified(self.currentDoc.UNSAVED)
2578
+ # update file browser buttons
2579
+ self.fileBrowserWindow.updateFileBrowser()
2580
+
2581
+ def fileCloseAll(self, event, checkSave=True):
2582
+ """Close all files open in the editor."""
2583
+ if self.currentDoc is None:
2584
+ event.Skip()
2585
+ return
2586
+
2587
+ for fname in self.getOpenFilenames():
2588
+ self.fileClose(event, fname, checkSave)
2589
+
2590
+ def sendToRunner(self, evt=None):
2591
+ """
2592
+ Send the current file to the Runner.
2593
+ """
2594
+ fullPath = Path(self.currentDoc.filename)
2595
+ # does the file need saving before running?
2596
+ if self.currentDoc.UNSAVED or not fullPath.is_file():
2597
+ sys.stdout.flush()
2598
+ msg = _translate('Save changes to %s before running?') % fullPath.name
2599
+ dlg = dialogs.MessageDialog(self, message=msg, type='Warning')
2600
+ resp = dlg.ShowModal()
2601
+ sys.stdout.flush()
2602
+ dlg.Destroy()
2603
+ if resp == wx.ID_CANCEL:
2604
+ return False # return, don't run
2605
+ elif resp == wx.ID_YES:
2606
+ self.fileSave(None) # save then run
2607
+ elif resp == wx.ID_NO:
2608
+ pass # just run
2609
+ fullPath = Path(self.currentDoc.filename) # Get full path again in case it has changed
2610
+ if self.app.runner == None:
2611
+ self.app.showRunner()
2612
+ if fullPath.is_file():
2613
+ if self.ribbon.buttons['pyswitch'].mode:
2614
+ runMode = "run"
2615
+ else:
2616
+ runMode = "pilot"
2617
+ self.app.runner.addTask(fileName=fullPath, runMode=runMode)
2618
+ else:
2619
+ alert(code=6105, strFields={'path': str(fullPath)})
2620
+ self.app.runner.Raise()
2621
+ self.app.showRunner()
2622
+
2623
+ return True
2624
+
2625
+ def onRunShortcut(self, evt=None):
2626
+ """
2627
+ Callback for when the run shortcut is pressed - will either run or pilot
2628
+ depending on run mode
2629
+ """
2630
+ if self.currentDoc is None:
2631
+ return
2632
+
2633
+ # run/pilot according to mode
2634
+ if self.ribbon.buttons['pyswitch'].mode:
2635
+ self.runFile(evt)
2636
+ else:
2637
+ self.pilotFile(evt)
2638
+
2639
+ def runFile(self, event=None):
2640
+ """
2641
+ Send the current file to the Runner and run it.
2642
+ """
2643
+ if self.currentDoc is None: # do nothing if no file is present
2644
+ return
2645
+
2646
+ if self.sendToRunner(event):
2647
+ self.app.runner.panel.runLocal(event, focusOnExit='coder')
2648
+ self.Raise()
2649
+
2650
+ def pilotFile(self, event=None):
2651
+ if self.currentDoc is None:
2652
+ return
2653
+
2654
+ if self.sendToRunner(event):
2655
+ self.app.runner.panel.pilotLocal(event, focusOnExit='coder')
2656
+ self.Raise()
2657
+
2658
+ def duplicateLine(self, event):
2659
+ """Duplicate the current line."""
2660
+ self.currentDoc.LineDuplicate()
2661
+
2662
+ def copy(self, event):
2663
+ """Copy text to the clipboard from the focused widget."""
2664
+ foc = self.FindFocus()
2665
+ if isinstance(foc, CodeEditor):
2666
+ self.currentDoc.Copy() # let the text ctrl handle this
2667
+ elif hasattr(foc, 'Copy'): # handle any other widget
2668
+ foc.Copy()
2669
+
2670
+ def cut(self, event):
2671
+ """Cut text from the focused widget to clipboard."""
2672
+ foc = self.FindFocus()
2673
+ if isinstance(foc, CodeEditor):
2674
+ self.currentDoc.Cut()
2675
+ self.currentDoc.analyseScript()
2676
+ elif hasattr(foc, 'Cut'):
2677
+ foc.Cut()
2678
+
2679
+ def paste(self, event):
2680
+ """Paste text from the clipboard to the focused object."""
2681
+ foc = self.FindFocus()
2682
+ if isinstance(foc, CodeEditor):
2683
+ self.currentDoc.Paste()
2684
+ self.currentDoc.analyseScript()
2685
+ elif hasattr(foc, 'Paste'):
2686
+ foc.Paste()
2687
+
2688
+ def undo(self, event):
2689
+ if self.currentDoc:
2690
+ self.currentDoc.Undo()
2691
+ self.currentDoc.analyseScript()
2692
+
2693
+ def redo(self, event):
2694
+ if self.currentDoc:
2695
+ self.currentDoc.Redo()
2696
+ self.currentDoc.analyseScript()
2697
+
2698
+ def commentSelected(self, event):
2699
+ self.currentDoc.commentLines()
2700
+ self.currentDoc.analyseScript()
2701
+
2702
+ def uncommentSelected(self, event):
2703
+ self.currentDoc.uncommentLines()
2704
+ self.currentDoc.analyseScript()
2705
+
2706
+ def toggleComments(self, event):
2707
+ self.currentDoc.toggleCommentLines()
2708
+ self.currentDoc.analyseScript()
2709
+
2710
+ def bigFont(self, event):
2711
+ self.currentDoc.increaseFontSize()
2712
+
2713
+ def smallFont(self, event):
2714
+ self.currentDoc.decreaseFontSize()
2715
+
2716
+ def resetFont(self, event):
2717
+ self.currentDoc.resetFontSize()
2718
+
2719
+ def foldAll(self, event):
2720
+ self.currentDoc.FoldAll(wx.stc.STC_FOLDACTION_TOGGLE)
2721
+
2722
+ # def unfoldAll(self, event):
2723
+ # self.currentDoc.ToggleFoldAll(expand = False)
2724
+
2725
+ def setOutputWindow(self, event=None, value=None):
2726
+ # show/hide the output window (from the view menu control)
2727
+ if value is None:
2728
+ value = self.outputChk.IsChecked()
2729
+ self.outputChk.Check(value)
2730
+ if value:
2731
+ # show the pane
2732
+ self.prefs['showOutput'] = True
2733
+ self.paneManager.GetPane('Shelf').Show()
2734
+ else:
2735
+ # hide the pane
2736
+ self.prefs['showOutput'] = False
2737
+ self.paneManager.GetPane('Shelf').Hide()
2738
+ self.app.prefs.saveUserPrefs()
2739
+ try: # includes a validation
2740
+ self.paneManager.Update()
2741
+ except wxAssertionError as err:
2742
+ logging.warn("Exception caught: " + str(err))
2743
+
2744
+ def setShowIndentGuides(self, event):
2745
+ # show/hide the source assistant (from the view menu control)
2746
+ newVal = self.indentGuideChk.IsChecked()
2747
+ self.appData['showIndentGuides'] = newVal
2748
+ for ii in range(self.notebook.GetPageCount()):
2749
+ self.notebook.GetPage(ii).SetIndentationGuides(newVal)
2750
+
2751
+ def setShowWhitespace(self, event):
2752
+ newVal = self.showWhitespaceChk.IsChecked()
2753
+ self.appData['showWhitespace'] = newVal
2754
+ for ii in range(self.notebook.GetPageCount()):
2755
+ self.notebook.GetPage(ii).SetViewWhiteSpace(newVal)
2756
+
2757
+ def setShowEOLs(self, event):
2758
+ newVal = self.showEOLsChk.IsChecked()
2759
+ self.appData['showEOLs'] = newVal
2760
+ for ii in range(self.notebook.GetPageCount()):
2761
+ self.notebook.GetPage(ii).SetViewEOL(newVal)
2762
+
2763
+ def onCloseSourceAsst(self, event):
2764
+ """Called when the source assisant is closed."""
2765
+ pass
2766
+
2767
+ def setSourceAsst(self, event):
2768
+ # show/hide the source assistant (from the view menu control)
2769
+ if not self.sourceAsstChk.IsChecked():
2770
+ self.paneManager.GetPane("SourceAsst").Hide()
2771
+ self.prefs['showSourceAsst'] = False
2772
+ else:
2773
+ self.paneManager.GetPane("SourceAsst").Show()
2774
+ self.prefs['showSourceAsst'] = True
2775
+ self.paneManager.Update()
2776
+
2777
+ # def setAutoComplete(self, event=None):
2778
+ # # show/hide the source assistant (from the view menu control)
2779
+ # self.prefs['autocomplete'] = self.useAutoComp = \
2780
+ # self.chkShowAutoComp.IsChecked()
2781
+
2782
+ # def setFileBrowser(self, event):
2783
+ # # show/hide the source file browser
2784
+ # if not self.fileBrowserChk.IsChecked():
2785
+ # self.paneManager.GetPane("FileBrowser").Hide()
2786
+ # self.prefs['showFileBrowser'] = False
2787
+ # else:
2788
+ # self.paneManager.GetPane("FileBrowser").Show()
2789
+ # self.prefs['showFileBrowser'] = True
2790
+ # self.paneManager.Update()
2791
+
2792
+ def analyseCodeNow(self, event):
2793
+ self.currentDoc.analyseScript()
2794
+
2795
+ # def setAnalyseAuto(self, event):
2796
+ # set autoanalysis (from the check control in the tools menu)
2797
+ # if self.analyseAutoChk.IsChecked():
2798
+ # self.prefs['analyseAuto']=True
2799
+ # else:
2800
+ # self.prefs['analyseAuto']=False
2801
+
2802
+ def demoLoad(self, event):
2803
+ self.setCurrentDoc(str(self.demos[event.GetId()]))
2804
+
2805
+ def tabKeyPressed(self, event):
2806
+ # if several chars are selected then smartIndent
2807
+ # if we're at the start of the line then smartIndent
2808
+ if self.currentDoc.shouldTrySmartIndent():
2809
+ self.smartIndent(event=None)
2810
+ else:
2811
+ # self.currentDoc.CmdKeyExecute(wx.stc.STC_CMD_TAB)
2812
+ pos = self.currentDoc.GetCurrentPos()
2813
+ self.currentDoc.InsertText(pos, '\t')
2814
+ self.currentDoc.SetCurrentPos(pos + 1)
2815
+ self.currentDoc.SetSelection(pos + 1, pos + 1)
2816
+
2817
+ def smartIndent(self, event):
2818
+ self.currentDoc.smartIndent()
2819
+
2820
+ def indent(self, event):
2821
+ self.currentDoc.indentSelection(4)
2822
+
2823
+ def dedent(self, event):
2824
+ self.currentDoc.indentSelection(-4)
2825
+
2826
+ def setFileModified(self, isModified):
2827
+ # changes the document flag, updates save buttons
2828
+ self.currentDoc.UNSAVED = isModified
2829
+ # Enable / disable save button
2830
+ self.ribbon.buttons['save'].Enable(self.currentDoc.UNSAVED)
2831
+ self.fileMenu.Enable(wx.ID_SAVE, self.currentDoc.UNSAVED)
2832
+
2833
+ def onProcessEnded(self, event):
2834
+ # this is will check the stdout and stderr for any last messages
2835
+ self.onIdle(event=None)
2836
+ self.scriptProcess = None
2837
+ self.scriptProcessID = None
2838
+ self.ribbon.buttons['sendRunner'].Enable(True)
2839
+ self.ribbon.buttons['pilotRunner'].Enable(True)
2840
+
2841
+ def onURL(self, evt):
2842
+ """decompose the URL of a file and line number"""
2843
+ # "C:\Program Files\wxPython2.8 Docs and Demos\samples\hangman\hangman.py"
2844
+ tmpFilename, tmpLineNumber = evt.GetString().rsplit('", line ', 1)
2845
+ filename = tmpFilename.split('File "', 1)[1]
2846
+ try:
2847
+ lineNumber = int(tmpLineNumber.split(',')[0])
2848
+ except ValueError:
2849
+ lineNumber = int(tmpLineNumber.split()[0])
2850
+ self.gotoLine(filename, lineNumber)
2851
+
2852
+ def onUnitTests(self, evt=None):
2853
+ """Show the unit tests frame"""
2854
+ if self.unitTestFrame:
2855
+ self.unitTestFrame.Raise()
2856
+ else:
2857
+ self.unitTestFrame = UnitTestFrame(app=self.app)
2858
+ # UnitTestFrame.Show()
2859
+
2860
+ def openPluginManager(self, evt=None):
2861
+ dlg = psychopy.app.plugin_manager.dialog.EnvironmentManagerDlg(self)
2862
+ dlg.Show()
2863
+ # Do post-close checks
2864
+ dlg.onClose()
2865
+
2866
+ def onPavloviaSync(self, evt=None):
2867
+ """Push changes to project repo, or create new proj if proj is None"""
2868
+ self.project = pavlovia.getProject(self.currentDoc.filename)
2869
+ self.fileSave(self.currentDoc.filename) # Must save on sync else changes not pushed
2870
+ pavlovia_ui.syncProject(parent=self, file=self.currentDoc.filename, project=self.project)
2871
+
2872
+ def onPavloviaRun(self, evt=None):
2873
+ # TODO: Allow user to run project from coder
2874
+ pass
2875
+
2876
+ def setPavloviaUser(self, user):
2877
+ # TODO: update user icon on button to user avatar
2878
+ pass
2879
+
2880
+ def resetPrefs(self, event):
2881
+ """Reset preferences to default"""
2882
+ # Present "are you sure" dialog
2883
+ dlg = wx.MessageDialog(
2884
+ self,
2885
+ _translate("Are you sure you want to reset your preferences? This "
2886
+ "cannot be undone."),
2887
+ caption="Reset Preferences...", style=wx.ICON_WARNING | wx.CANCEL)
2888
+ dlg.SetOKCancelLabels(
2889
+ _translate("I'm sure"),
2890
+ _translate("Wait, go back!")
2891
+ )
2892
+ if dlg.ShowModal() == wx.ID_OK:
2893
+ # If okay is pressed, remove prefs file (meaning a new one will be
2894
+ # created on next restart)
2895
+ os.remove(prefs.paths['userPrefsFile'])
2896
+ # Show confirmation
2897
+ dlg = wx.MessageDialog(
2898
+ self,
2899
+ _translate("Done! Your preferences have been reset. Changes "
2900
+ "will be applied when you next open PsychoPy."))
2901
+ dlg.ShowModal()
2902
+ else:
2903
+ pass
2904
+
2905
+
2906
+ class StyledNotebook(aui.AuiNotebook, handlers.ThemeMixin):
2907
+ """
2908
+ Exactly the same as an aui.AuiNotebook, but with methods from handlers.ThemeMixin
2909
+ """
2910
+ pass
2911
+
2912
+
2913
+ class CoderRibbon(ribbon.FrameRibbon):
2914
+ def __init__(self, parent):
2915
+ # initialize
2916
+ ribbon.FrameRibbon.__init__(self, parent)
2917
+
2918
+ # --- File ---
2919
+ self.addSection(
2920
+ "file", label=_translate("File"), icon="file"
2921
+ )
2922
+ # file new
2923
+ self.addButton(
2924
+ section="file", name="new", label=_translate("New"), icon="filenew",
2925
+ tooltip=_translate("Create new text file"),
2926
+ callback=parent.fileNew
2927
+ )
2928
+ # file open
2929
+ self.addButton(
2930
+ section="file", name="open", label=_translate("Open"), icon="fileopen",
2931
+ tooltip=_translate("Open an existing text file"),
2932
+ callback=parent.fileOpen
2933
+ )
2934
+ # file save
2935
+ self.addButton(
2936
+ section="file", name="save", label=_translate("Save"), icon="filesave",
2937
+ tooltip=_translate("Save current text file"),
2938
+ callback=parent.fileSave
2939
+ ).Disable()
2940
+ # file save as
2941
+ self.addButton(
2942
+ section="file", name="saveas", label=_translate("Save as..."), icon="filesaveas",
2943
+ tooltip=_translate("Save current text file as..."),
2944
+ callback=parent.fileSaveAs
2945
+ ).Disable()
2946
+
2947
+ self.addSeparator()
2948
+
2949
+ # --- Edit ---
2950
+ self.addSection(
2951
+ "edit", label=_translate("Edit"), icon="edit"
2952
+ )
2953
+ # undo
2954
+ self.addButton(
2955
+ section="edit", name="undo", label=_translate("Undo"), icon="undo",
2956
+ tooltip=_translate("Undo last action"),
2957
+ callback=parent.undo
2958
+ )
2959
+ # redo
2960
+ self.addButton(
2961
+ section="edit", name="redo", label=_translate("Redo"), icon="redo",
2962
+ tooltip=_translate("Redo last action"),
2963
+ callback=parent.redo
2964
+ )
2965
+
2966
+ self.addSeparator()
2967
+
2968
+ # --- Tools ---
2969
+ self.addSection(
2970
+ "experiment", label=_translate("Experiment"), icon="experiment"
2971
+ )
2972
+ # settings
2973
+ self.addButton(
2974
+ section="experiment", name='color', label=_translate('Color picker'), icon="color",
2975
+ tooltip=_translate("Open a tool for choosing colors"),
2976
+ callback=parent.app.colorPicker
2977
+ )
2978
+ # switch run/pilot
2979
+ runPilotSwitch = self.addSwitchCtrl(
2980
+ section="experiment", name="pyswitch",
2981
+ labels=(_translate("Pilot"), _translate("Run")),
2982
+ style=wx.HORIZONTAL
2983
+ )
2984
+ # send to runner
2985
+ self.addButton(
2986
+ section="experiment", name='sendRunner', label=_translate('Runner'), icon="runner",
2987
+ tooltip=_translate("Send experiment to Runner"),
2988
+ callback=parent.sendToRunner
2989
+ ).Disable()
2990
+ # send to runner (pilot icon)
2991
+ self.addButton(
2992
+ section="experiment", name='pilotRunner', label=_translate('Runner'),
2993
+ icon="runnerPilot",
2994
+ tooltip=_translate("Send experiment to Runner"),
2995
+ callback=parent.sendToRunner
2996
+ ).Disable()
2997
+ # link runner buttons to switch
2998
+ runPilotSwitch.addDependant(self.buttons['sendRunner'], mode=1, action="show")
2999
+ runPilotSwitch.addDependant(self.buttons['pilotRunner'], mode=0, action="show")
3000
+
3001
+ self.addSeparator()
3002
+
3003
+ # --- Python ---
3004
+ self.addSection(name="py", label=_translate("Desktop"), icon="desktop")
3005
+
3006
+ # monitor center
3007
+ self.addButton(
3008
+ section="py", name='monitor', label=_translate('Monitor center'), icon="monitors",
3009
+ tooltip=_translate("Monitor settings and calibration"),
3010
+ callback=parent.app.openMonitorCenter
3011
+ )
3012
+ # pilot Py
3013
+ self.addButton(
3014
+ section="py", name="pypilot", label=_translate("Pilot"), icon='pyPilot',
3015
+ tooltip=_translate("Run the current script in Python with piloting features on"),
3016
+ callback=parent.pilotFile
3017
+ ).Disable()
3018
+ # run Py
3019
+ self.addButton(
3020
+ section="py", name="pyrun", label=_translate("Run"), icon='pyRun',
3021
+ tooltip=_translate("Run the current script in Python"),
3022
+ callback=parent.runFile
3023
+ ).Disable()
3024
+ # link run buttons to switch
3025
+ runPilotSwitch.addDependant(self.buttons['pyrun'], mode=1, action="show")
3026
+ runPilotSwitch.addDependant(self.buttons['pypilot'], mode=0, action="show")
3027
+
3028
+ self.addSeparator()
3029
+
3030
+ # --- Browser ---
3031
+ self.addSection(
3032
+ name="browser", label=_translate("Browser"), icon="browser"
3033
+ )
3034
+
3035
+ # sync project
3036
+ self.addButton(
3037
+ section="browser", name="pavsync", label=_translate("Sync"), icon='pavsync',
3038
+ tooltip=_translate("Sync project with Pavlovia"),
3039
+ callback=parent.onPavloviaSync
3040
+ )
3041
+
3042
+ self.addSeparator()
3043
+
3044
+ # --- Pavlovia ---
3045
+ self.addSection(
3046
+ name="pavlovia", label=_translate("Pavlovia"), icon="pavlovia"
3047
+ )
3048
+ # pavlovia user
3049
+ self.addPavloviaUserCtrl(
3050
+ section="pavlovia", name="pavuser", frame=parent
3051
+ )
3052
+ # pavlovia project
3053
+ self.addPavloviaProjectCtrl(
3054
+ section="pavlovia", name="pavproject", frame=parent
3055
+ )
3056
+
3057
+ self.addSeparator()
3058
+
3059
+ # --- Views ---
3060
+ self.addStretchSpacer()
3061
+ self.addSeparator()
3062
+
3063
+ self.addSection(
3064
+ "views", label=_translate("Views"), icon="windows"
3065
+ )
3066
+ # show Builder
3067
+ self.addButton(
3068
+ section="views", name="builder", label=_translate("Show Builder"), icon="showBuilder",
3069
+ tooltip=_translate("Switch to Builder view"),
3070
+ callback=parent.app.showBuilder
3071
+ )
3072
+ # show Coder
3073
+ self.addButton(
3074
+ section="views", name="coder", label=_translate("Show Coder"), icon="showCoder",
3075
+ tooltip=_translate("Switch to Coder view"),
3076
+ callback=parent.app.showCoder
3077
+ ).Disable()
3078
+ # show Runner
3079
+ self.addButton(
3080
+ section="views", name="runner", label=_translate("Show Runner"), icon="showRunner",
3081
+ tooltip=_translate("Switch to Runner view"),
3082
+ callback=parent.app.showRunner
3083
+ )
3084
+
3085
+ # start off in run mode
3086
+ runPilotSwitch.setMode(1)