psychopy 2024.2.4__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 +208 -4
- 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 +1514 -3259
- 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 +37 -15
- 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/{Feature Demos/eyetracking/eyetracking.xml → Hardware/lab_streaming_layer/lsl_triggers_demo_legacy_legacy.psyexp} +154 -140
- 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 +62 -16
- 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/client/__init__.py +17 -0
- psychopy/iohub/client/keyboard.py +5 -0
- 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 +6 -1
- psychopy/iohub/devices/mouse/win32.py +5 -0
- 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_loaded_namespace/test_counterbalance.psyexp +142 -0
- psychopy/tests/data/test_loaded_namespace/test_custom_missing.psyexp +129 -0
- psychopy/tests/data/test_loaded_namespace/test_missing_counterbalance.psyexp +116 -0
- psychopy/tests/data/test_loaded_namespace/test_mix_exp.psyexp +181 -0
- psychopy/tests/data/test_loaded_namespace/test_mix_missing.psyexp +140 -0
- psychopy/tests/data/test_loaded_namespace/test_mix_name_calibration.psyexp +164 -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_experiment.py +96 -0
- 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/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.4.dist-info → psychopy-2025.1.0.dist-info}/METADATA +9 -9
- {psychopy-2024.2.4.dist-info → psychopy-2025.1.0.dist-info}/RECORD +653 -660
- 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/zh_CN/LC_MESSAGE/zh_CN.mo +0 -0
- psychopy/app/locale/zh_CN/LC_MESSAGE/zh_CN.po +0 -6127
- psychopy/app/locale/zh_CN/LC_MESSAGE/zh_CN_allFlagged.mo +0 -0
- psychopy/app/locale/zh_CN/LC_MESSAGE/zh_CN_allFlagged.po +0 -7366
- psychopy/core.py.orig +0 -169
- psychopy/demos/builder/.DS_Store +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/index.html +0 -23
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/randomisedBlocks-legacy-browsers.js +0 -423
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/randomisedBlocks.js +0 -427
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/chooseBlock.xlsx +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/facesBlock.xlsx +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/housesBlock.xlsx +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/stims/face01.jpg +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/stims/face02.jpg +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/stims/face03.jpg +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/stims/house01.jpg +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/stims/house02.jpg +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/html/resources/stims/house03.jpg +0 -0
- psychopy/demos/builder/Design Templates/randomisedBlocks/randomisedBlocks.py +0 -330
- 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/Feature Demos/eyetracking/eyetracking.xsd +0 -120
- 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.psyexp +0 -323
- psychopy/demos/builder/Tools/gammaCalibration/gamma_correction_visual.py +0 -562
- psychopy/demos/builder/Tools/gammaCalibration/gamma_correction_visual_lastrun.py +0 -562
- psychopy/demos/builder/Tools/gammaCalibration/questStairs.xlsx +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/resources/low_contrast.png +0 -0
- psychopy/demos/builder/Tools/gammaCalibration/resources/make_2nd_order_tex.py +0 -59
- psychopy/demos/builder/Tools/gammaCalibration/resources/second_order_tex.png +0 -0
- 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/demos/coder/stimuli/radialGratingContracting.py +0 -29
- 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/hardware/serialport.py +0 -51
- 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/__test.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/corrFullRandom_local.csv +0 -16
- psychopy/tests/data/corrFullRandom_local.tsv +0 -6
- 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/testLoopsBlocks.psyexp_local.py +0 -328
- 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/text2_height.png +0 -0
- psychopy/tests/data/text2_normAddBlend.png +0 -0
- psychopy/tests/data/text2_normHexbackground.png +0 -0
- psychopy/tests/data/text2_stencil.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.csv +0 -9
- 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.csv +0 -9
- 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/{demos/builder/Tools/gammaCalibration/readme.md → tests/test_plugins/__init__.py} +0 -0
- {psychopy-2024.2.4.dist-info → psychopy-2025.1.0.dist-info}/WHEEL +0 -0
- {psychopy-2024.2.4.dist-info → psychopy-2025.1.0.dist-info}/entry_points.txt +0 -0
- {psychopy-2024.2.4.dist-info → psychopy-2025.1.0.dist-info}/licenses/LICENSE +0 -0
psychopy/app/_psychopyApp.py
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# -*- coding: utf-8 -*-
|
|
3
3
|
|
|
4
4
|
# Part of the PsychoPy library
|
|
5
|
-
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-
|
|
5
|
+
# Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd.
|
|
6
6
|
# Distributed under the terms of the GNU General Public License (GPL).
|
|
7
7
|
import traceback
|
|
8
8
|
from pathlib import Path
|
|
@@ -19,8 +19,6 @@ import argparse
|
|
|
19
19
|
|
|
20
20
|
from psychopy.app.themes import icons, colors, handlers
|
|
21
21
|
|
|
22
|
-
profiling = False # turning on will save profile files in currDir
|
|
23
|
-
|
|
24
22
|
import psychopy
|
|
25
23
|
from psychopy import prefs
|
|
26
24
|
from packaging.version import Version
|
|
@@ -51,7 +49,7 @@ from psychopy.localization import _translate
|
|
|
51
49
|
# e.g. coder and builder are imported during app.__init__ because they
|
|
52
50
|
# take a while
|
|
53
51
|
|
|
54
|
-
# needed by splash screen for the path to resources/
|
|
52
|
+
# needed by splash screen for the path to resources/splash.png
|
|
55
53
|
import ctypes
|
|
56
54
|
from psychopy import logging, __version__
|
|
57
55
|
from psychopy import projects
|
|
@@ -123,7 +121,7 @@ class MenuFrame(wx.Frame, themes.handlers.ThemeMixin):
|
|
|
123
121
|
class IDStore(dict):
|
|
124
122
|
"""A simpe class that works like a dict but you can access attributes
|
|
125
123
|
like standard python attrs. Useful to replace the previous pre-made
|
|
126
|
-
app.IDs (wx.
|
|
124
|
+
app.IDs (wx.NewIdRef(count=1) is no longer recommended or safe)
|
|
127
125
|
"""
|
|
128
126
|
def __getattr__(self, attr):
|
|
129
127
|
return self[attr]
|
|
@@ -166,7 +164,7 @@ class _Showgui_Hack():
|
|
|
166
164
|
class PsychoPyApp(wx.App, handlers.ThemeMixin):
|
|
167
165
|
_called_from_test = False # pytest needs to change this
|
|
168
166
|
|
|
169
|
-
def __init__(self, arg=0, testMode=False, startView=None, **kwargs):
|
|
167
|
+
def __init__(self, arg=0, testMode=False, startView=None, profiling=False, **kwargs):
|
|
170
168
|
"""With a wx.App some things get done here, before App.__init__
|
|
171
169
|
then some further code is launched in OnInit() which occurs after
|
|
172
170
|
"""
|
|
@@ -208,6 +206,7 @@ class PsychoPyApp(wx.App, handlers.ThemeMixin):
|
|
|
208
206
|
|
|
209
207
|
# set as false to disable loading plugins on startup
|
|
210
208
|
self._safeMode = kwargs.get('safeMode', True)
|
|
209
|
+
self.firstRun = kwargs.get('firstRun', False)
|
|
211
210
|
|
|
212
211
|
# Shared memory used for messaging between app instances, this gets
|
|
213
212
|
# allocated when `OnInit` is called.
|
|
@@ -245,7 +244,11 @@ class PsychoPyApp(wx.App, handlers.ThemeMixin):
|
|
|
245
244
|
self.locale.AddCatalog(self.GetAppName())
|
|
246
245
|
|
|
247
246
|
logging.flush()
|
|
248
|
-
self.onInit(
|
|
247
|
+
self.onInit(
|
|
248
|
+
testMode=testMode,
|
|
249
|
+
startView=startView,
|
|
250
|
+
**kwargs
|
|
251
|
+
)
|
|
249
252
|
if profiling:
|
|
250
253
|
profile.disable()
|
|
251
254
|
print("time to load app = {:.2f}".format(time.time()-t0))
|
|
@@ -378,7 +381,15 @@ class PsychoPyApp(wx.App, handlers.ThemeMixin):
|
|
|
378
381
|
for builderFrame in self.builder:
|
|
379
382
|
builderFrame.componentButtons.populate()
|
|
380
383
|
|
|
381
|
-
def onInit(
|
|
384
|
+
def onInit(
|
|
385
|
+
self,
|
|
386
|
+
showSplash=True,
|
|
387
|
+
testMode=False,
|
|
388
|
+
safeMode=False,
|
|
389
|
+
startView=None,
|
|
390
|
+
startFiles=None,
|
|
391
|
+
firstRun=False,
|
|
392
|
+
):
|
|
382
393
|
"""This is launched immediately *after* the app initialises with
|
|
383
394
|
wxPython.
|
|
384
395
|
|
|
@@ -406,8 +417,14 @@ class PsychoPyApp(wx.App, handlers.ThemeMixin):
|
|
|
406
417
|
|
|
407
418
|
if showSplash:
|
|
408
419
|
# show splash screen
|
|
409
|
-
|
|
410
|
-
|
|
420
|
+
if str(__version__).endswith("beta"):
|
|
421
|
+
splashFile = os.path.join(
|
|
422
|
+
self.prefs.paths['resources'], 'betasplash.png'
|
|
423
|
+
)
|
|
424
|
+
else:
|
|
425
|
+
splashFile = os.path.join(
|
|
426
|
+
self.prefs.paths['resources'], 'splash.png'
|
|
427
|
+
)
|
|
411
428
|
splashImage = wx.Image(name=splashFile)
|
|
412
429
|
splashImage.ConvertAlphaToMask()
|
|
413
430
|
splash = AS.AdvancedSplash(
|
|
@@ -415,7 +432,7 @@ class PsychoPyApp(wx.App, handlers.ThemeMixin):
|
|
|
415
432
|
timeout=3000, agwStyle=AS.AS_TIMEOUT | AS.AS_CENTER_ON_SCREEN
|
|
416
433
|
)
|
|
417
434
|
w, h = splashImage.GetSize()
|
|
418
|
-
splash.SetTextPosition((
|
|
435
|
+
splash.SetTextPosition((300, h - 30))
|
|
419
436
|
splash.SetText(
|
|
420
437
|
_translate("Copyright (C) {year} OpenScienceTools.org").format(year=2024))
|
|
421
438
|
else:
|
|
@@ -428,9 +445,6 @@ class PsychoPyApp(wx.App, handlers.ThemeMixin):
|
|
|
428
445
|
# import coder and builder here but only use them later
|
|
429
446
|
from psychopy.app import coder, builder, runner, dialogs
|
|
430
447
|
|
|
431
|
-
if '--firstrun' in sys.argv:
|
|
432
|
-
del sys.argv[sys.argv.index('--firstrun')]
|
|
433
|
-
self.firstRun = True
|
|
434
448
|
if 'lastVersion' not in self.prefs.appData:
|
|
435
449
|
# must be before 1.74.00
|
|
436
450
|
last = self.prefs.appData['lastVersion'] = '1.73.04'
|
|
@@ -445,18 +459,25 @@ class PsychoPyApp(wx.App, handlers.ThemeMixin):
|
|
|
445
459
|
# on a mac, don't exit when the last frame is deleted, just show menu
|
|
446
460
|
if sys.platform == 'darwin':
|
|
447
461
|
self.menuFrame = MenuFrame(parent=None, app=self)
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
462
|
+
|
|
463
|
+
# get starting windows
|
|
464
|
+
if startView in (None, []):
|
|
465
|
+
# if no window specified, use default from prefs
|
|
466
|
+
if self.prefs.app['defaultView'] == 'all':
|
|
467
|
+
startView = ["builder", "coder", "runner"]
|
|
468
|
+
elif self.prefs.app['defaultView'] == "last":
|
|
469
|
+
if self.prefs.appData['lastFrame'] == "both" or not self.prefs.appData['lastFrame']:
|
|
470
|
+
self.prefs.appData['lastFrame'] = "builder-coder-runner"
|
|
471
|
+
startView = self.prefs.appData['lastFrame'].split("-")
|
|
472
|
+
elif self.prefs.app['defaultView'] in ["builder", "coder", "runner"]:
|
|
473
|
+
startView = self.prefs.app['defaultView']
|
|
459
474
|
|
|
475
|
+
if not startView: # if we still don't have a startView then load Builder
|
|
476
|
+
startView = ["builder"]
|
|
477
|
+
|
|
478
|
+
# load fonts
|
|
479
|
+
if splash:
|
|
480
|
+
splash.SetText(_translate("Loading app fonts..."))
|
|
460
481
|
self.dpi = int(wx.GetDisplaySize()[0] /
|
|
461
482
|
float(wx.GetDisplaySizeMM()[0]) * 25.4)
|
|
462
483
|
# detect retina displays
|
|
@@ -470,7 +491,6 @@ class PsychoPyApp(wx.App, handlers.ThemeMixin):
|
|
|
470
491
|
# adjust dpi to something reasonable
|
|
471
492
|
if not (50 < self.dpi < 120):
|
|
472
493
|
self.dpi = 80 # dpi was unreasonable, make one up
|
|
473
|
-
|
|
474
494
|
# Manage fonts
|
|
475
495
|
if sys.platform == 'win32':
|
|
476
496
|
# wx.SYS_DEFAULT_GUI_FONT is default GUI font in Win32
|
|
@@ -478,10 +498,9 @@ class PsychoPyApp(wx.App, handlers.ThemeMixin):
|
|
|
478
498
|
else:
|
|
479
499
|
self._mainFont = wx.SystemSettings.GetFont(wx.SYS_ANSI_FIXED_FONT)
|
|
480
500
|
# rescale for tiny retina fonts
|
|
481
|
-
|
|
482
501
|
if hasattr(wx.Font, "AddPrivateFont") and sys.platform != "darwin":
|
|
483
502
|
# Load packaged fonts if possible
|
|
484
|
-
for fontFile in (Path(__file__).parent / "
|
|
503
|
+
for fontFile in (Path(__file__).parent.parent / "assets" / "fonts").glob("*"):
|
|
485
504
|
if fontFile.suffix in ['.ttf', '.truetype']:
|
|
486
505
|
wx.Font.AddPrivateFont(str(fontFile))
|
|
487
506
|
# Set fonts as those loaded
|
|
@@ -498,126 +517,92 @@ class PsychoPyApp(wx.App, handlers.ThemeMixin):
|
|
|
498
517
|
wx.FONTFAMILY_TELETYPE,
|
|
499
518
|
wx.FONTSTYLE_NORMAL,
|
|
500
519
|
wx.FONTWEIGHT_NORMAL)
|
|
501
|
-
|
|
502
520
|
if self.isRetina:
|
|
503
521
|
self._codeFont.SetPointSize(int(self._codeFont.GetPointSize()*fontScale))
|
|
504
522
|
self._mainFont.SetPointSize(int(self._mainFont.GetPointSize()*fontScale))
|
|
505
|
-
|
|
506
523
|
# that gets most of the properties of _codeFont but the FaceName
|
|
507
524
|
# FaceName is set in the setting of the theme:
|
|
508
525
|
self.theme = prefs.app['theme']
|
|
509
526
|
|
|
510
|
-
# removed Aug 2017: on newer versions of wx (at least on mac)
|
|
511
|
-
# this looks too big
|
|
512
|
-
# if hasattr(self._mainFont, 'Larger'):
|
|
513
|
-
# # Font.Larger is available since wyPython version 2.9.1
|
|
514
|
-
# # PsychoPy still supports 2.8 (see ensureMinimal above)
|
|
515
|
-
# self._mainFont = self._mainFont.Larger()
|
|
516
|
-
# self._codeFont.SetPointSize(
|
|
517
|
-
# self._mainFont.GetPointSize()) # unify font size
|
|
518
|
-
|
|
519
527
|
# load plugins so they're available before frames are created
|
|
520
528
|
if splash:
|
|
521
|
-
splash.SetText(_translate("
|
|
529
|
+
splash.SetText(_translate("Loading plugins..."))
|
|
522
530
|
from psychopy.plugins import activatePlugins
|
|
523
531
|
activatePlugins()
|
|
524
|
-
|
|
525
|
-
# create both frame for coder/builder as necess
|
|
526
|
-
if splash:
|
|
527
|
-
splash.SetText(_translate(" Creating frames..."))
|
|
528
|
-
|
|
529
|
-
# get starting windows
|
|
530
|
-
if startView in (None, []):
|
|
531
|
-
# if no window specified, use default from prefs
|
|
532
|
-
if self.prefs.app['defaultView'] == 'all':
|
|
533
|
-
startView = ["builder", "coder", "runner"]
|
|
534
|
-
elif self.prefs.app['defaultView'] == "last":
|
|
535
|
-
if self.prefs.appData['lastFrame'] == "both" or not self.prefs.appData['lastFrame']:
|
|
536
|
-
self.prefs.appData['lastFrame'] = "builder-coder-runner"
|
|
537
|
-
startView = self.prefs.appData['lastFrame'].split("-")
|
|
538
|
-
elif self.prefs.app['defaultView'] in ["builder", "coder", "runner"]:
|
|
539
|
-
startView = self.prefs.app['defaultView']
|
|
540
532
|
|
|
541
|
-
|
|
542
|
-
|
|
533
|
+
# show frames
|
|
534
|
+
if splash:
|
|
535
|
+
splash.SetText(_translate("Creating frames..."))
|
|
543
536
|
|
|
544
537
|
# if specified as a single string, convert to list
|
|
545
538
|
if isinstance(startView, str):
|
|
546
539
|
startView = [startView]
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
if arg.endswith(".psyexp"):
|
|
551
|
-
exps.append(arg)
|
|
552
|
-
if arg.endswith(".py"):
|
|
553
|
-
if arg.endswith("psychopyApp.py"):
|
|
554
|
-
# this is called erroneously when starting standalone app
|
|
555
|
-
continue
|
|
556
|
-
else:
|
|
557
|
-
scripts.append(arg)
|
|
558
|
-
if "runner" not in startView and arg.endswith(".psyrun"):
|
|
559
|
-
runlist.append(arg)
|
|
560
|
-
|
|
561
|
-
# show frames according to files
|
|
562
|
-
if exps and "builder" not in startView:
|
|
563
|
-
startView.append("builder")
|
|
564
|
-
if scripts and "coder" not in startView:
|
|
565
|
-
startView.append("coder")
|
|
566
|
-
if runlist and "runner" not in startView:
|
|
567
|
-
startView.append("runner")
|
|
568
|
-
|
|
540
|
+
# if last open frame was no frame, use all instead
|
|
541
|
+
if not startView:
|
|
542
|
+
startView = ["builder", "coder", "runner"]
|
|
569
543
|
# create windows
|
|
570
544
|
if "runner" in startView:
|
|
571
|
-
|
|
572
|
-
try:
|
|
573
|
-
self.showRunner(fileList=runlist)
|
|
574
|
-
except Exception as err:
|
|
575
|
-
# if Runner failed with file, try without
|
|
576
|
-
self.showRunner()
|
|
577
|
-
# log error
|
|
578
|
-
logging.error(_translate(
|
|
579
|
-
"Failed to open Runner with requested file list, opening without file list.\n"
|
|
580
|
-
"Requested: {}\n"
|
|
581
|
-
"Err: {}"
|
|
582
|
-
).format(runlist, err))
|
|
583
|
-
logging.debug(
|
|
584
|
-
"\n".join(traceback.format_exception(err))
|
|
585
|
-
)
|
|
586
|
-
|
|
545
|
+
self.showRunner()
|
|
587
546
|
if "coder" in startView:
|
|
588
|
-
|
|
547
|
+
self.showCoder()
|
|
548
|
+
if "builder" in startView:
|
|
549
|
+
self.showBuilder()
|
|
550
|
+
# # if told to directly run stuff, do it now
|
|
551
|
+
# if "direct" in startView:
|
|
552
|
+
# self.showRunner()
|
|
553
|
+
# for exp in [file for file in sys.argv if file.endswith('.psyexp') or file.endswith('.py')]:
|
|
554
|
+
# self.runner.panel.runFile(exp)
|
|
555
|
+
|
|
556
|
+
# load starting files
|
|
557
|
+
if splash:
|
|
558
|
+
splash.SetText(_translate("Loading requested files..."))
|
|
559
|
+
# get starting files
|
|
560
|
+
if startFiles is None:
|
|
561
|
+
startFiles = []
|
|
562
|
+
# get last coder files
|
|
563
|
+
if self.prefs.coder['reloadPrevFiles']:
|
|
564
|
+
for thisFile in self.prefs.appData['coder']['prevFiles']:
|
|
565
|
+
startFiles.append(thisFile)
|
|
566
|
+
# get last builder files
|
|
567
|
+
if self.prefs.builder['reloadPrevExp'] and ('prevFiles' in self.prefs.appData['builder']):
|
|
568
|
+
for thisFile in self.prefs.appData['builder']['prevFiles']:
|
|
569
|
+
startFiles.append(thisFile)
|
|
570
|
+
# open start files
|
|
571
|
+
for thisFile in startFiles:
|
|
572
|
+
# convert to file object & skip any which aren't paths
|
|
589
573
|
try:
|
|
590
|
-
|
|
591
|
-
except
|
|
592
|
-
|
|
574
|
+
thisFile = Path(thisFile)
|
|
575
|
+
except:
|
|
576
|
+
continue
|
|
577
|
+
# skip nonexistent files
|
|
578
|
+
if not thisFile.is_file():
|
|
593
579
|
logging.error(_translate(
|
|
594
|
-
"Failed to open
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
).format(scripts, err))
|
|
598
|
-
logging.debug(
|
|
599
|
-
"\n".join(traceback.format_exception(err))
|
|
600
|
-
)
|
|
601
|
-
self.showCoder()
|
|
602
|
-
|
|
603
|
-
if "builder" in startView:
|
|
604
|
-
# open Builder if requested
|
|
580
|
+
"Failed to open {}, file does not exist."
|
|
581
|
+
).format(thisFile))
|
|
582
|
+
continue
|
|
605
583
|
try:
|
|
606
|
-
|
|
584
|
+
# choose frame based on extension
|
|
585
|
+
if "builder" in startView and thisFile.suffix == ".psyexp":
|
|
586
|
+
# open .psyexp in Builder
|
|
587
|
+
builder = self.showBuilder()
|
|
588
|
+
if builder.fileExists:
|
|
589
|
+
# if current builder file is a real file, open in new frame
|
|
590
|
+
self.newBuilderFrame(fileName=str(thisFile))
|
|
591
|
+
else:
|
|
592
|
+
# otherwise, open in current
|
|
593
|
+
builder.fileOpen(filename=thisFile)
|
|
594
|
+
elif "runner" in startView and thisFile.suffix == ".psyrun":
|
|
595
|
+
# open .psyrun in Runner
|
|
596
|
+
runner = self.showRunner()
|
|
597
|
+
runner.fileOpen(filename=str(thisFile))
|
|
598
|
+
elif "coder" in startView and thisFile.suffix not in (".psyexp", ".psyrun"):
|
|
599
|
+
# open anything else in Coder
|
|
600
|
+
coder = self.showCoder()
|
|
601
|
+
coder.fileOpen(filename=str(thisFile))
|
|
607
602
|
except Exception as err:
|
|
608
|
-
# if Builder failed with file, try without
|
|
609
|
-
self.showBuilder()
|
|
610
|
-
# log error
|
|
611
603
|
logging.error(_translate(
|
|
612
|
-
"Failed to open
|
|
613
|
-
|
|
614
|
-
"Err: {}"
|
|
615
|
-
).format(exps, err))
|
|
616
|
-
|
|
617
|
-
if "direct" in startView:
|
|
618
|
-
self.showRunner()
|
|
619
|
-
for exp in [file for file in sys.argv if file.endswith('.psyexp') or file.endswith('.py')]:
|
|
620
|
-
self.runner.panel.runFile(exp)
|
|
604
|
+
"Failed to open file {}, reason: {}"
|
|
605
|
+
).format(thisFile, err))
|
|
621
606
|
|
|
622
607
|
# if we started a busy cursor which never finished, finish it now
|
|
623
608
|
if wx.IsBusy():
|
|
@@ -855,6 +840,8 @@ class PsychoPyApp(wx.App, handlers.ThemeMixin):
|
|
|
855
840
|
self.SetTopWindow(self.coder)
|
|
856
841
|
self.coder.Raise()
|
|
857
842
|
|
|
843
|
+
return self.coder
|
|
844
|
+
|
|
858
845
|
def newBuilderFrame(self, event=None, fileName=None):
|
|
859
846
|
# have to reimport because it is only local to __init__ so far
|
|
860
847
|
wx.BeginBusyCursor()
|
|
@@ -868,6 +855,7 @@ class PsychoPyApp(wx.App, handlers.ThemeMixin):
|
|
|
868
855
|
self.SetTopWindow(self.builder)
|
|
869
856
|
self.updateWindowMenu()
|
|
870
857
|
wx.EndBusyCursor()
|
|
858
|
+
|
|
871
859
|
return self.builder
|
|
872
860
|
|
|
873
861
|
def showBuilder(self, event=None, fileList=()):
|
|
@@ -880,12 +868,31 @@ class PsychoPyApp(wx.App, handlers.ThemeMixin):
|
|
|
880
868
|
if len(self.getAllFrames(frameType="builder")) == 0:
|
|
881
869
|
self.newBuilderFrame()
|
|
882
870
|
# loop through all frames, from the back bringing each forward
|
|
871
|
+
thisFrame = None
|
|
883
872
|
for thisFrame in self.getAllFrames(frameType='builder'):
|
|
884
873
|
thisFrame.Show(True)
|
|
885
874
|
thisFrame.Raise()
|
|
875
|
+
self.builder = thisFrame
|
|
886
876
|
self.SetTopWindow(thisFrame)
|
|
877
|
+
|
|
878
|
+
return self.builder
|
|
887
879
|
|
|
888
880
|
def showRunner(self, event=None, fileList=[]):
|
|
881
|
+
"""
|
|
882
|
+
Show the Runner window, if not shown already.
|
|
883
|
+
|
|
884
|
+
Parameters
|
|
885
|
+
----------
|
|
886
|
+
event : wx.Event, optional
|
|
887
|
+
wx event, if called by a UI element, by default None
|
|
888
|
+
fileList : list[str or pathlib.Path], optional
|
|
889
|
+
List of files to open Runner with, by default []
|
|
890
|
+
|
|
891
|
+
Returns
|
|
892
|
+
-------
|
|
893
|
+
psychopy.app.runner.RunnerFrame
|
|
894
|
+
Current Runner frame
|
|
895
|
+
"""
|
|
889
896
|
if not self.runner:
|
|
890
897
|
self.runner = self.newRunnerFrame()
|
|
891
898
|
if not self.testMode:
|
|
@@ -895,6 +902,8 @@ class PsychoPyApp(wx.App, handlers.ThemeMixin):
|
|
|
895
902
|
# Runner captures standard streams until program closed
|
|
896
903
|
# if self.runner and not self.testMode:
|
|
897
904
|
# sys.stderr = sys.stdout = self.stdStreamDispatcher
|
|
905
|
+
|
|
906
|
+
return self.runner
|
|
898
907
|
|
|
899
908
|
def newRunnerFrame(self, event=None):
|
|
900
909
|
# have to reimport because it is only local to __init__ so far
|
|
@@ -1090,7 +1099,7 @@ class PsychoPyApp(wx.App, handlers.ThemeMixin):
|
|
|
1090
1099
|
info.SetVersion('v' + psychopy.__version__)
|
|
1091
1100
|
info.SetDescription(msg)
|
|
1092
1101
|
|
|
1093
|
-
info.SetCopyright('(C) 2002-2018 Jonathan Peirce (C) 2019-
|
|
1102
|
+
info.SetCopyright('(C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd.')
|
|
1094
1103
|
info.SetWebSite('https://www.psychopy.org')
|
|
1095
1104
|
info.SetLicence(license)
|
|
1096
1105
|
# developers
|
psychopy/app/builder/builder.py
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"""
|
|
5
5
|
Defines the behavior of Psychopy's Builder view window
|
|
6
6
|
Part of the PsychoPy library
|
|
7
|
-
Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-
|
|
7
|
+
Copyright (C) 2002-2018 Jonathan Peirce (C) 2019-2025 Open Science Tools Ltd.
|
|
8
8
|
Distributed under the terms of the GNU General Public License (GPL).
|
|
9
9
|
"""
|
|
10
10
|
import collections
|
|
@@ -76,9 +76,7 @@ from psychopy.scripts.psyexpCompile import generateScript
|
|
|
76
76
|
|
|
77
77
|
# Components which are always hidden
|
|
78
78
|
alwaysHidden = [
|
|
79
|
-
'
|
|
80
|
-
'UnknownStandaloneRoutine', 'UnknownPluginComponent', 'BaseComponent', 'BaseStandaloneRoutine',
|
|
81
|
-
'BaseValidatorRoutine'
|
|
79
|
+
'BaseComponent', 'BaseStandaloneRoutine', 'BaseValidatorRoutine'
|
|
82
80
|
]
|
|
83
81
|
|
|
84
82
|
|
|
@@ -314,7 +312,7 @@ class BuilderFrame(BaseAuiFrame, handlers.ThemeMixin):
|
|
|
314
312
|
_translate("Save &as...\t%s") % keys['saveAs'],
|
|
315
313
|
_translate("Save current experiment file as..."))
|
|
316
314
|
# export html
|
|
317
|
-
self.menuIDs.ID_EXPORT_HTML = wx.
|
|
315
|
+
self.menuIDs.ID_EXPORT_HTML = wx.NewIdRef(count=1)
|
|
318
316
|
menu.Append(
|
|
319
317
|
self.menuIDs.ID_EXPORT_HTML,
|
|
320
318
|
_translate("Export HTML...\t%s") % keys['exportHTML'],
|
|
@@ -322,10 +320,10 @@ class BuilderFrame(BaseAuiFrame, handlers.ThemeMixin):
|
|
|
322
320
|
)
|
|
323
321
|
self.Bind(wx.EVT_MENU, self.fileExport, id=self.menuIDs.ID_EXPORT_HTML)
|
|
324
322
|
# reveal folder
|
|
325
|
-
self.menuIDs.ID_REVEAL = wx.
|
|
323
|
+
self.menuIDs.ID_REVEAL = wx.NewIdRef(count=1)
|
|
326
324
|
menu.Append(
|
|
327
325
|
self.menuIDs.ID_REVEAL,
|
|
328
|
-
_translate("Reveal in file explorer
|
|
326
|
+
_translate("Reveal in file explorer...\t%s") % keys['revealFolder'],
|
|
329
327
|
_translate("Open the folder containing this experiment in your system's file explorer")
|
|
330
328
|
)
|
|
331
329
|
self.Bind(wx.EVT_MENU, self.fileReveal, id=self.menuIDs.ID_REVEAL)
|
|
@@ -348,7 +346,7 @@ class BuilderFrame(BaseAuiFrame, handlers.ThemeMixin):
|
|
|
348
346
|
wx.ID_ANY, _translate("Reset preferences...")
|
|
349
347
|
)
|
|
350
348
|
self.Bind(wx.EVT_MENU, self.resetPrefs, item)
|
|
351
|
-
# item = menu.Append(wx.
|
|
349
|
+
# item = menu.Append(wx.NewIdRef(count=1), "Plug&ins")
|
|
352
350
|
# self.Bind(wx.EVT_MENU, self.pluginManager, item)
|
|
353
351
|
self.fileMenu.AppendSeparator()
|
|
354
352
|
self.fileMenu.Append(wx.ID_EXIT,
|
|
@@ -373,6 +371,13 @@ class BuilderFrame(BaseAuiFrame, handlers.ThemeMixin):
|
|
|
373
371
|
menu.Append(wx.ID_PASTE, _translate("&Paste\t%s") % keys['paste'])
|
|
374
372
|
self.Bind(wx.EVT_MENU, self.paste, id=wx.ID_PASTE)
|
|
375
373
|
|
|
374
|
+
item = menu.Append(
|
|
375
|
+
wx.ID_ANY,
|
|
376
|
+
_translate("&Find in experiment...\t%s") % keys['builderFind'],
|
|
377
|
+
_translate("Search the whole experiment for a specific term")
|
|
378
|
+
)
|
|
379
|
+
self.Bind(wx.EVT_MENU, self.onFindInExperiment, item)
|
|
380
|
+
|
|
376
381
|
# ---_view---#000000#FFFFFF-------------------------------------------
|
|
377
382
|
self.viewMenu = wx.Menu()
|
|
378
383
|
menuBar.Append(self.viewMenu, _translate('&View'))
|
|
@@ -465,6 +470,13 @@ class BuilderFrame(BaseAuiFrame, handlers.ThemeMixin):
|
|
|
465
470
|
self.expMenu = wx.Menu()
|
|
466
471
|
menuBar.Append(self.expMenu, _translate('E&xperiment'))
|
|
467
472
|
menu = self.expMenu
|
|
473
|
+
|
|
474
|
+
item = menu.Append(wx.ID_ANY,
|
|
475
|
+
_translate("Experiment &Settings\t%s") % keys['expSettings'],
|
|
476
|
+
_translate("Edit experiment settings"))
|
|
477
|
+
self.Bind(wx.EVT_MENU, self.setExperimentSettings, item)
|
|
478
|
+
menu.AppendSeparator()
|
|
479
|
+
|
|
468
480
|
item = menu.Append(wx.ID_ANY,
|
|
469
481
|
_translate("&New Routine\t%s") % keys['newRoutine'],
|
|
470
482
|
_translate("Create a new routine (e.g. the trial "
|
|
@@ -511,11 +523,6 @@ class BuilderFrame(BaseAuiFrame, handlers.ThemeMixin):
|
|
|
511
523
|
self.Bind(wx.EVT_MENU, self.flowPanel.canvas.insertLoop, item)
|
|
512
524
|
menu.AppendSeparator()
|
|
513
525
|
|
|
514
|
-
item = menu.Append(wx.ID_ANY,
|
|
515
|
-
_translate("&Find in experiment...\t%s") % keys['builderFind'],
|
|
516
|
-
_translate("Search the whole experiment for a specific term"))
|
|
517
|
-
self.Bind(wx.EVT_MENU, self.onFindInExperiment, item)
|
|
518
|
-
|
|
519
526
|
item = menu.Append(wx.ID_ANY,
|
|
520
527
|
_translate("README..."),
|
|
521
528
|
_translate("Add or edit the text shown when your experiment is opened"))
|
|
@@ -1030,10 +1037,8 @@ class BuilderFrame(BaseAuiFrame, handlers.ThemeMixin):
|
|
|
1030
1037
|
ok = self.checkSave()
|
|
1031
1038
|
if not ok:
|
|
1032
1039
|
return False # user cancelled
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
else:
|
|
1036
|
-
frameData = dict(self.appData['defaultFrame'])
|
|
1040
|
+
frameData = self.appData['defaultFrame']
|
|
1041
|
+
if self.fileExists:
|
|
1037
1042
|
self.appData['prevFiles'].append(self.filename)
|
|
1038
1043
|
|
|
1039
1044
|
# get size and window layout info
|
|
@@ -1065,7 +1070,11 @@ class BuilderFrame(BaseAuiFrame, handlers.ThemeMixin):
|
|
|
1065
1070
|
self.appData['fileHistory'] = copy.copy(tmp[-fhMax:])
|
|
1066
1071
|
|
|
1067
1072
|
# assign the data to this filename
|
|
1068
|
-
|
|
1073
|
+
if (
|
|
1074
|
+
str(self.filename) not in self.appData['frames']
|
|
1075
|
+
and str(self.filename) not in self.appData
|
|
1076
|
+
):
|
|
1077
|
+
self.appData['frames'][str(self.filename)] = frameData
|
|
1069
1078
|
# save the display data only for those frames in the history:
|
|
1070
1079
|
tmp2 = {}
|
|
1071
1080
|
for f in self.appData['frames']:
|
|
@@ -1564,8 +1573,8 @@ class BuilderFrame(BaseAuiFrame, handlers.ThemeMixin):
|
|
|
1564
1573
|
def openPluginManager(self, evt=None):
|
|
1565
1574
|
dlg = psychopy.app.plugin_manager.dialog.EnvironmentManagerDlg(self)
|
|
1566
1575
|
dlg.Show()
|
|
1567
|
-
|
|
1568
|
-
dlg
|
|
1576
|
+
|
|
1577
|
+
return dlg
|
|
1569
1578
|
|
|
1570
1579
|
def onPavloviaCreate(self, evt=None):
|
|
1571
1580
|
if Path(self.filename).is_file():
|
|
@@ -2496,6 +2505,8 @@ class RoutineCanvas(wx.ScrolledWindow, handlers.ThemeMixin):
|
|
|
2496
2505
|
maxDur, useMax = self.routine.settings.getDuration()
|
|
2497
2506
|
overspill = 0
|
|
2498
2507
|
if useMax:
|
|
2508
|
+
if maxDur is None:
|
|
2509
|
+
maxDur = duration
|
|
2499
2510
|
overspill = max(duration - maxDur, 0)
|
|
2500
2511
|
duration = min(maxDur, duration)
|
|
2501
2512
|
# If there's a fixed end time and no start time, start 20px before 0
|
|
@@ -3247,6 +3258,9 @@ class ComponentsPanel(scrolledpanel.ScrolledPanel, handlers.ThemeMixin):
|
|
|
3247
3258
|
# Check whether button is hidden by prefs
|
|
3248
3259
|
if name in prefs.builder['hiddenComponents'] + alwaysHidden:
|
|
3249
3260
|
shown = False
|
|
3261
|
+
# check whether comp/rt indicates itsef as hidden
|
|
3262
|
+
if emt.hidden:
|
|
3263
|
+
shown = False
|
|
3250
3264
|
# Check whether button refers to a future comp/rt
|
|
3251
3265
|
if hasattr(emt, "version"):
|
|
3252
3266
|
ver = parseVersionSafely(emt.version)
|
|
@@ -4215,7 +4229,7 @@ class FlowCanvas(wx.ScrolledWindow, handlers.ThemeMixin):
|
|
|
4215
4229
|
|
|
4216
4230
|
def drawLineStart(self, dc, pos):
|
|
4217
4231
|
# draw bar at start of timeline; circle looked bad, offset vertically
|
|
4218
|
-
tmpId = wx.
|
|
4232
|
+
tmpId = wx.NewIdRef(count=1)
|
|
4219
4233
|
dc.SetId(tmpId)
|
|
4220
4234
|
ptSize = (9, 9, 12)[self.appData['flowSize']]
|
|
4221
4235
|
thic = (1, 1, 2)[self.appData['flowSize']]
|
|
@@ -4229,7 +4243,7 @@ class FlowCanvas(wx.ScrolledWindow, handlers.ThemeMixin):
|
|
|
4229
4243
|
|
|
4230
4244
|
def drawLineEnd(self, dc, pos):
|
|
4231
4245
|
# draws arrow at end of timeline
|
|
4232
|
-
tmpId = wx.
|
|
4246
|
+
tmpId = wx.NewIdRef(count=1)
|
|
4233
4247
|
dc.SetId(tmpId)
|
|
4234
4248
|
dc.SetBrush(wx.Brush(colors.app['fl_flowline_bg']))
|
|
4235
4249
|
dc.SetPen(wx.Pen(colors.app['fl_flowline_bg']))
|
|
@@ -4512,6 +4526,12 @@ class BuilderRibbon(ribbon.FrameRibbon):
|
|
|
4512
4526
|
tooltip=_translate("Redo last action"),
|
|
4513
4527
|
callback=parent.redo
|
|
4514
4528
|
)
|
|
4529
|
+
# find
|
|
4530
|
+
self.addButton(
|
|
4531
|
+
section="edit", name="find", label=_translate("Find"), icon="find",
|
|
4532
|
+
tooltip=_translate("Search the whole experiment for a specific term"),
|
|
4533
|
+
callback=parent.onFindInExperiment
|
|
4534
|
+
)
|
|
4515
4535
|
|
|
4516
4536
|
self.addSeparator()
|
|
4517
4537
|
|