setiastrosuitepro 1.6.1.post1__py3-none-any.whl → 1.6.4__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.

Potentially problematic release.


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

Files changed (139) hide show
  1. setiastro/images/Background_startup.jpg +0 -0
  2. setiastro/images/rotatearbitrary.png +0 -0
  3. setiastro/qml/ResourceMonitor.qml +126 -0
  4. setiastro/saspro/__main__.py +162 -25
  5. setiastro/saspro/_generated/build_info.py +2 -1
  6. setiastro/saspro/abe.py +62 -11
  7. setiastro/saspro/aberration_ai.py +3 -3
  8. setiastro/saspro/add_stars.py +5 -2
  9. setiastro/saspro/astrobin_exporter.py +3 -0
  10. setiastro/saspro/astrospike_python.py +3 -1
  11. setiastro/saspro/autostretch.py +4 -2
  12. setiastro/saspro/backgroundneutral.py +60 -9
  13. setiastro/saspro/batch_convert.py +3 -0
  14. setiastro/saspro/batch_renamer.py +3 -0
  15. setiastro/saspro/blemish_blaster.py +3 -0
  16. setiastro/saspro/blink_comparator_pro.py +474 -251
  17. setiastro/saspro/cheat_sheet.py +50 -15
  18. setiastro/saspro/clahe.py +27 -1
  19. setiastro/saspro/comet_stacking.py +103 -38
  20. setiastro/saspro/convo.py +3 -0
  21. setiastro/saspro/copyastro.py +3 -0
  22. setiastro/saspro/cosmicclarity.py +70 -45
  23. setiastro/saspro/crop_dialog_pro.py +28 -1
  24. setiastro/saspro/curve_editor_pro.py +18 -0
  25. setiastro/saspro/debayer.py +3 -0
  26. setiastro/saspro/doc_manager.py +40 -17
  27. setiastro/saspro/fitsmodifier.py +3 -0
  28. setiastro/saspro/frequency_separation.py +8 -2
  29. setiastro/saspro/function_bundle.py +18 -16
  30. setiastro/saspro/generate_translations.py +715 -1
  31. setiastro/saspro/ghs_dialog_pro.py +3 -0
  32. setiastro/saspro/graxpert.py +3 -0
  33. setiastro/saspro/gui/main_window.py +364 -92
  34. setiastro/saspro/gui/mixins/dock_mixin.py +119 -7
  35. setiastro/saspro/gui/mixins/file_mixin.py +7 -0
  36. setiastro/saspro/gui/mixins/geometry_mixin.py +105 -5
  37. setiastro/saspro/gui/mixins/menu_mixin.py +29 -0
  38. setiastro/saspro/gui/mixins/toolbar_mixin.py +33 -10
  39. setiastro/saspro/gui/statistics_dialog.py +47 -0
  40. setiastro/saspro/halobgon.py +29 -3
  41. setiastro/saspro/histogram.py +3 -0
  42. setiastro/saspro/history_explorer.py +2 -0
  43. setiastro/saspro/i18n.py +22 -10
  44. setiastro/saspro/image_combine.py +3 -0
  45. setiastro/saspro/image_peeker_pro.py +3 -0
  46. setiastro/saspro/imageops/stretch.py +5 -13
  47. setiastro/saspro/isophote.py +3 -0
  48. setiastro/saspro/legacy/numba_utils.py +64 -47
  49. setiastro/saspro/linear_fit.py +3 -0
  50. setiastro/saspro/live_stacking.py +13 -2
  51. setiastro/saspro/mask_creation.py +3 -0
  52. setiastro/saspro/mfdeconv.py +5 -0
  53. setiastro/saspro/morphology.py +30 -5
  54. setiastro/saspro/multiscale_decomp.py +713 -256
  55. setiastro/saspro/nbtorgb_stars.py +12 -2
  56. setiastro/saspro/numba_utils.py +148 -47
  57. setiastro/saspro/ops/scripts.py +77 -17
  58. setiastro/saspro/ops/settings.py +1 -43
  59. setiastro/saspro/perfect_palette_picker.py +1 -0
  60. setiastro/saspro/pixelmath.py +6 -2
  61. setiastro/saspro/plate_solver.py +1 -0
  62. setiastro/saspro/remove_green.py +18 -1
  63. setiastro/saspro/remove_stars.py +136 -162
  64. setiastro/saspro/remove_stars_preset.py +55 -13
  65. setiastro/saspro/resources.py +36 -10
  66. setiastro/saspro/rgb_combination.py +1 -0
  67. setiastro/saspro/rgbalign.py +4 -4
  68. setiastro/saspro/save_options.py +1 -0
  69. setiastro/saspro/selective_color.py +79 -20
  70. setiastro/saspro/sfcc.py +50 -8
  71. setiastro/saspro/shortcuts.py +94 -21
  72. setiastro/saspro/signature_insert.py +3 -0
  73. setiastro/saspro/stacking_suite.py +924 -446
  74. setiastro/saspro/star_alignment.py +291 -331
  75. setiastro/saspro/star_spikes.py +116 -32
  76. setiastro/saspro/star_stretch.py +38 -1
  77. setiastro/saspro/stat_stretch.py +35 -3
  78. setiastro/saspro/status_log_dock.py +1 -1
  79. setiastro/saspro/subwindow.py +63 -2
  80. setiastro/saspro/supernovaasteroidhunter.py +3 -0
  81. setiastro/saspro/swap_manager.py +77 -42
  82. setiastro/saspro/translations/all_source_strings.json +4726 -0
  83. setiastro/saspro/translations/ar_translations.py +4096 -0
  84. setiastro/saspro/translations/de_translations.py +441 -446
  85. setiastro/saspro/translations/es_translations.py +278 -32
  86. setiastro/saspro/translations/fr_translations.py +280 -32
  87. setiastro/saspro/translations/hi_translations.py +3803 -0
  88. setiastro/saspro/translations/integrate_translations.py +38 -1
  89. setiastro/saspro/translations/it_translations.py +1211 -145
  90. setiastro/saspro/translations/ja_translations.py +556 -307
  91. setiastro/saspro/translations/pt_translations.py +3316 -3322
  92. setiastro/saspro/translations/ru_translations.py +3082 -0
  93. setiastro/saspro/translations/saspro_ar.qm +0 -0
  94. setiastro/saspro/translations/saspro_ar.ts +16019 -0
  95. setiastro/saspro/translations/saspro_de.qm +0 -0
  96. setiastro/saspro/translations/saspro_de.ts +14428 -133
  97. setiastro/saspro/translations/saspro_es.qm +0 -0
  98. setiastro/saspro/translations/saspro_es.ts +11503 -7821
  99. setiastro/saspro/translations/saspro_fr.qm +0 -0
  100. setiastro/saspro/translations/saspro_fr.ts +11168 -7812
  101. setiastro/saspro/translations/saspro_hi.qm +0 -0
  102. setiastro/saspro/translations/saspro_hi.ts +14855 -0
  103. setiastro/saspro/translations/saspro_it.qm +0 -0
  104. setiastro/saspro/translations/saspro_it.ts +14347 -7821
  105. setiastro/saspro/translations/saspro_ja.qm +0 -0
  106. setiastro/saspro/translations/saspro_ja.ts +14860 -137
  107. setiastro/saspro/translations/saspro_pt.qm +0 -0
  108. setiastro/saspro/translations/saspro_pt.ts +14904 -137
  109. setiastro/saspro/translations/saspro_ru.qm +0 -0
  110. setiastro/saspro/translations/saspro_ru.ts +11835 -0
  111. setiastro/saspro/translations/saspro_sw.qm +0 -0
  112. setiastro/saspro/translations/saspro_sw.ts +15237 -0
  113. setiastro/saspro/translations/saspro_uk.qm +0 -0
  114. setiastro/saspro/translations/saspro_uk.ts +15248 -0
  115. setiastro/saspro/translations/saspro_zh.qm +0 -0
  116. setiastro/saspro/translations/saspro_zh.ts +10581 -7812
  117. setiastro/saspro/translations/sw_translations.py +3897 -0
  118. setiastro/saspro/translations/uk_translations.py +3929 -0
  119. setiastro/saspro/translations/zh_translations.py +283 -32
  120. setiastro/saspro/versioning.py +36 -5
  121. setiastro/saspro/view_bundle.py +20 -17
  122. setiastro/saspro/wavescale_hdr.py +22 -1
  123. setiastro/saspro/wavescalede.py +23 -1
  124. setiastro/saspro/whitebalance.py +39 -3
  125. setiastro/saspro/widgets/minigame/game.js +991 -0
  126. setiastro/saspro/widgets/minigame/index.html +53 -0
  127. setiastro/saspro/widgets/minigame/style.css +241 -0
  128. setiastro/saspro/widgets/resource_monitor.py +263 -0
  129. setiastro/saspro/widgets/spinboxes.py +18 -0
  130. setiastro/saspro/widgets/wavelet_utils.py +52 -20
  131. setiastro/saspro/wimi.py +100 -80
  132. setiastro/saspro/wims.py +33 -33
  133. setiastro/saspro/window_shelf.py +2 -2
  134. {setiastrosuitepro-1.6.1.post1.dist-info → setiastrosuitepro-1.6.4.dist-info}/METADATA +15 -4
  135. {setiastrosuitepro-1.6.1.post1.dist-info → setiastrosuitepro-1.6.4.dist-info}/RECORD +139 -115
  136. {setiastrosuitepro-1.6.1.post1.dist-info → setiastrosuitepro-1.6.4.dist-info}/WHEEL +0 -0
  137. {setiastrosuitepro-1.6.1.post1.dist-info → setiastrosuitepro-1.6.4.dist-info}/entry_points.txt +0 -0
  138. {setiastrosuitepro-1.6.1.post1.dist-info → setiastrosuitepro-1.6.4.dist-info}/licenses/LICENSE +0 -0
  139. {setiastrosuitepro-1.6.1.post1.dist-info → setiastrosuitepro-1.6.4.dist-info}/licenses/license.txt +0 -0
@@ -199,6 +199,9 @@ class WaveScaleHDRDialogPro(QDialog):
199
199
  import logging
200
200
  logging.debug(f"Exception suppressed: {type(e).__name__}: {e}")
201
201
  self.resize(980, 700)
202
+ self.setWindowFlag(Qt.WindowType.Window, True)
203
+ self.setWindowModality(Qt.WindowModality.NonModal)
204
+ self.setModal(False)
202
205
 
203
206
  self._doc = doc
204
207
  base = getattr(doc, "image", None)
@@ -606,8 +609,26 @@ class WaveScaleHDRDialogPro(QDialog):
606
609
  except Exception:
607
610
  pass
608
611
 
609
- self.accept()
612
+ # Dialog stays open so user can apply to other images
613
+ # Refresh document reference for next operation
614
+ self._refresh_document_from_active()
610
615
 
616
+ def _refresh_document_from_active(self):
617
+ """
618
+ Refresh the dialog's document reference to the currently active document.
619
+ This allows reusing the same dialog on different images.
620
+ """
621
+ try:
622
+ main = self.parent()
623
+ if main and hasattr(main, "_active_doc"):
624
+ new_doc = main._active_doc()
625
+ if new_doc is not None and new_doc is not self._doc:
626
+ self._doc = new_doc
627
+ # Reset L channel and refresh preview for new document
628
+ self._L_original = None
629
+ self._last_preview = None
630
+ except Exception:
631
+ pass
611
632
 
612
633
 
613
634
  def _schedule_mask_refresh(self, _value):
@@ -201,6 +201,9 @@ class WaveScaleDarkEnhancerDialogPro(QDialog):
201
201
  import logging
202
202
  logging.debug(f"Exception suppressed: {type(e).__name__}: {e}")
203
203
  self.resize(980, 700)
204
+ self.setWindowFlag(Qt.WindowType.Window, True)
205
+ self.setWindowModality(Qt.WindowModality.NonModal)
206
+ self.setModal(False)
204
207
 
205
208
  self._doc = doc
206
209
  base = getattr(doc, "image", None)
@@ -581,7 +584,26 @@ class WaveScaleDarkEnhancerDialogPro(QDialog):
581
584
  # Never let replay wiring break the apply
582
585
  pass
583
586
 
584
- self.accept()
587
+ # Dialog stays open so user can apply to other images
588
+ # Refresh document reference for next operation
589
+ self._refresh_document_from_active()
590
+
591
+ def _refresh_document_from_active(self):
592
+ """
593
+ Refresh the dialog's document reference to the currently active document.
594
+ This allows reusing the same dialog on different images.
595
+ """
596
+ try:
597
+ main = self.parent()
598
+ if main and hasattr(main, "_active_doc"):
599
+ new_doc = main._active_doc()
600
+ if new_doc is not None and new_doc is not self._doc:
601
+ self._doc = new_doc
602
+ # Reset state and refresh for new document
603
+ self._L_original = None
604
+ self._last_preview = None
605
+ except Exception:
606
+ pass
585
607
 
586
608
 
587
609
  # ─────────────────────────────────────────────────────────────────────────────
@@ -191,10 +191,18 @@ def apply_white_balance_to_doc(doc, preset: Optional[Dict] = None):
191
191
  class WhiteBalanceDialog(QDialog):
192
192
  def __init__(self, parent, doc, icon: QIcon | None = None):
193
193
  super().__init__(parent)
194
+ self._main = parent
194
195
  self.doc = doc
196
+
197
+ # Connect to active document change signal
198
+ if hasattr(self._main, "currentDocumentChanged"):
199
+ self._main.currentDocumentChanged.connect(self._on_active_doc_changed)
195
200
  if icon:
196
201
  self.setWindowIcon(icon)
197
202
  self.setWindowTitle(self.tr("White Balance"))
203
+ self.setWindowFlag(Qt.WindowType.Window, True)
204
+ self.setWindowModality(Qt.WindowModality.NonModal)
205
+ self.setModal(False)
198
206
  self.resize(900, 600)
199
207
 
200
208
  self._build_ui()
@@ -291,6 +299,18 @@ class WhiteBalanceDialog(QDialog):
291
299
  self.manual_group.setVisible(t == "Manual")
292
300
  self.star_group.setVisible(t == "Star-Based")
293
301
 
302
+ # ---- active document change ------------------------------------
303
+ def _on_active_doc_changed(self, doc):
304
+ """Called when user clicks a different image window."""
305
+ if doc is None or getattr(doc, "image", None) is None:
306
+ return
307
+ self.doc = doc
308
+ # Force fresh star detection by temporarily disabling cache
309
+ old_reuse = self.chk_reuse.isChecked()
310
+ self.chk_reuse.setChecked(False)
311
+ self._update_star_preview()
312
+ self.chk_reuse.setChecked(old_reuse)
313
+
294
314
  # ---- preview --------------------------------------------------------
295
315
  def _update_star_preview(self):
296
316
  if self.type_combo.currentText() != "Star-Based":
@@ -373,7 +393,8 @@ class WhiteBalanceDialog(QDialog):
373
393
 
374
394
  # Use the headless helper so doc metadata is consistent
375
395
  apply_white_balance_to_doc(self.doc, preset)
376
- self.accept()
396
+ # Dialog stays open - refresh document for next operation
397
+ self._refresh_document_from_active()
377
398
 
378
399
  elif mode == "Auto":
379
400
  preset = {"mode": "auto"}
@@ -382,7 +403,8 @@ class WhiteBalanceDialog(QDialog):
382
403
  _record_preset_for_replay(preset)
383
404
 
384
405
  apply_white_balance_to_doc(self.doc, preset)
385
- self.accept()
406
+ # Dialog stays open - refresh document for next operation
407
+ self._refresh_document_from_active()
386
408
 
387
409
  else: # --- Star-Based: compute here so we can plot like SASv2 ---
388
410
  thr = float(self.thr_slider.value())
@@ -449,8 +471,22 @@ class WhiteBalanceDialog(QDialog):
449
471
  self.tr("White Balance"),
450
472
  self.tr("Star-Based WB applied.\nDetected {0} stars.").format(int(star_count)),
451
473
  )
452
- self.accept()
474
+ # Dialog stays open - refresh document for next operation
475
+ self._refresh_document_from_active()
453
476
 
454
477
  except Exception as e:
455
478
  QMessageBox.critical(self, self.tr("White Balance"), self.tr("Failed to apply White Balance:\n{0}").format(e))
456
479
 
480
+ def _refresh_document_from_active(self):
481
+ """
482
+ Refresh the dialog's document reference to the currently active document.
483
+ This allows reusing the same dialog on different images.
484
+ """
485
+ try:
486
+ main = self.parent()
487
+ if main and hasattr(main, "_active_doc"):
488
+ new_doc = main._active_doc()
489
+ if new_doc is not None and new_doc is not self.doc:
490
+ self.doc = new_doc
491
+ except Exception:
492
+ pass