setiastrosuitepro 1.6.5.post3__tar.gz → 1.6.6.post1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of setiastrosuitepro might be problematic. Click here for more details.

Files changed (393) hide show
  1. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/PKG-INFO +2 -1
  2. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/pyproject.toml +2 -1
  3. setiastrosuitepro-1.6.6.post1/src/setiastro/images/first_quarter.png +0 -0
  4. setiastrosuitepro-1.6.6.post1/src/setiastro/images/full_moon.png +0 -0
  5. setiastrosuitepro-1.6.6.post1/src/setiastro/images/last_quarter.png +0 -0
  6. setiastrosuitepro-1.6.6.post1/src/setiastro/images/new_moon.png +0 -0
  7. setiastrosuitepro-1.6.6.post1/src/setiastro/images/waning_crescent_1.png +0 -0
  8. setiastrosuitepro-1.6.6.post1/src/setiastro/images/waning_crescent_2.png +0 -0
  9. setiastrosuitepro-1.6.6.post1/src/setiastro/images/waning_crescent_3.png +0 -0
  10. setiastrosuitepro-1.6.6.post1/src/setiastro/images/waning_crescent_4.png +0 -0
  11. setiastrosuitepro-1.6.6.post1/src/setiastro/images/waning_crescent_5.png +0 -0
  12. setiastrosuitepro-1.6.6.post1/src/setiastro/images/waning_gibbous_1.png +0 -0
  13. setiastrosuitepro-1.6.6.post1/src/setiastro/images/waning_gibbous_2.png +0 -0
  14. setiastrosuitepro-1.6.6.post1/src/setiastro/images/waning_gibbous_3.png +0 -0
  15. setiastrosuitepro-1.6.6.post1/src/setiastro/images/waning_gibbous_4.png +0 -0
  16. setiastrosuitepro-1.6.6.post1/src/setiastro/images/waning_gibbous_5.png +0 -0
  17. setiastrosuitepro-1.6.6.post1/src/setiastro/images/waxing_crescent_1.png +0 -0
  18. setiastrosuitepro-1.6.6.post1/src/setiastro/images/waxing_crescent_2.png +0 -0
  19. setiastrosuitepro-1.6.6.post1/src/setiastro/images/waxing_crescent_3.png +0 -0
  20. setiastrosuitepro-1.6.6.post1/src/setiastro/images/waxing_crescent_4.png +0 -0
  21. setiastrosuitepro-1.6.6.post1/src/setiastro/images/waxing_crescent_5.png +0 -0
  22. setiastrosuitepro-1.6.6.post1/src/setiastro/images/waxing_gibbous_1.png +0 -0
  23. setiastrosuitepro-1.6.6.post1/src/setiastro/images/waxing_gibbous_2.png +0 -0
  24. setiastrosuitepro-1.6.6.post1/src/setiastro/images/waxing_gibbous_3.png +0 -0
  25. setiastrosuitepro-1.6.6.post1/src/setiastro/images/waxing_gibbous_4.png +0 -0
  26. setiastrosuitepro-1.6.6.post1/src/setiastro/images/waxing_gibbous_5.png +0 -0
  27. setiastrosuitepro-1.6.6.post1/src/setiastro/qml/ResourceMonitor.qml +128 -0
  28. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/__main__.py +6 -0
  29. setiastrosuitepro-1.6.6.post1/src/setiastro/saspro/_generated/build_info.py +3 -0
  30. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/abe.py +37 -4
  31. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/aberration_ai.py +228 -16
  32. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/add_stars.py +4 -1
  33. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/backgroundneutral.py +35 -7
  34. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/blemish_blaster.py +4 -1
  35. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/clahe.py +4 -1
  36. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/continuum_subtract.py +4 -1
  37. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/convo.py +4 -1
  38. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/cosmicclarity.py +4 -0
  39. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/crop_dialog_pro.py +27 -5
  40. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/curve_editor_pro.py +49 -3
  41. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/doc_manager.py +67 -4
  42. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/frequency_separation.py +4 -1
  43. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/ghs_dialog_pro.py +81 -16
  44. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/graxpert.py +1 -0
  45. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/gui/main_window.py +175 -81
  46. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/gui/mixins/toolbar_mixin.py +198 -0
  47. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/halobgon.py +4 -0
  48. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/histogram.py +5 -1
  49. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/image_combine.py +4 -0
  50. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/image_peeker_pro.py +4 -0
  51. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/isophote.py +4 -0
  52. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/mask_creation.py +4 -0
  53. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/morphology.py +4 -0
  54. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/multiscale_decomp.py +4 -0
  55. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/psf_viewer.py +119 -37
  56. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/resources.py +65 -0
  57. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/rgbalign.py +4 -0
  58. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/selective_color.py +4 -1
  59. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/sfcc.py +60 -2
  60. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/shortcuts.py +20 -11
  61. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/signature_insert.py +4 -0
  62. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/stacking_suite.py +4 -1
  63. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/star_alignment.py +4 -1
  64. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/star_spikes.py +4 -0
  65. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/star_stretch.py +38 -3
  66. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/stat_stretch.py +22 -6
  67. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/subwindow.py +150 -41
  68. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/wavescale_hdr.py +4 -1
  69. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/wavescalede.py +4 -1
  70. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/whitebalance.py +38 -11
  71. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/widgets/resource_monitor.py +109 -59
  72. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/wims.py +13 -3
  73. setiastrosuitepro-1.6.5.post3/src/setiastro/qml/ResourceMonitor.qml +0 -126
  74. setiastrosuitepro-1.6.5.post3/src/setiastro/saspro/_generated/build_info.py +0 -3
  75. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/LICENSE +0 -0
  76. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/README.md +0 -0
  77. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/license.txt +0 -0
  78. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/__init__.py +0 -0
  79. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/data/SASP_data.fits +0 -0
  80. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/data/catalogs/List_of_Galaxies_with_Distances_Gly.csv +0 -0
  81. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/data/catalogs/astrobin_filters.csv +0 -0
  82. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/data/catalogs/astrobin_filters_page1_local.csv +0 -0
  83. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/data/catalogs/cali2.csv +0 -0
  84. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/data/catalogs/cali2color.csv +0 -0
  85. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/data/catalogs/celestial_catalog - original.csv +0 -0
  86. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/data/catalogs/celestial_catalog.csv +0 -0
  87. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/data/catalogs/detected_stars.csv +0 -0
  88. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/data/catalogs/fits_header_data.csv +0 -0
  89. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/data/catalogs/test.csv +0 -0
  90. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/data/catalogs/updated_celestial_catalog.csv +0 -0
  91. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/Astro_Spikes.png +0 -0
  92. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/Background_startup.jpg +0 -0
  93. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/HRDiagram.png +0 -0
  94. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/LExtract.png +0 -0
  95. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/LInsert.png +0 -0
  96. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/Oxygenation-atm-2.svg.png +0 -0
  97. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/RGB080604.png +0 -0
  98. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/abeicon.png +0 -0
  99. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/aberration.png +0 -0
  100. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/andromedatry.png +0 -0
  101. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/andromedatry_satellited.png +0 -0
  102. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/annotated.png +0 -0
  103. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/aperture.png +0 -0
  104. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/astrosuite.ico +0 -0
  105. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/astrosuite.png +0 -0
  106. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/astrosuitepro.icns +0 -0
  107. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/astrosuitepro.ico +0 -0
  108. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/astrosuitepro.png +0 -0
  109. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/background.png +0 -0
  110. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/background2.png +0 -0
  111. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/benchmark.png +0 -0
  112. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/big_moon_stabilizer_timeline.png +0 -0
  113. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/big_moon_stabilizer_timeline_clean.png +0 -0
  114. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/blaster.png +0 -0
  115. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/blink.png +0 -0
  116. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/clahe.png +0 -0
  117. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/collage.png +0 -0
  118. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/colorwheel.png +0 -0
  119. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/contsub.png +0 -0
  120. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/convo.png +0 -0
  121. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/copyslot.png +0 -0
  122. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/cosmic.png +0 -0
  123. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/cosmicsat.png +0 -0
  124. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/crop1.png +0 -0
  125. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/cropicon.png +0 -0
  126. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/curves.png +0 -0
  127. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/cvs.png +0 -0
  128. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/debayer.png +0 -0
  129. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/denoise_cnn_custom.png +0 -0
  130. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/denoise_cnn_graph.png +0 -0
  131. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/disk.png +0 -0
  132. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/dse.png +0 -0
  133. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/exoicon.png +0 -0
  134. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/eye.png +0 -0
  135. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/fliphorizontal.png +0 -0
  136. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/flipvertical.png +0 -0
  137. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/font.png +0 -0
  138. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/freqsep.png +0 -0
  139. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/functionbundle.png +0 -0
  140. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/graxpert.png +0 -0
  141. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/green.png +0 -0
  142. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/gridicon.png +0 -0
  143. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/halo.png +0 -0
  144. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/hdr.png +0 -0
  145. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/histogram.png +0 -0
  146. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/hubble.png +0 -0
  147. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/imagecombine.png +0 -0
  148. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/invert.png +0 -0
  149. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/isophote.png +0 -0
  150. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/isophote_demo_figure.png +0 -0
  151. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/isophote_demo_image.png +0 -0
  152. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/isophote_demo_model.png +0 -0
  153. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/isophote_demo_residual.png +0 -0
  154. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/jwstpupil.png +0 -0
  155. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/linearfit.png +0 -0
  156. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/livestacking.png +0 -0
  157. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/mask.png +0 -0
  158. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/maskapply.png +0 -0
  159. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/maskcreate.png +0 -0
  160. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/maskremove.png +0 -0
  161. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/morpho.png +0 -0
  162. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/mosaic.png +0 -0
  163. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/multiscale_decomp.png +0 -0
  164. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/nbtorgb.png +0 -0
  165. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/neutral.png +0 -0
  166. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/nuke.png +0 -0
  167. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/openfile.png +0 -0
  168. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/pedestal.png +0 -0
  169. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/pen.png +0 -0
  170. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/pixelmath.png +0 -0
  171. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/platesolve.png +0 -0
  172. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/ppp.png +0 -0
  173. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/pro.png +0 -0
  174. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/project.png +0 -0
  175. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/psf.png +0 -0
  176. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/redo.png +0 -0
  177. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/redoicon.png +0 -0
  178. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/rescale.png +0 -0
  179. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/rgbalign.png +0 -0
  180. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/rgbcombo.png +0 -0
  181. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/rgbextract.png +0 -0
  182. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/rotate180.png +0 -0
  183. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/rotatearbitrary.png +0 -0
  184. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/rotateclockwise.png +0 -0
  185. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/rotatecounterclockwise.png +0 -0
  186. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/satellite.png +0 -0
  187. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/script.png +0 -0
  188. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/selectivecolor.png +0 -0
  189. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/simbad.png +0 -0
  190. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/slot0.png +0 -0
  191. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/slot1.png +0 -0
  192. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/slot2.png +0 -0
  193. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/slot3.png +0 -0
  194. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/slot4.png +0 -0
  195. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/slot5.png +0 -0
  196. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/slot6.png +0 -0
  197. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/slot7.png +0 -0
  198. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/slot8.png +0 -0
  199. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/slot9.png +0 -0
  200. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/spcc.png +0 -0
  201. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/spin_precession_vs_lunar_distance.png +0 -0
  202. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/spinner.gif +0 -0
  203. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/stacking.png +0 -0
  204. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/staradd.png +0 -0
  205. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/staralign.png +0 -0
  206. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/starnet.png +0 -0
  207. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/starregistration.png +0 -0
  208. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/starspike.png +0 -0
  209. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/starstretch.png +0 -0
  210. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/statstretch.png +0 -0
  211. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/supernova.png +0 -0
  212. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/uhs.png +0 -0
  213. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/undoicon.png +0 -0
  214. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/upscale.png +0 -0
  215. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/viewbundle.png +0 -0
  216. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/whitebalance.png +0 -0
  217. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/wimi_icon_256x256.png +0 -0
  218. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/wimilogo.png +0 -0
  219. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/wims.png +0 -0
  220. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/wrench_icon.png +0 -0
  221. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/images/xisfliberator.png +0 -0
  222. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/__init__.py +0 -0
  223. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/_generated/__init__.py +0 -0
  224. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/abe_preset.py +0 -0
  225. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/aberration_ai_preset.py +0 -0
  226. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/accel_installer.py +0 -0
  227. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/accel_workers.py +0 -0
  228. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/astrobin_exporter.py +0 -0
  229. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/astrospike.py +0 -0
  230. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/astrospike_python.py +0 -0
  231. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/autostretch.py +0 -0
  232. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/batch_convert.py +0 -0
  233. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/batch_renamer.py +0 -0
  234. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/blink_comparator_pro.py +0 -0
  235. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/bundles.py +0 -0
  236. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/bundles_dock.py +0 -0
  237. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/cheat_sheet.py +0 -0
  238. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/comet_stacking.py +0 -0
  239. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/common_tr.py +0 -0
  240. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/config.py +0 -0
  241. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/config_bootstrap.py +0 -0
  242. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/config_manager.py +0 -0
  243. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/convo_preset.py +0 -0
  244. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/copyastro.py +0 -0
  245. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/cosmicclarity_preset.py +0 -0
  246. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/crop_preset.py +0 -0
  247. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/curves_preset.py +0 -0
  248. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/debayer.py +0 -0
  249. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/debug_utils.py +0 -0
  250. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/dnd_mime.py +0 -0
  251. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/exoplanet_detector.py +0 -0
  252. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/file_utils.py +0 -0
  253. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/fitsmodifier.py +0 -0
  254. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/fix_bom.py +0 -0
  255. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/free_torch_memory.py +0 -0
  256. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/function_bundle.py +0 -0
  257. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/generate_translations.py +0 -0
  258. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/ghs_preset.py +0 -0
  259. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/graxpert_preset.py +0 -0
  260. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/gui/__init__.py +0 -0
  261. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/gui/mixins/__init__.py +0 -0
  262. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/gui/mixins/dock_mixin.py +0 -0
  263. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/gui/mixins/file_mixin.py +0 -0
  264. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/gui/mixins/geometry_mixin.py +0 -0
  265. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/gui/mixins/header_mixin.py +0 -0
  266. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/gui/mixins/mask_mixin.py +0 -0
  267. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/gui/mixins/menu_mixin.py +0 -0
  268. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/gui/mixins/theme_mixin.py +0 -0
  269. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/gui/mixins/update_mixin.py +0 -0
  270. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/gui/mixins/view_mixin.py +0 -0
  271. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/gui/statistics_dialog.py +0 -0
  272. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/header_viewer.py +0 -0
  273. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/headless_utils.py +0 -0
  274. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/history_explorer.py +0 -0
  275. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/i18n.py +0 -0
  276. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/imageops/__init__.py +0 -0
  277. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/imageops/mdi_snap.py +0 -0
  278. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/imageops/scnr.py +0 -0
  279. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/imageops/starbasedwhitebalance.py +0 -0
  280. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/imageops/stretch.py +0 -0
  281. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/layers.py +0 -0
  282. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/layers_dock.py +0 -0
  283. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/lazy_imports.py +0 -0
  284. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/legacy/__init__.py +0 -0
  285. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/legacy/image_manager.py +0 -0
  286. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/legacy/numba_utils.py +0 -0
  287. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/legacy/xisf.py +0 -0
  288. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/linear_fit.py +0 -0
  289. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/live_stacking.py +0 -0
  290. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/log_bus.py +0 -0
  291. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/logging_config.py +0 -0
  292. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/luminancerecombine.py +0 -0
  293. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/main_helpers.py +0 -0
  294. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/masks_core.py +0 -0
  295. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/mdi_widgets.py +0 -0
  296. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/memory_utils.py +0 -0
  297. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/metadata_patcher.py +0 -0
  298. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/mfdeconv.py +0 -0
  299. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/mfdeconv_earlystop.py +0 -0
  300. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/mfdeconvcudnn.py +0 -0
  301. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/mfdeconvsport.py +0 -0
  302. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/minorbodycatalog.py +0 -0
  303. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/nbtorgb_stars.py +0 -0
  304. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/numba_utils.py +0 -0
  305. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/numba_warmup.py +0 -0
  306. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/ops/__init__.py +0 -0
  307. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/ops/command_help_dialog.py +0 -0
  308. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/ops/command_runner.py +0 -0
  309. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/ops/commands.py +0 -0
  310. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/ops/script_editor.py +0 -0
  311. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/ops/scripts.py +0 -0
  312. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/ops/settings.py +0 -0
  313. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/parallel_utils.py +0 -0
  314. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/pedestal.py +0 -0
  315. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/perfect_palette_picker.py +0 -0
  316. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/pipeline.py +0 -0
  317. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/pixelmath.py +0 -0
  318. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/plate_solver.py +0 -0
  319. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/project_io.py +0 -0
  320. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/psf_utils.py +0 -0
  321. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/pyi_rthook_astroquery.py +0 -0
  322. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/remove_green.py +0 -0
  323. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/remove_stars.py +0 -0
  324. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/remove_stars_preset.py +0 -0
  325. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/rgb_combination.py +0 -0
  326. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/rgb_extract.py +0 -0
  327. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/runtime_imports.py +0 -0
  328. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/runtime_torch.py +0 -0
  329. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/save_options.py +0 -0
  330. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/star_alignment_preset.py +0 -0
  331. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/star_metrics.py +0 -0
  332. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/status_log_dock.py +0 -0
  333. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/supernovaasteroidhunter.py +0 -0
  334. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/swap_manager.py +0 -0
  335. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/torch_backend.py +0 -0
  336. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/torch_rejection.py +0 -0
  337. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/all_source_strings.json +0 -0
  338. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/ar_translations.py +0 -0
  339. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/de_translations.py +0 -0
  340. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/es_translations.py +0 -0
  341. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/fr_translations.py +0 -0
  342. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/hi_translations.py +0 -0
  343. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/integrate_translations.py +0 -0
  344. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/it_translations.py +0 -0
  345. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/ja_translations.py +0 -0
  346. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/pt_translations.py +0 -0
  347. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/ru_translations.py +0 -0
  348. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/saspro_ar.qm +0 -0
  349. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/saspro_ar.ts +0 -0
  350. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/saspro_de.qm +0 -0
  351. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/saspro_de.ts +0 -0
  352. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/saspro_es.qm +0 -0
  353. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/saspro_es.ts +0 -0
  354. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/saspro_fr.qm +0 -0
  355. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/saspro_fr.ts +0 -0
  356. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/saspro_hi.qm +0 -0
  357. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/saspro_hi.ts +0 -0
  358. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/saspro_it.qm +0 -0
  359. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/saspro_it.ts +0 -0
  360. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/saspro_ja.qm +0 -0
  361. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/saspro_ja.ts +0 -0
  362. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/saspro_pt.qm +0 -0
  363. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/saspro_pt.ts +0 -0
  364. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/saspro_ru.qm +0 -0
  365. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/saspro_ru.ts +0 -0
  366. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/saspro_sw.qm +0 -0
  367. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/saspro_sw.ts +0 -0
  368. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/saspro_uk.qm +0 -0
  369. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/saspro_uk.ts +0 -0
  370. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/saspro_zh.qm +0 -0
  371. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/saspro_zh.ts +0 -0
  372. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/sw_translations.py +0 -0
  373. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/uk_translations.py +0 -0
  374. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/translations/zh_translations.py +0 -0
  375. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/versioning.py +0 -0
  376. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/view_bundle.py +0 -0
  377. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/wavescale_hdr_preset.py +0 -0
  378. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/wavescalede_preset.py +0 -0
  379. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/wcs_update.py +0 -0
  380. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/widgets/__init__.py +0 -0
  381. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/widgets/common_utilities.py +0 -0
  382. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/widgets/graphics_views.py +0 -0
  383. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/widgets/image_utils.py +0 -0
  384. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/widgets/minigame/game.js +0 -0
  385. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/widgets/minigame/index.html +0 -0
  386. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/widgets/minigame/style.css +0 -0
  387. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/widgets/preview_dialogs.py +0 -0
  388. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/widgets/spinboxes.py +0 -0
  389. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/widgets/themed_buttons.py +0 -0
  390. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/widgets/wavelet_utils.py +0 -0
  391. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/wimi.py +0 -0
  392. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/window_shelf.py +0 -0
  393. {setiastrosuitepro-1.6.5.post3 → setiastrosuitepro-1.6.6.post1}/src/setiastro/saspro/xisf.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: setiastrosuitepro
3
- Version: 1.6.5.post3
3
+ Version: 1.6.6.post1
4
4
  Summary: Seti Astro Suite Pro - Advanced astrophotography toolkit for image calibration, stacking, registration, photometry, and visualization
5
5
  License: GPL-3.0
6
6
  License-File: LICENSE
@@ -25,6 +25,7 @@ Requires-Dist: astroalign
25
25
  Requires-Dist: astropy
26
26
  Requires-Dist: astroquery
27
27
  Requires-Dist: exifread
28
+ Requires-Dist: imagecodecs (>=2025.11.11,<2026.0.0) ; python_version >= "3.11" and sys_platform == "darwin"
28
29
  Requires-Dist: imageio
29
30
  Requires-Dist: jplephem
30
31
  Requires-Dist: lightkurve
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "setiastrosuitepro"
3
- version = "1.6.5.post3"
3
+ version = "1.6.6.post1"
4
4
  description = "Seti Astro Suite Pro - Advanced astrophotography toolkit for image calibration, stacking, registration, photometry, and visualization"
5
5
  authors = ["Franklin Marek <info@setiastro.com>"]
6
6
  readme = "README.md"
@@ -77,6 +77,7 @@ psutil = "*"
77
77
 
78
78
  # computer vision
79
79
  opencv-python-headless = "*"
80
+ imagecodecs = {version = "^2025.11.11", python = ">=3.11", platform = "darwin"}
80
81
 
81
82
  [tool.poetry.group.dev.dependencies]
82
83
  pytest = "*"
@@ -0,0 +1,128 @@
1
+ import QtQuick 2.15
2
+ import QtQuick.Controls 2.15
3
+ import QtQuick.Layouts 1.15
4
+ import QtQuick.Window 2.15 // ✅ gives us access to the attached Window handle
5
+
6
+ Rectangle {
7
+ id: root
8
+ width: 200
9
+ height: 60
10
+ color: "#80000000"
11
+ radius: 30
12
+ border.color: "#555"
13
+ border.width: 1
14
+
15
+ // Bind directly to the injected Python object (context property "backend")
16
+ property double cpuUsage: backend ? backend.cpuUsage : 0.0
17
+ property double ramUsage: backend ? backend.ramUsage : 0.0
18
+ property double gpuUsage: backend ? backend.gpuUsage : 0.0
19
+ property string appRamString: backend ? backend.appRamString : "0 MB"
20
+
21
+ // ─── Wayland-friendly drag (works if we have a real QQuickWindow) ───
22
+ MouseArea {
23
+ anchors.fill: parent
24
+ hoverEnabled: true
25
+ cursorShape: Qt.OpenHandCursor
26
+
27
+ onPressed: {
28
+ // Window-attached handle: root.Window.window is the QQuickWindow
29
+ var w = root.Window ? root.Window.window : null;
30
+ if (w && w.startSystemMove) {
31
+ // Wayland: this is the correct, compositor-approved move
32
+ w.startSystemMove();
33
+ } else {
34
+ // Fallback (Windows embed, or platforms where startSystemMove isn't exposed)
35
+ // Do nothing; your existing Windows behavior remains unchanged.
36
+ }
37
+ }
38
+ }
39
+
40
+ component MiniGauge: Item {
41
+ Layout.preferredWidth: 40
42
+ Layout.preferredHeight: 40
43
+ property string label: ""
44
+ property color barColor: "#0f0"
45
+ property double value: 0
46
+
47
+ onValueChanged: if (gaugeCanvas) gaugeCanvas.requestPaint()
48
+
49
+ Canvas {
50
+ id: gaugeCanvas
51
+ anchors.fill: parent
52
+ antialiasing: true
53
+ onPaint: {
54
+ var ctx = getContext("2d");
55
+ var cx = width / 2;
56
+ var cy = height / 2;
57
+ var r = (width / 2) - 3;
58
+
59
+ ctx.reset();
60
+
61
+ ctx.beginPath();
62
+ ctx.arc(cx, cy, r, 0, 2*Math.PI);
63
+ ctx.lineWidth = 4;
64
+ ctx.strokeStyle = "#444";
65
+ ctx.stroke();
66
+
67
+ var start = -Math.PI/2;
68
+ var end = start + (value/100 * 2*Math.PI);
69
+
70
+ ctx.beginPath();
71
+ ctx.arc(cx, cy, r, start, end);
72
+ ctx.lineWidth = 4;
73
+ ctx.lineCap = "round";
74
+ ctx.strokeStyle = barColor;
75
+ ctx.stroke();
76
+ }
77
+ }
78
+
79
+ Text {
80
+ anchors.centerIn: parent
81
+ text: Math.round(value) + "%"
82
+ font.pixelSize: 10
83
+ font.bold: true
84
+ color: "#fff"
85
+ }
86
+ }
87
+
88
+ RowLayout {
89
+ anchors.centerIn: parent
90
+ spacing: 15
91
+
92
+ ColumnLayout {
93
+ spacing: 2
94
+ MiniGauge {
95
+ value: root.cpuUsage
96
+ barColor: root.cpuUsage > 80 ? "#ff4444" : (root.cpuUsage > 50 ? "#ffbb33" : "#00C851")
97
+ }
98
+ Text {
99
+ Layout.alignment: Qt.AlignHCenter
100
+ text: "CPU"
101
+ color: "#aaaaaa"
102
+ font.pixelSize: 9
103
+ }
104
+ }
105
+
106
+ ColumnLayout {
107
+ spacing: 2
108
+ MiniGauge { value: root.ramUsage; barColor: "#33b5e5" }
109
+ Text {
110
+ Layout.alignment: Qt.AlignHCenter
111
+ text: "RAM"
112
+ color: "#aaaaaa"
113
+ font.pixelSize: 9
114
+ }
115
+ }
116
+
117
+ ColumnLayout {
118
+ spacing: 2
119
+ MiniGauge { value: root.gpuUsage; barColor: "#aa66cc" }
120
+ Text {
121
+ Layout.alignment: Qt.AlignHCenter
122
+ text: "GPU"
123
+ color: "#aaaaaa"
124
+ font.pixelSize: 9
125
+ }
126
+ }
127
+ }
128
+ }
@@ -92,9 +92,15 @@ def _init_splash():
92
92
  # Create QApplication
93
93
  _app = QApplication(sys.argv)
94
94
 
95
+ try:
96
+ _app.setQuitOnLastWindowClosed(True)
97
+ except Exception:
98
+ pass
99
+
95
100
  if sys.platform.startswith("linux"):
96
101
  try:
97
102
  print("Qt platform:", _app.platformName())
103
+ print("QuitOnLastWindowClosed:", _app.quitOnLastWindowClosed())
98
104
  print("XDG_SESSION_TYPE:", os.environ.get("XDG_SESSION_TYPE"))
99
105
  print("QT_QPA_PLATFORM:", os.environ.get("QT_QPA_PLATFORM"))
100
106
  print("QT_OPENGL:", os.environ.get("QT_OPENGL"))
@@ -0,0 +1,3 @@
1
+ # Auto-generated at build time. Do not edit.
2
+ BUILD_TIMESTAMP = "2025-12-30T18:14:14Z"
3
+ APP_VERSION = "1.6.7"
@@ -491,14 +491,21 @@ class ABEDialog(QDialog):
491
491
  # Non-modal: allow user to switch between images while dialog is open
492
492
  self.setWindowModality(Qt.WindowModality.NonModal)
493
493
  self.setModal(False)
494
- #self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose, True)
494
+ try:
495
+ self.setAttribute(Qt.WidgetAttribute.WA_DeleteOnClose, True)
496
+ except Exception:
497
+ pass # older PyQt6 versions
495
498
 
496
499
  self._main = parent
497
500
  self.doc = document
498
501
 
499
- # Connect to active document change signal
502
+ self._connected_current_doc_changed = False
500
503
  if hasattr(self._main, "currentDocumentChanged"):
501
- self._main.currentDocumentChanged.connect(self._on_active_doc_changed)
504
+ try:
505
+ self._main.currentDocumentChanged.connect(self._on_active_doc_changed)
506
+ self._connected_current_doc_changed = True
507
+ except Exception:
508
+ self._connected_current_doc_changed = False
502
509
 
503
510
  self._preview_scale = 1.0
504
511
  self._preview_qimg = None
@@ -844,12 +851,38 @@ class ABEDialog(QDialog):
844
851
  self._set_status("Done")
845
852
  # Dialog stays open so user can apply to other images
846
853
  # Refresh to use the now-active document for next operation
847
- self._refresh_document_from_active()
854
+ self.close()
855
+ return
848
856
 
849
857
  except Exception as e:
850
858
  self._set_status("Error")
851
859
  QMessageBox.critical(self, "Apply failed", str(e))
852
860
 
861
+ def closeEvent(self, ev):
862
+ # 1) Disconnect active-doc tracking (Fabio hook)
863
+ try:
864
+ if self._connected_current_doc_changed and hasattr(self._main, "currentDocumentChanged"):
865
+ self._main.currentDocumentChanged.disconnect(self._on_active_doc_changed)
866
+ except Exception:
867
+ pass
868
+ self._connected_current_doc_changed = False
869
+
870
+ # 2) Stop any background preview worker/thread if you have one
871
+ # (names may differ in your file; keep what matches your implementation)
872
+ try:
873
+ if getattr(self, "_worker", None) is not None:
874
+ try:
875
+ self._worker.requestInterruption()
876
+ except Exception:
877
+ pass
878
+ if getattr(self, "_thread", None) is not None:
879
+ self._thread.quit()
880
+ self._thread.wait(500)
881
+ except Exception:
882
+ pass
883
+
884
+ super().closeEvent(ev)
885
+
853
886
  def _refresh_document_from_active(self):
854
887
  """
855
888
  Refresh the dialog's document reference to the currently active document.
@@ -13,7 +13,7 @@ IS_APPLE_ARM = (sys.platform == "darwin" and platform.machine() == "arm64")
13
13
  from PyQt6.QtCore import Qt, QThread, pyqtSignal, QStandardPaths, QSettings
14
14
  from PyQt6.QtWidgets import (
15
15
  QDialog, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QFileDialog,
16
- QComboBox, QSpinBox, QProgressBar, QMessageBox, QCheckBox
16
+ QComboBox, QSpinBox, QProgressBar, QMessageBox, QCheckBox, QLineEdit
17
17
  )
18
18
  from PyQt6.QtGui import QIcon
19
19
  from setiastro.saspro.config import Config
@@ -315,11 +315,29 @@ class AberrationAIDialog(QDialog):
315
315
  row.addWidget(QLabel(self.tr("Model:")))
316
316
  self.model_label = QLabel("—")
317
317
  self.model_label.setToolTip("")
318
- btn_browse = QPushButton(self.tr("Browse…")); btn_browse.clicked.connect(self._browse_model)
318
+ btn_browse = QPushButton(self.tr("Browse…")); btn_browse.clicked.connect(self._browse_active_model)
319
319
  row.addWidget(self.model_label, 1)
320
320
  row.addWidget(btn_browse)
321
321
  v.addLayout(row)
322
+ # Custom model row (NEW)
323
+ row_custom = QHBoxLayout()
324
+ self.chk_use_custom = QCheckBox(self.tr("Use custom model file"))
325
+ self.chk_use_custom.setChecked(False)
326
+ self.chk_use_custom.toggled.connect(self._on_use_custom_toggled)
322
327
 
328
+ self.le_custom_model = QLineEdit()
329
+ self.le_custom_model.setReadOnly(True)
330
+ self.le_custom_model.setPlaceholderText(self.tr("No custom model selected"))
331
+ self.le_custom_model.setToolTip("")
332
+
333
+ btn_custom_clear = QPushButton(self.tr("Clear"))
334
+ btn_custom_clear.clicked.connect(self._clear_custom_model)
335
+
336
+ row_custom.addWidget(self.chk_use_custom)
337
+ row_custom.addWidget(self.le_custom_model, 1)
338
+
339
+ row_custom.addWidget(btn_custom_clear)
340
+ v.addLayout(row_custom)
323
341
  # Providers row
324
342
  row2 = QHBoxLayout()
325
343
  self.chk_auto = QCheckBox(self.tr("Auto GPU (if available)"))
@@ -373,7 +391,9 @@ class AberrationAIDialog(QDialog):
373
391
  self._model_path = None
374
392
  self._refresh_providers()
375
393
  self._load_last_model_from_settings()
376
-
394
+ self._load_last_custom_model_from_settings()
395
+ use_custom = QSettings().value("AberrationAI/use_custom_model", False, type=bool)
396
+ self.chk_use_custom.setChecked(bool(use_custom))
377
397
  if IS_APPLE_ARM:
378
398
  self.chk_auto.setChecked(False)
379
399
  self.chk_auto.setEnabled(False)
@@ -395,11 +415,73 @@ class AberrationAIDialog(QDialog):
395
415
  if p and os.path.isfile(p):
396
416
  self._set_model_path(p)
397
417
 
398
- def _browse_model(self):
399
- start_dir = _app_model_dir()
418
+ def _browse_active_model(self):
419
+ """
420
+ Single Browse button.
421
+ - If user picks a file inside the app model folder -> treat as "downloaded" selection (use_custom_model=False)
422
+ - If user picks a file outside -> treat as "custom" (use_custom_model=True)
423
+ """
424
+ app_dir = os.path.abspath(_app_model_dir())
425
+
426
+ # Start in last-used folder if possible
427
+ last_custom = QSettings().value("AberrationAI/custom_model_path", type=str) or ""
428
+ last_downloaded = QSettings().value("AberrationAI/model_path", type=str) or ""
429
+ start_dir = None
430
+ for candidate in (last_custom, last_downloaded):
431
+ if candidate and os.path.isfile(candidate):
432
+ d = os.path.dirname(candidate)
433
+ if os.path.isdir(d):
434
+ start_dir = d
435
+ break
436
+ if start_dir is None:
437
+ start_dir = app_dir
438
+
400
439
  p, _ = QFileDialog.getOpenFileName(self, "Select ONNX model", start_dir, "ONNX (*.onnx)")
401
- if p:
402
- self._set_model_path(p)
440
+ if not p:
441
+ return
442
+
443
+ p_abs = os.path.abspath(p)
444
+ # Determine if picked file is inside app model folder
445
+ in_app_dir = False
446
+ try:
447
+ in_app_dir = os.path.commonpath([app_dir, p_abs]) == app_dir
448
+ except Exception:
449
+ in_app_dir = p_abs.startswith(app_dir)
450
+
451
+ if in_app_dir:
452
+ # "Downloaded" selection
453
+ self._set_model_path(p_abs)
454
+ self._set_custom_model_path(None)
455
+ QSettings().setValue("AberrationAI/use_custom_model", False)
456
+ if hasattr(self, "chk_use_custom"):
457
+ self.chk_use_custom.setChecked(False)
458
+ else:
459
+ # "Custom" selection
460
+ self._set_custom_model_path(p_abs)
461
+ QSettings().setValue("AberrationAI/use_custom_model", True)
462
+ if hasattr(self, "chk_use_custom"):
463
+ self.chk_use_custom.setChecked(True)
464
+
465
+ # Keep visuals in sync
466
+ self._refresh_model_label()
467
+ self._refresh_custom_row_visibility()
468
+
469
+
470
+ def _refresh_model_label(self):
471
+ downloaded = QSettings().value("AberrationAI/model_path", type=str) or ""
472
+ custom = QSettings().value("AberrationAI/custom_model_path", type=str) or ""
473
+ use_custom = QSettings().value("AberrationAI/use_custom_model", False, type=bool)
474
+
475
+ if use_custom and custom:
476
+ self.model_label.setText(f"Custom: {os.path.basename(custom)}")
477
+ self.model_label.setToolTip(custom)
478
+ elif downloaded:
479
+ self.model_label.setText(f"Downloaded: {os.path.basename(downloaded)}")
480
+ self.model_label.setToolTip(downloaded)
481
+ else:
482
+ self.model_label.setText("—")
483
+ self.model_label.setToolTip("")
484
+
403
485
 
404
486
  def _open_model_folder(self):
405
487
  d = _app_model_dir()
@@ -412,6 +494,108 @@ class AberrationAIDialog(QDialog):
412
494
  import subprocess; subprocess.Popen(["xdg-open", d])
413
495
  except Exception:
414
496
  webbrowser.open(f"file://{d}")
497
+ # ----- custom model helpers (NEW) -----
498
+ def _set_custom_model_path(self, p: str | None):
499
+ if p:
500
+ self.le_custom_model.setText(os.path.basename(p))
501
+ self.le_custom_model.setToolTip(p)
502
+ QSettings().setValue("AberrationAI/custom_model_path", p)
503
+ else:
504
+ self.le_custom_model.clear()
505
+ self.le_custom_model.setToolTip("")
506
+ QSettings().remove("AberrationAI/custom_model_path")
507
+
508
+ def _load_last_custom_model_from_settings(self):
509
+ p = QSettings().value("AberrationAI/custom_model_path", type=str)
510
+ if p:
511
+ if os.path.isfile(p):
512
+ self._set_custom_model_path(p)
513
+ else:
514
+ # Keep the broken path visible in tooltip for debugging
515
+ if hasattr(self, "le_custom_model"):
516
+ self.le_custom_model.setText(os.path.basename(p) + " (missing)")
517
+ self.le_custom_model.setToolTip(p)
518
+
519
+ # After both loads, sync labels/visibility
520
+ self._refresh_model_label()
521
+ self._refresh_custom_row_visibility()
522
+
523
+ def _refresh_custom_row_visibility(self):
524
+ """
525
+ If you keep the custom row in the UI, hide the path field unless custom is enabled.
526
+ """
527
+ if not hasattr(self, "le_custom_model"):
528
+ return
529
+ use_custom = QSettings().value("AberrationAI/use_custom_model", False, type=bool)
530
+ self.le_custom_model.setVisible(bool(use_custom))
531
+
532
+
533
+ def _refresh_model_label(self):
534
+ downloaded = QSettings().value("AberrationAI/model_path", type=str) or ""
535
+ custom = QSettings().value("AberrationAI/custom_model_path", type=str) or ""
536
+ use_custom = QSettings().value("AberrationAI/use_custom_model", False, type=bool)
537
+
538
+ # Prefer custom only if enabled AND the file exists
539
+ if use_custom and custom:
540
+ if os.path.isfile(custom):
541
+ self.model_label.setText(f"Custom: {os.path.basename(custom)}")
542
+ self.model_label.setToolTip(custom)
543
+ return
544
+ else:
545
+ self.model_label.setText(f"Custom: {os.path.basename(custom)} (missing)")
546
+ self.model_label.setToolTip(custom)
547
+ return
548
+
549
+ # Otherwise show downloaded if valid
550
+ if downloaded and os.path.isfile(downloaded):
551
+ self.model_label.setText(f"Downloaded: {os.path.basename(downloaded)}")
552
+ self.model_label.setToolTip(downloaded)
553
+ else:
554
+ self.model_label.setText("—")
555
+ self.model_label.setToolTip("")
556
+
557
+
558
+ def _browse_custom_model(self):
559
+ # Start at last dir if possible, else app model dir
560
+ last = QSettings().value("AberrationAI/custom_model_path", type=str) or ""
561
+ start_dir = os.path.dirname(last) if last and os.path.isdir(os.path.dirname(last)) else _app_model_dir()
562
+ p, _ = QFileDialog.getOpenFileName(self, "Select custom ONNX model", start_dir, "ONNX (*.onnx)")
563
+ if p:
564
+ self._set_custom_model_path(p)
565
+ QSettings().setValue("AberrationAI/use_custom_model", True)
566
+ if not self.chk_use_custom.isChecked():
567
+ self.chk_use_custom.setChecked(True)
568
+
569
+ def _clear_custom_model(self):
570
+ self._set_custom_model_path(None)
571
+ QSettings().setValue("AberrationAI/use_custom_model", False)
572
+ if hasattr(self, "chk_use_custom"):
573
+ self.chk_use_custom.setChecked(False)
574
+
575
+ self._refresh_model_label()
576
+ self._refresh_custom_row_visibility()
577
+
578
+
579
+ def _on_use_custom_toggled(self, on: bool):
580
+ QSettings().setValue("AberrationAI/use_custom_model", bool(on))
581
+
582
+ if on:
583
+ p = QSettings().value("AberrationAI/custom_model_path", type=str) or ""
584
+ if not (p and os.path.isfile(p)):
585
+ # Don’t spawn another browse button path; use the ONE browse if they want
586
+ QMessageBox.information(
587
+ self,
588
+ self.tr("Custom model"),
589
+ self.tr("Custom model is enabled, but no custom file is selected.\n"
590
+ "Click Browse… to choose a model file.")
591
+ )
592
+ # Optional: auto-open the single browse:
593
+ # self._browse_active_model()
594
+ # return
595
+
596
+ self._refresh_model_label()
597
+ self._refresh_custom_row_visibility()
598
+
415
599
 
416
600
  # ----- provider UI -----
417
601
  def _log(self, msg: str): # NEW
@@ -477,8 +661,16 @@ class AberrationAIDialog(QDialog):
477
661
  def _on_download_ok(self, path: str):
478
662
  self.progress.setValue(100)
479
663
  self._set_model_path(path)
664
+
665
+ # Download becomes the active model unless custom is explicitly enabled
666
+ if not QSettings().value("AberrationAI/use_custom_model", False, type=bool):
667
+ self._set_custom_model_path(None)
668
+
480
669
  QMessageBox.information(self, "Model", f"Downloaded: {os.path.basename(path)}")
481
670
 
671
+ self._refresh_model_label()
672
+ self._refresh_custom_row_visibility()
673
+
482
674
  # ----- run -----
483
675
  def _run(self):
484
676
  if ort is None:
@@ -489,7 +681,22 @@ class AberrationAIDialog(QDialog):
489
681
  "Please try installing an earlier version (for example 1.19.x) and try again."
490
682
  )
491
683
  return
492
- if not self._model_path or not os.path.isfile(self._model_path):
684
+
685
+ # Choose model path (normal vs custom)
686
+ use_custom = QSettings().value("AberrationAI/use_custom_model", False, type=bool)
687
+ downloaded = QSettings().value("AberrationAI/model_path", type=str) or ""
688
+ custom = QSettings().value("AberrationAI/custom_model_path", type=str) or ""
689
+
690
+ model_path = custom if use_custom else downloaded
691
+ if self.chk_use_custom.isChecked():
692
+ cp = QSettings().value("AberrationAI/custom_model_path", type=str)
693
+ if cp and os.path.isfile(cp):
694
+ model_path = cp
695
+ else:
696
+ QMessageBox.warning(self, "Model", "Custom model is enabled but the file is missing. Please browse to a valid .onnx.")
697
+ return
698
+
699
+ if not model_path or not os.path.isfile(model_path):
493
700
  QMessageBox.warning(self, "Model", "Please select or download a valid .onnx model first.")
494
701
  return
495
702
 
@@ -516,7 +723,7 @@ class AberrationAIDialog(QDialog):
516
723
  providers = [sel] if sel else ["CPUExecutionProvider"]
517
724
 
518
725
  # --- make patch match the model's requirement (if fixed) ---
519
- req = _model_required_patch(self._model_path)
726
+ req = _model_required_patch(model_path)
520
727
  if req and req > 0:
521
728
  patch = req
522
729
  try:
@@ -537,14 +744,16 @@ class AberrationAIDialog(QDialog):
537
744
 
538
745
  self._t_start = time.perf_counter()
539
746
  prov_txt = ("auto" if self.chk_auto.isChecked() else self.cmb_provider.currentText() or "CPU")
540
- self._log(f"🚀 Aberration AI: model={os.path.basename(self._model_path)}, "
747
+ self._log(f"🚀 Aberration AI: model={os.path.basename(model_path)}, "
541
748
  f"provider={prov_txt}, patch={patch}, overlap={overlap}")
749
+
750
+ self._effective_model_path = model_path
542
751
 
543
752
  # -------- run worker --------
544
753
  self.progress.setValue(0)
545
754
  self.btn_run.setEnabled(False)
546
755
 
547
- self._worker = _ONNXWorker(self._model_path, img, patch, overlap, providers)
756
+ self._worker = _ONNXWorker(model_path, img, patch, overlap, providers)
548
757
  self._worker.progressed.connect(self.progress.setValue)
549
758
  self._worker.failed.connect(self._on_failed)
550
759
  self._worker.finished_ok.connect(self._on_ok)
@@ -553,11 +762,15 @@ class AberrationAIDialog(QDialog):
553
762
 
554
763
 
555
764
  def _on_failed(self, msg: str):
765
+ model_path = getattr(self, "_effective_model_path", self._model_path)
556
766
  self._log(f"❌ Aberration AI failed: {msg}")
557
767
  QMessageBox.critical(self, "ONNX Error", msg)
558
768
  self.reject() # closes the dialog
559
769
 
560
770
  def _on_ok(self, out: np.ndarray):
771
+ used = getattr(self._worker, "used_provider", None) or \
772
+ (self.cmb_provider.currentText() if not self.chk_auto.isChecked() else "auto")
773
+ model_path = getattr(self, "_effective_model_path", self._model_path)
561
774
  doc = self.get_active_doc()
562
775
  if doc is None or getattr(doc, "image", None) is None:
563
776
  QMessageBox.warning(self, "Image", "No active image.")
@@ -579,11 +792,10 @@ class AberrationAIDialog(QDialog):
579
792
  "processing_parameters": {
580
793
  **(getattr(doc, "metadata", {}) or {}).get("processing_parameters", {}),
581
794
  "AberrationAI": {
582
- "model_path": self._model_path,
795
+ "model_path": model_path,
583
796
  "patch_size": int(self.spin_patch.value()),
584
797
  "overlap": int(self.spin_overlap.value()),
585
- "provider": (self.cmb_provider.currentText()
586
- if not self.chk_auto.isChecked() else "auto"),
798
+ "provider": used,
587
799
  "border_px": BORDER_PX,
588
800
  }
589
801
  }
@@ -616,7 +828,7 @@ class AberrationAIDialog(QDialog):
616
828
  if main is not None:
617
829
  auto_gpu = bool(self.chk_auto.isChecked())
618
830
  preset = {
619
- "model": self._model_path,
831
+ "model": model_path,
620
832
  "patch": int(self.spin_patch.value()),
621
833
  "overlap": int(self.spin_overlap.value()),
622
834
  "border_px": int(BORDER_PX),
@@ -675,7 +887,7 @@ class AberrationAIDialog(QDialog):
675
887
  BORDER_PX = 10 # same value used above
676
888
  self._log(
677
889
  f"✅ Aberration AI applied "
678
- f"(model={os.path.basename(self._model_path)}, provider={used}, "
890
+ f"(model={os.path.basename(model_path)}, provider={used}, "
679
891
  f"patch={int(self.spin_patch.value())}, overlap={int(self.spin_overlap.value())}, "
680
892
  f"border={BORDER_PX}px, time={dt:.2f}s)"
681
893
  )