melage 0.0.65__py3-none-any.whl → 1.0.0__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 (661) hide show
  1. assets/copyright.png +0 -0
  2. assets/resource/color/FreeSurferColorLUT.txt +2006 -0
  3. assets/resource/color/LUT_30.txt +31 -0
  4. assets/resource/color/SynthSeg.txt +34 -0
  5. assets/resource/color/lut_prostate.txt +20 -0
  6. assets/resource/horizontalview.png +0 -0
  7. assets/resource/main.ico +0 -0
  8. assets/resource/theme/create_ticks.py +85 -0
  9. assets/resource/theme/rc/checkbox_checked.png +0 -0
  10. assets/resource/theme/rc/checkbox_checked@2x.png +0 -0
  11. assets/resource/theme/rc/checkbox_checked_disabled.png +0 -0
  12. assets/resource/theme/rc/checkbox_checked_disabled@2x.png +0 -0
  13. assets/resource/theme/rc/checkbox_checked_focus.png +0 -0
  14. assets/resource/theme/rc/checkbox_checked_focus@2x.png +0 -0
  15. assets/resource/theme/rc/checkbox_checked_pressed.png +0 -0
  16. assets/resource/theme/rc/checkbox_checked_pressed@2x.png +0 -0
  17. assets/resource/theme/rc/checkbox_indeterminate.png +0 -0
  18. assets/resource/theme/rc/checkbox_indeterminate@2x.png +0 -0
  19. assets/resource/theme/rc/checkbox_indeterminate_disabled.png +0 -0
  20. assets/resource/theme/rc/checkbox_indeterminate_disabled@2x.png +0 -0
  21. assets/resource/theme/rc/checkbox_indeterminate_focus.png +0 -0
  22. assets/resource/theme/rc/checkbox_indeterminate_focus@2x.png +0 -0
  23. assets/resource/theme/rc/checkbox_indeterminate_pressed.png +0 -0
  24. assets/resource/theme/rc/checkbox_indeterminate_pressed@2x.png +0 -0
  25. assets/resource/theme/rc/checkbox_unchecked.png +0 -0
  26. assets/resource/theme/rc/checkbox_unchecked@2x.png +0 -0
  27. assets/resource/theme/rc/checkbox_unchecked_disabled.png +0 -0
  28. assets/resource/theme/rc/checkbox_unchecked_disabled@2x.png +0 -0
  29. assets/resource/theme/rc/checkbox_unchecked_focus.png +0 -0
  30. assets/resource/theme/rc/checkbox_unchecked_focus@2x.png +0 -0
  31. assets/resource/theme/rc/checkbox_unchecked_pressed.png +0 -0
  32. assets/resource/theme/rc/checkbox_unchecked_pressed@2x.png +0 -0
  33. assets/resource/verticalview.png +0 -0
  34. assets/resource/zoom_in.png +0 -0
  35. assets/resource/zoom_neutral (copy).png +0 -0
  36. assets/resource/zoom_neutral.png +0 -0
  37. assets/resource/zoom_out.png +0 -0
  38. data/MNI/mni_icbm152_t1_tal_nlin_sym_09a.nii +0 -0
  39. data/MNI/mni_icbm152_t1_tal_nlin_sym_09a_masked.nii.gz +0 -0
  40. data/MNI/mni_icbm152_t1_tal_nlin_sym_09a_seg.nii.gz +0 -0
  41. docs/manual_images/3D_rightc.png +0 -0
  42. docs/manual_images/3D_rightc_goto.png +0 -0
  43. docs/manual_images/3D_rightc_paint.png +0 -0
  44. docs/manual_images/3D_rightc_paint_draw1.png +0 -0
  45. docs/manual_images/3D_rightc_paint_draw2.png +0 -0
  46. docs/manual_images/3D_rightc_paint_render.png +0 -0
  47. docs/manual_images/3D_rightc_paint_render2.png +0 -0
  48. docs/manual_images/3D_rightc_paint_render3.png +0 -0
  49. docs/manual_images/3D_rightc_paint_render4.png +0 -0
  50. docs/manual_images/3D_rightc_paint_render5.png +0 -0
  51. docs/manual_images/3D_rightc_paint_render6.png +0 -0
  52. docs/manual_images/3D_rightc_seg.png +0 -0
  53. docs/manual_images/exit_toolbar.png +0 -0
  54. docs/manual_images/load_image_file.png +0 -0
  55. docs/manual_images/load_image_file_openp.png +0 -0
  56. docs/manual_images/main_page.png +0 -0
  57. docs/manual_images/menu_file.png +0 -0
  58. docs/manual_images/menu_file_export.png +0 -0
  59. docs/manual_images/menu_file_import.png +0 -0
  60. docs/manual_images/menu_file_settings.png +0 -0
  61. docs/manual_images/menu_file_ss.png +0 -0
  62. docs/manual_images/open_save_load.png +0 -0
  63. docs/manual_images/panning_toolbar.png +0 -0
  64. docs/manual_images/segmentation_toolbar.png +0 -0
  65. docs/manual_images/tab_mri.png +0 -0
  66. docs/manual_images/tab_us.png +0 -0
  67. docs/manual_images/tabs.png +0 -0
  68. docs/manual_images/toolbar_tools.png +0 -0
  69. docs/manual_images/tools_basic.png +0 -0
  70. docs/manual_images/tools_bet.png +0 -0
  71. docs/manual_images/tools_cs.png +0 -0
  72. docs/manual_images/tools_deepbet.png +0 -0
  73. docs/manual_images/tools_imageinfo.png +0 -0
  74. docs/manual_images/tools_maskO.png +0 -0
  75. docs/manual_images/tools_masking.png +0 -0
  76. docs/manual_images/tools_n4b.png +0 -0
  77. docs/manual_images/tools_resize.png +0 -0
  78. docs/manual_images/tools_ruler.png +0 -0
  79. docs/manual_images/tools_seg.png +0 -0
  80. docs/manual_images/tools_threshold.png +0 -0
  81. docs/manual_images/tools_tools.png +0 -0
  82. docs/manual_images/widget_color.png +0 -0
  83. docs/manual_images/widget_color_add.png +0 -0
  84. docs/manual_images/widget_color_add2.png +0 -0
  85. docs/manual_images/widget_color_additional.png +0 -0
  86. docs/manual_images/widget_images.png +0 -0
  87. docs/manual_images/widget_images2.png +0 -0
  88. docs/manual_images/widget_images3.png +0 -0
  89. docs/manual_images/widget_marker.png +0 -0
  90. docs/manual_images/widget_mri.png +0 -0
  91. docs/manual_images/widget_mri2.png +0 -0
  92. docs/manual_images/widget_segintensity.png +0 -0
  93. docs/manual_images/widget_tab_mutualview.png +0 -0
  94. docs/manual_images/widget_tab_mutualview2.png +0 -0
  95. docs/manual_images/widget_table.png +0 -0
  96. docs/manual_images/widget_table2.png +0 -0
  97. docs/manual_images/widget_us.png +0 -0
  98. melage/__init__.py +1 -1
  99. melage/config/__init__.py +100 -0
  100. melage/core/Registration/registration.py +54 -0
  101. melage/{utils/readData.py → core/io.py} +12 -4
  102. melage/{widgets/melageAbout.py → dialogs/AboutDialog.py} +1 -1
  103. melage/dialogs/MaskOperationsDialog.py +146 -0
  104. melage/dialogs/MaskingDialog.py +139 -0
  105. melage/dialogs/RegistrationDialog.py +311 -0
  106. melage/{widgets/ImageThresholding.py → dialogs/ThresholdingDialog.py} +2 -2
  107. melage/dialogs/TransformationDialog.py +275 -0
  108. melage/dialogs/__init__.py +9 -0
  109. melage/dialogs/dynamic_gui.py +327 -0
  110. melage/{widgets/fileDialog_widget.py → dialogs/helpers/FileDialog.py} +226 -1
  111. melage/dialogs/helpers/__init__.py +5 -0
  112. melage/main.py +13 -13
  113. melage/{widgets/mainwindow_widget.py → mainwindow_widget.py} +1434 -1408
  114. melage/plugins/N4_bias/N4.py +115 -0
  115. melage/plugins/N4_bias/N4_schema.py +40 -0
  116. melage/plugins/N4_bias/main/utils.py +46 -0
  117. melage/plugins/__init__.py +2 -0
  118. melage/plugins/bet/bet.py +176 -0
  119. melage/plugins/bet/bet_schema.py +73 -0
  120. melage/{widgets/brain_extraction.py → plugins/bet/main/BET.py} +51 -316
  121. melage/plugins/change_coord/change_coord.py +197 -0
  122. melage/plugins/change_coord/change_coord_schema.py +31 -0
  123. melage/plugins/change_coord/main/utils.py +15 -0
  124. melage/{widgets/Segmentation → plugins/esfcm/main}/FCM.py +3 -5
  125. melage/plugins/esfcm/main/test.py +57 -0
  126. melage/{widgets/Segmentation → plugins/esfcm/main}/utils.py +20 -0
  127. melage/plugins/esfcm/tissue_segmentation.py +124 -0
  128. melage/plugins/esfcm/tissue_segmentation_schema.py +33 -0
  129. melage/plugins/masking_operation/mo.py +115 -0
  130. melage/plugins/masking_operation/mo_schema.py +33 -0
  131. melage/plugins/mga_net/MGA_Net.py +145 -0
  132. melage/plugins/mga_net/MGA_Net_schema.py +29 -0
  133. melage/plugins/mga_net/main/figures/Network.txt +1 -0
  134. melage/{widgets/DeepLModels/new_unet.py → plugins/mga_net/main/model/mga_net.py} +3 -3
  135. melage/plugins/mga_net/main/model/utils.py +258 -0
  136. melage/plugins/mga_net/main/test_mgaNet.py +134 -0
  137. melage/plugins/resize/resize.py +136 -0
  138. melage/plugins/resize/resize_schema.py +41 -0
  139. melage/plugins/ui_helpers.py +144 -0
  140. melage/plugins/warpseg/WarpSeg.py +195 -0
  141. melage/plugins/warpseg/WarpSeg_schema.py +41 -0
  142. melage/plugins/warpseg/__init__.py +2 -0
  143. melage/plugins/warpseg/warpseg_main/data_reader/DDSet.py +303 -0
  144. melage/plugins/warpseg/warpseg_main/data_reader/DDSetSeg.py +279 -0
  145. melage/plugins/warpseg/warpseg_main/data_reader/__init__.py +60 -0
  146. melage/plugins/warpseg/warpseg_main/data_reader/baseData.py +18 -0
  147. melage/plugins/warpseg/warpseg_main/data_reader/utils.py +267 -0
  148. melage/plugins/warpseg/warpseg_main/dist_utils.py +18 -0
  149. melage/plugins/warpseg/warpseg_main/requirements.txt +10 -0
  150. melage/plugins/warpseg/warpseg_main/test.py +272 -0
  151. melage/plugins/warpseg/warpseg_main/train.py +432 -0
  152. melage/plugins/warpseg/warpseg_main/train_reg.py +373 -0
  153. melage/plugins/warpseg/warpseg_main/verify_post_process.py +73 -0
  154. melage/plugins/warpseg/warpseg_main/voxelmorph/__init__.py +45 -0
  155. melage/plugins/warpseg/warpseg_main/voxelmorph/py/__init__.py +1 -0
  156. melage/plugins/warpseg/warpseg_main/voxelmorph/py/utils.py +99 -0
  157. melage/{widgets/Synthstrip.py → plugins/warpseg/warpseg_main/voxelmorph/torch/Unet.py} +71 -51
  158. melage/plugins/warpseg/warpseg_main/voxelmorph/torch/__init__.py +4 -0
  159. melage/plugins/warpseg/warpseg_main/voxelmorph/torch/layers.py +97 -0
  160. melage/plugins/warpseg/warpseg_main/voxelmorph/torch/losses.py +462 -0
  161. melage/plugins/warpseg/warpseg_main/voxelmorph/torch/modelio.py +77 -0
  162. melage/{widgets/DeepLModels/InfantSegment/Unet.py → plugins/warpseg/warpseg_main/voxelmorph/torch/multi_stage_net.py} +76 -52
  163. melage/plugins/warpseg/warpseg_main/voxelmorph/torch/networks.py +308 -0
  164. melage/plugins/warpseg/warpseg_main/voxelmorph/torch/utils.py +470 -0
  165. melage/{utils/DispalyIm.py → rendering/DisplayIm.py} +67 -79
  166. melage/{utils → rendering}/glScientific.py +1 -1
  167. melage/utils/__init__.py +1 -0
  168. melage/utils/utils.py +343 -196
  169. melage/widgets/{dockWidgets.py → DockWidgets.py} +123 -55
  170. melage/widgets/SettingsWidget.py +98 -0
  171. melage/widgets/__init__.py +49 -0
  172. melage/widgets/openglWidgets.py +344 -156
  173. melage/widgets/openglWidgets_bu.py +645 -0
  174. melage/widgets/plugin_manager.py +62 -0
  175. melage-1.0.0.dist-info/METADATA +953 -0
  176. melage-1.0.0.dist-info/RECORD +571 -0
  177. melage-1.0.0.dist-info/entry_points.txt +2 -0
  178. melage-1.0.0.dist-info/top_level.txt +4 -0
  179. melage/requirements22.txt +0 -25
  180. melage/requirements_old.txt +0 -28
  181. melage/resource/theme/rc/checkbox_checked.png +0 -0
  182. melage/resource/theme/rc/checkbox_checked@2x.png +0 -0
  183. melage/resource/theme/rc/checkbox_checked@2x0.png +0 -0
  184. melage/resource/theme/rc/checkbox_checked@2x000.png.png +0 -0
  185. melage/resource/theme/rc/checkbox_checked_disabled.png +0 -0
  186. melage/resource/theme/rc/checkbox_checked_disabled0.png +0 -0
  187. melage/resource/theme/rc/checkbox_checked_disabled@2x.png +0 -0
  188. melage/resource/theme/rc/checkbox_checked_disabled@2x0.png +0 -0
  189. melage/resource/theme/rc/checkbox_checked_focus.png +0 -0
  190. melage/resource/theme/rc/checkbox_checked_focus0.png +0 -0
  191. melage/resource/theme/rc/checkbox_checked_focus@2x.png +0 -0
  192. melage/resource/theme/rc/checkbox_checked_focus@2x0.png +0 -0
  193. melage/resource/theme/rc/checkbox_checked_pressed.png +0 -0
  194. melage/resource/theme/rc/checkbox_checked_pressed0.png +0 -0
  195. melage/resource/theme/rc/checkbox_checked_pressed@2x.png +0 -0
  196. melage/resource/theme/rc/checkbox_checked_pressed@2x0.png +0 -0
  197. melage/resource/theme/rc/checkbox_indeterminate.png +0 -0
  198. melage/resource/theme/rc/checkbox_indeterminate@2x.png +0 -0
  199. melage/resource/theme/rc/checkbox_indeterminate_disabled.png +0 -0
  200. melage/resource/theme/rc/checkbox_indeterminate_disabled@2x.png +0 -0
  201. melage/resource/theme/rc/checkbox_indeterminate_focus.png +0 -0
  202. melage/resource/theme/rc/checkbox_indeterminate_focus@2x.png +0 -0
  203. melage/resource/theme/rc/checkbox_indeterminate_pressed.png +0 -0
  204. melage/resource/theme/rc/checkbox_indeterminate_pressed@2x.png +0 -0
  205. melage/resource/theme/rc/checkbox_unchecked.png +0 -0
  206. melage/resource/theme/rc/checkbox_unchecked0.png +0 -0
  207. melage/resource/theme/rc/checkbox_unchecked00.png +0 -0
  208. melage/resource/theme/rc/checkbox_unchecked@2x.png +0 -0
  209. melage/resource/theme/rc/checkbox_unchecked@2x0.png +0 -0
  210. melage/resource/theme/rc/checkbox_unchecked@2x00.png +0 -0
  211. melage/resource/theme/rc/checkbox_unchecked_disabled.png +0 -0
  212. melage/resource/theme/rc/checkbox_unchecked_disabled0.png +0 -0
  213. melage/resource/theme/rc/checkbox_unchecked_disabled00.png +0 -0
  214. melage/resource/theme/rc/checkbox_unchecked_disabled@2x.png +0 -0
  215. melage/resource/theme/rc/checkbox_unchecked_disabled@2x0.png +0 -0
  216. melage/resource/theme/rc/checkbox_unchecked_disabled@2x00.png +0 -0
  217. melage/resource/theme/rc/checkbox_unchecked_focus.png +0 -0
  218. melage/resource/theme/rc/checkbox_unchecked_focus0.png +0 -0
  219. melage/resource/theme/rc/checkbox_unchecked_focus00.png +0 -0
  220. melage/resource/theme/rc/checkbox_unchecked_focus@2x.png +0 -0
  221. melage/resource/theme/rc/checkbox_unchecked_focus@2x0.png +0 -0
  222. melage/resource/theme/rc/checkbox_unchecked_focus@2x00.png +0 -0
  223. melage/resource/theme/rc/checkbox_unchecked_pressed.png +0 -0
  224. melage/resource/theme/rc/checkbox_unchecked_pressed0.png +0 -0
  225. melage/resource/theme/rc/checkbox_unchecked_pressed00.png +0 -0
  226. melage/resource/theme/rc/checkbox_unchecked_pressed@2x.png +0 -0
  227. melage/resource/theme/rc/checkbox_unchecked_pressed@2x0.png +0 -0
  228. melage/resource/theme/rc/checkbox_unchecked_pressed@2x00.png +0 -0
  229. melage/some_notes.txt +0 -3
  230. melage/utils/GMM.py +0 -720
  231. melage/utils/Shaders_bu.py +0 -314
  232. melage/utils/__init__0.py +0 -7
  233. melage/utils/glScientific_bc.py +0 -1585
  234. melage/utils/registration.py +0 -512
  235. melage/utils/source_folder.py +0 -18
  236. melage/version.txt +0 -1
  237. melage/widgets/ApplyMask.py +0 -212
  238. melage/widgets/ChangeSystem.py +0 -152
  239. melage/widgets/DeepLModels/NPP/dataset/mri_dataset_affine.py +0 -149
  240. melage/widgets/DeepLModels/NPP/models/checkpoints/npp_v1.pth.py +0 -0
  241. melage/widgets/DeepLModels/NPP/models/losses.py +0 -146
  242. melage/widgets/DeepLModels/NPP/models/model.py +0 -272
  243. melage/widgets/DeepLModels/NPP/models/utils.py +0 -303
  244. melage/widgets/DeepLModels/NPP/npp.py +0 -116
  245. melage/widgets/DeepLModels/NPP/requirements.txt +0 -8
  246. melage/widgets/DeepLModels/NPP/train/train.py +0 -116
  247. melage/widgets/DeepLModels/Unet3DAtt.py +0 -657
  248. melage/widgets/DeepLModels/Unet3D_basic.py +0 -648
  249. melage/widgets/DeepLModels/new_unet_old.py +0 -639
  250. melage/widgets/DeepLModels/new_unet_old2.py +0 -658
  251. melage/widgets/MaskOperations.py +0 -147
  252. melage/widgets/N4Dialog.py +0 -241
  253. melage/widgets/Segmentation/__init__.py +0 -588
  254. melage/widgets/SemiAutoSeg.py +0 -666
  255. melage/widgets/__init__0.py +0 -5
  256. melage/widgets/about.py +0 -246
  257. melage/widgets/activator.py +0 -147
  258. melage/widgets/be_dl.py +0 -409
  259. melage/widgets/be_dl_unet3d.py +0 -441
  260. melage/widgets/brain_extraction_dl.py +0 -887
  261. melage/widgets/brain_extraction_dl_bu.py +0 -869
  262. melage/widgets/registrationWidget.py +0 -342
  263. melage/widgets/settings_widget.py +0 -77
  264. melage/widgets/tranformationWidget.py +0 -275
  265. melage-0.0.65.dist-info/METADATA +0 -742
  266. melage-0.0.65.dist-info/RECORD +0 -501
  267. melage-0.0.65.dist-info/entry_points.txt +0 -2
  268. melage-0.0.65.dist-info/top_level.txt +0 -1
  269. {melage/resource → assets}/main.ico +0 -0
  270. {melage → assets}/resource/0circle.png +0 -0
  271. {melage → assets}/resource/0circle_faded.png +0 -0
  272. {melage → assets}/resource/3d.png +0 -0
  273. {melage → assets}/resource/3d.psd +0 -0
  274. {melage → assets}/resource/3dFaded.png +0 -0
  275. {melage → assets}/resource/Eraser.png +0 -0
  276. {melage → assets}/resource/EraserFaded.png +0 -0
  277. {melage → assets}/resource/EraserX.png +0 -0
  278. {melage → assets}/resource/EraserXFaded.png +0 -0
  279. {melage → assets}/resource/Eraser_icon.svg +0 -0
  280. {melage → assets}/resource/Hand.png +0 -0
  281. {melage → assets}/resource/HandIcons_0.png +0 -0
  282. {melage → assets}/resource/Hand_IX.png +0 -0
  283. {melage → assets}/resource/Hand_IXFaded.png +0 -0
  284. {melage → assets}/resource/Handsqueezed.png +0 -0
  285. {melage → assets}/resource/Handwriting (copy).png +0 -0
  286. {melage → assets}/resource/Handwriting.png +0 -0
  287. {melage → assets}/resource/HandwritingMinus.png +0 -0
  288. {melage → assets}/resource/HandwritingMinusX.png +0 -0
  289. {melage → assets}/resource/HandwritingPlus.png +0 -0
  290. {melage → assets}/resource/HandwritingPlusX.png +0 -0
  291. {melage → assets}/resource/Move_icon.svg +0 -0
  292. {melage → assets}/resource/PngItem_2422924.png +0 -0
  293. {melage → assets}/resource/about.png +0 -0
  294. {melage → assets}/resource/about_logo.png +0 -0
  295. {melage → assets}/resource/about_logo0.png +0 -0
  296. {melage → assets}/resource/action_check.png +0 -0
  297. {melage → assets}/resource/action_check_OFF.png +0 -0
  298. {melage → assets}/resource/arrow).png +0 -0
  299. {melage → assets}/resource/arrow.png +0 -0
  300. {melage → assets}/resource/arrowFaded.png +0 -0
  301. {melage → assets}/resource/arrow_org.png +0 -0
  302. {melage → assets}/resource/arrow_org.png.png +0 -0
  303. {melage → assets}/resource/arrows.png +0 -0
  304. {melage → assets}/resource/authors.mp4 +0 -0
  305. {melage → assets}/resource/box.png +0 -0
  306. {melage → assets}/resource/check-image-icon-0.jpg +0 -0
  307. {melage → assets}/resource/circle.png +0 -0
  308. {melage → assets}/resource/circle_faded.png +0 -0
  309. {melage → assets}/resource/circle_or.png +0 -0
  310. {melage → assets}/resource/close.png +0 -0
  311. {melage → assets}/resource/close_bg.png +0 -0
  312. {melage → assets}/resource/color/Simple.txt +0 -0
  313. {melage → assets}/resource/color/Tissue.txt +0 -0
  314. {melage → assets}/resource/color/Tissue12.txt +0 -0
  315. {melage → assets}/resource/color/albert_LUT.txt +0 -0
  316. {melage → assets}/resource/color/mcrib_LUT.txt +0 -0
  317. {melage → assets}/resource/color/pediatric1.txt +0 -0
  318. {melage → assets}/resource/color/pediatric1_old.txt +0 -0
  319. {melage → assets}/resource/color/pediatric2.txt +0 -0
  320. {melage → assets}/resource/color/pediatric3.txt +0 -0
  321. {melage → assets}/resource/color/pediatrics (copy).csv +0 -0
  322. {melage → assets}/resource/color/tissue_seg.txt +0 -0
  323. {melage → assets}/resource/contour.png +0 -0
  324. {melage → assets}/resource/contour.svg +0 -0
  325. {melage → assets}/resource/contourFaded.png +0 -0
  326. {melage → assets}/resource/contourX.png +0 -0
  327. {melage → assets}/resource/contourXFaded.png +0 -0
  328. {melage → assets}/resource/dti.png +0 -0
  329. {melage → assets}/resource/dti0.png +0 -0
  330. {melage → assets}/resource/dti222.png +0 -0
  331. {melage → assets}/resource/dti_or.png +0 -0
  332. {melage → assets}/resource/eco.png +0 -0
  333. {melage → assets}/resource/eco22.png +0 -0
  334. {melage → assets}/resource/eco_old.png +0 -0
  335. {melage → assets}/resource/eco_or.png +0 -0
  336. {melage → assets}/resource/eco_or2.png +0 -0
  337. {melage → assets}/resource/eco_seg.png +0 -0
  338. {melage → assets}/resource/eco_seg_old.png +0 -0
  339. {melage → assets}/resource/export.png +0 -0
  340. {melage → assets}/resource/hand-grab-icon-10.jpg +0 -0
  341. {melage → assets}/resource/hand-grab-icon-25.jpg +0 -0
  342. {melage → assets}/resource/info.png +0 -0
  343. {melage → assets}/resource/line.png +0 -0
  344. {melage → assets}/resource/linefaded.png +0 -0
  345. {melage → assets}/resource/load.png +0 -0
  346. {melage → assets}/resource/manual_images/3D_rightc.png +0 -0
  347. {melage → assets}/resource/manual_images/3D_rightc_goto.png +0 -0
  348. {melage → assets}/resource/manual_images/3D_rightc_paint.png +0 -0
  349. {melage → assets}/resource/manual_images/3D_rightc_paint_draw1.png +0 -0
  350. {melage → assets}/resource/manual_images/3D_rightc_paint_draw2.png +0 -0
  351. {melage → assets}/resource/manual_images/3D_rightc_paint_render.png +0 -0
  352. {melage → assets}/resource/manual_images/3D_rightc_paint_render2.png +0 -0
  353. {melage → assets}/resource/manual_images/3D_rightc_paint_render3.png +0 -0
  354. {melage → assets}/resource/manual_images/3D_rightc_paint_render4.png +0 -0
  355. {melage → assets}/resource/manual_images/3D_rightc_paint_render5.png +0 -0
  356. {melage → assets}/resource/manual_images/3D_rightc_paint_render6.png +0 -0
  357. {melage → assets}/resource/manual_images/3D_rightc_seg.png +0 -0
  358. {melage → assets}/resource/manual_images/exit_toolbar.png +0 -0
  359. {melage → assets}/resource/manual_images/load_image_file.png +0 -0
  360. {melage → assets}/resource/manual_images/load_image_file_openp.png +0 -0
  361. {melage → assets}/resource/manual_images/main_page.png +0 -0
  362. {melage → assets}/resource/manual_images/menu_file.png +0 -0
  363. {melage → assets}/resource/manual_images/menu_file_export.png +0 -0
  364. {melage → assets}/resource/manual_images/menu_file_import.png +0 -0
  365. {melage → assets}/resource/manual_images/menu_file_settings.png +0 -0
  366. {melage → assets}/resource/manual_images/menu_file_ss.png +0 -0
  367. {melage → assets}/resource/manual_images/open_save_load.png +0 -0
  368. {melage → assets}/resource/manual_images/panning_toolbar.png +0 -0
  369. {melage → assets}/resource/manual_images/segmentation_toolbar.png +0 -0
  370. {melage → assets}/resource/manual_images/tab_mri.png +0 -0
  371. {melage → assets}/resource/manual_images/tab_us.png +0 -0
  372. {melage → assets}/resource/manual_images/tabs.png +0 -0
  373. {melage → assets}/resource/manual_images/toolbar_tools.png +0 -0
  374. {melage → assets}/resource/manual_images/tools_basic.png +0 -0
  375. {melage → assets}/resource/manual_images/tools_bet.png +0 -0
  376. {melage → assets}/resource/manual_images/tools_cs.png +0 -0
  377. {melage → assets}/resource/manual_images/tools_deepbet.png +0 -0
  378. {melage → assets}/resource/manual_images/tools_imageinfo.png +0 -0
  379. {melage → assets}/resource/manual_images/tools_maskO.png +0 -0
  380. {melage → assets}/resource/manual_images/tools_masking.png +0 -0
  381. {melage → assets}/resource/manual_images/tools_n4b.png +0 -0
  382. {melage → assets}/resource/manual_images/tools_resize.png +0 -0
  383. {melage → assets}/resource/manual_images/tools_ruler.png +0 -0
  384. {melage → assets}/resource/manual_images/tools_seg.png +0 -0
  385. {melage → assets}/resource/manual_images/tools_threshold.png +0 -0
  386. {melage → assets}/resource/manual_images/tools_tools.png +0 -0
  387. {melage → assets}/resource/manual_images/widget_color.png +0 -0
  388. {melage → assets}/resource/manual_images/widget_color_add.png +0 -0
  389. {melage → assets}/resource/manual_images/widget_color_add2.png +0 -0
  390. {melage → assets}/resource/manual_images/widget_color_additional.png +0 -0
  391. {melage → assets}/resource/manual_images/widget_images.png +0 -0
  392. {melage → assets}/resource/manual_images/widget_images2.png +0 -0
  393. {melage → assets}/resource/manual_images/widget_images3.png +0 -0
  394. {melage → assets}/resource/manual_images/widget_marker.png +0 -0
  395. {melage → assets}/resource/manual_images/widget_mri.png +0 -0
  396. {melage → assets}/resource/manual_images/widget_mri2.png +0 -0
  397. {melage → assets}/resource/manual_images/widget_segintensity.png +0 -0
  398. {melage → assets}/resource/manual_images/widget_tab_mutualview.png +0 -0
  399. {melage → assets}/resource/manual_images/widget_tab_mutualview2.png +0 -0
  400. {melage → assets}/resource/manual_images/widget_table.png +0 -0
  401. {melage → assets}/resource/manual_images/widget_table2.png +0 -0
  402. {melage → assets}/resource/manual_images/widget_us.png +0 -0
  403. {melage → assets}/resource/melage_top.ico +0 -0
  404. {melage → assets}/resource/melage_top.png +0 -0
  405. {melage → assets}/resource/melage_top0.png +0 -0
  406. {melage → assets}/resource/melage_top1.png +0 -0
  407. {melage → assets}/resource/melage_top4.png +0 -0
  408. {melage → assets}/resource/mri (copy).png +0 -0
  409. {melage → assets}/resource/mri.png +0 -0
  410. {melage → assets}/resource/mri0.png +0 -0
  411. {melage → assets}/resource/mri000.png +0 -0
  412. {melage → assets}/resource/mri22.png +0 -0
  413. {melage → assets}/resource/mri_big.png +0 -0
  414. {melage → assets}/resource/mri_old.png +0 -0
  415. {melage → assets}/resource/mri_seg.png +0 -0
  416. {melage → assets}/resource/mri_seg_old.png +0 -0
  417. {melage → assets}/resource/new.png +0 -0
  418. {melage → assets}/resource/open.png +0 -0
  419. {melage → assets}/resource/open2.png +0 -0
  420. {melage → assets}/resource/pan.png +0 -0
  421. {melage → assets}/resource/pencil.png +0 -0
  422. {melage → assets}/resource/pencilFaded.png +0 -0
  423. {melage → assets}/resource/points.png +0 -0
  424. {melage → assets}/resource/pointsFaded.png +0 -0
  425. {melage → assets}/resource/rotate.png +0 -0
  426. {melage → assets}/resource/ruler.png +0 -0
  427. {melage → assets}/resource/rulerFaded.png +0 -0
  428. {melage → assets}/resource/s.png +0 -0
  429. {melage → assets}/resource/s.psd +0 -0
  430. {melage → assets}/resource/save.png +0 -0
  431. {melage → assets}/resource/saveas.png +0 -0
  432. {melage → assets}/resource/seg_mri.png +0 -0
  433. {melage → assets}/resource/seg_mri2.png +0 -0
  434. {melage → assets}/resource/settings.png +0 -0
  435. {melage → assets}/resource/synch.png +0 -0
  436. {melage → assets}/resource/synchFaded.png +0 -0
  437. {melage → assets}/resource/theme/rc/.keep +0 -0
  438. {melage → assets}/resource/theme/rc/arrow_down.png +0 -0
  439. {melage → assets}/resource/theme/rc/arrow_down@2x.png +0 -0
  440. {melage → assets}/resource/theme/rc/arrow_down_disabled.png +0 -0
  441. {melage → assets}/resource/theme/rc/arrow_down_disabled@2x.png +0 -0
  442. {melage → assets}/resource/theme/rc/arrow_down_focus.png +0 -0
  443. {melage → assets}/resource/theme/rc/arrow_down_focus@2x.png +0 -0
  444. {melage → assets}/resource/theme/rc/arrow_down_pressed.png +0 -0
  445. {melage → assets}/resource/theme/rc/arrow_down_pressed@2x.png +0 -0
  446. {melage → assets}/resource/theme/rc/arrow_left.png +0 -0
  447. {melage → assets}/resource/theme/rc/arrow_left@2x.png +0 -0
  448. {melage → assets}/resource/theme/rc/arrow_left_disabled.png +0 -0
  449. {melage → assets}/resource/theme/rc/arrow_left_disabled@2x.png +0 -0
  450. {melage → assets}/resource/theme/rc/arrow_left_focus.png +0 -0
  451. {melage → assets}/resource/theme/rc/arrow_left_focus@2x.png +0 -0
  452. {melage → assets}/resource/theme/rc/arrow_left_pressed.png +0 -0
  453. {melage → assets}/resource/theme/rc/arrow_left_pressed@2x.png +0 -0
  454. {melage → assets}/resource/theme/rc/arrow_right.png +0 -0
  455. {melage → assets}/resource/theme/rc/arrow_right@2x.png +0 -0
  456. {melage → assets}/resource/theme/rc/arrow_right_disabled.png +0 -0
  457. {melage → assets}/resource/theme/rc/arrow_right_disabled@2x.png +0 -0
  458. {melage → assets}/resource/theme/rc/arrow_right_focus.png +0 -0
  459. {melage → assets}/resource/theme/rc/arrow_right_focus@2x.png +0 -0
  460. {melage → assets}/resource/theme/rc/arrow_right_pressed.png +0 -0
  461. {melage → assets}/resource/theme/rc/arrow_right_pressed@2x.png +0 -0
  462. {melage → assets}/resource/theme/rc/arrow_up.png +0 -0
  463. {melage → assets}/resource/theme/rc/arrow_up@2x.png +0 -0
  464. {melage → assets}/resource/theme/rc/arrow_up_disabled.png +0 -0
  465. {melage → assets}/resource/theme/rc/arrow_up_disabled@2x.png +0 -0
  466. {melage → assets}/resource/theme/rc/arrow_up_focus.png +0 -0
  467. {melage → assets}/resource/theme/rc/arrow_up_focus@2x.png +0 -0
  468. {melage → assets}/resource/theme/rc/arrow_up_pressed.png +0 -0
  469. {melage → assets}/resource/theme/rc/arrow_up_pressed@2x.png +0 -0
  470. {melage → assets}/resource/theme/rc/base_icon.png +0 -0
  471. {melage → assets}/resource/theme/rc/base_icon@2x.png +0 -0
  472. {melage → assets}/resource/theme/rc/base_icon_disabled.png +0 -0
  473. {melage → assets}/resource/theme/rc/base_icon_disabled@2x.png +0 -0
  474. {melage → assets}/resource/theme/rc/base_icon_focus.png +0 -0
  475. {melage → assets}/resource/theme/rc/base_icon_focus@2x.png +0 -0
  476. {melage → assets}/resource/theme/rc/base_icon_pressed.png +0 -0
  477. {melage → assets}/resource/theme/rc/base_icon_pressed@2x.png +0 -0
  478. {melage → assets}/resource/theme/rc/branch_closed.png +0 -0
  479. {melage → assets}/resource/theme/rc/branch_closed@2x.png +0 -0
  480. {melage → assets}/resource/theme/rc/branch_closed_disabled.png +0 -0
  481. {melage → assets}/resource/theme/rc/branch_closed_disabled@2x.png +0 -0
  482. {melage → assets}/resource/theme/rc/branch_closed_focus.png +0 -0
  483. {melage → assets}/resource/theme/rc/branch_closed_focus@2x.png +0 -0
  484. {melage → assets}/resource/theme/rc/branch_closed_pressed.png +0 -0
  485. {melage → assets}/resource/theme/rc/branch_closed_pressed@2x.png +0 -0
  486. {melage → assets}/resource/theme/rc/branch_end.png +0 -0
  487. {melage → assets}/resource/theme/rc/branch_end@2x.png +0 -0
  488. {melage → assets}/resource/theme/rc/branch_end_disabled.png +0 -0
  489. {melage → assets}/resource/theme/rc/branch_end_disabled@2x.png +0 -0
  490. {melage → assets}/resource/theme/rc/branch_end_focus.png +0 -0
  491. {melage → assets}/resource/theme/rc/branch_end_focus@2x.png +0 -0
  492. {melage → assets}/resource/theme/rc/branch_end_pressed.png +0 -0
  493. {melage → assets}/resource/theme/rc/branch_end_pressed@2x.png +0 -0
  494. {melage → assets}/resource/theme/rc/branch_line.png +0 -0
  495. {melage → assets}/resource/theme/rc/branch_line@2x.png +0 -0
  496. {melage → assets}/resource/theme/rc/branch_line_disabled.png +0 -0
  497. {melage → assets}/resource/theme/rc/branch_line_disabled@2x.png +0 -0
  498. {melage → assets}/resource/theme/rc/branch_line_focus.png +0 -0
  499. {melage → assets}/resource/theme/rc/branch_line_focus@2x.png +0 -0
  500. {melage → assets}/resource/theme/rc/branch_line_pressed.png +0 -0
  501. {melage → assets}/resource/theme/rc/branch_line_pressed@2x.png +0 -0
  502. {melage → assets}/resource/theme/rc/branch_more.png +0 -0
  503. {melage → assets}/resource/theme/rc/branch_more@2x.png +0 -0
  504. {melage → assets}/resource/theme/rc/branch_more_disabled.png +0 -0
  505. {melage → assets}/resource/theme/rc/branch_more_disabled@2x.png +0 -0
  506. {melage → assets}/resource/theme/rc/branch_more_focus.png +0 -0
  507. {melage → assets}/resource/theme/rc/branch_more_focus@2x.png +0 -0
  508. {melage → assets}/resource/theme/rc/branch_more_pressed.png +0 -0
  509. {melage → assets}/resource/theme/rc/branch_more_pressed@2x.png +0 -0
  510. {melage → assets}/resource/theme/rc/branch_open.png +0 -0
  511. {melage → assets}/resource/theme/rc/branch_open@2x.png +0 -0
  512. {melage → assets}/resource/theme/rc/branch_open_disabled.png +0 -0
  513. {melage → assets}/resource/theme/rc/branch_open_disabled@2x.png +0 -0
  514. {melage → assets}/resource/theme/rc/branch_open_focus.png +0 -0
  515. {melage → assets}/resource/theme/rc/branch_open_focus@2x.png +0 -0
  516. {melage → assets}/resource/theme/rc/branch_open_pressed.png +0 -0
  517. {melage → assets}/resource/theme/rc/branch_open_pressed@2x.png +0 -0
  518. {melage → assets}/resource/theme/rc/checkbox_checked0.png +0 -0
  519. {melage → assets}/resource/theme/rc/line_horizontal.png +0 -0
  520. {melage → assets}/resource/theme/rc/line_horizontal@2x.png +0 -0
  521. {melage → assets}/resource/theme/rc/line_horizontal_disabled.png +0 -0
  522. {melage → assets}/resource/theme/rc/line_horizontal_disabled@2x.png +0 -0
  523. {melage → assets}/resource/theme/rc/line_horizontal_focus.png +0 -0
  524. {melage → assets}/resource/theme/rc/line_horizontal_focus@2x.png +0 -0
  525. {melage → assets}/resource/theme/rc/line_horizontal_pressed.png +0 -0
  526. {melage → assets}/resource/theme/rc/line_horizontal_pressed@2x.png +0 -0
  527. {melage → assets}/resource/theme/rc/line_vertical.png +0 -0
  528. {melage → assets}/resource/theme/rc/line_vertical@2x.png +0 -0
  529. {melage → assets}/resource/theme/rc/line_vertical_disabled.png +0 -0
  530. {melage → assets}/resource/theme/rc/line_vertical_disabled@2x.png +0 -0
  531. {melage → assets}/resource/theme/rc/line_vertical_focus.png +0 -0
  532. {melage → assets}/resource/theme/rc/line_vertical_focus@2x.png +0 -0
  533. {melage → assets}/resource/theme/rc/line_vertical_pressed.png +0 -0
  534. {melage → assets}/resource/theme/rc/line_vertical_pressed@2x.png +0 -0
  535. {melage → assets}/resource/theme/rc/radio_checked.png +0 -0
  536. {melage → assets}/resource/theme/rc/radio_checked@2x.png +0 -0
  537. {melage → assets}/resource/theme/rc/radio_checked_disabled.png +0 -0
  538. {melage → assets}/resource/theme/rc/radio_checked_disabled@2x.png +0 -0
  539. {melage → assets}/resource/theme/rc/radio_checked_focus.png +0 -0
  540. {melage → assets}/resource/theme/rc/radio_checked_focus@2x.png +0 -0
  541. {melage → assets}/resource/theme/rc/radio_checked_pressed.png +0 -0
  542. {melage → assets}/resource/theme/rc/radio_checked_pressed@2x.png +0 -0
  543. {melage → assets}/resource/theme/rc/radio_unchecked.png +0 -0
  544. {melage → assets}/resource/theme/rc/radio_unchecked@2x.png +0 -0
  545. {melage → assets}/resource/theme/rc/radio_unchecked_disabled.png +0 -0
  546. {melage → assets}/resource/theme/rc/radio_unchecked_disabled@2x.png +0 -0
  547. {melage → assets}/resource/theme/rc/radio_unchecked_focus.png +0 -0
  548. {melage → assets}/resource/theme/rc/radio_unchecked_focus@2x.png +0 -0
  549. {melage → assets}/resource/theme/rc/radio_unchecked_pressed.png +0 -0
  550. {melage → assets}/resource/theme/rc/radio_unchecked_pressed@2x.png +0 -0
  551. {melage → assets}/resource/theme/rc/toolbar_move_horizontal.png +0 -0
  552. {melage → assets}/resource/theme/rc/toolbar_move_horizontal@2x.png +0 -0
  553. {melage → assets}/resource/theme/rc/toolbar_move_horizontal_disabled.png +0 -0
  554. {melage → assets}/resource/theme/rc/toolbar_move_horizontal_disabled@2x.png +0 -0
  555. {melage → assets}/resource/theme/rc/toolbar_move_horizontal_focus.png +0 -0
  556. {melage → assets}/resource/theme/rc/toolbar_move_horizontal_focus@2x.png +0 -0
  557. {melage → assets}/resource/theme/rc/toolbar_move_horizontal_pressed.png +0 -0
  558. {melage → assets}/resource/theme/rc/toolbar_move_horizontal_pressed@2x.png +0 -0
  559. {melage → assets}/resource/theme/rc/toolbar_move_vertical.png +0 -0
  560. {melage → assets}/resource/theme/rc/toolbar_move_vertical@2x.png +0 -0
  561. {melage → assets}/resource/theme/rc/toolbar_move_vertical_disabled.png +0 -0
  562. {melage → assets}/resource/theme/rc/toolbar_move_vertical_disabled@2x.png +0 -0
  563. {melage → assets}/resource/theme/rc/toolbar_move_vertical_focus.png +0 -0
  564. {melage → assets}/resource/theme/rc/toolbar_move_vertical_focus@2x.png +0 -0
  565. {melage → assets}/resource/theme/rc/toolbar_move_vertical_pressed.png +0 -0
  566. {melage → assets}/resource/theme/rc/toolbar_move_vertical_pressed@2x.png +0 -0
  567. {melage → assets}/resource/theme/rc/toolbar_separator_horizontal.png +0 -0
  568. {melage → assets}/resource/theme/rc/toolbar_separator_horizontal@2x.png +0 -0
  569. {melage → assets}/resource/theme/rc/toolbar_separator_horizontal_disabled.png +0 -0
  570. {melage → assets}/resource/theme/rc/toolbar_separator_horizontal_disabled@2x.png +0 -0
  571. {melage → assets}/resource/theme/rc/toolbar_separator_horizontal_focus.png +0 -0
  572. {melage → assets}/resource/theme/rc/toolbar_separator_horizontal_focus@2x.png +0 -0
  573. {melage → assets}/resource/theme/rc/toolbar_separator_horizontal_pressed.png +0 -0
  574. {melage → assets}/resource/theme/rc/toolbar_separator_horizontal_pressed@2x.png +0 -0
  575. {melage → assets}/resource/theme/rc/toolbar_separator_vertical.png +0 -0
  576. {melage → assets}/resource/theme/rc/toolbar_separator_vertical@2x.png +0 -0
  577. {melage → assets}/resource/theme/rc/toolbar_separator_vertical_disabled.png +0 -0
  578. {melage → assets}/resource/theme/rc/toolbar_separator_vertical_disabled@2x.png +0 -0
  579. {melage → assets}/resource/theme/rc/toolbar_separator_vertical_focus.png +0 -0
  580. {melage → assets}/resource/theme/rc/toolbar_separator_vertical_focus@2x.png +0 -0
  581. {melage → assets}/resource/theme/rc/toolbar_separator_vertical_pressed.png +0 -0
  582. {melage → assets}/resource/theme/rc/toolbar_separator_vertical_pressed@2x.png +0 -0
  583. {melage → assets}/resource/theme/rc/transparent.png +0 -0
  584. {melage → assets}/resource/theme/rc/transparent@2x.png +0 -0
  585. {melage → assets}/resource/theme/rc/transparent_disabled.png +0 -0
  586. {melage → assets}/resource/theme/rc/transparent_disabled@2x.png +0 -0
  587. {melage → assets}/resource/theme/rc/transparent_focus.png +0 -0
  588. {melage → assets}/resource/theme/rc/transparent_focus@2x.png +0 -0
  589. {melage → assets}/resource/theme/rc/transparent_pressed.png +0 -0
  590. {melage → assets}/resource/theme/rc/transparent_pressed@2x.png +0 -0
  591. {melage → assets}/resource/theme/rc/window_close.png +0 -0
  592. {melage → assets}/resource/theme/rc/window_close@2x.png +0 -0
  593. {melage → assets}/resource/theme/rc/window_close_disabled.png +0 -0
  594. {melage → assets}/resource/theme/rc/window_close_disabled@2x.png +0 -0
  595. {melage → assets}/resource/theme/rc/window_close_focus.png +0 -0
  596. {melage → assets}/resource/theme/rc/window_close_focus@2x.png +0 -0
  597. {melage → assets}/resource/theme/rc/window_close_pressed.png +0 -0
  598. {melage → assets}/resource/theme/rc/window_close_pressed@2x.png +0 -0
  599. {melage → assets}/resource/theme/rc/window_grip.png +0 -0
  600. {melage → assets}/resource/theme/rc/window_grip@2x.png +0 -0
  601. {melage → assets}/resource/theme/rc/window_grip_disabled.png +0 -0
  602. {melage → assets}/resource/theme/rc/window_grip_disabled@2x.png +0 -0
  603. {melage → assets}/resource/theme/rc/window_grip_focus.png +0 -0
  604. {melage → assets}/resource/theme/rc/window_grip_focus@2x.png +0 -0
  605. {melage → assets}/resource/theme/rc/window_grip_pressed.png +0 -0
  606. {melage → assets}/resource/theme/rc/window_grip_pressed@2x.png +0 -0
  607. {melage → assets}/resource/theme/rc/window_minimize.png +0 -0
  608. {melage → assets}/resource/theme/rc/window_minimize@2x.png +0 -0
  609. {melage → assets}/resource/theme/rc/window_minimize_disabled.png +0 -0
  610. {melage → assets}/resource/theme/rc/window_minimize_disabled@2x.png +0 -0
  611. {melage → assets}/resource/theme/rc/window_minimize_focus.png +0 -0
  612. {melage → assets}/resource/theme/rc/window_minimize_focus@2x.png +0 -0
  613. {melage → assets}/resource/theme/rc/window_minimize_pressed.png +0 -0
  614. {melage → assets}/resource/theme/rc/window_minimize_pressed@2x.png +0 -0
  615. {melage → assets}/resource/theme/rc/window_undock.png +0 -0
  616. {melage → assets}/resource/theme/rc/window_undock@2x.png +0 -0
  617. {melage → assets}/resource/theme/rc/window_undock_disabled.png +0 -0
  618. {melage → assets}/resource/theme/rc/window_undock_disabled@2x.png +0 -0
  619. {melage → assets}/resource/theme/rc/window_undock_focus.png +0 -0
  620. {melage → assets}/resource/theme/rc/window_undock_focus@2x.png +0 -0
  621. {melage → assets}/resource/theme/rc/window_undock_pressed.png +0 -0
  622. {melage → assets}/resource/theme/rc/window_undock_pressed@2x.png +0 -0
  623. {melage → assets}/resource/theme/style.qss +0 -0
  624. {melage → assets}/resource/tract.png +0 -0
  625. {melage → assets}/resource/view1.png +0 -0
  626. {melage → assets}/resource/view1_eco.png +0 -0
  627. {melage → assets}/resource/view1_mri.png +0 -0
  628. {melage → assets}/resource/view1_seg.png +0 -0
  629. {melage → assets}/resource/view2.png +0 -0
  630. {melage → assets}/resource/view2_seg.png +0 -0
  631. {melage → assets}/resource/w.png +0 -0
  632. {melage → assets}/resource/zoom_inFaded.png +0 -0
  633. /melage/resource/zoom_in.png → /assets/resource/zoom_in_old.png +0 -0
  634. {melage → assets}/resource/zoom_outFaded.png +0 -0
  635. /melage/resource/zoom_out.png → /assets/resource/zoom_out_old.png +0 -0
  636. /melage/{widgets/activation.py → dialogs/ActivationDialog.py} +0 -0
  637. /melage/{widgets/HistImage.py → dialogs/HistogramDialog.py} +0 -0
  638. /melage/{widgets/iminfo.py → dialogs/ImInfoDialog.py} +0 -0
  639. /melage/{widgets/colorwidget.py → dialogs/helpers/ColorDialog.py} +0 -0
  640. /melage/{utils/custom_QScrollBar.py → dialogs/helpers/CustomScrollbar.py} +0 -0
  641. /melage/{widgets/repeat_widget.py → dialogs/helpers/RepeatDialog.py} +0 -0
  642. /melage/{widgets/screenshot_widget.py → dialogs/helpers/ScreenshotDialog.py} +0 -0
  643. /melage/{cli.py → melage.py} +0 -0
  644. /melage/{utils/brain_extraction_helper.py → plugins/bet/main/utils.py} +0 -0
  645. /melage/{graphics → rendering}/GLGraphicsItem.py +0 -0
  646. /melage/{graphics → rendering}/GLViewWidget.py +0 -0
  647. /melage/{graphics → rendering}/Transform3D.py +0 -0
  648. /melage/{graphics → rendering}/__init__.py +0 -0
  649. /melage/{graphics → rendering}/functions.py +0 -0
  650. /melage/{utils → rendering/helpers}/Shaders_120.py +0 -0
  651. /melage/{utils → rendering/helpers}/Shaders_330.py +0 -0
  652. /melage/{graphics → rendering}/items/GLAxisItem.py +0 -0
  653. /melage/{graphics → rendering}/items/GLGridItem.py +0 -0
  654. /melage/{graphics → rendering}/items/GLPolygonItem.py +0 -0
  655. /melage/{graphics → rendering}/items/GLScatterPlotItem.py +0 -0
  656. /melage/{graphics → rendering}/items/GLVolumeItem.py +0 -0
  657. /melage/{graphics → rendering}/items/GLVolumeItem_b.py +0 -0
  658. /melage/{graphics → rendering}/items/__init__.py +0 -0
  659. /melage/{graphics → rendering}/shaders.py +0 -0
  660. /melage/widgets/{enhanceImWidget.py → EnhanceImageWidget.py} +0 -0
  661. {melage-0.0.65.dist-info → melage-1.0.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,275 @@
1
+ import sys
2
+ import os
3
+ import ants
4
+ from PyQt5 import QtWidgets, QtCore, QtGui
5
+ from typing import List
6
+ from pathlib import Path
7
+ from PyQt5.QtCore import pyqtSignal
8
+ MNI_FILE = 'mni_icbm152_t1_tal_nlin_sym_09a_masked.nii.gz'
9
+
10
+ # --- Backend ANTsPy Function (Unchanged) ---
11
+
12
+ def apply_ants_transforms_from_paths(
13
+ fixed_path: str,
14
+ moving_path: str,
15
+ transform_list: List[str],
16
+ output_path: str,
17
+ interpolation: str = 'linear'
18
+ ) -> str:
19
+ """
20
+ Applies a list of ANTs transforms to a moving image using file paths.
21
+ Includes robust error checking for file existence.
22
+
23
+ Args:
24
+ fixed_path (str): Path to the fixed (reference) image.
25
+ moving_path (str): Path to the moving image to be transformed.
26
+ transform_list (List[str]): A list of paths to the transform files.
27
+ output_path (str): Path to save the warped output image.
28
+ interpolation (str): Interpolation method ('linear', 'nearestNeighbor', etc.).
29
+
30
+ Returns:
31
+ str: The path to the saved output image.
32
+
33
+ Raises:
34
+ FileNotFoundError: If any of the input files do not exist.
35
+ RuntimeError: If the ANTsPy transformation fails for any reason.
36
+ """
37
+ for path in [fixed_path, moving_path] + transform_list:
38
+ if not os.path.exists(path):
39
+ raise FileNotFoundError(f"Input file not found: {path}")
40
+
41
+ print("--- Applying ANTsPy Transformation ---")
42
+ print(f"Reference (Fixed): {fixed_path}")
43
+ print(f"Target (Moving): {moving_path}")
44
+ print(f"Transforms: {transform_list}")
45
+ print(f"Interpolation: {interpolation}")
46
+
47
+ try:
48
+ fixed_image = ants.image_read(fixed_path)
49
+ moving_image = ants.image_read(moving_path)
50
+
51
+ warped_image = ants.apply_transforms(
52
+ fixed=fixed_image,
53
+ moving=moving_image,
54
+ transformlist=transform_list,
55
+ interpolator=interpolation,
56
+ verbose=True
57
+ )
58
+
59
+ ants.image_write(warped_image, output_path)
60
+ print(f"--- Transformation Complete ---")
61
+ print(f"Output saved to: {output_path}")
62
+ return output_path
63
+
64
+ except Exception as e:
65
+ print(f"ERROR: An error occurred during transformation: {e}")
66
+ raise RuntimeError(f"ANTsPy failed to apply transform. Reason: {e}")
67
+
68
+
69
+ # --- PyQt5 Frontend (Updated) ---
70
+
71
+ class TransformationDialog(QtWidgets.QDialog):
72
+ """
73
+ A PyQt5 dialog for applying pre-computed ANTsPy transformations.
74
+ """
75
+ closeSig = pyqtSignal()
76
+ datachange = pyqtSignal()
77
+ def __init__(self, parent=None, source_dir=os.path.expanduser("~")):
78
+ super().__init__(parent)
79
+ self.source_dir = source_dir
80
+
81
+ self.fixed_path = None
82
+ self.moving_path = None
83
+ self.transform_paths = []
84
+ self.output_path = None
85
+ # Get MNI path once on initialization for efficiency
86
+ self.mni_template_path = ants.get_ants_data('mni')
87
+
88
+ self._setup_ui()
89
+
90
+ def _setup_ui(self):
91
+ """Initializes the UI components, layout, and connections."""
92
+ self.setWindowTitle("Apply ANTsPy Transformation")
93
+ self.setMinimumSize(700, 280)
94
+
95
+ self._create_widgets()
96
+ self._create_layouts()
97
+ self._connect_signals()
98
+
99
+ # Set the initial state of the MNI checkbox to off
100
+ self._toggle_mni_template(False)
101
+ def set_source(self, source_dir):
102
+ self.source_dir = source_dir
103
+ def _create_widgets(self):
104
+ """Creates all the widgets needed for the dialog."""
105
+ # --- Updated MNI Widgets ---
106
+ self.check_use_mni = QtWidgets.QCheckBox("Use standard MNI152 template as Fixed Image")
107
+ self.lineEdit_fixed = QtWidgets.QLineEdit()
108
+ self.lineEdit_fixed.setReadOnly(True)
109
+ self.button_fixed = QtWidgets.QPushButton("Browse...")
110
+
111
+ self.label_moving = QtWidgets.QLabel("<b>2. Input Image (Moving):</b>")
112
+ self.lineEdit_moving = QtWidgets.QLineEdit("Select the image or label map to transform...")
113
+ self.lineEdit_moving.setReadOnly(True)
114
+ self.button_moving = QtWidgets.QPushButton("Browse...")
115
+
116
+ self.label_transforms = QtWidgets.QLabel("<b>3. Transform File(s):</b>")
117
+ self.lineEdit_transforms = QtWidgets.QLineEdit("Select .mat, .h5, or .nii.gz transform files...")
118
+ self.lineEdit_transforms.setReadOnly(True)
119
+ self.button_transforms = QtWidgets.QPushButton("Browse...")
120
+
121
+ self.label_output = QtWidgets.QLabel("<b>4. Output Warped Image:</b>")
122
+ self.lineEdit_output = QtWidgets.QLineEdit("Select where to save the output file...")
123
+ self.lineEdit_output.setReadOnly(True)
124
+ self.button_output = QtWidgets.QPushButton("Save As...")
125
+
126
+ self.label_interp = QtWidgets.QLabel("<b>5. Interpolation Method:</b>")
127
+ self.combobox_interp = QtWidgets.QComboBox()
128
+ self.combobox_interp.addItems(['linear', 'nearestNeighbor', 'genericLabel'])
129
+ self.combobox_interp.setToolTip(
130
+ "Use 'linear' for anatomical images.\n"
131
+ "Use 'nearestNeighbor' or 'genericLabel' for label maps."
132
+ )
133
+
134
+ self.button_run = QtWidgets.QPushButton("Run Transformation")
135
+ self.button_run.setStyleSheet("background-color: #007BFF; color: white; font-weight: bold; padding: 5px;")
136
+
137
+ def _create_layouts(self):
138
+ """Lays out the widgets in a grid."""
139
+ main_layout = QtWidgets.QVBoxLayout(self)
140
+ grid_layout = QtWidgets.QGridLayout()
141
+ grid_layout.setSpacing(10)
142
+
143
+ grid_layout.addWidget(self.check_use_mni, 0, 0, 1, 3)
144
+ grid_layout.addWidget(self.lineEdit_fixed, 1, 0, 1, 2)
145
+ grid_layout.addWidget(self.button_fixed, 1, 2)
146
+
147
+ grid_layout.addWidget(self.label_moving, 2, 0)
148
+ grid_layout.addWidget(self.lineEdit_moving, 2, 1)
149
+ grid_layout.addWidget(self.button_moving, 2, 2)
150
+
151
+ grid_layout.addWidget(self.label_transforms, 3, 0)
152
+ grid_layout.addWidget(self.lineEdit_transforms, 3, 1)
153
+ grid_layout.addWidget(self.button_transforms, 3, 2)
154
+
155
+ grid_layout.addWidget(self.label_output, 4, 0)
156
+ grid_layout.addWidget(self.lineEdit_output, 4, 1)
157
+ grid_layout.addWidget(self.button_output, 4, 2)
158
+
159
+ interp_layout = QtWidgets.QHBoxLayout()
160
+ interp_layout.addWidget(self.label_interp)
161
+ interp_layout.addWidget(self.combobox_interp)
162
+ interp_layout.addStretch()
163
+ grid_layout.addLayout(interp_layout, 5, 1)
164
+
165
+ main_layout.addLayout(grid_layout)
166
+ main_layout.addStretch()
167
+ main_layout.addWidget(self.button_run)
168
+
169
+ def _connect_signals(self):
170
+ """Connects widget signals to their corresponding slots."""
171
+ self.check_use_mni.toggled.connect(self._toggle_mni_template)
172
+ self.button_fixed.clicked.connect(self._browse_fixed)
173
+ self.button_moving.clicked.connect(self._browse_moving)
174
+ self.button_transforms.clicked.connect(self._browse_transforms)
175
+ self.button_output.clicked.connect(self._browse_output)
176
+ self.button_run.clicked.connect(self._run_transformation)
177
+
178
+ # --- UI Logic Methods ---
179
+
180
+ def _toggle_mni_template(self, checked: bool):
181
+ """Handles using the built-in MNI template."""
182
+ if checked:
183
+ try:
184
+ current_dir = Path(__file__).parent
185
+ project_root = (current_dir / "../").resolve()
186
+ mni_file_path = project_root / "MNI" / MNI_FILE
187
+ self.fixed_path = str(mni_file_path)
188
+ except Exception:
189
+ self.fixed_path = []
190
+ print("Warning: Could not determine model file paths automatically.")
191
+ return
192
+ self.lineEdit_fixed.setText(self.fixed_path)
193
+ self.button_fixed.setEnabled(False)
194
+ else:
195
+ self.fixed_path = None
196
+ self.lineEdit_fixed.setText("Select custom fixed image...")
197
+ self.button_fixed.setEnabled(True)
198
+
199
+ # --- File Browser Methods ---
200
+
201
+ def _browse_fixed(self):
202
+ path, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Select Reference Image", self.source_dir,
203
+ "NIfTI Files (*.nii *.nii.gz)")
204
+ if path:
205
+ self.fixed_path = path
206
+ self.lineEdit_fixed.setText(path)
207
+ self.source_dir = os.path.dirname(path)
208
+
209
+ def _browse_moving(self):
210
+ path, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Select Input Image", self.source_dir,
211
+ "NIfTI Files (*.nii *.nii.gz)")
212
+ if path:
213
+ self.moving_path = path
214
+ self.lineEdit_moving.setText(path)
215
+
216
+ def _browse_transforms(self):
217
+ paths, _ = QtWidgets.QFileDialog.getOpenFileNames(self, "Select Transform Files", self.source_dir,
218
+ "Transform Files (*.mat)")
219
+ if paths:
220
+ self.transform_paths = paths
221
+ self.lineEdit_transforms.setText(
222
+ f"{len(paths)} file(s) selected: {', '.join([os.path.basename(p) for p in paths])}")
223
+
224
+ def _browse_output(self):
225
+ if self.moving_path:
226
+ moving_name = os.path.basename(self.moving_path).split('.')[0]
227
+ default_name = os.path.join(self.source_dir, f"{moving_name}_warped.nii.gz")
228
+ else:
229
+ default_name = self.source_dir
230
+ path, _ = QtWidgets.QFileDialog.getSaveFileName(self, "Save Warped Image", default_name,
231
+ "NIfTI Files (*.nii.gz)")
232
+ if path:
233
+ self.output_path = path
234
+ self.lineEdit_output.setText(path)
235
+
236
+ # --- Execution Method ---
237
+
238
+ def _run_transformation(self):
239
+ """Validates inputs and triggers the ANTsPy transformation."""
240
+ if not all([self.fixed_path, self.moving_path, self.transform_paths, self.output_path]):
241
+ QtWidgets.QMessageBox.warning(self, "Missing Information",
242
+ "Please select all required files (reference, input, transform(s), and output).")
243
+ return
244
+
245
+ interpolation_method = self.combobox_interp.currentText()
246
+
247
+ try:
248
+ self.button_run.setEnabled(False)
249
+ self.button_run.setText("Transforming...")
250
+ QtWidgets.QApplication.processEvents()
251
+
252
+ output_file = apply_ants_transforms_from_paths(
253
+ fixed_path=self.fixed_path,
254
+ moving_path=self.moving_path,
255
+ transform_list=self.transform_paths,
256
+ output_path=self.output_path,
257
+ interpolation=interpolation_method
258
+ )
259
+
260
+ QtWidgets.QMessageBox.information(
261
+ self, "Success", f"Transformation complete!\nWarped image saved to:\n{output_file}"
262
+ )
263
+
264
+ except (FileNotFoundError, RuntimeError, Exception) as e:
265
+ QtWidgets.QMessageBox.critical(self, "Error", f"An error occurred during transformation:\n\n{str(e)}")
266
+ finally:
267
+ self.button_run.setEnabled(True)
268
+ self.button_run.setText("Run Transformation")
269
+
270
+
271
+ if __name__ == '__main__':
272
+ app = QtWidgets.QApplication(sys.argv)
273
+ dialog = TransformationDialog()
274
+ dialog.show()
275
+ sys.exit(app.exec_())
@@ -0,0 +1,9 @@
1
+ from .AboutDialog import about_dialog
2
+ from .ActivationDialog import activation_dialog
3
+ from .HistogramDialog import HistImage, FigureCanvas
4
+ from .ImInfoDialog import iminfo_dialog
5
+ from .MaskingDialog import Masking
6
+ from .MaskOperationsDialog import MaskOperationsDialog
7
+ from .RegistrationDialog import RegistrationDialog
8
+ from .ThresholdingDialog import ThresholdingImage
9
+ from .TransformationDialog import TransformationDialog
@@ -0,0 +1,327 @@
1
+ from PyQt5 import QtWidgets, QtCore
2
+ from PyQt5.QtWidgets import (QDialog, QWidget, QLabel, QComboBox, QCheckBox,
3
+ QGroupBox, QRadioButton, QPushButton, QProgressBar,
4
+ QVBoxLayout, QHBoxLayout, QGridLayout, QMenu, QAction)
5
+ from melage.plugins.ui_helpers import *
6
+
7
+ class DynamicDialog(QDialog):
8
+ """
9
+ A Dialog that builds its own UI based on a dictionary schema.
10
+
11
+ It supports:
12
+ - Recursive layouts (Groups, Containers)
13
+ - Widget Registry (access widgets by ID)
14
+ - Automatic Context Menus
15
+ """
16
+
17
+ def __init__(self, schema, parent=None):
18
+ super().__init__(parent)
19
+ self.schema = schema
20
+ self.widgets = {} # Registry to find widgets by ID: self.widgets["my_id"]
21
+
22
+ # 1. Setup Window Properties
23
+
24
+ def update_data_context(self, data_context):
25
+ """
26
+ Update the data context for the dialog.
27
+ """
28
+ self.data_context = data_context
29
+ def create_main_ui(self, schema, default_items=True):
30
+ """
31
+ Main method to create the UI based on the provided schema dictionary.
32
+ This method can be called from __init__ or overridden in subclasses.
33
+ """
34
+ self.setWindowTitle(schema.get("title", "Dynamic Dialog"))
35
+ if "min_width" in schema:
36
+ self.setMinimumWidth(schema["min_width"])
37
+ if "min_height" in schema:
38
+ self.setMinimumHeight(schema["min_height"])
39
+ self.layout_type = schema.get("layout", "vbox")
40
+ self.main_layout = self._create_layout(self.layout_type, self)
41
+
42
+ schema["items"].insert(0,
43
+ Combo(id="combo_view", label="Image View:", options=["view 1", "view 2"], function_name=None),
44
+ )
45
+
46
+
47
+ if default_items:
48
+ schema["items"].append(
49
+ Group(title="Configuration", children=[
50
+ Check(id="check_cuda", text="Use CUDA (GPU) if available"),
51
+
52
+ # --- NEW: Custom Weights Loader ---
53
+ FilePicker(
54
+ id="weights",
55
+ check_label="Custom Weights (.pth):", # it can be label or check lab
56
+ placeholder="Default (Pre-trained)",
57
+ file_filter="PyTorch Models (*.pth *.pt);;All Files (*)"
58
+ ),
59
+ # ----------------------------------
60
+
61
+ #Label(id="lbl_model_info", text="Model Info: Ready")
62
+ ]))
63
+ schema["items"].append(
64
+ # 5. Bottom Row (Progress Bar + Apply Button)
65
+ HBox([
66
+ Progress(id="progress_bar"),
67
+ Button(id="btn_apply", text="Apply", default=True)
68
+ ])
69
+ )
70
+ # 3. Build Items
71
+ # We iterate through the list of items in the schema and build them
72
+ for item in schema.get("items", []):
73
+ self._build_item(item, self.main_layout)
74
+
75
+ def get_widget(self, widget_id):
76
+ """
77
+ Public method to retrieve a specific widget object by its ID string.
78
+ Example: self.get_widget("btn_apply")
79
+ """
80
+ return self.widgets.get(widget_id)
81
+
82
+ def _create_layout(self, layout_type, parent_widget):
83
+ """Helper to create the correct layout object."""
84
+ if layout_type == "hbox":
85
+ l = QHBoxLayout(parent_widget)
86
+ elif layout_type == "grid":
87
+ l = QGridLayout(parent_widget)
88
+ else:
89
+ # Default to Vertical
90
+ l = QVBoxLayout(parent_widget)
91
+
92
+ # If this layout is inside a generic Container (QWidget), remove margins
93
+ # so it aligns perfectly with the rest of the UI.
94
+ # We keep margins if it's the Main Dialog or a GroupBox.
95
+ if isinstance(parent_widget, QWidget) and \
96
+ not isinstance(parent_widget, QDialog) and \
97
+ not isinstance(parent_widget, QGroupBox):
98
+ l.setContentsMargins(0, 0, 0, 0)
99
+
100
+ return l
101
+
102
+ # Inside your DynamicDialog class
103
+
104
+ def _handle_browse_click(self, target_id, file_filter):
105
+ """
106
+ Opens the file dialog and updates the target LineEdit.
107
+ """
108
+ # 1. Open the Dialog
109
+ dir_used = ""
110
+ if hasattr(self, "_last_dir"):
111
+ dir_used = self._last_dir
112
+ path, _ = QtWidgets.QFileDialog.getOpenFileName(
113
+ self,
114
+ "Select File",
115
+ dir_used,
116
+ file_filter
117
+ )
118
+
119
+ # 2. If user selected a file...
120
+ if path:
121
+ # 3. Find the target LineEdit by ID
122
+ target_widget = self.widgets.get(target_id)
123
+
124
+ if isinstance(target_widget, QtWidgets.QLineEdit):
125
+ target_widget.setText(path)
126
+ setattr(self, target_id+"_custom", path)
127
+ # Optional: Move focus away so the text isn't highlighted
128
+ target_widget.clearFocus()
129
+ else:
130
+ print(f"Error: Target widget {target_id} not found or not a LineEdit")
131
+
132
+ def _toggle_widgets(self, is_checked, target_ids):
133
+ """
134
+ Enables or disables a list of widgets based on a checkbox state.
135
+ """
136
+ for tid in target_ids:
137
+ widget = self.widgets.get(tid)
138
+ if widget:
139
+ widget.setEnabled(is_checked)
140
+ else:
141
+ # Safe fail: might happen if targets are built AFTER the checkbox
142
+ # (Though usually not an issue in VBox layouts)
143
+ pass
144
+
145
+
146
+
147
+
148
+ def _build_item(self, item_def, parent_layout):
149
+ """
150
+ Recursively builds a widget from a definition dictionary
151
+ and adds it to the parent_layout.
152
+ """
153
+ widget = None
154
+ w_type = item_def.get("type")
155
+ w_id = item_def.get("id")
156
+ #print(w_type)
157
+ # --- A. Widget Factory ---
158
+ if w_type == "label":
159
+ widget = QLabel(item_def.get("text", ""))
160
+
161
+ if item_def.get('mode') == 'reference':
162
+ # 1. Allow HTML links (<a href="...">) to open browser
163
+ widget.setOpenExternalLinks(True)
164
+
165
+ # 2. Allow user to highlight/copy text with mouse
166
+ widget.setTextInteractionFlags(
167
+ QtCore.Qt.TextBrowserInteraction |
168
+ QtCore.Qt.TextSelectableByMouse
169
+ )
170
+
171
+ # 3. Optional styling (make it look like a footnote)
172
+ widget.setStyleSheet("""
173
+ QLabel {
174
+ background-color: white;
175
+ color: #555;
176
+ font-style: italic;
177
+ margin: 5px;
178
+ padding: 5px;
179
+ border: 1px solid #ddd; /* Optional: adds a subtle border */
180
+ }
181
+ """)
182
+ else:
183
+ widget.setWordWrap(item_def.get('word_wrap', False))
184
+ visible = item_def.get("visible", True)
185
+ widget.setVisible(visible)
186
+
187
+
188
+ elif w_type == "combobox":
189
+ widget = QComboBox()
190
+ widget.addItems(item_def.get("options", []))
191
+ default_option = item_def.get("default", None)
192
+ if default_option and default_option in item_def.get("options", []):
193
+ widget.setCurrentIndex(item_def.get("options", []).index(default_option))
194
+ #func = getattr(self, item_def.get('id'))
195
+ if item_def.get('function_name') is not None:
196
+ widget.currentIndexChanged.connect(getattr(self, item_def.get('function_name')))
197
+
198
+
199
+ elif w_type == 'spinbox':
200
+ # Create QDoubleSpinBox (handles both floats and ints well)
201
+ widget = QtWidgets.QDoubleSpinBox()
202
+ # Configure properties
203
+ enabled = item_def.get('enabled', True)
204
+ widget.setMinimum(item_def.get('min', 0.0))
205
+ widget.setMaximum(item_def.get('max', 100.0))
206
+ widget.setSingleStep(item_def.get('step', 1.0))
207
+ widget.setValue(item_def.get('value', 0.0))
208
+
209
+ # Handle decimals (set to 0 for integer behavior)
210
+ decimals = item_def.get('decimals', 2)
211
+ widget.setDecimals(decimals)
212
+ widget.setEnabled(enabled)
213
+
214
+ elif w_type == "checkbox":
215
+ widget = QCheckBox(item_def.get("text", ""))
216
+ if item_def.get("checked"):
217
+ widget.setChecked(True)
218
+ targets = item_def.get('enable_targets')
219
+ if targets:
220
+ # Connect the toggle signal to our helper
221
+ # rigid=False means: checked=True -> Enabled, checked=False -> Disabled
222
+ widget.toggled.connect(lambda checked: self._toggle_widgets(checked, targets))
223
+
224
+ elif w_type == "radio":
225
+ widget = QRadioButton(item_def.get("text", ""))
226
+ if item_def.get("checked"):
227
+ widget.setChecked(True)
228
+
229
+ elif w_type == "button":
230
+ widget = QPushButton(item_def.get("text", "Button"))
231
+ if item_def.get("default"):
232
+ widget.setDefault(True)
233
+
234
+ # 2. Handle FILE BROWSE Logic
235
+ if item_def.get('special_mode') == 'file_browse':
236
+ target_id = item_def.get('target_id')
237
+ #w_id = target_id
238
+ file_filter = item_def.get('file_filter', "All Files (*)")
239
+
240
+ # Connect the signal to a generic handler in this class
241
+ widget.clicked.connect(lambda: self._handle_browse_click(target_id, file_filter))
242
+ elif w_type=='line_edit':
243
+ widget = QtWidgets.QLineEdit()
244
+ widget.setText(item_def.get("text", ""))
245
+ widget.setPlaceholderText(item_def.get("placeholder", ""))
246
+ widget.setReadOnly(item_def.get("read_only", False))
247
+ if "width" in item_def:
248
+ if item_def['width'] is not None:
249
+ widget.setFixedWidth(item_def["width"])
250
+
251
+
252
+ elif w_type == "progressbar":
253
+ widget = QProgressBar()
254
+ widget.setRange(item_def.get("min", 0), item_def.get("max", 100))
255
+ widget.setValue(item_def.get("value", 0))
256
+
257
+ # --- B. Container Recursion ---
258
+ # GroupBoxes and Containers have 'children', so we recurse.
259
+
260
+ elif w_type == "groupbox":
261
+ widget = QGroupBox(item_def.get("title", ""))
262
+ # Create a layout inside the groupbox
263
+ layout_str = item_def.get("layout", "vbox")
264
+ layout = self._create_layout(layout_str, widget)
265
+ widget.setLayout(layout)
266
+
267
+ # Build children into this new layout
268
+ for child in item_def.get("children", []):
269
+ self._build_item(child, layout)
270
+
271
+ elif w_type == "container":
272
+ # A generic QWidget used to hold a sub-layout (like HBox inside VBox)
273
+ widget = QWidget()
274
+ layout_str = item_def.get("layout", "vbox")
275
+ layout = self._create_layout(layout_str, widget)
276
+ widget.setLayout(layout)
277
+
278
+ for child in item_def.get("children", []):
279
+ self._build_item(child, layout)
280
+
281
+ # --- C. Common Properties & Registration ---
282
+ if widget:
283
+ # 1. Register ID
284
+ if w_id:
285
+ widget.setObjectName(w_id)
286
+ self.widgets[w_id] = widget
287
+
288
+ # 2. Handle Enabled/Disabled state
289
+ if "enabled" in item_def and not item_def["enabled"]:
290
+ widget.setEnabled(False)
291
+
292
+ # 3. Context Menu Wiring
293
+ if "context_menu" in item_def:
294
+ widget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
295
+ # We use a lambda to pass the specific menu items list to the handler
296
+ widget.customContextMenuRequested.connect(
297
+ lambda pos, w=widget, items=item_def["context_menu"]:
298
+ self._show_context_menu(pos, w, items)
299
+ )
300
+
301
+ # 4. Add to Parent Layout
302
+ # If the parent is a Grid, we look for row/col, otherwise just addWidget
303
+ if isinstance(parent_layout, QGridLayout):
304
+ row = item_def.get("row", 0)
305
+ col = item_def.get("col", 0)
306
+ row_span = item_def.get("row_span", 1)
307
+ col_span = item_def.get("col_span", 1)
308
+ parent_layout.addWidget(widget, row, col, row_span, col_span)
309
+ else:
310
+ parent_layout.addWidget(widget)
311
+
312
+ def _show_context_menu(self, pos, widget, items):
313
+ """Internal handler to generate the right-click menu."""
314
+ menu = QMenu(self)
315
+ for text in items:
316
+ action = QAction(text, self)
317
+ # Connect the action to the overridable method 'on_context_action'
318
+ action.triggered.connect(lambda _, t=text: self.on_context_action(t, widget))
319
+ menu.addAction(action)
320
+ menu.exec_(widget.mapToGlobal(pos))
321
+
322
+ def on_context_action(self, text, widget):
323
+ """
324
+ Virtual method.
325
+ Override this in your subclass (e.g., MorphSegLogic) to handle menu clicks.
326
+ """
327
+ print(f"DEBUG: Context action '{text}' on widget '{widget.objectName()}'")