psychopy 2024.2.5__py3-none-any.whl → 2025.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.
- psychopy/CHANGELOG.txt +4 -4
- psychopy/GIT_SHA +1 -1
- psychopy/LICENSE.txt +1 -1
- psychopy/VERSION +1 -1
- psychopy/__init__.py +10 -7
- psychopy/alerts/__init__.py +1 -1
- psychopy/alerts/_alerts.py +53 -17
- psychopy/alerts/_errorHandler.py +3 -4
- psychopy/alerts/alertsCatalogue/3210.yaml +27 -0
- psychopy/alerts/alertsCatalogue/3610.yaml +19 -0
- psychopy/alerts/alertsCatalogue/4130.yaml +19 -0
- psychopy/alerts/alertsCatalogue/alertCategories.yaml +8 -1
- psychopy/alerts/alertsCatalogue/alertmsg.py +1 -1
- psychopy/alerts/alerttools.py +0 -16
- psychopy/app/Resources/betasplash.png +0 -0
- psychopy/app/Resources/betasplash@2x.png +0 -0
- psychopy/app/Resources/classic/case.png +0 -0
- psychopy/app/Resources/classic/case@2x.png +0 -0
- psychopy/app/Resources/classic/fileaudio.png +0 -0
- psychopy/app/Resources/classic/fileaudio@2x.png +0 -0
- psychopy/app/Resources/classic/filecss.png +0 -0
- psychopy/app/Resources/classic/filecss@2x.png +0 -0
- psychopy/app/Resources/classic/filecsv.png +0 -0
- psychopy/app/Resources/classic/filecsv@2x.png +0 -0
- psychopy/app/Resources/classic/filedesign.png +0 -0
- psychopy/app/Resources/classic/filedesign@2x.png +0 -0
- psychopy/app/Resources/classic/filefont.png +0 -0
- psychopy/app/Resources/classic/filefont@2x.png +0 -0
- psychopy/app/Resources/classic/filegit.png +0 -0
- psychopy/app/Resources/classic/filegit@2x.png +0 -0
- psychopy/app/Resources/classic/filehtml.png +0 -0
- psychopy/app/Resources/classic/filehtml@2x.png +0 -0
- psychopy/app/Resources/classic/fileimage.png +0 -0
- psychopy/app/Resources/classic/fileimage@2x.png +0 -0
- psychopy/app/Resources/classic/fileinfo.png +0 -0
- psychopy/app/Resources/classic/fileinfo@2x.png +0 -0
- psychopy/app/Resources/classic/filejs.png +0 -0
- psychopy/app/Resources/classic/filejs@2x.png +0 -0
- psychopy/app/Resources/classic/filejson.png +0 -0
- psychopy/app/Resources/classic/filejson@2x.png +0 -0
- psychopy/app/Resources/classic/filepkg.png +0 -0
- psychopy/app/Resources/classic/filepkg@2x.png +0 -0
- psychopy/app/Resources/classic/filepsyexp.png +0 -0
- psychopy/app/Resources/classic/filepsyexp@2x.png +0 -0
- psychopy/app/Resources/classic/filepy.png +0 -0
- psychopy/app/Resources/classic/filepy@2x.png +0 -0
- psychopy/app/Resources/classic/filetxt.png +0 -0
- psychopy/app/Resources/classic/filetxt@2x.png +0 -0
- psychopy/app/Resources/classic/fileunknown.png +0 -0
- psychopy/app/Resources/classic/fileunknown@2x.png +0 -0
- psychopy/app/Resources/classic/filevideo.png +0 -0
- psychopy/app/Resources/classic/filevideo@2x.png +0 -0
- psychopy/app/Resources/classic/find.png +0 -0
- psychopy/app/Resources/classic/find@2x.png +0 -0
- psychopy/app/Resources/classic/loop.png +0 -0
- psychopy/app/Resources/classic/loop@2x.png +0 -0
- psychopy/app/Resources/classic/regex.png +0 -0
- psychopy/app/Resources/classic/regex@2x.png +0 -0
- psychopy/app/Resources/dark/case.png +0 -0
- psychopy/app/Resources/dark/case@2x.png +0 -0
- psychopy/app/Resources/dark/fileaudio.png +0 -0
- psychopy/app/Resources/dark/fileaudio@2x.png +0 -0
- psychopy/app/Resources/dark/filecss.png +0 -0
- psychopy/app/Resources/dark/filecss@2x.png +0 -0
- psychopy/app/Resources/dark/filecsv.png +0 -0
- psychopy/app/Resources/dark/filecsv@2x.png +0 -0
- psychopy/app/Resources/dark/filedesign.png +0 -0
- psychopy/app/Resources/dark/filedesign@2x.png +0 -0
- psychopy/app/Resources/dark/filefont.png +0 -0
- psychopy/app/Resources/dark/filefont@2x.png +0 -0
- psychopy/app/Resources/dark/filegit.png +0 -0
- psychopy/app/Resources/dark/filegit@2x.png +0 -0
- psychopy/app/Resources/dark/filehtml.png +0 -0
- psychopy/app/Resources/dark/filehtml@2x.png +0 -0
- psychopy/app/Resources/dark/fileimage.png +0 -0
- psychopy/app/Resources/dark/fileimage@2x.png +0 -0
- psychopy/app/Resources/dark/fileinfo.png +0 -0
- psychopy/app/Resources/dark/fileinfo@2x.png +0 -0
- psychopy/app/Resources/dark/filejs.png +0 -0
- psychopy/app/Resources/dark/filejs@2x.png +0 -0
- psychopy/app/Resources/dark/filejson.png +0 -0
- psychopy/app/Resources/dark/filejson@2x.png +0 -0
- psychopy/app/Resources/dark/filepkg.png +0 -0
- psychopy/app/Resources/dark/filepkg@2x.png +0 -0
- psychopy/app/Resources/dark/filepsyexp.png +0 -0
- psychopy/app/Resources/dark/filepsyexp@2x.png +0 -0
- psychopy/app/Resources/dark/filepy.png +0 -0
- psychopy/app/Resources/dark/filepy@2x.png +0 -0
- psychopy/app/Resources/dark/filetxt.png +0 -0
- psychopy/app/Resources/dark/filetxt@2x.png +0 -0
- psychopy/app/Resources/dark/fileunknown.png +0 -0
- psychopy/app/Resources/dark/fileunknown@2x.png +0 -0
- psychopy/app/Resources/dark/filevideo.png +0 -0
- psychopy/app/Resources/dark/filevideo@2x.png +0 -0
- psychopy/app/Resources/dark/find.png +0 -0
- psychopy/app/Resources/dark/find@2x.png +0 -0
- psychopy/app/Resources/dark/loop.png +0 -0
- psychopy/app/Resources/dark/loop@2x.png +0 -0
- psychopy/app/Resources/dark/regex.png +0 -0
- psychopy/app/Resources/dark/regex@2x.png +0 -0
- psychopy/app/Resources/light/case.png +0 -0
- psychopy/app/Resources/light/case@2x.png +0 -0
- psychopy/app/Resources/light/fileaudio.png +0 -0
- psychopy/app/Resources/light/fileaudio@2x.png +0 -0
- psychopy/app/Resources/light/filecss.png +0 -0
- psychopy/app/Resources/light/filecss@2x.png +0 -0
- psychopy/app/Resources/light/filecsv.png +0 -0
- psychopy/app/Resources/light/filecsv@2x.png +0 -0
- psychopy/app/Resources/light/filedesign.png +0 -0
- psychopy/app/Resources/light/filedesign@2x.png +0 -0
- psychopy/app/Resources/light/filefont.png +0 -0
- psychopy/app/Resources/light/filefont@2x.png +0 -0
- psychopy/app/Resources/light/filegit.png +0 -0
- psychopy/app/Resources/light/filegit@2x.png +0 -0
- psychopy/app/Resources/light/filehtml.png +0 -0
- psychopy/app/Resources/light/filehtml@2x.png +0 -0
- psychopy/app/Resources/light/fileimage.png +0 -0
- psychopy/app/Resources/light/fileimage@2x.png +0 -0
- psychopy/app/Resources/light/fileinfo.png +0 -0
- psychopy/app/Resources/light/fileinfo@2x.png +0 -0
- psychopy/app/Resources/light/filejs.png +0 -0
- psychopy/app/Resources/light/filejs@2x.png +0 -0
- psychopy/app/Resources/light/filejson.png +0 -0
- psychopy/app/Resources/light/filejson@2x.png +0 -0
- psychopy/app/Resources/light/filepkg.png +0 -0
- psychopy/app/Resources/light/filepkg@2x.png +0 -0
- psychopy/app/Resources/light/filepsyexp.png +0 -0
- psychopy/app/Resources/light/filepsyexp@2x.png +0 -0
- psychopy/app/Resources/light/filepy.png +0 -0
- psychopy/app/Resources/light/filepy@2x.png +0 -0
- psychopy/app/Resources/light/filetxt.png +0 -0
- psychopy/app/Resources/light/filetxt@2x.png +0 -0
- psychopy/app/Resources/light/fileunknown.png +0 -0
- psychopy/app/Resources/light/fileunknown@2x.png +0 -0
- psychopy/app/Resources/light/filevideo.png +0 -0
- psychopy/app/Resources/light/filevideo@2x.png +0 -0
- psychopy/app/Resources/light/find.png +0 -0
- psychopy/app/Resources/light/find@2x.png +0 -0
- psychopy/app/Resources/light/loop.png +0 -0
- psychopy/app/Resources/light/loop@2x.png +0 -0
- psychopy/app/Resources/light/regex.png +0 -0
- psychopy/app/Resources/light/regex@2x.png +0 -0
- psychopy/app/Resources/routine_templates/Basic.psyexp +0 -1
- psychopy/app/Resources/routine_templates/Misc.psyexp +0 -1
- psychopy/app/Resources/routine_templates/Online.psyexp +0 -2
- psychopy/app/Resources/routine_templates/Trials.psyexp +0 -1
- psychopy/app/Resources/splash.png +0 -0
- psychopy/app/Resources/splash@2x.png +0 -0
- psychopy/app/__init__.py +49 -8
- psychopy/app/__main__.py +3 -0
- psychopy/app/_psychopyApp.py +134 -125
- psychopy/app/builder/builder.py +42 -22
- psychopy/app/builder/dialogs/__init__.py +44 -11
- psychopy/app/builder/dialogs/dlgsCode.py +1 -1
- psychopy/app/builder/dialogs/dlgsConditions.py +1 -1
- psychopy/app/builder/dialogs/findDlg.py +106 -20
- psychopy/app/builder/dialogs/paramCtrls.py +42 -1
- psychopy/app/builder/validators.py +1 -1
- psychopy/app/coder/codeEditorBase.py +8 -8
- psychopy/app/coder/coder.py +32 -29
- psychopy/app/coder/fileBrowser.py +68 -22
- psychopy/app/coder/folding.py +1 -1
- psychopy/app/coder/psychoParser.py +1 -1
- psychopy/app/coder/repl.py +1 -1
- psychopy/app/coder/sourceTree.py +1 -1
- psychopy/app/connections/__init__.py +1 -1
- psychopy/app/connections/news.py +1 -1
- psychopy/app/connections/sendusage.py +1 -1
- psychopy/app/connections/updates.py +1 -1
- psychopy/app/console.py +1 -1
- psychopy/app/errorDlg.py +1 -1
- psychopy/app/frametracker.py +1 -1
- psychopy/app/idle.py +1 -1
- psychopy/app/jobs.py +5 -2
- psychopy/app/linuxconfig/__init__.py +1 -1
- psychopy/app/locale/ar_001/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ar_001/LC_MESSAGE/messages.po +4 -4
- psychopy/app/locale/cs_CZ/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/da_DK/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/de_DE/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/de_DE/LC_MESSAGE/messages.po +3 -3
- psychopy/app/locale/el_GR/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/en_NZ/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/en_US/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/es_CO/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/es_CO/LC_MESSAGE/messages.po +4 -4
- psychopy/app/locale/es_ES/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/es_ES/LC_MESSAGE/messages.po +4 -4
- psychopy/app/locale/es_US/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/es_US/LC_MESSAGE/messages.po +4 -4
- psychopy/app/locale/et_EE/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/et_EE/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/fa_IR/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/fa_IR/LC_MESSAGE/messages.po +1 -1
- psychopy/app/locale/fi_FI/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/fr_FR/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/fr_FR/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/he_IL/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/he_IL/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/hi_IN/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/hi_IN/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/hu_HU/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/it_IT/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/it_IT/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/ja_JP/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ja_JP/LC_MESSAGE/messages.po +3421 -2396
- psychopy/app/locale/ko_KR/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ms_MY/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ms_MY/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/nl_NL/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/nn_NO/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/pl_PL/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/pt_PT/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/pt_PT/LC_MESSAGE/messages.po +4 -4
- psychopy/app/locale/ro_RO/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/ru_RU/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/sv_SE/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/sv_SE/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/tr_TR/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/tr_TR/LC_MESSAGE/messages.po +2 -2
- psychopy/app/locale/zh_CN/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/zh_CN/LC_MESSAGE/messages.po +3 -3
- psychopy/app/locale/zh_TW/LC_MESSAGE/messages.mo +0 -0
- psychopy/app/locale/zh_TW/LC_MESSAGE/messages.po +2 -2
- psychopy/app/{builder/localizedStrings.py → localizedStrings.py} +173 -26
- psychopy/app/pavlovia_ui/__init__.py +1 -1
- psychopy/app/pavlovia_ui/_base.py +1 -1
- psychopy/app/pavlovia_ui/functions.py +1 -1
- psychopy/app/pavlovia_ui/menu.py +1 -1
- psychopy/app/pavlovia_ui/project.py +1 -1
- psychopy/app/pavlovia_ui/search.py +1 -1
- psychopy/app/pavlovia_ui/sync.py +1 -1
- psychopy/app/pavlovia_ui/user.py +1 -1
- psychopy/app/plugin_manager/dialog.py +34 -96
- psychopy/app/plugin_manager/packages.py +10 -14
- psychopy/app/plugin_manager/plugins.py +64 -4
- psychopy/app/preferencesDlg.py +12 -37
- psychopy/app/psychopyApp.py +130 -44
- psychopy/app/ribbon.py +1 -0
- psychopy/app/runner/runner.py +19 -7
- psychopy/app/runner/scriptProcess.py +11 -6
- psychopy/app/stdout/stdOutRich.py +9 -2
- psychopy/app/themes/fonts.py +1 -1
- psychopy/app/themes/icons.py +2 -38
- psychopy/app/ui/__init__.py +1 -1
- psychopy/app/utils.py +3 -3
- psychopy/assets/default.mp3 +0 -0
- psychopy/assets/fonts/NotoSans-Bold.ttf +0 -0
- psychopy/assets/fonts/NotoSans-BoldItalic.ttf +0 -0
- psychopy/assets/fonts/NotoSans-Italic.ttf +0 -0
- psychopy/assets/fonts/NotoSans-Regular.ttf +0 -0
- psychopy/assets/voicekeyThresholdStim.wav +0 -0
- psychopy/clock.py +4 -1
- psychopy/colors.py +2 -0
- psychopy/core.py +1 -1
- psychopy/data/base.py +1 -1
- psychopy/data/experiment.py +151 -46
- psychopy/data/routine.py +27 -1
- psychopy/data/staircase.py +2 -1
- psychopy/data/trial.py +62 -14
- psychopy/data/utils.py +1 -1
- psychopy/demos/builder/Design Templates/branchedExperiment/branchedExperiment.psyexp +333 -218
- psychopy/demos/builder/Design Templates/psychophysicsStaircase/psychophysicsStaircase.psyexp +261 -239
- psychopy/demos/builder/Design Templates/psychophysicsStairsInterleaved/psychophysicsStaircaseInterleaved.psyexp +319 -180
- psychopy/demos/builder/Design Templates/randomisedBlocks/randomisedBlocks.psyexp +204 -116
- psychopy/demos/builder/Experiments/BART/assets/background.jpg +0 -0
- psychopy/demos/builder/Experiments/BART/assets/blueBalloon.png +0 -0
- psychopy/demos/builder/Experiments/BART/assets/greenBalloon.png +0 -0
- psychopy/demos/builder/Experiments/BART/assets/redBalloon.png +0 -0
- psychopy/demos/builder/Experiments/BART/bart.psyexp +779 -866
- psychopy/demos/builder/Experiments/BigFiveInventory/BFI.psyexp +242 -180
- psychopy/demos/builder/Experiments/GoNoGo/gng.psyexp +419 -406
- psychopy/demos/builder/Experiments/dragAndDrop/README.md +2 -37
- psychopy/demos/builder/Experiments/dragAndDrop/drag_and_drop.psyexp +460 -1204
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/blank_grid.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/make_shapes.psyexp +221 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/readme.md +4 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_1.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_10.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_2.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_3.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_4.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_5.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_6.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_7.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_8.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solution_9.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/solutions.xlsx +0 -0
- psychopy/demos/builder/Experiments/mentalRotation/MentalRotation.psyexp +583 -542
- psychopy/demos/builder/Experiments/navon/NavonTask.psyexp +458 -427
- psychopy/demos/builder/Experiments/sternberg/sternberg.psyexp +588 -550
- psychopy/demos/builder/Experiments/stroop/stroop.psyexp +303 -207
- psychopy/demos/builder/Experiments/stroopExtended/stroop.psyexp +390 -215
- psychopy/demos/builder/Experiments/stroopExtended/stroopReverse.psyexp +390 -215
- psychopy/demos/builder/Experiments/stroopVoice/stroopVoice.psyexp +357 -331
- psychopy/demos/builder/Feature Demos/buttonBox/buttonBoxDemo.psyexp +3 -2
- psychopy/demos/builder/Feature Demos/counterbalance/counterbalance.psyexp +287 -277
- psychopy/demos/builder/Feature Demos/gratings/gratings.psyexp +370 -320
- psychopy/demos/builder/Feature Demos/noise/noise.psyexp +452 -399
- psychopy/demos/builder/Feature Demos/panorama/panorama.psyexp +168 -133
- psychopy/demos/builder/Feature Demos/pilotMode/pilotMode.psyexp +4 -3
- psychopy/demos/builder/Feature Demos/progress/progressBar.psyexp +420 -392
- psychopy/demos/builder/Feature Demos/sliders/sliders.psyexp +917 -871
- psychopy/demos/builder/Feature Demos/visualValidator/readme.md +7 -0
- psychopy/demos/builder/Feature Demos/visualValidator/visualValidator.psyexp +200 -0
- psychopy/demos/builder/Hardware/EEG_parallel_component/EEG_triggers_parallel_comp.psyexp +25 -9
- psychopy/demos/builder/Hardware/EEG_serial_code/EEG_triggers_serial_code.psyexp +372 -361
- psychopy/demos/builder/Hardware/EEG_serial_component/EEG_triggers_serial_comp.psyexp +25 -9
- psychopy/demos/builder/Hardware/EGI_netstation/stroop.psyexp +320 -235
- psychopy/demos/builder/Hardware/Eyetracking_visual_search/visualSearch.psyexp +790 -651
- psychopy/demos/builder/Hardware/camera/camera.psyexp +326 -246
- psychopy/demos/builder/Hardware/eyetracking/eyetracking.psyexp +432 -327
- psychopy/demos/builder/Hardware/eyetracking_custom_cal/eyetracking_custom_cal.psyexp +440 -321
- psychopy/demos/builder/Hardware/fMRI/fMRI_demo.psyexp +190 -181
- psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo.psyexp +323 -312
- psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo_legacy.psyexp +360 -0
- psychopy/demos/builder/Hardware/lab_streaming_layer/lsl_triggers_demo_legacy_legacy.psyexp +312 -0
- psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy.psyexp +329 -273
- psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy_legacy.psyexp +360 -0
- psychopy/demos/builder/Hardware/lab_streaming_layer_legacy/lsl_triggers_demo_legacy_legacy_legacy.psyexp +312 -0
- psychopy/demos/builder/Hardware/microphone/microphone.psyexp +450 -404
- psychopy/demos/builder/Hardware/pump/pump.psyexp +593 -329
- psychopy/demos/builder/Helper Tools/achorVSalignment/FlowCircular-Regular.ttf +0 -0
- psychopy/demos/builder/Helper Tools/achorVSalignment/anchorAlignment.psyexp +336 -274
- psychopy/demos/builder/Helper Tools/clockFace/clockFace.psyexp +200 -149
- psychopy/demos/builder/Helper Tools/colors/colors.psyexp +300 -279
- psychopy/demos/builder/Helper Tools/drawPolygon/drawPolygon.psyexp +677 -564
- psychopy/demos/builder/Helper Tools/keyNameFinder/keyNameFinder.psyexp +214 -158
- psychopy/demos/builder/Helper Tools/spatialUnits/unitDemo.psyexp +195 -146
- psychopy/demos/coder/experiment control/runtimeInfo.py +1 -1
- psychopy/devices/__init__.py +1 -1
- psychopy/event.py +1 -1
- psychopy/exceptions.py +1 -1
- psychopy/experiment/__init__.py +1 -1
- psychopy/experiment/_experiment.py +30 -9
- psychopy/experiment/components/__init__.py +1 -6
- psychopy/experiment/components/_base.py +44 -19
- psychopy/experiment/components/aperture/__init__.py +1 -1
- psychopy/experiment/components/brush/__init__.py +2 -2
- psychopy/experiment/components/button/__init__.py +24 -28
- psychopy/experiment/components/camera/__init__.py +38 -39
- psychopy/experiment/components/code/__init__.py +1 -1
- psychopy/experiment/components/dots/__init__.py +1 -1
- psychopy/experiment/components/eyetracker_record/__init__.py +7 -3
- psychopy/experiment/components/form/__init__.py +3 -3
- psychopy/experiment/components/grating/__init__.py +1 -1
- psychopy/experiment/components/image/__init__.py +1 -1
- psychopy/experiment/components/joyButtons/__init__.py +2 -2
- psychopy/experiment/components/joyButtons/virtualJoyButtons.py +1 -1
- psychopy/experiment/components/joystick/__init__.py +3 -3
- psychopy/experiment/components/joystick/virtualJoystick.py +1 -1
- psychopy/experiment/components/keyboard/__init__.py +98 -122
- psychopy/experiment/components/microphone/__init__.py +54 -98
- psychopy/experiment/components/mouse/__init__.py +92 -93
- psychopy/experiment/components/movie/__init__.py +28 -50
- psychopy/experiment/components/parallelOut/__init__.py +3 -3
- psychopy/experiment/components/polygon/__init__.py +2 -3
- psychopy/experiment/components/roi/__init__.py +2 -2
- psychopy/experiment/components/routineSettings/__init__.py +2 -0
- psychopy/experiment/components/serialOut/__init__.py +7 -7
- psychopy/experiment/components/settings/__init__.py +317 -313
- psychopy/experiment/components/settings/eyetracking.py +108 -0
- psychopy/experiment/components/slider/__init__.py +5 -5
- psychopy/experiment/components/sound/__init__.py +168 -78
- psychopy/experiment/components/soundsensor/__init__.py +361 -0
- psychopy/experiment/components/soundsensor/classic/soundsensor.png +0 -0
- psychopy/experiment/components/soundsensor/classic/soundsensor@2x.png +0 -0
- psychopy/experiment/components/soundsensor/dark/soundsensor.png +0 -0
- psychopy/experiment/components/soundsensor/dark/soundsensor@2x.png +0 -0
- psychopy/experiment/components/soundsensor/light/soundsensor.png +0 -0
- psychopy/experiment/components/soundsensor/light/soundsensor@2x.png +0 -0
- psychopy/experiment/components/static/__init__.py +59 -33
- psychopy/experiment/components/text/__init__.py +2 -6
- psychopy/experiment/components/textbox/__init__.py +3 -7
- psychopy/experiment/components/unknown/__init__.py +2 -0
- psychopy/experiment/components/unknownPlugin/__init__.py +2 -0
- psychopy/experiment/exports.py +1 -1
- psychopy/experiment/flow.py +2 -2
- psychopy/experiment/localization.py +1 -1
- psychopy/experiment/loops.py +43 -10
- psychopy/experiment/params.py +6 -4
- psychopy/experiment/plugins.py +8 -1
- psychopy/experiment/py2js.py +1 -1
- psychopy/experiment/py2js_transpiler.py +1 -1
- psychopy/experiment/routines/__init__.py +1 -1
- psychopy/experiment/routines/_base.py +23 -24
- psychopy/experiment/routines/audioValidator/__init__.py +343 -0
- psychopy/experiment/routines/audioValidator/classic/audio_validator.png +0 -0
- psychopy/experiment/routines/audioValidator/classic/audio_validator@2x.png +0 -0
- psychopy/experiment/routines/audioValidator/dark/audio_validator.png +0 -0
- psychopy/experiment/routines/audioValidator/dark/audio_validator@2x.png +0 -0
- psychopy/experiment/routines/audioValidator/light/audio_validator.png +0 -0
- psychopy/experiment/routines/audioValidator/light/audio_validator@2x.png +0 -0
- psychopy/experiment/routines/eyetracker_calibrate/__init__.py +76 -17
- psychopy/experiment/routines/eyetracker_validate/__init__.py +1 -1
- psychopy/experiment/routines/unknown/__init__.py +2 -0
- psychopy/experiment/routines/{photodiodeValidator → visualValidator}/__init__.py +89 -120
- psychopy/experiment/routines/visualValidator/classic/visual_validator.png +0 -0
- psychopy/experiment/routines/visualValidator/classic/visual_validator@2x.png +0 -0
- psychopy/experiment/routines/visualValidator/dark/visual_validator.png +0 -0
- psychopy/experiment/routines/visualValidator/dark/visual_validator@2x.png +0 -0
- psychopy/experiment/routines/visualValidator/light/visual_validator.png +0 -0
- psychopy/experiment/routines/visualValidator/light/visual_validator@2x.png +0 -0
- psychopy/experiment/utils.py +1 -1
- psychopy/gui/__init__.py +1 -1
- psychopy/gui/qtgui.py +15 -6
- psychopy/gui/wxgui.py +1 -1
- psychopy/hardware/__init__.py +0 -1
- psychopy/hardware/base.py +147 -16
- psychopy/hardware/bbtk/__init__.py +10 -16
- psychopy/hardware/brainproducts.py +7 -13
- psychopy/hardware/button.py +21 -2
- psychopy/hardware/buttonbox/__init__.py +1 -1
- psychopy/hardware/camera/__init__.py +16 -3
- psychopy/hardware/cedrus.py +5 -16
- psychopy/hardware/crs/__init__.py +1 -1
- psychopy/hardware/crs/bits.py +36 -33
- psychopy/hardware/crs/colorcal.py +8 -11
- psychopy/hardware/crs/optical.py +7 -10
- psychopy/hardware/crs/shaders.py +18 -5
- psychopy/hardware/emotiv.py +1 -1
- psychopy/hardware/emulator.py +11 -5
- psychopy/hardware/exceptions.py +86 -0
- psychopy/hardware/forp.py +18 -23
- psychopy/hardware/gammasci.py +8 -3
- psychopy/hardware/iolab.py +8 -19
- psychopy/hardware/joystick/__init__.py +865 -266
- psychopy/hardware/joystick/_base.py +251 -0
- psychopy/hardware/joystick/backend_glfw.py +306 -0
- psychopy/hardware/joystick/backend_pyglet.py +309 -0
- psychopy/hardware/joystick/mappings.py +287 -0
- psychopy/hardware/keyboard.py +4 -2
- psychopy/hardware/labhackers.py +1 -1
- psychopy/hardware/labjacks.py +9 -13
- psychopy/hardware/{photodiode.py → lightsensor.py} +146 -203
- psychopy/hardware/listener.py +9 -8
- psychopy/hardware/manager.py +24 -35
- psychopy/hardware/microphone.py +534 -154
- psychopy/hardware/minolta.py +14 -4
- psychopy/hardware/mouse/__init__.py +1 -1
- psychopy/hardware/photometer/__init__.py +2 -2
- psychopy/hardware/pr.py +14 -4
- psychopy/hardware/qmix.py +18 -27
- psychopy/hardware/serialdevice.py +43 -12
- psychopy/hardware/soundsensor.py +473 -0
- psychopy/hardware/spatial/__init__.py +231 -0
- psychopy/hardware/speaker.py +298 -36
- psychopy/hardware/triggerbox/__init__.py +1 -1
- psychopy/hardware/triggerbox/base.py +1 -1
- psychopy/hardware/triggerbox/parallel.py +1 -1
- psychopy/info.py +1 -1
- psychopy/iohub/devices/eyetracker/__init__.py +10 -18
- psychopy/iohub/devices/eyetracker/calibration/procedure.py +15 -33
- psychopy/iohub/devices/eyetracker/hw/pupil_labs/neon/__init__.py +1 -0
- psychopy/iohub/devices/mouse/linux2.py +2 -1
- psychopy/layout.py +1 -1
- psychopy/liaison.py +91 -39
- psychopy/locale_setup.py +11 -1
- psychopy/localization/__init__.py +1 -1
- psychopy/localization/_localization.py +1 -1
- psychopy/localization/messages.pot +2 -2
- psychopy/logging.py +14 -12
- psychopy/microphone.py +4 -3
- psychopy/misc.py +1 -1
- psychopy/monitors/MonitorCenter.py +3 -3
- psychopy/monitors/__init__.py +1 -1
- psychopy/monitors/calibData.py +1 -1
- psychopy/monitors/calibTools.py +3 -2
- psychopy/platform_specific/__init__.py +1 -1
- psychopy/platform_specific/darwin.py +1 -1
- psychopy/platform_specific/linux.py +1 -1
- psychopy/platform_specific/win32.py +1 -1
- psychopy/plugins/__init__.py +26 -17
- psychopy/plugins/util.py +65 -0
- psychopy/preferences/Darwin.spec +11 -3
- psychopy/preferences/FreeBSD.spec +11 -3
- psychopy/preferences/Linux.spec +11 -3
- psychopy/preferences/Windows.spec +11 -3
- psychopy/preferences/__init__.py +1 -1
- psychopy/preferences/baseNoArch.spec +11 -3
- psychopy/preferences/hints.py +78 -61
- psychopy/preferences/preferences.py +82 -13
- psychopy/projects/__init__.py +1 -1
- psychopy/projects/pavlovia.py +29 -13
- psychopy/scripts/psyexpCompile.py +1 -1
- psychopy/session.py +81 -8
- psychopy/sound/__init__.py +25 -10
- psychopy/sound/_base.py +134 -34
- psychopy/sound/audioclip.py +38 -15
- psychopy/sound/audiodevice.py +1 -1
- psychopy/sound/backend_ptb.py +53 -321
- psychopy/sound/backend_pygame.py +7 -3
- psychopy/sound/backend_pyo.py +53 -22
- psychopy/sound/backend_pysound.py +10 -27
- psychopy/sound/backend_sounddevice.py +33 -21
- psychopy/sound/exceptions.py +1 -1
- psychopy/sound/microphone.py +83 -5
- psychopy/sound/transcribe.py +3 -3
- psychopy/tests/data/test_basic_run.py +1 -0
- psychopy/tests/data/test_sounds/default_16000.wav +0 -0
- psychopy/tests/data/test_sounds/default_192000.wav +0 -0
- psychopy/tests/data/test_sounds/default_22050.wav +0 -0
- psychopy/tests/data/test_sounds/default_32000.wav +0 -0
- psychopy/tests/data/test_sounds/default_44100.wav +0 -0
- psychopy/tests/data/test_sounds/default_48000.wav +0 -0
- psychopy/tests/data/test_sounds/default_8000.wav +0 -0
- psychopy/tests/data/test_sounds/default_96000.wav +0 -0
- psychopy/tests/test_alerts/test_alerttools.py +2 -1
- psychopy/tests/test_app/test_command_line.py +65 -0
- psychopy/tests/test_data/test_TrialHandler2.py +18 -7
- psychopy/tests/test_demos/test_builder_demos.py +1 -1
- psychopy/tests/test_experiment/needs_wx/componsTemplate.txt +5238 -4188
- psychopy/tests/test_experiment/needs_wx/test_components.py +1 -1
- psychopy/tests/test_experiment/test_components/test_RoutineSettingsComponent.py +16 -0
- psychopy/tests/test_experiment/test_components/test_all_components.py +1 -1
- psychopy/tests/test_experiment/test_components/test_base_components.py +26 -17
- psychopy/tests/test_experiment/test_loops.py +12 -4
- psychopy/tests/test_experiment/test_params.py +17 -4
- psychopy/tests/test_experiment/test_routines/test_PhotodiodeValidationRoutine.py +2 -2
- psychopy/tests/test_hardware/test_photodiode.py +66 -0
- psychopy/tests/test_liaison/test_Liaison.py +4 -4
- psychopy/tests/test_misc/test_clock.py +2 -0
- psychopy/tests/test_misc/test_color.py +2 -0
- psychopy/tests/test_misc/test_event.py +1 -0
- psychopy/tests/test_plugins/__init__.py +0 -0
- psychopy/tests/test_plugins/test_plugin_stubs.py +125 -0
- psychopy/tests/test_sound/test_sound.py +111 -40
- psychopy/tests/test_tools/test_colorspacetools.py +24 -23
- psychopy/tests/test_tools/test_mathtools.py +9 -9
- psychopy/tests/test_tools/test_viewtools.py +101 -0
- psychopy/tests/test_validators/__init__.py +0 -0
- psychopy/tests/test_validators/test_voicekeyValidator.py +95 -0
- psychopy/tests/test_visual/test_all_stimuli.py +2 -2
- psychopy/tests/test_visual/test_basevisual.py +37 -7
- psychopy/tests/test_visual/test_button.py +2 -2
- psychopy/tests/test_visual/test_circle.py +10 -2
- psychopy/tests/test_visual/test_dots.py +1 -1
- psychopy/tests/test_visual/test_form.py +13 -13
- psychopy/tests/test_visual/test_gamma.py +3 -3
- psychopy/tests/test_visual/test_image.py +2 -2
- psychopy/tests/test_visual/test_progress.py +2 -2
- psychopy/tests/test_visual/test_roi.py +8 -2
- psychopy/tests/test_visual/test_shape.py +2 -2
- psychopy/tests/test_visual/test_slider.py +2 -2
- psychopy/tests/test_visual/test_target.py +2 -2
- psychopy/tests/test_visual/test_textbox.py +6 -8
- psychopy/tests/test_visual/test_winScalePos.py +6 -5
- psychopy/tests/test_visual/test_window.py +17 -0
- psychopy/tests/utils.py +51 -1
- psychopy/tools/__init__.py +1 -1
- psychopy/tools/arraytools.py +2 -2
- psychopy/tools/attributetools.py +52 -1
- psychopy/tools/audiotools.py +4 -1
- psychopy/tools/colorspacetools.py +6 -4
- psychopy/tools/coordinatetools.py +1 -1
- psychopy/tools/fileerrortools.py +21 -9
- psychopy/tools/filetools.py +2 -2
- psychopy/tools/fontmanager.py +47 -28
- psychopy/tools/gltools.py +2964 -558
- psychopy/tools/imagetools.py +1 -1
- psychopy/tools/mathtools.py +997 -127
- psychopy/tools/monitorunittools.py +7 -1
- psychopy/tools/movietools.py +1 -2
- psychopy/tools/pkgtools.py +157 -127
- psychopy/tools/plottools.py +1 -1
- psychopy/tools/rifttools.py +1 -1
- psychopy/tools/stereotools.py +1 -1
- psychopy/tools/stimulustools.py +172 -2
- psychopy/tools/stringtools.py +22 -2
- psychopy/tools/systemtools.py +1 -1
- psychopy/tools/typetools.py +1 -1
- psychopy/tools/unittools.py +1 -1
- psychopy/tools/versionchooser.py +3 -1
- psychopy/tools/viewtools.py +54 -70
- psychopy/tools/wizard.py +2 -2
- psychopy/validation/__init__.py +6 -0
- psychopy/validation/audio.py +74 -0
- psychopy/validation/visual.py +115 -0
- psychopy/visual/__init__.py +1 -4
- psychopy/visual/aperture.py +9 -6
- psychopy/visual/backends/__init__.py +1 -1
- psychopy/visual/backends/_base.py +1 -1
- psychopy/visual/backends/gamma.py +1 -1
- psychopy/visual/backends/glfwbackend.py +8 -12
- psychopy/visual/backends/pygamebackend.py +1 -1
- psychopy/visual/backends/pygletbackend.py +32 -11
- psychopy/visual/basevisual.py +93 -13
- psychopy/visual/brush.py +1 -1
- psychopy/visual/bufferimage.py +90 -10
- psychopy/visual/button.py +1 -1
- psychopy/visual/circle.py +12 -20
- psychopy/visual/custommouse.py +1 -1
- psychopy/visual/dot.py +80 -14
- psychopy/visual/elementarray.py +84 -10
- psychopy/visual/filters.py +1 -1
- psychopy/visual/form.py +43 -28
- psychopy/visual/grating.py +105 -25
- psychopy/visual/helpers.py +1 -1
- psychopy/visual/image.py +98 -20
- psychopy/visual/line.py +15 -25
- psychopy/visual/movie.py +1 -1
- psychopy/visual/movie2.py +4 -3
- psychopy/visual/movie3.py +4 -3
- psychopy/visual/movies/__init__.py +1 -1
- psychopy/visual/movies/frame.py +1 -1
- psychopy/visual/movies/metadata.py +1 -1
- psychopy/visual/movies/players/__init__.py +1 -1
- psychopy/visual/movies/players/_base.py +1 -1
- psychopy/visual/movies/players/ffpyplayer_player.py +2 -3
- psychopy/visual/nnlvs.py +9 -6
- psychopy/visual/noise.py +4 -16
- psychopy/visual/patch.py +4 -3
- psychopy/visual/pie.py +3 -14
- psychopy/visual/polygon.py +21 -28
- psychopy/visual/radial.py +4 -18
- psychopy/visual/ratingscale.py +4 -3
- psychopy/visual/rect.py +16 -25
- psychopy/visual/rift.py +8 -2
- psychopy/visual/secondorder.py +4 -16
- psychopy/visual/shaders.py +620 -286
- psychopy/visual/shape.py +281 -90
- psychopy/visual/simpleimage.py +1 -1
- psychopy/visual/slider.py +78 -25
- psychopy/visual/stim3d.py +5 -608
- psychopy/visual/text.py +13 -3
- psychopy/visual/textbox2/textbox2.py +188 -56
- psychopy/visual/vlcmoviestim.py +1 -1
- psychopy/visual/window.py +373 -200
- psychopy/web.py +1 -1
- {psychopy-2024.2.5.dist-info → psychopy-2025.1.0.dist-info}/METADATA +9 -9
- {psychopy-2024.2.5.dist-info → psychopy-2025.1.0.dist-info}/RECORD +644 -621
- psychopy/.DS_Store +0 -0
- psychopy/__init__.py.orig +0 -65
- psychopy/app/.DS_Store +0 -0
- psychopy/app/Resources/.DS_Store +0 -0
- psychopy/app/Resources/classic/filecsv16.png +0 -0
- psychopy/app/Resources/classic/fileimage16.png +0 -0
- psychopy/app/Resources/classic/fileunknown16.png +0 -0
- psychopy/app/Resources/dark/filecsv16.png +0 -0
- psychopy/app/Resources/dark/filecsv16@2x.png +0 -0
- psychopy/app/Resources/dark/fileimage16.png +0 -0
- psychopy/app/Resources/dark/fileimage16@2x.png +0 -0
- psychopy/app/Resources/dark/fileunknown16.png +0 -0
- psychopy/app/Resources/dark/fileunknown16@2x.png +0 -0
- psychopy/app/Resources/fonts/OpenSans-Bold.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-BoldItalic.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-ExtraBold.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-ExtraBoldItalic.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-Italic.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-Light.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-LightItalic.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-Regular.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-SemiBold.ttf +0 -0
- psychopy/app/Resources/fonts/OpenSans-SemiBoldItalic.ttf +0 -0
- psychopy/app/Resources/light/filecsv16.png +0 -0
- psychopy/app/Resources/light/filecsv16@2x.png +0 -0
- psychopy/app/Resources/light/fileimage16.png +0 -0
- psychopy/app/Resources/light/fileimage16@2x.png +0 -0
- psychopy/app/Resources/light/fileunknown16.png +0 -0
- psychopy/app/Resources/light/fileunknown16@2x.png +0 -0
- psychopy/app/Resources/psychopySplash.png +0 -0
- psychopy/app/Resources/psychopySplash@2x.png +0 -0
- psychopy/app/builder/builder.py.orig +0 -3932
- psychopy/app/builder/dialogs/__init__.py.orig +0 -1679
- psychopy/app/builder/dialogs/paramCtrls.py.orig +0 -713
- psychopy/app/colorpicker/__init__.py.orig +0 -411
- psychopy/app/locale/ar_001/.DS_Store +0 -0
- psychopy/app/locale/ar_001/LC_MESSAGE/.DS_Store +0 -0
- psychopy/core.py.orig +0 -169
- psychopy/demos/builder/.DS_Store +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/randomisedBlocks_lastrun.py +0 -330
- psychopy/demos/builder/Experiments/.DS_Store +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/archived_conditions.xlsx +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/draw grid stim.py +0 -61
- psychopy/demos/builder/Experiments/dragAndDrop/shapeMaker.psyexp +0 -91
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_1.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_10.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_2.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_3.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_4.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_5.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_6.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_7.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_8.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/stimuli/grid_image_9.png +0 -0
- psychopy/demos/builder/Experiments/dragAndDrop/updated_conditions.xlsx +0 -0
- psychopy/demos/builder/Tools/.DS_Store +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/.DS_Store +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/data/.DS_Store +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/data/_gamma_correction_visual_2022-05-18_14h18.29.439.csv +0 -38
- psychopy/demos/builder/Tools/gammaCalibration/data/_gamma_correction_visual_2022-05-18_14h18.29.439.log +0 -3418
- psychopy/demos/builder/Tools/gammaCalibration/data/_gamma_correction_visual_2022-05-18_14h18.29.439.psydat +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/data/x1_gamma_correction_visual_2022-05-17_13h59.42.928.csv +0 -2
- psychopy/demos/builder/Tools/gammaCalibration/data/x1_gamma_correction_visual_2022-05-17_13h59.42.928.log +0 -15
- psychopy/demos/builder/Tools/gammaCalibration/data/x1_gamma_correction_visual_2022-05-17_13h59.42.928.psydat +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/gamma_correction_visual_lastrun.py +0 -562
- psychopy/demos/coder/.DS_Store +0 -0
- psychopy/demos/coder/experiment control/info_gamma.pickle +0 -0
- psychopy/demos/coder/iohub/.iohpid +0 -1
- psychopy/demos/coder/iohub/eyetracking/.iohpid +0 -1
- psychopy/demos/coder/iohub/wintab/.DS_Store +0 -0
- psychopy/demos/coder/stimuli/.DS_Store +0 -0
- psychopy/experiment/_experiment.py.orig +0 -1032
- psychopy/experiment/components/.DS_Store +0 -0
- psychopy/experiment/components/_base.py.orig +0 -823
- psychopy/experiment/components/form/.DS_Store +0 -0
- psychopy/experiment/components/microphone/__init__.py.orig +0 -490
- psychopy/experiment/components/settings/__init__.py.orig +0 -1337
- psychopy/experiment/components/textbox/__init__.py.orig +0 -310
- psychopy/experiment/components/webcam/.DS_Store +0 -0
- psychopy/experiment/components/webcam/light/.DS_Store +0 -0
- psychopy/experiment/loops.py.orig +0 -829
- psychopy/experiment/params.py.orig +0 -408
- psychopy/experiment/routine.py.orig +0 -503
- psychopy/experiment/routines/photodiodeValidator/classic/photodiode_validator.png +0 -0
- psychopy/experiment/routines/photodiodeValidator/classic/photodiode_validator@2x.png +0 -0
- psychopy/experiment/routines/photodiodeValidator/dark/photodiode_validator.png +0 -0
- psychopy/experiment/routines/photodiodeValidator/dark/photodiode_validator@2x.png +0 -0
- psychopy/experiment/routines/photodiodeValidator/light/photodiode_validator.png +0 -0
- psychopy/experiment/routines/photodiodeValidator/light/photodiode_validator@2x.png +0 -0
- psychopy/hardware/.DS_Store +0 -0
- psychopy/hardware/brainproducts.py.orig +0 -680
- psychopy/hardware/iolab.py.orig +0 -238
- psychopy/iohub/datastore/__init__.py.orig +0 -443
- psychopy/iohub/datastore/util.py.orig +0 -692
- psychopy/iohub/devices/mouse/darwin.py.orig +0 -427
- psychopy/iohub/devices/mouse/linux2.py.orig +0 -198
- psychopy/preferences/.DS_Store +0 -0
- psychopy/projects/pavlovia.py.orig +0 -1295
- psychopy/tests/.DS_Store +0 -0
- psychopy/tests/data/.DS_Store +0 -0
- psychopy/tests/data/TestCircle_fill_local.png +0 -0
- psychopy/tests/data/aperture1_normHexbackground_local.png +0 -0
- psychopy/tests/data/aperture1_norm_local.png +0 -0
- psychopy/tests/data/aperture2_normHexbackground_local.png +0 -0
- psychopy/tests/data/beatandrcos_height_local.png +0 -0
- psychopy/tests/data/beatandrcos_normAddBlend_local.png +0 -0
- psychopy/tests/data/beatandrcos_normHexbackground_local.png +0 -0
- psychopy/tests/data/beatandrcos_norm_local.png +0 -0
- psychopy/tests/data/beatandrcos_stencil_local.png +0 -0
- psychopy/tests/data/blend_add_height_local.png +0 -0
- psychopy/tests/data/blend_add_normAddBlend_local.png +0 -0
- psychopy/tests/data/blend_add_normHexbackground_local.png +0 -0
- psychopy/tests/data/blend_add_normNoShade_local.png +0 -0
- psychopy/tests/data/blend_add_norm_local.png +0 -0
- psychopy/tests/data/blend_add_stencil_local.png +0 -0
- psychopy/tests/data/bufferimg_gabor_height_local.png +0 -0
- psychopy/tests/data/bufferimg_gabor_normAddBlend_local.png +0 -0
- psychopy/tests/data/bufferimg_gabor_normHexbackground_local.png +0 -0
- psychopy/tests/data/bufferimg_gabor_normNoShade_local.png +0 -0
- psychopy/tests/data/bufferimg_gabor_norm_local.png +0 -0
- psychopy/tests/data/bufferimg_gabor_stencil_local.png +0 -0
- psychopy/tests/data/circleHex_height_local.png +0 -0
- psychopy/tests/data/circleHex_normAddBlend_local.png +0 -0
- psychopy/tests/data/circleHex_normHexbackground_local.png +0 -0
- psychopy/tests/data/circleHex_normNoShade_local.png +0 -0
- psychopy/tests/data/circleHex_norm_local.png +0 -0
- psychopy/tests/data/circleHex_stencil_local.png +0 -0
- psychopy/tests/data/color_comparison_local.png +0 -0
- psychopy/tests/data/correctScript/.DS_Store +0 -0
- psychopy/tests/data/dots_height_local.png +0 -0
- psychopy/tests/data/dots_normAddBlend_local.png +0 -0
- psychopy/tests/data/dots_normHexbackground_local.png +0 -0
- psychopy/tests/data/dots_normNoShade_local.png +0 -0
- psychopy/tests/data/dots_norm_local.png +0 -0
- psychopy/tests/data/dots_stencil_local.png +0 -0
- psychopy/tests/data/elarray1_height_local.png +0 -0
- psychopy/tests/data/elarray1_normAddBlend_local.png +0 -0
- psychopy/tests/data/elarray1_normHexbackground_local.png +0 -0
- psychopy/tests/data/elarray1_norm_local.png +0 -0
- psychopy/tests/data/elarray1_stencil_local.png +0 -0
- psychopy/tests/data/envelopeandrcos_height_local.png +0 -0
- psychopy/tests/data/envelopeandrcos_normAddBlend_local.png +0 -0
- psychopy/tests/data/envelopeandrcos_normHexbackground_local.png +0 -0
- psychopy/tests/data/envelopeandrcos_norm_local.png +0 -0
- psychopy/tests/data/envelopeandrcos_stencil_local.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_height_local.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_normAddBlend_local.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_normHexbackground_local.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_norm_local.png +0 -0
- psychopy/tests/data/envelopepowerandrcos_stencil_local.png +0 -0
- psychopy/tests/data/gabor1_height_local.png +0 -0
- psychopy/tests/data/gabor1_normAddBlend_local.png +0 -0
- psychopy/tests/data/gabor1_normHexbackground_local.png +0 -0
- psychopy/tests/data/gabor1_normNoShade_local.png +0 -0
- psychopy/tests/data/gabor1_norm_local.png +0 -0
- psychopy/tests/data/gabor1_stencil_local.png +0 -0
- psychopy/tests/data/greyscale_normHexbackground_local.png +0 -0
- psychopy/tests/data/imageAndGauss_height_local.png +0 -0
- psychopy/tests/data/imageAndGauss_normAddBlend_local.png +0 -0
- psychopy/tests/data/imageAndGauss_normHexbackground_local.png +0 -0
- psychopy/tests/data/imageAndGauss_normNoShade_local.png +0 -0
- psychopy/tests/data/imageAndGauss_norm_local.png +0 -0
- psychopy/tests/data/imageAndGauss_stencil_local.png +0 -0
- psychopy/tests/data/movFrame1_stencil_local.png +0 -0
- psychopy/tests/data/noiseAndRcos_height_local.png +0 -0
- psychopy/tests/data/noiseAndRcos_normAddBlend_local.png +0 -0
- psychopy/tests/data/noiseAndRcos_normHexbackground_local.png +0 -0
- psychopy/tests/data/noiseAndRcos_normNoShade_local.png +0 -0
- psychopy/tests/data/noiseAndRcos_norm_local.png +0 -0
- psychopy/tests/data/noiseAndRcos_stencil_local.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_height_local.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_normAddBlend_local.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_normHexbackground_local.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_normNoShade_local.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_norm_local.png +0 -0
- psychopy/tests/data/noiseFiltersAndRcos_stencil_local.png +0 -0
- psychopy/tests/data/numpyImage_height_local.png +0 -0
- psychopy/tests/data/numpyImage_normAddBlend_local.png +0 -0
- psychopy/tests/data/numpyImage_normHexbackground_local.png +0 -0
- psychopy/tests/data/numpyImage_normNoShade_local.png +0 -0
- psychopy/tests/data/numpyImage_norm_local.png +0 -0
- psychopy/tests/data/numpyImage_stencil_local.png +0 -0
- psychopy/tests/data/shape2_1_normAddBlend_local.png +0 -0
- psychopy/tests/data/shape2_1_normHexbackground_local.png +0 -0
- psychopy/tests/data/shape2_1_normNoShade_local.png +0 -0
- psychopy/tests/data/shape2_1_norm_local.png +0 -0
- psychopy/tests/data/shape2_1_stencil_local.png +0 -0
- psychopy/tests/data/text1_height_local.png +0 -0
- psychopy/tests/data/text1_normAddBlend_local.png +0 -0
- psychopy/tests/data/text1_normHexbackground_local.png +0 -0
- psychopy/tests/data/text1_norm_local.png +0 -0
- psychopy/tests/data/text1_stencil_local.png +0 -0
- psychopy/tests/data/wedge1_height_local.png +0 -0
- psychopy/tests/data/wedge1_normAddBlend_local.png +0 -0
- psychopy/tests/data/wedge1_normHexbackground_local.png +0 -0
- psychopy/tests/data/wedge1_normNoShade_local.png +0 -0
- psychopy/tests/data/wedge1_norm_local.png +0 -0
- psychopy/tests/data/wedge1_stencil_local.png +0 -0
- psychopy/tests/test_app/.DS_Store +0 -0
- psychopy/tests/test_app/test_builder/.DS_Store +0 -0
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1206.log +0 -177
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1206.psydat +0 -0
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1206.xlsx +0 -0
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1324.log +0 -168
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1324.psydat +0 -0
- psychopy/tests/test_app/test_builder/data/_2021_ 5_03_1324.xlsx +0 -0
- psychopy/tests/test_data/.DS_Store +0 -0
- psychopy/tests/test_hardware/test_CRS_BitsSharp.py +0 -67
- psychopy/tests/test_hardware/test_CRS_BitsSharp.py.orig +0 -68
- psychopy/tests/test_hardware/test_CRS_bitsShaders.py +0 -110
- psychopy/tests/test_visual/test_image.py.orig +0 -219
- psychopy/visual/basevisual.py.orig +0 -1723
- psychopy/visual/form.py.orig +0 -1181
- psychopy/visual/text.py.orig +0 -752
- psychopy/visual/textbox2/textbox2.py.orig +0 -1315
- psychopy/visual/windowwarp.py.orig +0 -463
- /psychopy/{app/cortex.log → alerts/alertsCatalogue/3600.yaml} +0 -0
- /psychopy/{app/Resources → assets}/fonts/Arvo-Bold.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/Arvo-BoldItalic.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/Arvo-Italic.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/Arvo-Regular.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/DejaVuSerif.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/IndieFlower-Regular.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/JetBrainsMono-Italic-VariableFont_wght.ttf +0 -0
- /psychopy/{app/Resources → assets}/fonts/JetBrainsMono-VariableFont_wght.ttf +0 -0
- /psychopy/demos/builder/Experiments/{GoNoGo → goNoGo}/readme.md +0 -0
- {psychopy-2024.2.5.dist-info → psychopy-2025.1.0.dist-info}/WHEEL +0 -0
- {psychopy-2024.2.5.dist-info → psychopy-2025.1.0.dist-info}/entry_points.txt +0 -0
- {psychopy-2024.2.5.dist-info → psychopy-2025.1.0.dist-info}/licenses/LICENSE +0 -0
psychopy/visual/dot.py
CHANGED
|
@@ -6,7 +6,7 @@ determines how they change on every call to the .draw() method.
|
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
8
|
# Part of the PsychoPy library
|
|
9
|
-
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-
|
|
9
|
+
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd.
|
|
10
10
|
# Distributed under the terms of the GNU General Public License (GPL).
|
|
11
11
|
|
|
12
12
|
# Bugfix by Andrew Schofield.
|
|
@@ -35,6 +35,7 @@ from psychopy import logging
|
|
|
35
35
|
# (JWP has no idea why!)
|
|
36
36
|
from psychopy.tools.attributetools import attributeSetter, setAttribute
|
|
37
37
|
from psychopy.tools.arraytools import val2array
|
|
38
|
+
from psychopy.tools import gltools as gt
|
|
38
39
|
from psychopy.visual.basevisual import (BaseVisualStim, ColorMixin,
|
|
39
40
|
ContainerMixin, WindowMixin)
|
|
40
41
|
from psychopy.layout import Size
|
|
@@ -47,6 +48,9 @@ _piOver180 = np.pi / 180.
|
|
|
47
48
|
_2pi = 2 * np.pi
|
|
48
49
|
|
|
49
50
|
|
|
51
|
+
USE_LEGACY_GL = pyglet.version < '2.0'
|
|
52
|
+
|
|
53
|
+
|
|
50
54
|
class DotStim(BaseVisualStim, ColorMixin, ContainerMixin):
|
|
51
55
|
"""This stimulus class defines a field of dots with an update rule that
|
|
52
56
|
determines how they change on every call to the .draw() method. This is
|
|
@@ -66,7 +70,7 @@ class DotStim(BaseVisualStim, ColorMixin, ContainerMixin):
|
|
|
66
70
|
identical velocity but random direction and signal dots remain the 'same'
|
|
67
71
|
(once a signal dot, always a signal dot).
|
|
68
72
|
|
|
69
|
-
For further detail about the different configurations see :ref:`
|
|
73
|
+
For further detail about the different configurations see :ref:`dotscomponent` in the
|
|
70
74
|
Builder Components section of the documentation.
|
|
71
75
|
|
|
72
76
|
If further customisation is required, then the DotStim should be subclassed
|
|
@@ -487,6 +491,46 @@ class DotStim(BaseVisualStim, ColorMixin, ContainerMixin):
|
|
|
487
491
|
"""
|
|
488
492
|
setAttribute(self, 'speed', val, log, op)
|
|
489
493
|
|
|
494
|
+
def _drawLegacyGL(self, win):
|
|
495
|
+
"""Legacy draw method for DotStim.
|
|
496
|
+
"""
|
|
497
|
+
self._update_dotsXY()
|
|
498
|
+
|
|
499
|
+
GL.glPushMatrix() # push before drawing, pop after
|
|
500
|
+
|
|
501
|
+
# draw the dots
|
|
502
|
+
if self.element is None:
|
|
503
|
+
win.setScale('pix')
|
|
504
|
+
GL.glPointSize(self.dotSize)
|
|
505
|
+
|
|
506
|
+
# load Null textures into multitexteureARB - they modulate with
|
|
507
|
+
# glColor
|
|
508
|
+
GL.glActiveTexture(GL.GL_TEXTURE0)
|
|
509
|
+
GL.glEnable(GL.GL_TEXTURE_2D)
|
|
510
|
+
GL.glBindTexture(GL.GL_TEXTURE_2D, 0)
|
|
511
|
+
GL.glActiveTexture(GL.GL_TEXTURE1)
|
|
512
|
+
GL.glEnable(GL.GL_TEXTURE_2D)
|
|
513
|
+
GL.glBindTexture(GL.GL_TEXTURE_2D, 0)
|
|
514
|
+
|
|
515
|
+
CPCD = ctypes.POINTER(ctypes.c_double)
|
|
516
|
+
GL.glVertexPointer(2, GL.GL_DOUBLE, 0,
|
|
517
|
+
self.verticesPix.ctypes.data_as(CPCD))
|
|
518
|
+
GL.glColor4f(*self._foreColor.render('rgba1'))
|
|
519
|
+
GL.glEnableClientState(GL.GL_VERTEX_ARRAY)
|
|
520
|
+
GL.glDrawArrays(GL.GL_POINTS, 0, self.nDots)
|
|
521
|
+
GL.glDisableClientState(GL.GL_VERTEX_ARRAY)
|
|
522
|
+
else:
|
|
523
|
+
# we don't want to do the screen scaling twice so for each dot
|
|
524
|
+
# subtract the screen centre
|
|
525
|
+
initialDepth = self.element.depth
|
|
526
|
+
for pointN in range(0, self.nDots):
|
|
527
|
+
_p = self.verticesPix[pointN, :] + self.fieldPos
|
|
528
|
+
self.element.setPos(_p)
|
|
529
|
+
self.element.draw()
|
|
530
|
+
# reset depth before going to next frame
|
|
531
|
+
self.element.setDepth(initialDepth)
|
|
532
|
+
GL.glPopMatrix()
|
|
533
|
+
|
|
490
534
|
def draw(self, win=None):
|
|
491
535
|
"""Draw the stimulus in its relevant window. You must call this method
|
|
492
536
|
after every MyWin.flip() if you want the stimulus to appear on that
|
|
@@ -505,15 +549,15 @@ class DotStim(BaseVisualStim, ColorMixin, ContainerMixin):
|
|
|
505
549
|
|
|
506
550
|
self._update_dotsXY()
|
|
507
551
|
|
|
508
|
-
|
|
552
|
+
if win.USE_LEGACY_GL:
|
|
553
|
+
self._drawLegacyGL(win)
|
|
554
|
+
return
|
|
509
555
|
|
|
510
556
|
# draw the dots
|
|
511
557
|
if self.element is None:
|
|
512
558
|
win.setScale('pix')
|
|
513
|
-
|
|
559
|
+
win.setOrthographicView()
|
|
514
560
|
|
|
515
|
-
# load Null textures into multitexteureARB - they modulate with
|
|
516
|
-
# glColor
|
|
517
561
|
GL.glActiveTexture(GL.GL_TEXTURE0)
|
|
518
562
|
GL.glEnable(GL.GL_TEXTURE_2D)
|
|
519
563
|
GL.glBindTexture(GL.GL_TEXTURE_2D, 0)
|
|
@@ -521,13 +565,35 @@ class DotStim(BaseVisualStim, ColorMixin, ContainerMixin):
|
|
|
521
565
|
GL.glEnable(GL.GL_TEXTURE_2D)
|
|
522
566
|
GL.glBindTexture(GL.GL_TEXTURE_2D, 0)
|
|
523
567
|
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
GL.
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
568
|
+
_prog = win._shaders['signedColor']
|
|
569
|
+
gt.useProgram(_prog)
|
|
570
|
+
|
|
571
|
+
GL.glPointSize(self.dotSize)
|
|
572
|
+
projectionMatrix = win._projectionMatrix
|
|
573
|
+
modelViewMatrix = win._viewMatrix
|
|
574
|
+
|
|
575
|
+
gt.setUniformValue(
|
|
576
|
+
_prog,
|
|
577
|
+
b'uColor',
|
|
578
|
+
self._foreColor.render('rgba1'))
|
|
579
|
+
alphaThreshold = getattr(self, 'alphaThreshold', 1.0)
|
|
580
|
+
gt.setUniformValue(
|
|
581
|
+
_prog, b'uAlphaThreshold', alphaThreshold, ignoreNotDefined=True)
|
|
582
|
+
gt.setUniformMatrix(
|
|
583
|
+
_prog,
|
|
584
|
+
b'uModelViewMatrix',
|
|
585
|
+
modelViewMatrix,
|
|
586
|
+
transpose=True)
|
|
587
|
+
gt.setUniformMatrix(
|
|
588
|
+
_prog,
|
|
589
|
+
b'uProjectionMatrix',
|
|
590
|
+
projectionMatrix,
|
|
591
|
+
transpose=True)
|
|
592
|
+
gt.drawClientArrays(
|
|
593
|
+
{'gl_Vertex': self.verticesPix},
|
|
594
|
+
'GL_POINTS')
|
|
595
|
+
|
|
596
|
+
gt.useProgram(None)
|
|
531
597
|
else:
|
|
532
598
|
# we don't want to do the screen scaling twice so for each dot
|
|
533
599
|
# subtract the screen centre
|
|
@@ -536,9 +602,9 @@ class DotStim(BaseVisualStim, ColorMixin, ContainerMixin):
|
|
|
536
602
|
_p = self.verticesPix[pointN, :] + self.fieldPos
|
|
537
603
|
self.element.setPos(_p)
|
|
538
604
|
self.element.draw()
|
|
605
|
+
|
|
539
606
|
# reset depth before going to next frame
|
|
540
607
|
self.element.setDepth(initialDepth)
|
|
541
|
-
GL.glPopMatrix()
|
|
542
608
|
|
|
543
609
|
def _newDotsXY(self, nDots):
|
|
544
610
|
"""Returns a uniform spread of dots, according to the `fieldShape` and
|
psychopy/visual/elementarray.py
CHANGED
|
@@ -6,7 +6,7 @@ independently controlled. Suitable for creating 'global form' stimuli or more
|
|
|
6
6
|
detailed random dot stimuli."""
|
|
7
7
|
|
|
8
8
|
# Part of the PsychoPy library
|
|
9
|
-
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-
|
|
9
|
+
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd.
|
|
10
10
|
# Distributed under the terms of the GNU General Public License (GPL).
|
|
11
11
|
|
|
12
12
|
# Ensure setting pyglet.options['debug_gl'] to False is done prior to any
|
|
@@ -30,12 +30,15 @@ from psychopy.visual import Window
|
|
|
30
30
|
from psychopy.tools.arraytools import val2array
|
|
31
31
|
from psychopy.tools.attributetools import attributeSetter, logAttrib, setAttribute
|
|
32
32
|
from psychopy.tools.monitorunittools import convertToPix
|
|
33
|
+
from psychopy.tools import gltools as gt
|
|
33
34
|
from psychopy.visual.helpers import setColor
|
|
34
35
|
from psychopy.visual.basevisual import MinimalStim, TextureMixin, ColorMixin
|
|
35
36
|
from . import globalVars
|
|
36
37
|
|
|
37
38
|
import numpy
|
|
38
39
|
|
|
40
|
+
USE_LEGACY_GL = pyglet.version < '2.0'
|
|
41
|
+
|
|
39
42
|
|
|
40
43
|
class ElementArrayStim(MinimalStim, TextureMixin, ColorMixin):
|
|
41
44
|
"""This stimulus class defines a field of elements whose behaviour can
|
|
@@ -499,16 +502,9 @@ class ElementArrayStim(MinimalStim, TextureMixin, ColorMixin):
|
|
|
499
502
|
"""
|
|
500
503
|
setAttribute(self, 'fieldSize', value, log, operation)
|
|
501
504
|
|
|
502
|
-
def
|
|
503
|
-
"""
|
|
504
|
-
this method after every MyWin.update() if you want the
|
|
505
|
-
stimulus to appear on that frame and then update the screen
|
|
506
|
-
again.
|
|
505
|
+
def _drawLegacyGL(self, win):
|
|
506
|
+
"""Legacy OpenGL drawing method for ElementArrayStim.
|
|
507
507
|
"""
|
|
508
|
-
if win is None:
|
|
509
|
-
win = self.win
|
|
510
|
-
self._selectWindow(win)
|
|
511
|
-
|
|
512
508
|
if self._needVertexUpdate:
|
|
513
509
|
self._updateVertices()
|
|
514
510
|
if self._needColorUpdate:
|
|
@@ -575,6 +571,84 @@ class ElementArrayStim(MinimalStim, TextureMixin, ColorMixin):
|
|
|
575
571
|
GL.glPopClientAttrib()
|
|
576
572
|
GL.glPopMatrix()
|
|
577
573
|
|
|
574
|
+
def draw(self, win=None):
|
|
575
|
+
"""Draw the stimulus in its relevant window. You must call
|
|
576
|
+
this method after every MyWin.update() if you want the
|
|
577
|
+
stimulus to appear on that frame and then update the screen
|
|
578
|
+
again.
|
|
579
|
+
"""
|
|
580
|
+
if win is None:
|
|
581
|
+
win = self.win
|
|
582
|
+
self._selectWindow(win)
|
|
583
|
+
|
|
584
|
+
if win.USE_LEGACY_GL: # use legacy draw functions
|
|
585
|
+
self._drawLegacyGL(win)
|
|
586
|
+
return
|
|
587
|
+
|
|
588
|
+
# scale the drawing frame and get to centre of field
|
|
589
|
+
win.setOrthographicView()
|
|
590
|
+
win.setScale('pix')
|
|
591
|
+
|
|
592
|
+
if self._needVertexUpdate:
|
|
593
|
+
self._updateVertices()
|
|
594
|
+
if self._needColorUpdate:
|
|
595
|
+
self.updateElementColors()
|
|
596
|
+
if self._needTexCoordUpdate:
|
|
597
|
+
self.updateTextureCoords()
|
|
598
|
+
|
|
599
|
+
GL.glEnable(GL.GL_BLEND)
|
|
600
|
+
|
|
601
|
+
# setup the shaderprogram
|
|
602
|
+
_prog = self.win._progSignedTexMask
|
|
603
|
+
gt.useProgram(_prog)
|
|
604
|
+
|
|
605
|
+
GL.glActiveTexture(GL.GL_TEXTURE1)
|
|
606
|
+
GL.glBindTexture(GL.GL_TEXTURE_2D, self._maskID)
|
|
607
|
+
GL.glEnable(GL.GL_TEXTURE_2D)
|
|
608
|
+
GL.glActiveTexture(GL.GL_TEXTURE0)
|
|
609
|
+
GL.glBindTexture(GL.GL_TEXTURE_2D, self._texID)
|
|
610
|
+
GL.glEnable(GL.GL_TEXTURE_2D)
|
|
611
|
+
|
|
612
|
+
gt.setUniformSampler2D(_prog, b'uTexture', 0)
|
|
613
|
+
gt.setUniformSampler2D(_prog, b'uMask', 1)
|
|
614
|
+
gt.setUniformValue(_prog, b'uColor', [1., 1., 1., 1.])
|
|
615
|
+
alphaThreshold = getattr(self, 'alphaThreshold', 1.0)
|
|
616
|
+
gt.setUniformValue(
|
|
617
|
+
_prog, b'uAlphaThreshold', alphaThreshold, ignoreNotDefined=True)
|
|
618
|
+
gt.setUniformMatrix(
|
|
619
|
+
_prog,
|
|
620
|
+
b'uProjectionMatrix',
|
|
621
|
+
win._projectionMatrix,
|
|
622
|
+
transpose=True)
|
|
623
|
+
gt.setUniformMatrix(
|
|
624
|
+
_prog,
|
|
625
|
+
b'uModelViewMatrix',
|
|
626
|
+
win._viewMatrix,
|
|
627
|
+
transpose=True)
|
|
628
|
+
|
|
629
|
+
verticesPix = self.verticesPix.reshape(-1, 3)
|
|
630
|
+
RGBAs = self._RGBAs.reshape(-1, 4)
|
|
631
|
+
texCoords = self._texCoords.reshape(-1, 2)
|
|
632
|
+
maskCoords = self._maskCoords.reshape(-1, 2)
|
|
633
|
+
|
|
634
|
+
gt.drawClientArrays({
|
|
635
|
+
'gl_Vertex': verticesPix,
|
|
636
|
+
'gl_Color': RGBAs,
|
|
637
|
+
'gl_MultiTexCoord0': texCoords,
|
|
638
|
+
'gl_MultiTexCoord1': maskCoords},
|
|
639
|
+
'GL_QUADS')
|
|
640
|
+
|
|
641
|
+
gt.useProgram(None)
|
|
642
|
+
|
|
643
|
+
GL.glActiveTexture(GL.GL_TEXTURE1)
|
|
644
|
+
GL.glBindTexture(GL.GL_TEXTURE_2D, 0)
|
|
645
|
+
GL.glDisable(GL.GL_TEXTURE_2D)
|
|
646
|
+
GL.glActiveTexture(GL.GL_TEXTURE0)
|
|
647
|
+
GL.glBindTexture(GL.GL_TEXTURE_2D, 0)
|
|
648
|
+
GL.glDisable(GL.GL_TEXTURE_2D)
|
|
649
|
+
|
|
650
|
+
GL.glDisable(GL.GL_BLEND)
|
|
651
|
+
|
|
578
652
|
def _updateVertices(self):
|
|
579
653
|
"""Sets Stim.verticesPix from fieldPos.
|
|
580
654
|
"""
|
psychopy/visual/filters.py
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
8
|
# Part of the PsychoPy library
|
|
9
|
-
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-
|
|
9
|
+
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd.
|
|
10
10
|
# Distributed under the terms of the GNU General Public License (GPL).
|
|
11
11
|
|
|
12
12
|
import numpy
|
psychopy/visual/form.py
CHANGED
|
@@ -3,10 +3,12 @@
|
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
# Part of the PsychoPy library
|
|
6
|
-
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-
|
|
6
|
+
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd.
|
|
7
7
|
# Distributed under the terms of the GNU General Public License (GPL).
|
|
8
8
|
import copy
|
|
9
9
|
import psychopy
|
|
10
|
+
from psychopy.localization import _translate
|
|
11
|
+
from psychopy.tools.attributetools import undefined
|
|
10
12
|
from .text import TextStim
|
|
11
13
|
from .rect import Rect
|
|
12
14
|
from psychopy.data.utils import importConditions, listFromString
|
|
@@ -124,8 +126,8 @@ class Form(BaseVisualStim, ContainerMixin, ColorMixin):
|
|
|
124
126
|
autoLog=True,
|
|
125
127
|
depth=0,
|
|
126
128
|
# legacy
|
|
127
|
-
color=
|
|
128
|
-
foreColor=
|
|
129
|
+
color=undefined,
|
|
130
|
+
foreColor=undefined
|
|
129
131
|
):
|
|
130
132
|
|
|
131
133
|
super(Form, self).__init__(win, units, autoLog=False)
|
|
@@ -148,12 +150,12 @@ class Form(BaseVisualStim, ContainerMixin, ColorMixin):
|
|
|
148
150
|
self.itemColor = itemColor
|
|
149
151
|
self.responseColor = responseColor
|
|
150
152
|
self.markerColor = markerColor
|
|
151
|
-
if color:
|
|
153
|
+
if color is not undefined:
|
|
152
154
|
self.foreColor = color
|
|
153
|
-
if foreColor:
|
|
155
|
+
if foreColor is not undefined:
|
|
154
156
|
self.foreColor = color
|
|
155
157
|
|
|
156
|
-
self.font = font or "
|
|
158
|
+
self.font = font or "Noto Sans"
|
|
157
159
|
|
|
158
160
|
self.textHeight = textHeight
|
|
159
161
|
self._baseYpositions = []
|
|
@@ -229,27 +231,41 @@ class Form(BaseVisualStim, ContainerMixin, ColorMixin):
|
|
|
229
231
|
.format(hdr, self.name, fieldNames))
|
|
230
232
|
|
|
231
233
|
|
|
232
|
-
def
|
|
233
|
-
"""
|
|
234
|
+
def _checkType(thisType):
|
|
235
|
+
"""
|
|
236
|
+
Check that the "type" field of an item is known to PsychoPy.
|
|
234
237
|
|
|
235
|
-
|
|
238
|
+
Parameters
|
|
239
|
+
----------
|
|
240
|
+
thisType : str
|
|
241
|
+
Type name to check -
|
|
242
|
+
|
|
243
|
+
Returns
|
|
244
|
+
-------
|
|
245
|
+
str
|
|
246
|
+
If `thisType` is a close match (e.g. "Choice" rather than "choice"), it will be
|
|
247
|
+
replaced by the correct value. Otherwise will simply return `thisType`.
|
|
248
|
+
|
|
249
|
+
Raises
|
|
250
|
+
------
|
|
251
|
+
ValueError
|
|
252
|
+
If type is not an exact or close match for any known types.
|
|
236
253
|
"""
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
raise ValueError(msg)
|
|
254
|
+
# sanitize the names of expected types
|
|
255
|
+
sanitizedTypes = [t.lower() for t in _knownRespTypes]
|
|
256
|
+
# sanitize thisType
|
|
257
|
+
thisTypeSanit = thisType.lower().strip()
|
|
258
|
+
# compare to list of types
|
|
259
|
+
if thisTypeSanit in sanitizedTypes:
|
|
260
|
+
# if sanitized match, substitute in the expected name
|
|
261
|
+
return list(_knownRespTypes)[sanitizedTypes.index(thisTypeSanit)]
|
|
262
|
+
else:
|
|
263
|
+
# otherwise, raise an error
|
|
264
|
+
raise ValueError(
|
|
265
|
+
_translate(
|
|
266
|
+
"Incorrect item type '{}' in Form '{}', allowed types are: {}"
|
|
267
|
+
).format(thisType, self.name, ", ".join(_knownRespTypes))
|
|
268
|
+
)
|
|
253
269
|
|
|
254
270
|
def _addDefaultItems(items):
|
|
255
271
|
"""
|
|
@@ -319,9 +335,8 @@ class Form(BaseVisualStim, ContainerMixin, ColorMixin):
|
|
|
319
335
|
item['tickLabels'] = listFromString(item['tickLabels'])
|
|
320
336
|
if 'options' in item and item['options']:
|
|
321
337
|
item['options'] = listFromString(item['options'])
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
[_checkTypes(item['type'], item['itemText']) for item in items]
|
|
338
|
+
# validate item type
|
|
339
|
+
item['type'] = _checkType(item['type'])
|
|
325
340
|
# Check N options > 1
|
|
326
341
|
# Randomise items if requested
|
|
327
342
|
if self.randomize:
|
psychopy/visual/grating.py
CHANGED
|
@@ -6,7 +6,7 @@ in either dimension. One of the main stimuli for PsychoPy.
|
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
8
|
# Part of the PsychoPy library
|
|
9
|
-
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-
|
|
9
|
+
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd.
|
|
10
10
|
# Distributed under the terms of the GNU General Public License (GPL).
|
|
11
11
|
|
|
12
12
|
# Ensure setting pyglet.options['debug_gl'] to False is done prior to any
|
|
@@ -26,11 +26,14 @@ from psychopy import logging
|
|
|
26
26
|
|
|
27
27
|
from psychopy.tools.arraytools import val2array
|
|
28
28
|
from psychopy.tools.attributetools import attributeSetter
|
|
29
|
+
from psychopy.tools import gltools as gt
|
|
29
30
|
from psychopy.visual.basevisual import (
|
|
30
31
|
BaseVisualStim, DraggingMixin, ColorMixin, ContainerMixin, TextureMixin
|
|
31
32
|
)
|
|
32
33
|
import numpy
|
|
33
34
|
|
|
35
|
+
USE_LEGACY_GL = pyglet.version < '2.0'
|
|
36
|
+
|
|
34
37
|
|
|
35
38
|
class GratingStim(BaseVisualStim, DraggingMixin, TextureMixin, ColorMixin,
|
|
36
39
|
ContainerMixin):
|
|
@@ -129,9 +132,6 @@ class GratingStim(BaseVisualStim, DraggingMixin, TextureMixin, ColorMixin,
|
|
|
129
132
|
produces a smoother (less-pixelated) outline of the shape.
|
|
130
133
|
draggable : bool
|
|
131
134
|
Can this stimulus be dragged by a mouse click?
|
|
132
|
-
lineRGB, fillRGB: ArrayLike, :class:`~psychopy.colors.Color` or None
|
|
133
|
-
*Deprecated*. Please use `lineColor` and `fillColor`. These arguments
|
|
134
|
-
may be removed in a future version.
|
|
135
135
|
name : str
|
|
136
136
|
Optional name of the stimuli for logging.
|
|
137
137
|
autoLog : bool
|
|
@@ -253,20 +253,17 @@ class GratingStim(BaseVisualStim, DraggingMixin, TextureMixin, ColorMixin,
|
|
|
253
253
|
# fix scaling to window coords
|
|
254
254
|
self._calcCyclesPerStim()
|
|
255
255
|
|
|
256
|
-
# generate a displaylist ID
|
|
257
|
-
self._listID = GL.glGenLists(1)
|
|
258
|
-
|
|
259
|
-
# JRG: doing self._updateList() here means MRO issues for RadialStim,
|
|
260
|
-
# which inherits from GratingStim but has its own _updateList code.
|
|
261
|
-
# So don't want to do the update here (= ALSO the init of RadialStim).
|
|
262
|
-
# Could potentially define a BaseGrating class without
|
|
263
|
-
# updateListShaders code, and have GratingStim and RadialStim
|
|
264
|
-
# inherit from it and add their own _updateList stuff.
|
|
265
|
-
# Seems unnecessary. Instead, simply defer the update to the
|
|
266
|
-
# first .draw(), should be fast:
|
|
267
|
-
# self._updateList() # ie refresh display list
|
|
268
256
|
self._needUpdate = True
|
|
269
257
|
|
|
258
|
+
if USE_LEGACY_GL:
|
|
259
|
+
# generate a displaylist ID
|
|
260
|
+
self._listID = GL.glGenLists(1)
|
|
261
|
+
else:
|
|
262
|
+
# cache texture and mask coords here
|
|
263
|
+
self._texCoords = numpy.array(
|
|
264
|
+
[[1, 0], [0, 0], [0, 1], [1, 1]], dtype=float)
|
|
265
|
+
self._maskCoords = self._texCoords.copy()
|
|
266
|
+
|
|
270
267
|
# set autoLog now that params have been initialised
|
|
271
268
|
wantLog = autoLog is None and self.win.autoLog
|
|
272
269
|
self.__dict__['autoLog'] = autoLog or wantLog
|
|
@@ -378,6 +375,28 @@ class GratingStim(BaseVisualStim, DraggingMixin, TextureMixin, ColorMixin,
|
|
|
378
375
|
"""
|
|
379
376
|
self._set('blendmode', value, log=log)
|
|
380
377
|
|
|
378
|
+
def _drawLegacyGL(self, win):
|
|
379
|
+
"""Legacy draw function for older OpenGL versions.
|
|
380
|
+
"""
|
|
381
|
+
saveBlendMode = win.blendMode
|
|
382
|
+
win.setBlendMode(self.blendmode, log=False)
|
|
383
|
+
|
|
384
|
+
# do scaling
|
|
385
|
+
GL.glPushMatrix() # push before the list, pop after
|
|
386
|
+
win.setScale('pix')
|
|
387
|
+
# the list just does the texture mapping
|
|
388
|
+
GL.glColor4f(*self._foreColor.render('rgba1'))
|
|
389
|
+
|
|
390
|
+
if self._needTextureUpdate:
|
|
391
|
+
self.setTex(value=self.tex, log=False)
|
|
392
|
+
if self._needUpdate:
|
|
393
|
+
self._updateList()
|
|
394
|
+
GL.glCallList(self._listID)
|
|
395
|
+
|
|
396
|
+
# return the view to previous state
|
|
397
|
+
GL.glPopMatrix()
|
|
398
|
+
win.setBlendMode(saveBlendMode, log=False)
|
|
399
|
+
|
|
381
400
|
def draw(self, win=None):
|
|
382
401
|
"""Draw the stimulus in its relevant window.
|
|
383
402
|
|
|
@@ -396,23 +415,81 @@ class GratingStim(BaseVisualStim, DraggingMixin, TextureMixin, ColorMixin,
|
|
|
396
415
|
win = self.win
|
|
397
416
|
|
|
398
417
|
self._selectWindow(win)
|
|
399
|
-
saveBlendMode = win.blendMode
|
|
400
|
-
win.setBlendMode(self.blendmode, log=False)
|
|
401
418
|
|
|
402
|
-
|
|
403
|
-
|
|
419
|
+
if win.USE_LEGACY_GL:
|
|
420
|
+
self._drawLegacyGL(win)
|
|
421
|
+
return
|
|
422
|
+
|
|
404
423
|
win.setScale('pix')
|
|
405
|
-
|
|
406
|
-
GL.glColor4f(*self._foreColor.render('rgba1'))
|
|
424
|
+
win.setOrthographicView()
|
|
407
425
|
|
|
408
426
|
if self._needTextureUpdate:
|
|
409
427
|
self.setTex(value=self.tex, log=False)
|
|
410
428
|
if self._needUpdate:
|
|
411
|
-
self.
|
|
412
|
-
|
|
429
|
+
Ltex = (-self._cycles[0] / 2) - self.phase[0] + 0.5
|
|
430
|
+
Rtex = (+self._cycles[0] / 2) - self.phase[0] + 0.5
|
|
431
|
+
Ttex = (+self._cycles[1] / 2) - self.phase[1] + 0.5
|
|
432
|
+
Btex = (-self._cycles[1] / 2) - self.phase[1] + 0.5
|
|
433
|
+
Lmask = Bmask = 0.0
|
|
434
|
+
Tmask = Rmask = 1.0 # mask
|
|
435
|
+
|
|
436
|
+
self._texCoords = numpy.ascontiguousarray(
|
|
437
|
+
[[Rtex, Btex], [Ltex, Btex], [Ltex, Ttex], [Rtex, Ttex]],
|
|
438
|
+
dtype=float)
|
|
439
|
+
self._maskCoords = numpy.ascontiguousarray(
|
|
440
|
+
[[Rmask, Bmask], [Lmask, Bmask], [Lmask, Tmask], [Rmask, Tmask]],
|
|
441
|
+
dtype=float)
|
|
442
|
+
self._needUpdate = False
|
|
443
|
+
|
|
444
|
+
# retain the current blendmode and change it to the one for this stim
|
|
445
|
+
saveBlendMode = win.blendMode
|
|
446
|
+
win.setBlendMode(self.blendmode, log=False)
|
|
447
|
+
GL.glEnable(GL.GL_BLEND)
|
|
448
|
+
|
|
449
|
+
# draw the stimulus
|
|
450
|
+
_prog = self.win._progSignedTexMask
|
|
451
|
+
gt.useProgram(_prog)
|
|
452
|
+
|
|
453
|
+
GL.glActiveTexture(GL.GL_TEXTURE1) # mask
|
|
454
|
+
GL.glBindTexture(GL.GL_TEXTURE_2D, self._maskID)
|
|
455
|
+
GL.glEnable(GL.GL_TEXTURE_2D) # implicitly disables 1D
|
|
456
|
+
|
|
457
|
+
# main texture
|
|
458
|
+
GL.glActiveTexture(GL.GL_TEXTURE0)
|
|
459
|
+
GL.glBindTexture(GL.GL_TEXTURE_2D, self._texID)
|
|
460
|
+
GL.glEnable(GL.GL_TEXTURE_2D)
|
|
461
|
+
|
|
462
|
+
# the list just does the texture mapping
|
|
463
|
+
gt.setUniformSampler2D(_prog, b'uTexture', 0)
|
|
464
|
+
gt.setUniformSampler2D(_prog, b'uMask', 1)
|
|
465
|
+
gt.setUniformValue(_prog, b'uColor', self._foreColor.render('rgba1'))
|
|
466
|
+
gt.setUniformMatrix(
|
|
467
|
+
_prog,
|
|
468
|
+
b'uProjectionMatrix',
|
|
469
|
+
win._projectionMatrix,
|
|
470
|
+
transpose=True)
|
|
471
|
+
gt.setUniformMatrix(
|
|
472
|
+
_prog,
|
|
473
|
+
b'uModelViewMatrix',
|
|
474
|
+
win._viewMatrix,
|
|
475
|
+
transpose=True)
|
|
476
|
+
|
|
477
|
+
gt.drawClientArrays({
|
|
478
|
+
'gl_Vertex': self.verticesPix,
|
|
479
|
+
'gl_MultiTexCoord0': self._texCoords,
|
|
480
|
+
'gl_MultiTexCoord1': self._maskCoords},
|
|
481
|
+
'GL_QUADS')
|
|
482
|
+
|
|
483
|
+
gt.useProgram(None)
|
|
484
|
+
|
|
485
|
+
# unbind the textures
|
|
486
|
+
GL.glActiveTexture(GL.GL_TEXTURE1)
|
|
487
|
+
GL.glBindTexture(GL.GL_TEXTURE_2D, 0)
|
|
488
|
+
GL.glActiveTexture(GL.GL_TEXTURE0)
|
|
489
|
+
GL.glBindTexture(GL.GL_TEXTURE_2D, 0)
|
|
490
|
+
GL.glDisable(GL.GL_TEXTURE_2D)
|
|
413
491
|
|
|
414
492
|
# return the view to previous state
|
|
415
|
-
GL.glPopMatrix()
|
|
416
493
|
win.setBlendMode(saveBlendMode, log=False)
|
|
417
494
|
|
|
418
495
|
def _updateListShaders(self):
|
|
@@ -422,6 +499,9 @@ class GratingStim(BaseVisualStim, DraggingMixin, TextureMixin, ColorMixin,
|
|
|
422
499
|
stimulus changes. Call it if you change a property manually
|
|
423
500
|
rather than using the .set() command
|
|
424
501
|
"""
|
|
502
|
+
if not self.win.USE_LEGACY_GL: # not needed for newer GL
|
|
503
|
+
return
|
|
504
|
+
|
|
425
505
|
self._needUpdate = False
|
|
426
506
|
GL.glNewList(self._listID, GL.GL_COMPILE)
|
|
427
507
|
# setup the shaderprogram
|
psychopy/visual/helpers.py
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
7
|
# Part of the PsychoPy library
|
|
8
|
-
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-
|
|
8
|
+
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd.
|
|
9
9
|
# Distributed under the terms of the GNU General Public License (GPL).
|
|
10
10
|
|
|
11
11
|
import os
|