psychopy 2024.2.5__py3-none-any.whl → 2025.1.1__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 (863) hide show
  1. psychopy/CHANGELOG.txt +4 -4
  2. psychopy/GIT_SHA +1 -1
  3. psychopy/LICENSE.txt +1 -1
  4. psychopy/VERSION +1 -1
  5. psychopy/__init__.py +10 -7
  6. psychopy/alerts/__init__.py +1 -1
  7. psychopy/alerts/_alerts.py +53 -17
  8. psychopy/alerts/_errorHandler.py +3 -4
  9. psychopy/alerts/alertsCatalogue/3210.yaml +27 -0
  10. psychopy/alerts/alertsCatalogue/3610.yaml +19 -0
  11. psychopy/alerts/alertsCatalogue/4130.yaml +19 -0
  12. psychopy/alerts/alertsCatalogue/alertCategories.yaml +8 -1
  13. psychopy/alerts/alertsCatalogue/alertmsg.py +1 -1
  14. psychopy/alerts/alerttools.py +0 -16
  15. psychopy/app/Resources/betasplash.png +0 -0
  16. psychopy/app/Resources/betasplash@2x.png +0 -0
  17. psychopy/app/Resources/classic/case.png +0 -0
  18. psychopy/app/Resources/classic/case@2x.png +0 -0
  19. psychopy/app/Resources/classic/fileaudio.png +0 -0
  20. psychopy/app/Resources/classic/fileaudio@2x.png +0 -0
  21. psychopy/app/Resources/classic/filecss.png +0 -0
  22. psychopy/app/Resources/classic/filecss@2x.png +0 -0
  23. psychopy/app/Resources/classic/filecsv.png +0 -0
  24. psychopy/app/Resources/classic/filecsv@2x.png +0 -0
  25. psychopy/app/Resources/classic/filedesign.png +0 -0
  26. psychopy/app/Resources/classic/filedesign@2x.png +0 -0
  27. psychopy/app/Resources/classic/filefont.png +0 -0
  28. psychopy/app/Resources/classic/filefont@2x.png +0 -0
  29. psychopy/app/Resources/classic/filegit.png +0 -0
  30. psychopy/app/Resources/classic/filegit@2x.png +0 -0
  31. psychopy/app/Resources/classic/filehtml.png +0 -0
  32. psychopy/app/Resources/classic/filehtml@2x.png +0 -0
  33. psychopy/app/Resources/classic/fileimage.png +0 -0
  34. psychopy/app/Resources/classic/fileimage@2x.png +0 -0
  35. psychopy/app/Resources/classic/fileinfo.png +0 -0
  36. psychopy/app/Resources/classic/fileinfo@2x.png +0 -0
  37. psychopy/app/Resources/classic/filejs.png +0 -0
  38. psychopy/app/Resources/classic/filejs@2x.png +0 -0
  39. psychopy/app/Resources/classic/filejson.png +0 -0
  40. psychopy/app/Resources/classic/filejson@2x.png +0 -0
  41. psychopy/app/Resources/classic/filepkg.png +0 -0
  42. psychopy/app/Resources/classic/filepkg@2x.png +0 -0
  43. psychopy/app/Resources/classic/filepsyexp.png +0 -0
  44. psychopy/app/Resources/classic/filepsyexp@2x.png +0 -0
  45. psychopy/app/Resources/classic/filepy.png +0 -0
  46. psychopy/app/Resources/classic/filepy@2x.png +0 -0
  47. psychopy/app/Resources/classic/filetxt.png +0 -0
  48. psychopy/app/Resources/classic/filetxt@2x.png +0 -0
  49. psychopy/app/Resources/classic/fileunknown.png +0 -0
  50. psychopy/app/Resources/classic/fileunknown@2x.png +0 -0
  51. psychopy/app/Resources/classic/filevideo.png +0 -0
  52. psychopy/app/Resources/classic/filevideo@2x.png +0 -0
  53. psychopy/app/Resources/classic/find.png +0 -0
  54. psychopy/app/Resources/classic/find@2x.png +0 -0
  55. psychopy/app/Resources/classic/loop.png +0 -0
  56. psychopy/app/Resources/classic/loop@2x.png +0 -0
  57. psychopy/app/Resources/classic/regex.png +0 -0
  58. psychopy/app/Resources/classic/regex@2x.png +0 -0
  59. psychopy/app/Resources/dark/case.png +0 -0
  60. psychopy/app/Resources/dark/case@2x.png +0 -0
  61. psychopy/app/Resources/dark/fileaudio.png +0 -0
  62. psychopy/app/Resources/dark/fileaudio@2x.png +0 -0
  63. psychopy/app/Resources/dark/filecss.png +0 -0
  64. psychopy/app/Resources/dark/filecss@2x.png +0 -0
  65. psychopy/app/Resources/dark/filecsv.png +0 -0
  66. psychopy/app/Resources/dark/filecsv@2x.png +0 -0
  67. psychopy/app/Resources/dark/filedesign.png +0 -0
  68. psychopy/app/Resources/dark/filedesign@2x.png +0 -0
  69. psychopy/app/Resources/dark/filefont.png +0 -0
  70. psychopy/app/Resources/dark/filefont@2x.png +0 -0
  71. psychopy/app/Resources/dark/filegit.png +0 -0
  72. psychopy/app/Resources/dark/filegit@2x.png +0 -0
  73. psychopy/app/Resources/dark/filehtml.png +0 -0
  74. psychopy/app/Resources/dark/filehtml@2x.png +0 -0
  75. psychopy/app/Resources/dark/fileimage.png +0 -0
  76. psychopy/app/Resources/dark/fileimage@2x.png +0 -0
  77. psychopy/app/Resources/dark/fileinfo.png +0 -0
  78. psychopy/app/Resources/dark/fileinfo@2x.png +0 -0
  79. psychopy/app/Resources/dark/filejs.png +0 -0
  80. psychopy/app/Resources/dark/filejs@2x.png +0 -0
  81. psychopy/app/Resources/dark/filejson.png +0 -0
  82. psychopy/app/Resources/dark/filejson@2x.png +0 -0
  83. psychopy/app/Resources/dark/filepkg.png +0 -0
  84. psychopy/app/Resources/dark/filepkg@2x.png +0 -0
  85. psychopy/app/Resources/dark/filepsyexp.png +0 -0
  86. psychopy/app/Resources/dark/filepsyexp@2x.png +0 -0
  87. psychopy/app/Resources/dark/filepy.png +0 -0
  88. psychopy/app/Resources/dark/filepy@2x.png +0 -0
  89. psychopy/app/Resources/dark/filetxt.png +0 -0
  90. psychopy/app/Resources/dark/filetxt@2x.png +0 -0
  91. psychopy/app/Resources/dark/fileunknown.png +0 -0
  92. psychopy/app/Resources/dark/fileunknown@2x.png +0 -0
  93. psychopy/app/Resources/dark/filevideo.png +0 -0
  94. psychopy/app/Resources/dark/filevideo@2x.png +0 -0
  95. psychopy/app/Resources/dark/find.png +0 -0
  96. psychopy/app/Resources/dark/find@2x.png +0 -0
  97. psychopy/app/Resources/dark/loop.png +0 -0
  98. psychopy/app/Resources/dark/loop@2x.png +0 -0
  99. psychopy/app/Resources/dark/regex.png +0 -0
  100. psychopy/app/Resources/dark/regex@2x.png +0 -0
  101. psychopy/app/Resources/light/case.png +0 -0
  102. psychopy/app/Resources/light/case@2x.png +0 -0
  103. psychopy/app/Resources/light/fileaudio.png +0 -0
  104. psychopy/app/Resources/light/fileaudio@2x.png +0 -0
  105. psychopy/app/Resources/light/filecss.png +0 -0
  106. psychopy/app/Resources/light/filecss@2x.png +0 -0
  107. psychopy/app/Resources/light/filecsv.png +0 -0
  108. psychopy/app/Resources/light/filecsv@2x.png +0 -0
  109. psychopy/app/Resources/light/filedesign.png +0 -0
  110. psychopy/app/Resources/light/filedesign@2x.png +0 -0
  111. psychopy/app/Resources/light/filefont.png +0 -0
  112. psychopy/app/Resources/light/filefont@2x.png +0 -0
  113. psychopy/app/Resources/light/filegit.png +0 -0
  114. psychopy/app/Resources/light/filegit@2x.png +0 -0
  115. psychopy/app/Resources/light/filehtml.png +0 -0
  116. psychopy/app/Resources/light/filehtml@2x.png +0 -0
  117. psychopy/app/Resources/light/fileimage.png +0 -0
  118. psychopy/app/Resources/light/fileimage@2x.png +0 -0
  119. psychopy/app/Resources/light/fileinfo.png +0 -0
  120. psychopy/app/Resources/light/fileinfo@2x.png +0 -0
  121. psychopy/app/Resources/light/filejs.png +0 -0
  122. psychopy/app/Resources/light/filejs@2x.png +0 -0
  123. psychopy/app/Resources/light/filejson.png +0 -0
  124. psychopy/app/Resources/light/filejson@2x.png +0 -0
  125. psychopy/app/Resources/light/filepkg.png +0 -0
  126. psychopy/app/Resources/light/filepkg@2x.png +0 -0
  127. psychopy/app/Resources/light/filepsyexp.png +0 -0
  128. psychopy/app/Resources/light/filepsyexp@2x.png +0 -0
  129. psychopy/app/Resources/light/filepy.png +0 -0
  130. psychopy/app/Resources/light/filepy@2x.png +0 -0
  131. psychopy/app/Resources/light/filetxt.png +0 -0
  132. psychopy/app/Resources/light/filetxt@2x.png +0 -0
  133. psychopy/app/Resources/light/fileunknown.png +0 -0
  134. psychopy/app/Resources/light/fileunknown@2x.png +0 -0
  135. psychopy/app/Resources/light/filevideo.png +0 -0
  136. psychopy/app/Resources/light/filevideo@2x.png +0 -0
  137. psychopy/app/Resources/light/find.png +0 -0
  138. psychopy/app/Resources/light/find@2x.png +0 -0
  139. psychopy/app/Resources/light/loop.png +0 -0
  140. psychopy/app/Resources/light/loop@2x.png +0 -0
  141. psychopy/app/Resources/light/regex.png +0 -0
  142. psychopy/app/Resources/light/regex@2x.png +0 -0
  143. psychopy/app/Resources/routine_templates/Basic.psyexp +0 -1
  144. psychopy/app/Resources/routine_templates/Misc.psyexp +0 -1
  145. psychopy/app/Resources/routine_templates/Online.psyexp +0 -2
  146. psychopy/app/Resources/routine_templates/Trials.psyexp +0 -1
  147. psychopy/app/Resources/splash.png +0 -0
  148. psychopy/app/Resources/splash@2x.png +0 -0
  149. psychopy/app/__init__.py +49 -8
  150. psychopy/app/__main__.py +3 -0
  151. psychopy/app/_psychopyApp.py +134 -125
  152. psychopy/app/builder/builder.py +42 -22
  153. psychopy/app/builder/dialogs/__init__.py +44 -11
  154. psychopy/app/builder/dialogs/dlgsCode.py +1 -1
  155. psychopy/app/builder/dialogs/dlgsConditions.py +1 -1
  156. psychopy/app/builder/dialogs/findDlg.py +106 -20
  157. psychopy/app/builder/dialogs/paramCtrls.py +42 -1
  158. psychopy/app/builder/validators.py +1 -1
  159. psychopy/app/coder/codeEditorBase.py +8 -8
  160. psychopy/app/coder/coder.py +32 -29
  161. psychopy/app/coder/fileBrowser.py +68 -22
  162. psychopy/app/coder/folding.py +1 -1
  163. psychopy/app/coder/psychoParser.py +1 -1
  164. psychopy/app/coder/repl.py +1 -1
  165. psychopy/app/coder/sourceTree.py +1 -1
  166. psychopy/app/connections/__init__.py +1 -1
  167. psychopy/app/connections/news.py +1 -1
  168. psychopy/app/connections/sendusage.py +1 -1
  169. psychopy/app/connections/updates.py +1 -1
  170. psychopy/app/console.py +1 -1
  171. psychopy/app/errorDlg.py +1 -1
  172. psychopy/app/frametracker.py +1 -1
  173. psychopy/app/idle.py +1 -1
  174. psychopy/app/jobs.py +5 -2
  175. psychopy/app/linuxconfig/__init__.py +1 -1
  176. psychopy/app/locale/ar_001/LC_MESSAGE/messages.mo +0 -0
  177. psychopy/app/locale/ar_001/LC_MESSAGE/messages.po +4 -4
  178. psychopy/app/locale/cs_CZ/LC_MESSAGE/messages.mo +0 -0
  179. psychopy/app/locale/da_DK/LC_MESSAGE/messages.mo +0 -0
  180. psychopy/app/locale/de_DE/LC_MESSAGE/messages.mo +0 -0
  181. psychopy/app/locale/de_DE/LC_MESSAGE/messages.po +3 -3
  182. psychopy/app/locale/el_GR/LC_MESSAGE/messages.mo +0 -0
  183. psychopy/app/locale/en_NZ/LC_MESSAGE/messages.mo +0 -0
  184. psychopy/app/locale/en_US/LC_MESSAGE/messages.mo +0 -0
  185. psychopy/app/locale/es_CO/LC_MESSAGE/messages.mo +0 -0
  186. psychopy/app/locale/es_CO/LC_MESSAGE/messages.po +4 -4
  187. psychopy/app/locale/es_ES/LC_MESSAGE/messages.mo +0 -0
  188. psychopy/app/locale/es_ES/LC_MESSAGE/messages.po +4 -4
  189. psychopy/app/locale/es_US/LC_MESSAGE/messages.mo +0 -0
  190. psychopy/app/locale/es_US/LC_MESSAGE/messages.po +4 -4
  191. psychopy/app/locale/et_EE/LC_MESSAGE/messages.mo +0 -0
  192. psychopy/app/locale/et_EE/LC_MESSAGE/messages.po +2 -2
  193. psychopy/app/locale/fa_IR/LC_MESSAGE/messages.mo +0 -0
  194. psychopy/app/locale/fa_IR/LC_MESSAGE/messages.po +1 -1
  195. psychopy/app/locale/fi_FI/LC_MESSAGE/messages.mo +0 -0
  196. psychopy/app/locale/fr_FR/LC_MESSAGE/messages.mo +0 -0
  197. psychopy/app/locale/fr_FR/LC_MESSAGE/messages.po +2 -2
  198. psychopy/app/locale/he_IL/LC_MESSAGE/messages.mo +0 -0
  199. psychopy/app/locale/he_IL/LC_MESSAGE/messages.po +2 -2
  200. psychopy/app/locale/hi_IN/LC_MESSAGE/messages.mo +0 -0
  201. psychopy/app/locale/hi_IN/LC_MESSAGE/messages.po +2 -2
  202. psychopy/app/locale/hu_HU/LC_MESSAGE/messages.mo +0 -0
  203. psychopy/app/locale/it_IT/LC_MESSAGE/messages.mo +0 -0
  204. psychopy/app/locale/it_IT/LC_MESSAGE/messages.po +2 -2
  205. psychopy/app/locale/ja_JP/LC_MESSAGE/messages.mo +0 -0
  206. psychopy/app/locale/ja_JP/LC_MESSAGE/messages.po +3421 -2396
  207. psychopy/app/locale/ko_KR/LC_MESSAGE/messages.mo +0 -0
  208. psychopy/app/locale/ms_MY/LC_MESSAGE/messages.mo +0 -0
  209. psychopy/app/locale/ms_MY/LC_MESSAGE/messages.po +2 -2
  210. psychopy/app/locale/nl_NL/LC_MESSAGE/messages.mo +0 -0
  211. psychopy/app/locale/nn_NO/LC_MESSAGE/messages.mo +0 -0
  212. psychopy/app/locale/pl_PL/LC_MESSAGE/messages.mo +0 -0
  213. psychopy/app/locale/pt_PT/LC_MESSAGE/messages.mo +0 -0
  214. psychopy/app/locale/pt_PT/LC_MESSAGE/messages.po +4 -4
  215. psychopy/app/locale/ro_RO/LC_MESSAGE/messages.mo +0 -0
  216. psychopy/app/locale/ru_RU/LC_MESSAGE/messages.mo +0 -0
  217. psychopy/app/locale/sv_SE/LC_MESSAGE/messages.mo +0 -0
  218. psychopy/app/locale/sv_SE/LC_MESSAGE/messages.po +2 -2
  219. psychopy/app/locale/tr_TR/LC_MESSAGE/messages.mo +0 -0
  220. psychopy/app/locale/tr_TR/LC_MESSAGE/messages.po +2 -2
  221. psychopy/app/locale/zh_CN/LC_MESSAGE/messages.mo +0 -0
  222. psychopy/app/locale/zh_CN/LC_MESSAGE/messages.po +3 -3
  223. psychopy/app/locale/zh_TW/LC_MESSAGE/messages.mo +0 -0
  224. psychopy/app/locale/zh_TW/LC_MESSAGE/messages.po +2 -2
  225. psychopy/app/{builder/localizedStrings.py → localizedStrings.py} +173 -26
  226. psychopy/app/pavlovia_ui/__init__.py +1 -1
  227. psychopy/app/pavlovia_ui/_base.py +1 -1
  228. psychopy/app/pavlovia_ui/functions.py +1 -1
  229. psychopy/app/pavlovia_ui/menu.py +1 -1
  230. psychopy/app/pavlovia_ui/project.py +1 -1
  231. psychopy/app/pavlovia_ui/search.py +1 -1
  232. psychopy/app/pavlovia_ui/sync.py +1 -1
  233. psychopy/app/pavlovia_ui/user.py +1 -1
  234. psychopy/app/plugin_manager/dialog.py +34 -96
  235. psychopy/app/plugin_manager/packages.py +10 -14
  236. psychopy/app/plugin_manager/plugins.py +64 -4
  237. psychopy/app/preferencesDlg.py +12 -37
  238. psychopy/app/psychopyApp.py +130 -44
  239. psychopy/app/ribbon.py +1 -0
  240. psychopy/app/runner/runner.py +19 -7
  241. psychopy/app/runner/scriptProcess.py +11 -6
  242. psychopy/app/stdout/stdOutRich.py +9 -2
  243. psychopy/app/themes/fonts.py +1 -1
  244. psychopy/app/themes/icons.py +2 -38
  245. psychopy/app/ui/__init__.py +1 -1
  246. psychopy/app/utils.py +3 -3
  247. psychopy/assets/default.mp3 +0 -0
  248. psychopy/assets/fonts/NotoSans-Bold.ttf +0 -0
  249. psychopy/assets/fonts/NotoSans-BoldItalic.ttf +0 -0
  250. psychopy/assets/fonts/NotoSans-Italic.ttf +0 -0
  251. psychopy/assets/fonts/NotoSans-Regular.ttf +0 -0
  252. psychopy/assets/voicekeyThresholdStim.wav +0 -0
  253. psychopy/clock.py +4 -1
  254. psychopy/colors.py +12 -5
  255. psychopy/core.py +1 -1
  256. psychopy/data/base.py +1 -1
  257. psychopy/data/experiment.py +151 -46
  258. psychopy/data/routine.py +27 -1
  259. psychopy/data/staircase.py +2 -1
  260. psychopy/data/trial.py +62 -14
  261. psychopy/data/utils.py +2 -2
  262. psychopy/demos/builder/Design Templates/branchedExperiment/branchedExperiment.psyexp +333 -218
  263. psychopy/demos/builder/Design Templates/psychophysicsStaircase/psychophysicsStaircase.psyexp +261 -239
  264. psychopy/demos/builder/Design Templates/psychophysicsStairsInterleaved/psychophysicsStaircaseInterleaved.psyexp +319 -180
  265. psychopy/demos/builder/Design Templates/randomisedBlocks/randomisedBlocks.psyexp +204 -116
  266. psychopy/demos/builder/Experiments/BART/assets/background.jpg +0 -0
  267. psychopy/demos/builder/Experiments/BART/assets/blueBalloon.png +0 -0
  268. psychopy/demos/builder/Experiments/BART/assets/greenBalloon.png +0 -0
  269. psychopy/demos/builder/Experiments/BART/assets/redBalloon.png +0 -0
  270. psychopy/demos/builder/Experiments/BART/bart.psyexp +779 -866
  271. psychopy/demos/builder/Experiments/BigFiveInventory/BFI.psyexp +242 -180
  272. psychopy/demos/builder/Experiments/GoNoGo/gng.psyexp +419 -406
  273. psychopy/demos/builder/Experiments/dragAndDrop/README.md +2 -37
  274. psychopy/demos/builder/Experiments/dragAndDrop/drag_and_drop.psyexp +460 -1204
  275. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/blank_grid.png +0 -0
  276. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/make_shapes.psyexp +221 -0
  277. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/readme.md +4 -0
  278. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_1.png +0 -0
  279. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_10.png +0 -0
  280. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_2.png +0 -0
  281. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_3.png +0 -0
  282. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_4.png +0 -0
  283. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_5.png +0 -0
  284. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_6.png +0 -0
  285. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_7.png +0 -0
  286. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_8.png +0 -0
  287. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_9.png +0 -0
  288. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solutions.xlsx +0 -0
  289. psychopy/demos/builder/Experiments/mentalRotation/MentalRotation.psyexp +583 -542
  290. psychopy/demos/builder/Experiments/navon/NavonTask.psyexp +458 -427
  291. psychopy/demos/builder/Experiments/sternberg/sternberg.psyexp +588 -550
  292. psychopy/demos/builder/Experiments/stroop/stroop.psyexp +303 -207
  293. psychopy/demos/builder/Experiments/stroopExtended/stroop.psyexp +390 -215
  294. psychopy/demos/builder/Experiments/stroopExtended/stroopReverse.psyexp +390 -215
  295. psychopy/demos/builder/Experiments/stroopVoice/stroopVoice.psyexp +357 -331
  296. psychopy/demos/builder/Feature Demos/buttonBox/buttonBoxDemo.psyexp +3 -2
  297. psychopy/demos/builder/Feature Demos/counterbalance/counterbalance.psyexp +287 -277
  298. psychopy/demos/builder/Feature Demos/gratings/gratings.psyexp +370 -320
  299. psychopy/demos/builder/Feature Demos/noise/noise.psyexp +452 -399
  300. psychopy/demos/builder/Feature Demos/panorama/panorama.psyexp +168 -133
  301. psychopy/demos/builder/Feature Demos/pilotMode/pilotMode.psyexp +4 -3
  302. psychopy/demos/builder/Feature Demos/progress/progressBar.psyexp +420 -392
  303. psychopy/demos/builder/Feature Demos/sliders/sliders.psyexp +917 -871
  304. psychopy/demos/builder/Feature Demos/visualValidator/readme.md +7 -0
  305. psychopy/demos/builder/Feature Demos/visualValidator/visualValidator.psyexp +200 -0
  306. psychopy/demos/builder/Hardware/EEG_parallel_component/EEG_triggers_parallel_comp.psyexp +25 -9
  307. psychopy/demos/builder/Hardware/EEG_serial_code/EEG_triggers_serial_code.psyexp +372 -361
  308. psychopy/demos/builder/Hardware/EEG_serial_component/EEG_triggers_serial_comp.psyexp +25 -9
  309. psychopy/demos/builder/Hardware/EGI_netstation/stroop.psyexp +320 -235
  310. psychopy/demos/builder/Hardware/Eyetracking_visual_search/visualSearch.psyexp +790 -651
  311. psychopy/demos/builder/Hardware/camera/camera.psyexp +326 -246
  312. psychopy/demos/builder/Hardware/eyetracking/eyetracking.psyexp +432 -327
  313. psychopy/demos/builder/Hardware/eyetracking_custom_cal/eyetracking_custom_cal.psyexp +440 -321
  314. psychopy/demos/builder/Hardware/fMRI/fMRI_demo.psyexp +190 -181
  315. psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo.psyexp +323 -312
  316. psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo_legacy.psyexp +360 -0
  317. psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo_legacy_legacy.psyexp +312 -0
  318. psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy.psyexp +329 -273
  319. psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy_legacy.psyexp +360 -0
  320. psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy_legacy_legacy.psyexp +312 -0
  321. psychopy/demos/builder/Hardware/microphone/microphone.psyexp +450 -404
  322. psychopy/demos/builder/Hardware/pump/pump.psyexp +593 -329
  323. psychopy/demos/builder/Helper Tools/achorVSalignment/FlowCircular-Regular.ttf +0 -0
  324. psychopy/demos/builder/Helper Tools/achorVSalignment/anchorAlignment.psyexp +336 -274
  325. psychopy/demos/builder/Helper Tools/clockFace/clockFace.psyexp +200 -149
  326. psychopy/demos/builder/Helper Tools/colors/colors.psyexp +300 -279
  327. psychopy/demos/builder/Helper Tools/drawPolygon/drawPolygon.psyexp +677 -564
  328. psychopy/demos/builder/Helper Tools/keyNameFinder/keyNameFinder.psyexp +214 -158
  329. psychopy/demos/builder/Helper Tools/spatialUnits/unitDemo.psyexp +195 -146
  330. psychopy/demos/coder/experiment control/runtimeInfo.py +1 -1
  331. psychopy/devices/__init__.py +1 -1
  332. psychopy/event.py +1 -1
  333. psychopy/exceptions.py +1 -1
  334. psychopy/experiment/__init__.py +1 -1
  335. psychopy/experiment/_experiment.py +30 -9
  336. psychopy/experiment/components/__init__.py +1 -6
  337. psychopy/experiment/components/_base.py +44 -19
  338. psychopy/experiment/components/aperture/__init__.py +1 -1
  339. psychopy/experiment/components/brush/__init__.py +2 -2
  340. psychopy/experiment/components/button/__init__.py +24 -28
  341. psychopy/experiment/components/camera/__init__.py +38 -39
  342. psychopy/experiment/components/code/__init__.py +1 -1
  343. psychopy/experiment/components/dots/__init__.py +1 -1
  344. psychopy/experiment/components/eyetracker_record/__init__.py +7 -3
  345. psychopy/experiment/components/form/__init__.py +3 -3
  346. psychopy/experiment/components/grating/__init__.py +1 -1
  347. psychopy/experiment/components/image/__init__.py +1 -1
  348. psychopy/experiment/components/joyButtons/__init__.py +2 -2
  349. psychopy/experiment/components/joyButtons/virtualJoyButtons.py +1 -1
  350. psychopy/experiment/components/joystick/__init__.py +3 -3
  351. psychopy/experiment/components/joystick/virtualJoystick.py +1 -1
  352. psychopy/experiment/components/keyboard/__init__.py +98 -122
  353. psychopy/experiment/components/microphone/__init__.py +54 -98
  354. psychopy/experiment/components/mouse/__init__.py +92 -93
  355. psychopy/experiment/components/movie/__init__.py +28 -50
  356. psychopy/experiment/components/parallelOut/__init__.py +3 -3
  357. psychopy/experiment/components/polygon/__init__.py +2 -3
  358. psychopy/experiment/components/roi/__init__.py +2 -2
  359. psychopy/experiment/components/routineSettings/__init__.py +2 -0
  360. psychopy/experiment/components/serialOut/__init__.py +7 -7
  361. psychopy/experiment/components/settings/__init__.py +317 -313
  362. psychopy/experiment/components/settings/eyetracking.py +108 -0
  363. psychopy/experiment/components/slider/__init__.py +5 -5
  364. psychopy/experiment/components/sound/__init__.py +168 -78
  365. psychopy/experiment/components/soundsensor/__init__.py +361 -0
  366. psychopy/experiment/components/soundsensor/classic/soundsensor.png +0 -0
  367. psychopy/experiment/components/soundsensor/classic/soundsensor@2x.png +0 -0
  368. psychopy/experiment/components/soundsensor/dark/soundsensor.png +0 -0
  369. psychopy/experiment/components/soundsensor/dark/soundsensor@2x.png +0 -0
  370. psychopy/experiment/components/soundsensor/light/soundsensor.png +0 -0
  371. psychopy/experiment/components/soundsensor/light/soundsensor@2x.png +0 -0
  372. psychopy/experiment/components/static/__init__.py +59 -33
  373. psychopy/experiment/components/text/__init__.py +2 -6
  374. psychopy/experiment/components/textbox/__init__.py +3 -7
  375. psychopy/experiment/components/unknown/__init__.py +2 -0
  376. psychopy/experiment/components/unknownPlugin/__init__.py +2 -0
  377. psychopy/experiment/exports.py +1 -1
  378. psychopy/experiment/flow.py +2 -2
  379. psychopy/experiment/localization.py +1 -1
  380. psychopy/experiment/loops.py +43 -10
  381. psychopy/experiment/params.py +6 -4
  382. psychopy/experiment/plugins.py +8 -1
  383. psychopy/experiment/py2js.py +1 -1
  384. psychopy/experiment/py2js_transpiler.py +1 -1
  385. psychopy/experiment/routines/__init__.py +1 -1
  386. psychopy/experiment/routines/_base.py +23 -24
  387. psychopy/experiment/routines/audioValidator/__init__.py +343 -0
  388. psychopy/experiment/routines/audioValidator/classic/audio_validator.png +0 -0
  389. psychopy/experiment/routines/audioValidator/classic/audio_validator@2x.png +0 -0
  390. psychopy/experiment/routines/audioValidator/dark/audio_validator.png +0 -0
  391. psychopy/experiment/routines/audioValidator/dark/audio_validator@2x.png +0 -0
  392. psychopy/experiment/routines/audioValidator/light/audio_validator.png +0 -0
  393. psychopy/experiment/routines/audioValidator/light/audio_validator@2x.png +0 -0
  394. psychopy/experiment/routines/eyetracker_calibrate/__init__.py +76 -17
  395. psychopy/experiment/routines/eyetracker_validate/__init__.py +1 -1
  396. psychopy/experiment/routines/unknown/__init__.py +2 -0
  397. psychopy/experiment/routines/{photodiodeValidator → visualValidator}/__init__.py +89 -120
  398. psychopy/experiment/routines/visualValidator/classic/visual_validator.png +0 -0
  399. psychopy/experiment/routines/visualValidator/classic/visual_validator@2x.png +0 -0
  400. psychopy/experiment/routines/visualValidator/dark/visual_validator.png +0 -0
  401. psychopy/experiment/routines/visualValidator/dark/visual_validator@2x.png +0 -0
  402. psychopy/experiment/routines/visualValidator/light/visual_validator.png +0 -0
  403. psychopy/experiment/routines/visualValidator/light/visual_validator@2x.png +0 -0
  404. psychopy/experiment/utils.py +1 -1
  405. psychopy/gui/__init__.py +1 -1
  406. psychopy/gui/qtgui.py +15 -6
  407. psychopy/gui/wxgui.py +1 -1
  408. psychopy/hardware/__init__.py +0 -1
  409. psychopy/hardware/base.py +147 -16
  410. psychopy/hardware/bbtk/__init__.py +10 -16
  411. psychopy/hardware/brainproducts.py +7 -13
  412. psychopy/hardware/button.py +21 -2
  413. psychopy/hardware/buttonbox/__init__.py +1 -1
  414. psychopy/hardware/camera/__init__.py +18 -5
  415. psychopy/hardware/cedrus.py +5 -16
  416. psychopy/hardware/crs/__init__.py +1 -1
  417. psychopy/hardware/crs/bits.py +36 -33
  418. psychopy/hardware/crs/colorcal.py +8 -11
  419. psychopy/hardware/crs/optical.py +7 -10
  420. psychopy/hardware/crs/shaders.py +18 -5
  421. psychopy/hardware/emotiv.py +1 -1
  422. psychopy/hardware/emulator.py +11 -5
  423. psychopy/hardware/exceptions.py +86 -0
  424. psychopy/hardware/forp.py +18 -23
  425. psychopy/hardware/gammasci.py +8 -3
  426. psychopy/hardware/iolab.py +8 -19
  427. psychopy/hardware/joystick/__init__.py +865 -266
  428. psychopy/hardware/joystick/_base.py +251 -0
  429. psychopy/hardware/joystick/backend_glfw.py +306 -0
  430. psychopy/hardware/joystick/backend_pyglet.py +309 -0
  431. psychopy/hardware/joystick/mappings.py +287 -0
  432. psychopy/hardware/keyboard.py +4 -2
  433. psychopy/hardware/labhackers.py +1 -1
  434. psychopy/hardware/labjacks.py +9 -13
  435. psychopy/hardware/{photodiode.py → lightsensor.py} +146 -203
  436. psychopy/hardware/listener.py +9 -8
  437. psychopy/hardware/manager.py +24 -35
  438. psychopy/hardware/microphone.py +535 -155
  439. psychopy/hardware/minolta.py +14 -4
  440. psychopy/hardware/mouse/__init__.py +1 -1
  441. psychopy/hardware/photometer/__init__.py +2 -2
  442. psychopy/hardware/pr.py +14 -4
  443. psychopy/hardware/qmix.py +18 -27
  444. psychopy/hardware/serialdevice.py +43 -12
  445. psychopy/hardware/soundsensor.py +473 -0
  446. psychopy/hardware/spatial/__init__.py +231 -0
  447. psychopy/hardware/speaker.py +298 -36
  448. psychopy/hardware/triggerbox/__init__.py +1 -1
  449. psychopy/hardware/triggerbox/base.py +1 -1
  450. psychopy/hardware/triggerbox/parallel.py +1 -1
  451. psychopy/info.py +1 -1
  452. psychopy/iohub/devices/eyetracker/__init__.py +10 -18
  453. psychopy/iohub/devices/eyetracker/calibration/procedure.py +15 -33
  454. psychopy/iohub/devices/eyetracker/hw/gazepoint/__init__.py +2 -2
  455. psychopy/iohub/devices/eyetracker/hw/gazepoint/gp3/__init__.py +1 -0
  456. psychopy/iohub/devices/eyetracker/hw/gazepoint/gp3/eyetracker.py +10 -0
  457. psychopy/iohub/devices/eyetracker/hw/pupil_labs/neon/__init__.py +1 -0
  458. psychopy/iohub/devices/mouse/linux2.py +2 -1
  459. psychopy/layout.py +1 -1
  460. psychopy/liaison.py +91 -39
  461. psychopy/locale_setup.py +11 -1
  462. psychopy/localization/__init__.py +1 -1
  463. psychopy/localization/_localization.py +1 -1
  464. psychopy/localization/messages.pot +2 -2
  465. psychopy/logging.py +14 -12
  466. psychopy/microphone.py +4 -3
  467. psychopy/misc.py +1 -1
  468. psychopy/monitors/MonitorCenter.py +3 -3
  469. psychopy/monitors/__init__.py +1 -1
  470. psychopy/monitors/calibData.py +1 -1
  471. psychopy/monitors/calibTools.py +3 -2
  472. psychopy/platform_specific/__init__.py +1 -1
  473. psychopy/platform_specific/darwin.py +1 -1
  474. psychopy/platform_specific/linux.py +1 -1
  475. psychopy/platform_specific/win32.py +1 -1
  476. psychopy/plugins/__init__.py +26 -17
  477. psychopy/plugins/util.py +65 -0
  478. psychopy/preferences/Darwin.spec +11 -3
  479. psychopy/preferences/FreeBSD.spec +11 -3
  480. psychopy/preferences/Linux.spec +11 -3
  481. psychopy/preferences/Windows.spec +11 -3
  482. psychopy/preferences/__init__.py +1 -1
  483. psychopy/preferences/baseNoArch.spec +11 -3
  484. psychopy/preferences/hints.py +78 -61
  485. psychopy/preferences/preferences.py +82 -13
  486. psychopy/projects/__init__.py +1 -1
  487. psychopy/projects/pavlovia.py +29 -13
  488. psychopy/scripts/psyexpCompile.py +1 -1
  489. psychopy/session.py +81 -8
  490. psychopy/sound/__init__.py +25 -10
  491. psychopy/sound/_base.py +134 -34
  492. psychopy/sound/audioclip.py +38 -15
  493. psychopy/sound/audiodevice.py +1 -1
  494. psychopy/sound/backend_ptb.py +53 -321
  495. psychopy/sound/backend_pygame.py +7 -3
  496. psychopy/sound/backend_pyo.py +53 -22
  497. psychopy/sound/backend_pysound.py +10 -27
  498. psychopy/sound/backend_sounddevice.py +33 -21
  499. psychopy/sound/exceptions.py +1 -1
  500. psychopy/sound/microphone.py +83 -5
  501. psychopy/sound/transcribe.py +3 -3
  502. psychopy/tests/data/test_basic_run.py +1 -0
  503. psychopy/tests/data/test_sounds/default_16000.wav +0 -0
  504. psychopy/tests/data/test_sounds/default_192000.wav +0 -0
  505. psychopy/tests/data/test_sounds/default_22050.wav +0 -0
  506. psychopy/tests/data/test_sounds/default_32000.wav +0 -0
  507. psychopy/tests/data/test_sounds/default_44100.wav +0 -0
  508. psychopy/tests/data/test_sounds/default_48000.wav +0 -0
  509. psychopy/tests/data/test_sounds/default_8000.wav +0 -0
  510. psychopy/tests/data/test_sounds/default_96000.wav +0 -0
  511. psychopy/tests/test_alerts/test_alerttools.py +2 -1
  512. psychopy/tests/test_app/test_command_line.py +65 -0
  513. psychopy/tests/test_data/test_TrialHandler2.py +18 -7
  514. psychopy/tests/test_demos/test_builder_demos.py +1 -1
  515. psychopy/tests/test_experiment/needs_wx/componsTemplate.txt +5238 -4188
  516. psychopy/tests/test_experiment/needs_wx/test_components.py +1 -1
  517. psychopy/tests/test_experiment/test_components/test_RoutineSettingsComponent.py +16 -0
  518. psychopy/tests/test_experiment/test_components/test_all_components.py +1 -1
  519. psychopy/tests/test_experiment/test_components/test_base_components.py +26 -17
  520. psychopy/tests/test_experiment/test_loops.py +12 -4
  521. psychopy/tests/test_experiment/test_params.py +17 -4
  522. psychopy/tests/test_experiment/test_routines/test_PhotodiodeValidationRoutine.py +2 -2
  523. psychopy/tests/test_hardware/test_photodiode.py +66 -0
  524. psychopy/tests/test_liaison/test_Liaison.py +4 -4
  525. psychopy/tests/test_misc/test_clock.py +2 -0
  526. psychopy/tests/test_misc/test_color.py +2 -0
  527. psychopy/tests/test_misc/test_event.py +1 -0
  528. psychopy/tests/test_plugins/__init__.py +0 -0
  529. psychopy/tests/test_plugins/test_plugin_stubs.py +125 -0
  530. psychopy/tests/test_sound/test_sound.py +111 -40
  531. psychopy/tests/test_tools/test_colorspacetools.py +24 -23
  532. psychopy/tests/test_tools/test_mathtools.py +9 -9
  533. psychopy/tests/test_tools/test_viewtools.py +101 -0
  534. psychopy/tests/test_validators/__init__.py +0 -0
  535. psychopy/tests/test_validators/test_voicekeyValidator.py +95 -0
  536. psychopy/tests/test_visual/test_all_stimuli.py +2 -2
  537. psychopy/tests/test_visual/test_basevisual.py +37 -7
  538. psychopy/tests/test_visual/test_button.py +2 -2
  539. psychopy/tests/test_visual/test_circle.py +10 -2
  540. psychopy/tests/test_visual/test_dots.py +1 -1
  541. psychopy/tests/test_visual/test_form.py +13 -13
  542. psychopy/tests/test_visual/test_gamma.py +3 -3
  543. psychopy/tests/test_visual/test_image.py +2 -2
  544. psychopy/tests/test_visual/test_progress.py +2 -2
  545. psychopy/tests/test_visual/test_roi.py +8 -2
  546. psychopy/tests/test_visual/test_shape.py +2 -2
  547. psychopy/tests/test_visual/test_slider.py +2 -2
  548. psychopy/tests/test_visual/test_target.py +2 -2
  549. psychopy/tests/test_visual/test_textbox.py +6 -8
  550. psychopy/tests/test_visual/test_winScalePos.py +6 -5
  551. psychopy/tests/test_visual/test_window.py +17 -0
  552. psychopy/tests/utils.py +51 -1
  553. psychopy/tools/__init__.py +1 -1
  554. psychopy/tools/arraytools.py +2 -2
  555. psychopy/tools/attributetools.py +52 -1
  556. psychopy/tools/audiotools.py +4 -1
  557. psychopy/tools/colorspacetools.py +6 -4
  558. psychopy/tools/coordinatetools.py +1 -1
  559. psychopy/tools/fileerrortools.py +21 -9
  560. psychopy/tools/filetools.py +2 -2
  561. psychopy/tools/fontmanager.py +47 -28
  562. psychopy/tools/gltools.py +2967 -559
  563. psychopy/tools/imagetools.py +1 -1
  564. psychopy/tools/mathtools.py +997 -127
  565. psychopy/tools/monitorunittools.py +7 -1
  566. psychopy/tools/movietools.py +1 -2
  567. psychopy/tools/pkgtools.py +157 -127
  568. psychopy/tools/plottools.py +1 -1
  569. psychopy/tools/rifttools.py +1 -1
  570. psychopy/tools/stereotools.py +1 -1
  571. psychopy/tools/stimulustools.py +172 -2
  572. psychopy/tools/stringtools.py +22 -2
  573. psychopy/tools/systemtools.py +1 -1
  574. psychopy/tools/typetools.py +1 -1
  575. psychopy/tools/unittools.py +1 -1
  576. psychopy/tools/versionchooser.py +3 -1
  577. psychopy/tools/viewtools.py +54 -70
  578. psychopy/tools/wizard.py +2 -2
  579. psychopy/validation/__init__.py +6 -0
  580. psychopy/validation/audio.py +74 -0
  581. psychopy/validation/visual.py +115 -0
  582. psychopy/visual/__init__.py +1 -4
  583. psychopy/visual/aperture.py +9 -6
  584. psychopy/visual/backends/__init__.py +1 -1
  585. psychopy/visual/backends/_base.py +1 -1
  586. psychopy/visual/backends/gamma.py +1 -1
  587. psychopy/visual/backends/glfwbackend.py +8 -12
  588. psychopy/visual/backends/pygamebackend.py +1 -1
  589. psychopy/visual/backends/pygletbackend.py +32 -11
  590. psychopy/visual/basevisual.py +93 -13
  591. psychopy/visual/brush.py +1 -1
  592. psychopy/visual/bufferimage.py +90 -10
  593. psychopy/visual/button.py +1 -1
  594. psychopy/visual/circle.py +12 -20
  595. psychopy/visual/custommouse.py +1 -1
  596. psychopy/visual/dot.py +80 -14
  597. psychopy/visual/elementarray.py +84 -10
  598. psychopy/visual/filters.py +1 -1
  599. psychopy/visual/form.py +43 -28
  600. psychopy/visual/grating.py +105 -25
  601. psychopy/visual/helpers.py +4 -2
  602. psychopy/visual/image.py +98 -20
  603. psychopy/visual/line.py +15 -25
  604. psychopy/visual/movie.py +1 -1
  605. psychopy/visual/movie2.py +4 -3
  606. psychopy/visual/movie3.py +4 -3
  607. psychopy/visual/movies/__init__.py +1 -1
  608. psychopy/visual/movies/frame.py +1 -1
  609. psychopy/visual/movies/metadata.py +1 -1
  610. psychopy/visual/movies/players/__init__.py +1 -1
  611. psychopy/visual/movies/players/_base.py +1 -1
  612. psychopy/visual/movies/players/ffpyplayer_player.py +2 -3
  613. psychopy/visual/nnlvs.py +9 -6
  614. psychopy/visual/noise.py +4 -16
  615. psychopy/visual/patch.py +4 -3
  616. psychopy/visual/pie.py +3 -14
  617. psychopy/visual/polygon.py +21 -28
  618. psychopy/visual/radial.py +4 -18
  619. psychopy/visual/ratingscale.py +4 -3
  620. psychopy/visual/rect.py +16 -25
  621. psychopy/visual/rift.py +8 -2
  622. psychopy/visual/secondorder.py +4 -16
  623. psychopy/visual/shaders.py +620 -286
  624. psychopy/visual/shape.py +281 -90
  625. psychopy/visual/simpleimage.py +1 -1
  626. psychopy/visual/slider.py +78 -25
  627. psychopy/visual/stim3d.py +5 -608
  628. psychopy/visual/text.py +13 -3
  629. psychopy/visual/textbox2/textbox2.py +188 -56
  630. psychopy/visual/vlcmoviestim.py +1 -1
  631. psychopy/visual/window.py +374 -201
  632. psychopy/web.py +1 -1
  633. {psychopy-2024.2.5.dist-info → psychopy-2025.1.1.dist-info}/METADATA +13 -12
  634. {psychopy-2024.2.5.dist-info → psychopy-2025.1.1.dist-info}/RECORD +647 -624
  635. {psychopy-2024.2.5.dist-info → psychopy-2025.1.1.dist-info}/WHEEL +1 -1
  636. psychopy/.DS_Store +0 -0
  637. psychopy/__init__.py.orig +0 -65
  638. psychopy/app/.DS_Store +0 -0
  639. psychopy/app/Resources/.DS_Store +0 -0
  640. psychopy/app/Resources/classic/filecsv16.png +0 -0
  641. psychopy/app/Resources/classic/fileimage16.png +0 -0
  642. psychopy/app/Resources/classic/fileunknown16.png +0 -0
  643. psychopy/app/Resources/dark/filecsv16.png +0 -0
  644. psychopy/app/Resources/dark/filecsv16@2x.png +0 -0
  645. psychopy/app/Resources/dark/fileimage16.png +0 -0
  646. psychopy/app/Resources/dark/fileimage16@2x.png +0 -0
  647. psychopy/app/Resources/dark/fileunknown16.png +0 -0
  648. psychopy/app/Resources/dark/fileunknown16@2x.png +0 -0
  649. psychopy/app/Resources/fonts/OpenSans-Bold.ttf +0 -0
  650. psychopy/app/Resources/fonts/OpenSans-BoldItalic.ttf +0 -0
  651. psychopy/app/Resources/fonts/OpenSans-ExtraBold.ttf +0 -0
  652. psychopy/app/Resources/fonts/OpenSans-ExtraBoldItalic.ttf +0 -0
  653. psychopy/app/Resources/fonts/OpenSans-Italic.ttf +0 -0
  654. psychopy/app/Resources/fonts/OpenSans-Light.ttf +0 -0
  655. psychopy/app/Resources/fonts/OpenSans-LightItalic.ttf +0 -0
  656. psychopy/app/Resources/fonts/OpenSans-Regular.ttf +0 -0
  657. psychopy/app/Resources/fonts/OpenSans-SemiBold.ttf +0 -0
  658. psychopy/app/Resources/fonts/OpenSans-SemiBoldItalic.ttf +0 -0
  659. psychopy/app/Resources/light/filecsv16.png +0 -0
  660. psychopy/app/Resources/light/filecsv16@2x.png +0 -0
  661. psychopy/app/Resources/light/fileimage16.png +0 -0
  662. psychopy/app/Resources/light/fileimage16@2x.png +0 -0
  663. psychopy/app/Resources/light/fileunknown16.png +0 -0
  664. psychopy/app/Resources/light/fileunknown16@2x.png +0 -0
  665. psychopy/app/Resources/psychopySplash.png +0 -0
  666. psychopy/app/Resources/psychopySplash@2x.png +0 -0
  667. psychopy/app/builder/builder.py.orig +0 -3932
  668. psychopy/app/builder/dialogs/__init__.py.orig +0 -1679
  669. psychopy/app/builder/dialogs/paramCtrls.py.orig +0 -713
  670. psychopy/app/colorpicker/__init__.py.orig +0 -411
  671. psychopy/app/locale/ar_001/.DS_Store +0 -0
  672. psychopy/app/locale/ar_001/LC_MESSAGE/.DS_Store +0 -0
  673. psychopy/core.py.orig +0 -169
  674. psychopy/demos/builder/.DS_Store +0 -0
  675. psychopy/demos/builder/Design Templates/randomisedBlocks/randomisedBlocks_lastrun.py +0 -330
  676. psychopy/demos/builder/Experiments/.DS_Store +0 -0
  677. psychopy/demos/builder/Experiments/dragAndDrop/archived_conditions.xlsx +0 -0
  678. psychopy/demos/builder/Experiments/dragAndDrop/draw grid stim.py +0 -61
  679. psychopy/demos/builder/Experiments/dragAndDrop/shapeMaker.psyexp +0 -91
  680. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_1.png +0 -0
  681. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_10.png +0 -0
  682. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_2.png +0 -0
  683. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_3.png +0 -0
  684. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_4.png +0 -0
  685. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_5.png +0 -0
  686. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_6.png +0 -0
  687. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_7.png +0 -0
  688. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_8.png +0 -0
  689. psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_9.png +0 -0
  690. psychopy/demos/builder/Experiments/dragAndDrop/updated_conditions.xlsx +0 -0
  691. psychopy/demos/builder/Tools/.DS_Store +0 -0
  692. psychopy/demos/builder/Tools/gammaCalibration/.DS_Store +0 -0
  693. psychopy/demos/builder/Tools/gammaCalibration/data/.DS_Store +0 -0
  694. psychopy/demos/builder/Tools/gammaCalibration/data/_gamma_correction_visual_2022-05-18_14h18.29.439.csv +0 -38
  695. psychopy/demos/builder/Tools/gammaCalibration/data/_gamma_correction_visual_2022-05-18_14h18.29.439.log +0 -3418
  696. psychopy/demos/builder/Tools/gammaCalibration/data/_gamma_correction_visual_2022-05-18_14h18.29.439.psydat +0 -0
  697. psychopy/demos/builder/Tools/gammaCalibration/data/x1_gamma_correction_visual_2022-05-17_13h59.42.928.csv +0 -2
  698. psychopy/demos/builder/Tools/gammaCalibration/data/x1_gamma_correction_visual_2022-05-17_13h59.42.928.log +0 -15
  699. psychopy/demos/builder/Tools/gammaCalibration/data/x1_gamma_correction_visual_2022-05-17_13h59.42.928.psydat +0 -0
  700. psychopy/demos/builder/Tools/gammaCalibration/gamma_correction_visual_lastrun.py +0 -562
  701. psychopy/demos/coder/.DS_Store +0 -0
  702. psychopy/demos/coder/experiment control/info_gamma.pickle +0 -0
  703. psychopy/demos/coder/iohub/.iohpid +0 -1
  704. psychopy/demos/coder/iohub/eyetracking/.iohpid +0 -1
  705. psychopy/demos/coder/iohub/wintab/.DS_Store +0 -0
  706. psychopy/demos/coder/stimuli/.DS_Store +0 -0
  707. psychopy/experiment/_experiment.py.orig +0 -1032
  708. psychopy/experiment/components/.DS_Store +0 -0
  709. psychopy/experiment/components/_base.py.orig +0 -823
  710. psychopy/experiment/components/form/.DS_Store +0 -0
  711. psychopy/experiment/components/microphone/__init__.py.orig +0 -490
  712. psychopy/experiment/components/settings/__init__.py.orig +0 -1337
  713. psychopy/experiment/components/textbox/__init__.py.orig +0 -310
  714. psychopy/experiment/components/webcam/.DS_Store +0 -0
  715. psychopy/experiment/components/webcam/light/.DS_Store +0 -0
  716. psychopy/experiment/loops.py.orig +0 -829
  717. psychopy/experiment/params.py.orig +0 -408
  718. psychopy/experiment/routine.py.orig +0 -503
  719. psychopy/experiment/routines/photodiodeValidator/classic/photodiode_validator.png +0 -0
  720. psychopy/experiment/routines/photodiodeValidator/classic/photodiode_validator@2x.png +0 -0
  721. psychopy/experiment/routines/photodiodeValidator/dark/photodiode_validator.png +0 -0
  722. psychopy/experiment/routines/photodiodeValidator/dark/photodiode_validator@2x.png +0 -0
  723. psychopy/experiment/routines/photodiodeValidator/light/photodiode_validator.png +0 -0
  724. psychopy/experiment/routines/photodiodeValidator/light/photodiode_validator@2x.png +0 -0
  725. psychopy/hardware/.DS_Store +0 -0
  726. psychopy/hardware/brainproducts.py.orig +0 -680
  727. psychopy/hardware/iolab.py.orig +0 -238
  728. psychopy/iohub/datastore/__init__.py.orig +0 -443
  729. psychopy/iohub/datastore/util.py.orig +0 -692
  730. psychopy/iohub/devices/mouse/darwin.py.orig +0 -427
  731. psychopy/iohub/devices/mouse/linux2.py.orig +0 -198
  732. psychopy/preferences/.DS_Store +0 -0
  733. psychopy/projects/pavlovia.py.orig +0 -1295
  734. psychopy/tests/.DS_Store +0 -0
  735. psychopy/tests/data/.DS_Store +0 -0
  736. psychopy/tests/data/TestCircle_fill_local.png +0 -0
  737. psychopy/tests/data/aperture1_normHexbackground_local.png +0 -0
  738. psychopy/tests/data/aperture1_norm_local.png +0 -0
  739. psychopy/tests/data/aperture2_normHexbackground_local.png +0 -0
  740. psychopy/tests/data/beatandrcos_height_local.png +0 -0
  741. psychopy/tests/data/beatandrcos_normAddBlend_local.png +0 -0
  742. psychopy/tests/data/beatandrcos_normHexbackground_local.png +0 -0
  743. psychopy/tests/data/beatandrcos_norm_local.png +0 -0
  744. psychopy/tests/data/beatandrcos_stencil_local.png +0 -0
  745. psychopy/tests/data/blend_add_height_local.png +0 -0
  746. psychopy/tests/data/blend_add_normAddBlend_local.png +0 -0
  747. psychopy/tests/data/blend_add_normHexbackground_local.png +0 -0
  748. psychopy/tests/data/blend_add_normNoShade_local.png +0 -0
  749. psychopy/tests/data/blend_add_norm_local.png +0 -0
  750. psychopy/tests/data/blend_add_stencil_local.png +0 -0
  751. psychopy/tests/data/bufferimg_gabor_height_local.png +0 -0
  752. psychopy/tests/data/bufferimg_gabor_normAddBlend_local.png +0 -0
  753. psychopy/tests/data/bufferimg_gabor_normHexbackground_local.png +0 -0
  754. psychopy/tests/data/bufferimg_gabor_normNoShade_local.png +0 -0
  755. psychopy/tests/data/bufferimg_gabor_norm_local.png +0 -0
  756. psychopy/tests/data/bufferimg_gabor_stencil_local.png +0 -0
  757. psychopy/tests/data/circleHex_height_local.png +0 -0
  758. psychopy/tests/data/circleHex_normAddBlend_local.png +0 -0
  759. psychopy/tests/data/circleHex_normHexbackground_local.png +0 -0
  760. psychopy/tests/data/circleHex_normNoShade_local.png +0 -0
  761. psychopy/tests/data/circleHex_norm_local.png +0 -0
  762. psychopy/tests/data/circleHex_stencil_local.png +0 -0
  763. psychopy/tests/data/color_comparison_local.png +0 -0
  764. psychopy/tests/data/correctScript/.DS_Store +0 -0
  765. psychopy/tests/data/dots_height_local.png +0 -0
  766. psychopy/tests/data/dots_normAddBlend_local.png +0 -0
  767. psychopy/tests/data/dots_normHexbackground_local.png +0 -0
  768. psychopy/tests/data/dots_normNoShade_local.png +0 -0
  769. psychopy/tests/data/dots_norm_local.png +0 -0
  770. psychopy/tests/data/dots_stencil_local.png +0 -0
  771. psychopy/tests/data/elarray1_height_local.png +0 -0
  772. psychopy/tests/data/elarray1_normAddBlend_local.png +0 -0
  773. psychopy/tests/data/elarray1_normHexbackground_local.png +0 -0
  774. psychopy/tests/data/elarray1_norm_local.png +0 -0
  775. psychopy/tests/data/elarray1_stencil_local.png +0 -0
  776. psychopy/tests/data/envelopeandrcos_height_local.png +0 -0
  777. psychopy/tests/data/envelopeandrcos_normAddBlend_local.png +0 -0
  778. psychopy/tests/data/envelopeandrcos_normHexbackground_local.png +0 -0
  779. psychopy/tests/data/envelopeandrcos_norm_local.png +0 -0
  780. psychopy/tests/data/envelopeandrcos_stencil_local.png +0 -0
  781. psychopy/tests/data/envelopepowerandrcos_height_local.png +0 -0
  782. psychopy/tests/data/envelopepowerandrcos_normAddBlend_local.png +0 -0
  783. psychopy/tests/data/envelopepowerandrcos_normHexbackground_local.png +0 -0
  784. psychopy/tests/data/envelopepowerandrcos_norm_local.png +0 -0
  785. psychopy/tests/data/envelopepowerandrcos_stencil_local.png +0 -0
  786. psychopy/tests/data/gabor1_height_local.png +0 -0
  787. psychopy/tests/data/gabor1_normAddBlend_local.png +0 -0
  788. psychopy/tests/data/gabor1_normHexbackground_local.png +0 -0
  789. psychopy/tests/data/gabor1_normNoShade_local.png +0 -0
  790. psychopy/tests/data/gabor1_norm_local.png +0 -0
  791. psychopy/tests/data/gabor1_stencil_local.png +0 -0
  792. psychopy/tests/data/greyscale_normHexbackground_local.png +0 -0
  793. psychopy/tests/data/imageAndGauss_height_local.png +0 -0
  794. psychopy/tests/data/imageAndGauss_normAddBlend_local.png +0 -0
  795. psychopy/tests/data/imageAndGauss_normHexbackground_local.png +0 -0
  796. psychopy/tests/data/imageAndGauss_normNoShade_local.png +0 -0
  797. psychopy/tests/data/imageAndGauss_norm_local.png +0 -0
  798. psychopy/tests/data/imageAndGauss_stencil_local.png +0 -0
  799. psychopy/tests/data/movFrame1_stencil_local.png +0 -0
  800. psychopy/tests/data/noiseAndRcos_height_local.png +0 -0
  801. psychopy/tests/data/noiseAndRcos_normAddBlend_local.png +0 -0
  802. psychopy/tests/data/noiseAndRcos_normHexbackground_local.png +0 -0
  803. psychopy/tests/data/noiseAndRcos_normNoShade_local.png +0 -0
  804. psychopy/tests/data/noiseAndRcos_norm_local.png +0 -0
  805. psychopy/tests/data/noiseAndRcos_stencil_local.png +0 -0
  806. psychopy/tests/data/noiseFiltersAndRcos_height_local.png +0 -0
  807. psychopy/tests/data/noiseFiltersAndRcos_normAddBlend_local.png +0 -0
  808. psychopy/tests/data/noiseFiltersAndRcos_normHexbackground_local.png +0 -0
  809. psychopy/tests/data/noiseFiltersAndRcos_normNoShade_local.png +0 -0
  810. psychopy/tests/data/noiseFiltersAndRcos_norm_local.png +0 -0
  811. psychopy/tests/data/noiseFiltersAndRcos_stencil_local.png +0 -0
  812. psychopy/tests/data/numpyImage_height_local.png +0 -0
  813. psychopy/tests/data/numpyImage_normAddBlend_local.png +0 -0
  814. psychopy/tests/data/numpyImage_normHexbackground_local.png +0 -0
  815. psychopy/tests/data/numpyImage_normNoShade_local.png +0 -0
  816. psychopy/tests/data/numpyImage_norm_local.png +0 -0
  817. psychopy/tests/data/numpyImage_stencil_local.png +0 -0
  818. psychopy/tests/data/shape2_1_normAddBlend_local.png +0 -0
  819. psychopy/tests/data/shape2_1_normHexbackground_local.png +0 -0
  820. psychopy/tests/data/shape2_1_normNoShade_local.png +0 -0
  821. psychopy/tests/data/shape2_1_norm_local.png +0 -0
  822. psychopy/tests/data/shape2_1_stencil_local.png +0 -0
  823. psychopy/tests/data/text1_height_local.png +0 -0
  824. psychopy/tests/data/text1_normAddBlend_local.png +0 -0
  825. psychopy/tests/data/text1_normHexbackground_local.png +0 -0
  826. psychopy/tests/data/text1_norm_local.png +0 -0
  827. psychopy/tests/data/text1_stencil_local.png +0 -0
  828. psychopy/tests/data/wedge1_height_local.png +0 -0
  829. psychopy/tests/data/wedge1_normAddBlend_local.png +0 -0
  830. psychopy/tests/data/wedge1_normHexbackground_local.png +0 -0
  831. psychopy/tests/data/wedge1_normNoShade_local.png +0 -0
  832. psychopy/tests/data/wedge1_norm_local.png +0 -0
  833. psychopy/tests/data/wedge1_stencil_local.png +0 -0
  834. psychopy/tests/test_app/.DS_Store +0 -0
  835. psychopy/tests/test_app/test_builder/.DS_Store +0 -0
  836. psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1206.log +0 -177
  837. psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1206.psydat +0 -0
  838. psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1206.xlsx +0 -0
  839. psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1324.log +0 -168
  840. psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1324.psydat +0 -0
  841. psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1324.xlsx +0 -0
  842. psychopy/tests/test_data/.DS_Store +0 -0
  843. psychopy/tests/test_hardware/test_CRS_BitsSharp.py +0 -67
  844. psychopy/tests/test_hardware/test_CRS_BitsSharp.py.orig +0 -68
  845. psychopy/tests/test_hardware/test_CRS_bitsShaders.py +0 -110
  846. psychopy/tests/test_visual/test_image.py.orig +0 -219
  847. psychopy/visual/basevisual.py.orig +0 -1723
  848. psychopy/visual/form.py.orig +0 -1181
  849. psychopy/visual/text.py.orig +0 -752
  850. psychopy/visual/textbox2/textbox2.py.orig +0 -1315
  851. psychopy/visual/windowwarp.py.orig +0 -463
  852. /psychopy/{app/cortex.log → alerts/alertsCatalogue/3600.yaml} +0 -0
  853. /psychopy/{app/Resources → assets}/fonts/Arvo-Bold.ttf +0 -0
  854. /psychopy/{app/Resources → assets}/fonts/Arvo-BoldItalic.ttf +0 -0
  855. /psychopy/{app/Resources → assets}/fonts/Arvo-Italic.ttf +0 -0
  856. /psychopy/{app/Resources → assets}/fonts/Arvo-Regular.ttf +0 -0
  857. /psychopy/{app/Resources → assets}/fonts/DejaVuSerif.ttf +0 -0
  858. /psychopy/{app/Resources → assets}/fonts/IndieFlower-Regular.ttf +0 -0
  859. /psychopy/{app/Resources → assets}/fonts/JetBrainsMono-Italic-VariableFont_wght.ttf +0 -0
  860. /psychopy/{app/Resources → assets}/fonts/JetBrainsMono-VariableFont_wght.ttf +0 -0
  861. /psychopy/demos/builder/Experiments/{GoNoGo → goNoGo}/readme.md +0 -0
  862. {psychopy-2024.2.5.dist-info → psychopy-2025.1.1.dist-info}/entry_points.txt +0 -0
  863. {psychopy-2024.2.5.dist-info → psychopy-2025.1.1.dist-info}/licenses/LICENSE +0 -0
@@ -1,823 +0,0 @@
1
- #!/usr/bin/env python
2
- # -*- coding: utf-8 -*-
3
-
4
- """
5
- Part of the PsychoPy library
6
- Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2021 Open Science Tools Ltd.
7
- Distributed under the terms of the GNU General Public License (GPL).
8
- """
9
-
10
- from __future__ import absolute_import, print_function
11
-
12
- from builtins import str, object, super
13
- from past.builtins import basestring
14
-
15
- from psychopy import prefs
16
- from psychopy.constants import FOREVER
17
- from ..params import Param
18
- from psychopy.experiment.utils import CodeGenerationException
19
- from psychopy.experiment.utils import unescapedDollarSign_re
20
- from psychopy.experiment.params import getCodeFromParamStr
21
- from psychopy.alerts import alerttools
22
- from psychopy.colors import colorSpaces
23
-
24
- from psychopy.localization import _translate, _localized
25
-
26
-
27
- class BaseComponent(object):
28
- """A template for components, defining the methods to be overridden"""
29
- # override the categories property below
30
- # an attribute of the class, determines the section in the components panel
31
- categories = ['Custom']
32
- targets = ['PsychoPy']
33
-
34
- def __init__(self, exp, parentName, name='',
35
- startType='time (s)', startVal='',
36
- stopType='duration (s)', stopVal='',
37
- startEstim='', durationEstim='',
38
- saveStartStop=True, syncScreenRefresh=False,
39
- disabled=False):
40
- self.type = 'Base'
41
- self.exp = exp # so we can access the experiment if necess
42
- self.parentName = parentName # to access the routine too if needed
43
-
44
- self.params = {}
45
- self.depends = [] # allows params to turn each other off/on
46
- """{
47
- "dependsOn": "shape",
48
- "condition": "=='n vertices",
49
- "param": "n vertices",
50
- "true": "enable", # what to do with param if condition is True
51
- "false": "disable", # permitted: hide, show, enable, disable
52
- }"""
53
-
54
- msg = _translate(
55
- "Name of this component (alpha-numeric or _, no spaces)")
56
- self.params['name'] = Param(name,
57
- valType='code', inputType="single", categ='Basic',
58
- hint=msg,
59
- label=_localized['name'])
60
-
61
- msg = _translate("How do you want to define your start point?")
62
- self.params['startType'] = Param(startType,
63
- valType='str', inputType="choice", categ='Basic',
64
- allowedVals=['time (s)', 'frame N', 'condition'],
65
- hint=msg,
66
- label=_localized['startType'])
67
-
68
- msg = _translate("How do you want to define your end point?")
69
- self.params['stopType'] = Param(stopType,
70
- valType='str', inputType="choice", categ='Basic',
71
- allowedVals=['duration (s)', 'duration (frames)', 'time (s)',
72
- 'frame N', 'condition'],
73
- hint=msg,
74
- label=_localized['stopType'])
75
-
76
- self.params['startVal'] = Param(startVal,
77
- valType='num', inputType="single", categ='Basic',
78
- hint=_translate("When does the component start?"), allowedTypes=[],
79
- label=_localized['startVal'])
80
-
81
- self.params['stopVal'] = Param(stopVal,
82
- valType='num', inputType="single", categ='Basic',
83
- updates='constant', allowedUpdates=[], allowedTypes=[],
84
- hint=_translate("When does the component end? (blank is endless)"),
85
- label=_localized['stopVal'])
86
-
87
- msg = _translate("(Optional) expected start (s), purely for "
88
- "representing in the timeline")
89
- self.params['startEstim'] = Param(startEstim,
90
- valType='num', inputType="single", categ='Basic',
91
- hint=msg,allowedTypes=[],
92
- label=_localized['startEstim'])
93
-
94
- msg = _translate("(Optional) expected duration (s), purely for "
95
- "representing in the timeline")
96
- self.params['durationEstim'] = Param(durationEstim,
97
- valType='num', inputType="single", categ='Basic',
98
- hint=msg, allowedTypes=[],
99
- label=_localized['durationEstim'])
100
-
101
- msg = _translate("Store the onset/offset times in the data file "
102
- "(as well as in the log file).")
103
- self.params['saveStartStop'] = Param(saveStartStop,
104
- valType='bool', inputType="bool", categ='Data',
105
- hint=msg, allowedTypes=[],
106
- label=_translate('Save onset/offset times'))
107
-
108
- msg = _translate("Synchronize times with screen refresh (good for "
109
- "visual stimuli and responses based on them)")
110
- self.params['syncScreenRefresh'] = Param(syncScreenRefresh,
111
- valType='bool', inputType="bool", categ="Data",
112
- hint=msg, allowedTypes=[],
113
- label=_translate('Sync timing with screen refresh'))
114
-
115
- msg = _translate("Disable this component")
116
- self.params['disabled'] = Param(disabled,
117
- valType='bool', inputType="bool", categ="Testing",
118
- hint=msg, allowedTypes=[],
119
- label=_translate('Disable component'))
120
-
121
- self.order = ['name'] # name first, then timing, then others
122
-
123
- def integrityCheck(self):
124
- """
125
- Run component integrity checks for non-visual components
126
- """
127
- alerttools.testDisabled(self)
128
- alerttools.testStartEndTiming(self)
129
-
130
- def _dubiousConstantUpdates(self):
131
- """Return a list of fields in component that are set to be constant
132
- but seem intended to be dynamic. Some code fields are constant, and
133
- some denoted as code by $ are constant.
134
- """
135
- warnings = []
136
- # treat expInfo as likely to be constant; also treat its keys as
137
- # constant because its handy to make a short-cut in code:
138
- # exec(key+'=expInfo[key]')
139
- expInfo = self.exp.settings.getInfo()
140
- keywords = self.exp.namespace.nonUserBuilder[:]
141
- keywords.extend(['expInfo'] + list(expInfo.keys()))
142
- reserved = set(keywords).difference({'random', 'rand'})
143
- for key in self.params:
144
- field = self.params[key]
145
- if (not hasattr(field, 'val') or
146
- not isinstance(field.val, basestring)):
147
- continue # continue == no problem, no warning
148
- if not (field.allowedUpdates and
149
- isinstance(field.allowedUpdates, list) and
150
- len(field.allowedUpdates) and
151
- field.updates == 'constant'):
152
- continue
153
- # now have only non-empty, possibly-code, and 'constant' updating
154
- if field.valType == 'str':
155
- if not bool(unescapedDollarSign_re.search(field.val)):
156
- continue
157
- code = getCodeFromParamStr(field.val)
158
- elif field.valType == 'code':
159
- code = field.val
160
- else:
161
- continue
162
- # get var names in the code; no names == constant
163
- try:
164
- names = compile(code, '', 'eval').co_names
165
- except SyntaxError:
166
- continue
167
- # ignore reserved words:
168
- if not set(names).difference(reserved):
169
- continue
170
- warnings.append((field, key))
171
- return warnings or [(None, None)]
172
-
173
- def writeInitCode(self, buff):
174
- """Write any code that a component needs that should only ever be done
175
- at start of an experiment, BEFORE window creation.
176
- """
177
- pass
178
-
179
- def writeStartCode(self, buff):
180
- """Write any code that a component needs that should only ever be done
181
- at start of an experiment, AFTER window creation.
182
- """
183
- # e.g., create a data subdirectory unique to that component type.
184
- # Note: settings.writeStartCode() is done first, then
185
- # Routine.writeStartCode() will call this method for each component in
186
- # each routine
187
- pass
188
-
189
- def writeFrameCode(self, buff):
190
- """Write the code that will be called every frame
191
- """
192
- pass
193
-
194
- def writeRoutineStartCode(self, buff):
195
- """Write the code that will be called at the beginning of
196
- a routine (e.g. to update stimulus parameters)
197
- """
198
- self.writeParamUpdates(buff, 'set every repeat')
199
-
200
- def writeRoutineStartCodeJS(self, buff):
201
- """Same as writeRoutineStartCode, but for JS
202
- """
203
- self.writeParamUpdatesJS(buff, 'set every repeat')
204
-
205
- def writeRoutineEndCode(self, buff):
206
- """Write the code that will be called at the end of
207
- a routine (e.g. to save data)
208
- """
209
- if 'saveStartStop' in self.params and self.params['saveStartStop'].val:
210
-
211
- # what loop are we in (or thisExp)?
212
- if len(self.exp.flow._loopList):
213
- currLoop = self.exp.flow._loopList[-1] # last (outer-most) loop
214
- else:
215
- currLoop = self.exp._expHandler
216
-
217
- if 'Stair' in currLoop.type:
218
- addDataFunc = 'addOtherData'
219
- else:
220
- addDataFunc = 'addData'
221
-
222
- loop = currLoop.params['name']
223
- name = self.params['name']
224
- if self.params['syncScreenRefresh'].val:
225
- code = (
226
- f"{loop}.{addDataFunc}('{name}.started', {name}.tStartRefresh)\n"
227
- f"{loop}.{addDataFunc}('{name}.stopped', {name}.tStopRefresh)\n"
228
- )
229
- else:
230
- code = (
231
- f"{loop}.{addDataFunc}('{name}.started', {name}.tStart)\n"
232
- f"{loop}.{addDataFunc}('{name}.stopped', {name}.tStop)\n"
233
- )
234
- buff.writeIndentedLines(code)
235
-
236
- def writeRoutineEndCodeJS(self, buff):
237
- """Write the code that will be called at the end of
238
- a routine (e.g. to save data)
239
- """
240
- pass
241
-
242
- def writeExperimentEndCode(self, buff):
243
- """Write the code that will be called at the end of
244
- an experiment (e.g. save log files or reset hardware)
245
- """
246
- pass
247
-
248
- def writeStartTestCode(self, buff):
249
- """Test whether we need to start
250
- """
251
- if self.params['syncScreenRefresh']:
252
- tCompare = 'tThisFlip'
253
- else:
254
- tCompare = 't'
255
- params = self.params
256
- t = tCompare
257
- if self.params['startType'].val == 'time (s)':
258
- # if startVal is an empty string then set to be 0.0
259
- if (isinstance(self.params['startVal'].val, basestring) and
260
- not self.params['startVal'].val.strip()):
261
- self.params['startVal'].val = '0.0'
262
- code = (f"if {params['name']}.status == NOT_STARTED and "
263
- f"{t} >= {params['startVal']}-frameTolerance:\n")
264
- elif self.params['startType'].val == 'frame N':
265
- code = (f"if {params['name']}.status == NOT_STARTED and "
266
- f"frameN >= {params['startVal']}:\n")
267
- elif self.params['startType'].val == 'condition':
268
- code = (f"if {params['name']}.status == NOT_STARTED and "
269
- f"{params['startVal']}:\n")
270
- else:
271
- msg = f"Not a known startType ({params['startVal']}) for {params['name']}"
272
- raise CodeGenerationException(msg % self.params)
273
-
274
- buff.writeIndented(code)
275
-
276
- buff.setIndentLevel(+1, relative=True)
277
- params = self.params
278
- code = (f"# keep track of start time/frame for later\n"
279
- f"{params['name']}.frameNStart = frameN # exact frame index\n"
280
- f"{params['name']}.tStart = t # local t and not account for scr refresh\n"
281
- f"{params['name']}.tStartRefresh = tThisFlipGlobal # on global time\n")
282
- if self.type != "Sound": # for sounds, don't update to actual frame time
283
- code += (f"win.timeOnFlip({params['name']}, 'tStartRefresh')"
284
- f" # time at next scr refresh\n")
285
- buff.writeIndentedLines(code)
286
-
287
- def writeStartTestCodeJS(self, buff):
288
- """Test whether we need to start
289
- """
290
- params = self.params
291
- if self.params['startType'].val == 'time (s)':
292
- # if startVal is an empty string then set to be 0.0
293
- if (isinstance(self.params['startVal'].val, basestring) and
294
- not self.params['startVal'].val.strip()):
295
- self.params['startVal'].val = '0.0'
296
- code = (f"if (t >= {params['startVal']} "
297
- f"&& {params['name']}.status === PsychoJS.Status.NOT_STARTED) {{\n")
298
- elif self.params['startType'].val == 'frame N':
299
- code = (f"if (frameN >= {params['startVal']} "
300
- f"&& {params['name']}.status === PsychoJS.Status.NOT_STARTED) {{\n")
301
- elif self.params['startType'].val == 'condition':
302
- code = (f"if (({params['startVal']}) "
303
- f"&& {params['name']}.status === PsychoJS.Status.NOT_STARTED) {{\n")
304
- else:
305
- msg = f"Not a known startType ({params['startVal']}) for {params['name']}"
306
- raise CodeGenerationException(msg)
307
-
308
- buff.writeIndented(code)
309
-
310
- buff.setIndentLevel(+1, relative=True)
311
- code = (f"// keep track of start time/frame for later\n"
312
- f"{params['name']}.tStart = t; // (not accounting for frame time here)\n"
313
- f"{params['name']}.frameNStart = frameN; // exact frame index\n\n")
314
- buff.writeIndentedLines(code)
315
-
316
- def writeStopTestCode(self, buff):
317
- """Test whether we need to stop
318
- """
319
- params = self.params
320
- buff.writeIndentedLines(f"if {params['name']}.status == STARTED:\n")
321
- buff.setIndentLevel(+1, relative=True)
322
-
323
- if self.params['stopType'].val == 'time (s)':
324
- code = (f"# is it time to stop? (based on local clock)\n"
325
- f"if tThisFlip > {params['stopVal']}-frameTolerance:\n"
326
- )
327
- # duration in time (s)
328
- elif (self.params['stopType'].val == 'duration (s)'):
329
- code = (f"# is it time to stop? (based on global clock, using actual start)\n"
330
- f"if tThisFlipGlobal > {params['name']}.tStartRefresh + {params['stopVal']}-frameTolerance:\n")
331
- elif self.params['stopType'].val == 'duration (frames)':
332
- code = (f"if frameN >= ({params['name']}.frameNStart + {params['stopVal']}):\n")
333
- elif self.params['stopType'].val == 'frame N':
334
- code = f"if frameN >= {params['stopVal']}:\n"
335
- elif self.params['stopType'].val == 'condition':
336
- code = f"if bool({params['stopVal']}):\n"
337
- else:
338
- msg = (f"Didn't write any stop line for startType={params['startType']}, "
339
- f"stopType={params['stopType']}")
340
- raise CodeGenerationException(msg)
341
-
342
- buff.writeIndentedLines(code)
343
- buff.setIndentLevel(+1, relative=True)
344
- code = (f"# keep track of stop time/frame for later\n"
345
- f"{params['name']}.tStop = t # not accounting for scr refresh\n"
346
- f"{params['name']}.frameNStop = frameN # exact frame index\n"
347
- f"win.timeOnFlip({params['name']}, 'tStopRefresh')"
348
- f" # time at next scr refresh\n")
349
- buff.writeIndentedLines(code)
350
-
351
- def writeStopTestCodeJS(self, buff):
352
- """Test whether we need to stop
353
- """
354
- params = self.params
355
- if self.params['stopType'].val == 'time (s)':
356
- code = (f"frameRemains = {params['stopVal']} "
357
- f" - psychoJS.window.monitorFramePeriod * 0.75;"
358
- f" // most of one frame period left\n"
359
- f"if (({params['name']}.status === PsychoJS.Status.STARTED || {params['name']}.status === PsychoJS.Status.FINISHED) "
360
- f"&& t >= frameRemains) {{\n")
361
- # duration in time (s)
362
- elif (self.params['stopType'].val == 'duration (s)' and
363
- self.params['startType'].val == 'time (s)'):
364
- code = (f"frameRemains = {params['startVal']} + {params['stopVal']}"
365
- f" - psychoJS.window.monitorFramePeriod * 0.75;"
366
- f" // most of one frame period left\n"
367
- f"if ({params['name']}.status === PsychoJS.Status.STARTED "
368
- f"&& t >= frameRemains) {{\n")
369
- # start at frame and end with duratio (need to use approximate)
370
- elif self.params['stopType'].val == 'duration (s)':
371
- code = (f"if ({params['name']}.status === PsychoJS.Status.STARTED "
372
- f"&& t >= ({params['name']}.tStart + {params['stopVal']})) {{\n")
373
- elif self.params['stopType'].val == 'duration (frames)':
374
- code = (f"if ({params['name']}.status === PsychoJS.Status.STARTED "
375
- f"&& frameN >= ({params['name']}.frameNStart + {params['stopVal']})) {{\n")
376
- elif self.params['stopType'].val == 'frame N':
377
- code = (f"if ({params['name']}.status === PsychoJS.Status.STARTED "
378
- f"&& frameN >= {params['stopVal']}) {{\n")
379
- elif self.params['stopType'].val == 'condition':
380
- code = (f"if ({params['name']}.status === PsychoJS.Status.STARTED "
381
- f"&& Boolean({params['stopVal']})) {{\n")
382
- else:
383
- msg = (f"Didn't write any stop line for startType="
384
- f"{params['startType']}, "
385
- f"stopType={params['stopType']}")
386
- raise CodeGenerationException(msg)
387
-
388
- buff.writeIndentedLines(code)
389
- buff.setIndentLevel(+1, relative=True)
390
-
391
- def writeParamUpdates(self, buff, updateType, paramNames=None,
392
- target="PsychoPy"):
393
- """write updates to the buffer for each parameter that needs it
394
- updateType can be 'experiment', 'routine' or 'frame'
395
- """
396
- if paramNames is None:
397
- paramNames = list(self.params.keys())
398
- for thisParamName in paramNames:
399
- if thisParamName == 'advancedParams':
400
- continue # advancedParams is not really a parameter itself
401
- thisParam = self.params[thisParamName]
402
- if thisParam.updates == updateType:
403
- self.writeParamUpdate(
404
- buff, self.params['name'],
405
- thisParamName, thisParam, thisParam.updates,
406
- target=target)
407
-
408
- def writeParamUpdatesJS(self, buff, updateType, paramNames=None):
409
- """Pass this to the standard writeParamUpdates but with new 'target'
410
- """
411
- self.writeParamUpdates(buff, updateType, paramNames,
412
- target="PsychoJS")
413
-
414
- def writeParamUpdate(self, buff, compName, paramName, val, updateType,
415
- params=None, target="PsychoPy"):
416
- """Writes an update string for a single parameter.
417
- This should not need overriding for different components - try to keep
418
- constant
419
- """
420
- if params is None:
421
- params = self.params
422
- # first work out the name for the set____() function call
423
- if paramName == 'advancedParams':
424
- return # advancedParams is not really a parameter itself
425
- elif paramName == 'letterHeight':
426
- paramCaps = 'Height' # setHeight for TextStim
427
- elif paramName == 'image' and self.getType() == 'PatchComponent':
428
- paramCaps = 'Tex' # setTex for PatchStim
429
- elif paramName == 'sf':
430
- paramCaps = 'SF' # setSF, not SetSf
431
- elif paramName == 'coherence':
432
- paramCaps = 'FieldCoherence'
433
- elif paramName == 'fieldPos':
434
- paramCaps = 'FieldPos'
435
- else:
436
- paramCaps = paramName[0].capitalize() + paramName[1:]
437
-
438
- # code conversions for PsychoJS
439
- if target == 'PsychoJS':
440
- endStr = ';'
441
- try:
442
- valStr = str(val).strip()
443
- except TypeError:
444
- if isinstance(val, Param):
445
- val = val.val
446
- raise TypeError(f"Value of parameter {paramName} of component {compName} "
447
- f"could not be converted to JS. Value is {val}")
448
- # convert (0,0.5) to [0,0.5] but don't convert "rand()" to "rand[]"
449
- if valStr.startswith("(") and valStr.endswith(")"):
450
- valStr = valStr.replace("(", "[", 1)
451
- valStr = valStr[::-1].replace(")", "]", 1)[
452
- ::-1] # replace from right
453
- # filenames (e.g. for image) need to be loaded from resources
454
- if paramName in ["sound"]:
455
- valStr = (f"psychoJS.resourceManager.getResource({valStr})")
456
- else:
457
- endStr = ''
458
-
459
- # then write the line
460
- if updateType == 'set every frame' and target == 'PsychoPy':
461
- loggingStr = ', log=False'
462
- if updateType == 'set every frame' and target == 'PsychoJS':
463
- loggingStr = ', false' # don't give the keyword 'log' in JS
464
- else:
465
- loggingStr = ''
466
-
467
- if target == 'PsychoPy':
468
- if paramName == 'color':
469
- buff.writeIndented(f"{compName}.setColor({params['color']}, colorSpace={params['colorSpace']}")
470
- buff.write(f"{loggingStr}){endStr}\n")
471
- elif paramName == 'sound':
472
- stopVal = params['stopVal'].val
473
- if stopVal in ['', None, -1, 'None']:
474
- stopVal = '-1'
475
- buff.writeIndented(f"{compName}.setSound({params['sound']}, secs={stopVal}){endStr}\n")
476
- else:
477
- buff.writeIndented(f"{compName}.set{paramCaps}({val}{loggingStr}){endStr}\n")
478
- elif target == 'PsychoJS':
479
- # write the line
480
- if paramName == 'color':
481
- buff.writeIndented(f"{compName}.setColor(new util.Color({params['color']})")
482
- buff.write(f"{loggingStr}){endStr}\n")
483
- elif paramName == 'fillColor':
484
- buff.writeIndented(f"{compName}.setFillColor(new util.Color({params['fillColor']})")
485
- buff.write(f"{loggingStr}){endStr}\n")
486
- elif paramName == 'lineColor':
487
- buff.writeIndented(f"{compName}.setLineColor(new util.Color({params['lineColor']})")
488
- buff.write(f"{loggingStr}){endStr}\n")
489
- elif paramName == 'sound':
490
- stopVal = params['stopVal']
491
- if stopVal in ['', None, -1, 'None']:
492
- stopVal = '-1'
493
- buff.writeIndented(f"{compName}.setSound({params['sound']}, secs={stopVal}){endStr}\n")
494
- else:
495
- buff.writeIndented(f"{compName}.set{paramCaps}({val}{loggingStr}){endStr}\n")
496
-
497
- def checkNeedToUpdate(self, updateType):
498
- """Determine whether this component has any parameters set to repeat
499
- at this level
500
-
501
- usage::
502
- True/False = checkNeedToUpdate(self, updateType)
503
-
504
- """
505
- for thisParamName in self.params:
506
- if thisParamName == 'advancedParams':
507
- continue
508
- thisParam = self.params[thisParamName]
509
- if thisParam.updates == updateType:
510
- return True
511
-
512
- return False
513
-
514
- def getStartAndDuration(self):
515
- """Determine the start and duration of the stimulus
516
- purely for Routine rendering purposes in the app (does not affect
517
- actual drawing during the experiment)
518
-
519
- start, duration, nonSlipSafe = component.getStartAndDuration()
520
-
521
- nonSlipSafe indicates that the component's duration is a known fixed
522
- value and can be used in non-slip global clock timing (e.g for fMRI)
523
- """
524
- if not 'startType' in self.params:
525
- # this component does not have any start/stop
526
- return None, None, True
527
-
528
- startType = self.params['startType'].val
529
- stopType = self.params['stopType'].val
530
- numericStart = canBeNumeric(self.params['startVal'].val)
531
- numericStop = canBeNumeric(self.params['stopVal'].val)
532
-
533
- # deduce a start time (s) if possible
534
- # user has given a time estimate
535
- if canBeNumeric(self.params['startEstim'].val):
536
- startTime = float(self.params['startEstim'].val)
537
- elif startType == 'time (s)' and numericStart:
538
- startTime = float(self.params['startVal'].val)
539
- else:
540
- startTime = None
541
-
542
- if stopType == 'time (s)' and numericStop and startTime is not None:
543
- duration = float(self.params['stopVal'].val) - startTime
544
- elif stopType == 'duration (s)' and numericStop:
545
- duration = float(self.params['stopVal'].val)
546
- else:
547
- # deduce duration (s) if possible. Duration used because component
548
- # time icon needs width
549
- if canBeNumeric(self.params['durationEstim'].val):
550
- duration = float(self.params['durationEstim'].val)
551
- elif self.params['stopVal'].val in ['', '-1', 'None']:
552
- duration = FOREVER # infinite duration
553
- else:
554
- duration = None
555
-
556
- nonSlipSafe = numericStop and (numericStart or stopType == 'time (s)')
557
- return startTime, duration, nonSlipSafe
558
-
559
- def getPosInRoutine(self):
560
- """Find the index (position) in the parent Routine (0 for top)
561
- """
562
- routine = self.exp.routines[self.parentName]
563
- return routine.index(self)
564
-
565
- def getType(self):
566
- """Returns the name of the current object class"""
567
- return self.__class__.__name__
568
-
569
- def getShortType(self):
570
- """Replaces word component with empty string"""
571
- return self.getType().replace('Component', '')
572
-
573
-
574
- class BaseVisualComponent(BaseComponent):
575
- """Base class for most visual stimuli
576
- """
577
- # an attribute of the class, determines section in the components panel
578
- categories = ['Stimuli']
579
-
580
- def __init__(self, exp, parentName, name='',
581
- <<<<<<< HEAD
582
- units='from exp settings', color='white', fillColor="None", borderColor="None",
583
- pos=(0, 0), size=(0, 0), ori=0, colorSpace='rgb', opacity=1,
584
- =======
585
- units='from exp settings', color='$[1,1,1]', borderColor="", fillColor="",
586
- pos=(0, 0), size=(0, 0), ori=0, colorSpace='rgb', opacity=1, contrast=1,
587
- >>>>>>> f82462d1d00d58215937a827405ef7fb9983041b
588
- startType='time (s)', startVal='',
589
- stopType='duration (s)', stopVal='',
590
- startEstim='', durationEstim='',
591
- saveStartStop=True, syncScreenRefresh=True):
592
-
593
- super(BaseVisualComponent, self).__init__(
594
- exp, parentName, name,
595
- startType=startType, startVal=startVal,
596
- stopType=stopType, stopVal=stopVal,
597
- startEstim=startEstim, durationEstim=durationEstim,
598
- saveStartStop=saveStartStop,
599
- syncScreenRefresh=syncScreenRefresh)
600
-
601
- self.exp.requirePsychopyLibs(
602
- ['visual']) # needs this psychopy lib to operate
603
-
604
- self.order += [
605
- "color",
606
- "fillColor",
607
- "borderColor",
608
- "colorSpace",
609
- "opacity",
610
- "size",
611
- "pos",
612
- "units",
613
- "anchor",
614
- "ori",
615
- ]
616
-
617
- msg = _translate("Units of dimensions for this stimulus")
618
- self.params['units'] = Param(units,
619
- valType='str', inputType="choice", categ='Layout',
620
- allowedVals=['from exp settings', 'deg', 'cm', 'pix', 'norm',
621
- 'height', 'degFlatPos', 'degFlat'],
622
- hint=msg,
623
- label=_localized['units'])
624
-
625
- msg = _translate("Foreground color of this stimulus (e.g. $[1,1,0], red );"
626
- " Right-click to bring up a color-picker (rgb only)")
627
- self.params['color'] = Param(color,
628
- valType='color', inputType="color", categ='Appearance',
629
- allowedTypes=[],
630
- updates='constant',
631
- allowedUpdates=['constant', 'set every repeat', 'set every frame'],
632
- hint=msg,
633
- label=_localized['color'])
634
-
635
- msg = _translate("In what format (color space) have you specified "
636
- "the foreground color? (rgb, dkl, lms, hsv)")
637
- self.params['colorSpace'] = Param(colorSpace,
638
- valType='str', inputType="choice", categ='Appearance',
639
- allowedVals=['named', 'rgb', 'dkl', 'lms', 'hsv'],
640
- updates='constant',
641
- hint=msg,
642
- label=_localized['colorSpace'])
643
-
644
- msg = _translate("Fill color of this stimulus (e.g. $[1,1,0], red );"
645
- " Right-click to bring up a color-picker (rgb only)")
646
- self.params['fillColor'] = Param(fillColor,
647
- valType='color', inputType="color", categ='Appearance',
648
- updates='constant', allowedTypes=[],
649
- allowedUpdates=['constant', 'set every repeat', 'set every frame'],
650
- hint=msg,
651
- label=_localized['fillColor'])
652
-
653
- msg = _translate("In what format (color space) have you specified "
654
- "the fill color? (rgb, dkl, lms, hsv)")
655
- self.params['fillColorSpace'] = Param(colorSpace,
656
- valType='str', inputType="choice", categ='Appearance',
657
- allowedVals=['rgb', 'dkl', 'lms', 'hsv'],
658
- updates='constant',
659
- hint=msg,
660
- label=_localized['fillColorSpace'])
661
-
662
- msg = _translate("Color of this stimulus (e.g. $[1,1,0], red );"
663
- " Right-click to bring up a color-picker (rgb only)")
664
- self.params['borderColor'] = Param(borderColor,
665
- valType='color', inputType="color", categ='Appearance',
666
- updates='constant',allowedTypes=[],
667
- allowedUpdates=['constant', 'set every repeat', 'set every frame'],
668
- hint=msg,
669
- label=_localized['borderColor'])
670
-
671
- msg = _translate("In what format (color space) have you specified "
672
- "the border color? (rgb, dkl, lms, hsv)")
673
- self.params['borderColorSpace'] = Param(colorSpace,
674
- valType='str', inputType="choice", categ='Appearance',
675
- allowedVals=['rgb', 'dkl', 'lms', 'hsv'],
676
- updates='constant',
677
- hint=msg,
678
- label=_localized['borderColorSpace'])
679
-
680
- msg = _translate("Opacity of the stimulus (1=opaque, 0=fully "
681
- "transparent, 0.5=translucent)")
682
- self.params['opacity'] = Param(opacity,
683
- valType='num', inputType="single", categ='Appearance',
684
- updates='constant', allowedTypes=[],
685
- allowedUpdates=['constant', 'set every repeat', 'set every frame'],
686
- hint=msg,
687
- label=_localized['opacity'])
688
-
689
- msg = _translate("Contrast of the stimulus (1.0=unchanged contrast, "
690
- "0.5=decrease contrast, 0.0=uniform/no contrast, "
691
- "-0.5=slightly inverted, -1.0=totally inverted)")
692
- self.params['contrast'] = Param(
693
- contrast, valType='code', allowedTypes=[], categ='Appearance',
694
- updates='constant',
695
- allowedUpdates=['constant', 'set every repeat', 'set every frame'],
696
- hint=msg,
697
- label=_localized['contrast'])
698
-
699
- msg = _translate("Position of this stimulus (e.g. [1,2] )")
700
- self.params['pos'] = Param(pos,
701
- valType='list', inputType="single", categ='Layout',
702
- updates='constant', allowedTypes=[],
703
- allowedUpdates=['constant', 'set every repeat', 'set every frame'],
704
- hint=msg,
705
- label=_localized['pos'])
706
-
707
- msg = _translate("Size of this stimulus (either a single value or "
708
- "x,y pair, e.g. 2.5, [1,2] ")
709
- self.params['size'] = Param(size,
710
- valType='list', inputType="single", categ='Layout',
711
- updates='constant', allowedTypes=[],
712
- allowedUpdates=['constant', 'set every repeat', 'set every frame'],
713
- hint=msg,
714
- label=_localized['size'])
715
-
716
- self.params['ori'] = Param(ori,
717
- valType='num', inputType="spin", categ='Layout',
718
- updates='constant', allowedTypes=[], allowedVals=[-360,360],
719
- allowedUpdates=['constant', 'set every repeat', 'set every frame'],
720
- hint=_translate("Orientation of this stimulus (in deg)"),
721
- label=_localized['ori'])
722
-
723
- self.params['syncScreenRefresh'].readOnly = True
724
-
725
- def integrityCheck(self):
726
- """
727
- Run component integrity checks.
728
- """
729
- super().integrityCheck() # run parent class checks first
730
-
731
- win = alerttools.TestWin(self.exp)
732
-
733
- # get units for this stimulus
734
- if 'units' in self.params: # e.g. BrushComponent doesn't have this
735
- units = self.params['units'].val
736
- else:
737
- units = None
738
- if units == 'use experiment settings':
739
- units = self.exp.settings.params[
740
- 'Units'].val # this 1 uppercase
741
- if not units or units == 'use preferences':
742
- units = prefs.general['units']
743
-
744
- # tests for visual stimuli
745
- alerttools.testSize(self, win, units)
746
- alerttools.testPos(self, win, units)
747
- alerttools.testAchievableVisualOnsetOffset(self)
748
- alerttools.testValidVisualStimTiming(self)
749
- alerttools.testFramesAsInt(self)
750
-
751
- def writeFrameCode(self, buff):
752
- """Write the code that will be called every frame
753
- """
754
- params = self.params
755
- buff.writeIndented(f"\n")
756
- buff.writeIndented(f"# *{params['name']}* updates\n")
757
- # writes an if statement to determine whether to draw etc
758
- self.writeStartTestCode(buff)
759
- buff.writeIndented(f"{params['name']}.setAutoDraw(True)\n")
760
- # to get out of the if statement
761
- buff.setIndentLevel(-1, relative=True)
762
-
763
- # test for stop (only if there was some setting for duration or stop)
764
- if self.params['stopVal'].val not in ('', None, -1, 'None'):
765
- # writes an if statement to determine whether to draw etc
766
- self.writeStopTestCode(buff)
767
- buff.writeIndented(f"{params['name']}.setAutoDraw(False)\n")
768
- # to get out of the if statement
769
- buff.setIndentLevel(-2, relative=True)
770
-
771
- # set parameters that need updating every frame
772
- # do any params need updating? (this method inherited from _base)
773
- if self.checkNeedToUpdate('set every frame'):
774
- buff.writeIndented(f"if {params['name']}.status == STARTED: # only update if drawing\n")
775
- buff.setIndentLevel(+1, relative=True) # to enter the if block
776
- self.writeParamUpdates(buff, 'set every frame')
777
- buff.setIndentLevel(-1, relative=True) # to exit the if block
778
-
779
- def writeFrameCodeJS(self, buff):
780
- """Write the code that will be called every frame
781
- """
782
- params = self.params
783
- if "PsychoJS" not in self.targets:
784
- buff.writeIndented(f"// *{params['name']}* not supported by PsychoJS\n")
785
- return
786
-
787
- buff.writeIndentedLines(f"\n// *{params['name']}* updates\n")
788
- # writes an if statement to determine whether to draw etc
789
- self.writeStartTestCodeJS(buff)
790
- buff.writeIndented(f"{params['name']}.setAutoDraw(true);\n")
791
- # to get out of the if statement
792
- buff.setIndentLevel(-1, relative=True)
793
- buff.writeIndented("}\n\n")
794
-
795
- # test for stop (only if there was some setting for duration or stop)
796
- if self.params['stopVal'].val not in ('', None, -1, 'None'):
797
- # writes an if statement to determine whether to draw etc
798
- self.writeStopTestCodeJS(buff)
799
- buff.writeIndented(f"{params['name']}.setAutoDraw(false);\n")
800
- # to get out of the if statement
801
- buff.setIndentLevel(-1, relative=True)
802
- buff.writeIndented("}\n")
803
-
804
- # set parameters that need updating every frame
805
- # do any params need updating? (this method inherited from _base)
806
- if self.checkNeedToUpdate('set every frame'):
807
- buff.writeIndentedLines(f"\nif ({params['name']}.status === PsychoJS.Status.STARTED){{ "
808
- f"// only update if being drawn\n")
809
- buff.setIndentLevel(+1, relative=True) # to enter the if block
810
- self.writeParamUpdatesJS(buff, 'set every frame')
811
- buff.setIndentLevel(-1, relative=True) # to exit the if block
812
- buff.writeIndented("}\n")
813
-
814
-
815
- def canBeNumeric(inStr):
816
- """Determines whether the input can be converted to a float
817
- (using a try: float(instr))
818
- """
819
- try:
820
- float(inStr)
821
- return True
822
- except Exception:
823
- return False