From db34d5762b8ea4e4fdd48b5931c1806333c242bc Mon Sep 17 00:00:00 2001 From: Argent77 <4519923+Argent77@users.noreply.github.com> Date: Sun, 15 Oct 2023 22:54:55 +0200 Subject: [PATCH] Add option to load tp2 files in the app itself to start mod installations --- .../io/infinitytools/wml/gui/MainWindow.java | 46 +++++++++++++++++- .../wml/gui/MainWindowController.java | 1 + .../io/infinitytools/wml/icons/Icons.java | 43 ++++++++++++++++ .../io/infinitytools/wml/gui/main.fxml | 36 ++++++-------- .../wml/icons/icon-tp2-dark/128x128.png | Bin 0 -> 2163 bytes .../wml/icons/icon-tp2-dark/256x256.png | Bin 0 -> 4949 bytes .../wml/icons/icon-tp2-dark/32x32.png | Bin 0 -> 760 bytes .../wml/icons/icon-tp2-dark/64x64.png | Bin 0 -> 1472 bytes .../wml/icons/icon-tp2/128x128.png | Bin 0 -> 2194 bytes .../wml/icons/icon-tp2/256x256.png | Bin 0 -> 4964 bytes .../wml/icons/icon-tp2/32x32.png | Bin 0 -> 758 bytes .../wml/icons/icon-tp2/64x64.png | Bin 0 -> 1424 bytes src/main/resources/l10n/wml.properties | 4 ++ src/main/resources/l10n/wml_de.properties | 5 ++ 14 files changed, 114 insertions(+), 21 deletions(-) create mode 100644 src/main/resources/io/infinitytools/wml/icons/icon-tp2-dark/128x128.png create mode 100644 src/main/resources/io/infinitytools/wml/icons/icon-tp2-dark/256x256.png create mode 100644 src/main/resources/io/infinitytools/wml/icons/icon-tp2-dark/32x32.png create mode 100644 src/main/resources/io/infinitytools/wml/icons/icon-tp2-dark/64x64.png create mode 100644 src/main/resources/io/infinitytools/wml/icons/icon-tp2/128x128.png create mode 100644 src/main/resources/io/infinitytools/wml/icons/icon-tp2/256x256.png create mode 100644 src/main/resources/io/infinitytools/wml/icons/icon-tp2/32x32.png create mode 100644 src/main/resources/io/infinitytools/wml/icons/icon-tp2/64x64.png diff --git a/src/main/java/io/infinitytools/wml/gui/MainWindow.java b/src/main/java/io/infinitytools/wml/gui/MainWindow.java index 1bf090a..0d20161 100644 --- a/src/main/java/io/infinitytools/wml/gui/MainWindow.java +++ b/src/main/java/io/infinitytools/wml/gui/MainWindow.java @@ -65,6 +65,7 @@ import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.file.Files; +import java.nio.file.InvalidPathException; import java.nio.file.NoSuchFileException; import java.nio.file.Path; import java.util.List; @@ -1012,8 +1013,12 @@ private void onShowFindDialog() { */ private void setWeiduRunning() { updateWindowTitle(true); + getController().quitButton.setText(R.get("ui.main.terminate.button")); + + getController().loadModButton.setDisable(true); getController().inputButtons.forEach(button -> button.setDisable(false)); + if (getTray() != null && getTray().isAvailable()) { getTray().getQuitItem().setLabel(getTray().getQuitLabel()); // tray icon: update label and icon color @@ -1039,6 +1044,7 @@ private void setWeiduTerminated() { getTray().getTrayIcon().setImage(Tray.getIcon(isDarkModeEnabled(), false)); } + getController().loadModButton.setDisable(false); getController().inputButtons.forEach(button -> button.setDisable(true)); // Triggering tray notification if main window is not active @@ -1159,7 +1165,12 @@ private void applyDarkModeUi(boolean enable) { // updating window skins CustomScene.updateSceneCache(); - // updating Options menu icon + // updating UI icons + if (getController().loadModButton.getGraphic() instanceof ImageView iv) { + final Icons icon = enable ? Icons.OpenModDark32 : Icons.OpenMod32; + iv.setImage(icon.getImage()); + } + if (getController().optionsButton.getGraphic() instanceof ImageView iv) { final Icons icon = enable ? Icons.OptionsDark32 : Icons.Options32; iv.setImage(icon.getImage()); @@ -1316,6 +1327,7 @@ private void setupUI(Scene scene) { getController().quitButton.setOnAction(event -> onQuitClicked()); getController().detailsButton.selectedProperty().addListener((ob, ov, nv) -> onDetailsButtonSelected(nv)); getController().detailsButton.setOnAction(event -> setInputFocus()); + getController().loadModButton.setOnAction(event -> openModFile()); getController().aboutButton.setOnAction(event -> showAboutDialog()); getController().sendButton.setOnAction(event -> sendInput(getController().inputField.getText(), true)); @@ -2198,6 +2210,38 @@ private void showAboutDialog() { } } + /** + * Let's the user choose a tp2 file for a new mod installation process. + */ + private void openModFile() { + if (isProcessRunning()) { + Logger.debug("Process is still running."); + return; + } + + Path initialPath = null; + String lastPath = Configuration.getInstance().getOption(Configuration.Key.LAST_MOD_PATH); + if (lastPath != null) { + try { + initialPath = Path.of(lastPath); + } catch (InvalidPathException e) { + Logger.debug("Invalid path: {}", lastPath); + } + } + + Path tp2File = Utils.chooseOpenFile(getStage(), R.get("ui.configuration.fileDialog.tp2.title"), initialPath, + new FileChooser.ExtensionFilter(R.get("ui.configuration.fileDialog.tp2.filter.tp2"), "*.tp2"), + new FileChooser.ExtensionFilter(R.get("ui.fileDialog.filter.allFiles"), "*.*")); + if (tp2File != null) { + try { + restart(tp2File.toString()); + } catch (Exception e) { + Logger.warn(e, "Open mod file: {}", tp2File); + Utils.showErrorDialog(getStage(), R.ERROR(), R.get("ui.main.loadMod.message.loadError.header"), null); + } + } + } + /** * Terminates a running process. * diff --git a/src/main/java/io/infinitytools/wml/gui/MainWindowController.java b/src/main/java/io/infinitytools/wml/gui/MainWindowController.java index 9e2c98a..ebd7b86 100644 --- a/src/main/java/io/infinitytools/wml/gui/MainWindowController.java +++ b/src/main/java/io/infinitytools/wml/gui/MainWindowController.java @@ -38,6 +38,7 @@ public class MainWindowController implements Initializable { public TextField inputField; public Button sendButton; public Button aboutButton; + public Button loadModButton; public Button inputDigit0Button; public Button inputDigit1Button; public Button inputDigit2Button; diff --git a/src/main/java/io/infinitytools/wml/icons/Icons.java b/src/main/java/io/infinitytools/wml/icons/Icons.java index db9b880..e10e481 100644 --- a/src/main/java/io/infinitytools/wml/icons/Icons.java +++ b/src/main/java/io/infinitytools/wml/icons/Icons.java @@ -174,6 +174,49 @@ public enum Icons { */ Logo(Logo256.getFileName(), Logo128.getFileName(), Logo64.getFileName(), Logo32.getFileName(), Logo16.getFileName()), + /** + * Icon for "Open Mod: button + */ + OpenMod256("icon-tp2/256x256.png"), + /** + * Icon for "Open Mod: button + */ + OpenMod128("icon-tp2/128x128.png"), + /** + * Icon for "Open Mod: button + */ + OpenMod64("icon-tp2/64x64.png"), + /** + * Icon for "Open Mod: button + */ + OpenMod32("icon-tp2/32x32.png"), + /** + * Collection of "Open Mod" button icons in all available dimensions. + */ + OpenMod(OpenMod256.getFileName(), OpenMod128.getFileName(), OpenMod64.getFileName(), OpenMod32.getFileName()), + + /** + * Icon for "Open Mod: button (Dark Mode UI version) + */ + OpenModDark256("icon-tp2-dark/256x256.png"), + /** + * Icon for "Open Mod: button (Dark Mode UI version) + */ + OpenModDark128("icon-tp2-dark/128x128.png"), + /** + * Icon for "Open Mod: button (Dark Mode UI version) + */ + OpenModDark64("icon-tp2-dark/64x64.png"), + /** + * Icon for "Open Mod: button (Dark Mode UI version) + */ + OpenModDark32("icon-tp2-dark/32x32.png"), + /** + * Collection of "Open Mod" button icons in all available dimensions (Dark Mode UI version). + */ + OpenModDark(OpenModDark256.getFileName(), OpenModDark128.getFileName(), OpenModDark64.getFileName(), + OpenModDark32.getFileName()), + /** * Icon for Options menu */ diff --git a/src/main/resources/io/infinitytools/wml/gui/main.fxml b/src/main/resources/io/infinitytools/wml/gui/main.fxml index 6d1a8f2..074c29a 100644 --- a/src/main/resources/io/infinitytools/wml/gui/main.fxml +++ b/src/main/resources/io/infinitytools/wml/gui/main.fxml @@ -15,30 +15,13 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> + - - - - - - - - - - - - - - + - - - - - - + + diff --git a/src/main/resources/io/infinitytools/wml/icons/icon-tp2-dark/128x128.png b/src/main/resources/io/infinitytools/wml/icons/icon-tp2-dark/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..1a93e701a689b5951c8e81a0f2e592787bd16fa2 GIT binary patch literal 2163 zcmV-(2#oiMP)HM`3OFBuGC4uVMzl7pCy1VJQbMNopo zU32kfVj_qdKO!pR=t)EZF(FVl_1?c;P4|F6AP@)y0)e1%P$ou~E?v6&`>Iu|P-?|t z)&Sdq&A?i%^#st-TKC&`^qt(j=tA+znc z#|Uo!BKmnOI0B4~jm0mlnKt+Wyd!}T0VXFWmwr70JSlMumjrn|d} z%a8zZE#QO%rX^rg!uD?~9DEx%=BgZ+5+JGP_+7;Vs6){NrUXbT9oJ)h0vXR9lb|L( z_BI1_52SUWBoG2rJQIxPU}oR+-fvYbj*657YZ)NsuR=P8;}%Y=szG)_fIgYPDhaHY z0119rJnh74D2nP07;@x;CDHY3=nPxh?C$YAwacp99Ulp0Yvqe zo&iuw)s#{%iU#lpWsHgkqy+ebu~0}S1Skf-hEjG!0~CX=mdc~=B~mm%F*pzGH}Riq ze~wG63d14b2fB@#HNdR|t)OD5yw)=~Zvc-0TZ8~%;Ue%(mJ&Loq`u}Q0Yn2hPn2OFh zO|Y82X)52Qfpy^OAcqc_Z|^VZd`|(h8TM~7K2hzP2AIkie4=@Fy@Yd}&KUe9 z8?R`v5IR!N`ksHmv` zASGZb54nBmp!(PcXazuk={y?8r}nvz8ldSoC{9PeZ)+#Mwt{`n0uMU6CLutJOfNi1}Ij|wh9PJ9XLz(BUi&-#~I#PG$mSdBnjYA2}lagsgxskH}JOQ zo_bUS;WT0JenSOpf>OEd$#| zY4nFcfV`g#sOQK4{j$f%bO1vkK;EU{*_`j+TLz{i1B4|6XDpn z2)Bou2*GU@GeE!T;K*cv5FQZGG90lsVUqqADgU;$kthLe10fhHafJXOJ2SKyKnT;o zpqyzzyGRBI*_l!T!gFR(A}t63XoUcdo)A)$5Nt%R%4(L7o)J`pQ|ExwRn{yaJtoe! zQ`-@#ipT&9k^$_)c3ZU(tJk(kP@NLs@F`)oojMo$-DVkRhavz&%K$c&b-Ra9jVg}* z&@_Ne=QjF~t04ra&P-sg&;M+df%!@i!10qpZ8*0*fJl-7Dv|*jLo`Oi0=X6|MF7Vd zz=jZ<8?xmJ_k^zb*(V`&<8X1n?sKV&?LIW6P5R(9XYPnR{o@D_hTN5Fr*_FC&w?em_0PJ4d|kbft{FJ~ z>XLnQj8g3luG^M<@O^*|@NPewPN##`dWC(b(>b8Ez7lQgXs!F&4_Q(^09=WF&t*U8 z{1g0P&E7?i#YG?B8(=-KHJSt8=~Fstz@*mtC$06xTCEnp_!ahjM)NZJp6Qd3ebV_m zv@cXoxO!A%S`xDIncBuib zBy8WAbfNKA1}EfoVj>|jek9E$iFPKK{^^nc3ki6U`3T#f;|2N>gO9K1?d=KnM*zf7+wX7L4D5bhs0xi4F zn@qD)yyw@ZvxGc-fKQTYeA54V^?<;La5sU2Wi*1$(Ov2kl#365>tzrC;4K2YCw?SE zLbr4t13t@h92;u^)20GMkgGJD1YXH|99xS)Tl3T*L1yg3{EMs#AppR8z(x{olg_%p z;oJUM?em^b?C;ya=X5)QM{Nbo_F~Xwy5HD!FWnD8K1#POJV5|!<345h==HDG`gh<* prPLV=+r0vTKp+qZ1OmY_{0|O=B6IIp^(FuS002ovPDHLkV1j34;_(0g literal 0 HcmV?d00001 diff --git a/src/main/resources/io/infinitytools/wml/icons/icon-tp2-dark/256x256.png b/src/main/resources/io/infinitytools/wml/icons/icon-tp2-dark/256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..826c6ef2551335c2b022502a71047a0425cc110a GIT binary patch literal 4949 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 aq{u&}OhCPTZTvI<0000}@x;Yl zxp)(V12Je66HPdJGMbPe=*57rT)e0Zo-|0D6)z^3?1qEk0;8x2x8;B$x>FuzcGI*o z)7@3o)m78)B^{ROe%(Fq{q?`UUQc%`tu-N@yu4@vQvhW3 z4{k{JFAiZSR|CUkfVKKwDhLDsHD`he3uF$Y_bk<4lak=8!OH@GdfO>r zb0q)})n7RSptWvjtzQxi5RO$5l!v4Qgk$%_0y+UeIrd8|Wk)nXIriCFc?`WoiUugh zegF=c#Lss;CnQ&;*-_vEy++MO;7*2CPzfq;qz30r;AvpH03a^A47^#SgpMewuLcPK z(EuLgeXlGu%80pWfH;yLt_T$Kn|#-dD*%XWtSY`>x|X;o@W+pHvf=$+>N( zzf@^6{d3NftafOcDzs@}6Sy`kpd;qnhblVXv%q|T?c2a}rpYgZZ9~%lGX;}Rf1cf} z;9PeWO#YfrP_wDfG(g(|IKFL%fzMKCQ|S=<085^dVQbSazFXCOln|$ZOP-S9qFfcV z<&cseDgc%vDFHJ!;0~pO8e$({DFOiOw9z;rwa-J;0Bz4n@jCiLyLJ+4D>!r(c-Yf- z5&)E(l*$C)*Z`oUYXOUaGr&$^fO6IBQVB_E0^gDSh_+LV?kt)Dtv!|i2&e>PCFg9; zk-Hao!*S1{9cY|`{yl(6(56RxUWB&yj##(VBcN-m0ZfB7EIIQAK$>w_|Ch%W042_A zO@cNoIdca4+T*$hASIxhUO>}u)XooKhNb`@+!D|npabR&k3XmkjFkWkodH}4!8wcL zr^~>OaT@(G0KoRQ0Zj`A7{nf9(*cYH0JfKg=Pi$)E(0^d0C5SyIS1#kXN0~G0F-=r zbBW$7SWGlP(*Xk{S;S=Yw*wzwQQR41dR<`N(ebAl-582?^v41KlTkF|i2jo-VA29! z3_Z9p+#YTs1a~-OfI-v2v0;E19uTo)IAUFz3H`57{cUSwQ35&!LNHd~3IJjbW^6Nn z7^ZA!0GG|Ld6IdAVnX59eSStW{ep0B5;C6-pNf@9e4A2^(Flm^r7QY;d%y9KL)TUAMX|f!7Bx) zk1cvHqR4AUfzy$Q=)0`4SH?Kd4lmNX1#Hwk`#1Z^H0d22>NCMyj*)Lg|61$H9w9ps z(#X#Prj&16Yu&avcE<6R(#b98A3O-WYXEuCWQ{d|BtJYo;H?iJ$qy3*^5#$}0rAn6 zuz)atSZo?VEKC;g)dx5T>;nD*R)+v_3b+Kk2mGD(S4vgtZ+rfh{^cUA=mLDp=$9@$ zpE$&EKr5xRQflD#sn5SjonoecYAMA(Yf0?eslQTcZ8?~+kB^LUSuy}N0=Eh#Km*%D z^UssO#Qt6RmkxlkuLW%AQ``DBIj&35G<{VYI>f7n*`W8%8WSwfc zrcsr@g>^#*K-mm%U2A>aAn@1L{QLW;)ZgHHyYi2|56}hP8syVxG}Z;qT_@CN99BwQ z?XT-9r3U(sxTJg-xZ3~Q%757TXT-yqzmFb^k3PWXz-C~!KL=hNP&yjGy-KN{lv0g+5cIc#OopM?z4S&V#%D+GZ=?-u|Z~)kr zvHh>Wv^F_0!)pNmUy-k`J@m8W=LP!owOVq<Rm>@OF+_Qfg_R= zZ}uAIFS2r80+RL^y_+#@Rc)}_7xlM2pTz(F0X_j9aG6V0(w)8c(fbkPQ}o)xlO(Rq z7dd8V+ZXjWJRjBXncQwP8oz0+f7Du^&uaG?LQr40^CP_0%q@p5Aq7)&75x$~S5{G|f_&j}^_4eY2n7&N2LT`~`Co?^qfzSsNJ*2d_MZqFntMjNr*de^End+Tope6{ zr6vXnV-ph7z0nn2rNlw$b8=!B$lF&*DS7ZZlz{XT4g^a5$WG{;0+Sg#Y~2MXXAAnq z`uci{NJ>7D>jl!z;`kQ#hLi(d8Ns&RC%wJA-zMDtmEwSNa`HOgd~fx8Q<~293bP&o z;IsP;3Sa=h0|4_ci2(m!nW&g9$O-yrod0L>c>YnJ(9oK>`HyK!A|$)i;LN;3=TBd| zrSd^e>cxpqCOg+!gh-ww3z3P{3eAXKo{pZHuP{Nph)Ax=>r`nXGTJCOgJI~yElplS z!DQX~*I5DPiU+TGb=X2B@-!oaaxJ-I(?sB3O#)h+X-WE(vSdI?V&@iwJj-YMuSTAt z=|r-!DB5Yk!Z?DFG2CvmR*>gMa;i~WUo;U?X>V2K5*RPil|`U1TAl^5{)P?etoN6U zjK4$)%Nxg_u!niiDdwv4_Ha9X{cm~#8 zU+&};N~R9G;qk~%Bms3!1o~*U*j12}751xXWlV`3xO9+ctgx^JVI&1V<}{4!j6}nE z2k~tR^bnCKyaG`Lwc{ICqo-qW{pgwkQz(xOT~Ch^3_}Qo1J#=mrzJQ@rjW`M)EL_= z5Qgv}1J>c8kL9yPf5v|*9vI!8^P;ClRWWU;#H?ozNjB2ZePe{H5*1X*>!zr^T+1an_B+l+~>aNy!Kic+Tl-q_o5Ta)FkO> zB^*VMDYHW;wJFJB=2>&*xx{U%*EB#+%F+ki@}f1#&C?7hV^e|Ii}z6QL~@?|R6-cI zO$b8-1d4N3jlKhHjIIE4{XUI$kkP}AW|P4!O4Fwz%}EEa9K6n*d(?Czghv;T_gp}^ zY@+-0AbZBv(nD=@I?JOCxY}>o&{Dt(#*Y3RocK7l_b(!`d3dP?AR`cIN?>0Cg6=y| z8fJfUE7_>Cyb}w68H57(E#mlK2?9Tmh^J6bHxY)rxQz`cTf^Jvgn?iKp?%##amtA2 zn@vQS5K~A73l}(F3#kbCGLva)epe)C7Xb_e{gmn6Dx6p(UZNIoy(&ruF9YyR#+AksOT@OBL z5fiONOIgVv?9o89?kpo(4`~dDDN>Xx+VKgR%CUfO=DLU!9wcj9q%Kj-Lu=p1-X3k$ zr72_Q6}uJ$NN7DI4&-$@sqV|c#?rJ*Cq9qfJ*rVcPy}%w?kFpSmE>I@l4mPBA2wIy zW*~BNExg*sy*n1o+%(kQHF`IG=K39Ey#7YZN?uYyxr=><2zDd8*jGH;mmpO33oNjD zD;viL!cQu0?t$gog)mI_1!n;W5Q7(03@IOYZ3+_Ao&fm zW{mb435Wqd)zN@?alturvQ`w6%(*A~+&*Wx1Dr$-GygCn6sjs5Yu~&sop4{!2@yT+9Cd#M zG3c?4HJ!G3Aahcie!W^TUS6Y(_mb){9&52#Z$FR@#W~5YafQBq`BFEpF9APvdS(rz zzwb89y0NwN3VTS@c=f<3kMtFUruS@VaTN;X-u4o`v`rtKe4_}KAN7%Wi{ z-lgMiHyIA^t=mPF+q2pM#mNZ1)dsHAjF}cYMS_b$$e?4_mKe@;mp$GaZIm3eoMa z?7J#o%Izwb9(4cO=MmjbRyZ;vRw981v2Cf;{(0wLgBgbUr$5yey8B%&FQ0eB;}T_| zY_aT|2bwzR%(9>mS^X!|{$EC`&bd8_!N3_PdM6LEK>KK&+?XrwXaPG0!(8s4}1%#7~;_zSa&5Lij>W)2IYjzk4n#bEy zMRC9t)(DMgeNfnx{{l0cH2b*n4Et%81R)QBP}M*szRaRR5c*0sYk-f!<|;v$Te zSD0cC9%xj<(6NCI?zPhawk}hm;w;*yzOp@>6eLD+*OnOSD9^wHF2vGDX88v1bRnEI zrw6z)Yb78f<|je)Jq*|am)!)=h-Fzhaq89~d0)-&E>ax$3}F!>a{@&XS9zTt^m^9U z@giW4?zL1zMnwsRB7M7I(f&(4?|#OWMQ)(0biN&R_mKi z$(8)0lEpj^&AD9c<(3E|m#w`c%z#@C0gS~YRY78Mm96{5f75(cvP@w8fGRO={jn9= zbb9~xipczquB%aV&0_~AJIB>7j+@9%;G*4dSgRf?n8fglZ3Y)src!;a7 z-(5{v9ZH^aiZ3y(HjdKHEM$F0E$2Jp5)1Rxm9D~^XSgdzmiLy^8Y zq0`at?~|1kj_u8d0$IR3^WGVz1ZD`fhC$q*oYfm$5X z+&N3jPCAb6?Ip%RW24at9`rJMw1pBlMRMI6!qd71H6j5-M+Qu7I13|*KpC{`7VG8K zNDJO$TT2KN-i822lK|(HaR(XfEHhsW6xEhGXGSG(l7MC=ABEr99B8WLIlh6jrQpv{ zm(l|hFkUfOK2Lk3i@zuio4~2o$|&6*8_pQy4Q+%n3fA}zMx)0)=;>EtL0IBABCDgm zp4Z$8Bw-9;bFAB+l&+!O^*Wsf2f%d^1DgdB=pl-5jPI--sYhGTVcWCFLK!3N3m*#;3~I>b z?I&;AHmdU0q+{%-fn&zMrmAovBPZuV)P9 zLA`T2AWl#< ze%S3iOM0Nim$Qhg8jQ_=Bb8 zohRorLP%+QeWLLcUs|wMQx%Q5E&+PXNR01_Reupf`P{*U4NXFOd<^c)j}HUkD8-6W z*|{2jT01SmhjzZ9$d4vAam`~2N9R`Baj@BFU3*19C<$gK6rp?Rr3XsT%;BlmHA!Ji zNW>@a*x7gE4}KrY{4#cg6Ibf7$$!BZ_WH$YX|O-|DDk(OTtLupG{KEpwG z@8tTAL(;>CfLV}TCM#Ys3{tPqFG>? zpLbd=>N76t7ZguWIo%&VeDKa>MN>_FYIYiQx)M_seS?}$r~2s2`5oTfw_(N+|73Bm z#*Jf&qKjIjRN67z(0aWWgA?<5x+KzChI`6q_n7x&Ewie(>6d+mMzq;?DAeR7Nz#SF zC9~CFT0=vF?Zfb$cWDoUBU8O-L!+Z}pQE+}ef+(D&gO18_vLcUP*jR+=3g*UjP8BU zEe^WLs(V{lSSXihEj-FL&<>Gb3GnjzQTdB=Wn9&9IBOuu@{BmVf&fd*rp&S8)~SKQ z9QnwL2b{W_K|;N#G2Hjh|B&5;M5@_CFV`(!R`istHyZnmtKA+g4c@nXdiNN(X0kEX zxj48o8k#i_6UO7NJnB#uCRy}Pte`$vOo3Fgpy9FLtKs_N4m>-?N-~t4Wf6NRJ%-`KR+>fEwb^8E-Wo zioS0|G|kVJaBihC=OAtNeS1@w?)@NeJo90`xbz*`Y-8%~ZEmQM}Au1;!l3)oUWGsA$vm1hr7X4a==D z@Bh8bvzeT~skR>jt8h;+j;kuZNFwB2w_;rOntJ5jKPJ2oO5&(C*`++b49l$A>dizC z4#k{~)O&wnZ}{N1HL9r``QYQ6v>(;g(U<2q&CS9aQ4Wj<)qSUN{(o=o0F23#N1QH| zzZ+8T5Qh(bu<7oOtN8VKa(S7hxs7&n7`F8fFS>ZOhIy5wlNwy6W~00JQvNsPzhqnp z$4!4v_r|-SjfO$b+slz|<6rZ6*3TdOG2?k=vMe417v??r()uS<;|ru2RL-&?lPAtR zQ)fS*eC(Yp-U(u_{m9MYIy1%{9UY_8*#rEjvglb{-xe7m{fS>}N=E)K=JIJipWOdf hD&qt2|0yuEy3Kx=W8E2eYKcD!NC%HvQ7zqX{0}m10HOc@ literal 0 HcmV?d00001 diff --git a/src/main/resources/io/infinitytools/wml/icons/icon-tp2/32x32.png b/src/main/resources/io/infinitytools/wml/icons/icon-tp2/32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..c8fd03db7a57e9a86a13130758d937cc03226d7a GIT binary patch literal 758 zcmVo6`WSFzJplZv>KbXVY8kHKcm(VN<{Zo-&;cBd z+pHIWx4`jO`SnN|jfW>IfN--yie3xQ>2wJwMwy?f6Q+!(zB#~vyEtj|dI?4VTGNc@ zNy1`4A4<^+WyO_@=kY)x2t#M^>~Z=rFdfKN3RP|ZlK~wWxe4?;-R_|Yb7efs#;XZI ziyQ2XC24!gJ2eBC_N0o&y&x$g4_r&puNgo*ru_->;k;j;7eKKdx_JO3CDo|UEV^~^ zz%!rg;(?MUSI8%MAaep{0ubwF#hCj`0gzk`C{rU!Xr%+dg9I?u){(TjpHb3FW>%6^ zh@WuX3x$BM*#p0UE5KDr^IqfU{7g3o+%dC@K)3V5zy;tK@WUI`S>QDAOVTAXo6U17 zz6`txPP8|GcLCq$hmMH94!jTeK`+IK-*09ePCu!7F9=2%=rXgTzydHS=>@O{m^ZU2 zNfX|J7yM`SGLi#R!1G9MW*>m_Nhj`j6@2vP5U@kiCrR^?x`8%e23VAI2H5WWf`_8b zZ&eW=$-hZDAZf_=o=FQq8!)@ZSF><_2X=-wEzDZa{9V9ZGusRNlq-Z)5ihNfkM;{H o!pv+lFfC~W_`1yIMqkhW0(Wy@7&L;r?f?J)07*qoM6N<$g4r2Rf&c&j literal 0 HcmV?d00001 diff --git a/src/main/resources/io/infinitytools/wml/icons/icon-tp2/64x64.png b/src/main/resources/io/infinitytools/wml/icons/icon-tp2/64x64.png new file mode 100644 index 0000000000000000000000000000000000000000..0b712be25078cd5b510fd874995613277a1b23a3 GIT binary patch literal 1424 zcmV;B1#kL^P)Z?Z{dchKyDf|ua>K~RI6jUT9oU?6(& zkX^lc5K-}Oufx~68PH)}yN-TkV%s{ZwVAJy|(RF%zK8f@}1VH31kEmW0WuZLmD^}r**ZV{OP zE{$o-O;ue5-UWVhX&@rRahxwy)!d`iYB4o6MWfLGco_Hv(Bu%2b>}YE$-P1Ao8x<6 zn=1ged0GXNlan-?O+@64OviOPR)CqI03afW$YV90d~*B>O#1>LHZLF|JApQESL*gE zumtpgts~U?3&2gl{TBHOFb|v$W&?m{GDu$pX2)o-4>&MkM^y$CxxoiA*IyW<>sn@k z6IGd6B@Xy!1Gx2FB61qIc3=RE5xn9$dw+z*DP&dETYyu*H3I>V_6B*jqUPmhR}eN* zC|nhFCnj9Y03;xM3+(a+phk4}U93H-`ndN)$7JyG%HIRDow^zr@E!0|c0rQsl7-UB z+u>{!RgHTW--7gbFVI0L+D>iWMAs38L|vHoWcDti#v=Q8$*;7QNP9|GRC$Yu->-jfgQ1#COT`2kk{ z!2(&=rlM8UHlz)Rh5&%AZKr5#<6^+Fs~%U}<5vN@mJBGG2%exVhjQH^y+Dz*-;+b_ zg`7#X9aX240psuj$-w3vbop2gE4l{6t_3t_0LEnliUzhn14f=oOaqG!YSRg*w!tI8 zB?mk3L_wVe2OAKDT(nU!AgunYl=x=4DHXtAiW=r&+l!|!k|2X4-vLMAZ7@95sz-eb$#dQxu1tNx5mP0dO zlqyiTs|)$;pfd; zwP6?#r6}DF2x={CK;%gOq#O^a0(D@33uW7x^KJ+OSQiGAtyq*Zp>`MS|Z z-$e~NRR9<%0}49pSZLd&|6f6#N<^0WM~B6LfnJG~Al(J_=IrgG0)5|`vkxe$zb=i( zXD{F#2b9sw$h)fADQchd{7#AdivF`84BZCQ@ekAVr0e1ZY5~SDY(NXRkABugOg}So z75LFy&j9z(|DGVGpVEGweikS6lNj$cvZVb5BTw4j4O~vO?*b=H`yJ-_aZ3Ita6(lz z$zyZ|p&(cIBi85Qer%e2nUlM(!0Sf-gGK(lk$-KGzhdMkvocfvO(XxtB7ZGK{|_^D z-tx&6&gxUo{LWd>z195QVUZ`PYIo*Y?sR(#rEfEryDjp$VcUQ$=Jzj4)wK*z*^=ZM zU$p3HS^F}1Z`d{;&Q>U7p3$Mm~y8X;`J=SA+YERotp9wNLo^|E6> z;$s7%Os5CPkEY6w7YgTD0sz1V8+h`cmM*jd02r&h>e8tt z$nid0pO>lE1DVTh%>j=BH<-?1o8iiSY2tET_KYHXW9~PMJN-S5<2L=g#qwS4 e|6h-9^71bUR-NfuR^9&q0000