12 Commits
0.4 ... 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
Stephen Horvath
8fcb2098cb Release 0.5 2025-09-16 11:26:31 +10:00
Stephen Horvath
3c55f8fdd6 Hide the minimum charge limiter 2025-09-16 11:20:13 +10:00
Stephen Horvath
b5dfa93dcf Update PawnIO Module 2025-09-13 18:36:51 +10:00
Stephen Horvath
154be557ed Add traceback to troubleshooting information 2025-09-12 10:52:02 +10:00
Stephen Horvath
624fed2c71 Round scaling instead of flooring 2025-09-09 17:39:53 +10:00
Stephen Horvath
f50a11deaa Disable unsupported advanced led controls 2025-09-08 19:02:41 +10:00
24 changed files with 790 additions and 141 deletions

View File

@@ -13,7 +13,7 @@ jobs:
- name: Install System Dependencies
uses: awalsh128/cache-apt-pkgs-action@latest
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
- name: Install PyInstaller
run: pip install pyinstaller
@@ -21,7 +21,7 @@ jobs:
run: pip install .
- name: Build with PyInstaller
# 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
- name: Upload PyInstaller Artifact
uses: actions/upload-artifact@v4

View File

@@ -23,7 +23,7 @@ jobs:
- name: Download GTK4 Gvsbuild zip
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
if: steps.cache-gtk4.outputs.cache-hit != 'true'
@@ -41,12 +41,22 @@ jobs:
- name: Build YAFI via Pip
run: pip install .
- name: Build with PyInstaller
- name: Build with PyInstaller (ZIP)
run: python -m PyInstaller yafi.spec
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
with:
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>
<summary>YAFI is another GUI for the Framework Laptop Embedded Controller</summary>
<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>
<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 -->
<!-- <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 -->
<!-- <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 -->
<!-- <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 -->
@@ -48,36 +48,29 @@
<screenshots>
<screenshot type="default">
<image>https://github.com/Steve-Tech/YAFI/blob/main/docs/1-thermal.png</image>
<caption>The Thermal page</caption>
<image>https://github.com/Steve-Tech/YAFI/blob/main/docs/1-thermals.png</image>
<caption>Fan Control and Temperature Monitoring</caption>
</screenshot>
<screenshot>
<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>
<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>
<image>https://github.com/Steve-Tech/YAFI/blob/main/docs/4-hardware.png</image>
<caption>The Hardware page</caption>
<image>https://github.com/Steve-Tech/YAFI/blob/main/docs/4-battery-limit.png</image>
<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>
</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>

View File

@@ -1,36 +1,92 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="512.000000pt" height="512.000000pt" viewBox="0 0 512.000000 512.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.11, written by Peter Selinger 2001-2013
</metadata>
<g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M1755 4883 c-120 -22 -418 -180 -609 -322 -118 -89 -148 -118 -177
-177 -23 -48 -24 -57 -27 -314 -1 -146 -7 -294 -13 -330 -18 -110 -78 -222
-163 -303 -46 -43 -69 -58 -305 -197 -191 -112 -222 -139 -257 -214 -33 -73
-39 -145 -39 -461 0 -297 5 -360 33 -440 25 -73 77 -118 257 -224 88 -51 187
-111 220 -132 123 -79 192 -169 245 -319 8 -21 14 -110 16 -230 8 -403 9 -423
29 -460 32 -61 56 -88 134 -148 234 -181 550 -347 676 -356 75 -5 116 12 306
125 181 108 307 175 330 176 8 1 35 5 61 11 70 14 174 5 251 -23 38 -13 164
-81 281 -149 286 -168 312 -173 494 -90 41 19 75 34 77 34 4 0 201 110 243
135 45 27 147 100 213 153 51 40 83 75 104 113 l30 54 6 310 c5 280 8 315 27
365 58 156 137 245 295 336 246 140 346 205 376 243 35 44 60 106 67 166 2 22
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>
<?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"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs1" /><g
id="layer1"><g
id="icon"><g
id="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" /><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" /><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" /><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" /><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" /><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" /><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" /><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"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="512.000000pt" height="512.000000pt" viewBox="0 0 512.000000 512.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.11, written by Peter Selinger 2001-2013
</metadata>
<g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M1755 4883 c-120 -22 -418 -180 -609 -322 -118 -89 -148 -118 -177
-177 -23 -48 -24 -57 -27 -314 -1 -146 -7 -294 -13 -330 -18 -110 -78 -222
-163 -303 -46 -43 -69 -58 -305 -197 -191 -112 -222 -139 -257 -214 -33 -73
-39 -145 -39 -461 0 -297 5 -360 33 -440 25 -73 77 -118 257 -224 88 -51 187
-111 220 -132 123 -79 192 -169 245 -319 8 -21 14 -110 16 -230 8 -403 9 -423
29 -460 32 -61 56 -88 134 -148 234 -181 550 -347 676 -356 75 -5 116 12 306
125 181 108 307 175 330 176 8 1 35 5 61 11 70 14 174 5 251 -23 38 -13 164
-81 281 -149 286 -168 312 -173 494 -90 41 19 75 34 77 34 4 0 201 110 243
135 45 27 147 100 213 153 51 40 83 75 104 113 l30 54 6 310 c5 280 8 315 27
365 58 156 137 245 295 336 246 140 346 205 376 243 35 44 60 106 67 166 2 22
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>
<?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"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs1" /><g
id="layer1"><g
id="icon"><path
id="cog"
style="display:inline;fill:#000000;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:#000000;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: 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',
version: '0.1.0',
version: '0.5',
meson_version: '>= 1.0.0',
default_options: [ 'warning_level=2', 'werror=false', ],
)

Binary file not shown.

View File

@@ -2,7 +2,7 @@ import os
if os.name == 'nt' and os.environ.get('GDK_SCALE') is None:
import ctypes
scale_factor = ctypes.windll.shcore.GetScaleFactorForDevice(0)
os.environ["GDK_SCALE"] = f"{scale_factor//100}"
os.environ["GDK_SCALE"] = f"{round(scale_factor, -2)//100}"
from yafi import main
main()

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 -*-
from PyInstaller.utils.hooks import collect_data_files
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 += collect_data_files('yafi')
a = Analysis(
['entrypoint.py'],
pathex=[],
@@ -21,12 +25,34 @@ a = Analysis(
)
pyz = PYZ(a.pure)
if options.onefile:
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.binaries,
a.datas,
splash,
splash.binaries,
]
if options.onefile
else [a.scripts]
)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.datas,
[],
*exe_args,
exclude_binaries=not options.onefile,
name='YAFI',
debug=False,
bootloader_ignore_signals=False,
@@ -42,3 +68,14 @@ exe = EXE(
entitlements_file=None,
icon=['yafi.ico'],
)
if not options.onefile:
coll = COLLECT(
exe,
a.binaries,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='YAFI',
)

View File

@@ -1,6 +1,6 @@
[project]
name = "yafi"
version = "0.4"
version = "0.5"
authors = [
{ name="Steve-Tech" }
]

View File

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

View File

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

View File

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

View File

@@ -18,8 +18,7 @@
#
# SPDX-License-Identifier: GPL-2.0-or-later
from gi.repository import Adw
from gi.repository import Gtk
from gi.repository import Gtk, Adw, GLib
import cros_ec_python.commands as ec_commands
import cros_ec_python.exceptions as ec_exceptions
@@ -104,9 +103,12 @@ class LedsPage(Gtk.Box):
if supported_colours[i]:
strings.append(colour)
add_colours(
led_pwr_colour_strings, ec_commands.leds.EcLedId.EC_LED_ID_POWER_LED
)
try:
add_colours(
led_pwr_colour_strings, ec_commands.leds.EcLedId.EC_LED_ID_POWER_LED
)
except ec_exceptions.ECError as e:
self.led_pwr_colour.set_sensitive(False)
def handle_led_colour(combobox, led_id):
colour = combobox.get_selected() - 2
@@ -141,10 +143,13 @@ class LedsPage(Gtk.Box):
# Advanced: Charging LED
led_chg_colour_strings = self.led_chg_colour.get_model()
add_colours(
led_chg_colour_strings,
ec_commands.leds.EcLedId.EC_LED_ID_BATTERY_LED,
)
try:
add_colours(
led_chg_colour_strings,
ec_commands.leds.EcLedId.EC_LED_ID_BATTERY_LED,
)
except ec_exceptions.ECError as e:
self.led_chg_colour.set_sensitive(False)
self.led_chg_colour.connect(
"notify::selected",

View File

@@ -18,15 +18,16 @@
#
# SPDX-License-Identifier: GPL-2.0-or-later
import os
import sys
import traceback
import threading
import gi
from gi.repository import Gio
gi.require_version('Gtk', '4.0')
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 .thermals import ThermalsPage
from .leds import LedsPage
@@ -66,6 +67,12 @@ class YafiApplication(Adw.Application):
if not self.win:
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:
self.cros_ec = get_cros_ec()
pass
@@ -81,9 +88,16 @@ class YafiApplication(Adw.Application):
+ "If you are using a Framework Laptop, there are additional troubleshooting steps in the README."
)
self.show_error("EC Initalisation Error", message)
if splash:
pyi_splash.close()
self.win.present()
return
if splash:
pyi_splash.update_text("Building Interface")
self.change_page(self.win.content, ThermalsPage())
pages = (
@@ -111,6 +125,9 @@ class YafiApplication(Adw.Application):
self.win.navbar.connect("row-activated", lambda box, row: switch_page(row.get_index()))
if splash:
pyi_splash.close()
self.win.present()
def on_about_action(self, *args):
@@ -121,17 +138,21 @@ class YafiApplication(Adw.Application):
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.",
copyright="© 2025 Stephen Horvath",
debug_info=self.generate_debug_info(),
developer_name="Stephen Horvath",
developers=["Stephen Horvath"],
developers=["Stephen Horvath https://github.com/Steve-Tech"],
issue_url="https://github.com/Steve-Tech/YAFI/issues",
license_type=Gtk.License.GPL_2_0,
version="0.4",
version="0.5",
website="https://github.com/Steve-Tech/YAFI",
)
about.add_acknowledgement_section(None, ["Framework Computer Inc. https://frame.work/"])
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):
dialog = Adw.AlertDialog(heading=heading, body=message)
dialog.add_response("exit", "Exit")
@@ -149,6 +170,8 @@ class YafiApplication(Adw.Application):
if hasattr(self, 'error'):
if isinstance(self.error, Exception):
info += f"{type(self.error).__name__}: {self.error}\n\n"
info += ''.join(traceback.format_exception(type(self.error), self.error, self.error.__traceback__))
info += "\n\n"
else:
info += f"Error: {self.error}\n\n"
@@ -177,6 +200,8 @@ class YafiApplication(Adw.Application):
info += f"Model: {f.read().strip()}\n"
with open('/sys/devices/virtual/dmi/id/product_sku', 'r') as f:
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:
info += f"BIOS Vendor: {f.read().strip()}\n"
with open('/sys/devices/virtual/dmi/id/bios_version', 'r') as f:
@@ -188,10 +213,12 @@ class YafiApplication(Adw.Application):
ps_cmd = (
"powershell -Command "
"\"$cs = Get-CimInstance -ClassName Win32_ComputerSystem; "
"$board = Get-CimInstance -ClassName Win32_BaseBoard; "
"$bios = Get-CimInstance -ClassName Win32_BIOS; "
"Write-Output $cs.Manufacturer; "
"Write-Output $cs.Model; "
"Write-Output $cs.SystemSKUNumber; "
"Write-Output $board.Product; "
"Write-Output $bios.Manufacturer; "
"Write-Output $bios.Name; "
"Write-Output $bios.ReleaseDate\""
@@ -200,10 +227,11 @@ class YafiApplication(Adw.Application):
info += f"Manufacturer: {output[0]}\n"
info += f"Model: {output[1]}\n"
info += f"SKU: {output[2]}\n"
info += f"BIOS Vendor: {output[3]}\n"
info += f"BIOS Version: {output[4]}\n"
info += f"Board: {output[3]}\n"
info += f"BIOS Vendor: {output[4]}\n"
info += f"BIOS Version: {output[5]}\n"
# 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:
info += f"System Info Error: {type(e).__name__}: {e}\n"

View File

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

View File

@@ -56,6 +56,7 @@
<property name="sensitive">False</property>
<property name="subtitle">Limit the minimum charge</property>
<property name="title">Discharge Limit</property>
<property name="visible">False</property>
<child>
<object class="GtkBox">
<child>

View File

@@ -5,7 +5,7 @@
<ui template-class="YafiWindow" filename="yafi.ui" sha256="9d1b2f030e4a816eb0b1aa53ae1d80c5b50a2f4646e32c7a64803eb6f6ed3947"/>
<ui template-class="ThermalsPage" filename="thermals.ui" sha256="e301e65649005315ff60d250b60a47f6250ad6feb27db104051fcf0143cde173"/>
<ui template-class="LedsPage" filename="leds.ui" sha256="0350d22d570de039d63602ba40925f17fff6680fd5909d2ebf19600f351eb0f2"/>
<ui template-class="BatteryLimiterPage" filename="battery-limiter.ui" sha256="656384cbc7dbfc0f2fd85b3f8c2d5e35066ec3368c5f464c31c8b82c5da334de"/>
<ui template-class="BatteryLimiterPage" filename="battery-limiter.ui" sha256="b5d41b19cb1fb7ca5b4bcfae43244e54111f5e8d8c51d95448d6a92b5185d2c4"/>
<ui template-class="HardwarePage" filename="hardware.ui" sha256="f4deec4e38e683fde97656802dbfb2a638ab46a0e36af5c9a37f277f49e2aabb"/>
<ui template-class="BatteryPage" filename="battery.ui" sha256="d495280cb543a26cdee1c2939e5af980d8d3878c326e360eeab4f05195cdbdc9"/>
</cambalache-project>

View File

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

Binary file not shown.