tomwer 1.1.1__py3-none-any.whl → 1.2.0a0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (353) hide show
  1. orangecontrib/tomwer/__init__.py +1 -0
  2. orangecontrib/tomwer/orange/managedprocess.py +6 -4
  3. orangecontrib/tomwer/state_summary.py +3 -2
  4. orangecontrib/tomwer/widgets/__init__.py +2 -2
  5. orangecontrib/tomwer/widgets/cluster/FutureSupervisorOW.py +9 -7
  6. orangecontrib/tomwer/widgets/cluster/SlurmClusterOW.py +6 -5
  7. orangecontrib/tomwer/widgets/control/AdvancementOW.py +2 -1
  8. orangecontrib/tomwer/widgets/control/DataDiscoveryOW.py +235 -0
  9. orangecontrib/tomwer/widgets/control/DataListOW.py +7 -5
  10. orangecontrib/tomwer/widgets/control/DataListenerOW.py +13 -14
  11. orangecontrib/tomwer/widgets/control/DataSelectorOW.py +8 -6
  12. orangecontrib/tomwer/widgets/control/DataTransfertOW.py +9 -9
  13. orangecontrib/tomwer/widgets/control/DataValidatorOW.py +7 -8
  14. orangecontrib/tomwer/widgets/control/DataWatcherOW.py +25 -17
  15. orangecontrib/tomwer/widgets/control/EDF2NXTomomillOW.py +8 -8
  16. orangecontrib/tomwer/widgets/control/FilterOW.py +9 -8
  17. orangecontrib/tomwer/widgets/control/NXTomomillMixIn.py +3 -4
  18. orangecontrib/tomwer/widgets/control/NXTomomillOW.py +13 -14
  19. orangecontrib/tomwer/widgets/control/NotifierOW.py +3 -4
  20. orangecontrib/tomwer/widgets/control/SingleTomoObjOW.py +7 -5
  21. orangecontrib/tomwer/widgets/control/TimerOW.py +6 -5
  22. orangecontrib/tomwer/widgets/control/TomoObjSerieOW.py +5 -3
  23. orangecontrib/tomwer/widgets/control/VolumeSelector.py +8 -6
  24. orangecontrib/tomwer/widgets/control/VolumeSymLinkOW.py +10 -9
  25. orangecontrib/tomwer/widgets/control/icons/datadiscover.png +0 -0
  26. orangecontrib/tomwer/widgets/control/icons/datadiscover.svg +137 -0
  27. orangecontrib/tomwer/widgets/control/icons/nxtomomill.png +0 -0
  28. orangecontrib/tomwer/widgets/control/icons/nxtomomill.svg +5 -8
  29. orangecontrib/tomwer/widgets/debugtools/DatasetGeneratorOW.py +13 -15
  30. orangecontrib/tomwer/widgets/debugtools/ObjectInspectorOW.py +3 -2
  31. orangecontrib/tomwer/widgets/edit/DarkFlatPatchOW.py +10 -7
  32. orangecontrib/tomwer/widgets/edit/ImageKeyEditorOW.py +8 -5
  33. orangecontrib/tomwer/widgets/edit/ImageKeyUpgraderOW.py +5 -2
  34. orangecontrib/tomwer/widgets/edit/NXtomoEditorOW.py +6 -3
  35. orangecontrib/tomwer/widgets/edit/test/test_dark_flat_patch.py +8 -6
  36. orangecontrib/tomwer/widgets/edit/test/test_image_key_editor.py +3 -1
  37. orangecontrib/tomwer/widgets/edit/test/test_image_key_upgrader.py +3 -1
  38. orangecontrib/tomwer/widgets/edit/test/test_nxtomo_editor.py +3 -1
  39. orangecontrib/tomwer/widgets/other/PythonScriptOW.py +11 -11
  40. orangecontrib/tomwer/widgets/reconstruction/AxisOW.py +22 -27
  41. orangecontrib/tomwer/widgets/reconstruction/CastNabuVolumeOW.py +13 -11
  42. orangecontrib/tomwer/widgets/reconstruction/DarkRefAndCopyOW.py +11 -9
  43. orangecontrib/tomwer/widgets/reconstruction/NabuOW.py +16 -14
  44. orangecontrib/tomwer/widgets/reconstruction/NabuVolumeOW.py +27 -32
  45. orangecontrib/tomwer/widgets/reconstruction/SAAxisOW.py +27 -34
  46. orangecontrib/tomwer/widgets/reconstruction/SADeltaBetaOW.py +23 -25
  47. orangecontrib/tomwer/widgets/reconstruction/SinoNormOW.py +16 -18
  48. orangecontrib/tomwer/widgets/reconstruction/TofuOW.py +9 -7
  49. orangecontrib/tomwer/widgets/reconstruction/icons/nabu_2d.png +0 -0
  50. orangecontrib/tomwer/widgets/reconstruction/icons/nabu_2d.svg +8 -11
  51. orangecontrib/tomwer/widgets/visualization/DataViewerOW.py +8 -8
  52. orangecontrib/tomwer/widgets/visualization/DiffViewerOW.py +6 -4
  53. orangecontrib/tomwer/widgets/visualization/LivesliceOW.py +4 -3
  54. orangecontrib/tomwer/widgets/visualization/NXtomoMetadataViewerOW.py +4 -3
  55. orangecontrib/tomwer/widgets/visualization/RadioStackOW.py +6 -4
  56. orangecontrib/tomwer/widgets/visualization/SampleMovedOW.py +8 -6
  57. orangecontrib/tomwer/widgets/visualization/SinogramViewerOW.py +6 -3
  58. orangecontrib/tomwer/widgets/visualization/SliceStackOW.py +7 -5
  59. orangecontrib/tomwer/widgets/visualization/VolumeViewerOW.py +5 -4
  60. tomwer/__init__.py +1 -1
  61. tomwer/__main__.py +2 -1
  62. tomwer/app/axis.py +18 -14
  63. tomwer/app/canvas.py +7 -5
  64. tomwer/app/canvas_launcher/config.py +8 -6
  65. tomwer/app/canvas_launcher/environ.py +1 -2
  66. tomwer/app/canvas_launcher/mainwindow.py +23 -22
  67. tomwer/app/canvas_launcher/splash.py +1 -0
  68. tomwer/app/canvas_launcher/widgetsscheme.py +3 -3
  69. tomwer/app/darkref.py +7 -6
  70. tomwer/app/darkrefpatch.py +8 -6
  71. tomwer/app/diffframe.py +6 -4
  72. tomwer/app/imagekeyeditor.py +10 -10
  73. tomwer/app/imagekeyupgrader.py +8 -6
  74. tomwer/app/intensitynormalization.py +8 -8
  75. tomwer/app/lamino.py +5 -3
  76. tomwer/app/nabuapp.py +8 -6
  77. tomwer/app/nxtomoeditor.py +6 -5
  78. tomwer/app/radiostack.py +8 -6
  79. tomwer/app/rsync.py +3 -3
  80. tomwer/app/saaxis.py +22 -23
  81. tomwer/app/sadeltabeta.py +21 -21
  82. tomwer/app/samplemoved.py +8 -6
  83. tomwer/app/scanviewer.py +7 -6
  84. tomwer/app/sinogramviewer.py +8 -7
  85. tomwer/app/slicestack.py +8 -6
  86. tomwer/app/stopdatalistener.py +2 -1
  87. tomwer/core/futureobject.py +15 -6
  88. tomwer/core/log/logger.py +4 -3
  89. tomwer/core/log/processlog.py +0 -1
  90. tomwer/core/process/conditions/filters.py +3 -3
  91. tomwer/core/process/control/datadiscovery.py +7 -0
  92. tomwer/core/process/control/datalistener/datalistener.py +22 -21
  93. tomwer/core/process/control/datalistener/rpcserver.py +18 -28
  94. tomwer/core/process/control/datawatcher/datawatcher.py +15 -12
  95. tomwer/core/process/control/datawatcher/datawatcherobserver.py +11 -8
  96. tomwer/core/process/control/datawatcher/datawatcherprocess.py +7 -5
  97. tomwer/core/process/control/datawatcher/edfdwprocess.py +5 -15
  98. tomwer/core/process/control/datawatcher/hdf5dwprocess.py +3 -1
  99. tomwer/core/process/control/datawatcher/status.py +2 -0
  100. tomwer/core/process/control/nxtomomill.py +7 -6
  101. tomwer/core/process/control/scanlist.py +2 -1
  102. tomwer/core/process/control/scanselector.py +1 -0
  103. tomwer/core/process/control/scantransfer.py +12 -12
  104. tomwer/core/process/control/scanvalidator.py +7 -6
  105. tomwer/core/process/control/test/test_volume_link.py +5 -4
  106. tomwer/core/process/control/timer.py +4 -4
  107. tomwer/core/process/control/volumeselector.py +1 -0
  108. tomwer/core/process/control/volumesymlink.py +8 -9
  109. tomwer/core/process/edit/darkflatpatch.py +9 -12
  110. tomwer/core/process/edit/imagekeyeditor.py +11 -13
  111. tomwer/core/process/reconstruction/axis/axis.py +36 -38
  112. tomwer/core/process/reconstruction/axis/mode.py +2 -1
  113. tomwer/core/process/reconstruction/axis/params.py +23 -28
  114. tomwer/core/process/reconstruction/darkref/darkrefs.py +23 -27
  115. tomwer/core/process/reconstruction/darkref/darkrefscopy.py +14 -18
  116. tomwer/core/process/reconstruction/darkref/params.py +3 -1
  117. tomwer/core/process/reconstruction/lamino/tofu.py +11 -15
  118. tomwer/core/process/reconstruction/nabu/castvolume.py +15 -18
  119. tomwer/core/process/reconstruction/nabu/nabucommon.py +19 -20
  120. tomwer/core/process/reconstruction/nabu/nabuscores.py +16 -14
  121. tomwer/core/process/reconstruction/nabu/nabuslices.py +27 -22
  122. tomwer/core/process/reconstruction/nabu/nabuvolume.py +20 -22
  123. tomwer/core/process/reconstruction/nabu/utils.py +17 -15
  124. tomwer/core/process/reconstruction/normalization/__init__.py +1 -3
  125. tomwer/core/process/reconstruction/normalization/normalization.py +16 -21
  126. tomwer/core/process/reconstruction/normalization/params.py +2 -2
  127. tomwer/core/process/reconstruction/saaxis/__init__.py +1 -1
  128. tomwer/core/process/reconstruction/saaxis/params.py +6 -7
  129. tomwer/core/process/reconstruction/saaxis/saaxis.py +44 -55
  130. tomwer/core/process/reconstruction/sadeltabeta/__init__.py +1 -1
  131. tomwer/core/process/reconstruction/sadeltabeta/params.py +9 -13
  132. tomwer/core/process/reconstruction/sadeltabeta/sadeltabeta.py +40 -46
  133. tomwer/core/process/reconstruction/scores/__init__.py +2 -2
  134. tomwer/core/process/reconstruction/scores/params.py +6 -9
  135. tomwer/core/process/reconstruction/scores/scores.py +10 -13
  136. tomwer/core/process/reconstruction/test/test_axis_params.py +4 -2
  137. tomwer/core/process/reconstruction/test/test_darkref.py +1 -2
  138. tomwer/core/process/reconstruction/test/test_darkref_copy.py +3 -1
  139. tomwer/core/process/reconstruction/test/test_paramsbase.py +1 -1
  140. tomwer/core/process/reconstruction/test/test_saaxis.py +11 -7
  141. tomwer/core/process/reconstruction/test/test_sadeltabeta.py +5 -4
  142. tomwer/core/process/reconstruction/test/test_utils.py +3 -2
  143. tomwer/core/process/script/python.py +6 -8
  144. tomwer/core/process/task.py +11 -12
  145. tomwer/core/process/test/test_axis.py +12 -9
  146. tomwer/core/process/test/test_conditions.py +8 -8
  147. tomwer/core/process/test/test_dark_and_flat.py +9 -8
  148. tomwer/core/process/test/test_data_listener.py +5 -3
  149. tomwer/core/process/test/test_data_transfer.py +14 -12
  150. tomwer/core/process/test/test_data_watcher.py +3 -1
  151. tomwer/core/process/test/test_lamino.py +3 -1
  152. tomwer/core/process/test/test_nabu.py +13 -12
  153. tomwer/core/process/test/test_normalization.py +7 -5
  154. tomwer/core/process/test/test_timer.py +2 -1
  155. tomwer/core/process/utils.py +9 -9
  156. tomwer/core/progress.py +3 -4
  157. tomwer/core/scan/blissscan.py +4 -2
  158. tomwer/core/scan/edfscan.py +26 -29
  159. tomwer/core/scan/futurescan.py +2 -1
  160. tomwer/core/scan/hdf5scan.py +21 -28
  161. tomwer/core/scan/scanbase.py +18 -18
  162. tomwer/core/scan/scanfactory.py +20 -21
  163. tomwer/core/scan/scantype.py +7 -0
  164. tomwer/core/scan/test/test_edf.py +2 -1
  165. tomwer/core/scan/test/test_future_scan.py +2 -1
  166. tomwer/core/scan/test/test_h5.py +5 -4
  167. tomwer/core/scan/test/test_process_registration.py +5 -3
  168. tomwer/core/scan/test/test_scan.py +11 -9
  169. tomwer/core/settings.py +1 -2
  170. tomwer/core/test/test_lamino.py +3 -2
  171. tomwer/core/test/test_scanutils.py +3 -2
  172. tomwer/core/test/test_utils.py +6 -4
  173. tomwer/core/utils/__init__.py +8 -6
  174. tomwer/core/utils/deprecation.py +2 -2
  175. tomwer/core/utils/image.py +4 -3
  176. tomwer/core/utils/locker.py +1 -1
  177. tomwer/core/utils/normalization.py +1 -0
  178. tomwer/core/utils/nxtomoutils.py +2 -1
  179. tomwer/core/utils/scanutils.py +9 -6
  180. tomwer/core/utils/slurm.py +2 -1
  181. tomwer/core/utils/time.py +2 -4
  182. tomwer/core/utils/volumeutils.py +2 -1
  183. tomwer/core/volume/__init__.py +1 -1
  184. tomwer/core/volume/edfvolume.py +4 -3
  185. tomwer/core/volume/hdf5volume.py +6 -8
  186. tomwer/core/volume/jp2kvolume.py +4 -3
  187. tomwer/core/volume/rawvolume.py +7 -7
  188. tomwer/core/volume/tiffvolume.py +8 -6
  189. tomwer/core/volume/volumebase.py +1 -0
  190. tomwer/core/volume/volumefactory.py +18 -18
  191. tomwer/gui/cluster/slurm.py +2 -0
  192. tomwer/gui/cluster/supervisor.py +4 -2
  193. tomwer/gui/cluster/test/test_cluster.py +5 -4
  194. tomwer/gui/cluster/test/test_supervisor.py +4 -2
  195. tomwer/gui/conditions/filter.py +7 -6
  196. tomwer/gui/control/actions.py +1 -0
  197. tomwer/gui/control/datadiscovery.py +168 -0
  198. tomwer/gui/control/datalist.py +29 -28
  199. tomwer/gui/control/datalistener.py +8 -4
  200. tomwer/gui/control/datareacheractions.py +2 -1
  201. tomwer/gui/control/datatransfert.py +3 -1
  202. tomwer/gui/control/datavalidator.py +11 -12
  203. tomwer/gui/control/datawatcher/configuration.py +12 -1
  204. tomwer/gui/control/datawatcher/controlwidget.py +116 -0
  205. tomwer/gui/control/datawatcher/datawatcher.py +63 -121
  206. tomwer/gui/control/datawatcher/datawatcherobserver.py +7 -9
  207. tomwer/gui/control/history.py +3 -1
  208. tomwer/gui/control/observations.py +7 -7
  209. tomwer/gui/control/scanselectorwidget.py +4 -2
  210. tomwer/gui/control/selectorwidgetbase.py +3 -1
  211. tomwer/gui/control/serie/seriecreator.py +11 -12
  212. tomwer/gui/control/singletomoobj.py +4 -4
  213. tomwer/gui/control/test/test_datadiscovery.py +27 -0
  214. tomwer/gui/control/test/test_datalist.py +7 -6
  215. tomwer/gui/control/test/test_datalistener.py +4 -4
  216. tomwer/gui/control/test/test_datavalidator.py +3 -1
  217. tomwer/gui/control/test/test_inputwidget.py +5 -4
  218. tomwer/gui/control/test/test_process_manager.py +3 -3
  219. tomwer/gui/control/test/test_scanselector.py +6 -4
  220. tomwer/gui/control/test/test_scanvalidator.py +6 -5
  221. tomwer/gui/control/test/test_single_tomo_obj.py +5 -3
  222. tomwer/gui/control/test/test_volume_dialog.py +7 -5
  223. tomwer/gui/control/test/test_volumeselector.py +8 -6
  224. tomwer/gui/control/volumeselectorwidget.py +2 -1
  225. tomwer/gui/debugtools/datasetgenerator.py +2 -1
  226. tomwer/gui/debugtools/objectinspector.py +6 -7
  227. tomwer/gui/edit/dkrfpatch.py +11 -10
  228. tomwer/gui/edit/imagekeyeditor.py +12 -12
  229. tomwer/gui/edit/nxtomoeditor.py +8 -7
  230. tomwer/gui/edit/test/test_dkrf_patch.py +10 -9
  231. tomwer/gui/edit/test/test_image_key_editor.py +8 -6
  232. tomwer/gui/edit/test/test_nx_editor.py +7 -5
  233. tomwer/gui/icons.py +3 -2
  234. tomwer/gui/illustrations.py +3 -2
  235. tomwer/gui/imagefromfile.py +3 -1
  236. tomwer/gui/qfolderdialog.py +14 -12
  237. tomwer/gui/reconstruction/axis/CompareImages.py +9 -8
  238. tomwer/gui/reconstruction/axis/__init__.py +1 -1
  239. tomwer/gui/reconstruction/axis/axis.py +9 -7
  240. tomwer/gui/reconstruction/axis/radioaxis.py +30 -32
  241. tomwer/gui/reconstruction/darkref/darkrefcopywidget.py +6 -5
  242. tomwer/gui/reconstruction/darkref/darkrefwidget.py +4 -2
  243. tomwer/gui/reconstruction/lamino/tofu/misc.py +3 -1
  244. tomwer/gui/reconstruction/lamino/tofu/projections.py +16 -8
  245. tomwer/gui/reconstruction/lamino/tofu/tofu.py +6 -3
  246. tomwer/gui/reconstruction/lamino/tofu/tofuexpert.py +5 -2
  247. tomwer/gui/reconstruction/lamino/tofu/tofuoutput.py +8 -5
  248. tomwer/gui/reconstruction/nabu/action.py +1 -0
  249. tomwer/gui/reconstruction/nabu/castvolume.py +6 -4
  250. tomwer/gui/reconstruction/nabu/check.py +3 -2
  251. tomwer/gui/reconstruction/nabu/nabuconfig/base.py +5 -2
  252. tomwer/gui/reconstruction/nabu/nabuconfig/ctf.py +6 -3
  253. tomwer/gui/reconstruction/nabu/nabuconfig/nabuconfig.py +4 -3
  254. tomwer/gui/reconstruction/nabu/nabuconfig/output.py +7 -5
  255. tomwer/gui/reconstruction/nabu/nabuconfig/phase.py +8 -6
  256. tomwer/gui/reconstruction/nabu/nabuconfig/preprocessing.py +7 -7
  257. tomwer/gui/reconstruction/nabu/nabuconfig/reconstruction.py +40 -33
  258. tomwer/gui/reconstruction/nabu/nabuflow.py +7 -4
  259. tomwer/gui/reconstruction/nabu/slices.py +14 -10
  260. tomwer/gui/reconstruction/nabu/slurm.py +1 -0
  261. tomwer/gui/reconstruction/nabu/volume.py +5 -3
  262. tomwer/gui/reconstruction/normalization/intensity.py +14 -13
  263. tomwer/gui/reconstruction/saaxis/corrangeselector.py +36 -35
  264. tomwer/gui/reconstruction/saaxis/dimensionwidget.py +5 -4
  265. tomwer/gui/reconstruction/saaxis/saaxis.py +17 -17
  266. tomwer/gui/reconstruction/saaxis/sliceselector.py +5 -5
  267. tomwer/gui/reconstruction/sadeltabeta/saadeltabeta.py +33 -36
  268. tomwer/gui/reconstruction/scores/scoreplot.py +19 -18
  269. tomwer/gui/reconstruction/test/test_axis.py +14 -13
  270. tomwer/gui/reconstruction/test/test_lamino.py +3 -2
  271. tomwer/gui/reconstruction/test/test_nabu.py +8 -6
  272. tomwer/gui/reconstruction/test/test_saaxis.py +17 -15
  273. tomwer/gui/reconstruction/test/test_sadeltabeta.py +15 -13
  274. tomwer/gui/samplemoved/__init__.py +8 -7
  275. tomwer/gui/samplemoved/selectiontable.py +4 -2
  276. tomwer/gui/stackplot.py +14 -13
  277. tomwer/gui/stacks.py +11 -9
  278. tomwer/gui/test/test_axis_gui.py +5 -4
  279. tomwer/gui/test/test_qfolder_dialog.py +2 -1
  280. tomwer/gui/utils/__init__.py +5 -5
  281. tomwer/gui/utils/buttons.py +1 -0
  282. tomwer/gui/utils/completer.py +1 -0
  283. tomwer/gui/utils/flow.py +4 -2
  284. tomwer/gui/utils/illustrations.py +1 -0
  285. tomwer/gui/utils/inputwidget.py +11 -17
  286. tomwer/gui/utils/lineselector/lineselector.py +6 -8
  287. tomwer/gui/utils/qt_utils.py +1 -0
  288. tomwer/gui/utils/scandescription.py +2 -0
  289. tomwer/gui/utils/splashscreen.py +1 -1
  290. tomwer/gui/utils/unitsystem.py +3 -1
  291. tomwer/gui/utils/vignettes.py +8 -8
  292. tomwer/gui/utils/waiterthread.py +2 -1
  293. tomwer/gui/visualization/dataviewer.py +20 -28
  294. tomwer/gui/visualization/diffviewer/diffviewer.py +17 -20
  295. tomwer/gui/visualization/diffviewer/shiftwidget.py +3 -1
  296. tomwer/gui/visualization/nxtomometadata.py +1 -0
  297. tomwer/gui/visualization/reconstructionparameters.py +13 -12
  298. tomwer/gui/visualization/scanoverview.py +5 -3
  299. tomwer/gui/visualization/sinogramviewer.py +3 -2
  300. tomwer/gui/visualization/test/test_dataviewer.py +3 -1
  301. tomwer/gui/visualization/test/test_diffviewer.py +8 -6
  302. tomwer/gui/visualization/test/test_nx_tomo_metadata_viewer.py +5 -3
  303. tomwer/gui/visualization/test/test_reconstruction_parameters.py +5 -3
  304. tomwer/gui/visualization/test/test_sinogramviewer.py +10 -9
  305. tomwer/gui/visualization/test/test_stacks.py +8 -6
  306. tomwer/gui/visualization/test/test_volumeviewer.py +10 -8
  307. tomwer/gui/visualization/tomoobjoverview.py +7 -4
  308. tomwer/gui/visualization/volumeoverview.py +5 -3
  309. tomwer/gui/visualization/volumeviewer.py +15 -14
  310. tomwer/io/utils/__init__.py +3 -3
  311. tomwer/io/utils/h5pyutils.py +2 -1
  312. tomwer/io/utils/utils.py +17 -21
  313. tomwer/resources/__init__.py +1 -1
  314. tomwer/synctools/axis.py +3 -1
  315. tomwer/synctools/darkref.py +3 -2
  316. tomwer/synctools/datalistener.py +10 -6
  317. tomwer/synctools/datatransfert.py +2 -3
  318. tomwer/synctools/imageloaderthread.py +5 -3
  319. tomwer/synctools/rsyncmanager.py +3 -2
  320. tomwer/synctools/saaxis.py +3 -1
  321. tomwer/synctools/sadeltabeta.py +3 -1
  322. tomwer/synctools/stacks/control/datalistener.py +9 -12
  323. tomwer/synctools/stacks/edit/darkflatpatch.py +13 -12
  324. tomwer/synctools/stacks/edit/imagekeyeditor.py +12 -11
  325. tomwer/synctools/stacks/processingstack.py +3 -2
  326. tomwer/synctools/stacks/reconstruction/axis.py +12 -12
  327. tomwer/synctools/stacks/reconstruction/castvolume.py +8 -5
  328. tomwer/synctools/stacks/reconstruction/dkrefcopy.py +10 -9
  329. tomwer/synctools/stacks/reconstruction/lamino.py +9 -7
  330. tomwer/synctools/stacks/reconstruction/nabu.py +18 -17
  331. tomwer/synctools/stacks/reconstruction/normalization.py +12 -16
  332. tomwer/synctools/stacks/reconstruction/saaxis.py +13 -11
  333. tomwer/synctools/stacks/reconstruction/sadeltabeta.py +16 -14
  334. tomwer/synctools/test/test_darkRefs.py +4 -3
  335. tomwer/synctools/test/test_foldertransfer.py +14 -12
  336. tomwer/synctools/test/test_scanstages.py +8 -7
  337. tomwer/synctools/utils/scanstages.py +7 -5
  338. tomwer/tests/conftest.py +4 -4
  339. tomwer/tests/test_scripts.py +3 -2
  340. tomwer/tests/utils/__init__.py +5 -4
  341. tomwer/tests/utils/utilstest.py +5 -6
  342. tomwer/third_party/nabu/preproc/phase.py +7 -5
  343. tomwer/third_party/nabu/utils.py +3 -2
  344. tomwer/utils.py +12 -12
  345. tomwer/version.py +4 -4
  346. {tomwer-1.1.1.dist-info → tomwer-1.2.0a0.dist-info}/METADATA +2 -2
  347. {tomwer-1.1.1.dist-info → tomwer-1.2.0a0.dist-info}/RECORD +353 -345
  348. /tomwer-1.1.1-py3.8-nspkg.pth → /tomwer-1.2.0a0-py3.8-nspkg.pth +0 -0
  349. {tomwer-1.1.1.dist-info → tomwer-1.2.0a0.dist-info}/LICENSE +0 -0
  350. {tomwer-1.1.1.dist-info → tomwer-1.2.0a0.dist-info}/WHEEL +0 -0
  351. {tomwer-1.1.1.dist-info → tomwer-1.2.0a0.dist-info}/entry_points.txt +0 -0
  352. {tomwer-1.1.1.dist-info → tomwer-1.2.0a0.dist-info}/namespace_packages.txt +0 -0
  353. {tomwer-1.1.1.dist-info → tomwer-1.2.0a0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,168 @@
1
+ from typing import Optional
2
+
3
+ from silx.gui import qt
4
+
5
+ from tomwer.core.scan.scantype import ScanType
6
+ from tomwer.gui.control import datareacheractions
7
+ from tomwer.gui.control.datawatcher.controlwidget import ControlWidget
8
+
9
+
10
+ class ScanDiscoveryConfigWidget(qt.QGroupBox):
11
+ sigScanTypeChanged = qt.Signal()
12
+
13
+ def __init__(self, *args, **kwargs):
14
+ super().__init__(*args, **kwargs)
15
+ self.setLayout(qt.QVBoxLayout())
16
+ self._nxtomoQRB = qt.QRadioButton(ScanType.NX_TOMO.value, parent=self)
17
+ self.layout().addWidget(self._nxtomoQRB)
18
+
19
+ self._blissQRB = qt.QRadioButton(ScanType.BLISS.value, parent=self)
20
+ self.layout().addWidget(self._blissQRB)
21
+
22
+ self._specQRB = qt.QRadioButton(ScanType.SPEC.value, parent=self)
23
+ self.layout().addWidget(self._specQRB)
24
+
25
+ # set up
26
+ self._nxtomoQRB.setChecked(True)
27
+ # connect signal / slot
28
+ self._nxtomoQRB.toggled.connect(self._configChanged)
29
+ self._blissQRB.toggled.connect(self._configChanged)
30
+ self._specQRB.toggled.connect(self._configChanged)
31
+
32
+ def _configChanged(self, *args, **kwargs):
33
+ self.sigScanTypeChanged.emit()
34
+
35
+ def getScanType(self) -> ScanType:
36
+ if self._specQRB.isChecked():
37
+ return ScanType.SPEC
38
+ elif self._blissQRB.isChecked():
39
+ return ScanType.BLISS
40
+ elif self._nxtomoQRB.isChecked():
41
+ return ScanType.NX_TOMO
42
+ else:
43
+ raise NotImplementedError
44
+
45
+ def setScanType(self, mode: ScanType):
46
+ mode = ScanType.from_value(mode)
47
+ if mode is ScanType.SPEC:
48
+ self._specQRB.setChecked(True)
49
+ elif mode is ScanType.BLISS:
50
+ self._blissQRB.setChecked(True)
51
+ elif mode is ScanType.NX_TOMO:
52
+ self._nxtomoQRB.setChecked(True)
53
+ else:
54
+ raise NotImplementedError
55
+
56
+
57
+ class _MainWidget(qt.QWidget):
58
+ sigStart = qt.Signal()
59
+
60
+ def __init__(self, parent=None) -> None:
61
+ super().__init__(parent)
62
+ self.setLayout(qt.QVBoxLayout())
63
+ self.controlWidget = ControlWidget()
64
+ self.layout().addWidget(self.controlWidget)
65
+ self.configWidget = ScanDiscoveryConfigWidget(parent=self)
66
+ self.layout().addWidget(self.configWidget)
67
+
68
+ # set up
69
+ self.configWidget.setVisible(False)
70
+ self.controlWidget.setVisible(False)
71
+ self.controlWidget._qpbstartstop.setText("start discovery")
72
+ # connect signal / slot
73
+ self.controlWidget._qpbstartstop.released.connect(self._startDiscovery)
74
+ # expose api
75
+ self.sigScanTypeChanged = self.configWidget.sigScanTypeChanged
76
+
77
+ def getConfigWindow(self):
78
+ return self.configWidget
79
+
80
+ def _startDiscovery(self):
81
+ self.sigStart.emit()
82
+
83
+ def getFolderObserved(self):
84
+ return self.controlWidget._qteFolderSelected.text()
85
+
86
+ def setFolderObserved(self, dir_):
87
+ return self.controlWidget._qteFolderSelected.setText(dir_)
88
+
89
+ def getLinuxFilePattern(self) -> Optional[str]:
90
+ text = self.controlWidget._filterQLE.text()
91
+ if text.replace(" ", "") == "":
92
+ return None
93
+ else:
94
+ return text
95
+
96
+ def setLinuxFilePattern(self, pattern: Optional[str]):
97
+ if pattern is None:
98
+ pattern = ""
99
+ self.controlWidget._filterQLE.setText(pattern)
100
+
101
+ def setSearchScanType(self, scan_type):
102
+ self.configWidget.setScanType(scan_type)
103
+
104
+ def getSearchScqnType(self):
105
+ return self.configWidget.getScanType()
106
+
107
+
108
+ class DataDiscoveryWidget(qt.QMainWindow):
109
+ sigTMStatusChanged = qt.Signal(str)
110
+ """Signal emitted when the state changed"""
111
+ sigScanReady = qt.Signal(object)
112
+ """Signal emitted when a scan is considered as ready"""
113
+ sigFolderObservedChanged = qt.Signal()
114
+ """Signal emitted when the user change the observed folder"""
115
+ sigObservationStart = qt.Signal()
116
+ """Signal emitted when the observation starts"""
117
+ sigObservationEnd = qt.Signal()
118
+ """Signal emitted when the observation end"""
119
+ sigFilterFileNamePatternChanged = qt.Signal(str)
120
+ """Signal emut when the filter pattern change"""
121
+
122
+ def __init__(self, parent=None, **kwargs) -> None:
123
+ super().__init__(parent, **kwargs)
124
+ self.setWindowFlags(qt.Qt.Widget)
125
+ self._mainWidget = _MainWidget(parent=self)
126
+ self.setCentralWidget(self.widget)
127
+ # create toolbar
128
+ toolbar = qt.QToolBar("", parent=self)
129
+ toolbar.setIconSize(qt.QSize(32, 32))
130
+ self._controlAction = datareacheractions.ControlAction(parent=self)
131
+ self._configurationAction = datareacheractions.ConfigurationAction(parent=self)
132
+ toolbar.addAction(self._controlAction)
133
+ toolbar.addAction(self._configurationAction)
134
+
135
+ self._actionGroup = qt.QActionGroup(self)
136
+ self._actionGroup.addAction(self._controlAction)
137
+ self._actionGroup.addAction(self._configurationAction)
138
+
139
+ self.addToolBar(qt.Qt.LeftToolBarArea, toolbar)
140
+ toolbar.setMovable(False)
141
+ # connect signal / slot
142
+ self._controlAction.toggled[bool].connect(
143
+ self._mainWidget.controlWidget.setVisible
144
+ )
145
+ self._configurationAction.toggled[bool].connect(
146
+ self._mainWidget.configWidget.setVisible
147
+ )
148
+ self._controlAction.setChecked(True)
149
+
150
+ def getConfiguration(self) -> dict:
151
+ return {
152
+ "start_folder": self.widget.getFolderObserved(),
153
+ "file_filter": self.widget.getLinuxFilePattern(),
154
+ "scan_type_searched": self.widget.getConfigWindow().getScanType().value,
155
+ }
156
+
157
+ def setConfiguration(self, config: dict):
158
+ if "start_folder" in config:
159
+ self.widget.setFolderObserved(config["start_folder"])
160
+ if "file_filter" in config:
161
+ self.widget.setLinuxFilePattern(config["file_filter"])
162
+ type_searched = config.get("scan_type_searched", None)
163
+ if type_searched is not None:
164
+ self.widget.getConfigWindow().setScanType(type_searched)
165
+
166
+ @property
167
+ def widget(self) -> qt.QWidget:
168
+ return self._mainWidget
@@ -30,42 +30,45 @@ __date__ = "12/07/2022"
30
30
  import logging
31
31
  import os
32
32
  from collections import OrderedDict
33
+ from typing import Any, Optional, Union
34
+
35
+ from nxtomomill import converter as nxtomomill_converter
36
+ from nxtomomill.io import generate_default_edf_config, generate_default_h5_config
37
+ from nxtomomill.io.config import TomoEDFConfig as EDFConfig
38
+ from nxtomomill.io.config import TomoHDF5Config as HDF5Config
33
39
  from silx.gui import qt
34
40
  from tomoscan.esrf.identifier.edfidentifier import EDFVolumeIdentifier
35
41
  from tomoscan.esrf.identifier.hdf5Identifier import (
36
- HDF5VolumeIdentifier,
37
42
  HDF5TomoScanIdentifier,
43
+ HDF5VolumeIdentifier,
38
44
  )
45
+ from tomoscan.esrf.identifier.jp2kidentifier import JP2KVolumeIdentifier
46
+ from tomoscan.esrf.identifier.rawidentifier import RawVolumeIdentifier
39
47
  from tomoscan.esrf.identifier.tiffidentifier import (
40
- TIFFVolumeIdentifier,
41
48
  MultiTiffVolumeIdentifier,
49
+ TIFFVolumeIdentifier,
42
50
  )
43
- from tomoscan.esrf.identifier.jp2kidentifier import JP2KVolumeIdentifier
44
- from tomoscan.esrf.identifier.rawidentifier import RawVolumeIdentifier
51
+ from tomoscan.esrf.volume.utils import guess_volumes
52
+ from tomoscan.identifier import BaseIdentifier
53
+
54
+ from tomwer.core.scan.blissscan import BlissScan
45
55
  from tomwer.core.scan.edfscan import EDFTomoScan
56
+ from tomwer.core.scan.hdf5scan import HDF5TomoScan
46
57
  from tomwer.core.scan.scanfactory import ScanFactory
47
58
  from tomwer.core.tomwer_object import TomwerObject
48
59
  from tomwer.core.volume.edfvolume import EDFVolume
49
60
  from tomwer.core.volume.hdf5volume import HDF5Volume
50
- from tomwer.core.volume.tiffvolume import MultiTIFFVolume, TIFFVolume
51
- from tomwer.core.volume.rawvolume import RawVolume
52
61
  from tomwer.core.volume.jp2kvolume import JP2KVolume
53
- from tomwer.gui.qfolderdialog import QDataDialog, QVolumeDialog
54
- from tomwer.gui.control.actions import NXTomomillParamsAction
55
- from tomwer.gui.control.actions import CFGFileActiveLabel
56
- from tomwer.gui.utils.inputwidget import EDFConfigFileSelector, HDF5ConfigFileSelector
57
- from tomwer.gui.utils.inputwidget import NXTomomillOutputDirSelector
62
+ from tomwer.core.volume.rawvolume import RawVolume
63
+ from tomwer.core.volume.tiffvolume import MultiTIFFVolume, TIFFVolume
58
64
  from tomwer.core.volume.volumefactory import VolumeFactory
59
- from tomoscan.esrf.volume.utils import guess_volumes
60
- from nxtomomill import converter as nxtomomill_converter
61
- from tomwer.core.scan.hdf5scan import HDF5TomoScan
62
- from tomwer.core.scan.blissscan import BlissScan
63
- from tomoscan.identifier import BaseIdentifier
64
- from typing import Any, Optional, Union
65
- from nxtomomill.io.config import TomoHDF5Config as HDF5Config
66
- from nxtomomill.io.config import TomoEDFConfig as EDFConfig
67
- from nxtomomill.io import generate_default_edf_config
68
- from nxtomomill.io import generate_default_h5_config
65
+ from tomwer.gui.control.actions import CFGFileActiveLabel, NXTomomillParamsAction
66
+ from tomwer.gui.qfolderdialog import QDataDialog, QVolumeDialog
67
+ from tomwer.gui.utils.inputwidget import (
68
+ EDFConfigFileSelector,
69
+ HDF5ConfigFileSelector,
70
+ NXTomomillOutputDirSelector,
71
+ )
69
72
  from tomwer.gui.utils.qt_utils import block_signals
70
73
 
71
74
  logger = logging.getLogger(__name__)
@@ -851,17 +854,15 @@ class BlissScanList(_TomwerObjectList):
851
854
 
852
855
  if HDF5TomoScan.is_nexus_nxtomo_file(data):
853
856
  text = (
854
- "The input file `{}` seems to contain `NXTomo` entries. "
857
+ f"The input file `{data}` seems to contain `NXTomo` entries. "
855
858
  "and no valid `Bliss` valid entry. \n"
856
- "This is probably not a Bliss file. Do you still want to "
857
- "translate ?".format(data)
859
+ "This is probably not a Bliss file. Do you still want to translate ?"
858
860
  )
859
861
  else:
860
862
  text = (
861
- "The input file `{}` does not seems to contain any "
863
+ f"The input file `{data}` does not seems to contain any "
862
864
  "valid `Bliss` entry. \n"
863
- "This is probably not a Bliss file. Do you still want to "
864
- "translate ?".format(data)
865
+ "This is probably not a Bliss file. Do you still want to translate ?"
865
866
  )
866
867
  msg.setText(text)
867
868
  if msg.exec_() != qt.QMessageBox.Ok:
@@ -873,7 +874,7 @@ class BlissScanList(_TomwerObjectList):
873
874
  ):
874
875
  possible_entries.append(entry)
875
876
  except Exception:
876
- logger.error("Faild to find entries for {}".format(data))
877
+ logger.error(f"Faild to find entries for {data}")
877
878
  return
878
879
  else:
879
880
  file_path = data
@@ -29,19 +29,23 @@ __date__ = "16/03/2020"
29
29
 
30
30
 
31
31
  import os
32
- import weakref
33
32
  import socket
33
+ import weakref
34
+
34
35
  from silx.gui import qt
36
+
35
37
  from tomwer.core import settings
36
38
  from tomwer.core.process.utils import LastReceivedScansDict
39
+ from tomwer.core.scan.blissscan import BlissScan
37
40
  from tomwer.gui import icons as tomwericons
38
41
  from tomwer.gui.control import datareacheractions as actions
39
42
  from tomwer.gui.control.history import ScanHistory
40
43
  from tomwer.gui.control.observations import ScanObservation
41
- from tomwer.core.scan.blissscan import BlissScan
44
+ from tomwer.gui.utils.inputwidget import (
45
+ HDF5ConfigFileSelector,
46
+ NXTomomillOutputDirSelector,
47
+ )
42
48
  from tomwer.synctools.rsyncmanager import BlissSequenceRSyncWorker
43
- from tomwer.gui.utils.inputwidget import HDF5ConfigFileSelector
44
- from tomwer.gui.utils.inputwidget import NXTomomillOutputDirSelector
45
49
 
46
50
 
47
51
  class DataListenerWidget(qt.QMainWindow):
@@ -28,9 +28,10 @@ __license__ = "MIT"
28
28
  __date__ = "18/02/2018"
29
29
 
30
30
 
31
- from tomwer.gui import icons as tomwericons
32
31
  from silx.gui import qt
33
32
 
33
+ from tomwer.gui import icons as tomwericons
34
+
34
35
 
35
36
  class HistoryAction(qt.QAction):
36
37
  """
@@ -28,9 +28,11 @@ __license__ = "MIT"
28
28
  __date__ = "08/02/2019"
29
29
 
30
30
 
31
- from silx.gui import qt
32
31
  import logging
33
32
  import os
33
+
34
+ from silx.gui import qt
35
+
34
36
  from tomwer.io.utils import get_default_directory
35
37
 
36
38
  _logger = logging.getLogger(__file__)
@@ -28,18 +28,19 @@ __license__ = "MIT"
28
28
  __date__ = "23/07/2020"
29
29
 
30
30
 
31
+ import logging
32
+ import time
33
+ import weakref
34
+ from contextlib import AbstractContextManager
35
+
31
36
  from silx.gui import qt
32
- from tomwer.gui.visualization.dataviewer import DataViewer
37
+
33
38
  from tomwer.core.process.control.scanvalidator import ScanValidator as BaseDataValidator
34
- from tomwer.gui.utils.waiterthread import QWaiterThread
35
- from tomwer.core.scan.scanbase import TomwerScanBase
36
- from tomwer.core.scan.scanbase import _TomwerBaseDock
37
- from tomwer.gui.qfolderdialog import QDataDialog
39
+ from tomwer.core.scan.scanbase import TomwerScanBase, _TomwerBaseDock
38
40
  from tomwer.core.scan.scanfactory import ScanFactory
39
- import weakref
40
- from contextlib import AbstractContextManager
41
- import logging
42
- import time
41
+ from tomwer.gui.qfolderdialog import QDataDialog
42
+ from tomwer.gui.utils.waiterthread import QWaiterThread
43
+ from tomwer.gui.visualization.dataviewer import DataViewer
43
44
 
44
45
  _logger = logging.getLogger(__file__)
45
46
 
@@ -240,9 +241,7 @@ class DataValidator(qt.QMainWindow, BaseDataValidator):
240
241
  scans = ScanFactory.create_scan_objects(scan_path=folder)
241
242
  except Exception as e:
242
243
  _logger.error(
243
- "cannot create scan instances from {}. Error is {}".format(
244
- folder, e
245
- )
244
+ f"cannot create scan instances from {folder}. Error is {e}"
246
245
  )
247
246
  else:
248
247
  for scan in scans:
@@ -29,10 +29,11 @@ __date__ = "18/02/2018"
29
29
 
30
30
 
31
31
  import functools
32
+
32
33
  from silx.gui import qt
33
34
 
34
- from tomwer.core.process.control.datawatcher.datawatcher import _DataWatcher
35
35
  from tomwer.core.process.control.datawatcher import status
36
+ from tomwer.core.process.control.datawatcher.datawatcher import _DataWatcher
36
37
 
37
38
 
38
39
  class _DWConfigurationWidget(qt.QWidget):
@@ -157,6 +158,8 @@ class _SpecEDFObservationMethodSelector(qt.QGroupBox):
157
158
  self.layout().addWidget(self._qrbXml)
158
159
  self._qrbInfo = qt.QRadioButton(status.PARSE_INFO_FILE, parent=self)
159
160
  self.layout().addWidget(self._qrbInfo)
161
+ self._qrbAnyEDF = qt.QRadioButton(status.EDF_SCAN_END, parent=self)
162
+ self.layout().addWidget(self._qrbAnyEDF)
160
163
 
161
164
  self._qwUserEntry = qt.QWidget(parent=self)
162
165
  self.layout().addWidget(self._qwUserEntry)
@@ -188,10 +191,14 @@ class _SpecEDFObservationMethodSelector(qt.QGroupBox):
188
191
  spacer.setSizePolicy(qt.QSizePolicy.Minimum, qt.QSizePolicy.Expanding)
189
192
  self.layout().addWidget(spacer)
190
193
 
194
+ # set up
195
+ self._qrbAnyEDF.hide() # by default for the DataWatcher compatibility this one is hidded
196
+
191
197
  # deal with connections
192
198
  self._qrbUserEntry.toggled.connect(self.widgetFilePtrn.setVisible)
193
199
  self._qrbXml.toggled.connect(self._selectionChanged)
194
200
  self._qrbInfo.toggled.connect(self._selectionChanged)
201
+ self._qrbAnyEDF.toggled.connect(self._selectionChanged)
195
202
  self._qrbUserEntry.toggled.connect(self._selectionChanged)
196
203
  self._qleFilePattern.editingFinished.connect(self._selectionChanged)
197
204
 
@@ -223,6 +230,8 @@ class _SpecEDFObservationMethodSelector(qt.QGroupBox):
223
230
  return (status.DET_END_XML,)
224
231
  elif self._qrbInfo.isChecked():
225
232
  return (status.PARSE_INFO_FILE,)
233
+ elif self._qrbAnyEDF.isChecked():
234
+ return (status.EDF_SCAN_END,)
226
235
  elif self._qrbUserEntry.isChecked():
227
236
  return (status.DET_END_USER_ENTRY, {"pattern": self._qleFilePattern.text()})
228
237
  else:
@@ -233,6 +242,8 @@ class _SpecEDFObservationMethodSelector(qt.QGroupBox):
233
242
  self._qrbXml.setChecked(True)
234
243
  elif mode[0] == status.PARSE_INFO_FILE:
235
244
  self._qrbInfo.setChecked(True)
245
+ elif mode[0] == status.EDF_SCAN_END:
246
+ self._qrbAnyEDF.setChecked(True)
236
247
  elif mode[0] == status.DET_END_USER_ENTRY:
237
248
  self._qrbUserEntry.setChecked(True)
238
249
  if mode[1] not in (None, ""):
@@ -0,0 +1,116 @@
1
+ import os
2
+ from tomwer.gui.qlefilesystem import QLFileSystem
3
+ from silx.gui import qt, icons as silxicons
4
+ from tomwer.io.utils import get_default_directory
5
+
6
+
7
+ class ControlWidget(qt.QWidget):
8
+ _TXT_STOP_OBS = "Stop observation"
9
+ _TXT_START_OBS = "Start observation"
10
+
11
+ def __init__(self, parent=None, **kwargs) -> None:
12
+ super().__init__(parent, **kwargs)
13
+ self.setLayout(qt.QVBoxLayout())
14
+ layout = self.layout()
15
+
16
+ self.mystatusBar = qt.QStatusBar(parent=self)
17
+ self._qlInfo = qt.QLabel(parent=self)
18
+
19
+ layout.addWidget(self._getFolderSelection())
20
+ layout.addWidget(self._qlInfo)
21
+ layout.addWidget(self._buildFilterWidget())
22
+ layout.addWidget(self._buildStartStopButton())
23
+ layout.addWidget(self.mystatusBar)
24
+
25
+ spacer = qt.QWidget(self)
26
+ spacer.setSizePolicy(qt.QSizePolicy.Minimum, qt.QSizePolicy.Expanding)
27
+ layout.addWidget(spacer)
28
+
29
+ def _getFolderSelection(self):
30
+ """
31
+ Return the widget used for the folder selection
32
+ """
33
+ widget = qt.QWidget(self)
34
+ layout = qt.QHBoxLayout()
35
+
36
+ self._qtbSelectFolder = qt.QPushButton("Select folder", parent=widget)
37
+ self._qtbSelectFolder.setAutoDefault(True)
38
+ self._qtbSelectFolder.clicked.connect(self._setFolderPath)
39
+
40
+ self._qteFolderSelected = QLFileSystem("", parent=widget)
41
+
42
+ layout.setContentsMargins(0, 0, 0, 0)
43
+ layout.setSpacing(0)
44
+
45
+ layout.addWidget(self._qteFolderSelected)
46
+ layout.addWidget(self._qtbSelectFolder)
47
+
48
+ self.animated_icon = silxicons.getWaitIcon()
49
+ self._stateLabel = qt.QLabel(parent=widget)
50
+ self.animated_icon.register(self._stateLabel)
51
+
52
+ self._stateLabel.setFixedWidth(30)
53
+ layout.addWidget(self._stateLabel)
54
+
55
+ widget.setLayout(layout)
56
+ return widget
57
+
58
+ def _buildFilterWidget(self):
59
+ widget = qt.QWidget(self)
60
+ layout = qt.QHBoxLayout()
61
+ widget.setLayout(layout)
62
+ widget.layout().addWidget(qt.QLabel("filter"))
63
+ self._filterQLE = qt.QLineEdit("", self)
64
+ self._filterQLE.setToolTip(
65
+ "You can provide a Linux Regular Expression that will insure only file fitting the expression will be discovered"
66
+ )
67
+ self._filterQLE.setPlaceholderText("*file_pattern*")
68
+ widget.layout().addWidget(self._filterQLE)
69
+
70
+ return widget
71
+
72
+ def _buildStartStopButton(self):
73
+ """
74
+ Build the start/stop button in a QHLayout with one spacer on the left
75
+ and one on the right
76
+ """
77
+ widget = qt.QWidget(self)
78
+ layout = qt.QHBoxLayout()
79
+ widget.setLayout(layout)
80
+
81
+ # left spacer
82
+ spacerL = qt.QWidget(widget)
83
+ spacerL.setSizePolicy(qt.QSizePolicy.Expanding, qt.QSizePolicy.Minimum)
84
+ layout.addWidget(spacerL)
85
+
86
+ # button
87
+ self._qpbstartstop = qt.QPushButton(self._TXT_START_OBS)
88
+ self._qpbstartstop.setAutoDefault(True)
89
+ layout.addWidget(self._qpbstartstop)
90
+
91
+ # right spacer
92
+ spacerR = qt.QWidget(widget)
93
+ spacerR.setSizePolicy(qt.QSizePolicy.Expanding, qt.QSizePolicy.Minimum)
94
+ layout.addWidget(spacerR)
95
+
96
+ return widget
97
+
98
+ def _setFolderPath(self): # pragma: no cover
99
+ """
100
+ Ask the user the path to the folder to observe
101
+ """
102
+ defaultDirectory = self.getFolderObserved()
103
+ if defaultDirectory is None or not os.path.isdir(defaultDirectory):
104
+ if os.path.isdir(self.DEFAULT_DIRECTORY):
105
+ defaultDirectory = self.DEFAULT_DIRECTORY
106
+ if defaultDirectory is None:
107
+ defaultDirectory = get_default_directory()
108
+
109
+ dialog = qt.QFileDialog(self, directory=defaultDirectory)
110
+ dialog.setFileMode(qt.QFileDialog.DirectoryOnly)
111
+
112
+ if not dialog.exec_():
113
+ dialog.close()
114
+ return
115
+
116
+ self.setFolderObserved(dialog.selectedFiles()[0])