dcscope 2.25.4__tar.gz → 2.26.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 (459) hide show
  1. {dcscope-2.25.4 → dcscope-2.26.0}/CHANGELOG +8 -0
  2. {dcscope-2.25.4/dcscope.egg-info → dcscope-2.26.0}/PKG-INFO +2 -2
  3. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/_version.py +3 -3
  4. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/analysis/ana_filter.py +122 -29
  5. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/analysis/ana_filter.ui +95 -51
  6. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/main.py +47 -2
  7. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/pipeline_plot.py +3 -3
  8. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/quick_view/qv_main.py +8 -8
  9. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/quick_view/qv_main.ui +7 -7
  10. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/quick_view/qv_scatter.py +2 -2
  11. dcscope-2.26.0/dcscope/plotting.py +45 -0
  12. {dcscope-2.25.4 → dcscope-2.26.0/dcscope.egg-info}/PKG-INFO +2 -2
  13. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope.egg-info/SOURCES.txt +2 -1
  14. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope.egg-info/requires.txt +1 -1
  15. dcscope-2.26.0/docs/scrots/Readme.md +11 -0
  16. {dcscope-2.25.4 → dcscope-2.26.0}/docs/scrots/make_scrots_qg_emodulus.py +0 -1
  17. {dcscope-2.25.4 → dcscope-2.26.0}/docs/scrots/make_scrots_qg_export.py +0 -1
  18. {dcscope-2.25.4 → dcscope-2.26.0}/docs/scrots/make_scrots_qg_statistics.py +0 -2
  19. {dcscope-2.25.4 → dcscope-2.26.0}/docs/scrots/make_scrots_ui.py +5 -9
  20. dcscope-2.26.0/docs/scrots/qg_export_data.png +0 -0
  21. dcscope-2.26.0/docs/scrots/qg_lme4_diff_init.png +0 -0
  22. dcscope-2.26.0/docs/scrots/qg_lme4_diff_results.png +0 -0
  23. dcscope-2.26.0/docs/scrots/qg_lme4_init.png +0 -0
  24. {dcscope-2.25.4 → dcscope-2.26.0}/docs/scrots/qg_lme4_results.png +0 -0
  25. dcscope-2.26.0/docs/scrots/qg_statistics_folder.png +0 -0
  26. dcscope-2.26.0/docs/scrots/qg_statistics_init.png +0 -0
  27. dcscope-2.26.0/docs/scrots/scrots.so2 +0 -0
  28. dcscope-2.26.0/docs/scrots/ui_ana_basins.png +0 -0
  29. dcscope-2.26.0/docs/scrots/ui_ana_filter.png +0 -0
  30. dcscope-2.26.0/docs/scrots/ui_ana_logs.png +0 -0
  31. dcscope-2.26.0/docs/scrots/ui_ana_meta.png +0 -0
  32. dcscope-2.26.0/docs/scrots/ui_ana_plot.png +0 -0
  33. dcscope-2.26.0/docs/scrots/ui_ana_slot.png +0 -0
  34. dcscope-2.26.0/docs/scrots/ui_ana_tables.png +0 -0
  35. dcscope-2.26.0/docs/scrots/ui_main.png +0 -0
  36. {dcscope-2.25.4 → dcscope-2.26.0}/pyproject.toml +1 -1
  37. {dcscope-2.25.4 → dcscope-2.26.0}/tests/test_gui_export_filter.py +12 -6
  38. {dcscope-2.25.4 → dcscope-2.26.0}/tests/test_gui_filter.py +8 -4
  39. {dcscope-2.25.4 → dcscope-2.26.0}/tests/test_gui_quickview.py +11 -15
  40. dcscope-2.25.4/dcscope/plot_cache.py +0 -79
  41. dcscope-2.25.4/docs/scrots/qg_export_data.png +0 -0
  42. dcscope-2.25.4/docs/scrots/qg_lme4_diff_init.png +0 -0
  43. dcscope-2.25.4/docs/scrots/qg_lme4_diff_results.png +0 -0
  44. dcscope-2.25.4/docs/scrots/qg_lme4_init.png +0 -0
  45. dcscope-2.25.4/docs/scrots/qg_statistics_folder.png +0 -0
  46. dcscope-2.25.4/docs/scrots/qg_statistics_init.png +0 -0
  47. dcscope-2.25.4/docs/scrots/scrots.so2 +0 -0
  48. dcscope-2.25.4/docs/scrots/ui_ana_basins.png +0 -0
  49. dcscope-2.25.4/docs/scrots/ui_ana_filter.png +0 -0
  50. dcscope-2.25.4/docs/scrots/ui_ana_logs.png +0 -0
  51. dcscope-2.25.4/docs/scrots/ui_ana_meta.png +0 -0
  52. dcscope-2.25.4/docs/scrots/ui_ana_plot.png +0 -0
  53. dcscope-2.25.4/docs/scrots/ui_ana_slot.png +0 -0
  54. dcscope-2.25.4/docs/scrots/ui_ana_tables.png +0 -0
  55. dcscope-2.25.4/docs/scrots/ui_main.png +0 -0
  56. {dcscope-2.25.4 → dcscope-2.26.0}/.github/workflows/check.yml +0 -0
  57. {dcscope-2.25.4 → dcscope-2.26.0}/.github/workflows/deploy_github.yml +0 -0
  58. {dcscope-2.25.4 → dcscope-2.26.0}/.github/workflows/deploy_pypi.yml +0 -0
  59. {dcscope-2.25.4 → dcscope-2.26.0}/.gitignore +0 -0
  60. {dcscope-2.25.4 → dcscope-2.26.0}/.readthedocs.yml +0 -0
  61. {dcscope-2.25.4 → dcscope-2.26.0}/LICENSE +0 -0
  62. {dcscope-2.25.4 → dcscope-2.26.0}/MANIFEST.in +0 -0
  63. {dcscope-2.25.4 → dcscope-2.26.0}/README.rst +0 -0
  64. {dcscope-2.25.4 → dcscope-2.26.0}/build-recipes/DCscope.icns +0 -0
  65. {dcscope-2.25.4 → dcscope-2.26.0}/build-recipes/DCscope.ico +0 -0
  66. {dcscope-2.25.4 → dcscope-2.26.0}/build-recipes/DCscopeLauncher.py +0 -0
  67. {dcscope-2.25.4 → dcscope-2.26.0}/build-recipes/Readme.md +0 -0
  68. {dcscope-2.25.4 → dcscope-2.26.0}/build-recipes/hook-dcscope.py +0 -0
  69. {dcscope-2.25.4 → dcscope-2.26.0}/build-recipes/macos_DCscope.spec +0 -0
  70. {dcscope-2.25.4 → dcscope-2.26.0}/build-recipes/macos_build_app.sh +0 -0
  71. {dcscope-2.25.4 → dcscope-2.26.0}/build-recipes/macos_build_requirements.txt +0 -0
  72. {dcscope-2.25.4 → dcscope-2.26.0}/build-recipes/win_DCscope.spec +0 -0
  73. {dcscope-2.25.4 → dcscope-2.26.0}/build-recipes/win_build_requirements.txt +0 -0
  74. {dcscope-2.25.4 → dcscope-2.26.0}/build-recipes/win_dcscope.iss_dummy +0 -0
  75. {dcscope-2.25.4 → dcscope-2.26.0}/build-recipes/win_make_iss.py +0 -0
  76. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/__init__.py +0 -0
  77. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/__main__.py +0 -0
  78. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/extensions.py +0 -0
  79. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/__init__.py +0 -0
  80. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/analysis/__init__.py +0 -0
  81. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/analysis/ana_basins.py +0 -0
  82. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/analysis/ana_basins.ui +0 -0
  83. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/analysis/ana_log.py +0 -0
  84. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/analysis/ana_log.ui +0 -0
  85. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/analysis/ana_meta.py +0 -0
  86. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/analysis/ana_meta.ui +0 -0
  87. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/analysis/ana_plot.py +0 -0
  88. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/analysis/ana_plot.ui +0 -0
  89. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/analysis/ana_slot.py +0 -0
  90. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/analysis/ana_slot.ui +0 -0
  91. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/analysis/ana_tables.py +0 -0
  92. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/analysis/ana_tables.ui +0 -0
  93. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/analysis/ana_view.py +0 -0
  94. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/analysis/ana_view.ui +0 -0
  95. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/analysis/dlg_slot_reorder.py +0 -0
  96. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/analysis/dlg_slot_reorder.ui +0 -0
  97. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/bulk/__init__.py +0 -0
  98. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/bulk/bulk_emodulus.py +0 -0
  99. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/bulk/bulk_emodulus.ui +0 -0
  100. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/compute/__init__.py +0 -0
  101. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/compute/comp_lme4.py +0 -0
  102. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/compute/comp_lme4.ui +0 -0
  103. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/compute/comp_lme4_dataset.py +0 -0
  104. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/compute/comp_lme4_dataset.ui +0 -0
  105. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/compute/comp_lme4_results.py +0 -0
  106. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/compute/comp_lme4_results.ui +0 -0
  107. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/compute/comp_stats.py +0 -0
  108. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/compute/comp_stats.ui +0 -0
  109. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/dcor/__init__.py +0 -0
  110. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/dcor/dcor.ui +0 -0
  111. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/export/__init__.py +0 -0
  112. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/export/e2data.py +0 -0
  113. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/export/e2data.ui +0 -0
  114. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/export/e2filter.py +0 -0
  115. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/export/e2filter.ui +0 -0
  116. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/export/e2plot.py +0 -0
  117. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/export/e2plot.ui +0 -0
  118. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/helpers.py +0 -0
  119. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/main.ui +0 -0
  120. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/matrix/Readme.md +0 -0
  121. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/matrix/__init__.py +0 -0
  122. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/matrix/block_matrix.py +0 -0
  123. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/matrix/block_matrix.ui +0 -0
  124. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/matrix/data_matrix.py +0 -0
  125. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/matrix/dm_dataset.py +0 -0
  126. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/matrix/dm_dataset.ui +0 -0
  127. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/matrix/dm_element.py +0 -0
  128. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/matrix/dm_element.ui +0 -0
  129. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/matrix/dm_filter.py +0 -0
  130. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/matrix/dm_filter.ui +0 -0
  131. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/matrix/plot_matrix.py +0 -0
  132. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/matrix/pm_element.py +0 -0
  133. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/matrix/pm_plot.py +0 -0
  134. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/matrix/pm_plot.ui +0 -0
  135. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/pipeline_plot.ui +0 -0
  136. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/preferences.py +0 -0
  137. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/preferences.ui +0 -0
  138. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/quick_view/__init__.py +0 -0
  139. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/quick_view/qv_style.css +0 -0
  140. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/settings.py +0 -0
  141. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/update.py +0 -0
  142. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/widgets/__init__.py +0 -0
  143. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/widgets/bg_thread.py +0 -0
  144. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/widgets/bulk_list.py +0 -0
  145. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/widgets/bulk_list.ui +0 -0
  146. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/widgets/double_spin_box_nan.py +0 -0
  147. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/widgets/feature_combobox.py +0 -0
  148. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/widgets/get_path.py +0 -0
  149. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/widgets/key_value_table_widget.css +0 -0
  150. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/widgets/key_value_table_widget.py +0 -0
  151. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/widgets/mdi_subwindow_wo_close.py +0 -0
  152. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/widgets/qrangeslider.py +0 -0
  153. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/widgets/rangecontrol.py +0 -0
  154. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/widgets/rangecontrol.ui +0 -0
  155. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/widgets/simple_image_view.py +0 -0
  156. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/widgets/simple_plot_widget.py +0 -0
  157. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/widgets/so_colorbaritem.py +0 -0
  158. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/gui/widgets/wait_cursor.py +0 -0
  159. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/idiom.py +0 -0
  160. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/__init__.py +0 -0
  161. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/COPYING-ICONS +0 -0
  162. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/COPYING.LIB +0 -0
  163. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/README +0 -0
  164. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/application-exit.svg +0 -0
  165. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/code-context.svg +0 -0
  166. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/dialog-cancel.svg +0 -0
  167. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/dialog-close.svg +0 -0
  168. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/dialog-messages.svg +0 -0
  169. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/dialog-ok-apply.svg +0 -0
  170. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/dialog-ok.svg +0 -0
  171. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/document-open-folder.svg +0 -0
  172. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/document-open.svg +0 -0
  173. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/document-save.svg +0 -0
  174. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/documentinfo.svg +0 -0
  175. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/draw-watercolor.svg +0 -0
  176. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/edit-clear-all.svg +0 -0
  177. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/edit-clear.svg +0 -0
  178. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/edit-paste.svg +0 -0
  179. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/globe.svg +0 -0
  180. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/gtk-preferences.svg +0 -0
  181. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/list-add.svg +0 -0
  182. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/messagebox_warning.svg +0 -0
  183. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/object-columns.svg +0 -0
  184. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/object-order-lower.svg +0 -0
  185. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/object-rows.svg +0 -0
  186. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/office-chart-line-stacked.svg +0 -0
  187. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/office-chart-ring.svg +0 -0
  188. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/office-chart-scatter.svg +0 -0
  189. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/path-mode-polyline.svg +0 -0
  190. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/preferences-activities.svg +0 -0
  191. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/remove.svg +0 -0
  192. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/search.svg +0 -0
  193. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/show-grid.svg +0 -0
  194. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/special_paste.svg +0 -0
  195. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/tools-wizard.svg +0 -0
  196. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/view-calendar-list.svg +0 -0
  197. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/view-filter.svg +0 -0
  198. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/view-list-tree.svg +0 -0
  199. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/view-statistics.svg +0 -0
  200. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/16/visibility.svg +0 -0
  201. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/application-exit.svg +0 -0
  202. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/code-context.svg +0 -0
  203. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/dialog-cancel.svg +0 -0
  204. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/dialog-close.svg +0 -0
  205. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/dialog-messages.svg +0 -0
  206. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/dialog-ok-apply.svg +0 -0
  207. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/dialog-ok.svg +0 -0
  208. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/document-open-folder.svg +0 -0
  209. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/document-open.svg +0 -0
  210. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/document-save.svg +0 -0
  211. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/documentinfo.svg +0 -0
  212. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/draw-watercolor.svg +0 -0
  213. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/edit-clear-all.svg +0 -0
  214. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/edit-clear.svg +0 -0
  215. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/edit-paste.svg +0 -0
  216. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/globe.svg +0 -0
  217. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/gtk-preferences.svg +0 -0
  218. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/list-add.svg +0 -0
  219. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/messagebox_warning.svg +0 -0
  220. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/object-columns.svg +0 -0
  221. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/object-order-lower.svg +0 -0
  222. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/object-rows.svg +0 -0
  223. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/office-chart-line-stacked.svg +0 -0
  224. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/office-chart-ring.svg +0 -0
  225. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/office-chart-scatter.svg +0 -0
  226. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/path-mode-polyline.svg +0 -0
  227. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/preferences-activities.svg +0 -0
  228. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/remove.svg +0 -0
  229. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/special_paste.svg +0 -0
  230. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/tools-wizard.svg +0 -0
  231. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/view-calendar-list.svg +0 -0
  232. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/view-filter.svg +0 -0
  233. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/view-list-tree.svg +0 -0
  234. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/view-statistics.svg +0 -0
  235. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/22/visibility.svg +0 -0
  236. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/application-exit.svg +0 -0
  237. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/code-context.svg +0 -0
  238. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/dialog-cancel.svg +0 -0
  239. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/dialog-close.svg +0 -0
  240. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/dialog-messages.svg +0 -0
  241. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/dialog-ok-apply.svg +0 -0
  242. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/dialog-ok.svg +0 -0
  243. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/document-open-folder.svg +0 -0
  244. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/document-open.svg +0 -0
  245. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/document-save.svg +0 -0
  246. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/documentinfo.svg +0 -0
  247. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/draw-watercolor.svg +0 -0
  248. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/edit-clear-all.svg +0 -0
  249. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/edit-clear.svg +0 -0
  250. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/edit-paste.svg +0 -0
  251. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/globe.svg +0 -0
  252. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/gtk-preferences.svg +0 -0
  253. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/list-add.svg +0 -0
  254. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/messagebox_warning.svg +0 -0
  255. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/object-columns.svg +0 -0
  256. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/object-order-lower.svg +0 -0
  257. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/object-rows.svg +0 -0
  258. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/office-chart-line-stacked.svg +0 -0
  259. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/office-chart-ring.svg +0 -0
  260. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/office-chart-scatter.svg +0 -0
  261. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/path-mode-polyline.svg +0 -0
  262. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/preferences-activities.svg +0 -0
  263. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/remove.svg +0 -0
  264. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/special_paste.svg +0 -0
  265. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/tools-wizard.svg +0 -0
  266. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/view-calendar-list.svg +0 -0
  267. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/view-filter.svg +0 -0
  268. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/view-list-tree.svg +0 -0
  269. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/view-statistics.svg +0 -0
  270. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/24/visibility.svg +0 -0
  271. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/32/application-exit.svg +0 -0
  272. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/32/dialog-cancel.svg +0 -0
  273. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/32/dialog-messages.svg +0 -0
  274. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/32/dialog-ok-apply.svg +0 -0
  275. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/32/dialog-ok.svg +0 -0
  276. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/32/document-open-folder.svg +0 -0
  277. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/32/document-open.svg +0 -0
  278. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/32/document-save.svg +0 -0
  279. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/32/gtk-preferences.svg +0 -0
  280. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/32/object-order-lower.svg +0 -0
  281. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/32/view-filter.svg +0 -0
  282. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/actions/32/view-list-tree.svg +0 -0
  283. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/places/16/folder-cloud.svg +0 -0
  284. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/places/16/folder.svg +0 -0
  285. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/places/22/folder-cloud.svg +0 -0
  286. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/places/22/folder.svg +0 -0
  287. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/places/24/folder-cloud.svg +0 -0
  288. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/places/24/folder.svg +0 -0
  289. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/places/32/folder-cloud.svg +0 -0
  290. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/places/32/folder.svg +0 -0
  291. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/places/64/folder-cloud.svg +0 -0
  292. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/places/64/folder.svg +0 -0
  293. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/status/16/dialog-error.svg +0 -0
  294. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/status/16/dialog-information.svg +0 -0
  295. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/status/16/dialog-question.svg +0 -0
  296. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/status/16/dialog-warning.svg +0 -0
  297. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/status/22/dialog-error.svg +0 -0
  298. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/status/22/dialog-information.svg +0 -0
  299. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/status/22/dialog-question.svg +0 -0
  300. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/status/22/dialog-warning.svg +0 -0
  301. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/status/24/dialog-error.svg +0 -0
  302. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/status/24/dialog-information.svg +0 -0
  303. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/status/24/dialog-question.svg +0 -0
  304. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/status/24/dialog-warning.svg +0 -0
  305. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/status/64/dialog-error.svg +0 -0
  306. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/status/64/dialog-information.svg +0 -0
  307. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/status/64/dialog-question.svg +0 -0
  308. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/breeze/status/64/dialog-warning.svg +0 -0
  309. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/collect_icons.py +0 -0
  310. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/dcscope/dcor.png +0 -0
  311. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/dcscope/edit-copy-anew.svg +0 -0
  312. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/dcscope/emodulus.svg +0 -0
  313. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/dcscope/filter_ray.svg +0 -0
  314. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/dcscope/region_channel.svg +0 -0
  315. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/dcscope/region_reservoir.svg +0 -0
  316. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/dcscope/rlang.svg +0 -0
  317. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/dcscope/statistical_significance.svg +0 -0
  318. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon-theme/index.theme +0 -0
  319. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/icon.png +0 -0
  320. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/img/splash.png +0 -0
  321. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/meta_tool.py +0 -0
  322. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/pipeline/__init__.py +0 -0
  323. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/pipeline/core.py +0 -0
  324. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/pipeline/dataslot.py +0 -0
  325. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/pipeline/filter.py +0 -0
  326. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/pipeline/filter_ray.py +0 -0
  327. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/pipeline/plot.py +0 -0
  328. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/session.py +0 -0
  329. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope/util.py +0 -0
  330. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope.egg-info/dependency_links.txt +0 -0
  331. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope.egg-info/entry_points.txt +0 -0
  332. {dcscope-2.25.4 → dcscope-2.26.0}/dcscope.egg-info/top_level.txt +0 -0
  333. {dcscope-2.25.4 → dcscope-2.26.0}/docs/README.md +0 -0
  334. {dcscope-2.25.4 → dcscope-2.26.0}/docs/artwork/Readme.md +0 -0
  335. {dcscope-2.25.4 → dcscope-2.26.0}/docs/artwork/dcscope_icon.svg +0 -0
  336. {dcscope-2.25.4 → dcscope-2.26.0}/docs/artwork/dcscope_large_white.png +0 -0
  337. {dcscope-2.25.4 → dcscope-2.26.0}/docs/artwork/dcscope_large_white.svg +0 -0
  338. {dcscope-2.25.4 → dcscope-2.26.0}/docs/artwork/dcscope_splash.svg +0 -0
  339. {dcscope-2.25.4 → dcscope-2.26.0}/docs/artwork/favicon.ico +0 -0
  340. {dcscope-2.25.4 → dcscope-2.26.0}/docs/artwork/favicon.svg +0 -0
  341. {dcscope-2.25.4 → dcscope-2.26.0}/docs/conf.py +0 -0
  342. {dcscope-2.25.4 → dcscope-2.26.0}/docs/data/extension_fl1_density.py +0 -0
  343. {dcscope-2.25.4 → dcscope-2.26.0}/docs/dcscope.bib +0 -0
  344. {dcscope-2.25.4 → dcscope-2.26.0}/docs/extensions/fancy_include.py +0 -0
  345. {dcscope-2.25.4 → dcscope-2.26.0}/docs/extensions/github_changelog.py +0 -0
  346. {dcscope-2.25.4 → dcscope-2.26.0}/docs/extensions/rtd_pdf.py +0 -0
  347. {dcscope-2.25.4 → dcscope-2.26.0}/docs/figures/ATTRIBUTION +0 -0
  348. {dcscope-2.25.4 → dcscope-2.26.0}/docs/figures/area.png +0 -0
  349. {dcscope-2.25.4 → dcscope-2.26.0}/docs/figures/aspect.jpg +0 -0
  350. {dcscope-2.25.4 → dcscope-2.26.0}/docs/figures/brightness.jpg +0 -0
  351. {dcscope-2.25.4 → dcscope-2.26.0}/docs/figures/deform.jpg +0 -0
  352. {dcscope-2.25.4 → dcscope-2.26.0}/docs/figures/deform.py +0 -0
  353. {dcscope-2.25.4 → dcscope-2.26.0}/docs/figures/fluorescence.jpg +0 -0
  354. {dcscope-2.25.4 → dcscope-2.26.0}/docs/figures/fluorescence.py +0 -0
  355. {dcscope-2.25.4 → dcscope-2.26.0}/docs/figures/inert_ratio.jpg +0 -0
  356. {dcscope-2.25.4 → dcscope-2.26.0}/docs/figures/inert_ratio.py +0 -0
  357. {dcscope-2.25.4 → dcscope-2.26.0}/docs/figures/qg_countrate.jpg +0 -0
  358. {dcscope-2.25.4 → dcscope-2.26.0}/docs/figures/qg_countrate.py +0 -0
  359. {dcscope-2.25.4 → dcscope-2.26.0}/docs/figures/qg_filter_area.jpg +0 -0
  360. {dcscope-2.25.4 → dcscope-2.26.0}/docs/figures/qg_filter_area.py +0 -0
  361. {dcscope-2.25.4 → dcscope-2.26.0}/docs/figures/qg_filter_porosity.jpg +0 -0
  362. {dcscope-2.25.4 → dcscope-2.26.0}/docs/figures/qg_filter_porosity.py +0 -0
  363. {dcscope-2.25.4 → dcscope-2.26.0}/docs/figures/qg_filter_ratios.jpg +0 -0
  364. {dcscope-2.25.4 → dcscope-2.26.0}/docs/figures/qg_filter_ratios.py +0 -0
  365. {dcscope-2.25.4 → dcscope-2.26.0}/docs/figures/qg_time.jpg +0 -0
  366. {dcscope-2.25.4 → dcscope-2.26.0}/docs/figures/qg_time.py +0 -0
  367. {dcscope-2.25.4 → dcscope-2.26.0}/docs/figures/qg_youngs_modulus.py +0 -0
  368. {dcscope-2.25.4 → dcscope-2.26.0}/docs/figures/qg_youngs_modulus_15um.png +0 -0
  369. {dcscope-2.25.4 → dcscope-2.26.0}/docs/figures/qg_youngs_modulus_20um.png +0 -0
  370. {dcscope-2.25.4 → dcscope-2.26.0}/docs/figures/qg_youngs_modulus_30um.png +0 -0
  371. {dcscope-2.25.4 → dcscope-2.26.0}/docs/figures/qg_youngs_modulus_40um.png +0 -0
  372. {dcscope-2.25.4 → dcscope-2.26.0}/docs/figures/rtdc-setup.jpg +0 -0
  373. {dcscope-2.25.4 → dcscope-2.26.0}/docs/figures/volume.jpg +0 -0
  374. {dcscope-2.25.4 → dcscope-2.26.0}/docs/figures/volume.py +0 -0
  375. {dcscope-2.25.4 → dcscope-2.26.0}/docs/index.rst +0 -0
  376. {dcscope-2.25.4 → dcscope-2.26.0}/docs/requirements.txt +0 -0
  377. {dcscope-2.25.4 → dcscope-2.26.0}/docs/scrots/.gitignore +0 -0
  378. {dcscope-2.25.4 → dcscope-2.26.0}/docs/scrots/CD66+_CD14-.poly +0 -0
  379. {dcscope-2.25.4 → dcscope-2.26.0}/docs/scrots/make_scrots.sh +0 -0
  380. {dcscope-2.25.4 → dcscope-2.26.0}/docs/scrots/make_scrots_qg_dcor.py +0 -0
  381. {dcscope-2.25.4 → dcscope-2.26.0}/docs/scrots/make_scrots_qg_extensions.py +0 -0
  382. {dcscope-2.25.4 → dcscope-2.26.0}/docs/scrots/make_scrots_qg_lme4.py +0 -0
  383. {dcscope-2.25.4 → dcscope-2.26.0}/docs/scrots/make_scrots_qg_lme4_diff.py +0 -0
  384. {dcscope-2.25.4 → dcscope-2.26.0}/docs/scrots/qg_dcor_dlg.png +0 -0
  385. {dcscope-2.25.4 → dcscope-2.26.0}/docs/scrots/qg_emodulus_badtemp.png +0 -0
  386. {dcscope-2.25.4 → dcscope-2.26.0}/docs/scrots/qg_emodulus_config.png +0 -0
  387. {dcscope-2.25.4 → dcscope-2.26.0}/docs/scrots/qg_emodulus_feature.png +0 -0
  388. {dcscope-2.25.4 → dcscope-2.26.0}/docs/scrots/qg_emodulus_other.png +0 -0
  389. {dcscope-2.25.4 → dcscope-2.26.0}/docs/scrots/qg_extensions.png +0 -0
  390. {dcscope-2.25.4 → dcscope-2.26.0}/docs/scrots/ui_block_matrix.png +0 -0
  391. {dcscope-2.25.4 → dcscope-2.26.0}/docs/scrots/ui_qv_event.png +0 -0
  392. {dcscope-2.25.4 → dcscope-2.26.0}/docs/scrots/ui_qv_poly.png +0 -0
  393. {dcscope-2.25.4 → dcscope-2.26.0}/docs/scrots/ui_qv_settings.png +0 -0
  394. {dcscope-2.25.4 → dcscope-2.26.0}/docs/sec_changelog.rst +0 -0
  395. {dcscope-2.25.4 → dcscope-2.26.0}/docs/sec_devs.rst +0 -0
  396. {dcscope-2.25.4 → dcscope-2.26.0}/docs/sec_getting_started.rst +0 -0
  397. {dcscope-2.25.4 → dcscope-2.26.0}/docs/sec_imprint.rst +0 -0
  398. {dcscope-2.25.4 → dcscope-2.26.0}/docs/sec_interface.rst +0 -0
  399. {dcscope-2.25.4 → dcscope-2.26.0}/docs/sec_qg_batch_stats.rst +0 -0
  400. {dcscope-2.25.4 → dcscope-2.26.0}/docs/sec_qg_consistency_check.rst +0 -0
  401. {dcscope-2.25.4 → dcscope-2.26.0}/docs/sec_qg_dcor.rst +0 -0
  402. {dcscope-2.25.4 → dcscope-2.26.0}/docs/sec_qg_export_data.rst +0 -0
  403. {dcscope-2.25.4 → dcscope-2.26.0}/docs/sec_qg_extensions.rst +0 -0
  404. {dcscope-2.25.4 → dcscope-2.26.0}/docs/sec_qg_filtering.rst +0 -0
  405. {dcscope-2.25.4 → dcscope-2.26.0}/docs/sec_qg_lme4.rst +0 -0
  406. {dcscope-2.25.4 → dcscope-2.26.0}/docs/sec_qg_youngs_modulus.rst +0 -0
  407. {dcscope-2.25.4 → dcscope-2.26.0}/docs/sec_quick_guides.rst +0 -0
  408. {dcscope-2.25.4 → dcscope-2.26.0}/docs/sec_rtdc_basics.rst +0 -0
  409. {dcscope-2.25.4 → dcscope-2.26.0}/docs/sec_z_bib.rst +0 -0
  410. {dcscope-2.25.4 → dcscope-2.26.0}/setup.cfg +0 -0
  411. {dcscope-2.25.4 → dcscope-2.26.0}/tests/README.md +0 -0
  412. {dcscope-2.25.4 → dcscope-2.26.0}/tests/conftest.py +0 -0
  413. {dcscope-2.25.4 → dcscope-2.26.0}/tests/data/artificial_with_image_bg.rtdc +0 -0
  414. {dcscope-2.25.4 → dcscope-2.26.0}/tests/data/blood_rbc_leukocytes.rtdc +0 -0
  415. {dcscope-2.25.4 → dcscope-2.26.0}/tests/data/blood_rbc_qpi_data.rtdc +0 -0
  416. {dcscope-2.25.4 → dcscope-2.26.0}/tests/data/calibration_beads_47.rtdc +0 -0
  417. {dcscope-2.25.4 → dcscope-2.26.0}/tests/data/cytoshot_blood.rtdc +0 -0
  418. {dcscope-2.25.4 → dcscope-2.26.0}/tests/data/empty_recording.rtdc +0 -0
  419. {dcscope-2.25.4 → dcscope-2.26.0}/tests/data/ext_feat_anc_plugin_ca.py +0 -0
  420. {dcscope-2.25.4 → dcscope-2.26.0}/tests/data/extreme_shear.rtdc +0 -0
  421. {dcscope-2.25.4 → dcscope-2.26.0}/tests/data/naiad-capture_blood_pipeline.rtdc +0 -0
  422. {dcscope-2.25.4 → dcscope-2.26.0}/tests/data/version_2_1_0_basic.so2 +0 -0
  423. {dcscope-2.25.4 → dcscope-2.26.0}/tests/data/version_2_1_2_plot_color_emodulus.so2 +0 -0
  424. {dcscope-2.25.4 → dcscope-2.26.0}/tests/data/version_2_1_6_no_events.so2 +0 -0
  425. {dcscope-2.25.4 → dcscope-2.26.0}/tests/data/version_2_5_0_dcor_lme4.so2 +0 -0
  426. {dcscope-2.25.4 → dcscope-2.26.0}/tests/data/version_2_5_0_dcor_lme4_diff.so2 +0 -0
  427. {dcscope-2.25.4 → dcscope-2.26.0}/tests/requirements.txt +0 -0
  428. {dcscope-2.25.4 → dcscope-2.26.0}/tests/test_extensions.py +0 -0
  429. {dcscope-2.25.4 → dcscope-2.26.0}/tests/test_gui_ana_meta.py +0 -0
  430. {dcscope-2.25.4 → dcscope-2.26.0}/tests/test_gui_basic.py +0 -0
  431. {dcscope-2.25.4 → dcscope-2.26.0}/tests/test_gui_bulk_emodulus.py +0 -0
  432. {dcscope-2.25.4 → dcscope-2.26.0}/tests/test_gui_compute_lme4.py +0 -0
  433. {dcscope-2.25.4 → dcscope-2.26.0}/tests/test_gui_compute_stats.py +0 -0
  434. {dcscope-2.25.4 → dcscope-2.26.0}/tests/test_gui_emodulus.py +0 -0
  435. {dcscope-2.25.4 → dcscope-2.26.0}/tests/test_gui_export_data.py +0 -0
  436. {dcscope-2.25.4 → dcscope-2.26.0}/tests/test_gui_export_plot.py +0 -0
  437. {dcscope-2.25.4 → dcscope-2.26.0}/tests/test_gui_matrix.py +0 -0
  438. {dcscope-2.25.4 → dcscope-2.26.0}/tests/test_gui_pipeline_plot.py +0 -0
  439. {dcscope-2.25.4 → dcscope-2.26.0}/tests/test_gui_plotting.py +0 -0
  440. {dcscope-2.25.4 → dcscope-2.26.0}/tests/test_gui_reorder_datasets.py +0 -0
  441. {dcscope-2.25.4 → dcscope-2.26.0}/tests/test_gui_update.py +0 -0
  442. {dcscope-2.25.4 → dcscope-2.26.0}/tests/test_pipeline_core.py +0 -0
  443. {dcscope-2.25.4 → dcscope-2.26.0}/tests/test_pipeline_filter_ray.py +0 -0
  444. {dcscope-2.25.4 → dcscope-2.26.0}/tests/test_session.py +0 -0
  445. {dcscope-2.25.4 → dcscope-2.26.0}/tests/test_util.py +0 -0
  446. {dcscope-2.25.4 → dcscope-2.26.0}/tests-manual/.gitignore +0 -0
  447. {dcscope-2.25.4 → dcscope-2.26.0}/tests-manual/Readme.rst +0 -0
  448. {dcscope-2.25.4 → dcscope-2.26.0}/tests-manual/plot-export.py +0 -0
  449. {dcscope-2.25.4 → dcscope-2.26.0}/tests-manual/plot-export.so2 +0 -0
  450. {dcscope-2.25.4 → dcscope-2.26.0}/tests-manual/plot-export_log-large-points-export-png_expected.png +0 -0
  451. {dcscope-2.25.4 → dcscope-2.26.0}/tests-manual/plot-export_log-large-points-export-svg_expected.svg +0 -0
  452. {dcscope-2.25.4 → dcscope-2.26.0}/tests-manual/plot-export_scatter-and-contour-export-png_expected.png +0 -0
  453. {dcscope-2.25.4 → dcscope-2.26.0}/tests-manual/plot-export_scatter-and-contour-export-svg_expected.svg +0 -0
  454. {dcscope-2.25.4 → dcscope-2.26.0}/tests-manual/plot-export_scatter-and-contour-subplot1-export-png_expected.png +0 -0
  455. {dcscope-2.25.4 → dcscope-2.26.0}/tests-manual/plot-export_scatter-and-contour-subplot1-export-svg_expected.svg +0 -0
  456. {dcscope-2.25.4 → dcscope-2.26.0}/tests-manual/plot-export_scatter-and-contour-subplot2-export-png_expected.png +0 -0
  457. {dcscope-2.25.4 → dcscope-2.26.0}/tests-manual/plot-export_scatter-and-contour-subplot2-export-svg_expected.svg +0 -0
  458. {dcscope-2.25.4 → dcscope-2.26.0}/tests-manual/plot-export_scatter-long-title-export-png_expected.png +0 -0
  459. {dcscope-2.25.4 → dcscope-2.26.0}/tests-manual/run-tests.sh +0 -0
@@ -1,3 +1,11 @@
1
+ 2.26.0
2
+ - feat: edit, duplicate and remove polygon filters in the "Filter" view
3
+ - fix: override-check in filter export did not work
4
+ - enh: enable disk caching for kernel density estimate data
5
+ - enh: bring windows to front when requesting controls via Block Matrix
6
+ - docs: update screenshots
7
+ - ref: disable caching for plots (fully done in dclab)
8
+ - setup: bump dclab to 0.69.2 (KDE caching, polygon filter stability)
1
9
  2.25.4
2
10
  - setup: bump dclab to 0.68.0 (open SWMR files in read mode)
3
11
  2.25.3
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dcscope
3
- Version: 2.25.4
3
+ Version: 2.26.0
4
4
  Summary: User interface for deformability cytometry (DC)
5
5
  Author: Benedikt Hartmann, Eoghan O'Connell, Maximilian Schlögel, Paul Müller, Raghava Alajangi
6
6
  Maintainer-email: Paul Müller <dev@craban.de>
@@ -16,7 +16,7 @@ Classifier: Intended Audience :: Science/Research
16
16
  Requires-Python: <4,>=3.9
17
17
  Description-Content-Type: text/x-rst
18
18
  License-File: LICENSE
19
- Requires-Dist: dclab[dcor,export,http,s3]>=0.68.0
19
+ Requires-Dist: dclab[dcor,export,http,s3]>=0.69.2
20
20
  Requires-Dist: h5py>=2.8.0
21
21
  Requires-Dist: numpy>=1.21
22
22
  Requires-Dist: pygments
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '2.25.4'
32
- __version_tuple__ = version_tuple = (2, 25, 4)
31
+ __version__ = version = '2.26.0'
32
+ __version_tuple__ = version_tuple = (2, 26, 0)
33
33
 
34
- __commit_id__ = commit_id = 'g568f827e5'
34
+ __commit_id__ = commit_id = 'g5867420fb'
@@ -19,6 +19,7 @@ class FilterPanel(QtWidgets.QWidget):
19
19
  """
20
20
  #: Emitted when the user wants to create a new polygon filter
21
21
  request_new_polygon_filter = QtCore.pyqtSignal()
22
+ request_edit_polygon_filter = QtCore.pyqtSignal(int)
22
23
 
23
24
  # widgets emit these whenever they changed the pipeline
24
25
  pp_mod_send = QtCore.pyqtSignal(dict)
@@ -45,6 +46,20 @@ class FilterPanel(QtWidgets.QWidget):
45
46
  self.pushButton_apply.clicked.connect(self.write_filter)
46
47
  self.pushButton_reset.clicked.connect(self.update_content)
47
48
 
49
+ # polygon buttons
50
+ self.pushButton_polygon_add.clicked.connect(
51
+ self.request_new_polygon_filter)
52
+ self.pushButton_polygon_edit.clicked.connect(
53
+ self.on_polygon_edit)
54
+ self.pushButton_polygon_duplicate.clicked.connect(
55
+ self.on_polygon_duplicate)
56
+ self.pushButton_polygon_remove.clicked.connect(
57
+ self.on_polygon_remove)
58
+
59
+ # polygon selection
60
+ self.listWidget_polygon.itemSelectionChanged.connect(
61
+ self.on_polygon_selection)
62
+
48
63
  self.comboBox_filters.currentIndexChanged.connect(self.update_content)
49
64
  self.toolButton_moreless.clicked.connect(self.on_moreless)
50
65
  self.label_box_edit.setVisible(False)
@@ -54,6 +69,7 @@ class FilterPanel(QtWidgets.QWidget):
54
69
  self.pp_mod_recv.connect(self.on_pp_mod_recv)
55
70
 
56
71
  def read_filter_state(self):
72
+ """Read filter state from UI"""
57
73
  state = {
58
74
  "filter used": self.checkBox_enable.isChecked(),
59
75
  "identifier": self.current_filter.identifier,
@@ -68,15 +84,23 @@ class FilterPanel(QtWidgets.QWidget):
68
84
  rc = self._box_range_controls[feat]
69
85
  box[feat] = rc.read_pipeline_state()
70
86
  state["box filters"] = box
87
+
71
88
  # polygon filters
89
+ state["polygon filters"] = self.read_filter_state_polygon()
90
+
91
+ return state
92
+
93
+ def read_filter_state_polygon(self):
94
+ """Read polygon filter state from UI"""
72
95
  pflist = []
73
96
  for key in self._polygon_checkboxes:
74
- if self._polygon_checkboxes[key].isChecked():
97
+ if (self._polygon_checkboxes[key].checkState()
98
+ == QtCore.Qt.CheckState.Checked):
75
99
  pflist.append(key)
76
- state["polygon filters"] = pflist
77
- return state
100
+ return pflist
78
101
 
79
102
  def write_filter_state(self, state):
103
+ """Write filter state to UI"""
80
104
  if self.current_filter.identifier != state["identifier"]:
81
105
  raise ValueError("Filter identifier mismatch!")
82
106
  self.checkBox_enable.setChecked(state["filter used"])
@@ -97,12 +121,17 @@ class FilterPanel(QtWidgets.QWidget):
97
121
  rc.reset_range()
98
122
 
99
123
  # polygon filters
100
- pflist = state["polygon filters"]
124
+ self.write_filter_state_polygon(state["polygon filters"])
125
+
126
+ def write_filter_state_polygon(self, state):
127
+ """Write polygon filter state to UI"""
101
128
  for key in self._polygon_checkboxes:
102
- if key in pflist:
103
- self._polygon_checkboxes[key].setChecked(True)
129
+ if key in state:
130
+ self._polygon_checkboxes[key].setCheckState(
131
+ QtCore.Qt.CheckState.Checked)
104
132
  else:
105
- self._polygon_checkboxes[key].setChecked(False)
133
+ self._polygon_checkboxes[key].setCheckState(
134
+ QtCore.Qt.CheckState.Unchecked)
106
135
 
107
136
  def _populate_box_filters(self):
108
137
  """Dynamically update available pipeline box filters
@@ -184,6 +213,71 @@ class FilterPanel(QtWidgets.QWidget):
184
213
  new_id = self.pipeline.duplicate_filter(filt_id)
185
214
  self.pp_mod_send.emit({"pipeline": {"filter_added": new_id}})
186
215
 
216
+ def get_polygon_filter_selection(self):
217
+ """Return selected polygon filters"""
218
+ items = self.listWidget_polygon.selectedItems()
219
+ pfs = []
220
+ pf_ids = []
221
+ for (pfid, item) in self._polygon_checkboxes.items():
222
+ if item in items:
223
+ pf_ids.append(pfid)
224
+ pfs.append(dclab.PolygonFilter.get_instance_from_id(pfid))
225
+ return pf_ids, pfs
226
+
227
+ @QtCore.pyqtSlot()
228
+ def on_polygon_selection(self):
229
+ num_selected = len(self.listWidget_polygon.selectedItems())
230
+ if num_selected == 0:
231
+ self.widget_selection.setEnabled(False)
232
+ else:
233
+ self.widget_selection.setEnabled(True)
234
+ self.pushButton_polygon_edit.setEnabled(num_selected == 1)
235
+
236
+ @QtCore.pyqtSlot()
237
+ def on_polygon_duplicate(self):
238
+ pf_ids, pfs = self.get_polygon_filter_selection()
239
+
240
+ if len(pf_ids) > 1:
241
+ button_reply = QtWidgets.QMessageBox.question(
242
+ self,
243
+ "Duplicate multiple polygon filters?",
244
+ f"Are you sure you want to duplicate {len(pf_ids)} "
245
+ f"polygon filters?")
246
+ yes = button_reply == QtWidgets.QMessageBox.StandardButton.Yes
247
+ else:
248
+ yes = True
249
+
250
+ if yes:
251
+ for pf in pfs:
252
+ pf_copy = pf.copy()
253
+ pf_copy.name = pf.name + "+"
254
+
255
+ self.update_polygon_filters()
256
+
257
+ @QtCore.pyqtSlot()
258
+ def on_polygon_edit(self):
259
+ pf_ids, _ = self.get_polygon_filter_selection()
260
+
261
+ if len(pf_ids) == 1:
262
+ self.request_edit_polygon_filter.emit(pf_ids[0])
263
+
264
+ @QtCore.pyqtSlot()
265
+ def on_polygon_remove(self):
266
+ pf_ids, pfs = self.get_polygon_filter_selection()
267
+
268
+ button_reply = QtWidgets.QMessageBox.question(
269
+ self,
270
+ "Polygon filter removal?",
271
+ "Are you sure you want to remove the following polygon "
272
+ "filters?\n" + "\n".join([f" - {pf.name}" for pf in pfs]))
273
+ yes = button_reply == QtWidgets.QMessageBox.StandardButton.Yes
274
+
275
+ if yes:
276
+ for pfid in pf_ids:
277
+ dclab.PolygonFilter.remove(pfid)
278
+
279
+ self.update_polygon_filters()
280
+
187
281
  @QtCore.pyqtSlot(dict)
188
282
  def on_pp_mod_recv(self, data):
189
283
  """We received a signal that something changed"""
@@ -312,33 +406,32 @@ class FilterPanel(QtWidgets.QWidget):
312
406
 
313
407
  def update_polygon_filters(self):
314
408
  """Update the layout containing the polygon filters"""
315
- self.verticalLayout_poly.setAlignment(QtCore.Qt.AlignmentFlag.AlignTop)
316
409
  # clear layout
317
- for ii in reversed(range(self.verticalLayout_poly.count())):
318
- item = self.verticalLayout_poly.itemAt(ii).widget()
319
- if item is not None:
320
- item.hide()
321
- item.deleteLater()
410
+ for _ in range(self.listWidget_polygon.count()):
411
+ self.listWidget_polygon.takeItem(0)
412
+
322
413
  self._polygon_checkboxes = {} # must come after getting the state
323
414
  if dclab.PolygonFilter.instances:
415
+ self.listWidget_polygon.setEnabled(True)
324
416
  for pf in dclab.PolygonFilter.instances:
325
- widget = QtWidgets.QWidget()
326
- hbox = QtWidgets.QHBoxLayout()
327
- hbox.setAlignment(QtCore.Qt.AlignmentFlag.AlignLeft)
328
- hbox.setContentsMargins(0, 0, 0, 0)
329
- chb = QtWidgets.QCheckBox()
330
- hbox.addWidget(chb)
331
- hbox.addWidget(QtWidgets.QLabel(pf.name))
332
- widget.setLayout(hbox)
333
- self.verticalLayout_poly.addWidget(widget)
334
- self._polygon_checkboxes[pf.unique_id] = chb
417
+ item = QtWidgets.QListWidgetItem(pf.name)
418
+ item.setFlags(
419
+ item.flags() | QtCore.Qt.ItemFlag.ItemIsUserCheckable)
420
+ item.setCheckState(QtCore.Qt.CheckState.Unchecked)
421
+ self.listWidget_polygon.addItem(item)
422
+ item.setToolTip(f"{pf.unique_id}: {pf.name}")
423
+ self._polygon_checkboxes[pf.unique_id] = item
335
424
  else:
336
- label = QtWidgets.QLabel("No polygon filters have been created "
337
- + "yet.")
338
- button = QtWidgets.QPushButton("Create polygon filter")
339
- button.clicked.connect(self.request_new_polygon_filter)
340
- self.verticalLayout_poly.addWidget(label)
341
- self.verticalLayout_poly.addWidget(button)
425
+ self.listWidget_polygon.addItem(
426
+ "No polygon filters have been created yet.")
427
+ self.listWidget_polygon.setEnabled(False)
428
+ self.widget_selection.setEnabled(False)
429
+
430
+ if self.current_filter is not None:
431
+ filt_id = self.current_filter.identifier
432
+ filt_index = self.pipeline.filter_ids.index(filt_id)
433
+ pflist = self.pipeline.filters[filt_index].polylist
434
+ self.write_filter_state_polygon(pflist)
342
435
 
343
436
  @QtCore.pyqtSlot()
344
437
  def write_filter(self):
@@ -6,8 +6,8 @@
6
6
  <rect>
7
7
  <x>0</x>
8
8
  <y>0</y>
9
- <width>701</width>
10
- <height>538</height>
9
+ <width>702</width>
10
+ <height>655</height>
11
11
  </rect>
12
12
  </property>
13
13
  <property name="windowTitle">
@@ -26,17 +26,17 @@
26
26
  <item>
27
27
  <widget class="QComboBox" name="comboBox_filters">
28
28
  <property name="sizeAdjustPolicy">
29
- <enum>QComboBox::AdjustToContents</enum>
29
+ <enum>QComboBox::SizeAdjustPolicy::AdjustToContents</enum>
30
30
  </property>
31
31
  </widget>
32
32
  </item>
33
33
  <item>
34
34
  <spacer name="horizontalSpacer_2">
35
35
  <property name="orientation">
36
- <enum>Qt::Horizontal</enum>
36
+ <enum>Qt::Orientation::Horizontal</enum>
37
37
  </property>
38
38
  <property name="sizeType">
39
- <enum>QSizePolicy::Expanding</enum>
39
+ <enum>QSizePolicy::Policy::Expanding</enum>
40
40
  </property>
41
41
  <property name="sizeHint" stdset="0">
42
42
  <size>
@@ -55,8 +55,7 @@
55
55
  <string>Duplicate</string>
56
56
  </property>
57
57
  <property name="icon">
58
- <iconset theme="edit-paste">
59
- <normaloff>.</normaloff>.</iconset>
58
+ <iconset theme="edit-paste"/>
60
59
  </property>
61
60
  </widget>
62
61
  </item>
@@ -69,8 +68,7 @@
69
68
  <string>Remove</string>
70
69
  </property>
71
70
  <property name="icon">
72
- <iconset theme="remove">
73
- <normaloff>.</normaloff>.</iconset>
71
+ <iconset theme="remove"/>
74
72
  </property>
75
73
  </widget>
76
74
  </item>
@@ -79,12 +77,12 @@
79
77
  <item>
80
78
  <widget class="Line" name="line">
81
79
  <property name="orientation">
82
- <enum>Qt::Horizontal</enum>
80
+ <enum>Qt::Orientation::Horizontal</enum>
83
81
  </property>
84
82
  </widget>
85
83
  </item>
86
84
  <item>
87
- <layout class="QVBoxLayout" name="verticalLayout_5">
85
+ <layout class="QVBoxLayout" name="verticalLayout_5" stretch="0,2,1,0">
88
86
  <property name="leftMargin">
89
87
  <number>9</number>
90
88
  </property>
@@ -94,7 +92,7 @@
94
92
  <item>
95
93
  <layout class="QVBoxLayout" name="verticalLayout_2">
96
94
  <property name="sizeConstraint">
97
- <enum>QLayout::SetMinimumSize</enum>
95
+ <enum>QLayout::SizeConstraint::SetMinimumSize</enum>
98
96
  </property>
99
97
  <item>
100
98
  <layout class="QHBoxLayout" name="horizontalLayout_3">
@@ -157,7 +155,7 @@
157
155
  <item>
158
156
  <spacer name="horizontalSpacer_3">
159
157
  <property name="orientation">
160
- <enum>Qt::Horizontal</enum>
158
+ <enum>Qt::Orientation::Horizontal</enum>
161
159
  </property>
162
160
  <property name="sizeHint" stdset="0">
163
161
  <size>
@@ -197,7 +195,7 @@
197
195
  </property>
198
196
  <layout class="QVBoxLayout" name="verticalLayout_3">
199
197
  <property name="sizeConstraint">
200
- <enum>QLayout::SetMaximumSize</enum>
198
+ <enum>QLayout::SizeConstraint::SetMaximumSize</enum>
201
199
  </property>
202
200
  <property name="leftMargin">
203
201
  <number>9</number>
@@ -205,16 +203,16 @@
205
203
  <item>
206
204
  <widget class="QScrollArea" name="scrollArea_box">
207
205
  <property name="frameShape">
208
- <enum>QFrame::NoFrame</enum>
206
+ <enum>QFrame::Shape::NoFrame</enum>
209
207
  </property>
210
208
  <property name="lineWidth">
211
209
  <number>0</number>
212
210
  </property>
213
211
  <property name="horizontalScrollBarPolicy">
214
- <enum>Qt::ScrollBarAlwaysOff</enum>
212
+ <enum>Qt::ScrollBarPolicy::ScrollBarAlwaysOff</enum>
215
213
  </property>
216
214
  <property name="sizeAdjustPolicy">
217
- <enum>QAbstractScrollArea::AdjustToContents</enum>
215
+ <enum>QAbstractScrollArea::SizeAdjustPolicy::AdjustToContents</enum>
218
216
  </property>
219
217
  <property name="widgetResizable">
220
218
  <bool>true</bool>
@@ -224,7 +222,7 @@
224
222
  <rect>
225
223
  <x>0</x>
226
224
  <y>0</y>
227
- <width>649</width>
225
+ <width>650</width>
228
226
  <height>68</height>
229
227
  </rect>
230
228
  </property>
@@ -265,43 +263,89 @@
265
263
  <string>Polygon filters</string>
266
264
  </property>
267
265
  <property name="alignment">
268
- <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
266
+ <set>Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop</set>
269
267
  </property>
270
- <layout class="QVBoxLayout" name="verticalLayout_4">
268
+ <layout class="QHBoxLayout" name="horizontalLayout_6">
271
269
  <property name="sizeConstraint">
272
- <enum>QLayout::SetMinimumSize</enum>
270
+ <enum>QLayout::SizeConstraint::SetMinimumSize</enum>
273
271
  </property>
274
272
  <item>
275
- <widget class="QScrollArea" name="scrollArea_poly">
276
- <property name="frameShape">
277
- <enum>QFrame::NoFrame</enum>
278
- </property>
279
- <property name="horizontalScrollBarPolicy">
280
- <enum>Qt::ScrollBarAlwaysOff</enum>
281
- </property>
282
- <property name="sizeAdjustPolicy">
283
- <enum>QAbstractScrollArea::AdjustToContents</enum>
273
+ <widget class="QListWidget" name="listWidget_polygon">
274
+ <property name="selectionMode">
275
+ <enum>QAbstractItemView::SelectionMode::ExtendedSelection</enum>
284
276
  </property>
285
- <property name="widgetResizable">
286
- <bool>true</bool>
287
- </property>
288
- <widget class="QWidget" name="scrollAreaWidgetContents_2">
289
- <property name="geometry">
290
- <rect>
291
- <x>0</x>
292
- <y>0</y>
293
- <width>649</width>
294
- <height>116</height>
295
- </rect>
296
- </property>
297
- <layout class="QVBoxLayout" name="verticalLayout_7">
298
- <item>
299
- <layout class="QVBoxLayout" name="verticalLayout_poly"/>
300
- </item>
301
- </layout>
302
- </widget>
303
277
  </widget>
304
278
  </item>
279
+ <item>
280
+ <layout class="QVBoxLayout" name="verticalLayout_7">
281
+ <item>
282
+ <widget class="QPushButton" name="pushButton_polygon_add">
283
+ <property name="text">
284
+ <string>Create</string>
285
+ </property>
286
+ </widget>
287
+ </item>
288
+ <item>
289
+ <widget class="QWidget" name="widget_selection" native="true">
290
+ <layout class="QVBoxLayout" name="verticalLayout_4">
291
+ <property name="leftMargin">
292
+ <number>0</number>
293
+ </property>
294
+ <property name="topMargin">
295
+ <number>0</number>
296
+ </property>
297
+ <property name="rightMargin">
298
+ <number>0</number>
299
+ </property>
300
+ <property name="bottomMargin">
301
+ <number>0</number>
302
+ </property>
303
+ <item>
304
+ <widget class="QLabel" name="label_3">
305
+ <property name="text">
306
+ <string>Selection</string>
307
+ </property>
308
+ </widget>
309
+ </item>
310
+ <item>
311
+ <widget class="QPushButton" name="pushButton_polygon_edit">
312
+ <property name="text">
313
+ <string>Edit/View</string>
314
+ </property>
315
+ </widget>
316
+ </item>
317
+ <item>
318
+ <widget class="QPushButton" name="pushButton_polygon_duplicate">
319
+ <property name="text">
320
+ <string>Duplicate</string>
321
+ </property>
322
+ </widget>
323
+ </item>
324
+ <item>
325
+ <widget class="QPushButton" name="pushButton_polygon_remove">
326
+ <property name="text">
327
+ <string>Remove</string>
328
+ </property>
329
+ </widget>
330
+ </item>
331
+ </layout>
332
+ </widget>
333
+ </item>
334
+ <item>
335
+ <spacer name="verticalSpacer">
336
+ <property name="orientation">
337
+ <enum>Qt::Orientation::Vertical</enum>
338
+ </property>
339
+ <property name="sizeHint" stdset="0">
340
+ <size>
341
+ <width>20</width>
342
+ <height>0</height>
343
+ </size>
344
+ </property>
345
+ </spacer>
346
+ </item>
347
+ </layout>
348
+ </item>
305
349
  </layout>
306
350
  </widget>
307
351
  </item>
@@ -313,7 +357,7 @@
313
357
  <item>
314
358
  <spacer name="horizontalSpacer_4">
315
359
  <property name="orientation">
316
- <enum>Qt::Horizontal</enum>
360
+ <enum>Qt::Orientation::Horizontal</enum>
317
361
  </property>
318
362
  <property name="sizeHint" stdset="0">
319
363
  <size>
@@ -333,10 +377,10 @@
333
377
  <item>
334
378
  <spacer name="horizontalSpacer_5">
335
379
  <property name="orientation">
336
- <enum>Qt::Horizontal</enum>
380
+ <enum>Qt::Orientation::Horizontal</enum>
337
381
  </property>
338
382
  <property name="sizeType">
339
- <enum>QSizePolicy::Fixed</enum>
383
+ <enum>QSizePolicy::Policy::Fixed</enum>
340
384
  </property>
341
385
  <property name="sizeHint" stdset="0">
342
386
  <size>
@@ -10,6 +10,7 @@ import webbrowser
10
10
 
11
11
  import dclab
12
12
  from dclab.lme4 import rsetup
13
+ from dclab import cached
13
14
  import h5py
14
15
  import numpy
15
16
  import scipy
@@ -117,6 +118,16 @@ class DCscope(QtWidgets.QMainWindow):
117
118
  dclab.rtdc_dataset.fmt_s3.S3_SECRET_ACCESS_KEY = \
118
119
  s3_secret_access_key
119
120
 
121
+ # setup memory and disk caching
122
+ cache_path = pathlib.Path(
123
+ QStandardPaths.writableLocation(
124
+ QStandardPaths.StandardLocation.CacheLocation))
125
+ store_keeper = cached.StoreKeeper.get_instance()
126
+ store_keeper.set_disk_store_path(cache_path)
127
+ store_keeper.set_interval(30)
128
+ store_keeper.set_disk_store_size_bytes(1024**3)
129
+ store_keeper.set_memory_store_size(200)
130
+
120
131
  #: Extensions
121
132
  store_path = pathlib.Path(
122
133
  QStandardPaths.writableLocation(
@@ -212,6 +223,8 @@ class DCscope(QtWidgets.QMainWindow):
212
223
  # polygon filter creation
213
224
  self.widget_ana_view.widget_filter.request_new_polygon_filter.connect(
214
225
  self.on_new_polygon_filter)
226
+ self.widget_ana_view.widget_filter.request_edit_polygon_filter.connect(
227
+ self.on_edit_polygon_filter)
215
228
 
216
229
  # Top of the pipeline modification hierarchy
217
230
  self.pp_mod_send.connect(self.on_pp_mod_recv)
@@ -630,13 +643,14 @@ class DCscope(QtWidgets.QMainWindow):
630
643
  + "\n".join([str(p) for p in list(set(double_paths))])
631
644
  )
632
645
  if existing_paths:
633
- resp = QtWidgets.QMessageBox.question(
646
+ button_reply = QtWidgets.QMessageBox.question(
634
647
  self,
635
648
  "Override existing files?",
636
649
  "The following files already exist, override?\n\n"
637
650
  + "\n".join([str(p) for p in existing_paths])
638
651
  )
639
- if resp:
652
+ yes = button_reply == QtWidgets.QMessageBox.StandardButton.Yes
653
+ if yes:
640
654
  # if the user agrees, these files will be overridden
641
655
  existing_paths.clear()
642
656
  for path in filt_dict:
@@ -785,6 +799,7 @@ class DCscope(QtWidgets.QMainWindow):
785
799
 
786
800
  @QtCore.pyqtSlot()
787
801
  def on_new_polygon_filter(self):
802
+ """Create a new polygon filter"""
788
803
  if not self.pipeline.slots:
789
804
  msg = QtWidgets.QMessageBox()
790
805
  msg.setIcon(QtWidgets.QMessageBox.Icon.Critical)
@@ -793,6 +808,7 @@ class DCscope(QtWidgets.QMainWindow):
793
808
  msg.exec()
794
809
  else:
795
810
  self.toolButton_quick_view.setChecked(True)
811
+ self.mdiArea.setActiveSubWindow(self.subwindows["quick_view"])
796
812
  if not self.widget_quick_view.current_pipeline_element:
797
813
  # select the first item in the pipeline
798
814
  self.pp_mod_send.emit({"quickview": {
@@ -802,13 +818,39 @@ class DCscope(QtWidgets.QMainWindow):
802
818
  "filt_id": self.pipeline.filter_ids[0],
803
819
  }})
804
820
 
821
+ # adjusts QuickView size correctly
822
+ self.widget_quick_view.on_tool()
805
823
  self.widget_quick_view.on_poly_create()
824
+
825
+ @QtCore.pyqtSlot(int)
826
+ def on_edit_polygon_filter(self, polygon_filter_id):
827
+ """Edit a polygon filter"""
828
+ if not self.pipeline.slots:
829
+ msg = QtWidgets.QMessageBox()
830
+ msg.setIcon(QtWidgets.QMessageBox.Icon.Critical)
831
+ msg.setText("A dataset is required for editing a polygon filter!")
832
+ msg.setWindowTitle("No dataset loaded")
833
+ msg.exec()
834
+ else:
835
+ self.toolButton_quick_view.setChecked(True)
836
+ self.mdiArea.setActiveSubWindow(self.subwindows["quick_view"])
837
+ if not self.widget_quick_view.current_pipeline_element:
838
+ # select the first item in the pipeline
839
+ self.pp_mod_send.emit({"quickview": {
840
+ "slot_index": 0,
841
+ "filt_index": 0,
842
+ "slot_id": self.pipeline.slot_ids[0],
843
+ "filt_id": self.pipeline.filter_ids[0],
844
+ }})
845
+
806
846
  # adjusts QuickView size correctly
807
847
  self.widget_quick_view.on_tool()
848
+ self.widget_quick_view.on_poly_modify(polygon_filter_id)
808
849
 
809
850
  @widgets.show_wait_cursor
810
851
  @QtCore.pyqtSlot(str)
811
852
  def on_modify_filter(self, filt_id):
853
+ self.mdiArea.setActiveSubWindow(self.subwindows["analysis_view"])
812
854
  self.widget_ana_view.tabWidget.setCurrentWidget(
813
855
  self.widget_ana_view.tab_filter)
814
856
  self.widget_ana_view.widget_filter.show_filter(filt_id)
@@ -822,6 +864,7 @@ class DCscope(QtWidgets.QMainWindow):
822
864
  @widgets.show_wait_cursor
823
865
  @QtCore.pyqtSlot(str)
824
866
  def on_modify_plot(self, plot_id):
867
+ self.mdiArea.setActiveSubWindow(self.subwindows["analysis_view"])
825
868
  self.widget_ana_view.tabWidget.setCurrentWidget(
826
869
  self.widget_ana_view.tab_plot)
827
870
  self.widget_ana_view.widget_plot.show_plot(plot_id)
@@ -835,6 +878,7 @@ class DCscope(QtWidgets.QMainWindow):
835
878
  @widgets.show_wait_cursor
836
879
  @QtCore.pyqtSlot(str)
837
880
  def on_modify_slot(self, slot_id):
881
+ self.mdiArea.setActiveSubWindow(self.subwindows["analysis_view"])
838
882
  self.widget_ana_view.tabWidget.setCurrentWidget(
839
883
  self.widget_ana_view.tab_slot)
840
884
  self.widget_ana_view.widget_slot.show_slot(slot_id)
@@ -880,6 +924,7 @@ class DCscope(QtWidgets.QMainWindow):
880
924
  if not self.subwindows["quick_view"].isVisible():
881
925
  self.toolButton_quick_view.setChecked(True)
882
926
  self.subwindows["quick_view"].setVisible(True)
927
+ self.mdiArea.setActiveSubWindow(self.subwindows["quick_view"])
883
928
 
884
929
  # Send new signal to all receivers
885
930
  self.pp_mod_recv.emit(data)
@@ -10,7 +10,7 @@ from pyqtgraph import exporters
10
10
  from pyqtgraph.graphicsItems.GradientEditorItem import Gradients
11
11
 
12
12
 
13
- from .. import plot_cache
13
+ from .. import plotting
14
14
  from .. import util
15
15
  from .widgets import DCscopeColorBarItem
16
16
 
@@ -603,7 +603,7 @@ def add_scatter(plot_item, plot_state, rtdc_ds, slot_state, hash_flag):
603
603
  else:
604
604
  kde_type = "none"
605
605
 
606
- x, y, kde, idx = plot_cache.get_scatter_data(
606
+ x, y, kde, idx = plotting.get_scatter_data(
607
607
  rtdc_ds=rtdc_ds,
608
608
  downsample=sca["downsample"] * sca["downsampling value"],
609
609
  xax=gen["axis x"],
@@ -674,7 +674,7 @@ def add_scatter(plot_item, plot_state, rtdc_ds, slot_state, hash_flag):
674
674
  def compute_contours(plot_state, rtdc_ds):
675
675
  gen = plot_state["general"]
676
676
  con = plot_state["contour"]
677
- contours = plot_cache.get_contour_data(
677
+ contours = plotting.get_contour_lines(
678
678
  rtdc_ds=rtdc_ds,
679
679
  xax=gen["axis x"],
680
680
  yax=gen["axis y"],