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.
Files changed (252) hide show
  1. {scipion-pyworkflow-3.4.0/scipion_pyworkflow.egg-info → scipion-pyworkflow-3.5.0}/PKG-INFO +1 -1
  2. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/apps/pw_project.py +3 -8
  3. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/config.py +62 -8
  4. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/constants.py +3 -1
  5. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/browser.py +3 -11
  6. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/canvas.py +1 -1
  7. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/dialog.py +22 -10
  8. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/form.py +1 -1
  9. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/gui.py +36 -13
  10. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/project/base.py +1 -1
  11. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/project/project.py +0 -10
  12. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/project/searchrun.py +19 -12
  13. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/project/viewdata.py +1 -34
  14. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/project/viewprotocols.py +34 -104
  15. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/project/viewprotocols_extra.py +1 -1
  16. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/tree.py +2 -2
  17. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/widgets.py +1 -1
  18. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/object.py +37 -11
  19. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/plugin.py +9 -9
  20. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/project/__init__.py +1 -1
  21. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/project/config.py +0 -15
  22. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/project/project.py +18 -6
  23. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/protocol/executor.py +12 -0
  24. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/protocol/launch.py +32 -25
  25. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/protocol/protocol.py +29 -5
  26. scipion-pyworkflow-3.5.0/pyworkflow/resources/sprites.png +0 -0
  27. scipion-pyworkflow-3.5.0/pyworkflow/resources/sprites.xcf +0 -0
  28. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/template.py +1 -1
  29. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/utils/log.py +2 -2
  30. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/utils/path.py +28 -2
  31. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/utils/properties.py +164 -99
  32. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/utils/utils.py +10 -0
  33. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/viewer.py +7 -1
  34. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/tests/test_object.py +8 -0
  35. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/tests/test_utils.py +74 -4
  36. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0/scipion_pyworkflow.egg-info}/PKG-INFO +1 -1
  37. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/scipion_pyworkflow.egg-info/SOURCES.txt +2 -86
  38. scipion-pyworkflow-3.4.0/pyworkflow/resources/backward-solid.png +0 -0
  39. scipion-pyworkflow-3.4.0/pyworkflow/resources/beta.png +0 -0
  40. scipion-pyworkflow-3.4.0/pyworkflow/resources/binoculares.png +0 -0
  41. scipion-pyworkflow-3.4.0/pyworkflow/resources/bookmark.png +0 -0
  42. scipion-pyworkflow-3.4.0/pyworkflow/resources/broom-solid.png +0 -0
  43. scipion-pyworkflow-3.4.0/pyworkflow/resources/class_obj.png +0 -0
  44. scipion-pyworkflow-3.4.0/pyworkflow/resources/clipboard-regular.png +0 -0
  45. scipion-pyworkflow-3.4.0/pyworkflow/resources/code-branch-solid.png +0 -0
  46. scipion-pyworkflow-3.4.0/pyworkflow/resources/debug.png +0 -0
  47. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-arrow-down.png +0 -0
  48. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-arrow-left.png +0 -0
  49. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-arrow-up.png +0 -0
  50. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-ban.png +0 -0
  51. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-bars.png +0 -0
  52. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-check.png +0 -0
  53. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-checked.png +0 -0
  54. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-cog.png +0 -0
  55. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-cogs.png +0 -0
  56. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-database.png +0 -0
  57. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-delete-operation.png +0 -0
  58. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-download.png +0 -0
  59. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-external-link.png +0 -0
  60. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-eye.png +0 -0
  61. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-failure.png +0 -0
  62. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-file-o.png +0 -0
  63. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-files-o.png +0 -0
  64. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-folder-open.png +0 -0
  65. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-home.png +0 -0
  66. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-install.png +0 -0
  67. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-installed.png +0 -0
  68. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-lightbulb-o.png +0 -0
  69. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-list-ul.png +0 -0
  70. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-magic.png +0 -0
  71. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-minus-square.png +0 -0
  72. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-next.png +0 -0
  73. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-pencil.png +0 -0
  74. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-play-circle-o.png +0 -0
  75. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-plus-square.png +0 -0
  76. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-previous.png +0 -0
  77. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-processing.png +0 -0
  78. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-question-circle.png +0 -0
  79. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-refresh.png +0 -0
  80. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-rocket.png +0 -0
  81. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-save.png +0 -0
  82. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-sign-in.png +0 -0
  83. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-sign-out.png +0 -0
  84. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-sitemap.png +0 -0
  85. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-stop-workflow.png +0 -0
  86. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-stop.png +0 -0
  87. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-tags.png +0 -0
  88. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-times.png +0 -0
  89. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-to_install.png +0 -0
  90. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-trash-o.png +0 -0
  91. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-unchecked.png +0 -0
  92. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-undo.png +0 -0
  93. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-uninstall.png +0 -0
  94. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-update.png +0 -0
  95. scipion-pyworkflow-3.4.0/pyworkflow/resources/fa-upload.png +0 -0
  96. scipion-pyworkflow-3.4.0/pyworkflow/resources/file.png +0 -0
  97. scipion-pyworkflow-3.4.0/pyworkflow/resources/file_folder.png +0 -0
  98. scipion-pyworkflow-3.4.0/pyworkflow/resources/file_folder_link.png +0 -0
  99. scipion-pyworkflow-3.4.0/pyworkflow/resources/file_generic.png +0 -0
  100. scipion-pyworkflow-3.4.0/pyworkflow/resources/file_generic_link.png +0 -0
  101. scipion-pyworkflow-3.4.0/pyworkflow/resources/file_image.png +0 -0
  102. scipion-pyworkflow-3.4.0/pyworkflow/resources/file_image_link.png +0 -0
  103. scipion-pyworkflow-3.4.0/pyworkflow/resources/file_java.png +0 -0
  104. scipion-pyworkflow-3.4.0/pyworkflow/resources/file_log.png +0 -0
  105. scipion-pyworkflow-3.4.0/pyworkflow/resources/file_md.png +0 -0
  106. scipion-pyworkflow-3.4.0/pyworkflow/resources/file_md_link.png +0 -0
  107. scipion-pyworkflow-3.4.0/pyworkflow/resources/file_python.png +0 -0
  108. scipion-pyworkflow-3.4.0/pyworkflow/resources/file_sqlite.png +0 -0
  109. scipion-pyworkflow-3.4.0/pyworkflow/resources/file_stack.png +0 -0
  110. scipion-pyworkflow-3.4.0/pyworkflow/resources/file_stack_link.png +0 -0
  111. scipion-pyworkflow-3.4.0/pyworkflow/resources/file_text.png +0 -0
  112. scipion-pyworkflow-3.4.0/pyworkflow/resources/new.png +0 -0
  113. scipion-pyworkflow-3.4.0/pyworkflow/resources/no-image.png +0 -0
  114. scipion-pyworkflow-3.4.0/pyworkflow/resources/paste-solid.png +0 -0
  115. scipion-pyworkflow-3.4.0/pyworkflow/resources/power-off-solid.png +0 -0
  116. scipion-pyworkflow-3.4.0/pyworkflow/resources/production.png +0 -0
  117. scipion-pyworkflow-3.4.0/pyworkflow/resources/prot_disabled.png +0 -0
  118. scipion-pyworkflow-3.4.0/pyworkflow/resources/question.png +0 -0
  119. scipion-pyworkflow-3.4.0/pyworkflow/resources/rename.png +0 -0
  120. scipion-pyworkflow-3.4.0/pyworkflow/resources/root.png +0 -0
  121. scipion-pyworkflow-3.4.0/pyworkflow/resources/updated.png +0 -0
  122. scipion-pyworkflow-3.4.0/pyworkflow/resources/users.png +0 -0
  123. scipion-pyworkflow-3.4.0/pyworkflow/resources/workflow.png +0 -0
  124. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/LICENSE.txt +0 -0
  125. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/MANIFEST.in +0 -0
  126. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/README.rst +0 -0
  127. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/__init__.py +0 -0
  128. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/apps/__init__.py +0 -0
  129. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/apps/pw_manager.py +0 -0
  130. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/apps/pw_plot.py +0 -0
  131. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/apps/pw_protocol_list.py +0 -0
  132. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/apps/pw_protocol_run.py +0 -0
  133. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/apps/pw_run_tests.py +0 -0
  134. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/apps/pw_schedule_run.py +0 -0
  135. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/apps/pw_sleep.py +0 -0
  136. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/apps/pw_sync_data.py +0 -0
  137. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/apps/pw_viewer.py +0 -0
  138. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/exceptions.py +0 -0
  139. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/__init__.py +0 -0
  140. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/graph.py +0 -0
  141. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/graph_layout.py +0 -0
  142. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/matplotlib_image.py +0 -0
  143. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/plotter.py +0 -0
  144. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/project/__init__.py +0 -0
  145. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/project/constants.py +0 -0
  146. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/project/labels.py +0 -0
  147. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/project/searchprotocol.py +0 -0
  148. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/project/steps.py +0 -0
  149. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/project/utils.py +0 -0
  150. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/project/viewprojects.py +0 -0
  151. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/text.py +0 -0
  152. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/gui/tooltip.py +0 -0
  153. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/mapper/__init__.py +0 -0
  154. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/mapper/mapper.py +0 -0
  155. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/mapper/sqlite.py +0 -0
  156. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/mapper/sqlite_db.py +0 -0
  157. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/mapper/xmlmapper.py +0 -0
  158. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/project/manager.py +0 -0
  159. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/project/scripts/clean_projects.py +0 -0
  160. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/project/scripts/config.py +0 -0
  161. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/project/scripts/create.py +0 -0
  162. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/project/scripts/edit_workflow.py +0 -0
  163. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/project/scripts/fix_links.py +0 -0
  164. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/project/scripts/load.py +0 -0
  165. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/project/scripts/refresh.py +0 -0
  166. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/project/scripts/schedule.py +0 -0
  167. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/project/scripts/stack2volume.py +0 -0
  168. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/project/scripts/stop.py +0 -0
  169. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/protocol/__init__.py +0 -0
  170. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/protocol/bibtex.py +0 -0
  171. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/protocol/constants.py +0 -0
  172. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/protocol/hosts.py +0 -0
  173. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/protocol/package.py +0 -0
  174. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/protocol/params.py +0 -0
  175. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/Imagej.png +0 -0
  176. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/chimera.png +0 -0
  177. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/fa-exclamation-triangle_alert.png +0 -0
  178. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/fa-info-circle_alert.png +0 -0
  179. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/fa-search.png +0 -0
  180. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/fa-times-circle_alert.png +0 -0
  181. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/file_vol.png +0 -0
  182. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/loading.gif +0 -0
  183. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/no-image128.png +0 -0
  184. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/scipion_bn.png +0 -0
  185. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/scipion_icon.png +0 -0
  186. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/scipion_icon.svg +0 -0
  187. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/scipion_icon_proj.png +0 -0
  188. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/scipion_icon_projs.png +0 -0
  189. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/scipion_icon_prot.png +0 -0
  190. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/scipion_logo.png +0 -0
  191. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/scipion_logo_normal.png +0 -0
  192. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/scipion_logo_small.png +0 -0
  193. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/arrowDown.png +0 -0
  194. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/arrowUp.png +0 -0
  195. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/background_section.png +0 -0
  196. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/colRowModeOff.png +0 -0
  197. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/colRowModeOn.png +0 -0
  198. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/delete.png +0 -0
  199. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/doc_icon.png +0 -0
  200. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/download_icon.png +0 -0
  201. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/enabled_gallery.png +0 -0
  202. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/galleryViewOff.png +0 -0
  203. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/galleryViewOn.png +0 -0
  204. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/goto.png +0 -0
  205. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/menu.png +0 -0
  206. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/separator.png +0 -0
  207. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/tableViewOff.png +0 -0
  208. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/tableViewOn.png +0 -0
  209. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  210. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  211. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  212. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/volumeOff.png +0 -0
  213. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/showj/volumeOn.png +0 -0
  214. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/resources/wait.gif +0 -0
  215. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/tests/__init__.py +0 -0
  216. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/tests/test_utils.py +0 -0
  217. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/tests/tests.py +0 -0
  218. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/utils/__init__.py +0 -0
  219. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/utils/dataset.py +0 -0
  220. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/utils/echo.py +0 -0
  221. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/utils/graph.py +0 -0
  222. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/utils/process.py +0 -0
  223. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/utils/profiler.py +0 -0
  224. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/utils/progressbar.py +0 -0
  225. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/utils/reflection.py +0 -0
  226. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/utils/which.py +0 -0
  227. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/webservices/__init__.py +0 -0
  228. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/webservices/config.py +0 -0
  229. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/webservices/notifier.py +0 -0
  230. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/webservices/repository.py +0 -0
  231. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflow/wizard.py +0 -0
  232. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/__init__.py +0 -0
  233. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/bibtex.py +0 -0
  234. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/objects.py +0 -0
  235. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/protocols.py +0 -0
  236. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/tests/__init__.py +0 -0
  237. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/tests/test_canvas.py +0 -0
  238. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/tests/test_domain.py +0 -0
  239. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/tests/test_logs.py +0 -0
  240. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/tests/test_mappers.py +0 -0
  241. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/tests/test_project.py +0 -0
  242. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/tests/test_protocol_execution.py +0 -0
  243. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/tests/test_protocol_export.py +0 -0
  244. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/tests/test_protocol_output.py +0 -0
  245. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/pyworkflowtests/tests/test_streaming.py +0 -0
  246. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/requirements.txt +0 -0
  247. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/scipion_pyworkflow.egg-info/dependency_links.txt +0 -0
  248. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/scipion_pyworkflow.egg-info/entry_points.txt +0 -0
  249. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/scipion_pyworkflow.egg-info/requires.txt +0 -0
  250. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/scipion_pyworkflow.egg-info/top_level.txt +0 -0
  251. {scipion-pyworkflow-3.4.0 → scipion-pyworkflow-3.5.0}/setup.cfg +0 -0
  252. {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.4.0
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 a existing project to open,
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
- logger.error("Can't open project %s. It does not exist" % projPath)
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
- logger.info("usage: pw_project.py PROJECT_NAME or %s or %s or %s" % (HERE, LAST, LIST))
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 = [join('resources')]
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 (isinstance(value, str) or isinstance(value, int)) and not name.startswith('__'):
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
- return Config.debugOn()
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.4.0'
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(TextFileHandler(pwutils.Icon.JAVA_FILE), '.java')
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')
@@ -134,7 +134,7 @@ class Canvas(tk.Canvas, Scrollable):
134
134
  return self._runsFont
135
135
 
136
136
  def getImage(self, img):
137
- return gui.getImage(img, self._images)
137
+ return gui.getImage(img)
138
138
 
139
139
  def _unpostMenu(self, e=None):
140
140
  self._menu.unpost()
@@ -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 and not self.validate():
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, self._images)
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, bg=Config.SCIPION_BG_COLOR)
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', bg=Config.SCIPION_BG_COLOR)
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(('Open with %s' % v.__name__,
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
- if not os.path.isabs(imageName) and imageName not in [Icon.WAITING]:
199
- imageName = imageName.replace(".gif", ".png")
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 imageName in image_cache:
202
- return image_cache[imageName]
215
+ if imageStr in image_cache:
216
+ return image_cache[imageStr]
203
217
 
204
- if not os.path.isabs(imageName):
205
- imagePath = pw.findResource(imageName)
218
+ # If it is a definition of a sprite image
219
+ if fromSprite:
220
+ image = Sprite.getImage(imageName)
206
221
  else:
207
- imagePath = imageName
208
- image = None
209
- if imagePath:
210
- image = Image.open(imagePath)
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[imageName] = image
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
- rowheight = defaultFont.metrics()['linespace']
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, self._images, percent=percent,
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(self.generalCfg.logo.get())
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
- return [(ACTION_EDIT, single and status and expanded),
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
- (ACTION_STEPS, single and Config.debugOn() and status and expanded),
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
- (ACTION_STOP_WORKFLOW, single),
79
- (ACTION_RESET_WORKFLOW, single)
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
- ACTION_EDIT = pwutils.Message.LABEL_EDIT
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=''):