setiastrosuitepro 1.6.10__py3-none-any.whl → 1.7.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 (51) hide show
  1. setiastro/images/colorwheel.svg +97 -0
  2. setiastro/images/narrowbandnormalization.png +0 -0
  3. setiastro/images/planetarystacker.png +0 -0
  4. setiastro/saspro/__main__.py +1 -1
  5. setiastro/saspro/_generated/build_info.py +2 -2
  6. setiastro/saspro/aberration_ai.py +49 -11
  7. setiastro/saspro/aberration_ai_preset.py +29 -3
  8. setiastro/saspro/backgroundneutral.py +73 -33
  9. setiastro/saspro/blink_comparator_pro.py +116 -71
  10. setiastro/saspro/convo.py +9 -6
  11. setiastro/saspro/curve_editor_pro.py +72 -22
  12. setiastro/saspro/curves_preset.py +249 -47
  13. setiastro/saspro/doc_manager.py +178 -11
  14. setiastro/saspro/gui/main_window.py +218 -66
  15. setiastro/saspro/gui/mixins/dock_mixin.py +245 -24
  16. setiastro/saspro/gui/mixins/file_mixin.py +35 -16
  17. setiastro/saspro/gui/mixins/menu_mixin.py +31 -1
  18. setiastro/saspro/gui/mixins/toolbar_mixin.py +132 -10
  19. setiastro/saspro/histogram.py +179 -7
  20. setiastro/saspro/imageops/narrowband_normalization.py +816 -0
  21. setiastro/saspro/imageops/serloader.py +769 -0
  22. setiastro/saspro/imageops/starbasedwhitebalance.py +23 -52
  23. setiastro/saspro/imageops/stretch.py +66 -15
  24. setiastro/saspro/legacy/numba_utils.py +25 -48
  25. setiastro/saspro/live_stacking.py +24 -4
  26. setiastro/saspro/multiscale_decomp.py +30 -17
  27. setiastro/saspro/narrowband_normalization.py +1618 -0
  28. setiastro/saspro/numba_utils.py +0 -55
  29. setiastro/saspro/ops/script_editor.py +5 -0
  30. setiastro/saspro/ops/scripts.py +119 -0
  31. setiastro/saspro/remove_green.py +1 -1
  32. setiastro/saspro/resources.py +4 -0
  33. setiastro/saspro/ser_stack_config.py +68 -0
  34. setiastro/saspro/ser_stacker.py +2245 -0
  35. setiastro/saspro/ser_stacker_dialog.py +1481 -0
  36. setiastro/saspro/ser_tracking.py +206 -0
  37. setiastro/saspro/serviewer.py +1242 -0
  38. setiastro/saspro/sfcc.py +602 -214
  39. setiastro/saspro/shortcuts.py +35 -16
  40. setiastro/saspro/stacking_suite.py +332 -87
  41. setiastro/saspro/star_alignment.py +243 -122
  42. setiastro/saspro/stat_stretch.py +220 -31
  43. setiastro/saspro/subwindow.py +2 -4
  44. setiastro/saspro/whitebalance.py +24 -0
  45. setiastro/saspro/widgets/resource_monitor.py +122 -74
  46. {setiastrosuitepro-1.6.10.dist-info → setiastrosuitepro-1.7.0.dist-info}/METADATA +2 -2
  47. {setiastrosuitepro-1.6.10.dist-info → setiastrosuitepro-1.7.0.dist-info}/RECORD +51 -40
  48. {setiastrosuitepro-1.6.10.dist-info → setiastrosuitepro-1.7.0.dist-info}/WHEEL +0 -0
  49. {setiastrosuitepro-1.6.10.dist-info → setiastrosuitepro-1.7.0.dist-info}/entry_points.txt +0 -0
  50. {setiastrosuitepro-1.6.10.dist-info → setiastrosuitepro-1.7.0.dist-info}/licenses/LICENSE +0 -0
  51. {setiastrosuitepro-1.6.10.dist-info → setiastrosuitepro-1.7.0.dist-info}/licenses/license.txt +0 -0
@@ -503,7 +503,6 @@ class DraggableToolBar(QToolBar):
503
503
 
504
504
  m.exec(gpos)
505
505
 
506
-
507
506
  def contextMenuEvent(self, ev):
508
507
  # Right-click on empty toolbar area
509
508
  m = QMenu(self)
@@ -513,12 +512,12 @@ class DraggableToolBar(QToolBar):
513
512
  act_lock = m.addAction(self.tr("Lock Toolbar Icons"))
514
513
  act_lock.setCheckable(True)
515
514
  act_lock.setChecked(is_locked)
516
-
515
+
517
516
  def _toggle_lock(checked):
518
517
  self._set_locked(checked)
519
-
518
+
520
519
  act_lock.triggered.connect(_toggle_lock)
521
-
520
+
522
521
  m.addSeparator()
523
522
 
524
523
  # Submenu listing hidden actions for this toolbar
@@ -529,12 +528,13 @@ class DraggableToolBar(QToolBar):
529
528
  any_hidden = False
530
529
  if tb_hidden:
531
530
  for act in tb_hidden.actions():
532
- # Skip separators
533
531
  if act.isSeparator():
534
532
  continue
535
533
  any_hidden = True
536
- sub.addAction(act.text() or (act.property("command_id") or act.objectName() or "item"),
537
- lambda a=act: mw._unhide_action_from_hidden_toolbar(a))
534
+ sub.addAction(
535
+ act.text() or (act.property("command_id") or act.objectName() or "item"),
536
+ lambda a=act: mw._unhide_action_from_hidden_toolbar(a)
537
+ )
538
538
 
539
539
  if not any_hidden:
540
540
  sub.setEnabled(False)
@@ -542,8 +542,15 @@ class DraggableToolBar(QToolBar):
542
542
  m.addSeparator()
543
543
  m.addAction(self.tr("Reset hidden icons"), self._reset_hidden_icons)
544
544
 
545
+ # ✅ NEW: Factory reset for all toolbars
546
+ m.addSeparator()
547
+ reset_all = m.addAction(self.tr("Reset ALL Toolbars (Factory Layout)"))
548
+ reset_all.setStatusTip(self.tr("Clears saved toolbar positions/orders/hidden state and restores defaults"))
549
+ reset_all.triggered.connect(lambda: getattr(self.window(), "_reset_all_toolbars_to_factory", lambda: None)())
550
+
545
551
  m.exec(ev.globalPos())
546
552
 
553
+
547
554
  def _reset_hidden_icons(self):
548
555
  mw = self.window()
549
556
  tb_hidden = getattr(mw, "_hidden_toolbar", lambda: None)()
@@ -1033,17 +1040,14 @@ class ShortcutCanvas(QWidget):
1033
1040
  return False
1034
1041
  sw = self._top_subwindow_at(e.position().toPoint())
1035
1042
  if sw is None:
1036
- print("[ShortcutCanvas] _forward_command_drop: no subwindow under cursor", flush=True)
1037
- QApplication.processEvents()
1043
+
1038
1044
  return False
1039
1045
  try:
1040
1046
  raw = bytes(md.data(MIME_CMD))
1041
1047
  payload = _unpack_cmd_payload(raw) # your existing helper
1042
- print(f"[ShortcutCanvas] _forward_command_drop → subwin={sw}, payload={payload!r}", flush=True)
1043
- QApplication.processEvents()
1048
+
1044
1049
  except Exception as ex:
1045
- print(f"[ShortcutCanvas] _forward_command_drop: failed to unpack payload: {ex!r}", flush=True)
1046
- QApplication.processEvents()
1050
+
1047
1051
  return False
1048
1052
  self._mgr.apply_command_to_subwindow(sw, payload)
1049
1053
  e.acceptProposedAction()
@@ -1545,6 +1549,7 @@ class ShortcutManager:
1545
1549
 
1546
1550
  # ---- persistence (QSettings JSON blob) ----
1547
1551
  def save_shortcuts(self):
1552
+
1548
1553
  data = []
1549
1554
  for sid, w in list(self.widgets.items()):
1550
1555
  if _is_dead(w):
@@ -1845,6 +1850,7 @@ class ShortcutManager:
1845
1850
 
1846
1851
 
1847
1852
  def clear(self):
1853
+
1848
1854
  for sid, w in list(self.widgets.items()):
1849
1855
  try:
1850
1856
  if not _is_dead(w):
@@ -1936,6 +1942,7 @@ class _StatStretchPresetDialog(QDialog):
1936
1942
  hdr_knee: float # 0..1
1937
1943
  luma_only: bool
1938
1944
  luma_mode: str # e.g. "rec709"
1945
+ luma_blend: float #0..1 (0=normal linked, 1=pure luma-only)
1939
1946
  """
1940
1947
  def __init__(self, parent=None, initial: dict | None = None):
1941
1948
  super().__init__(parent)
@@ -2014,8 +2021,19 @@ class _StatStretchPresetDialog(QDialog):
2014
2021
  if idx >= 0:
2015
2022
  self.cmb_luma.setCurrentIndex(idx)
2016
2023
 
2017
- self.cmb_luma.setEnabled(self.chk_luma_only.isChecked())
2018
- self.chk_luma_only.toggled.connect(self.cmb_luma.setEnabled)
2024
+ self.spin_luma_blend = QDoubleSpinBox()
2025
+ self.spin_luma_blend.setRange(0.0, 1.0)
2026
+ self.spin_luma_blend.setDecimals(2)
2027
+ self.spin_luma_blend.setSingleStep(0.05)
2028
+ self.spin_luma_blend.setValue(float(init.get("luma_blend", 0.70)))
2029
+
2030
+ def _set_luma_enabled(on: bool):
2031
+ on = bool(on)
2032
+ self.cmb_luma.setEnabled(on)
2033
+ self.spin_luma_blend.setEnabled(on)
2034
+
2035
+ _set_luma_enabled(self.chk_luma_only.isChecked())
2036
+ self.chk_luma_only.toggled.connect(_set_luma_enabled)
2019
2037
 
2020
2038
  # --- Layout ---
2021
2039
  form = QFormLayout()
@@ -2039,7 +2057,7 @@ class _StatStretchPresetDialog(QDialog):
2039
2057
  form.addRow("", QLabel("— Luma mode —"))
2040
2058
  form.addRow("", self.chk_luma_only)
2041
2059
  form.addRow("Luma mode:", self.cmb_luma)
2042
-
2060
+ form.addRow("Luma blend (0–1):", self.spin_luma_blend)
2043
2061
  btns = QDialogButtonBox(
2044
2062
  QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel,
2045
2063
  parent=self
@@ -2072,6 +2090,7 @@ class _StatStretchPresetDialog(QDialog):
2072
2090
 
2073
2091
  "luma_only": luma_on,
2074
2092
  "luma_mode": str(self.cmb_luma.currentText()) if luma_on else "rec709",
2093
+ "luma_blend": float(self.spin_luma_blend.value()) if luma_on else 0.0,
2075
2094
  }
2076
2095
 
2077
2096
  class _StarStretchPresetDialog(QDialog):