setiastrosuitepro 1.6.2__py3-none-any.whl → 1.6.12__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 (162) hide show
  1. setiastro/images/abeicon.svg +16 -0
  2. setiastro/images/acv_icon.png +0 -0
  3. setiastro/images/colorwheel.svg +97 -0
  4. setiastro/images/cosmic.svg +40 -0
  5. setiastro/images/cosmicsat.svg +24 -0
  6. setiastro/images/first_quarter.png +0 -0
  7. setiastro/images/full_moon.png +0 -0
  8. setiastro/images/graxpert.svg +19 -0
  9. setiastro/images/last_quarter.png +0 -0
  10. setiastro/images/linearfit.svg +32 -0
  11. setiastro/images/new_moon.png +0 -0
  12. setiastro/images/pixelmath.svg +42 -0
  13. setiastro/images/rotatearbitrary.png +0 -0
  14. setiastro/images/waning_crescent_1.png +0 -0
  15. setiastro/images/waning_crescent_2.png +0 -0
  16. setiastro/images/waning_crescent_3.png +0 -0
  17. setiastro/images/waning_crescent_4.png +0 -0
  18. setiastro/images/waning_crescent_5.png +0 -0
  19. setiastro/images/waning_gibbous_1.png +0 -0
  20. setiastro/images/waning_gibbous_2.png +0 -0
  21. setiastro/images/waning_gibbous_3.png +0 -0
  22. setiastro/images/waning_gibbous_4.png +0 -0
  23. setiastro/images/waning_gibbous_5.png +0 -0
  24. setiastro/images/waxing_crescent_1.png +0 -0
  25. setiastro/images/waxing_crescent_2.png +0 -0
  26. setiastro/images/waxing_crescent_3.png +0 -0
  27. setiastro/images/waxing_crescent_4.png +0 -0
  28. setiastro/images/waxing_crescent_5.png +0 -0
  29. setiastro/images/waxing_gibbous_1.png +0 -0
  30. setiastro/images/waxing_gibbous_2.png +0 -0
  31. setiastro/images/waxing_gibbous_3.png +0 -0
  32. setiastro/images/waxing_gibbous_4.png +0 -0
  33. setiastro/images/waxing_gibbous_5.png +0 -0
  34. setiastro/qml/ResourceMonitor.qml +84 -82
  35. setiastro/saspro/__main__.py +20 -1
  36. setiastro/saspro/_generated/build_info.py +2 -2
  37. setiastro/saspro/abe.py +37 -4
  38. setiastro/saspro/aberration_ai.py +237 -21
  39. setiastro/saspro/acv_exporter.py +379 -0
  40. setiastro/saspro/add_stars.py +33 -6
  41. setiastro/saspro/backgroundneutral.py +114 -37
  42. setiastro/saspro/blemish_blaster.py +4 -1
  43. setiastro/saspro/blink_comparator_pro.py +548 -275
  44. setiastro/saspro/clahe.py +4 -1
  45. setiastro/saspro/continuum_subtract.py +4 -1
  46. setiastro/saspro/convo.py +13 -7
  47. setiastro/saspro/cosmicclarity.py +129 -18
  48. setiastro/saspro/crop_dialog_pro.py +134 -8
  49. setiastro/saspro/curve_editor_pro.py +109 -42
  50. setiastro/saspro/doc_manager.py +246 -16
  51. setiastro/saspro/exoplanet_detector.py +120 -28
  52. setiastro/saspro/frequency_separation.py +1158 -204
  53. setiastro/saspro/function_bundle.py +16 -16
  54. setiastro/saspro/ghs_dialog_pro.py +81 -16
  55. setiastro/saspro/graxpert.py +1 -0
  56. setiastro/saspro/gui/main_window.py +519 -289
  57. setiastro/saspro/gui/mixins/dock_mixin.py +276 -42
  58. setiastro/saspro/gui/mixins/geometry_mixin.py +105 -5
  59. setiastro/saspro/gui/mixins/menu_mixin.py +28 -1
  60. setiastro/saspro/gui/mixins/theme_mixin.py +160 -14
  61. setiastro/saspro/gui/mixins/toolbar_mixin.py +416 -27
  62. setiastro/saspro/gui/mixins/update_mixin.py +138 -36
  63. setiastro/saspro/gui/mixins/view_mixin.py +42 -0
  64. setiastro/saspro/halobgon.py +4 -0
  65. setiastro/saspro/histogram.py +5 -1
  66. setiastro/saspro/image_combine.py +4 -0
  67. setiastro/saspro/image_peeker_pro.py +4 -0
  68. setiastro/saspro/imageops/starbasedwhitebalance.py +23 -52
  69. setiastro/saspro/imageops/stretch.py +582 -62
  70. setiastro/saspro/isophote.py +4 -0
  71. setiastro/saspro/layers.py +13 -9
  72. setiastro/saspro/layers_dock.py +183 -3
  73. setiastro/saspro/legacy/image_manager.py +154 -20
  74. setiastro/saspro/legacy/numba_utils.py +67 -47
  75. setiastro/saspro/legacy/xisf.py +240 -98
  76. setiastro/saspro/live_stacking.py +180 -79
  77. setiastro/saspro/luminancerecombine.py +228 -27
  78. setiastro/saspro/mask_creation.py +174 -15
  79. setiastro/saspro/mfdeconv.py +113 -35
  80. setiastro/saspro/mfdeconvcudnn.py +119 -70
  81. setiastro/saspro/mfdeconvsport.py +112 -35
  82. setiastro/saspro/morphology.py +4 -0
  83. setiastro/saspro/multiscale_decomp.py +748 -255
  84. setiastro/saspro/numba_utils.py +72 -57
  85. setiastro/saspro/ops/commands.py +18 -18
  86. setiastro/saspro/ops/script_editor.py +10 -2
  87. setiastro/saspro/ops/scripts.py +122 -0
  88. setiastro/saspro/perfect_palette_picker.py +37 -3
  89. setiastro/saspro/plate_solver.py +84 -49
  90. setiastro/saspro/psf_viewer.py +119 -37
  91. setiastro/saspro/remove_stars_preset.py +55 -13
  92. setiastro/saspro/resources.py +97 -11
  93. setiastro/saspro/rgbalign.py +4 -0
  94. setiastro/saspro/selective_color.py +83 -21
  95. setiastro/saspro/sfcc.py +364 -152
  96. setiastro/saspro/shortcuts.py +253 -49
  97. setiastro/saspro/signature_insert.py +692 -33
  98. setiastro/saspro/stacking_suite.py +1610 -574
  99. setiastro/saspro/star_alignment.py +522 -453
  100. setiastro/saspro/star_spikes.py +4 -0
  101. setiastro/saspro/star_stretch.py +38 -3
  102. setiastro/saspro/stat_stretch.py +743 -128
  103. setiastro/saspro/status_log_dock.py +1 -1
  104. setiastro/saspro/subwindow.py +786 -360
  105. setiastro/saspro/supernovaasteroidhunter.py +1 -1
  106. setiastro/saspro/swap_manager.py +77 -42
  107. setiastro/saspro/translations/all_source_strings.json +1588 -516
  108. setiastro/saspro/translations/ar_translations.py +915 -684
  109. setiastro/saspro/translations/de_translations.py +442 -463
  110. setiastro/saspro/translations/es_translations.py +277 -47
  111. setiastro/saspro/translations/fr_translations.py +279 -47
  112. setiastro/saspro/translations/hi_translations.py +253 -21
  113. setiastro/saspro/translations/integrate_translations.py +3 -2
  114. setiastro/saspro/translations/it_translations.py +1211 -161
  115. setiastro/saspro/translations/ja_translations.py +3340 -3107
  116. setiastro/saspro/translations/pt_translations.py +3315 -3337
  117. setiastro/saspro/translations/ru_translations.py +351 -117
  118. setiastro/saspro/translations/saspro_ar.qm +0 -0
  119. setiastro/saspro/translations/saspro_ar.ts +15902 -138
  120. setiastro/saspro/translations/saspro_de.qm +0 -0
  121. setiastro/saspro/translations/saspro_de.ts +14428 -133
  122. setiastro/saspro/translations/saspro_es.qm +0 -0
  123. setiastro/saspro/translations/saspro_es.ts +11503 -7821
  124. setiastro/saspro/translations/saspro_fr.qm +0 -0
  125. setiastro/saspro/translations/saspro_fr.ts +11168 -7812
  126. setiastro/saspro/translations/saspro_hi.qm +0 -0
  127. setiastro/saspro/translations/saspro_hi.ts +14733 -135
  128. setiastro/saspro/translations/saspro_it.qm +0 -0
  129. setiastro/saspro/translations/saspro_it.ts +14347 -7821
  130. setiastro/saspro/translations/saspro_ja.qm +0 -0
  131. setiastro/saspro/translations/saspro_ja.ts +14860 -137
  132. setiastro/saspro/translations/saspro_pt.qm +0 -0
  133. setiastro/saspro/translations/saspro_pt.ts +14904 -137
  134. setiastro/saspro/translations/saspro_ru.qm +0 -0
  135. setiastro/saspro/translations/saspro_ru.ts +11766 -168
  136. setiastro/saspro/translations/saspro_sw.qm +0 -0
  137. setiastro/saspro/translations/saspro_sw.ts +15115 -135
  138. setiastro/saspro/translations/saspro_uk.qm +0 -0
  139. setiastro/saspro/translations/saspro_uk.ts +11206 -6729
  140. setiastro/saspro/translations/saspro_zh.qm +0 -0
  141. setiastro/saspro/translations/saspro_zh.ts +10581 -7812
  142. setiastro/saspro/translations/sw_translations.py +282 -56
  143. setiastro/saspro/translations/uk_translations.py +264 -35
  144. setiastro/saspro/translations/zh_translations.py +282 -47
  145. setiastro/saspro/view_bundle.py +17 -17
  146. setiastro/saspro/wavescale_hdr.py +4 -1
  147. setiastro/saspro/wavescalede.py +4 -1
  148. setiastro/saspro/whitebalance.py +84 -12
  149. setiastro/saspro/widgets/common_utilities.py +28 -21
  150. setiastro/saspro/widgets/minigame/game.js +11 -6
  151. setiastro/saspro/widgets/resource_monitor.py +133 -57
  152. setiastro/saspro/widgets/spinboxes.py +28 -13
  153. setiastro/saspro/wimi.py +92 -721
  154. setiastro/saspro/wims.py +46 -36
  155. setiastro/saspro/window_shelf.py +2 -2
  156. setiastro/saspro/xisf.py +101 -11
  157. {setiastrosuitepro-1.6.2.dist-info → setiastrosuitepro-1.6.12.dist-info}/METADATA +8 -7
  158. {setiastrosuitepro-1.6.2.dist-info → setiastrosuitepro-1.6.12.dist-info}/RECORD +162 -128
  159. {setiastrosuitepro-1.6.2.dist-info → setiastrosuitepro-1.6.12.dist-info}/WHEEL +0 -0
  160. {setiastrosuitepro-1.6.2.dist-info → setiastrosuitepro-1.6.12.dist-info}/entry_points.txt +0 -0
  161. {setiastrosuitepro-1.6.2.dist-info → setiastrosuitepro-1.6.12.dist-info}/licenses/LICENSE +0 -0
  162. {setiastrosuitepro-1.6.2.dist-info → setiastrosuitepro-1.6.12.dist-info}/licenses/license.txt +0 -0
@@ -9,12 +9,30 @@ from __future__ import annotations
9
9
  from typing import TYPE_CHECKING
10
10
 
11
11
  from PyQt6.QtCore import Qt, QTimer
12
- from PyQt6.QtGui import QBrush, QColor, QFont, QPalette
13
- from PyQt6.QtWidgets import QApplication
12
+ from PyQt6.QtGui import QBrush, QColor, QFont, QPalette, QPainter, QPixmap, QIcon
13
+ from PyQt6.QtWidgets import QApplication, QLabel, QWidget
14
14
 
15
15
  if TYPE_CHECKING:
16
16
  pass
17
17
 
18
+ def _force_mdi_subwindow_flags(sw):
19
+ f = sw.windowFlags()
20
+
21
+ # Clear only the *window type* bits (NOT random low bits)
22
+ f &= ~Qt.WindowType.WindowType_Mask
23
+
24
+ # Force true MDI child type
25
+ f |= Qt.WindowType.SubWindow
26
+
27
+ # Add desired buttons/hints
28
+ f |= (Qt.WindowType.CustomizeWindowHint |
29
+ Qt.WindowType.WindowTitleHint |
30
+ Qt.WindowType.WindowSystemMenuHint |
31
+ Qt.WindowType.WindowMinimizeButtonHint |
32
+ Qt.WindowType.WindowMaximizeButtonHint |
33
+ Qt.WindowType.WindowCloseButtonHint)
34
+
35
+ sw.setWindowFlags(f)
18
36
 
19
37
  class ThemeMixin:
20
38
  """
@@ -88,7 +106,7 @@ class ThemeMixin:
88
106
  app.setPalette(self._gray_palette())
89
107
  app.setStyleSheet(
90
108
  "QToolTip { color: #f0f0f0; background-color: #3a3a3a; border: 1px solid #5a5a5a; }"
91
- )
109
+ )
92
110
  elif mode == "light":
93
111
  app.setPalette(self._light_palette())
94
112
  app.setStyleSheet(
@@ -119,6 +137,11 @@ class ThemeMixin:
119
137
  self._repolish_top_levels()
120
138
  self._apply_workspace_theme()
121
139
  self._style_mdi_titlebars()
140
+
141
+ try:
142
+ self._retint_zoom_icons()
143
+ except Exception:
144
+ pass
122
145
  self._menu_view_panels = None
123
146
 
124
147
  try:
@@ -139,26 +162,149 @@ class ThemeMixin:
139
162
  w.setUpdatesEnabled(True)
140
163
 
141
164
  def _style_mdi_titlebars(self):
142
- """Apply theme-specific styles to MDI subwindow titlebars."""
143
165
  mode = self._theme_mode()
166
+
144
167
  if mode == "dark":
145
- base = "#1b1b1b" # inactive titlebar
146
- active = "#242424" # active titlebar
168
+ base = "#1b1b1b"
169
+ active = "#242424"
147
170
  fg = "#dcdcdc"
148
171
  elif mode in ("gray", "custom"):
149
172
  base = "#3a3a3a"
150
173
  active = "#454545"
151
174
  fg = "#f0f0f0"
152
175
  else:
153
- # No override in light / system modes
154
- self.mdi.setStyleSheet("")
155
- return
176
+ base = "#eaeaea"
177
+ active = "#ffffff"
178
+ fg = "#141414"
156
179
 
180
+ # style *our* titlebar only
157
181
  self.mdi.setStyleSheet(f"""
158
- QMdiSubWindow::titlebar {{ background: {base}; color: {fg}; }}
159
- QMdiSubWindow::titlebar:active {{ background: {active}; color: {fg}; }}
182
+ QWidget#sas_mdi_titlebar {{
183
+ background: {base};
184
+ }}
185
+ QWidget#sas_mdi_titlebar[active="true"] {{
186
+ background: {active};
187
+ }}
188
+ QLabel#sas_mdi_title_label {{
189
+ color: {fg};
190
+ background: transparent;
191
+ }}
192
+ QWidget#sas_mdi_titlebar QToolButton {{
193
+ color: {fg};
194
+ background: transparent;
195
+ }}
196
+ QWidget#sas_mdi_titlebar QToolButton:hover {{
197
+ background: rgba(255,255,255,0.10);
198
+ }}
160
199
  """)
161
200
 
201
+
202
+ def _fix_mdi_titlebar_emboss(self, fg_hex: str):
203
+ """
204
+ Fusion/Windows style can draw embossed title text (two-pass).
205
+ In dark themes that can become white-on-white -> 'double text'.
206
+ Force the shadow/emboss colors on the *titlebar widget only*.
207
+ """
208
+ try:
209
+ fg = QColor(fg_hex)
210
+ except Exception:
211
+ fg = QColor(240, 240, 240)
212
+
213
+ for sw in self.mdi.subWindowList():
214
+ try:
215
+ tb = sw.findChild(QWidget, "qt_mdi_titlebar")
216
+ if tb is None:
217
+ continue
218
+
219
+ pal = tb.palette()
220
+
221
+ # Main text
222
+ pal.setColor(QPalette.ColorRole.WindowText, fg)
223
+ pal.setColor(QPalette.ColorRole.Text, fg)
224
+ pal.setColor(QPalette.ColorRole.ButtonText, fg)
225
+
226
+ # Critical: make the embossed/shadow pass dark
227
+ dark = QColor(0, 0, 0)
228
+ pal.setColor(QPalette.ColorRole.Light, dark)
229
+ pal.setColor(QPalette.ColorRole.Midlight, dark)
230
+ pal.setColor(QPalette.ColorRole.Dark, dark)
231
+ pal.setColor(QPalette.ColorRole.Shadow, dark)
232
+
233
+ tb.setPalette(pal)
234
+
235
+ # Also push to the label if present (some styles read it from label)
236
+ lbl = tb.findChild(QLabel)
237
+ if lbl is not None:
238
+ lbl.setPalette(pal)
239
+ except Exception:
240
+ pass
241
+
242
+ def _tint_icon(self, icon: QIcon, color: QColor) -> QIcon:
243
+ """
244
+ Take an existing icon (often fromTheme) and force a single-color glyph.
245
+ Sets Normal and Active to the same tinted pixmaps to prevent hover flipping.
246
+ """
247
+ if icon.isNull():
248
+ return icon
249
+
250
+ out = QIcon()
251
+ sizes = [16, 20, 24, 32, 48, 64]
252
+
253
+ for sz in sizes:
254
+ pm = icon.pixmap(sz, sz, QIcon.Mode.Normal, QIcon.State.Off)
255
+ if pm.isNull():
256
+ continue
257
+
258
+ tinted = QPixmap(pm.size())
259
+ tinted.fill(Qt.GlobalColor.transparent)
260
+
261
+ p = QPainter(tinted)
262
+ p.setRenderHint(QPainter.RenderHint.Antialiasing, True)
263
+ p.setRenderHint(QPainter.RenderHint.SmoothPixmapTransform, True)
264
+
265
+ # Use the original alpha as a mask, fill with our color
266
+ p.drawPixmap(0, 0, pm)
267
+ p.setCompositionMode(QPainter.CompositionMode.CompositionMode_SourceIn)
268
+ p.fillRect(tinted.rect(), color)
269
+ p.end()
270
+
271
+ # Normal + Active -> same pixmap (prevents hover flip)
272
+ out.addPixmap(tinted, QIcon.Mode.Normal, QIcon.State.Off)
273
+ out.addPixmap(tinted, QIcon.Mode.Active, QIcon.State.Off)
274
+
275
+ # Disabled: slightly dimmer (optional)
276
+ dis = QColor(color)
277
+ dis.setAlphaF(0.45)
278
+ dispm = QPixmap(tinted.size())
279
+ dispm.fill(Qt.GlobalColor.transparent)
280
+ p2 = QPainter(dispm)
281
+ p2.drawPixmap(0, 0, tinted)
282
+ p2.setCompositionMode(QPainter.CompositionMode.CompositionMode_SourceIn)
283
+ p2.fillRect(dispm.rect(), dis)
284
+ p2.end()
285
+ out.addPixmap(dispm, QIcon.Mode.Disabled, QIcon.State.Off)
286
+
287
+ return out
288
+
289
+ def _retint_zoom_icons(self):
290
+ """
291
+ Retint only the zoom actions (the ones built from QIcon.fromTheme).
292
+ Call after app palette is applied.
293
+ """
294
+ pal = QApplication.palette()
295
+ glyph = pal.color(QPalette.ColorRole.ButtonText) # or Text; ButtonText tends to match toolbars well
296
+
297
+ for name in ("act_zoom_out", "act_zoom_in", "act_zoom_1_1", "act_zoom_fit"):
298
+ act = getattr(self, name, None)
299
+ if act is None:
300
+ continue
301
+
302
+ # stash original once so repeated theme flips don't re-tint a tinted icon
303
+ if not hasattr(act, "_base_icon"):
304
+ act._base_icon = act.icon()
305
+
306
+ act.setIcon(self._tint_icon(act._base_icon, glyph))
307
+
162
308
  def _dark_palette(self) -> QPalette:
163
309
  """Create a dark theme palette."""
164
310
  p = QPalette()
@@ -172,7 +318,7 @@ class ThemeMixin:
172
318
  hi = QColor(30, 144, 255) # highlight (dodger blue)
173
319
 
174
320
  p.setColor(QPalette.ColorRole.Window, panel)
175
- p.setColor(QPalette.ColorRole.WindowText, text)
321
+ p.setColor(QPalette.ColorRole.WindowText, QColor(255, 255, 255))
176
322
  p.setColor(QPalette.ColorRole.Base, bg)
177
323
  p.setColor(QPalette.ColorRole.AlternateBase, altbase)
178
324
  p.setColor(QPalette.ColorRole.ToolTipBase, panel)
@@ -270,7 +416,7 @@ class ThemeMixin:
270
416
  link = QColor(120, 170, 255)
271
417
  linkv = QColor(180, 150, 255)
272
418
  hi = QColor(95, 145, 230)
273
- hitxt = QColor(255, 255, 255)
419
+ hitxt = QColor(20, 20, 20)
274
420
 
275
421
  # Core roles
276
422
  p.setColor(QPalette.ColorRole.Window, window)
@@ -300,7 +446,7 @@ class ThemeMixin:
300
446
  p.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.WindowText, dis)
301
447
  p.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.Base, QColor(58, 58, 58))
302
448
  p.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.Highlight, QColor(80, 80, 80))
303
- p.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.HighlightedText, QColor(210, 210, 210))
449
+ p.setColor(QPalette.ColorGroup.Disabled, QPalette.ColorRole.HighlightedText, QColor(20, 20, 20))
304
450
 
305
451
  return p
306
452