setiastrosuitepro 1.6.4__py3-none-any.whl → 1.6.10__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 (112) hide show
  1. setiastro/images/abeicon.svg +16 -0
  2. setiastro/images/acv_icon.png +0 -0
  3. setiastro/images/cosmic.svg +40 -0
  4. setiastro/images/cosmicsat.svg +24 -0
  5. setiastro/images/first_quarter.png +0 -0
  6. setiastro/images/full_moon.png +0 -0
  7. setiastro/images/graxpert.svg +19 -0
  8. setiastro/images/last_quarter.png +0 -0
  9. setiastro/images/linearfit.svg +32 -0
  10. setiastro/images/new_moon.png +0 -0
  11. setiastro/images/pixelmath.svg +42 -0
  12. setiastro/images/waning_crescent_1.png +0 -0
  13. setiastro/images/waning_crescent_2.png +0 -0
  14. setiastro/images/waning_crescent_3.png +0 -0
  15. setiastro/images/waning_crescent_4.png +0 -0
  16. setiastro/images/waning_crescent_5.png +0 -0
  17. setiastro/images/waning_gibbous_1.png +0 -0
  18. setiastro/images/waning_gibbous_2.png +0 -0
  19. setiastro/images/waning_gibbous_3.png +0 -0
  20. setiastro/images/waning_gibbous_4.png +0 -0
  21. setiastro/images/waning_gibbous_5.png +0 -0
  22. setiastro/images/waxing_crescent_1.png +0 -0
  23. setiastro/images/waxing_crescent_2.png +0 -0
  24. setiastro/images/waxing_crescent_3.png +0 -0
  25. setiastro/images/waxing_crescent_4.png +0 -0
  26. setiastro/images/waxing_crescent_5.png +0 -0
  27. setiastro/images/waxing_gibbous_1.png +0 -0
  28. setiastro/images/waxing_gibbous_2.png +0 -0
  29. setiastro/images/waxing_gibbous_3.png +0 -0
  30. setiastro/images/waxing_gibbous_4.png +0 -0
  31. setiastro/images/waxing_gibbous_5.png +0 -0
  32. setiastro/qml/ResourceMonitor.qml +84 -82
  33. setiastro/saspro/__main__.py +19 -0
  34. setiastro/saspro/_generated/build_info.py +2 -2
  35. setiastro/saspro/abe.py +37 -4
  36. setiastro/saspro/aberration_ai.py +237 -21
  37. setiastro/saspro/acv_exporter.py +379 -0
  38. setiastro/saspro/add_stars.py +33 -6
  39. setiastro/saspro/backgroundneutral.py +35 -7
  40. setiastro/saspro/blemish_blaster.py +4 -1
  41. setiastro/saspro/blink_comparator_pro.py +74 -24
  42. setiastro/saspro/clahe.py +4 -1
  43. setiastro/saspro/continuum_subtract.py +4 -1
  44. setiastro/saspro/convo.py +4 -1
  45. setiastro/saspro/cosmicclarity.py +129 -18
  46. setiastro/saspro/crop_dialog_pro.py +123 -7
  47. setiastro/saspro/curve_editor_pro.py +109 -42
  48. setiastro/saspro/doc_manager.py +67 -4
  49. setiastro/saspro/exoplanet_detector.py +120 -28
  50. setiastro/saspro/frequency_separation.py +1158 -204
  51. setiastro/saspro/ghs_dialog_pro.py +81 -16
  52. setiastro/saspro/graxpert.py +1 -0
  53. setiastro/saspro/gui/main_window.py +393 -204
  54. setiastro/saspro/gui/mixins/menu_mixin.py +1 -0
  55. setiastro/saspro/gui/mixins/theme_mixin.py +160 -14
  56. setiastro/saspro/gui/mixins/toolbar_mixin.py +356 -12
  57. setiastro/saspro/gui/mixins/update_mixin.py +138 -36
  58. setiastro/saspro/gui/mixins/view_mixin.py +42 -0
  59. setiastro/saspro/halobgon.py +4 -0
  60. setiastro/saspro/histogram.py +5 -1
  61. setiastro/saspro/image_combine.py +4 -0
  62. setiastro/saspro/image_peeker_pro.py +4 -0
  63. setiastro/saspro/imageops/stretch.py +531 -62
  64. setiastro/saspro/isophote.py +4 -0
  65. setiastro/saspro/layers.py +13 -9
  66. setiastro/saspro/layers_dock.py +183 -3
  67. setiastro/saspro/legacy/image_manager.py +154 -20
  68. setiastro/saspro/legacy/numba_utils.py +43 -0
  69. setiastro/saspro/legacy/xisf.py +240 -98
  70. setiastro/saspro/live_stacking.py +180 -79
  71. setiastro/saspro/luminancerecombine.py +228 -27
  72. setiastro/saspro/mask_creation.py +174 -15
  73. setiastro/saspro/mfdeconv.py +113 -35
  74. setiastro/saspro/mfdeconvcudnn.py +119 -70
  75. setiastro/saspro/mfdeconvsport.py +112 -35
  76. setiastro/saspro/morphology.py +4 -0
  77. setiastro/saspro/multiscale_decomp.py +51 -12
  78. setiastro/saspro/numba_utils.py +72 -2
  79. setiastro/saspro/ops/commands.py +18 -18
  80. setiastro/saspro/ops/script_editor.py +5 -2
  81. setiastro/saspro/ops/scripts.py +3 -0
  82. setiastro/saspro/perfect_palette_picker.py +37 -3
  83. setiastro/saspro/plate_solver.py +84 -49
  84. setiastro/saspro/psf_viewer.py +119 -37
  85. setiastro/saspro/resources.py +67 -0
  86. setiastro/saspro/rgbalign.py +4 -0
  87. setiastro/saspro/selective_color.py +4 -1
  88. setiastro/saspro/sfcc.py +60 -2
  89. setiastro/saspro/shortcuts.py +142 -23
  90. setiastro/saspro/signature_insert.py +692 -33
  91. setiastro/saspro/stacking_suite.py +1017 -400
  92. setiastro/saspro/star_alignment.py +4 -1
  93. setiastro/saspro/star_spikes.py +4 -0
  94. setiastro/saspro/star_stretch.py +38 -3
  95. setiastro/saspro/stat_stretch.py +702 -128
  96. setiastro/saspro/subwindow.py +786 -360
  97. setiastro/saspro/supernovaasteroidhunter.py +1 -1
  98. setiastro/saspro/wavescale_hdr.py +4 -1
  99. setiastro/saspro/wavescalede.py +4 -1
  100. setiastro/saspro/whitebalance.py +60 -12
  101. setiastro/saspro/widgets/common_utilities.py +28 -21
  102. setiastro/saspro/widgets/resource_monitor.py +109 -59
  103. setiastro/saspro/widgets/spinboxes.py +10 -13
  104. setiastro/saspro/wimi.py +27 -656
  105. setiastro/saspro/wims.py +13 -3
  106. setiastro/saspro/xisf.py +101 -11
  107. {setiastrosuitepro-1.6.4.dist-info → setiastrosuitepro-1.6.10.dist-info}/METADATA +2 -1
  108. {setiastrosuitepro-1.6.4.dist-info → setiastrosuitepro-1.6.10.dist-info}/RECORD +112 -80
  109. {setiastrosuitepro-1.6.4.dist-info → setiastrosuitepro-1.6.10.dist-info}/WHEEL +0 -0
  110. {setiastrosuitepro-1.6.4.dist-info → setiastrosuitepro-1.6.10.dist-info}/entry_points.txt +0 -0
  111. {setiastrosuitepro-1.6.4.dist-info → setiastrosuitepro-1.6.10.dist-info}/licenses/LICENSE +0 -0
  112. {setiastrosuitepro-1.6.4.dist-info → setiastrosuitepro-1.6.10.dist-info}/licenses/license.txt +0 -0
@@ -0,0 +1,16 @@
1
+ <svg width="300" height="300" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg">
2
+ <!-- Sfondo sfumato -->
3
+ <defs>
4
+ <linearGradient id="bgGradient" x1="0%" y1="0%" x2="100%" y2="100%">
5
+ <stop offset="0%" style="stop-color:white;stop-opacity:1" />
6
+ <stop offset="40%" style="stop-color:#cccccc;stop-opacity:1" />
7
+ <stop offset="100%" style="stop-color:#4a0000;stop-opacity:1" />
8
+ </linearGradient>
9
+ </defs>
10
+ <rect width="300" height="300" fill="url(#bgGradient)" />
11
+
12
+ <!-- Lettere -->
13
+ <text x="20" y="110" font-family="Arial, sans-serif" font-weight="bold" font-size="140" fill="#ff0000">A</text>
14
+ <text x="100" y="220" font-family="Arial, sans-serif" font-weight="bold" font-size="140" fill="#00ff00">B</text>
15
+ <text x="185" y="295" font-family="Arial, sans-serif" font-weight="bold" font-size="140" fill="#0000ff">E</text>
16
+ </svg>
Binary file
@@ -0,0 +1,40 @@
1
+ <svg width="400" height="400" viewBox="0 0 400 400" xmlns="http://www.w3.org/2000/svg">
2
+ <!-- Sfondo Tondo Blu Scuro -->
3
+ <circle cx="200" cy="200" r="190" fill="#2C3278" />
4
+
5
+ <!-- Scia/Onda inferiore (Swoosh) -->
6
+ <!-- Swoosh grande viola scuro -->
7
+ <path d="M80,260
8
+ Q110,360 200,340
9
+ Q280,320 320,220
10
+ L335,230
11
+ Q300,340 200,360
12
+ Q100,380 70,280 Z"
13
+ fill="#534FB1" opacity="0.9" />
14
+
15
+ <!-- Swoosh piccola interna (più chiara) -->
16
+ <path d="M120,290 Q160,330 220,310"
17
+ fill="none" stroke="#686CCF" stroke-width="12" stroke-linecap="round" />
18
+
19
+ <!-- Stella Principale Bianca -->
20
+ <!-- Uso curve di Bezier per ottenere l'effetto "pizzicato" esatto -->
21
+ <path d="M200,50
22
+ C215,160 215,160 350,200
23
+ C215,240 215,240 200,350
24
+ C185,240 185,240 50,200
25
+ C185,160 185,160 200,50 Z"
26
+ fill="#FFFFFF" />
27
+
28
+ <!-- Elementi decorativi -->
29
+
30
+ <!-- Stella piccola a destra (inclinata) -->
31
+ <path d="M280,110 C290,105 290,105 300,100 C290,95 290,95 280,90 C270,95 270,95 260,100 C270,105 270,105 280,110 Z"
32
+ fill="#FFFFFF" transform="rotate(-15, 280, 100)" />
33
+
34
+ <!-- Pallini a sinistra -->
35
+ <!-- Pallino bianco in alto -->
36
+ <circle cx="140" cy="85" r="5" fill="#FFFFFF" />
37
+ <!-- Pallino blu scuro in basso -->
38
+ <circle cx="90" cy="140" r="7" fill="#4C54A0" />
39
+
40
+ </svg>
@@ -0,0 +1,24 @@
1
+ <svg width="300" height="300" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg">
2
+ <!-- Sfondo quadrato arrotondato -->
3
+ <rect x="20" y="20" width="260" height="260" rx="40" fill="#293375" />
4
+
5
+ <!-- Silhouette Satellite -->
6
+ <g transform="translate(150,150) rotate(-45)">
7
+ <!-- Pannelli solari -->
8
+ <rect x="-90" y="-30" width="60" height="60" fill="#0c1236" />
9
+ <rect x="30" y="-30" width="60" height="60" fill="#0c1236" />
10
+ <!-- Corpo centrale -->
11
+ <rect x="-30" y="-50" width="60" height="100" rx="10" fill="#0c1236" />
12
+ <!-- Antenna -->
13
+ <line x1="0" y1="-50" x2="0" y2="-100" stroke="#f0f0f0" stroke-width="10" stroke-linecap="round"/>
14
+ <!-- Raggio inferiore -->
15
+ <path d="M-10,50 L-20,150 L20,150 L10,50 Z" fill="#f0f0f0" opacity="0.9"/>
16
+ </g>
17
+
18
+ <!-- Segnale di divieto (X rossa) -->
19
+ <circle cx="230" cy="230" r="60" fill="#e84545" />
20
+ <g stroke="white" stroke-width="15" stroke-linecap="round">
21
+ <line x1="210" y1="210" x2="250" y2="250" />
22
+ <line x1="250" y1="210" x2="210" y2="250" />
23
+ </g>
24
+ </svg>
Binary file
Binary file
@@ -0,0 +1,19 @@
1
+ <svg width="300" height="240" viewBox="0 0 300 240" xmlns="http://www.w3.org/2000/svg">
2
+ <!-- Sfondo gradiente radiale -->
3
+ <defs>
4
+ <radialGradient id="gradGX" cx="50%" cy="50%" r="50%" fx="50%" fy="50%">
5
+ <stop offset="0%" style="stop-color:#f0f0f0;stop-opacity:1" />
6
+ <stop offset="70%" style="stop-color:#d0d0d0;stop-opacity:1" />
7
+ <stop offset="100%" style="stop-color:#ffffff;stop-opacity:0" />
8
+ </radialGradient>
9
+ <filter id="blurEffect">
10
+ <feGaussianBlur in="SourceGraphic" stdDeviation="5" />
11
+ </filter>
12
+ </defs>
13
+
14
+ <!-- Ellisse di sfondo sfocata -->
15
+ <ellipse cx="150" cy="120" rx="130" ry="100" fill="url(#gradGX)" filter="url(#blurEffect)" />
16
+
17
+ <!-- Testo GX -->
18
+ <text x="150" y="180" font-family="Arial, sans-serif" font-weight="bold" font-size="160" text-anchor="middle" fill="black">GX</text>
19
+ </svg>
Binary file
@@ -0,0 +1,32 @@
1
+ <svg width="500" height="500" viewBox="0 0 500 500" xmlns="http://www.w3.org/2000/svg">
2
+ <!-- Bordo quadrato arrotondato -->
3
+ <rect x="20" y="20" width="460" height="460" rx="80" fill="white" stroke="black" stroke-width="25" />
4
+
5
+ <!-- Assi Cartesiani -->
6
+ <g stroke="black" stroke-width="25" stroke-linecap="round" stroke-linejoin="round" fill="none">
7
+ <!-- Asse Y e X -->
8
+ <path d="M80,100 L80,420 L420,420" />
9
+ <!-- Frecce -->
10
+ <path d="M50,130 L80,90 L110,130" /> <!-- Freccia Y -->
11
+ <path d="M390,390 L430,420 L390,450" /> <!-- Freccia X -->
12
+ </g>
13
+
14
+ <!-- Punti Dati (Scatter Plot) -->
15
+ <g fill="#ff3333">
16
+ <circle cx="160" cy="220" r="20" />
17
+ <circle cx="200" cy="230" r="20" />
18
+ <circle cx="160" cy="260" r="20" />
19
+ <circle cx="220" cy="230" r="20" />
20
+ <circle cx="270" cy="300" r="20" />
21
+ <circle cx="320" cy="300" r="20" />
22
+ <circle cx="240" cy="350" r="20" />
23
+ <circle cx="330" cy="260" r="20" />
24
+ <circle cx="360" cy="220" r="20" />
25
+ <circle cx="300" cy="150" r="20" />
26
+ <circle cx="370" cy="80" r="20" />
27
+ <circle cx="450" cy="120" r="20" />
28
+ </g>
29
+
30
+ <!-- Linea di Regressione (Best Fit) -->
31
+ <line x1="130" y1="370" x2="420" y2="100" stroke="#2d72b5" stroke-width="30" stroke-linecap="round" />
32
+ </svg>
Binary file
@@ -0,0 +1,42 @@
1
+ <svg width="500" height="500" viewBox="0 0 500 500" xmlns="http://www.w3.org/2000/svg">
2
+
3
+ <!-- Quadrato Alto Sinistra (Giallo / Più) -->
4
+ <g transform="translate(10, 10)">
5
+ <rect width="230" height="230" fill="#fec035" />
6
+ <!-- Effetto ombra diagonale -->
7
+ <path d="M230,0 L230,230 L115,230 Z" fill="#fab005" opacity="0.4" />
8
+ <!-- Simbolo + -->
9
+ <rect x="95" y="45" width="40" height="140" rx="10" fill="white" />
10
+ <rect x="45" y="95" width="140" height="40" rx="10" fill="white" />
11
+ </g>
12
+
13
+ <!-- Quadrato Alto Destra (Rosso / Meno) -->
14
+ <g transform="translate(260, 10)">
15
+ <rect width="230" height="230" fill="#f15654" />
16
+ <path d="M230,0 L230,230 L115,230 Z" fill="#d04442" opacity="0.4" />
17
+ <!-- Simbolo - -->
18
+ <rect x="45" y="95" width="140" height="30" rx="10" fill="white" />
19
+ </g>
20
+
21
+ <!-- Quadrato Basso Sinistra (Verde / Per) -->
22
+ <g transform="translate(10, 260)">
23
+ <rect width="230" height="230" fill="#5cba63" />
24
+ <path d="M230,0 L230,230 L115,230 Z" fill="#4fa555" opacity="0.4" />
25
+ <!-- Simbolo X (Ruotato +) -->
26
+ <g transform="translate(115, 115) rotate(45)">
27
+ <rect x="-20" y="-70" width="40" height="140" rx="10" fill="white" />
28
+ <rect x="-70" y="-20" width="140" height="40" rx="10" fill="white" />
29
+ </g>
30
+ </g>
31
+
32
+ <!-- Quadrato Basso Destra (Blu / Diviso) -->
33
+ <g transform="translate(260, 260)">
34
+ <rect width="230" height="230" fill="#427bc9" />
35
+ <path d="M230,0 L230,230 L115,230 Z" fill="#3664a3" opacity="0.4" />
36
+ <!-- Simbolo Diviso -->
37
+ <rect x="45" y="95" width="140" height="30" rx="10" fill="white" />
38
+ <circle cx="115" cy="55" r="15" fill="white" />
39
+ <circle cx="115" cy="175" r="15" fill="white" />
40
+ </g>
41
+
42
+ </svg>
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -1,124 +1,126 @@
1
1
  import QtQuick 2.15
2
2
  import QtQuick.Controls 2.15
3
3
  import QtQuick.Layouts 1.15
4
+ import QtQuick.Window 2.15 // ✅ gives us access to the attached Window handle
4
5
 
5
6
  Rectangle {
6
7
  id: root
7
- // Wider to fit 3 gauges + spacing
8
8
  width: 200
9
9
  height: 60
10
- // 50% opacity black
11
10
  color: "#80000000"
12
11
  radius: 30
13
12
  border.color: "#555"
14
13
  border.width: 1
15
14
 
16
- property double cpuUsage: 0.0
17
- property double ramUsage: 0.0
18
- property double gpuUsage: 0.0
19
- property double appRamUsage: 0.0
20
- property string appRamString: "0 MB"
21
-
22
- // Helper component for gauges
23
- component MiniGauge: Item {
24
- Layout.preferredWidth: 40
25
- Layout.preferredHeight: 40
26
- property string label: ""
27
- property color barColor: "#0f0"
28
- property double value: 0
29
-
30
- // Trigger repaint when value changes
31
- onValueChanged: if (gaugeCanvas) gaugeCanvas.requestPaint()
32
-
33
- Canvas {
34
- id: gaugeCanvas
35
- anchors.fill: parent
36
- antialiasing: true
37
- onPaint: {
38
- var ctx = getContext("2d");
39
- var cx = width / 2;
40
- var cy = height / 2;
41
- var r = (width / 2) - 3;
42
-
43
- ctx.reset();
44
-
45
- // Track
46
- ctx.beginPath();
47
- ctx.arc(cx, cy, r, 0, 2*Math.PI);
48
- ctx.lineWidth = 4;
49
- ctx.strokeStyle = "#444";
50
- ctx.stroke();
51
-
52
- // Value Arc
53
- // start at -90 deg (top)
54
- var start = -Math.PI/2;
55
- var end = start + (value/100 * 2*Math.PI);
56
-
57
- ctx.beginPath();
58
- ctx.arc(cx, cy, r, start, end);
59
- ctx.lineWidth = 4;
60
- ctx.lineCap = "round";
61
- ctx.strokeStyle = barColor;
62
- ctx.stroke();
63
- }
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.
64
36
  }
65
-
66
- // Numeric Percent in center
67
- Text {
68
- anchors.centerIn: parent
69
- text: Math.round(value) + "%"
70
- font.pixelSize: 10
71
- font.bold: true
72
- color: "#fff"
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();
73
76
  }
74
77
  }
75
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
+
76
88
  RowLayout {
77
89
  anchors.centerIn: parent
78
90
  spacing: 15
79
91
 
80
- // --- CPU ---
81
92
  ColumnLayout {
82
93
  spacing: 2
83
94
  MiniGauge {
84
95
  value: root.cpuUsage
85
- // Dynamic color
86
96
  barColor: root.cpuUsage > 80 ? "#ff4444" : (root.cpuUsage > 50 ? "#ffbb33" : "#00C851")
87
97
  }
88
- Text {
89
- Layout.alignment: Qt.AlignHCenter
90
- text: "CPU"
91
- color: "#aaaaaa"
98
+ Text {
99
+ Layout.alignment: Qt.AlignHCenter
100
+ text: "CPU"
101
+ color: "#aaaaaa"
92
102
  font.pixelSize: 9
93
103
  }
94
104
  }
95
105
 
96
- // --- RAM ---
97
106
  ColumnLayout {
98
107
  spacing: 2
99
- MiniGauge {
100
- value: root.ramUsage
101
- barColor: "#33b5e5"
102
- }
103
- Text {
104
- Layout.alignment: Qt.AlignHCenter
105
- text: "RAM"
106
- color: "#aaaaaa"
108
+ MiniGauge { value: root.ramUsage; barColor: "#33b5e5" }
109
+ Text {
110
+ Layout.alignment: Qt.AlignHCenter
111
+ text: "RAM"
112
+ color: "#aaaaaa"
107
113
  font.pixelSize: 9
108
114
  }
109
115
  }
110
116
 
111
- // --- GPU ---
112
117
  ColumnLayout {
113
118
  spacing: 2
114
- MiniGauge {
115
- value: root.gpuUsage
116
- barColor: "#aa66cc"
117
- }
118
- Text {
119
- Layout.alignment: Qt.AlignHCenter
120
- text: "GPU"
121
- color: "#aaaaaa"
119
+ MiniGauge { value: root.gpuUsage; barColor: "#aa66cc" }
120
+ Text {
121
+ Layout.alignment: Qt.AlignHCenter
122
+ text: "GPU"
123
+ color: "#aaaaaa"
122
124
  font.pixelSize: 9
123
125
  }
124
126
  }
@@ -11,6 +11,19 @@ called via the `main()` function when invoked as an entry point.
11
11
 
12
12
  import sys
13
13
  import os
14
+
15
+ from pathlib import Path
16
+
17
+ if sys.platform.startswith("win"):
18
+ exe_dir = Path(sys.executable).resolve().parent
19
+ internal = exe_dir / "_internal"
20
+ if internal.is_dir():
21
+ try:
22
+ os.add_dll_directory(str(internal))
23
+ except Exception:
24
+ pass
25
+ os.environ["PATH"] = str(internal) + os.pathsep + os.environ.get("PATH", "")
26
+
14
27
  from PyQt6.QtCore import QCoreApplication
15
28
 
16
29
  # ---- Linux Qt stability guard (must run BEFORE any PyQt6 import) ----
@@ -79,9 +92,15 @@ def _init_splash():
79
92
  # Create QApplication
80
93
  _app = QApplication(sys.argv)
81
94
 
95
+ try:
96
+ _app.setQuitOnLastWindowClosed(True)
97
+ except Exception:
98
+ pass
99
+
82
100
  if sys.platform.startswith("linux"):
83
101
  try:
84
102
  print("Qt platform:", _app.platformName())
103
+ print("QuitOnLastWindowClosed:", _app.quitOnLastWindowClosed())
85
104
  print("XDG_SESSION_TYPE:", os.environ.get("XDG_SESSION_TYPE"))
86
105
  print("QT_QPA_PLATFORM:", os.environ.get("QT_QPA_PLATFORM"))
87
106
  print("QT_OPENGL:", os.environ.get("QT_OPENGL"))
@@ -1,3 +1,3 @@
1
1
  # Auto-generated at build time. Do not edit.
2
- BUILD_TIMESTAMP = "2025-12-27T00:14:44Z"
3
- APP_VERSION = "1.6.4"
2
+ BUILD_TIMESTAMP = "2026-01-04T16:49:01Z"
3
+ APP_VERSION = "1.6.10"
setiastro/saspro/abe.py CHANGED
@@ -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.