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.
- setiastro/images/abeicon.svg +16 -0
- setiastro/images/acv_icon.png +0 -0
- setiastro/images/cosmic.svg +40 -0
- setiastro/images/cosmicsat.svg +24 -0
- setiastro/images/first_quarter.png +0 -0
- setiastro/images/full_moon.png +0 -0
- setiastro/images/graxpert.svg +19 -0
- setiastro/images/last_quarter.png +0 -0
- setiastro/images/linearfit.svg +32 -0
- setiastro/images/new_moon.png +0 -0
- setiastro/images/pixelmath.svg +42 -0
- setiastro/images/waning_crescent_1.png +0 -0
- setiastro/images/waning_crescent_2.png +0 -0
- setiastro/images/waning_crescent_3.png +0 -0
- setiastro/images/waning_crescent_4.png +0 -0
- setiastro/images/waning_crescent_5.png +0 -0
- setiastro/images/waning_gibbous_1.png +0 -0
- setiastro/images/waning_gibbous_2.png +0 -0
- setiastro/images/waning_gibbous_3.png +0 -0
- setiastro/images/waning_gibbous_4.png +0 -0
- setiastro/images/waning_gibbous_5.png +0 -0
- setiastro/images/waxing_crescent_1.png +0 -0
- setiastro/images/waxing_crescent_2.png +0 -0
- setiastro/images/waxing_crescent_3.png +0 -0
- setiastro/images/waxing_crescent_4.png +0 -0
- setiastro/images/waxing_crescent_5.png +0 -0
- setiastro/images/waxing_gibbous_1.png +0 -0
- setiastro/images/waxing_gibbous_2.png +0 -0
- setiastro/images/waxing_gibbous_3.png +0 -0
- setiastro/images/waxing_gibbous_4.png +0 -0
- setiastro/images/waxing_gibbous_5.png +0 -0
- setiastro/qml/ResourceMonitor.qml +84 -82
- setiastro/saspro/__main__.py +19 -0
- setiastro/saspro/_generated/build_info.py +2 -2
- setiastro/saspro/abe.py +37 -4
- setiastro/saspro/aberration_ai.py +237 -21
- setiastro/saspro/acv_exporter.py +379 -0
- setiastro/saspro/add_stars.py +33 -6
- setiastro/saspro/backgroundneutral.py +35 -7
- setiastro/saspro/blemish_blaster.py +4 -1
- setiastro/saspro/blink_comparator_pro.py +74 -24
- setiastro/saspro/clahe.py +4 -1
- setiastro/saspro/continuum_subtract.py +4 -1
- setiastro/saspro/convo.py +4 -1
- setiastro/saspro/cosmicclarity.py +129 -18
- setiastro/saspro/crop_dialog_pro.py +123 -7
- setiastro/saspro/curve_editor_pro.py +109 -42
- setiastro/saspro/doc_manager.py +67 -4
- setiastro/saspro/exoplanet_detector.py +120 -28
- setiastro/saspro/frequency_separation.py +1158 -204
- setiastro/saspro/ghs_dialog_pro.py +81 -16
- setiastro/saspro/graxpert.py +1 -0
- setiastro/saspro/gui/main_window.py +393 -204
- setiastro/saspro/gui/mixins/menu_mixin.py +1 -0
- setiastro/saspro/gui/mixins/theme_mixin.py +160 -14
- setiastro/saspro/gui/mixins/toolbar_mixin.py +356 -12
- setiastro/saspro/gui/mixins/update_mixin.py +138 -36
- setiastro/saspro/gui/mixins/view_mixin.py +42 -0
- setiastro/saspro/halobgon.py +4 -0
- setiastro/saspro/histogram.py +5 -1
- setiastro/saspro/image_combine.py +4 -0
- setiastro/saspro/image_peeker_pro.py +4 -0
- setiastro/saspro/imageops/stretch.py +531 -62
- setiastro/saspro/isophote.py +4 -0
- setiastro/saspro/layers.py +13 -9
- setiastro/saspro/layers_dock.py +183 -3
- setiastro/saspro/legacy/image_manager.py +154 -20
- setiastro/saspro/legacy/numba_utils.py +43 -0
- setiastro/saspro/legacy/xisf.py +240 -98
- setiastro/saspro/live_stacking.py +180 -79
- setiastro/saspro/luminancerecombine.py +228 -27
- setiastro/saspro/mask_creation.py +174 -15
- setiastro/saspro/mfdeconv.py +113 -35
- setiastro/saspro/mfdeconvcudnn.py +119 -70
- setiastro/saspro/mfdeconvsport.py +112 -35
- setiastro/saspro/morphology.py +4 -0
- setiastro/saspro/multiscale_decomp.py +51 -12
- setiastro/saspro/numba_utils.py +72 -2
- setiastro/saspro/ops/commands.py +18 -18
- setiastro/saspro/ops/script_editor.py +5 -2
- setiastro/saspro/ops/scripts.py +3 -0
- setiastro/saspro/perfect_palette_picker.py +37 -3
- setiastro/saspro/plate_solver.py +84 -49
- setiastro/saspro/psf_viewer.py +119 -37
- setiastro/saspro/resources.py +67 -0
- setiastro/saspro/rgbalign.py +4 -0
- setiastro/saspro/selective_color.py +4 -1
- setiastro/saspro/sfcc.py +60 -2
- setiastro/saspro/shortcuts.py +142 -23
- setiastro/saspro/signature_insert.py +692 -33
- setiastro/saspro/stacking_suite.py +1017 -400
- setiastro/saspro/star_alignment.py +4 -1
- setiastro/saspro/star_spikes.py +4 -0
- setiastro/saspro/star_stretch.py +38 -3
- setiastro/saspro/stat_stretch.py +702 -128
- setiastro/saspro/subwindow.py +786 -360
- setiastro/saspro/supernovaasteroidhunter.py +1 -1
- setiastro/saspro/wavescale_hdr.py +4 -1
- setiastro/saspro/wavescalede.py +4 -1
- setiastro/saspro/whitebalance.py +60 -12
- setiastro/saspro/widgets/common_utilities.py +28 -21
- setiastro/saspro/widgets/resource_monitor.py +109 -59
- setiastro/saspro/widgets/spinboxes.py +10 -13
- setiastro/saspro/wimi.py +27 -656
- setiastro/saspro/wims.py +13 -3
- setiastro/saspro/xisf.py +101 -11
- {setiastrosuitepro-1.6.4.dist-info → setiastrosuitepro-1.6.10.dist-info}/METADATA +2 -1
- {setiastrosuitepro-1.6.4.dist-info → setiastrosuitepro-1.6.10.dist-info}/RECORD +112 -80
- {setiastrosuitepro-1.6.4.dist-info → setiastrosuitepro-1.6.10.dist-info}/WHEEL +0 -0
- {setiastrosuitepro-1.6.4.dist-info → setiastrosuitepro-1.6.10.dist-info}/entry_points.txt +0 -0
- {setiastrosuitepro-1.6.4.dist-info → setiastrosuitepro-1.6.10.dist-info}/licenses/LICENSE +0 -0
- {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
|
-
|
|
17
|
-
property double
|
|
18
|
-
property double
|
|
19
|
-
property double
|
|
20
|
-
property string appRamString: "0 MB"
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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
|
}
|
setiastro/saspro/__main__.py
CHANGED
|
@@ -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 = "
|
|
3
|
-
APP_VERSION = "1.6.
|
|
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
|
-
|
|
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
|
-
|
|
502
|
+
self._connected_current_doc_changed = False
|
|
500
503
|
if hasattr(self._main, "currentDocumentChanged"):
|
|
501
|
-
|
|
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.
|
|
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.
|