add status flag

This commit is contained in:
codetypes committed 2024-07-16 10:14:12 +08:00
1 parent 9cde17e2e7
commit 59def65878
12 files changed
+547 -2

No files matched your search

+40
View File
@@ -0,0 +1,40 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="none" x="0px" y="0px" width="64px" height="64px" viewBox="0 0 64 64">
<defs>
<g id="Layer0_0_MEMBER_0_MEMBER_0_MEMBER_0_FILL">
<path fill="#000000" stroke="none" d="
M 38.4 48.65
Q 35.7 46 32 46 28.35 46 25.6 48.65 23 51.35 23 55 23 58.85 25.6 61.35 28.25 64 32 64 35.75 64 38.4 61.35 41 58.75 41 55 41 51.4 38.4 48.65
M 35.5 58.6
Q 34.1 60 32 60 29.95 60 28.45 58.6 27 57.15 27 55 27 52.9 28.45 51.45 30 50 32 50 34.05 50 35.5 51.45 37 52.95 37 55 37 57.1 35.5 58.6 Z"/>
</g>
<g id="Layer0_1_MEMBER_0_MEMBER_0_MEMBER_0_FILL">
<path fill="#000000" stroke="none" d="
M 25.6 25.7
Q 23 28.3 23 32 23 35.8 25.6 38.4 28.3 41 32 41 35.75 41 38.4 38.4 41 35.75 41 32 41 28.4 38.4 25.7 35.7 23 32 23 28.3 23 25.6 25.7
M 32 27
Q 34.1 27 35.5 28.5 37 30 37 32 37 34.15 35.5 35.55 34.1 37 32 37 29.9 37 28.45 35.55 27 34.15 27 32 27 29.95 28.45 28.5 29.95 27 32 27 Z"/>
</g>
<g id="Layer0_2_MEMBER_0_MEMBER_0_MEMBER_0_FILL">
<path fill="#000000" stroke="none" d="
M 38.4 2.7
Q 35.7 0 32 0 28.3 0 25.6 2.7 23 5.3 23 9 23 12.85 25.6 15.35 28.25 18 32 18 35.75 18 38.4 15.35 41 12.75 41 9 41 5.4 38.4 2.7
M 35.5 5.5
Q 37 7 37 9 37 11.15 35.5 12.55 34.1 14 32 14 29.9 14 28.45 12.55 27 11.15 27 9 27 6.95 28.45 5.5 29.95 4 32 4 34.1 4 35.5 5.5 Z"/>
</g>
</defs>
<g transform="matrix( 1, 0, 0, 1, 1,0) ">
<use xlink:href="#Layer0_0_MEMBER_0_MEMBER_0_MEMBER_0_FILL"/>
</g>
<g transform="matrix( 1, 0, 0, 1, 1,0) ">
<use xlink:href="#Layer0_1_MEMBER_0_MEMBER_0_MEMBER_0_FILL"/>
</g>
<g transform="matrix( 1, 0, 0, 1, 1,0) ">
<use xlink:href="#Layer0_2_MEMBER_0_MEMBER_0_MEMBER_0_FILL"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

+50
View File
@@ -0,0 +1,50 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="none" x="0px" y="0px" width="64px" height="64px" viewBox="0 0 64 64">
<defs>
<g id="Layer0_0_FILL">
<path fill="#000000" stroke="none" d="
M 13.95 27.05
Q 11.9 25 9 25 6.1 25 4.05 27.05 2 29.1 2 32 2 34.95 4.05 36.95 6.1 39 9 39 11.9 39 13.95 36.95 16 34.9 16 32 16 29.1 13.95 27.05 Z"/>
</g>
<g id="Layer0_1_FILL">
<path fill="#000000" stroke="none" d="
M 18 32
Q 18 28.3 15.35 25.65 12.7 23 9 23 5.25 23 2.65 25.65 0 28.3 0 32 0 35.75 2.65 38.4 5.25 41 9 41 12.7 41 15.35 38.4 18 35.75 18 32
M 14 32
Q 14 34.1 12.55 35.55 11.05 37 9 37 6.9 37 5.45 35.55 4 34.1 4 32 4 29.95 5.45 28.45 6.9 27 9 27 11.05 27 12.55 28.45 14 29.95 14 32 Z"/>
</g>
<g id="Layer0_2_FILL">
<path fill="#000000" stroke="none" d="
M 25.65 25.65
Q 23 28.3 23 32 23 35.75 25.65 38.4 28.25 41 32 41 35.7 41 38.35 38.4 41 35.75 41 32 41 28.3 38.35 25.65 35.7 23 32 23 28.25 23 25.65 25.65
M 35.55 35.55
Q 34.05 37 32 37 29.9 37 28.45 35.55 27 34.1 27 32 27 29.95 28.45 28.45 29.9 27 32 27 34.05 27 35.55 28.45 37 29.95 37 32 37 34.1 35.55 35.55 Z"/>
</g>
<g id="Layer0_3_FILL">
<path fill="#000000" stroke="none" d="
M 48.65 25.65
Q 46 28.3 46 32 46 35.75 48.65 38.4 51.25 41 55 41 58.7 41 61.35 38.4 64 35.75 64 32 64 28.3 61.35 25.65 58.7 23 55 23 51.25 23 48.65 25.65
M 51.45 28.45
Q 52.9 27 55 27 57.05 27 58.55 28.45 60 29.95 60 32 60 34.1 58.55 35.55 57.05 37 55 37 52.9 37 51.45 35.55 50 34.1 50 32 50 29.95 51.45 28.45 Z"/>
</g>
</defs>
<g transform="matrix( 0, -1, 1, 0, 0,64) ">
<use xlink:href="#Layer0_0_FILL"/>
</g>
<g transform="matrix( 0, -1, 1, 0, 0,64) ">
<use xlink:href="#Layer0_1_FILL"/>
</g>
<g transform="matrix( 0, -1, 1, 0, 0,64) ">
<use xlink:href="#Layer0_2_FILL"/>
</g>
<g transform="matrix( 0, -1, 1, 0, 0,64) ">
<use xlink:href="#Layer0_3_FILL"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

+50
View File
@@ -0,0 +1,50 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="none" x="0px" y="0px" width="64px" height="64px" viewBox="0 0 64 64">
<defs>
<g id="Layer0_0_FILL">
<path fill="#000000" stroke="none" d="
M 18 32
Q 18 28.3 15.35 25.65 12.7 23 9 23 5.25 23 2.65 25.65 0 28.3 0 32 0 35.75 2.65 38.4 5.25 41 9 41 12.7 41 15.35 38.4 18 35.75 18 32
M 14 32
Q 14 34.1 12.55 35.55 11.05 37 9 37 6.9 37 5.45 35.55 4 34.1 4 32 4 29.95 5.45 28.45 6.9 27 9 27 11.05 27 12.55 28.45 14 29.95 14 32 Z"/>
</g>
<g id="Layer0_1_FILL">
<path fill="#000000" stroke="none" d="
M 36.95 27.05
Q 34.9 25 32 25 29.1 25 27.05 27.05 25 29.1 25 32 25 34.95 27.05 36.95 29.1 39 32 39 34.9 39 36.95 36.95 39 34.9 39 32 39 29.1 36.95 27.05 Z"/>
</g>
<g id="Layer0_2_FILL">
<path fill="#000000" stroke="none" d="
M 25.65 25.65
Q 23 28.3 23 32 23 35.75 25.65 38.4 28.25 41 32 41 35.7 41 38.35 38.4 41 35.75 41 32 41 28.3 38.35 25.65 35.7 23 32 23 28.25 23 25.65 25.65
M 35.55 35.55
Q 34.05 37 32 37 29.9 37 28.45 35.55 27 34.1 27 32 27 29.95 28.45 28.45 29.9 27 32 27 34.05 27 35.55 28.45 37 29.95 37 32 37 34.1 35.55 35.55 Z"/>
</g>
<g id="Layer0_3_FILL">
<path fill="#000000" stroke="none" d="
M 48.65 25.65
Q 46 28.3 46 32 46 35.75 48.65 38.4 51.25 41 55 41 58.7 41 61.35 38.4 64 35.75 64 32 64 28.3 61.35 25.65 58.7 23 55 23 51.25 23 48.65 25.65
M 51.45 28.45
Q 52.9 27 55 27 57.05 27 58.55 28.45 60 29.95 60 32 60 34.1 58.55 35.55 57.05 37 55 37 52.9 37 51.45 35.55 50 34.1 50 32 50 29.95 51.45 28.45 Z"/>
</g>
</defs>
<g transform="matrix( 0, -1, 1, 0, 0,64) ">
<use xlink:href="#Layer0_0_FILL"/>
</g>
<g transform="matrix( 0, -1, 1, 0, 0,64) ">
<use xlink:href="#Layer0_1_FILL"/>
</g>
<g transform="matrix( 0, -1, 1, 0, 0,64) ">
<use xlink:href="#Layer0_2_FILL"/>
</g>
<g transform="matrix( 0, -1, 1, 0, 0,64) ">
<use xlink:href="#Layer0_3_FILL"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+60
View File
@@ -0,0 +1,60 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="none" x="0px" y="0px" width="64px" height="64px" viewBox="0 0 64 64">
<defs>
<g id="Layer0_0_FILL">
<path fill="#000000" stroke="none" d="
M 13.95 27.05
Q 11.9 25 9 25 6.1 25 4.05 27.05 2 29.1 2 32 2 34.95 4.05 36.95 6.1 39 9 39 11.9 39 13.95 36.95 16 34.9 16 32 16 29.1 13.95 27.05 Z"/>
</g>
<g id="Layer0_1_FILL">
<path fill="#000000" stroke="none" d="
M 18 32
Q 18 28.3 15.35 25.65 12.7 23 9 23 5.25 23 2.65 25.65 0 28.3 0 32 0 35.75 2.65 38.4 5.25 41 9 41 12.7 41 15.35 38.4 18 35.75 18 32
M 14 32
Q 14 34.1 12.55 35.55 11.05 37 9 37 6.9 37 5.45 35.55 4 34.1 4 32 4 29.95 5.45 28.45 6.9 27 9 27 11.05 27 12.55 28.45 14 29.95 14 32 Z"/>
</g>
<g id="Layer0_2_FILL">
<path fill="#000000" stroke="none" d="
M 36.95 27.05
Q 34.9 25 32 25 29.1 25 27.05 27.05 25 29.1 25 32 25 34.95 27.05 36.95 29.1 39 32 39 34.9 39 36.95 36.95 39 34.9 39 32 39 29.1 36.95 27.05 Z"/>
</g>
<g id="Layer0_3_FILL">
<path fill="#000000" stroke="none" d="
M 25.65 25.65
Q 23 28.3 23 32 23 35.75 25.65 38.4 28.25 41 32 41 35.7 41 38.35 38.4 41 35.75 41 32 41 28.3 38.35 25.65 35.7 23 32 23 28.25 23 25.65 25.65
M 35.55 35.55
Q 34.05 37 32 37 29.9 37 28.45 35.55 27 34.1 27 32 27 29.95 28.45 28.45 29.9 27 32 27 34.05 27 35.55 28.45 37 29.95 37 32 37 34.1 35.55 35.55 Z"/>
</g>
<g id="Layer0_4_FILL">
<path fill="#000000" stroke="none" d="
M 48.65 25.65
Q 46 28.3 46 32 46 35.75 48.65 38.4 51.25 41 55 41 58.7 41 61.35 38.4 64 35.75 64 32 64 28.3 61.35 25.65 58.7 23 55 23 51.25 23 48.65 25.65
M 51.45 28.45
Q 52.9 27 55 27 57.05 27 58.55 28.45 60 29.95 60 32 60 34.1 58.55 35.55 57.05 37 55 37 52.9 37 51.45 35.55 50 34.1 50 32 50 29.95 51.45 28.45 Z"/>
</g>
</defs>
<g transform="matrix( 0, -1, 1, 0, 0,64) ">
<use xlink:href="#Layer0_0_FILL"/>
</g>
<g transform="matrix( 0, -1, 1, 0, 0,64) ">
<use xlink:href="#Layer0_1_FILL"/>
</g>
<g transform="matrix( 0, -1, 1, 0, 0,64) ">
<use xlink:href="#Layer0_2_FILL"/>
</g>
<g transform="matrix( 0, -1, 1, 0, 0,64) ">
<use xlink:href="#Layer0_3_FILL"/>
</g>
<g transform="matrix( 0, -1, 1, 0, 0,64) ">
<use xlink:href="#Layer0_4_FILL"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

+50
View File
@@ -0,0 +1,50 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="none" x="0px" y="0px" width="64px" height="64px" viewBox="0 0 64 64">
<defs>
<g id="Layer0_0_FILL">
<path fill="#000000" stroke="none" d="
M 18 32
Q 18 28.3 15.35 25.65 12.7 23 9 23 5.25 23 2.65 25.65 0 28.3 0 32 0 35.75 2.65 38.4 5.25 41 9 41 12.7 41 15.35 38.4 18 35.75 18 32
M 14 32
Q 14 34.1 12.55 35.55 11.05 37 9 37 6.9 37 5.45 35.55 4 34.1 4 32 4 29.95 5.45 28.45 6.9 27 9 27 11.05 27 12.55 28.45 14 29.95 14 32 Z"/>
</g>
<g id="Layer0_1_FILL">
<path fill="#000000" stroke="none" d="
M 25.65 25.65
Q 23 28.3 23 32 23 35.75 25.65 38.4 28.25 41 32 41 35.7 41 38.35 38.4 41 35.75 41 32 41 28.3 38.35 25.65 35.7 23 32 23 28.25 23 25.65 25.65
M 35.55 35.55
Q 34.05 37 32 37 29.9 37 28.45 35.55 27 34.1 27 32 27 29.95 28.45 28.45 29.9 27 32 27 34.05 27 35.55 28.45 37 29.95 37 32 37 34.1 35.55 35.55 Z"/>
</g>
<g id="Layer0_2_FILL">
<path fill="#000000" stroke="none" d="
M 59.95 27.05
Q 57.9 25 55 25 52.1 25 50.05 27.05 48 29.1 48 32 48 34.95 50.05 36.95 52.1 39 55 39 57.9 39 59.95 36.95 62 34.9 62 32 62 29.1 59.95 27.05 Z"/>
</g>
<g id="Layer0_3_FILL">
<path fill="#000000" stroke="none" d="
M 48.65 25.65
Q 46 28.3 46 32 46 35.75 48.65 38.4 51.25 41 55 41 58.7 41 61.35 38.4 64 35.75 64 32 64 28.3 61.35 25.65 58.7 23 55 23 51.25 23 48.65 25.65
M 51.45 28.45
Q 52.9 27 55 27 57.05 27 58.55 28.45 60 29.95 60 32 60 34.1 58.55 35.55 57.05 37 55 37 52.9 37 51.45 35.55 50 34.1 50 32 50 29.95 51.45 28.45 Z"/>
</g>
</defs>
<g transform="matrix( 0, -1, 1, 0, 0,64) ">
<use xlink:href="#Layer0_0_FILL"/>
</g>
<g transform="matrix( 0, -1, 1, 0, 0,64) ">
<use xlink:href="#Layer0_1_FILL"/>
</g>
<g transform="matrix( 0, -1, 1, 0, 0,64) ">
<use xlink:href="#Layer0_2_FILL"/>
</g>
<g transform="matrix( 0, -1, 1, 0, 0,64) ">
<use xlink:href="#Layer0_3_FILL"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

+60
View File
@@ -0,0 +1,60 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="none" x="0px" y="0px" width="64px" height="64px" viewBox="0 0 64 64">
<defs>
<g id="Layer0_0_FILL">
<path fill="#000000" stroke="none" d="
M 13.95 36.95
Q 16 34.9 16 32 16 29.1 13.95 27.05 11.9 25 9 25 6.1 25 4.05 27.05 2 29.1 2 32 2 34.95 4.05 36.95 6.1 39 9 39 11.9 39 13.95 36.95 Z"/>
</g>
<g id="Layer0_1_FILL">
<path fill="#000000" stroke="none" d="
M 18 32
Q 18 28.3 15.35 25.65 12.7 23 9 23 5.25 23 2.65 25.65 0 28.3 0 32 0 35.75 2.65 38.4 5.25 41 9 41 12.7 41 15.35 38.4 18 35.75 18 32
M 12.55 28.45
Q 14 29.95 14 32 14 34.1 12.55 35.55 11.05 37 9 37 6.9 37 5.45 35.55 4 34.1 4 32 4 29.95 5.45 28.45 6.9 27 9 27 11.05 27 12.55 28.45 Z"/>
</g>
<g id="Layer0_2_FILL">
<path fill="#000000" stroke="none" d="
M 25.65 25.65
Q 23 28.3 23 32 23 35.75 25.65 38.4 28.25 41 32 41 35.7 41 38.35 38.4 41 35.75 41 32 41 28.3 38.35 25.65 35.7 23 32 23 28.25 23 25.65 25.65
M 35.55 28.45
Q 37 29.95 37 32 37 34.1 35.55 35.55 34.05 37 32 37 29.9 37 28.45 35.55 27 34.1 27 32 27 29.95 28.45 28.45 29.9 27 32 27 34.05 27 35.55 28.45 Z"/>
</g>
<g id="Layer0_3_FILL">
<path fill="#000000" stroke="none" d="
M 4.05 42.05
Q 2 44.1 2 47 2 49.9 4.05 51.95 6.1 54 9 54 11.9 54 13.95 51.95 16 49.9 16 47 16 44.05 13.95 42.05 11.9 40 9 40 6.1 40 4.05 42.05 Z"/>
</g>
<g id="Layer0_4_FILL">
<path fill="#000000" stroke="none" d="
M 9 38
Q 5.3 38 2.65 40.6 0 43.25 0 47 0 50.7 2.65 53.35 5.3 56 9 56 12.75 56 15.35 53.35 18 50.7 18 47 18 43.25 15.35 40.6 12.75 38 9 38
M 4 47
Q 4 44.9 5.45 43.45 6.95 42 9 42 11.1 42 12.55 43.45 14 44.9 14 47 14 49.05 12.55 50.55 11.1 52 9 52 6.95 52 5.45 50.55 4 49.05 4 47 Z"/>
</g>
</defs>
<g transform="matrix( 0, 1, -1, 0, 64,0.5) ">
<use xlink:href="#Layer0_0_FILL"/>
</g>
<g transform="matrix( 0, 1.0555572509765625, -1.0555572509765625, 0, 66.3,0.5) ">
<use xlink:href="#Layer0_1_FILL"/>
</g>
<g transform="matrix( 0, 1.0555572509765625, -1.0555572509765625, 0, 66.3,-1.8) ">
<use xlink:href="#Layer0_2_FILL"/>
</g>
<g transform="matrix( 0, -1, 1, 0, -15,63.5) ">
<use xlink:href="#Layer0_3_FILL"/>
</g>
<g transform="matrix( 0, -1.0555572509765625, 1.0555572509765625, 0, -17.1,63.5) ">
<use xlink:href="#Layer0_4_FILL"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

+60
View File
@@ -0,0 +1,60 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="none" x="0px" y="0px" width="64px" height="64px" viewBox="0 0 64 64">
<defs>
<g id="Layer0_0_FILL">
<path fill="#000000" stroke="none" d="
M 18 32
Q 18 28.3 15.35 25.65 12.7 23 9 23 5.25 23 2.65 25.65 0 28.3 0 32 0 35.75 2.65 38.4 5.25 41 9 41 12.7 41 15.35 38.4 18 35.75 18 32
M 14 32
Q 14 34.1 12.55 35.55 11.05 37 9 37 6.9 37 5.45 35.55 4 34.1 4 32 4 29.95 5.45 28.45 6.9 27 9 27 11.05 27 12.55 28.45 14 29.95 14 32 Z"/>
</g>
<g id="Layer0_1_FILL">
<path fill="#000000" stroke="none" d="
M 36.95 27.05
Q 34.9 25 32 25 29.1 25 27.05 27.05 25 29.1 25 32 25 34.95 27.05 36.95 29.1 39 32 39 34.9 39 36.95 36.95 39 34.9 39 32 39 29.1 36.95 27.05 Z"/>
</g>
<g id="Layer0_2_FILL">
<path fill="#000000" stroke="none" d="
M 25.65 25.65
Q 23 28.3 23 32 23 35.75 25.65 38.4 28.25 41 32 41 35.7 41 38.35 38.4 41 35.75 41 32 41 28.3 38.35 25.65 35.7 23 32 23 28.25 23 25.65 25.65
M 35.55 35.55
Q 34.05 37 32 37 29.9 37 28.45 35.55 27 34.1 27 32 27 29.95 28.45 28.45 29.9 27 32 27 34.05 27 35.55 28.45 37 29.95 37 32 37 34.1 35.55 35.55 Z"/>
</g>
<g id="Layer0_3_FILL">
<path fill="#000000" stroke="none" d="
M 59.95 27.05
Q 57.9 25 55 25 52.1 25 50.05 27.05 48 29.1 48 32 48 34.95 50.05 36.95 52.1 39 55 39 57.9 39 59.95 36.95 62 34.9 62 32 62 29.1 59.95 27.05 Z"/>
</g>
<g id="Layer0_4_FILL">
<path fill="#000000" stroke="none" d="
M 48.65 25.65
Q 46 28.3 46 32 46 35.75 48.65 38.4 51.25 41 55 41 58.7 41 61.35 38.4 64 35.75 64 32 64 28.3 61.35 25.65 58.7 23 55 23 51.25 23 48.65 25.65
M 51.45 28.45
Q 52.9 27 55 27 57.05 27 58.55 28.45 60 29.95 60 32 60 34.1 58.55 35.55 57.05 37 55 37 52.9 37 51.45 35.55 50 34.1 50 32 50 29.95 51.45 28.45 Z"/>
</g>
</defs>
<g transform="matrix( 0, -1, 1, 0, 0,64) ">
<use xlink:href="#Layer0_0_FILL"/>
</g>
<g transform="matrix( 0, -1, 1, 0, 0,64) ">
<use xlink:href="#Layer0_1_FILL"/>
</g>
<g transform="matrix( 0, -1, 1, 0, 0,64) ">
<use xlink:href="#Layer0_2_FILL"/>
</g>
<g transform="matrix( 0, -1, 1, 0, 0,64) ">
<use xlink:href="#Layer0_3_FILL"/>
</g>
<g transform="matrix( 0, -1, 1, 0, 0,64) ">
<use xlink:href="#Layer0_4_FILL"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

+70
View File
@@ -0,0 +1,70 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="none" x="0px" y="0px" width="64px" height="64px" viewBox="0 0 64 64">
<defs>
<g id="Layer0_0_FILL">
<path fill="#000000" stroke="none" d="
M 13.95 27.05
Q 11.9 25 9 25 6.1 25 4.05 27.05 2 29.1 2 32 2 34.95 4.05 36.95 6.1 39 9 39 11.9 39 13.95 36.95 16 34.9 16 32 16 29.1 13.95 27.05 Z"/>
</g>
<g id="Layer0_1_FILL">
<path fill="#000000" stroke="none" d="
M 18 32
Q 18 28.3 15.35 25.65 12.7 23 9 23 5.25 23 2.65 25.65 0 28.3 0 32 0 35.75 2.65 38.4 5.25 41 9 41 12.7 41 15.35 38.4 18 35.75 18 32
M 14 32
Q 14 34.1 12.55 35.55 11.05 37 9 37 6.9 37 5.45 35.55 4 34.1 4 32 4 29.95 5.45 28.45 6.9 27 9 27 11.05 27 12.55 28.45 14 29.95 14 32 Z"/>
</g>
<g id="Layer0_2_FILL">
<path fill="#000000" stroke="none" d="
M 36.95 27.05
Q 34.9 25 32 25 29.1 25 27.05 27.05 25 29.1 25 32 25 34.95 27.05 36.95 29.1 39 32 39 34.9 39 36.95 36.95 39 34.9 39 32 39 29.1 36.95 27.05 Z"/>
</g>
<g id="Layer0_3_FILL">
<path fill="#000000" stroke="none" d="
M 25.65 25.65
Q 23 28.3 23 32 23 35.75 25.65 38.4 28.25 41 32 41 35.7 41 38.35 38.4 41 35.75 41 32 41 28.3 38.35 25.65 35.7 23 32 23 28.25 23 25.65 25.65
M 35.55 35.55
Q 34.05 37 32 37 29.9 37 28.45 35.55 27 34.1 27 32 27 29.95 28.45 28.45 29.9 27 32 27 34.05 27 35.55 28.45 37 29.95 37 32 37 34.1 35.55 35.55 Z"/>
</g>
<g id="Layer0_4_FILL">
<path fill="#000000" stroke="none" d="
M 59.95 27.05
Q 57.9 25 55 25 52.1 25 50.05 27.05 48 29.1 48 32 48 34.95 50.05 36.95 52.1 39 55 39 57.9 39 59.95 36.95 62 34.9 62 32 62 29.1 59.95 27.05 Z"/>
</g>
<g id="Layer0_5_FILL">
<path fill="#000000" stroke="none" d="
M 48.65 25.65
Q 46 28.3 46 32 46 35.75 48.65 38.4 51.25 41 55 41 58.7 41 61.35 38.4 64 35.75 64 32 64 28.3 61.35 25.65 58.7 23 55 23 51.25 23 48.65 25.65
M 51.45 28.45
Q 52.9 27 55 27 57.05 27 58.55 28.45 60 29.95 60 32 60 34.1 58.55 35.55 57.05 37 55 37 52.9 37 51.45 35.55 50 34.1 50 32 50 29.95 51.45 28.45 Z"/>
</g>
</defs>
<g transform="matrix( 0, -1, 1, 0, 0,64) ">
<use xlink:href="#Layer0_0_FILL"/>
</g>
<g transform="matrix( 0, -1, 1, 0, 0,64) ">
<use xlink:href="#Layer0_1_FILL"/>
</g>
<g transform="matrix( 0, -1, 1, 0, 0,64) ">
<use xlink:href="#Layer0_2_FILL"/>
</g>
<g transform="matrix( 0, -1, 1, 0, 0,64) ">
<use xlink:href="#Layer0_3_FILL"/>
</g>
<g transform="matrix( 0, -1, 1, 0, 0,64) ">
<use xlink:href="#Layer0_4_FILL"/>
</g>
<g transform="matrix( 0, -1, 1, 0, 0,64) ">
<use xlink:href="#Layer0_5_FILL"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

+15 -2
View File
@@ -201,6 +201,19 @@ G6.registerNode(
name: "node-icon", name: "node-icon",
}); });
// status
const status = ((cfg.status || 0) as number).toString(2).padStart(3, "0");
addShape("image", {
attrs: {
x: 204,
y: 3,
height: 18,
width: 18,
img: `./icons/status${status}.svg`,
},
name: "status-icon",
});
// name text // name text
addShape("text", { addShape("text", {
attrs: { attrs: {
@@ -219,7 +232,7 @@ G6.registerNode(
if (cfg.debug) { if (cfg.debug) {
addShape("image", { addShape("image", {
attrs: { attrs: {
x: 200, x: 192,
y: 4, y: 4,
height: 16, height: 16,
width: 16, width: 16,
@@ -232,7 +245,7 @@ G6.registerNode(
if (cfg.disabled) { if (cfg.disabled) {
addShape("image", { addShape("image", {
attrs: { attrs: {
x: 200 - (cfg.debug ? 18 : 0), x: 200 - (cfg.debug ? 25 : 8),
y: 4, y: 4,
height: 16, height: 16,
width: 16, width: 16,
+5
View File
@@ -15,6 +15,9 @@ export interface NodeArg {
default?: unknown; default?: unknown;
options?: NodeArgOption[]; options?: NodeArgOption[];
} }
type Status = "success" | "running" | "failure";
export interface NodeDef { export interface NodeDef {
name: string; name: string;
type: NodeType; type: NodeType;
@@ -25,6 +28,7 @@ export interface NodeDef {
doc?: string; doc?: string;
color?: string; color?: string;
icon?: string; icon?: string;
status?: Exclude<`${Status}` | `!${Status}` | `?${Status}` | `&${Status}`, "!running">[];
} }
export interface NodeModel { export interface NodeModel {
@@ -65,6 +69,7 @@ export interface TreeGraphData extends G6TreeGraphData {
highlightInput?: boolean; highlightInput?: boolean;
highlightOutput?: boolean; highlightOutput?: boolean;
highlightGray?: boolean; highlightGray?: boolean;
status?: number;
} }
export const unknownNodeDef: NodeDef = { export const unknownNodeDef: NodeDef = {
+56
View File
@@ -207,16 +207,72 @@ export const createNode = (data: TreeGraphData, includeChildren: boolean = true)
return node; return node;
}; };
const toStatusFlag = (data: TreeGraphData) => {
let status = 0;
data.def.status?.forEach((s) => {
switch (s) {
case "success":
status |= 1 << 2;
break;
case "failure":
status |= 1 << 1;
break;
case "running":
status |= 1 << 0;
break;
}
});
return status;
};
const appendStatusFlag = (data: TreeGraphData, childStatus: number) => {
const childSuccess = (childStatus >> 2) & 1;
const childFailure = (childStatus >> 1) & 1;
const childRunning = (childStatus >> 0) & 1;
let status = data.status!;
if (data.def.status?.length) {
data.def.status?.forEach((s) => {
switch (s) {
case "!success":
status |= childFailure << 2;
break;
case "!failure":
status |= childSuccess << 1;
break;
case "?success":
status |= childSuccess << 2;
break;
case "?failure":
status |= childFailure << 1;
break;
case "?running":
status |= childRunning << 0;
break;
}
});
data.status = status;
} else {
data.status = status | childStatus;
}
};
export const refreshTreeDataId = (data: TreeGraphData, id?: number) => { export const refreshTreeDataId = (data: TreeGraphData, id?: number) => {
if (!id) { if (!id) {
id = 1; id = 1;
} }
const status = toStatusFlag(data);
data.id = (id++).toString(); data.id = (id++).toString();
data.status = status;
if (data.children) { if (data.children) {
let childStatus = 0;
data.children.forEach((child) => { data.children.forEach((child) => {
child.parent = data.id; child.parent = data.id;
id = refreshTreeDataId(child, id); id = refreshTreeDataId(child, id);
if (child.status && !child.disabled) {
childStatus |= child.status;
}
}); });
appendStatusFlag(data, childStatus);
} }
return id; return id;
}; };
+31
View File
@@ -4,12 +4,14 @@ export const zhNodeDef = () => {
{ {
name: "AlwaysFail", name: "AlwaysFail",
type: "Decorator", type: "Decorator",
status: ["failure", "?running"],
desc: "始终返回失败", desc: "始终返回失败",
doc: "+ 只能有一个子节点,多个仅执行第一个\n+ 不管子节点是否成功都返回`失败`\n", doc: "+ 只能有一个子节点,多个仅执行第一个\n+ 不管子节点是否成功都返回`失败`\n",
}, },
{ {
name: "AlwaysSuccess", name: "AlwaysSuccess",
type: "Decorator", type: "Decorator",
status: ["success", "?running"],
desc: "始终返回成功", desc: "始终返回成功",
doc: "+ 只能有一个子节点,多个仅执行第一个\n+ 不管子节点是否成功都返回`成功`\n", doc: "+ 只能有一个子节点,多个仅执行第一个\n+ 不管子节点是否成功都返回`成功`\n",
}, },
@@ -17,6 +19,7 @@ export const zhNodeDef = () => {
name: "Assert", name: "Assert",
type: "Decorator", type: "Decorator",
desc: "断言", desc: "断言",
status: ["success"],
args: [ args: [
{ {
name: "message", name: "message",
@@ -29,6 +32,7 @@ export const zhNodeDef = () => {
{ {
name: "Calculate", name: "Calculate",
type: "Action", type: "Action",
status: ["success"],
desc: "简单的数值公式计算", desc: "简单的数值公式计算",
args: [ args: [
{ {
@@ -43,6 +47,7 @@ export const zhNodeDef = () => {
{ {
name: "Check", name: "Check",
type: "Condition", type: "Condition",
status: ["success", "failure"],
desc: "检查True或False", desc: "检查True或False",
args: [ args: [
{ {
@@ -56,12 +61,14 @@ export const zhNodeDef = () => {
{ {
name: "Clear", name: "Clear",
type: "Action", type: "Action",
status: ["success"],
desc: "清除变量", desc: "清除变量",
output: ["清除的变量名"], output: ["清除的变量名"],
}, },
{ {
name: "Concat", name: "Concat",
type: "Action", type: "Action",
status: ["success", "failure"],
desc: "将两个输入合并为一个数组,并返回新数组", desc: "将两个输入合并为一个数组,并返回新数组",
input: ["数组1", "数组2"], input: ["数组1", "数组2"],
output: ["新数组"], output: ["新数组"],
@@ -70,6 +77,7 @@ export const zhNodeDef = () => {
{ {
name: "Filter", name: "Filter",
type: "Action", type: "Action",
status: ["success", "failure"],
desc: "返回满足条件的元素", desc: "返回满足条件的元素",
input: ["输入数组"], input: ["输入数组"],
output: ["变量", "新数组"], output: ["变量", "新数组"],
@@ -78,6 +86,7 @@ export const zhNodeDef = () => {
{ {
name: "ForEach", name: "ForEach",
type: "Action", type: "Action",
status: ["success", "running", "failure"],
desc: "遍历数组", desc: "遍历数组",
input: ["数组"], input: ["数组"],
output: ["变量"], output: ["变量"],
@@ -86,6 +95,7 @@ export const zhNodeDef = () => {
{ {
name: "Includes", name: "Includes",
type: "Condition", type: "Condition",
status: ["success", "failure"],
desc: "判断元素是否在数组中", desc: "判断元素是否在数组中",
input: ["数组", "元素"], input: ["数组", "元素"],
doc: "+ 若输入的元素不合法,返回`失败`\n+ 只有数组包含元素时返回`成功`,否则返回`失败`\n", doc: "+ 若输入的元素不合法,返回`失败`\n+ 只有数组包含元素时返回`成功`,否则返回`失败`\n",
@@ -93,6 +103,7 @@ export const zhNodeDef = () => {
{ {
name: "Index", name: "Index",
type: "Action", type: "Action",
status: ["success", "failure"],
desc: "索引输入的数组或对象", desc: "索引输入的数组或对象",
args: [ args: [
{ {
@@ -108,18 +119,21 @@ export const zhNodeDef = () => {
{ {
name: "Inverter", name: "Inverter",
type: "Decorator", type: "Decorator",
status: ["!success", "!failure", "?running"],
desc: "反转子节点运行结果", desc: "反转子节点运行结果",
doc: "+ 只能有一个子节点,多个仅执行第一个\n+ 当子节点返回`成功`时返回`失败`\n+ 当子节点返回`失败`时返回`成功`\n", doc: "+ 只能有一个子节点,多个仅执行第一个\n+ 当子节点返回`成功`时返回`失败`\n+ 当子节点返回`失败`时返回`成功`\n",
}, },
{ {
name: "IsNull", name: "IsNull",
type: "Condition", type: "Condition",
status: ["success", "failure"],
desc: "判断变量是否不存在", desc: "判断变量是否不存在",
input: ["判断的变量"], input: ["判断的变量"],
}, },
{ {
name: "IsStatus", name: "IsStatus",
type: "Condition", type: "Condition",
status: ["success", "failure"],
desc: "检查子节点状态", desc: "检查子节点状态",
args: [ args: [
{ {
@@ -147,6 +161,7 @@ export const zhNodeDef = () => {
{ {
name: "Let", name: "Let",
type: "Action", type: "Action",
status: ["success"],
desc: "定义新的变量名", desc: "定义新的变量名",
input: ["变量名"], input: ["变量名"],
output: ["新变量名"], output: ["新变量名"],
@@ -154,6 +169,7 @@ export const zhNodeDef = () => {
{ {
name: "Listen", name: "Listen",
type: "Decorator", type: "Decorator",
status: ["success"],
desc: "侦听事件", desc: "侦听事件",
input: ["目标对象?"], input: ["目标对象?"],
output: ["事件参数?", "事件目标?"], output: ["事件参数?", "事件目标?"],
@@ -191,6 +207,7 @@ export const zhNodeDef = () => {
{ {
name: "Log", name: "Log",
type: "Action", type: "Action",
status: ["success"],
desc: "打印日志", desc: "打印日志",
args: [ args: [
{ {
@@ -227,6 +244,7 @@ export const zhNodeDef = () => {
{ {
name: "Loop", name: "Loop",
type: "Action", type: "Action",
status: ["success", "running", "failure"],
desc: "循环执行", desc: "循环执行",
input: ["循环次数?"], input: ["循环次数?"],
args: [ args: [
@@ -241,30 +259,35 @@ export const zhNodeDef = () => {
{ {
name: "NotNull", name: "NotNull",
type: "Condition", type: "Condition",
status: ["success", "failure"],
desc: "判断变量是否存在", desc: "判断变量是否存在",
input: ["判断的变量"], input: ["判断的变量"],
}, },
{ {
name: "Now", name: "Now",
type: "Action", type: "Action",
status: ["success"],
desc: "获取当前时间", desc: "获取当前时间",
output: ["当前时间"], output: ["当前时间"],
}, },
{ {
name: "Once", name: "Once",
type: "Decorator", type: "Decorator",
status: ["success", "failure", "?running"],
desc: "只执行一次", desc: "只执行一次",
doc: "+ 只能有一个子节点,多个仅执行第一个\n+ 第一次执行完全部子节点时返回`成功`,之后永远返回`失败`", doc: "+ 只能有一个子节点,多个仅执行第一个\n+ 第一次执行完全部子节点时返回`成功`,之后永远返回`失败`",
}, },
{ {
name: "Parallel", name: "Parallel",
type: "Composite", type: "Composite",
status: ["success", "?running"],
desc: "并行执行", desc: "并行执行",
doc: "+ 并行执行所有子节点\n+ 当有子节点返回`运行中`时,返回`运行中`状态\n+ 执行完所有子节点后,返回`成功`", doc: "+ 并行执行所有子节点\n+ 当有子节点返回`运行中`时,返回`运行中`状态\n+ 执行完所有子节点后,返回`成功`",
}, },
{ {
name: "Push", name: "Push",
type: "Action", type: "Action",
status: ["success", "failure"],
desc: "向数组中添加元素", desc: "向数组中添加元素",
input: ["数组", "元素"], input: ["数组", "元素"],
doc: "+ 当变量`数组`不是数组类型时返回`失败`\n+ 其余返回`成功`\n", doc: "+ 当变量`数组`不是数组类型时返回`失败`\n+ 其余返回`成功`\n",
@@ -272,6 +295,7 @@ export const zhNodeDef = () => {
{ {
name: "Random", name: "Random",
type: "Action", type: "Action",
status: ["success"],
desc: "返回一个随机数", desc: "返回一个随机数",
input: ["最小值?", "最大值?"], input: ["最小值?", "最大值?"],
args: [ args: [
@@ -296,6 +320,7 @@ export const zhNodeDef = () => {
{ {
name: "RandomIndex", name: "RandomIndex",
type: "Action", type: "Action",
status: ["success", "failure"],
desc: "随机返回输入的其中一个!", desc: "随机返回输入的其中一个!",
input: ["输入目标"], input: ["输入目标"],
output: ["随机目标"], output: ["随机目标"],
@@ -304,6 +329,7 @@ export const zhNodeDef = () => {
{ {
name: "RepeatUntilFailure", name: "RepeatUntilFailure",
type: "Decorator", type: "Decorator",
status: ["!success", "failure", "?running"],
desc: "一直尝试直到子节点返回失败", desc: "一直尝试直到子节点返回失败",
input: ["最大循环次数?"], input: ["最大循环次数?"],
args: [ args: [
@@ -318,6 +344,7 @@ export const zhNodeDef = () => {
{ {
name: "RepeatUntilSuccess", name: "RepeatUntilSuccess",
type: "Decorator", type: "Decorator",
status: ["?success", "failure", "?running"],
desc: "一直尝试直到子节点返回成功", desc: "一直尝试直到子节点返回成功",
input: ["最大循环次数?"], input: ["最大循环次数?"],
args: [ args: [
@@ -333,11 +360,13 @@ export const zhNodeDef = () => {
name: "Selector", name: "Selector",
type: "Composite", type: "Composite",
desc: "选择执行", desc: "选择执行",
status: ["?success", "?failure", "?running"],
doc: "+ 一直往下执行,直到有子节点返回`成功`则返回`成功`\n+ 若全部节点返回`失败`则返回`失败`", doc: "+ 一直往下执行,直到有子节点返回`成功`则返回`成功`\n+ 若全部节点返回`失败`则返回`失败`",
}, },
{ {
name: "Sequence", name: "Sequence",
type: "Composite", type: "Composite",
status: ["?success", "?failure", "?running"],
desc: "顺序执行", desc: "顺序执行",
doc: "+ 一直往下执行,只有当所有子节点都返回`成功`, 才返回`成功`\n+ 若子节点返回`失败`,则直接返回`失败`状态\n+ 其余情况返回`运行中`状态\n", doc: "+ 一直往下执行,只有当所有子节点都返回`成功`, 才返回`成功`\n+ 若子节点返回`失败`,则直接返回`失败`状态\n+ 其余情况返回`运行中`状态\n",
}, },
@@ -345,6 +374,7 @@ export const zhNodeDef = () => {
name: "Timeout", name: "Timeout",
type: "Decorator", type: "Decorator",
desc: "超时", desc: "超时",
status: ["?success", "?running", "failure"],
args: [ args: [
{ {
name: "time", name: "time",
@@ -357,6 +387,7 @@ export const zhNodeDef = () => {
{ {
name: "Wait", name: "Wait",
type: "Action", type: "Action",
status: ["success", "running"],
desc: "等待", desc: "等待",
input: ["等待时间?"], input: ["等待时间?"],
args: [ args: [