6 Commits
0.5 ... ci_test

Author SHA1 Message Date
Stephen Horvath
52f3372701 Add Windows ZIP build 2025-09-18 15:07:14 +10:00
Stephen Horvath
c1205c7661 Add board model to debug info 2025-09-17 21:48:34 +10:00
Stephen Horvath
973ff26fa7 Fix stutter when opening About dialogue 2025-09-17 21:48:06 +10:00
Stephen Horvath
4a8dfbad47 Update flatpak versioning 2025-09-17 17:19:58 +10:00
Stephen Horvath
2a0675d3be Fix pyinstaller for CI and Windows 2025-09-17 16:51:33 +10:00
Stephen Horvath
55580535db Add new logo and splash screen 2025-09-17 16:26:21 +10:00
19 changed files with 770 additions and 130 deletions

View File

@@ -13,7 +13,7 @@ jobs:
- name: Install System Dependencies - name: Install System Dependencies
uses: awalsh128/cache-apt-pkgs-action@latest uses: awalsh128/cache-apt-pkgs-action@latest
with: with:
packages: python3-gi gir1.2-gtk-4.0 gir1.2-adw-1 libglib2.0-bin packages: python3-gi gir1.2-gtk-4.0 gir1.2-adw-1 libglib2.0-bin python3-tk
version: 0 version: 0
- name: Install PyInstaller - name: Install PyInstaller
run: pip install pyinstaller run: pip install pyinstaller
@@ -21,7 +21,7 @@ jobs:
run: pip install . run: pip install .
- name: Build with PyInstaller - name: Build with PyInstaller
# pyinstaller doesn't find the GTK libraries after caching? # pyinstaller doesn't find the GTK libraries after caching?
run: LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu pyinstaller yafi.spec run: LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu pyinstaller yafi.spec -- --onefile
working-directory: pyinstaller working-directory: pyinstaller
- name: Upload PyInstaller Artifact - name: Upload PyInstaller Artifact
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4

View File

@@ -23,7 +23,7 @@ jobs:
- name: Download GTK4 Gvsbuild zip - name: Download GTK4 Gvsbuild zip
if: steps.cache-gtk4.outputs.cache-hit != 'true' if: steps.cache-gtk4.outputs.cache-hit != 'true'
run: Start-BitsTransfer -Source https://github.com/wingtk/gvsbuild/releases/download/2025.8.0/GTK4_Gvsbuild_2025.8.0_x64.zip -Destination Gvsbuild.zip run: Start-BitsTransfer -Source https://github.com/wingtk/gvsbuild/releases/download/2025.9.0/GTK4_Gvsbuild_2025.9.0_x64.zip -Destination Gvsbuild.zip
- name: Extract Gvsbuild zip - name: Extract Gvsbuild zip
if: steps.cache-gtk4.outputs.cache-hit != 'true' if: steps.cache-gtk4.outputs.cache-hit != 'true'
@@ -41,12 +41,22 @@ jobs:
- name: Build YAFI via Pip - name: Build YAFI via Pip
run: pip install . run: pip install .
- name: Build with PyInstaller - name: Build with PyInstaller (ZIP)
run: python -m PyInstaller yafi.spec run: python -m PyInstaller yafi.spec
working-directory: pyinstaller working-directory: pyinstaller
- name: Upload PyInstaller Artifact - name: Upload PyInstaller Artifact (ZIP)
uses: actions/upload-artifact@v4
with:
path: pyinstaller/dist/YAFI/*
name: yafi-windows-${{ github.sha }}
- name: Build with PyInstaller (Standalone)
run: python -m PyInstaller yafi.spec --noconfirm -- --onefile
working-directory: pyinstaller
- name: Upload PyInstaller Artifact (Standalone)
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
path: pyinstaller/dist/YAFI.exe path: pyinstaller/dist/YAFI.exe
name: yafi-windows-${{ github.sha }} name: yafi-windows-standalone-${{ github.sha }}

View File

@@ -7,7 +7,7 @@
<name>Yet Another Framework Interface</name> <name>Yet Another Framework Interface</name>
<summary>YAFI is another GUI for the Framework Laptop Embedded Controller</summary> <summary>YAFI is another GUI for the Framework Laptop Embedded Controller</summary>
<description> <description>
<p>It is written in Python with a GTK3 theme, and uses the `CrOS_EC_Python` library to communicate with the EC.</p> <p>It is written in Python with a GTK4 Adwaita theme, and uses the `CrOS_EC_Python` library to communicate with the EC.</p>
</description> </description>
<developer id="au.stevetech"> <developer id="au.stevetech">
@@ -27,7 +27,7 @@
<!-- Should provide a web link to an online user's reference, a software manual or help page --> <!-- Should provide a web link to an online user's reference, a software manual or help page -->
<!-- <url type="help">https://example.org/help</url> --> <!-- <url type="help">https://example.org/help</url> -->
<!-- URLs of this type should point to a webpage showing information on how to donate to the described software project --> <!-- URLs of this type should point to a webpage showing information on how to donate to the described software project -->
<!-- <url type="donation">https://example.org/donate</url> --> <url type="donation">https://github.com/sponsors/Steve-Tech</url>
<!-- This could for example be an HTTPS URL to an online form or a page describing how to contact the developer --> <!-- This could for example be an HTTPS URL to an online form or a page describing how to contact the developer -->
<!-- <url type="contact">https://example.org/contact</url> --> <!-- <url type="contact">https://example.org/contact</url> -->
<!-- URLs of this type should point to a webpage showing information on how to contribute to the described software project --> <!-- URLs of this type should point to a webpage showing information on how to contribute to the described software project -->
@@ -48,36 +48,29 @@
<screenshots> <screenshots>
<screenshot type="default"> <screenshot type="default">
<image>https://github.com/Steve-Tech/YAFI/blob/main/docs/1-thermal.png</image> <image>https://github.com/Steve-Tech/YAFI/blob/main/docs/1-thermals.png</image>
<caption>The Thermal page</caption> <caption>Fan Control and Temperature Monitoring</caption>
</screenshot> </screenshot>
<screenshot> <screenshot>
<image>https://github.com/Steve-Tech/YAFI/blob/main/docs/2-leds.png</image> <image>https://github.com/Steve-Tech/YAFI/blob/main/docs/2-leds.png</image>
<caption>The LED page</caption> <caption>LED Control</caption>
</screenshot> </screenshot>
<screenshot> <screenshot>
<image>https://github.com/Steve-Tech/YAFI/blob/main/docs/3-battery.png</image> <image>https://github.com/Steve-Tech/YAFI/blob/main/docs/3-battery.png</image>
<caption>The Battery page</caption> <caption>Battery Statistics</caption>
</screenshot> </screenshot>
<screenshot> <screenshot>
<image>https://github.com/Steve-Tech/YAFI/blob/main/docs/4-hardware.png</image> <image>https://github.com/Steve-Tech/YAFI/blob/main/docs/4-battery-limit.png</image>
<caption>The Hardware page</caption> <caption>Battery Limiting</caption>
</screenshot>
<screenshot>
<image>https://github.com/Steve-Tech/YAFI/blob/main/docs/4a-battery-ext.png</image>
<caption>Battery Extender</caption>
</screenshot>
<screenshot>
<image>https://github.com/Steve-Tech/YAFI/blob/main/docs/5-hardware.png</image>
<caption>Hardware Info</caption>
</screenshot> </screenshot>
</screenshots> </screenshots>
<releases>
<release version="0.1.0" date="2025-03-20">
<url type="details">https://github.com/Steve-Tech/YAFI/releases/tag/0.1.0</url>
<description translate="no">
<p>First release</p>
<ul>
<li>Added Thermal page</li>
<li>Added LED page</li>
<li>Added Battery page</li>
<li>Added Hardware page</li>
</ul>
</description>
</release>
</releases>
</component> </component>

View File

@@ -1,36 +1,92 @@
<?xml version="1.0" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" <!-- Created with Inkscape (http://www.inkscape.org/) -->
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg" <svg
width="512.000000pt" height="512.000000pt" viewBox="0 0 512.000000 512.000000" width="128"
preserveAspectRatio="xMidYMid meet"> height="128"
<metadata> viewBox="0 0 128 128"
Created by potrace 1.11, written by Peter Selinger 2001-2013 version="1.1"
</metadata> id="svg1"
<g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)" xml:space="preserve"
fill="#000000" stroke="none"> xmlns="http://www.w3.org/2000/svg"
<path d="M1755 4883 c-120 -22 -418 -180 -609 -322 -118 -89 -148 -118 -177 xmlns:svg="http://www.w3.org/2000/svg"><defs
-177 -23 -48 -24 -57 -27 -314 -1 -146 -7 -294 -13 -330 -18 -110 -78 -222 id="defs1" /><g
-163 -303 -46 -43 -69 -58 -305 -197 -191 -112 -222 -139 -257 -214 -33 -73 id="layer1"><g
-39 -145 -39 -461 0 -297 5 -360 33 -440 25 -73 77 -118 257 -224 88 -51 187 id="icon"><g
-111 220 -132 123 -79 192 -169 245 -319 8 -21 14 -110 16 -230 8 -403 9 -423 id="chip"
29 -460 32 -61 56 -88 134 -148 234 -181 550 -347 676 -356 75 -5 116 12 306 style="stroke-width:0;stroke-dasharray:none"><path
125 181 108 307 175 330 176 8 1 35 5 61 11 70 14 174 5 251 -23 38 -13 164 style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
-81 281 -149 286 -168 312 -173 494 -90 41 19 75 34 77 34 4 0 201 110 243 d="m 34,8 v 8"
135 45 27 147 100 213 153 51 40 83 75 104 113 l30 54 6 310 c5 280 8 315 27 id="pin1" /><path
365 58 156 137 245 295 336 246 140 346 205 376 243 35 44 60 106 67 166 2 22 style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
8 74 13 115 9 78 7 442 -4 520 -12 97 -16 116 -27 150 -16 52 -61 113 -105 d="M 54,8.0000019 V 16.000002"
142 -21 14 -126 78 -233 141 -107 64 -209 128 -225 144 -51 48 -101 115 -128 id="pin2" /><path
173 -48 105 -56 163 -56 454 -1 262 -1 270 -25 321 -24 53 -65 100 -124 145 style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
-19 14 -46 34 -60 46 -42 32 -190 128 -257 164 -250 138 -384 177 -476 140 d="M 74.000009,8.0000019 V 16.000002"
-19 -8 -101 -54 -184 -104 -316 -188 -340 -198 -480 -199 -153 -1 -181 10 id="pin3" /><path
-501 201 -178 106 -237 128 -309 115z m984 -848 c149 -19 308 -68 441 -135 68 style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
-34 181 -100 190 -110 3 -3 21 -17 40 -30 52 -37 75 -57 166 -148 150 -151 d="m 93.999992,8 v 8"
281 -364 345 -562 33 -102 32 -99 56 -210 18 -86 26 -378 13 -455 -5 -27 -12 id="pin4" /><path
-68 -15 -90 -16 -102 -64 -250 -117 -364 -211 -450 -634 -764 -1113 -828 -113 style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
-15 -425 -7 -455 12 -4 2 -22 7 -41 10 -150 26 -404 140 -531 239 -14 12 -41 d="m 120,34.000001 h -8"
32 -59 46 -115 85 -291 299 -371 449 -78 148 -144 353 -165 516 -10 76 -10 id="pin5" /><path
311 0 390 15 117 58 274 106 390 116 278 347 543 608 696 158 92 386 169 549 style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
184 38 4 70 8 72 9 5 6 229 -2 281 -9z"/> d="m 120,54.000001 h -8"
</g> id="pin6" /><path
</svg> style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="m 120,74.000009 h -8"
id="pin7" /><path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="m 120,93.999992 h -8"
id="pin8" /><path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="m 94.000009,112 v 8"
id="pin9" /><path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="m 74.000026,112 v 8"
id="pin10" /><path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="m 54.000017,112 v 8"
id="pin11" /><path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="m 34.000017,112 v 8"
id="pin12" /><path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="M 16.000002,93.999992 H 8.0000019"
id="pin13" /><path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="M 16.000002,74.000009 H 8.0000019"
id="pin14" /><path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="M 16.000002,54.000001 H 8.0000019"
id="pin15" /><path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="M 16.000002,34.000001 H 8.0000019"
id="pin16" /><rect
style="fill:#000000;fill-opacity:0.5;stroke-width:0;stroke-dasharray:none"
id="shadow"
width="104"
height="104"
x="16"
y="16"
rx="16.000002"
ry="16.000002" /><rect
style="fill:#808080;stroke-width:0;stroke-dasharray:none"
id="package"
width="104"
height="104"
x="12.000001"
y="12.000001"
rx="16.000002"
ry="16.000002" /><circle
style="fill:#b3b3b3;fill-opacity:1;stroke:none;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
id="dot"
cx="22"
cy="22"
r="2" /></g><path
id="cog"
style="display:inline;fill:#282000;fill-opacity:1;stroke:none;stroke-width:8.00001;stroke-dasharray:none;paint-order:stroke fill markers"
d="m 47.818363,18 -15.564456,8.986326 4.037106,14.113285 c -2.535988,3.065348 -4.574404,6.558856 -5.988276,10.355467 l -14.230472,3.558595 v 17.972654 l 14.230472,3.558592 c 1.413872,3.79649 3.452288,7.288524 5.988276,10.353516 L 32.253907,101.01367 47.818363,110 58.019531,99.451172 c 1.945156,0.325909 3.942754,0.494135 5.980471,0.494135 2.037713,0 4.035311,-0.168226 5.980467,-0.494135 L 80.181641,110 95.746094,101.01367 91.708984,86.898435 c 2.536165,-3.064992 4.57429,-6.557026 5.988283,-10.353516 L 111.92774,72.986327 V 55.013673 L 97.697267,51.455078 C 96.283274,47.658406 94.245149,44.164959 91.708984,41.099611 L 95.746094,26.986326 80.181641,18 69.980469,28.548828 c -1.945156,-0.325795 -3.942754,-0.494143 -5.980467,-0.494143 -2.037717,0 -4.035315,0.16834 -5.980471,0.494143 z M 64.000002,36 A 27.999999,27.999997 0 0 1 92,63.999998 27.999999,27.999997 0 0 1 64.000002,91.999996 27.999999,27.999997 0 0 1 36,63.999998 27.999999,27.999997 0 0 1 64.000002,36 Z" /><path
id="Y"
style="fill:none;stroke:#282000;stroke-width:8;stroke-linecap:round;stroke-dasharray:none"
d="M 64.000002,62.00022 50.000001,48.000008 m 13.999997,38.000215 4e-6,-24.000003 m -4e-6,0 14.000001,-14.000212 m -13.999997,38.000215 -4e-6,-24.000003" /></g></g></svg>

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

@@ -1,36 +1,21 @@
<?xml version="1.0" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" <!-- Created with Inkscape (http://www.inkscape.org/) -->
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg" <svg
width="512.000000pt" height="512.000000pt" viewBox="0 0 512.000000 512.000000" width="128"
preserveAspectRatio="xMidYMid meet"> height="128"
<metadata> viewBox="0 0 128 128"
Created by potrace 1.11, written by Peter Selinger 2001-2013 version="1.1"
</metadata> id="svg1"
<g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)" xml:space="preserve"
fill="#000000" stroke="none"> xmlns="http://www.w3.org/2000/svg"
<path d="M1755 4883 c-120 -22 -418 -180 -609 -322 -118 -89 -148 -118 -177 xmlns:svg="http://www.w3.org/2000/svg"><defs
-177 -23 -48 -24 -57 -27 -314 -1 -146 -7 -294 -13 -330 -18 -110 -78 -222 id="defs1" /><g
-163 -303 -46 -43 -69 -58 -305 -197 -191 -112 -222 -139 -257 -214 -33 -73 id="layer1"><g
-39 -145 -39 -461 0 -297 5 -360 33 -440 25 -73 77 -118 257 -224 88 -51 187 id="icon"><path
-111 220 -132 123 -79 192 -169 245 -319 8 -21 14 -110 16 -230 8 -403 9 -423 id="cog"
29 -460 32 -61 56 -88 134 -148 234 -181 550 -347 676 -356 75 -5 116 12 306 style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:8.00001;stroke-dasharray:none;paint-order:stroke fill markers"
125 181 108 307 175 330 176 8 1 35 5 61 11 70 14 174 5 251 -23 38 -13 164 d="m 47.818363,18 -15.564456,8.986326 4.037106,14.113285 c -2.535988,3.065348 -4.574404,6.558856 -5.988276,10.355467 l -14.230472,3.558595 v 17.972654 l 14.230472,3.558592 c 1.413872,3.79649 3.452288,7.288524 5.988276,10.353516 L 32.253907,101.01367 47.818363,110 58.019531,99.451172 c 1.945156,0.325909 3.942754,0.494135 5.980471,0.494135 2.037713,0 4.035311,-0.168226 5.980467,-0.494135 L 80.181641,110 95.746094,101.01367 91.708984,86.898435 c 2.536165,-3.064992 4.57429,-6.557026 5.988283,-10.353516 L 111.92774,72.986327 V 55.013673 L 97.697267,51.455078 C 96.283274,47.658406 94.245149,44.164959 91.708984,41.099611 L 95.746094,26.986326 80.181641,18 69.980469,28.548828 c -1.945156,-0.325795 -3.942754,-0.494143 -5.980467,-0.494143 -2.037717,0 -4.035315,0.16834 -5.980471,0.494143 z M 64.000002,36 A 27.999999,27.999997 0 0 1 92,63.999998 27.999999,27.999997 0 0 1 64.000002,91.999996 27.999999,27.999997 0 0 1 36,63.999998 27.999999,27.999997 0 0 1 64.000002,36 Z" /><path
-81 281 -149 286 -168 312 -173 494 -90 41 19 75 34 77 34 4 0 201 110 243 id="Y"
135 45 27 147 100 213 153 51 40 83 75 104 113 l30 54 6 310 c5 280 8 315 27 style="fill:none;stroke:#000000;stroke-width:8;stroke-linecap:round;stroke-dasharray:none"
365 58 156 137 245 295 336 246 140 346 205 376 243 35 44 60 106 67 166 2 22 d="M 64.000002,62.00022 50.000001,48.000008 m 13.999997,38.000215 4e-6,-24.000003 m -4e-6,0 14.000001,-14.000212 m -13.999997,38.000215 -4e-6,-24.000003" /></g></g></svg>
8 74 13 115 9 78 7 442 -4 520 -12 97 -16 116 -27 150 -16 52 -61 113 -105
142 -21 14 -126 78 -233 141 -107 64 -209 128 -225 144 -51 48 -101 115 -128
173 -48 105 -56 163 -56 454 -1 262 -1 270 -25 321 -24 53 -65 100 -124 145
-19 14 -46 34 -60 46 -42 32 -190 128 -257 164 -250 138 -384 177 -476 140
-19 -8 -101 -54 -184 -104 -316 -188 -340 -198 -480 -199 -153 -1 -181 10
-501 201 -178 106 -237 128 -309 115z m984 -848 c149 -19 308 -68 441 -135 68
-34 181 -100 190 -110 3 -3 21 -17 40 -30 52 -37 75 -57 166 -148 150 -151
281 -364 345 -562 33 -102 32 -99 56 -210 18 -86 26 -378 13 -455 -5 -27 -12
-68 -15 -90 -16 -102 -64 -250 -117 -364 -211 -450 -634 -764 -1113 -828 -113
-15 -425 -7 -455 12 -4 2 -22 7 -41 10 -150 26 -404 140 -531 239 -14 12 -41
32 -59 46 -115 85 -291 299 -371 449 -78 148 -144 353 -165 516 -10 76 -10
311 0 390 15 117 58 274 106 390 116 278 347 543 608 696 158 92 386 169 549
184 38 4 70 8 72 9 5 6 229 -2 281 -9z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

159
logo.svg Normal file
View File

@@ -0,0 +1,159 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="128"
height="128"
viewBox="0 0 128 128"
version="1.1"
id="svg1"
xml:space="preserve"
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
sodipodi:docname="logo.svg"
inkscape:export-filename="logo-plain.svg"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
inkscape:zoom="2"
inkscape:cx="37.25"
inkscape:cy="109"
inkscape:window-width="1876"
inkscape:window-height="1025"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" /><defs
id="defs1" /><g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"><g
id="icon"
inkscape:label="icon"><g
id="chip"
inkscape:label="chip"
style="stroke-width:0;stroke-dasharray:none"><path
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
d="m 34,8 v 8"
id="pin1"
sodipodi:nodetypes="cc"
inkscape:label="pin1" /><path
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
d="M 54,8.0000019 V 16.000002"
id="pin2"
sodipodi:nodetypes="cc"
inkscape:label="pin2" /><path
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
d="M 74.000009,8.0000019 V 16.000002"
id="pin3"
sodipodi:nodetypes="cc"
inkscape:label="pin3" /><path
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
d="m 93.999992,8 v 8"
id="pin4"
sodipodi:nodetypes="cc"
inkscape:label="pin4" /><path
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
d="m 120,34.000001 h -8"
id="pin5"
sodipodi:nodetypes="cc"
inkscape:label="pin5" /><path
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
d="m 120,54.000001 h -8"
id="pin6"
sodipodi:nodetypes="cc"
inkscape:label="pin6" /><path
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
d="m 120,74.000009 h -8"
id="pin7"
sodipodi:nodetypes="cc"
inkscape:label="pin7" /><path
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
d="m 120,93.999992 h -8"
id="pin8"
sodipodi:nodetypes="cc"
inkscape:label="pin8" /><path
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
d="m 94.000009,112 v 8"
id="pin9"
sodipodi:nodetypes="cc"
inkscape:label="pin9" /><path
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
d="m 74.000026,112 v 8"
id="pin10"
sodipodi:nodetypes="cc"
inkscape:label="pin10" /><path
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
d="m 54.000017,112 v 8"
id="pin11"
sodipodi:nodetypes="cc"
inkscape:label="pin11" /><path
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
d="m 34.000017,112 v 8"
id="pin12"
sodipodi:nodetypes="cc"
inkscape:label="pin12" /><path
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
d="M 16.000002,93.999992 H 8.0000019"
id="pin13"
sodipodi:nodetypes="cc"
inkscape:label="pin13" /><path
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
d="M 16.000002,74.000009 H 8.0000019"
id="pin14"
sodipodi:nodetypes="cc"
inkscape:label="pin14" /><path
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
d="M 16.000002,54.000001 H 8.0000019"
id="pin15"
sodipodi:nodetypes="cc"
inkscape:label="pin15" /><path
style="stroke-width:8;stroke-dasharray:none;fill:none;stroke:#ffcc00;stroke-linecap:round;paint-order:stroke fill markers"
d="M 16.000002,34.000001 H 8.0000019"
id="pin16"
sodipodi:nodetypes="cc"
inkscape:label="pin16" /><rect
style="fill:#000000;stroke-width:0;stroke-dasharray:none;fill-opacity:0.5"
id="shadow"
width="104"
height="104"
x="16"
y="16"
rx="16.000002"
ry="16.000002"
inkscape:label="shadow" /><rect
style="fill:#808080;stroke-width:0;stroke-dasharray:none"
id="package"
width="104"
height="104"
x="12.000001"
y="12.000001"
rx="16.000002"
ry="16.000002"
inkscape:label="package" /><circle
style="fill:#b3b3b3;fill-opacity:1;stroke:none;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
id="dot"
cx="22"
cy="22"
r="2"
inkscape:label="dot" /></g><path
id="cog"
style="display:inline;fill:#282000;fill-opacity:1;stroke:none;stroke-width:8.00001;stroke-dasharray:none;paint-order:stroke fill markers"
d="m 47.818363,18 -15.564456,8.986326 4.037106,14.113285 c -2.535988,3.065348 -4.574404,6.558856 -5.988276,10.355467 l -14.230472,3.558595 v 17.972654 l 14.230472,3.558592 c 1.413872,3.79649 3.452288,7.288524 5.988276,10.353516 L 32.253907,101.01367 47.818363,110 58.019531,99.451172 c 1.945156,0.325909 3.942754,0.494135 5.980471,0.494135 2.037713,0 4.035311,-0.168226 5.980467,-0.494135 L 80.181641,110 95.746094,101.01367 91.708984,86.898435 c 2.536165,-3.064992 4.57429,-6.557026 5.988283,-10.353516 L 111.92774,72.986327 V 55.013673 L 97.697267,51.455078 C 96.283274,47.658406 94.245149,44.164959 91.708984,41.099611 L 95.746094,26.986326 80.181641,18 69.980469,28.548828 c -1.945156,-0.325795 -3.942754,-0.494143 -5.980467,-0.494143 -2.037717,0 -4.035315,0.16834 -5.980471,0.494143 z M 64.000002,36 A 27.999999,27.999997 0 0 1 92,63.999998 27.999999,27.999997 0 0 1 64.000002,91.999996 27.999999,27.999997 0 0 1 36,63.999998 27.999999,27.999997 0 0 1 64.000002,36 Z"
inkscape:label="cog" /><path
id="Y"
style="fill:none;stroke:#282000;stroke-width:8;stroke-linecap:round;stroke-dasharray:none"
d="M 64.000002,62.00022 50.000001,48.000008 m 13.999997,38.000215 4e-6,-24.000003 m -4e-6,0 14.000001,-14.000212 m -13.999997,38.000215 -4e-6,-24.000003"
inkscape:label="Y"
sodipodi:nodetypes="cccccccc" /></g></g></svg>

After

Width:  |  Height:  |  Size: 8.0 KiB

View File

@@ -1,5 +1,5 @@
project('yafi', project('yafi',
version: '0.1.0', version: '0.5',
meson_version: '>= 1.0.0', meson_version: '>= 1.0.0',
default_options: [ 'warning_level=2', 'werror=false', ], default_options: [ 'warning_level=2', 'werror=false', ],
) )

BIN
pyinstaller/splash.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

384
pyinstaller/splash.svg Normal file
View File

@@ -0,0 +1,384 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="256"
height="256"
viewBox="0 0 256 256"
version="1.1"
id="svg1"
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
sodipodi:docname="spash.svg"
inkscape:export-filename="splash.png"
inkscape:export-xdpi="180"
inkscape:export-ydpi="180"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="px"
showguides="false"
inkscape:zoom="2"
inkscape:cx="36.25"
inkscape:cy="178.75"
inkscape:window-width="1920"
inkscape:window-height="1052"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs1">
<filter
style="color-interpolation-filters:sRGB"
inkscape:label="Drop Shadow"
id="filter151"
x="0"
y="0"
width="1.0384614"
height="1.0384614">
<feFlood
result="flood"
in="SourceGraphic"
flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
id="feFlood150" />
<feGaussianBlur
result="blur"
in="SourceGraphic"
stdDeviation="0.000000"
id="feGaussianBlur150" />
<feOffset
result="offset"
in="blur"
dx="4.000000"
dy="4.000000"
id="feOffset150" />
<feComposite
result="comp1"
operator="in"
in="flood"
in2="offset"
id="feComposite150" />
<feComposite
result="comp2"
operator="over"
in="SourceGraphic"
in2="comp1"
id="feComposite151" />
</filter>
<filter
style="color-interpolation-filters:sRGB"
inkscape:label="Drop Shadow"
id="filter151-6"
x="0"
y="0"
width="1.0384615"
height="1.0384615">
<feFlood
result="flood"
in="SourceGraphic"
flood-opacity="0.498039"
flood-color="rgb(0,0,0)"
id="feFlood150-1" />
<feGaussianBlur
result="blur"
in="SourceGraphic"
stdDeviation="0.000000"
id="feGaussianBlur150-8" />
<feOffset
result="offset"
in="blur"
dx="4.000000"
dy="4.000000"
id="feOffset150-7" />
<feComposite
result="comp1"
operator="in"
in="flood"
in2="offset"
id="feComposite150-9" />
<feComposite
result="comp2"
operator="over"
in="SourceGraphic"
in2="comp1"
id="feComposite151-2" />
</filter>
</defs>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<rect
style="fill:#7c916f;stroke-width:1;paint-order:stroke fill markers"
id="rect1"
width="256"
height="256"
x="0"
y="0" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
d="M 0,117.875 H 23.874996 L 43.75,97.999992 H 76"
id="path4"
sodipodi:nodetypes="cccc" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
d="M 0,97.875016 H 23.874996 L 43.75,78.000008 H 76"
id="path4-4"
sodipodi:nodetypes="cccc" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
d="M 0,77.875008 H 23.874996 L 43.75,58 H 76"
id="path4-9"
sodipodi:nodetypes="cccc" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
d="M 0,57.875008 H 23.874996 L 43.75,38 H 76"
id="path4-2"
sodipodi:nodetypes="cccc" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
d="M 97.999999,0 V 16.000001"
id="path5"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
d="M 118,0 V 16.000001"
id="path5-8"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
d="M 138.00001,0 V 16.000001"
id="path5-4"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
d="M 157.99999,0 V 16.000001"
id="path5-89"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
d="M 256,117.87502 H 232.125 L 212.25,98.000008 H 180"
id="path4-1"
sodipodi:nodetypes="cccc" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
d="M 255.625,97.875035 H 231.75 L 211.875,78.000023 H 180"
id="path4-1-5"
sodipodi:nodetypes="cccc" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
d="M 255.625,77.875012 H 231.75 L 211.875,58 H 180"
id="path4-1-6"
sodipodi:nodetypes="cccc" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
d="M 255.625,57.875012 H 231.75 L 211.875,38 H 180"
id="path4-1-63"
sodipodi:nodetypes="cccc" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
d="m 192.16536,142.16357 -9.15729,-9.15728 H 163.00629 L 158.00001,128 l 0,-8"
id="path9" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
d="m 147.1875,143.0625 v -5.875 L 138.00001,128 l 0,-8"
id="path10" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
d="M 119.98796,141.81833 118,139.83037 V 128 120"
id="path11" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
d="m 101,142.125 -3.000001,-3 V 128 120"
id="path12" />
<text
xml:space="preserve"
style="font-weight:bold;font-size:64px;line-height:1;font-family:Comfortaa;-inkscape-font-specification:'Comfortaa Bold';text-align:center;text-decoration-color:#000000;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#282000;stroke-width:0.264583;paint-order:stroke fill markers"
x="131.10406"
y="189.98389"
id="text1"><tspan
sodipodi:role="line"
id="tspan1"
style="font-size:64px;fill:#282000;stroke-width:0.264583"
x="131.10406"
y="189.98389">YAFI</tspan></text>
<text
xml:space="preserve"
style="font-weight:bold;font-size:21.3333px;line-height:1;font-family:Comfortaa;-inkscape-font-specification:'Comfortaa Bold';text-align:center;text-decoration-color:#000000;writing-mode:lr-tb;direction:ltr;text-anchor:middle;fill:#282000;stroke-width:0.264583;paint-order:stroke fill markers"
x="128.032"
y="214.66127"
id="text1-6"><tspan
sodipodi:role="line"
id="tspan1-0"
style="font-size:21.3333px;fill:#282000;stroke-width:0.264583"
x="128.032"
y="214.66127">Yet Another</tspan><tspan
sodipodi:role="line"
style="font-size:21.3333px;fill:#282000;stroke-width:0.264583"
x="128.032"
y="235.99457"
id="tspan2">Framework Interface</tspan></text>
<g
id="icon"
inkscape:label="icon"
transform="translate(63.999998,4)">
<g
id="chip"
inkscape:label="chip"
style="stroke-width:0;stroke-dasharray:none">
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="m 34,8 v 8"
id="pin1"
sodipodi:nodetypes="cc"
inkscape:label="pin1" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="M 54,8.0000019 V 16.000002"
id="pin2"
sodipodi:nodetypes="cc"
inkscape:label="pin2" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="M 74.000009,8.0000019 V 16.000002"
id="pin3"
sodipodi:nodetypes="cc"
inkscape:label="pin3" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="m 93.999992,8 v 8"
id="pin4"
sodipodi:nodetypes="cc"
inkscape:label="pin4" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="m 120,34.000001 h -8"
id="pin5"
sodipodi:nodetypes="cc"
inkscape:label="pin5" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="m 120,54.000001 h -8"
id="pin6"
sodipodi:nodetypes="cc"
inkscape:label="pin6" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="m 120,74.000009 h -8"
id="pin7"
sodipodi:nodetypes="cc"
inkscape:label="pin7" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="m 120,93.999992 h -8"
id="pin8"
sodipodi:nodetypes="cc"
inkscape:label="pin8" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="m 94.000009,112 v 8"
id="pin9"
sodipodi:nodetypes="cc"
inkscape:label="pin9" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="m 74.000026,112 v 8"
id="pin10"
sodipodi:nodetypes="cc"
inkscape:label="pin10" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="m 54.000017,112 v 8"
id="pin11"
sodipodi:nodetypes="cc"
inkscape:label="pin11" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="m 34.000017,112 v 8"
id="pin12"
sodipodi:nodetypes="cc"
inkscape:label="pin12" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="M 16.000002,93.999992 H 8.0000019"
id="pin13"
sodipodi:nodetypes="cc"
inkscape:label="pin13" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="M 16.000002,74.000009 H 8.0000019"
id="pin14"
sodipodi:nodetypes="cc"
inkscape:label="pin14" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="M 16.000002,54.000001 H 8.0000019"
id="pin15"
sodipodi:nodetypes="cc"
inkscape:label="pin15" />
<path
style="fill:none;stroke:#ffcc00;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
d="M 16.000002,34.000001 H 8.0000019"
id="pin16"
sodipodi:nodetypes="cc"
inkscape:label="pin16" />
<rect
style="fill:#000000;fill-opacity:0.5;stroke-width:0;stroke-dasharray:none"
id="shadow"
width="104"
height="104"
x="16"
y="16"
rx="16.000002"
ry="16.000002"
inkscape:label="shadow" />
<rect
style="fill:#808080;stroke-width:0;stroke-dasharray:none"
id="package"
width="104"
height="104"
x="12.000001"
y="12.000001"
rx="16.000002"
ry="16.000002"
inkscape:label="package" />
<circle
style="fill:#b3b3b3;fill-opacity:1;stroke:none;stroke-width:8;stroke-linecap:round;stroke-dasharray:none;paint-order:stroke fill markers"
id="dot"
cx="22"
cy="22"
r="2"
inkscape:label="dot" />
</g>
<path
id="cog"
style="display:inline;fill:#282000;fill-opacity:1;stroke:none;stroke-width:8.00001;stroke-dasharray:none;paint-order:stroke fill markers"
d="m 47.818363,18 -15.564456,8.986326 4.037106,14.113285 c -2.535988,3.065348 -4.574404,6.558856 -5.988276,10.355467 l -14.230472,3.558595 v 17.972654 l 14.230472,3.558592 c 1.413872,3.79649 3.452288,7.288524 5.988276,10.353516 L 32.253907,101.01367 47.818363,110 58.019531,99.451172 c 1.945156,0.325909 3.942754,0.494135 5.980471,0.494135 2.037713,0 4.035311,-0.168226 5.980467,-0.494135 L 80.181641,110 95.746094,101.01367 91.708984,86.898435 c 2.536165,-3.064992 4.57429,-6.557026 5.988283,-10.353516 L 111.92774,72.986327 V 55.013673 L 97.697267,51.455078 C 96.283274,47.658406 94.245149,44.164959 91.708984,41.099611 L 95.746094,26.986326 80.181641,18 69.980469,28.548828 c -1.945156,-0.325795 -3.942754,-0.494143 -5.980467,-0.494143 -2.037717,0 -4.035315,0.16834 -5.980471,0.494143 z M 64.000002,36 A 27.999999,27.999997 0 0 1 92,63.999998 27.999999,27.999997 0 0 1 64.000002,91.999996 27.999999,27.999997 0 0 1 36,63.999998 27.999999,27.999997 0 0 1 64.000002,36 Z"
inkscape:label="cog" />
<path
id="Y"
style="fill:none;stroke:#282000;stroke-width:8;stroke-linecap:round;stroke-dasharray:none"
d="M 64.000002,62.00022 50.000001,48.000008 m 13.999997,38.000215 4e-6,-24.000003 m -4e-6,0 14.000001,-14.000212 m -13.999997,38.000215 -4e-6,-24.000003"
inkscape:label="Y"
sodipodi:nodetypes="cccccccc" />
</g>
<rect
style="fill:#ffcc00;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;paint-order:normal"
id="rect12"
width="256"
height="12"
x="0"
y="244" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 148 KiB

View File

@@ -1,11 +1,15 @@
# -*- mode: python ; coding: utf-8 -*- # -*- mode: python ; coding: utf-8 -*-
from PyInstaller.utils.hooks import collect_data_files from PyInstaller.utils.hooks import collect_data_files
import os import os
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--onefile", action="store_true")
options = parser.parse_args()
datas = [('LpcCrOSEC.bin', '.')] if os.name == 'nt' and os.path.exists('LpcCrOSEC.bin') else [] datas = [('LpcCrOSEC.bin', '.')] if os.name == 'nt' and os.path.exists('LpcCrOSEC.bin') else []
datas += collect_data_files('yafi') datas += collect_data_files('yafi')
a = Analysis( a = Analysis(
['entrypoint.py'], ['entrypoint.py'],
pathex=[], pathex=[],
@@ -21,12 +25,34 @@ a = Analysis(
) )
pyz = PYZ(a.pure) pyz = PYZ(a.pure)
exe = EXE( if options.onefile:
pyz, splash = Splash(
'splash.png',
binaries=a.binaries,
datas=a.datas,
text_pos=(4, 480),
# Text doesn't scale on Linux, but does on Windows
text_size=12 if os.name == 'nt' else 6,
minify_script=True,
always_on_top=True,
)
exe_args = (
[
a.scripts, a.scripts,
a.binaries, a.binaries,
a.datas, a.datas,
[], splash,
splash.binaries,
]
if options.onefile
else [a.scripts]
)
exe = EXE(
pyz,
*exe_args,
exclude_binaries=not options.onefile,
name='YAFI', name='YAFI',
debug=False, debug=False,
bootloader_ignore_signals=False, bootloader_ignore_signals=False,
@@ -42,3 +68,14 @@ exe = EXE(
entitlements_file=None, entitlements_file=None,
icon=['yafi.ico'], icon=['yafi.ico'],
) )
if not options.onefile:
coll = COLLECT(
exe,
a.binaries,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='YAFI',
)

View File

@@ -18,9 +18,7 @@
# #
# SPDX-License-Identifier: GPL-2.0-or-later # SPDX-License-Identifier: GPL-2.0-or-later
from gi.repository import Adw from gi.repository import Gtk, Adw, GLib
from gi.repository import Gtk
from gi.repository import GLib
import cros_ec_python.commands as ec_commands import cros_ec_python.commands as ec_commands
import cros_ec_python.exceptions as ec_exceptions import cros_ec_python.exceptions as ec_exceptions

View File

@@ -18,9 +18,7 @@
# #
# SPDX-License-Identifier: GPL-2.0-or-later # SPDX-License-Identifier: GPL-2.0-or-later
from gi.repository import Adw from gi.repository import Gtk, Adw, GLib
from gi.repository import Gtk
from gi.repository import GLib
import cros_ec_python.commands as ec_commands import cros_ec_python.commands as ec_commands
import cros_ec_python.exceptions as ec_exceptions import cros_ec_python.exceptions as ec_exceptions

View File

@@ -18,9 +18,7 @@
# #
# SPDX-License-Identifier: GPL-2.0-or-later # SPDX-License-Identifier: GPL-2.0-or-later
from gi.repository import Adw from gi.repository import Gtk, Adw, GLib
from gi.repository import Gtk
from gi.repository import GLib
import cros_ec_python.commands as ec_commands import cros_ec_python.commands as ec_commands
import cros_ec_python.exceptions as ec_exceptions import cros_ec_python.exceptions as ec_exceptions

View File

@@ -18,8 +18,7 @@
# #
# SPDX-License-Identifier: GPL-2.0-or-later # SPDX-License-Identifier: GPL-2.0-or-later
from gi.repository import Adw from gi.repository import Gtk, Adw, GLib
from gi.repository import Gtk
import cros_ec_python.commands as ec_commands import cros_ec_python.commands as ec_commands
import cros_ec_python.exceptions as ec_exceptions import cros_ec_python.exceptions as ec_exceptions

View File

@@ -18,15 +18,16 @@
# #
# SPDX-License-Identifier: GPL-2.0-or-later # SPDX-License-Identifier: GPL-2.0-or-later
import os
import sys import sys
import traceback import traceback
import threading
import gi import gi
from gi.repository import Gio
gi.require_version('Gtk', '4.0') gi.require_version('Gtk', '4.0')
gi.require_version('Adw', '1') gi.require_version('Adw', '1')
from gi.repository import Gtk, Gio, Adw from gi.repository import Gtk, Gio, Adw, GLib
from .window import YafiWindow from .window import YafiWindow
from .thermals import ThermalsPage from .thermals import ThermalsPage
from .leds import LedsPage from .leds import LedsPage
@@ -66,6 +67,12 @@ class YafiApplication(Adw.Application):
if not self.win: if not self.win:
self.win = YafiWindow(application=self) self.win = YafiWindow(application=self)
# Update the splash screen
splash = getattr(sys, 'frozen', False) and '_PYI_SPLASH_IPC' in os.environ
if splash:
import pyi_splash
pyi_splash.update_text("Detecting EC")
try: try:
self.cros_ec = get_cros_ec() self.cros_ec = get_cros_ec()
pass pass
@@ -81,9 +88,16 @@ class YafiApplication(Adw.Application):
+ "If you are using a Framework Laptop, there are additional troubleshooting steps in the README." + "If you are using a Framework Laptop, there are additional troubleshooting steps in the README."
) )
self.show_error("EC Initalisation Error", message) self.show_error("EC Initalisation Error", message)
if splash:
pyi_splash.close()
self.win.present() self.win.present()
return return
if splash:
pyi_splash.update_text("Building Interface")
self.change_page(self.win.content, ThermalsPage()) self.change_page(self.win.content, ThermalsPage())
pages = ( pages = (
@@ -111,6 +125,9 @@ class YafiApplication(Adw.Application):
self.win.navbar.connect("row-activated", lambda box, row: switch_page(row.get_index())) self.win.navbar.connect("row-activated", lambda box, row: switch_page(row.get_index()))
if splash:
pyi_splash.close()
self.win.present() self.win.present()
def on_about_action(self, *args): def on_about_action(self, *args):
@@ -121,9 +138,8 @@ class YafiApplication(Adw.Application):
comments="YAFI is another GUI for the Framework Laptop Embedded Controller.\n" comments="YAFI is another GUI for the Framework Laptop Embedded Controller.\n"
+ "It is written in Python with a GTK3 theme, and uses the `CrOS_EC_Python` library to communicate with the EC.", + "It is written in Python with a GTK3 theme, and uses the `CrOS_EC_Python` library to communicate with the EC.",
copyright="© 2025 Stephen Horvath", copyright="© 2025 Stephen Horvath",
debug_info=self.generate_debug_info(),
developer_name="Stephen Horvath", developer_name="Stephen Horvath",
developers=["Stephen Horvath"], developers=["Stephen Horvath https://github.com/Steve-Tech"],
issue_url="https://github.com/Steve-Tech/YAFI/issues", issue_url="https://github.com/Steve-Tech/YAFI/issues",
license_type=Gtk.License.GPL_2_0, license_type=Gtk.License.GPL_2_0,
version="0.5", version="0.5",
@@ -132,6 +148,11 @@ class YafiApplication(Adw.Application):
about.add_acknowledgement_section(None, ["Framework Computer Inc. https://frame.work/"]) about.add_acknowledgement_section(None, ["Framework Computer Inc. https://frame.work/"])
about.present(self.props.active_window) about.present(self.props.active_window)
if hasattr(self, 'debug_info'):
about.set_debug_info(self.debug_info)
else:
threading.Thread(target=lambda: GLib.idle_add(about.set_debug_info, self.generate_debug_info())).start()
def show_error(self, heading, message): def show_error(self, heading, message):
dialog = Adw.AlertDialog(heading=heading, body=message) dialog = Adw.AlertDialog(heading=heading, body=message)
dialog.add_response("exit", "Exit") dialog.add_response("exit", "Exit")
@@ -179,6 +200,8 @@ class YafiApplication(Adw.Application):
info += f"Model: {f.read().strip()}\n" info += f"Model: {f.read().strip()}\n"
with open('/sys/devices/virtual/dmi/id/product_sku', 'r') as f: with open('/sys/devices/virtual/dmi/id/product_sku', 'r') as f:
info += f"SKU: {f.read().strip()}\n" info += f"SKU: {f.read().strip()}\n"
with open('/sys/devices/virtual/dmi/id/board_name', 'r') as f:
info += f"Board: {f.read().strip()}\n"
with open('/sys/devices/virtual/dmi/id/bios_vendor', 'r') as f: with open('/sys/devices/virtual/dmi/id/bios_vendor', 'r') as f:
info += f"BIOS Vendor: {f.read().strip()}\n" info += f"BIOS Vendor: {f.read().strip()}\n"
with open('/sys/devices/virtual/dmi/id/bios_version', 'r') as f: with open('/sys/devices/virtual/dmi/id/bios_version', 'r') as f:
@@ -190,10 +213,12 @@ class YafiApplication(Adw.Application):
ps_cmd = ( ps_cmd = (
"powershell -Command " "powershell -Command "
"\"$cs = Get-CimInstance -ClassName Win32_ComputerSystem; " "\"$cs = Get-CimInstance -ClassName Win32_ComputerSystem; "
"$board = Get-CimInstance -ClassName Win32_BaseBoard; "
"$bios = Get-CimInstance -ClassName Win32_BIOS; " "$bios = Get-CimInstance -ClassName Win32_BIOS; "
"Write-Output $cs.Manufacturer; " "Write-Output $cs.Manufacturer; "
"Write-Output $cs.Model; " "Write-Output $cs.Model; "
"Write-Output $cs.SystemSKUNumber; " "Write-Output $cs.SystemSKUNumber; "
"Write-Output $board.Product; "
"Write-Output $bios.Manufacturer; " "Write-Output $bios.Manufacturer; "
"Write-Output $bios.Name; " "Write-Output $bios.Name; "
"Write-Output $bios.ReleaseDate\"" "Write-Output $bios.ReleaseDate\""
@@ -202,10 +227,11 @@ class YafiApplication(Adw.Application):
info += f"Manufacturer: {output[0]}\n" info += f"Manufacturer: {output[0]}\n"
info += f"Model: {output[1]}\n" info += f"Model: {output[1]}\n"
info += f"SKU: {output[2]}\n" info += f"SKU: {output[2]}\n"
info += f"BIOS Vendor: {output[3]}\n" info += f"Board: {output[3]}\n"
info += f"BIOS Version: {output[4]}\n" info += f"BIOS Vendor: {output[4]}\n"
info += f"BIOS Version: {output[5]}\n"
# Blank line in the output for some reason # Blank line in the output for some reason
info += f"BIOS Date: {output[6]}\n" info += f"BIOS Date: {output[7]}\n"
except Exception as e: except Exception as e:
info += f"System Info Error: {type(e).__name__}: {e}\n" info += f"System Info Error: {type(e).__name__}: {e}\n"

View File

@@ -18,9 +18,7 @@
# #
# SPDX-License-Identifier: GPL-2.0-or-later # SPDX-License-Identifier: GPL-2.0-or-later
from gi.repository import Adw from gi.repository import Gtk, Adw, GLib
from gi.repository import Gtk
from gi.repository import GLib
import cros_ec_python.commands as ec_commands import cros_ec_python.commands as ec_commands
import cros_ec_python.exceptions as ec_exceptions import cros_ec_python.exceptions as ec_exceptions

View File

@@ -18,8 +18,7 @@
# #
# SPDX-License-Identifier: GPL-2.0-or-later # SPDX-License-Identifier: GPL-2.0-or-later
from gi.repository import Adw from gi.repository import Gtk, Adw
from gi.repository import Gtk
@Gtk.Template(resource_path='/au/stevetech/yafi/ui/yafi.ui') @Gtk.Template(resource_path='/au/stevetech/yafi/ui/yafi.ui')
class YafiWindow(Adw.ApplicationWindow): class YafiWindow(Adw.ApplicationWindow):

Binary file not shown.