scipion-pyworkflow 3.4.0__tar.gz → 3.5.0__tar.gz
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.
- {scipion-pyworkflow-3.4.0/scipion_pyworkflow.egg-info → scipion-pyworkflow-3.5.0}/PKG-INFO +1 -1
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/apps/pw_project.py +3 -8
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/config.py +62 -8
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/constants.py +3 -1
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/browser.py +3 -11
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/canvas.py +1 -1
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/dialog.py +22 -10
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/form.py +1 -1
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/gui.py +36 -13
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/project/base.py +1 -1
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/project/project.py +0 -10
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/project/searchrun.py +19 -12
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/project/viewdata.py +1 -34
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/project/viewprotocols.py +34 -104
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/project/viewprotocols_extra.py +1 -1
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/tree.py +2 -2
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/widgets.py +1 -1
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/object.py +37 -11
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/plugin.py +9 -9
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/project/__init__.py +1 -1
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/project/config.py +0 -15
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/project/project.py +18 -6
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/protocol/executor.py +12 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/protocol/launch.py +32 -25
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/protocol/protocol.py +29 -5
- scipion-pyworkflow-3.5.0/pyworkflow/resources/sprites.png +0 -0
- scipion-pyworkflow-3.5.0/pyworkflow/resources/sprites.xcf +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/template.py +1 -1
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/utils/log.py +2 -2
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/utils/path.py +28 -2
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/utils/properties.py +164 -99
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/utils/utils.py +10 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/viewer.py +7 -1
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/tests/test_object.py +8 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/tests/test_utils.py +74 -4
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0/scipion_pyworkflow.egg-info}/PKG-INFO +1 -1
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/scipion_pyworkflow.egg-info/SOURCES.txt +2 -86
- scipion-pyworkflow-3.4.0/pyworkflow/resources/backward-solid.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/beta.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/binoculares.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/bookmark.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/broom-solid.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/class_obj.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/clipboard-regular.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/code-branch-solid.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/debug.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-arrow-down.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-arrow-left.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-arrow-up.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-ban.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-bars.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-check.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-checked.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-cog.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-cogs.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-database.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-delete-operation.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-download.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-external-link.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-eye.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-failure.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-file-o.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-files-o.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-folder-open.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-home.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-install.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-installed.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-lightbulb-o.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-list-ul.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-magic.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-minus-square.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-next.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-pencil.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-play-circle-o.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-plus-square.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-previous.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-processing.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-question-circle.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-refresh.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-rocket.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-save.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-sign-in.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-sign-out.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-sitemap.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-stop-workflow.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-stop.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-tags.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-times.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-to_install.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-trash-o.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-unchecked.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-undo.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-uninstall.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-update.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-upload.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/file.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/file_folder.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/file_folder_link.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/file_generic.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/file_generic_link.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/file_image.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/file_image_link.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/file_java.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/file_log.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/file_md.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/file_md_link.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/file_python.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/file_sqlite.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/file_stack.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/file_stack_link.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/file_text.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/new.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/no-image.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/paste-solid.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/power-off-solid.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/production.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/prot_disabled.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/question.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/rename.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/root.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/updated.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/users.png +0 -0
- scipion-pyworkflow-3.4.0/pyworkflow/resources/workflow.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/LICENSE.txt +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/MANIFEST.in +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/README.rst +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/__init__.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/apps/__init__.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/apps/pw_manager.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/apps/pw_plot.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/apps/pw_protocol_list.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/apps/pw_protocol_run.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/apps/pw_run_tests.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/apps/pw_schedule_run.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/apps/pw_sleep.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/apps/pw_sync_data.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/apps/pw_viewer.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/exceptions.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/__init__.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/graph.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/graph_layout.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/matplotlib_image.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/plotter.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/project/__init__.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/project/constants.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/project/labels.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/project/searchprotocol.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/project/steps.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/project/utils.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/project/viewprojects.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/text.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/tooltip.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/mapper/__init__.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/mapper/mapper.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/mapper/sqlite.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/mapper/sqlite_db.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/mapper/xmlmapper.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/project/manager.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/project/scripts/clean_projects.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/project/scripts/config.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/project/scripts/create.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/project/scripts/edit_workflow.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/project/scripts/fix_links.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/project/scripts/load.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/project/scripts/refresh.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/project/scripts/schedule.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/project/scripts/stack2volume.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/project/scripts/stop.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/protocol/__init__.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/protocol/bibtex.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/protocol/constants.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/protocol/hosts.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/protocol/package.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/protocol/params.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/Imagej.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/chimera.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/fa-exclamation-triangle_alert.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/fa-info-circle_alert.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/fa-search.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/fa-times-circle_alert.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/file_vol.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/loading.gif +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/no-image128.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/scipion_bn.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/scipion_icon.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/scipion_icon.svg +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/scipion_icon_proj.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/scipion_icon_projs.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/scipion_icon_prot.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/scipion_logo.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/scipion_logo_normal.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/scipion_logo_small.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/arrowDown.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/arrowUp.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/background_section.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/colRowModeOff.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/colRowModeOn.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/delete.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/doc_icon.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/download_icon.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/enabled_gallery.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/galleryViewOff.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/galleryViewOn.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/goto.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/menu.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/separator.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/tableViewOff.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/tableViewOn.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/volumeOff.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/volumeOn.png +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/wait.gif +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/tests/__init__.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/tests/test_utils.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/tests/tests.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/utils/__init__.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/utils/dataset.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/utils/echo.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/utils/graph.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/utils/process.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/utils/profiler.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/utils/progressbar.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/utils/reflection.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/utils/which.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/webservices/__init__.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/webservices/config.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/webservices/notifier.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/webservices/repository.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/wizard.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/__init__.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/bibtex.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/objects.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/protocols.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/tests/__init__.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/tests/test_canvas.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/tests/test_domain.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/tests/test_logs.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/tests/test_mappers.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/tests/test_project.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/tests/test_protocol_execution.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/tests/test_protocol_export.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/tests/test_protocol_output.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/tests/test_streaming.py +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/requirements.txt +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/scipion_pyworkflow.egg-info/dependency_links.txt +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/scipion_pyworkflow.egg-info/entry_points.txt +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/scipion_pyworkflow.egg-info/requires.txt +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/scipion_pyworkflow.egg-info/top_level.txt +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/setup.cfg +0 -0
- {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/setup.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: scipion-pyworkflow
|
3
|
-
Version: 3.
|
3
|
+
Version: 3.5.0
|
4
4
|
Summary: Simple workflow platform used in scientific applications, initially developed within the Scipion framework for image processing in Electron Microscopy.
|
5
5
|
Home-page: https://github.com/scipion-em/scipion-pyworkflow
|
6
6
|
Author: J.M. De la Rosa Trevin, Roberto Marabini, Grigory Sharov, Josue Gomez Blanco, Pablo Conesa, Yunior Fonseca Reyna
|
@@ -36,19 +36,14 @@ from pyworkflow.project import Manager
|
|
36
36
|
from pyworkflow.gui.project import ProjectWindow
|
37
37
|
import pyworkflow.utils as pwutils
|
38
38
|
|
39
|
-
import logging
|
40
|
-
|
41
39
|
HERE = 'here'
|
42
|
-
|
43
40
|
LAST = 'last'
|
44
|
-
|
45
41
|
LIST = 'list'
|
46
|
-
logger = logging.getLogger(__name__)
|
47
42
|
|
48
43
|
def openProject(projectName):
|
49
44
|
""" Opens a scipion project:
|
50
45
|
|
51
|
-
:param projectName: Name of
|
46
|
+
:param projectName: Name of an existing project to open,
|
52
47
|
or "here" to create a project in the current working dir,
|
53
48
|
or "last" to open the most recent project
|
54
49
|
|
@@ -97,7 +92,7 @@ def openProject(projectName):
|
|
97
92
|
projWindow = ProjectWindow(projPath)
|
98
93
|
projWindow.show()
|
99
94
|
else:
|
100
|
-
|
95
|
+
print("Can't open project %s. It does not exist" % projPath)
|
101
96
|
|
102
97
|
#Show the list of projects
|
103
98
|
showProjectList(manager)
|
@@ -115,4 +110,4 @@ if __name__ == '__main__':
|
|
115
110
|
if len(sys.argv) > 1:
|
116
111
|
openProject(sys.argv[1])
|
117
112
|
else:
|
118
|
-
|
113
|
+
print("usage: pw_project.py PROJECT_NAME or %s or %s or %s" % (HERE, LAST, LIST))
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
import enum
|
2
2
|
import logging
|
3
3
|
logger = logging.getLogger(__file__)
|
4
4
|
import ast
|
@@ -20,12 +20,15 @@ def join(*paths):
|
|
20
20
|
return os.path.join(HOME, *paths)
|
21
21
|
|
22
22
|
|
23
|
-
__resourcesPath =
|
23
|
+
__resourcesPath = join('resources')
|
24
|
+
|
25
|
+
def getResourcesPath(file=None):
|
24
26
|
|
27
|
+
return __resourcesPath if file is None else os.path.join(__resourcesPath, file)
|
25
28
|
|
26
29
|
def findResource(filename):
|
27
30
|
from .utils.path import findFile
|
28
|
-
return findFile(filename, *__resourcesPath)
|
31
|
+
return findFile(filename, *[__resourcesPath])
|
29
32
|
|
30
33
|
|
31
34
|
def genNotesHeading():
|
@@ -62,6 +65,49 @@ def getModuleFolder(moduleName):
|
|
62
65
|
spec = importlib.util.find_spec(moduleName)
|
63
66
|
return os.path.dirname(spec.origin)
|
64
67
|
|
68
|
+
class VarTypes(enum.Enum):
|
69
|
+
STRING = 1
|
70
|
+
INTEGER = 2
|
71
|
+
BOOLEAN = 3
|
72
|
+
PATH = 4
|
73
|
+
|
74
|
+
class Variable(object):
|
75
|
+
""" Class for variables of the Config class."""
|
76
|
+
def __init__(self, value, varType:VarTypes=VarTypes.STRING):
|
77
|
+
"""
|
78
|
+
:param value: Value of the variable
|
79
|
+
:param type: Type of the variable"""
|
80
|
+
super().__init__()
|
81
|
+
self.value = value
|
82
|
+
self.varType = varType
|
83
|
+
def __bool__(self):
|
84
|
+
return bool(self.value)
|
85
|
+
|
86
|
+
def __int__(self):
|
87
|
+
return int(self.value)
|
88
|
+
def __str__(self):
|
89
|
+
return str(self.value)
|
90
|
+
|
91
|
+
def __eq__(self, other):
|
92
|
+
return other == self.value
|
93
|
+
|
94
|
+
def __repr__(self):
|
95
|
+
return self.__str__()
|
96
|
+
|
97
|
+
def __fspath__(self):
|
98
|
+
return self.__str__()
|
99
|
+
|
100
|
+
" We migth need to imlement more like this--> https://docs.python.org/3.3/reference/datamodel.html#object.__truediv__"
|
101
|
+
def __truediv__(self, other):
|
102
|
+
return float(self.value)/other
|
103
|
+
|
104
|
+
def __rtruediv__(self, other):
|
105
|
+
return other / float(self.value)
|
106
|
+
|
107
|
+
def __add__(self, other):
|
108
|
+
return self.value+other
|
109
|
+
def __radd__(self, other):
|
110
|
+
return other+self.value
|
65
111
|
|
66
112
|
class Config:
|
67
113
|
""" Main Config for pyworkflow. It contains the main Scipion configuration variables
|
@@ -104,7 +150,7 @@ class Config:
|
|
104
150
|
SCIPION_HOME_DEFINED = _get(SCIPION_HOME_VAR, False)
|
105
151
|
"False if SCIPION_HOME is not found in the environment"
|
106
152
|
|
107
|
-
_root = Root(SCIPION_HOME)
|
153
|
+
_root = Root(str(SCIPION_HOME))
|
108
154
|
_join = _root.join
|
109
155
|
|
110
156
|
# Internal cached variables, use __ so they are not returned in getVars
|
@@ -157,8 +203,6 @@ class Config:
|
|
157
203
|
|
158
204
|
SCIPION_SUPPORT_EMAIL = _get('SCIPION_SUPPORT_EMAIL', 'scipion@cnb.csic.es')
|
159
205
|
|
160
|
-
SCIPION_LOGO = _get('SCIPION_LOGO', 'scipion_logo.gif')
|
161
|
-
|
162
206
|
# Config variables
|
163
207
|
SCIPION_CONFIG = _get('SCIPION_CONFIG', 'scipion.conf')
|
164
208
|
"Path to the scipion configuration file where all this variables could be defined."
|
@@ -209,6 +253,15 @@ class Config:
|
|
209
253
|
WIZARD_MASK_COLOR = _get('WIZARD_MASK_COLOR', '[0.125, 0.909, 0.972]')
|
210
254
|
"Color to use in some wizards."
|
211
255
|
|
256
|
+
SCIPION_SPRITES_FILE = _get('SCIPION_SPRITES_FILE', _join(getResourcesPath(),'sprites.png'))
|
257
|
+
"File (png) with the icons in a collage. Default is found at pyworkflow/resources/sprites.png. And a GIMP file could be found at the same folder in the github repo."
|
258
|
+
|
259
|
+
SCIPION_SHOW_TEXT_IN_TOOLBAR = _get('SCIPION_SHOW_TEXT_IN_TOOLBAR', TRUE_STR) == TRUE_STR
|
260
|
+
"Define it to anything else except False to show the label of the icons. It will take more space."
|
261
|
+
|
262
|
+
SCIPION_ICON_ZOOM = int(_get('SCIPION_ICON_ZOOM', 50))
|
263
|
+
"Define it to anything else except False to show the label of the icons. It will take more space."
|
264
|
+
|
212
265
|
# Notification
|
213
266
|
SCIPION_NOTIFY = _get('SCIPION_NOTIFY', TRUE_STR) == TRUE_STR
|
214
267
|
"If set to False, Scipion developers will know almost nothing about Scipion usage and will have less information to improve it."
|
@@ -306,7 +359,7 @@ class Config:
|
|
306
359
|
for name, value in vars(baseCls).items():
|
307
360
|
# Skip methods and internal attributes starting with __
|
308
361
|
# (e.g __doc__, __module__, etc)
|
309
|
-
if
|
362
|
+
if isinstance(value, (str, int, Variable)) and not name.startswith('__'):
|
310
363
|
configVars[name] = str(value)
|
311
364
|
return configVars
|
312
365
|
|
@@ -360,7 +413,8 @@ class Config:
|
|
360
413
|
|
361
414
|
@staticmethod
|
362
415
|
def debugSQLOn():
|
363
|
-
|
416
|
+
from .utils import envVarOn
|
417
|
+
return bool(envVarOn(SCIPION_DEBUG_SQLITE))
|
364
418
|
|
365
419
|
@staticmethod
|
366
420
|
def toggleDebugSQL():
|
@@ -42,7 +42,7 @@ VERSION_1 = '1.0.0'
|
|
42
42
|
VERSION_1_1 = '1.1.0'
|
43
43
|
VERSION_1_2 = '1.2.0'
|
44
44
|
VERSION_2_0 = '2.0.0'
|
45
|
-
VERSION_3_0 = '3.
|
45
|
+
VERSION_3_0 = '3.5.0'
|
46
46
|
|
47
47
|
# For a new release, define a new constant and assign it to LAST_VERSION
|
48
48
|
# The existing one has to be added to OLD_VERSIONS list.
|
@@ -200,6 +200,8 @@ class TK:
|
|
200
200
|
TREEVIEW_CLOSE = '<<TreeviewClose>>'
|
201
201
|
|
202
202
|
|
203
|
+
HELP_DURATION_FORMAT = "Duration format example: 1d 20h 30m 30s --> 1 day 20 hours 30 minutes and 30 seconds"
|
204
|
+
|
203
205
|
# Run protocol modes
|
204
206
|
DEFAULT_EXECUTION_ACTION_ASK = 1
|
205
207
|
DEFAULT_EXECUTION_ACTION_SINGLE = 2
|
@@ -34,6 +34,7 @@ import stat
|
|
34
34
|
import tkinter as tk
|
35
35
|
import time
|
36
36
|
import logging
|
37
|
+
|
37
38
|
logger = logging.getLogger(__name__)
|
38
39
|
|
39
40
|
import pyworkflow.utils as pwutils
|
@@ -124,7 +125,7 @@ class ObjectBrowser(tk.Frame):
|
|
124
125
|
img, desc = self.treeProvider.getObjectPreview(obj)
|
125
126
|
# Update image preview
|
126
127
|
if self.showPreviewTop:
|
127
|
-
if isinstance(img, str):
|
128
|
+
if isinstance(img, (str, pwutils.SpriteImage)):
|
128
129
|
img = self.getImage(img)
|
129
130
|
if img is None:
|
130
131
|
img = self.noImage
|
@@ -716,13 +717,4 @@ class FileBrowserWindow(BrowserWindow):
|
|
716
717
|
'.txt', '.log', '.out', '.err', '.stdout', '.stderr', '.emx',
|
717
718
|
'.json', '.xml', '.pam')
|
718
719
|
register(TextFileHandler(pwutils.Icon.PYTHON_FILE), '.py')
|
719
|
-
register(
|
720
|
-
register(SqlFileHandler(), '.sqlite', '.db')
|
721
|
-
# register(MdFileHandler(), '.xmd', '.star', '.pos', '.ctfparam', '.doc')
|
722
|
-
# register(ParticleFileHandler(),
|
723
|
-
# '.xmp', '.tif', '.tiff', '.spi', '.mrc', '.map', '.raw',
|
724
|
-
# '.inf', '.dm3', '.em', '.pif', '.psd', '.spe', '.ser', '.img',
|
725
|
-
# '.hed', *STANDARD_IMAGE_EXTENSIONS)
|
726
|
-
# register(VolFileHandler(), '.vol')
|
727
|
-
# register(StackHandler(), '.stk', '.mrcs', '.st', '.pif', '.dm4')
|
728
|
-
# register(ChimeraHandler(), '.bild')
|
720
|
+
register(SqlFileHandler(), '.sqlite', '.db')
|
@@ -34,7 +34,7 @@ from tkcolorpicker import askcolor as _askColor
|
|
34
34
|
from pyworkflow import Config
|
35
35
|
from pyworkflow.exceptions import PyworkflowException
|
36
36
|
from pyworkflow.utils import Message, Icon, Color
|
37
|
-
from . import gui, Window, widgets, configureWeigths, LIST_TREEVIEW, defineStyle
|
37
|
+
from . import gui, Window, widgets, configureWeigths, LIST_TREEVIEW, defineStyle, ToolTip
|
38
38
|
from .tree import BoundTree, Tree
|
39
39
|
from .text import Text, TaggedText
|
40
40
|
|
@@ -192,7 +192,8 @@ class Dialog(tk.Toplevel):
|
|
192
192
|
self.result = resultValue
|
193
193
|
noCancel = self.result != RESULT_CANCEL and self.result != RESULT_CLOSE
|
194
194
|
|
195
|
-
if noCancel
|
195
|
+
callBack = self.validate if noCancel else self.validateClose
|
196
|
+
if not callBack():
|
196
197
|
self.initial_focus.focus_set() # put focus back
|
197
198
|
return
|
198
199
|
|
@@ -228,6 +229,9 @@ class Dialog(tk.Toplevel):
|
|
228
229
|
"""
|
229
230
|
return 1 # override
|
230
231
|
|
232
|
+
def validateClose(self):
|
233
|
+
return True
|
234
|
+
|
231
235
|
def apply(self):
|
232
236
|
"""process the data
|
233
237
|
This method is called automatically to process the data, *after*
|
@@ -237,7 +241,7 @@ class Dialog(tk.Toplevel):
|
|
237
241
|
|
238
242
|
def getImage(self, imgName):
|
239
243
|
"""A shortcut to get an image from its name"""
|
240
|
-
return gui.getImage(imgName
|
244
|
+
return gui.getImage(imgName)
|
241
245
|
|
242
246
|
def getResult(self):
|
243
247
|
return self.result
|
@@ -697,11 +701,12 @@ class ToolbarButton:
|
|
697
701
|
Store information about the buttons that will be added to the toolbar.
|
698
702
|
"""
|
699
703
|
|
700
|
-
def __init__(self, text, command, icon=None, tooltip=None):
|
704
|
+
def __init__(self, text, command, icon=None, tooltip=None, shortcut=None):
|
701
705
|
self.text = text
|
702
706
|
self.command = command
|
703
707
|
self.icon = icon
|
704
708
|
self.tooltip = tooltip
|
709
|
+
self.shortcut = shortcut
|
705
710
|
|
706
711
|
|
707
712
|
class ToolbarListDialog(ListDialog):
|
@@ -726,29 +731,36 @@ class ToolbarListDialog(ListDialog):
|
|
726
731
|
ListDialog.__init__(self, parent, title, provider, message, **kwargs)
|
727
732
|
|
728
733
|
def body(self, bodyFrame):
|
729
|
-
bodyFrame.config(bg=Config.SCIPION_BG_COLOR)
|
730
734
|
gui.configureWeigths(bodyFrame, 1, 0)
|
731
735
|
|
732
736
|
# Add an extra frame to insert the Toolbar
|
733
737
|
# and another one for the ListDialog's body
|
734
|
-
self.toolbarFrame = tk.Frame(bodyFrame
|
738
|
+
self.toolbarFrame = tk.Frame(bodyFrame)
|
735
739
|
self.toolbarFrame.grid(row=0, column=0, sticky='new')
|
736
|
-
if self.toolbarButtons:
|
737
|
-
for i, b in enumerate(self.toolbarButtons):
|
738
|
-
self._addButton(b, i)
|
739
740
|
|
740
741
|
subBody = tk.Frame(bodyFrame)
|
741
742
|
subBody.grid(row=1, column=0, sticky='news', padx=5, pady=5)
|
742
743
|
ListDialog.body(self, subBody)
|
744
|
+
|
745
|
+
if self.toolbarButtons:
|
746
|
+
for i, b in enumerate(self.toolbarButtons):
|
747
|
+
self._addButton(b, i)
|
748
|
+
|
743
749
|
if self._itemDoubleClick:
|
744
750
|
self.tree.itemDoubleClick = self._itemDoubleClick
|
745
751
|
|
746
752
|
def _addButton(self, button, col):
|
747
753
|
btn = tk.Label(self.toolbarFrame, text=button.text,
|
748
754
|
image=self.getImage(button.icon),
|
749
|
-
compound=tk.LEFT, cursor='hand2'
|
755
|
+
compound=tk.LEFT, cursor='hand2')
|
750
756
|
btn.grid(row=0, column=col, sticky='nw', padx=(5, 0), pady=(5, 0))
|
751
757
|
btn.bind('<Button-1>', button.command)
|
758
|
+
if button.tooltip:
|
759
|
+
tooltip = button.tooltip + ' (%s)' % button.shortcut if button.shortcut else button.tooltip
|
760
|
+
self.bind(button.shortcut, button.command)
|
761
|
+
ToolTip(btn, tooltip, delay=150)
|
762
|
+
if button.shortcut:
|
763
|
+
self.bind(button.shortcut, button.command)
|
752
764
|
|
753
765
|
|
754
766
|
class FlashMessage:
|
@@ -561,7 +561,7 @@ class SubclassesTreeProvider(TreeProvider):
|
|
561
561
|
viewers = domain.findViewers(obj.getClassName(), DESKTOP_TKINTER)
|
562
562
|
proj = self.protocol.getProject()
|
563
563
|
for v in viewers:
|
564
|
-
actions.append((
|
564
|
+
actions.append((v.getName(),
|
565
565
|
lambda: v(project=proj).visualize(obj)))
|
566
566
|
return actions
|
567
567
|
|
@@ -28,10 +28,13 @@ import queue
|
|
28
28
|
from functools import partial
|
29
29
|
from tkinter.ttk import Style
|
30
30
|
|
31
|
+
import pyworkflow
|
31
32
|
import pyworkflow as pw
|
32
33
|
from pyworkflow.object import Object
|
33
34
|
from pyworkflow.utils import Message, Icon
|
34
35
|
from PIL import Image, ImageTk
|
36
|
+
|
37
|
+
from pyworkflow.utils import SpriteImage, Sprite
|
35
38
|
from .widgets import Button
|
36
39
|
import numpy as np
|
37
40
|
|
@@ -74,6 +77,7 @@ cfgWrapLenght = cfgMaxWidth - 50
|
|
74
77
|
|
75
78
|
# Style of treeviews where row height is variable based on the font size
|
76
79
|
LIST_TREEVIEW = 'List.Treeview'
|
80
|
+
BORDERLESS_TREEVIEW = 'Borderless.Treeview'
|
77
81
|
|
78
82
|
image_cache = dict()
|
79
83
|
|
@@ -195,19 +199,30 @@ def getImage(imageName, imgDict=None, tkImage=True, percent=100,
|
|
195
199
|
# NOTE: "convert my-image.gif PNG32:my-image.png" has converted gifs to pngs RGBA (32 bits) it seems pillow
|
196
200
|
# needs RGBA format to deal with transparencies.
|
197
201
|
|
198
|
-
|
199
|
-
|
202
|
+
# Most protocols.conf uses .gif extension. We need to use png!.
|
203
|
+
|
204
|
+
# ImageName could be either a file name (bookmark.gif) a full path image or a SpriteImage
|
205
|
+
if isinstance(imageName, SpriteImage):
|
206
|
+
fromSprite = True
|
207
|
+
imageStr = str(imageName)
|
208
|
+
else:
|
209
|
+
fromSprite=False
|
210
|
+
imageStr = imageName
|
211
|
+
|
212
|
+
if not os.path.isabs(imageStr) and imageStr not in [Icon.WAITING]:
|
213
|
+
imageStr = imageStr.replace(".gif", ".png")
|
200
214
|
|
201
|
-
if
|
202
|
-
return image_cache[
|
215
|
+
if imageStr in image_cache:
|
216
|
+
return image_cache[imageStr]
|
203
217
|
|
204
|
-
|
205
|
-
|
218
|
+
# If it is a definition of a sprite image
|
219
|
+
if fromSprite:
|
220
|
+
image = Sprite.getImage(imageName)
|
206
221
|
else:
|
207
|
-
imagePath =
|
208
|
-
|
209
|
-
|
210
|
-
|
222
|
+
imagePath = pw.findResource(imageStr) if not os.path.isabs(imageStr) else imageStr
|
223
|
+
image = Image.open(imagePath) if imagePath else None
|
224
|
+
|
225
|
+
if image:
|
211
226
|
# For a future dark mode we might need to invert the image but it requires some extra work to make it look nice:
|
212
227
|
# image = invertImage(image)
|
213
228
|
w, h = image.size
|
@@ -222,7 +237,7 @@ def getImage(imageName, imgDict=None, tkImage=True, percent=100,
|
|
222
237
|
if tkImage:
|
223
238
|
image = ImageTk.PhotoImage(image)
|
224
239
|
|
225
|
-
image_cache[
|
240
|
+
image_cache[imageStr] = image
|
226
241
|
return image
|
227
242
|
|
228
243
|
def invertImage(img):
|
@@ -285,13 +300,21 @@ def defineStyle():
|
|
285
300
|
# Should be centralized somewhere.
|
286
301
|
style = Style()
|
287
302
|
defaultFont = getDefaultFont()
|
288
|
-
|
303
|
+
|
304
|
+
iconsSizePx = int((pyworkflow.Config.SCIPION_ICON_ZOOM/100 * 32))
|
305
|
+
fontHeight = defaultFont.metrics()['linespace']
|
306
|
+
rowheight = max(iconsSizePx, fontHeight)
|
289
307
|
|
290
308
|
style.configure(LIST_TREEVIEW, rowheight=rowheight,
|
291
309
|
background=pw.Config.SCIPION_BG_COLOR,
|
292
310
|
fieldbackground=pw.Config.SCIPION_BG_COLOR)
|
293
311
|
style.configure(LIST_TREEVIEW+".Heading", font=(defaultFont["family"],defaultFont["size"]))
|
294
312
|
|
313
|
+
style.configure(BORDERLESS_TREEVIEW, rowheight=rowheight,
|
314
|
+
background=pw.Config.SCIPION_BG_COLOR,
|
315
|
+
fieldbackground=pw.Config.SCIPION_BG_COLOR,
|
316
|
+
borderwidth=0, font=(defaultFont["family"],defaultFont["size"]))
|
317
|
+
|
295
318
|
|
296
319
|
class Window:
|
297
320
|
"""Class to manage a Tk windows.
|
@@ -454,7 +477,7 @@ class Window:
|
|
454
477
|
self.close()
|
455
478
|
|
456
479
|
def getImage(self, imgName, percent=100, maxheight=None):
|
457
|
-
return getImage(imgName,
|
480
|
+
return getImage(imgName, percent=percent,
|
458
481
|
maxheight=maxheight)
|
459
482
|
|
460
483
|
def createMainMenu(self, menuConfig):
|
@@ -87,7 +87,7 @@ class ProjectBaseWindow(Window):
|
|
87
87
|
header.columnconfigure(1, weight=1)
|
88
88
|
header.columnconfigure(2, weight=1)
|
89
89
|
# Create the SCIPION logo label
|
90
|
-
logoImg = self.getImage(
|
90
|
+
logoImg = self.getImage(Icon.SCIPION_LOGO_SMALL)
|
91
91
|
logoLabel = tk.Label(header, image=logoImg,
|
92
92
|
borderwidth=0, anchor='nw', bg=pw.Config.SCIPION_BG_COLOR)
|
93
93
|
logoLabel.grid(row=0, column=0, sticky='nw', padx=(5, 0), pady=5)
|
@@ -103,8 +103,6 @@ class ProjectWindow(ProjectBaseWindow):
|
|
103
103
|
shortCut="Ctrl+D", icon=Icon.DEBUG)
|
104
104
|
projMenu.addSubMenu('', '') # add separator
|
105
105
|
projMenu.addSubMenu('Notes', 'notes', icon=Icon.ACTION_EDIT)
|
106
|
-
projMenu.addSubMenu('Scipion log', 'scipion log',
|
107
|
-
icon=Icon.FILE_BW)
|
108
106
|
projMenu.addSubMenu('', '') # add separator
|
109
107
|
projMenu.addSubMenu('Exit', 'exit', icon=Icon.ACTION_OUT)
|
110
108
|
|
@@ -171,8 +169,6 @@ class ProjectWindow(ProjectBaseWindow):
|
|
171
169
|
'Creating default settings..')
|
172
170
|
self.settings = proj.createSettings()
|
173
171
|
|
174
|
-
self.generalCfg = self.settings.getConfig()
|
175
|
-
|
176
172
|
return proj
|
177
173
|
|
178
174
|
# The next functions are callbacks from the menu options.
|
@@ -277,9 +273,6 @@ class ProjectWindow(ProjectBaseWindow):
|
|
277
273
|
def onLocateAProtocol(self):
|
278
274
|
self.getViewWidget()._locateProtocol(None)
|
279
275
|
|
280
|
-
def onScipionLog(self):
|
281
|
-
self.getViewWidget()._scipionLog(None)
|
282
|
-
|
283
276
|
def manageLabels(self):
|
284
277
|
|
285
278
|
labels = self.project.settings.getLabels()
|
@@ -391,8 +384,6 @@ class ProjectManagerWindow(ProjectBaseWindow):
|
|
391
384
|
_pluginMenus = dict()
|
392
385
|
|
393
386
|
def __init__(self, **kwargs):
|
394
|
-
# Load global configuration
|
395
|
-
settings = ProjectSettings()
|
396
387
|
|
397
388
|
# TODO: put the menu part more nicely. From here:
|
398
389
|
menu = MenuConfig()
|
@@ -415,7 +406,6 @@ class ProjectManagerWindow(ProjectBaseWindow):
|
|
415
406
|
helpMenu.addSubMenu('About', 'about', icon=Icon.ACTION_HELP)
|
416
407
|
|
417
408
|
self.menuCfg = menu
|
418
|
-
self.generalCfg = settings.getConfig()
|
419
409
|
|
420
410
|
try:
|
421
411
|
title = '%s (%s on %s)' % (Message.LABEL_PROJECTS,
|
@@ -56,27 +56,34 @@ class RunsTreeProvider(ProjectRunsTreeProvider):
|
|
56
56
|
stoppable = status in [pwprot.STATUS_RUNNING, pwprot.STATUS_SCHEDULED,
|
57
57
|
pwprot.STATUS_LAUNCHED]
|
58
58
|
|
59
|
-
|
59
|
+
# This list defines the order the icons are shown
|
60
|
+
return [
|
61
|
+
(ACTION_EDIT, single and status and expanded),
|
62
|
+
(ACTION_BROWSE, single and status and expanded),
|
60
63
|
(ACTION_RENAME, single and status and expanded),
|
64
|
+
(ACTION_LABELS, True),
|
65
|
+
|
61
66
|
(ACTION_DUPLICATE, status and expanded),
|
62
67
|
(ACTION_COPY, status and expanded),
|
63
68
|
(ACTION_PASTE, status and expanded),
|
64
69
|
(ACTION_DELETE, status != pwprot.STATUS_RUNNING and status and expanded),
|
65
|
-
|
66
|
-
(ACTION_BROWSE, single and status and expanded),
|
67
|
-
(ACTION_DB, single and Config.debugOn() and status and expanded),
|
68
|
-
(ACTION_STOP, stoppable and single),
|
69
|
-
(ACTION_EXPORT, not single),
|
70
|
-
(ACTION_EXPORT_UPLOAD, not single),
|
71
|
-
(ACTION_COLLAPSE, single and status and expanded),
|
72
|
-
(ACTION_EXPAND, single and status and not expanded),
|
73
|
-
(ACTION_LABELS, True),
|
70
|
+
|
74
71
|
(ACTION_SELECT_FROM, True),
|
75
72
|
(ACTION_SELECT_TO, True),
|
73
|
+
(ACTION_COLLAPSE, single and status and expanded),
|
74
|
+
(ACTION_EXPAND, single and status and not expanded),
|
75
|
+
|
76
|
+
(ACTION_STOP, stoppable and single),
|
77
|
+
(ACTION_STOP_WORKFLOW, single),
|
76
78
|
(ACTION_RESTART_WORKFLOW, single),
|
77
79
|
(ACTION_CONTINUE_WORKFLOW, single),
|
78
|
-
(
|
79
|
-
|
80
|
+
(ACTION_RESET_WORKFLOW, single),
|
81
|
+
|
82
|
+
(ACTION_EXPORT, not single),
|
83
|
+
(ACTION_EXPORT_UPLOAD, not single),
|
84
|
+
|
85
|
+
(ACTION_STEPS, single and Config.debugOn() and status and expanded),
|
86
|
+
(ACTION_DB, single and Config.debugOn() and status and expanded),
|
80
87
|
]
|
81
88
|
|
82
89
|
def getObjectActions(self, obj):
|
@@ -33,7 +33,6 @@ import tkinter.font as tkFont
|
|
33
33
|
|
34
34
|
from pyworkflow import Config
|
35
35
|
import pyworkflow.utils as pwutils
|
36
|
-
import pyworkflow.protocol as pwprot
|
37
36
|
import pyworkflow.viewer as pwviewer
|
38
37
|
|
39
38
|
import pyworkflow.gui as gui
|
@@ -45,39 +44,7 @@ from pyworkflow.gui.graph import LevelTree
|
|
45
44
|
from pyworkflow.gui.form import getObjectLabel
|
46
45
|
from pyworkflow.constants import DATA_TAG
|
47
46
|
|
48
|
-
|
49
|
-
ACTION_COPY = pwutils.Message.LABEL_COPY
|
50
|
-
ACTION_DELETE = pwutils.Message.LABEL_DELETE
|
51
|
-
ACTION_REFRESH = pwutils.Message.LABEL_REFRESH
|
52
|
-
ACTION_STEPS = pwutils.Message.LABEL_BROWSE
|
53
|
-
ACTION_TREE = pwutils.Message.LABEL_TREE
|
54
|
-
ACTION_STOP = pwutils.Message.LABEL_STOP
|
55
|
-
ACTION_DEFAULT = pwutils.Message.LABEL_DEFAULT
|
56
|
-
ACTION_CONTINUE = pwutils.Message.LABEL_CONTINUE
|
57
|
-
ACTION_RESULTS = pwutils.Message.LABEL_ANALYZE
|
58
|
-
|
59
|
-
ActionIcons = {
|
60
|
-
ACTION_EDIT: pwutils.Icon.ACTION_EDIT,
|
61
|
-
ACTION_COPY: pwutils.Icon.ACTION_COPY,
|
62
|
-
ACTION_DELETE: pwutils.Icon.ACTION_DELETE,
|
63
|
-
ACTION_REFRESH: pwutils.Icon.ACTION_REFRESH,
|
64
|
-
ACTION_STEPS: pwutils.Icon.ACTION_STEPS,
|
65
|
-
ACTION_TREE: None, # should be set
|
66
|
-
ACTION_STOP: pwutils.Icon.ACTION_STOP,
|
67
|
-
ACTION_CONTINUE: pwutils.Icon.ACTION_CONTINUE,
|
68
|
-
ACTION_RESULTS: pwutils.Icon.ACTION_RESULTS,
|
69
|
-
}
|
70
|
-
|
71
|
-
STATUS_COLORS = {
|
72
|
-
pwprot.STATUS_SAVED: '#D9F1FA',
|
73
|
-
pwprot.STATUS_LAUNCHED: '#D9F1FA',
|
74
|
-
pwprot.STATUS_RUNNING: '#FCCE62',
|
75
|
-
pwprot.STATUS_FINISHED: '#D2F5CB',
|
76
|
-
pwprot.STATUS_FAILED: '#F5CCCB',
|
77
|
-
pwprot.STATUS_INTERACTIVE: '#F3F5CB',
|
78
|
-
pwprot.STATUS_ABORTED: '#F5CCCB',
|
79
|
-
# pwprot.STATUS_SAVED: '#124EB0',
|
80
|
-
}
|
47
|
+
|
81
48
|
|
82
49
|
|
83
50
|
def populateTree(tree, elements, parentId=''):
|