scipion-pyworkflow 3.11.1__tar.gz → 3.11.2__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.11.1 → scipion_pyworkflow-3.11.2}/CHANGES.txt +18 -0
- {scipion_pyworkflow-3.11.1/scipion_pyworkflow.egg-info → scipion_pyworkflow-3.11.2}/PKG-INFO +1 -1
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/apps/pw_project.py +21 -4
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/apps/pw_run_tests.py +2 -1
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/apps/pw_sync_data.py +4 -3
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/constants.py +1 -1
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/browser.py +8 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/dialog.py +3 -1
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/form.py +1 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/gui.py +5 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/base.py +2 -1
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/searchprotocol.py +5 -3
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/viewprojects.py +10 -1
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/viewprotocols.py +42 -17
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/text.py +4 -1
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/mapper/mapper.py +4 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/mapper/sqlite.py +7 -5
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/object.py +1 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/plugin.py +4 -4
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/protocol/executor.py +55 -23
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/protocol/hosts.py +2 -1
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/protocol/protocol.py +5 -0
- scipion_pyworkflow-3.11.2/pyworkflow/resources/protlabels.xcf +0 -0
- scipion_pyworkflow-3.11.2/pyworkflow/resources/sprites.png +0 -0
- scipion_pyworkflow-3.11.2/pyworkflow/resources/sprites.xcf +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/template.py +1 -1
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/tests/tests.py +2 -1
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/utils/process.py +2 -1
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/utils/properties.py +1 -0
- scipion_pyworkflow-3.11.2/pyworkflow/webservices/workflowhub.py +86 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2/scipion_pyworkflow.egg-info}/PKG-INFO +1 -1
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/scipion_pyworkflow.egg-info/SOURCES.txt +1 -0
- scipion_pyworkflow-3.11.1/pyworkflow/resources/sprites.png +0 -0
- scipion_pyworkflow-3.11.1/pyworkflow/resources/sprites.xcf +0 -0
- scipion_pyworkflow-3.11.1/pyworkflow/webservices/workflowhub.py +0 -74
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/LICENSE.txt +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/MANIFEST.in +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/README.rst +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyproject.toml +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/__init__.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/apps/__init__.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/apps/pw_manager.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/apps/pw_plot.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/apps/pw_protocol_list.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/apps/pw_protocol_run.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/apps/pw_schedule_run.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/apps/pw_sleep.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/apps/pw_viewer.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/config.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/exceptions.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/__init__.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/canvas.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/graph.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/graph_layout.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/matplotlib_image.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/plotter.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/__init__.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/constants.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/labels.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/project.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/searchrun.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/steps.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/utils.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/variables.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/viewdata.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/viewprotocols_extra.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/tooltip.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/tree.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/widgets.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/mapper/__init__.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/mapper/sqlite_db.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/project/__init__.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/project/config.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/project/manager.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/project/project.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/project/scripts/clean_projects.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/project/scripts/config.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/project/scripts/create.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/project/scripts/edit_workflow.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/project/scripts/fix_links.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/project/scripts/load.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/project/scripts/refresh.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/project/scripts/schedule.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/project/scripts/stack2volume.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/project/scripts/stop.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/project/usage.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/protocol/__init__.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/protocol/bibtex.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/protocol/constants.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/protocol/launch.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/protocol/package.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/protocol/params.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/Imagej.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/chimera.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/fa-exclamation-triangle_alert.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/fa-info-circle_alert.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/fa-search.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/fa-times-circle_alert.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/file_vol.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/loading.gif +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/no-image128.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/scipion_bn.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/scipion_icon.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/scipion_icon.svg +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/scipion_icon_proj.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/scipion_icon_projs.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/scipion_icon_prot.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/scipion_logo.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/scipion_logo_normal.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/scipion_logo_small.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/arrowDown.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/arrowUp.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/background_section.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/colRowModeOff.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/colRowModeOn.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/delete.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/doc_icon.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/download_icon.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/enabled_gallery.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/galleryViewOff.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/galleryViewOn.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/goto.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/menu.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/separator.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/tableViewOff.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/tableViewOn.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/volumeOff.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/showj/volumeOn.png +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/resources/wait.gif +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/tests/__init__.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/tests/test_utils.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/utils/__init__.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/utils/dataset.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/utils/echo.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/utils/graph.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/utils/log.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/utils/path.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/utils/profiler.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/utils/progressbar.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/utils/reflection.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/utils/utils.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/utils/which.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/viewer.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/webservices/__init__.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/webservices/config.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/webservices/notifier.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/webservices/repository.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/wizard.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/__init__.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/bibtex.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/objects.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/protocols.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/tests/__init__.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/tests/test_canvas.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/tests/test_domain.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/tests/test_logs.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/tests/test_mappers.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/tests/test_object.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/tests/test_project.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/tests/test_protocol_execution.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/tests/test_protocol_export.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/tests/test_protocol_output.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/tests/test_streaming.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflowtests/tests/test_utils.py +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/requirements.txt +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/scipion_pyworkflow.egg-info/dependency_links.txt +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/scipion_pyworkflow.egg-info/entry_points.txt +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/scipion_pyworkflow.egg-info/requires.txt +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/scipion_pyworkflow.egg-info/top_level.txt +0 -0
- {scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/setup.cfg +0 -0
@@ -1,3 +1,21 @@
|
|
1
|
+
V3.11.2
|
2
|
+
users:
|
3
|
+
Copy (Control-C) work in log viewers too
|
4
|
+
Pasting a copied workflow refreshes the graph
|
5
|
+
Bugfix: Protocol with very fast (almost notime) steps work instead of end up finished with pending steps.
|
6
|
+
templates can be fetched from urls having ".json" and not json.template only.
|
7
|
+
Double click in a protocol in "list mode" opens the protocol
|
8
|
+
Double click in a collapsed node, expands it.
|
9
|
+
|
10
|
+
developers:
|
11
|
+
new icon
|
12
|
+
Executor.getGpuListStr(): Returns the assigned gpus for the step as a string (accepts sep --> separator, defaults to " ")
|
13
|
+
Executor.setCudaVisibleDevices(): Sets the variable CUDA_VISIBLE_DEVICES with owned information.
|
14
|
+
Protocol.getExecutor: returns the executor. Useful to aske for gpu information inside a step
|
15
|
+
__debug__ allowed: By default Project load is with -O (optimized) so __debug__ is false.
|
16
|
+
asserts removed, swap to if + raise AssertionError
|
17
|
+
if optimized, shown in project window header
|
18
|
+
|
1
19
|
V3.11.1 fix packaging
|
2
20
|
V3.11.0
|
3
21
|
users:
|
{scipion_pyworkflow-3.11.1/scipion_pyworkflow.egg-info → scipion_pyworkflow-3.11.2}/PKG-INFO
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: scipion-pyworkflow
|
3
|
-
Version: 3.11.
|
3
|
+
Version: 3.11.2
|
4
4
|
Summary: Workflow platform used in scientific applications, initially developed within the Scipion framework for image processing in Electron Microscopy but generic by design to be applied to any domain.
|
5
5
|
Author-email: Pablo Conesa <pconesa@cnb.csic.es>, Yunior Fonseca <cfonseca@cnb.csic.es>, "J.M. De la Rosa Trevin" <josemiguel.delarosatrevin@stjude.org>, Roberto Marabini <roberto@cnb.csic.es>, Grigory Sharov <sharov.grigory@gmail.com>, Josue Gomez Blanco <josue.gomez-blanco@mcgill.ca>
|
6
6
|
License: GNU General Public License v3 (GPLv3)
|
@@ -30,8 +30,9 @@ Launch main project window
|
|
30
30
|
|
31
31
|
import sys
|
32
32
|
import os
|
33
|
+
from subprocess import Popen
|
33
34
|
|
34
|
-
from pyworkflow import Config
|
35
|
+
from pyworkflow import Config, PYTHON
|
35
36
|
from pyworkflow.project import Manager
|
36
37
|
from pyworkflow.gui.project import ProjectWindow
|
37
38
|
import pyworkflow.utils as pwutils
|
@@ -89,12 +90,28 @@ def openProject(projectName):
|
|
89
90
|
projPath = manager.getProjectPath(projName)
|
90
91
|
|
91
92
|
if os.path.exists(projPath):
|
92
|
-
|
93
|
-
|
93
|
+
|
94
|
+
# This opens the project in the same process as the launcher. This is good for directly debugging code
|
95
|
+
# but does not allow -O or not execution (usage of __debug__ flag).
|
96
|
+
# All we can do is to go straight to loading the project if debug is active or running optimized.
|
97
|
+
if Config.debugOn() or not __debug__:
|
98
|
+
|
99
|
+
|
100
|
+
# This may or may not be run Optimized (-O). It depends on the call to scipion last (launcher)
|
101
|
+
print("Launching project in debug or optimized...")
|
102
|
+
projWindow = ProjectWindow(projPath)
|
103
|
+
projWindow.show()
|
104
|
+
else:
|
105
|
+
|
106
|
+
# Run this same script optimized: Defined in scipion module under scipion-app: Circular definition. To fix! Bad design.
|
107
|
+
print("Launching project optimized...")
|
108
|
+
Popen([PYTHON, "-O", "-m","scipion", "project", projectName])
|
109
|
+
|
110
|
+
|
94
111
|
else:
|
95
112
|
print("Can't open project %s. It does not exist" % projPath)
|
96
113
|
|
97
|
-
#Show the list of projects
|
114
|
+
# Show the list of projects
|
98
115
|
showProjectList(manager)
|
99
116
|
|
100
117
|
def showProjectList(manager):
|
@@ -166,7 +166,8 @@ class Tester:
|
|
166
166
|
""" Show the list of tests available """
|
167
167
|
mode = self.mode
|
168
168
|
|
169
|
-
|
169
|
+
if mode not in ['modules', 'classes', 'onlyclasses', 'all']:
|
170
|
+
raise AssertionError('Unknown mode %s' % mode)
|
170
171
|
|
171
172
|
# First flatten the list of tests.
|
172
173
|
# testsFlat = list(iter(self.__iterTests(tests)))
|
@@ -278,8 +278,8 @@ def download(dataset, destination=None, url=None, verbose=False):
|
|
278
278
|
urlopen('%s/%s/%s' % (url, dataset, fname)))
|
279
279
|
|
280
280
|
md5 = md5sum(fpath)
|
281
|
-
|
282
|
-
"Bad md5. Expected: %s Computed: %s" % (md5Remote, md5)
|
281
|
+
if md5 != md5Remote:
|
282
|
+
raise AssertionError("Bad md5. Expected: %s Computed: %s" % (md5Remote, md5))
|
283
283
|
|
284
284
|
done += inc
|
285
285
|
if verbose:
|
@@ -315,7 +315,8 @@ def update(dataset, workingCopy=None, url=None, verbose=False):
|
|
315
315
|
try:
|
316
316
|
last = max(os.stat(join(datasetFolder, x)).st_mtime for x in md5sRemote)
|
317
317
|
t_manifest = os.stat(join(datasetFolder, 'MANIFEST')).st_mtime
|
318
|
-
|
318
|
+
if not (t_manifest > last and time.time() - t_manifest < 60*60*24*7):
|
319
|
+
raise AssertionError("Manifest times seems to be wrong.")
|
319
320
|
except (OSError, IOError, AssertionError) as e:
|
320
321
|
logger.info("Regenerating local MANIFEST...")
|
321
322
|
createMANIFEST(datasetFolder)
|
@@ -43,7 +43,7 @@ VERSION_1 = '1.0.0'
|
|
43
43
|
VERSION_1_1 = '1.1.0'
|
44
44
|
VERSION_1_2 = '1.2.0'
|
45
45
|
VERSION_2_0 = '2.0.0'
|
46
|
-
VERSION_3_0 = '3.11.
|
46
|
+
VERSION_3_0 = '3.11.2'
|
47
47
|
|
48
48
|
# For a new release, define a new constant and assign it to LAST_VERSION
|
49
49
|
# The existing one has to be added to OLD_VERSIONS list.
|
@@ -72,6 +72,10 @@ class ObjectBrowser(tk.Frame):
|
|
72
72
|
p.grid(row=0, column=0, sticky='news')
|
73
73
|
|
74
74
|
leftPanel = tk.Frame(p)
|
75
|
+
|
76
|
+
# Optional, widget to get the focus
|
77
|
+
self.initial_focus=None
|
78
|
+
|
75
79
|
self._fillLeftPanel(leftPanel)
|
76
80
|
p.add(leftPanel, padx=5, pady=5)
|
77
81
|
p.paneconfig(leftPanel, minsize=300)
|
@@ -88,6 +92,7 @@ class ObjectBrowser(tk.Frame):
|
|
88
92
|
def _fillLeftPanel(self, frame):
|
89
93
|
gui.configureWeigths(frame)
|
90
94
|
self.tree = BoundTree(frame, self.treeProvider, style=LIST_TREEVIEW)
|
95
|
+
self.initial_focus=self.tree
|
91
96
|
self.tree.grid(row=0, column=0, sticky='news')
|
92
97
|
self.itemConfig = self.tree.itemConfig
|
93
98
|
self.getImage = self.tree.getImage
|
@@ -489,6 +494,7 @@ class FileBrowser(ObjectBrowser):
|
|
489
494
|
pathLabel.grid(row=0, column=0, padx=0, pady=3)
|
490
495
|
pathEntry = tk.Entry(pathFrame, bg='white', width=65,
|
491
496
|
textvariable=self.pathVar, font=gui.getDefaultFont())
|
497
|
+
self.initial_focus=pathEntry
|
492
498
|
pathEntry.grid(row=0, column=1, sticky='new', pady=3)
|
493
499
|
pathEntry.bind("<Return>", self._onEnterPath)
|
494
500
|
pathEntry.bind("<KP_Enter>", self._onEnterPath)
|
@@ -711,6 +717,8 @@ class BrowserWindow(gui.Window):
|
|
711
717
|
browser.grid(row=row, column=column, sticky='news')
|
712
718
|
self.itemConfig = browser.tree.itemConfig
|
713
719
|
|
720
|
+
if browser.initial_focus is not None:
|
721
|
+
self.initial_focus = browser.initial_focus
|
714
722
|
|
715
723
|
STANDARD_IMAGE_EXTENSIONS = ['.png', '.jpg', '.jpeg']
|
716
724
|
|
@@ -644,7 +644,7 @@ class ListDialog(Dialog):
|
|
644
644
|
label = tk.Label(bodyFrame, text=self.message, compound=tk.LEFT,
|
645
645
|
image=self.getImage(Icon.LIGHTBULB))
|
646
646
|
label.grid(row=2, column=0, sticky='nw', padx=5, pady=5)
|
647
|
-
self.initial_focus = self.tree
|
647
|
+
# CAncel this, now focus is set to the search box. self.initial_focus = self.tree
|
648
648
|
|
649
649
|
def _createTree(self, parent):
|
650
650
|
self.tree = BoundTree(parent, self.provider, selectmode=self._selectmode, style=LIST_TREEVIEW)
|
@@ -677,6 +677,7 @@ class ListDialog(Dialog):
|
|
677
677
|
self.entry.bind('<KeyRelease>', self._onSearch)
|
678
678
|
self.entry.focus_set()
|
679
679
|
self.entry.grid(row=0, column=1, sticky='news')
|
680
|
+
self.initial_focus=self.entry
|
680
681
|
self.searchBoxframe.grid(row=0, column=0, sticky='news', padx=5,
|
681
682
|
pady=(10, 5))
|
682
683
|
|
@@ -910,6 +911,7 @@ class SearchBaseWindow(Window):
|
|
910
911
|
entry.bind(TK.ENTER, self._onSearchClick)
|
911
912
|
entry.focus_set()
|
912
913
|
entry.grid(row=0, column=1, sticky='nw')
|
914
|
+
self.initial_focus=entry
|
913
915
|
btn = widgets.IconButton(frame, "Search",
|
914
916
|
imagePath=Icon.ACTION_SEARCH,
|
915
917
|
command=self._onSearchClick)
|
@@ -1937,6 +1937,7 @@ class FormWindow(Window):
|
|
1937
1937
|
self.waitForVar.set(', '.join(self.protocol.getPrerequisites()))
|
1938
1938
|
entryWf = tk.Entry(runFrame, font=self.font, width=25,
|
1939
1939
|
textvariable=self.waitForVar)
|
1940
|
+
self.initial_focus = entryWf
|
1940
1941
|
entryWf.grid(row=r, column=c + 1, padx=(0, 5), pady=5, sticky='ew')
|
1941
1942
|
|
1942
1943
|
self.waitForVar.trace('w', self._setWaitFor)
|
@@ -371,6 +371,8 @@ class Window:
|
|
371
371
|
self.master = masterWindow
|
372
372
|
setCommonFonts(self)
|
373
373
|
|
374
|
+
self.initial_focus = None
|
375
|
+
|
374
376
|
if kwargs.get('enableQueue', False):
|
375
377
|
self.queue = queue.Queue(maxsize=0)
|
376
378
|
else:
|
@@ -451,6 +453,9 @@ class Window:
|
|
451
453
|
if self.queue is not None:
|
452
454
|
self._queueTimer = self.root.after(1000, self.__processQueue)
|
453
455
|
|
456
|
+
if self.initial_focus is not None:
|
457
|
+
self.initial_focus.focus_set()
|
458
|
+
|
454
459
|
if modal:
|
455
460
|
self.root.wait_window(self.root)
|
456
461
|
else:
|
@@ -92,7 +92,8 @@ class ProjectBaseWindow(Window):
|
|
92
92
|
logoLabel = tk.Label(header, image=logoImg,
|
93
93
|
borderwidth=0, anchor='nw', bg=pw.Config.SCIPION_BG_COLOR)
|
94
94
|
logoLabel.grid(row=0, column=0, sticky='nw', padx=(5, 0), pady=5)
|
95
|
-
|
95
|
+
|
96
|
+
version = "%s - %s (core%s)" % (os.environ.get('SCIPION_VERSION', ""), pw.LAST_VERSION, ' optimized'if not __debug__ else '')
|
96
97
|
|
97
98
|
versionLabel = tk.Label(header, text=version,
|
98
99
|
bg=pw.Config.SCIPION_BG_COLOR)
|
{scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/searchprotocol.py
RENAMED
@@ -24,6 +24,8 @@
|
|
24
24
|
# **************************************************************************
|
25
25
|
""" This module contains the provider and dialog to search for a protocol"""
|
26
26
|
import tkinter as tk
|
27
|
+
import logging
|
28
|
+
logger = logging.getLogger(__name__)
|
27
29
|
from pyworkflow import Config
|
28
30
|
import pyworkflow.gui as pwgui
|
29
31
|
import pyworkflow.object as pwobj
|
@@ -35,12 +37,9 @@ from pyworkflow.project.usage import getNextProtocolSuggestions
|
|
35
37
|
from pyworkflow.utils import Icon
|
36
38
|
|
37
39
|
UPDATED = "updated"
|
38
|
-
|
39
40
|
NEW = "new"
|
40
|
-
|
41
41
|
BETA = "beta"
|
42
42
|
|
43
|
-
|
44
43
|
class ProtocolTreeProvider(pwgui.tree.ObjectTreeProvider):
|
45
44
|
"""Create the tree elements for a Protocol run"""
|
46
45
|
|
@@ -81,6 +80,7 @@ class SearchProtocolWindow(SearchBaseWindow):
|
|
81
80
|
title="Add a protocol" + posStr)
|
82
81
|
|
83
82
|
self.root.bind("<FocusIn>", self._onWindowFocusIn)
|
83
|
+
self.root.focus()
|
84
84
|
|
85
85
|
def _onWindowFocusIn(self, event):
|
86
86
|
"""
|
@@ -92,6 +92,8 @@ class SearchProtocolWindow(SearchBaseWindow):
|
|
92
92
|
self.selectedProtocol = self.selectionGetter()
|
93
93
|
if self._isSuggestionActive():
|
94
94
|
self._onSearchClick()
|
95
|
+
self.initial_focus.focus_set()
|
96
|
+
|
95
97
|
def _isSuggestionActive(self):
|
96
98
|
"""
|
97
99
|
:return: Returns true if current mode is suggestion mode.
|
{scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/viewprojects.py
RENAMED
@@ -220,7 +220,16 @@ class ProjectsView(tk.Frame):
|
|
220
220
|
def openProject(self, projName):
|
221
221
|
from subprocess import Popen
|
222
222
|
script = pw.join(pw.APPS, 'pw_project.py')
|
223
|
-
|
223
|
+
args=[pw.PYTHON, "-O", script, projName]
|
224
|
+
|
225
|
+
# Launcher is the ona calling this process. Since launcher does not deal
|
226
|
+
# with __debug__ we should use the variable in the config
|
227
|
+
if pw.Config.debugOn():
|
228
|
+
# If not optimizing code, remove -O
|
229
|
+
logger.warning(f"Launching project {projName} in debug mode.")
|
230
|
+
del args[1]
|
231
|
+
|
232
|
+
Popen(args)
|
224
233
|
|
225
234
|
def deleteProject(self, projInfo):
|
226
235
|
|
{scipion_pyworkflow-3.11.1 → scipion_pyworkflow-3.11.2}/pyworkflow/gui/project/viewprotocols.py
RENAMED
@@ -85,10 +85,23 @@ class ProtocolsView(tk.Frame):
|
|
85
85
|
SIZE_1GB: "orange",
|
86
86
|
SIZE_1TB: "red"}
|
87
87
|
|
88
|
+
_actionList = [
|
89
|
+
ACTION_NEW, ACTION_EDIT, ACTION_RENAME, ACTION_DUPLICATE, ACTION_COPY, ACTION_PASTE, ACTION_DELETE,
|
90
|
+
ACTION_BROWSE,
|
91
|
+
ACTION_STOP, ACTION_STOP_WORKFLOW, ACTION_CONTINUE, ACTION_CONTINUE_WORKFLOW, ACTION_RESTART_WORKFLOW,
|
92
|
+
ACTION_RESET_WORKFLOW,
|
93
|
+
ACTION_RESULTS,
|
94
|
+
ACTION_EXPORT, ACTION_EXPORT_UPLOAD,
|
95
|
+
ACTION_COLLAPSE, ACTION_EXPAND,
|
96
|
+
ACTION_LABELS, ACTION_SEARCH,
|
97
|
+
ACTION_SELECT_FROM, ACTION_SELECT_TO,
|
98
|
+
ACTION_STEPS, ACTION_DB
|
99
|
+
]
|
88
100
|
_protocolViews = None
|
89
101
|
|
90
102
|
def __init__(self, parent, window, **args):
|
91
103
|
tk.Frame.__init__(self, parent, **args)
|
104
|
+
|
92
105
|
# Load global configuration
|
93
106
|
self.window = window
|
94
107
|
self.project = window.project
|
@@ -110,6 +123,8 @@ class ProtocolsView(tk.Frame):
|
|
110
123
|
self.root.bind("<Control-t>", self._toggleColorScheme)
|
111
124
|
self.root.bind("<Control-D>", self._toggleDebug)
|
112
125
|
self.root.bind("<Control-l>", self._locateProtocol)
|
126
|
+
# Bind to root "focus in"
|
127
|
+
self.root.bind("<FocusIn>", self._onWindowFocusIn)
|
113
128
|
|
114
129
|
if Config.debugOn():
|
115
130
|
self.root.bind("<Control-i>", self._inspectProtocols)
|
@@ -295,6 +310,11 @@ class ProtocolsView(tk.Frame):
|
|
295
310
|
|
296
311
|
return p
|
297
312
|
|
313
|
+
def _onWindowFocusIn(self, event):
|
314
|
+
""" Refresh on windows get focus """
|
315
|
+
if event.widget == self.root:
|
316
|
+
self.runsGraphCanvas.focus_set()
|
317
|
+
|
298
318
|
def _viewObject(self, objId):
|
299
319
|
""" Call appropriate viewer for objId. """
|
300
320
|
proj = self.project
|
@@ -442,17 +462,6 @@ class ProtocolsView(tk.Frame):
|
|
442
462
|
""" Prepare the buttons that will be available for protocol actions. """
|
443
463
|
|
444
464
|
self.actionButtons = {}
|
445
|
-
actionList = [
|
446
|
-
ACTION_NEW, ACTION_EDIT, ACTION_RENAME, ACTION_DUPLICATE, ACTION_COPY, ACTION_PASTE, ACTION_DELETE,
|
447
|
-
ACTION_BROWSE,
|
448
|
-
ACTION_STOP, ACTION_STOP_WORKFLOW, ACTION_CONTINUE, ACTION_CONTINUE_WORKFLOW, ACTION_RESTART_WORKFLOW, ACTION_RESET_WORKFLOW,
|
449
|
-
ACTION_RESULTS,
|
450
|
-
ACTION_EXPORT, ACTION_EXPORT_UPLOAD,
|
451
|
-
ACTION_COLLAPSE, ACTION_EXPAND,
|
452
|
-
ACTION_LABELS, ACTION_SEARCH,
|
453
|
-
ACTION_SELECT_FROM, ACTION_SELECT_TO,
|
454
|
-
ACTION_STEPS, ACTION_DB
|
455
|
-
]
|
456
465
|
|
457
466
|
def addButton(action, text, toolbar):
|
458
467
|
|
@@ -464,17 +473,16 @@ class ProtocolsView(tk.Frame):
|
|
464
473
|
callback = lambda e: self._runActionClicked(action, event=e)
|
465
474
|
btn.bind(TK.LEFT_CLICK, callback)
|
466
475
|
|
467
|
-
# Shortcuts
|
476
|
+
# Shortcuts, these are bind later!!
|
468
477
|
shortCut = ActionShortCuts.get(action, None)
|
469
478
|
if shortCut:
|
470
479
|
text += " (%s)" % shortCut
|
471
|
-
self.root.bind(shortCut, callback)
|
472
480
|
|
473
481
|
ToolTip(btn, text, 500)
|
474
482
|
|
475
483
|
return btn
|
476
484
|
|
477
|
-
for action in
|
485
|
+
for action in self._actionList:
|
478
486
|
self.actionButtons[action] = addButton(action, action,
|
479
487
|
self.runsToolbar)
|
480
488
|
|
@@ -745,6 +753,17 @@ class ProtocolsView(tk.Frame):
|
|
745
753
|
|
746
754
|
self.updateRunsGraph()
|
747
755
|
|
756
|
+
# Shortcuts for actions
|
757
|
+
for action in self._actionList:
|
758
|
+
|
759
|
+
# prevent "late binding closure" by passing action as a default value for the lambda param.
|
760
|
+
callback = lambda e, my_action=action: self._runActionClicked(my_action, event=e)
|
761
|
+
|
762
|
+
# Shortcuts:
|
763
|
+
shortCut = ActionShortCuts.get(action, None)
|
764
|
+
if shortCut:
|
765
|
+
self.runsGraphCanvas.bind(shortCut, callback)
|
766
|
+
|
748
767
|
def updateRunsGraph(self, refresh=False, checkPids=False, position=None):
|
749
768
|
|
750
769
|
self.runsGraph = self.project.getRunsGraph(refresh=refresh,
|
@@ -1215,9 +1234,15 @@ class ProtocolsView(tk.Frame):
|
|
1215
1234
|
self._selectItemProtocol(prot)
|
1216
1235
|
|
1217
1236
|
def _runItemDoubleClick(self, item=None, e=None):
|
1218
|
-
|
1237
|
+
|
1238
|
+
if self.runsView == VIEW_LIST:
|
1219
1239
|
self._runActionClicked(ACTION_EDIT)
|
1220
1240
|
|
1241
|
+
elif item.nodeInfo.isExpanded():
|
1242
|
+
self._runActionClicked(ACTION_EDIT)
|
1243
|
+
else:
|
1244
|
+
self._runActionClicked(ACTION_EXPAND)
|
1245
|
+
|
1221
1246
|
def _runItemMiddleClick(self, e=None):
|
1222
1247
|
self._runActionClicked(ACTION_SELECT_TO)
|
1223
1248
|
|
@@ -1612,7 +1637,7 @@ class ProtocolsView(tk.Frame):
|
|
1612
1637
|
|
1613
1638
|
self.project.loadProtocols(jsonStr=self.clipboard_get())
|
1614
1639
|
self.info("Clipboard content pasted successfully.")
|
1615
|
-
self.updateRunsGraph(
|
1640
|
+
self.updateRunsGraph(True)
|
1616
1641
|
except Exception as e:
|
1617
1642
|
self.info("Paste failed, maybe clipboard content is not valid content? See GUI log for details.")
|
1618
1643
|
logger.error("Clipboard content couldn't be pasted." , exc_info=e)
|
@@ -1988,7 +2013,7 @@ class ProtocolsView(tk.Frame):
|
|
1988
2013
|
if event is not None:
|
1989
2014
|
# log Search box events are reaching here
|
1990
2015
|
# Since this method is bound to the window events
|
1991
|
-
if event.widget.widgetName
|
2016
|
+
if event.widget.widgetName in ['text', 'entry']:
|
1992
2017
|
return
|
1993
2018
|
|
1994
2019
|
# Following actions do not need a select run
|
@@ -170,6 +170,7 @@ class Text(tk.Text, Scrollable):
|
|
170
170
|
# Associate with right click
|
171
171
|
self.bind("<Button-1>", self.onClick)
|
172
172
|
self.bind("<Button-3>", self.onRightClick)
|
173
|
+
self.bind("Control-c", self.copyToClipboard)
|
173
174
|
|
174
175
|
def getDefaults(self):
|
175
176
|
"""This should be implemented in subclasses to provide defaults"""
|
@@ -234,6 +235,7 @@ class Text(tk.Text, Scrollable):
|
|
234
235
|
def copyToClipboard(self, e=None):
|
235
236
|
self.clipboard_clear()
|
236
237
|
self.clipboard_append(self.selection)
|
238
|
+
return "break"
|
237
239
|
|
238
240
|
def openFile(self):
|
239
241
|
# What happens when you right-click and select "Open path"
|
@@ -508,7 +510,7 @@ class TextFileViewer(tk.Frame):
|
|
508
510
|
self.maxSize = maxSize
|
509
511
|
self.width = width
|
510
512
|
self.height = height
|
511
|
-
|
513
|
+
self.searchEntry = None
|
512
514
|
self.createWidgets(fileList)
|
513
515
|
self.master = master
|
514
516
|
self.addBinding()
|
@@ -755,6 +757,7 @@ def openTextFileEditor(filename, tkParent=None):
|
|
755
757
|
def showTextFileViewer(title, filelist, parent=None, main=False):
|
756
758
|
w = gui.Window(title, parent, minsize=(600, 400))
|
757
759
|
viewer = TextFileViewer(w.root, filelist, maxSize=-1, font=w.font)
|
760
|
+
w.initial_focus=viewer.searchEntry
|
758
761
|
viewer.grid(row=0, column=0, sticky='news')
|
759
762
|
gui.configureWeigths(w.root)
|
760
763
|
w.show()
|
@@ -84,6 +84,10 @@ class Mapper:
|
|
84
84
|
|
85
85
|
try:
|
86
86
|
instance = self.dictClasses[className]()
|
87
|
+
|
88
|
+
if __debug__:
|
89
|
+
logger.debug("Object instantiated of class %s", className)
|
90
|
+
|
87
91
|
except Exception as e:
|
88
92
|
clazz = self.dictClasses._default
|
89
93
|
logger.error('Class %s could not be created. Replacing it with %s ' % (className, clazz.__name__), exc_info=e)
|
@@ -187,6 +187,10 @@ class SqliteMapper(Mapper):
|
|
187
187
|
"""Build the object which id is objId"""
|
188
188
|
if objId in self.objDict:
|
189
189
|
obj = self.objDict[objId]
|
190
|
+
|
191
|
+
if __debug__:
|
192
|
+
# If not optimized code
|
193
|
+
logger.debug("Object with id %s already loaded: %s", objId, obj)
|
190
194
|
else:
|
191
195
|
objRow = self.db.selectObjectById(objId)
|
192
196
|
if objRow is None:
|
@@ -211,10 +215,8 @@ class SqliteMapper(Mapper):
|
|
211
215
|
rowName = self._getStrValue(objRow['name'])
|
212
216
|
|
213
217
|
if not hasattr(obj, ID_ATTRIBUTE):
|
214
|
-
raise Exception("Entry '
|
215
|
-
", is being mapped to
|
216
|
-
(rowName, rowId,
|
217
|
-
objRow['classname'], type(obj)))
|
218
|
+
raise Exception(f"Entry '{rowName}' (id={rowId}) in the database, stored as '{objRow['classname']}'"
|
219
|
+
f", is being mapped to {type(obj)} object.")
|
218
220
|
|
219
221
|
obj._objId = rowId
|
220
222
|
|
@@ -880,7 +882,7 @@ class SqliteFlatMapper(Mapper):
|
|
880
882
|
self.db.deleteAll()
|
881
883
|
|
882
884
|
def delete(self, obj):
|
883
|
-
"""Delete an object and all its
|
885
|
+
"""Delete an object and all its children"""
|
884
886
|
self.db.deleteObject(obj.getObjId())
|
885
887
|
|
886
888
|
def updateTo(self, obj, level=1):
|
@@ -1344,6 +1344,7 @@ class Set(Object):
|
|
1344
1344
|
else:
|
1345
1345
|
self._idCount = max(self._idCount, item.getObjId())
|
1346
1346
|
self._insertItem(item)
|
1347
|
+
# FIXME: Incrementing always!! When updating this is wrong.
|
1347
1348
|
self._size.increment()
|
1348
1349
|
|
1349
1350
|
def _insertItem(self, item):
|
@@ -410,11 +410,11 @@ class Domain:
|
|
410
410
|
viewerClassName,
|
411
411
|
doRaise=True)
|
412
412
|
viewers.append(prefViewer)
|
413
|
-
except Exception
|
414
|
-
logger.
|
413
|
+
except Exception:
|
414
|
+
logger.info("Couldn't load \"%s\" as preferred viewer for %s.\n"
|
415
415
|
"There might be a typo in your VIEWERS variable "
|
416
|
-
"or an error in the viewer's plugin installation"
|
417
|
-
% (prefViewerStr,
|
416
|
+
"or an error in the viewer's plugin installation or simply the plugin is not installed."
|
417
|
+
% (prefViewerStr, target))
|
418
418
|
|
419
419
|
cls._preferred_viewers[target] = viewers
|
420
420
|
|