From a6085db0aea69bc4379f1b47587f2ea18279d114 Mon Sep 17 00:00:00 2001 From: Chris Lane Date: Sat, 8 Feb 2020 16:58:45 +0000 Subject: [PATCH 01/21] Add manpage doc --- doc/multimc.1.txt | 62 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 doc/multimc.1.txt diff --git a/doc/multimc.1.txt b/doc/multimc.1.txt new file mode 100644 index 00000000..c2d93880 --- /dev/null +++ b/doc/multimc.1.txt @@ -0,0 +1,62 @@ +MULTIMC(1) +========== +:doctype: manpage + + +NAME +---- +multimc - a launcher and instance manager for Minecraft. + + +SYNOPSIS +-------- +*multimc* ['OPTIONS'] + + +DESCRIPTION +----------- +MultiMC is a custom launcher for Minecraft that allows you to easily manage +multiple installations of Minecraft at once. It also allows you to easily +install and remove mods by simply dragging and dropping. +Here are the current features of MultiMC. + +OPTIONS +------- +*-d, --dir*='DIRECTORY':: + Use 'DIRECTORY' as the MultiMC root. + +*-l, --launch*='INSTANCE_ID':: + Launch the instance specified by 'INSTANCE_ID'. + +*--alive*:: + Write a small 'live.check' file after MultiMC starts. + +*-h, --help*:: + Display help text and exit. + +*-v, --version*:: + Display program version and exit. + +EXIT STATUS +----------- +*0*:: + Success + +*1*:: + Failure (syntax or usage error; configuration error; unexpected error). + +BUGS +---- + + +RESOURCES +--------- +GitHub: + +Main website: + +AUTHORS +------- +peterix + +// vim: syntax=asciidoc From 6753e217a951ddea49f01f57a3e5a01ce4855a7d Mon Sep 17 00:00:00 2001 From: Qaz Date: Wed, 19 Aug 2020 17:40:01 +0200 Subject: [PATCH 02/21] Update planks.png Replace it with the new plank texture --- .../multimc/32x32/instances/planks.png | Bin 461 -> 2299 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/application/resources/multimc/32x32/instances/planks.png b/application/resources/multimc/32x32/instances/planks.png index 7fcf8467c729736996cb5e02dfbdb22f832babce..a94b75029b0a8fd4df03fa99848963354b000429 100644 GIT binary patch delta 2278 zcmV8Gi-<0047(dh`GQ1wVRJSaechcOY^EI-X-VC=EaJ*kSPY%mBRx?93l=Rbc}^%q`D z#wja4xage5%SIbHp%e6Y#r{d!_Rs#}Ifd^p<7!PXh74LWzJK~O?GwgjFSz!g<8@qx zIm2N(niH2p({^sVm3xpF=P^!pI*RA$xETCB)MJL4r(q9ezVkUwNOQCHUEK$)2TDa? zWtdNcVSKWg5t#8#cn5rviLfK%(KjY4G;C-_0zh7lcePsI0eS)X>Zy11SMLpcPIKJ6 zVd*AD=zN?Y`F{+4hxoR!SrPH;1he*!O!Zjf#CtjO<(5l zc)SID-=Byl=%h0!FFNZ3Po_u^wyugS6-rd;>}{ru5G|kV(K2T+(Z+)D966iDlWh-G z_9mJF2H9jj6{xd@S1i=`jeWmN0Xr9hDHEI#mVABGPk)pDX+rMl{CsIjKS+J9vA@%#tYXtKtgsb=RFYZz7DUoNPX z6KR}*F}4K8ePaNE=Ej*0WGy%58fQ8(l0q0kO5;WqYK(zGdlE~f#ocD^SG*|+zv7Mm z#GGo>{U6LJQ1|5R18b$-bGb7%van&Q4YIGq#33m@P;!c8-M%p@S3E=OI>TAW3QDeS zjeq^26%RpTRYLI@W1zAx{@#*|eGY99dfz*Q6VR#l1qH2-1-%37-*KEQeIx~alo5a> zKPFKzSNK{@58pj)+i7CVm;%S^Y#A7}?d-vR#+fe%S35mg-X?n}mJXw}T7AP}hyOja zjS>%xfJE*?hnQ_<$HE-Sitc8HVm46cF@LKtU3lP$i(|pCtoG#l(wCJ+?b&MG*e`<5 zEh5LGmng==cXR=Bc-NA;I={4+fjFeM5Ff`-V0=MOX?SSm{i*b)LZ&(DjpU)D#{YI_ z$7%7Stqu;G;bphnz3D}5!90btRq_GqnFpsrSPca4s_=!oEP4QNyGC ztT~X;?^%0MTWrqT$!+nwXZ6f{Q}O#Os(%5Ccix$qv{S1900D$)LqkwWLqi~Na&Km7 zY-Iodc$|HaJxIeq9K~N-#eX7|4(%Y~5U@H~5WjHLDionYs1;guFuC*#nlvOSE{=k0 z!NHHks)LKOt`4q(Aou~|}?mh0_0scmXsb<$0plX(pP9}tG zZdK@cMGz5$F@!0Jnfjb4rrU7TlmpZjz4DS49tK7n|a>3@bryg@v@Y3ZEz ziKDC}Da7Z*qXu1&_>t?f%Ws^E4*Pj#)X1dgiKE0qv4iCfW+g)@*Z%x1N1-Xk|8-#fTq7t0N&5&n{q(p7U*4bdu#3E^a03FSE(D|;1C!o zQueyXyMvv*{d=a>-w&?Ma=)sNnK1wW00v@9M??Vl0RI605(AxkgONTMe+P6)O+^Rf z2onz{6_1%wHvj+utw}^dR9M5!SItVpKp33*1Ex_4QPCiX)RWMY2M@kO!Mg{KzK{>& z%P1m96g333O`%9VBvaY3pRIb>{Z8G#ui4peW@lShm*-;us73<-K(yQj0JNh;%oBs^ z<4^N%Ztnm93-BCE{K1_Qe~D^T_viP|^?0%h07&8$XTI)?>oqSUFAFE1e+2aG^^3FJ z&8Y}+Csq(C&7UP{U^T!qekk0t+euv{IR04lo&N1KcG?_gzcruz{t@Wx?*Rb1hc%C{ z^CtknLAK>g?8-uG-Yiy>{UHG0K0V1YhoxO&41X>rT-SJPnrXE;2prPw$N2bPDNB8b~7$DE-^4L^m3s900BHnL_t(YOTAXH z5yCJG^fW9$MFA5)M@2!Aj+&M-15nbj1SP}ayHD}vBSir_cPetWl$Wi4$?5&*vOW95 zs9_iOx}UPajn}Pjc&3E_ILGUGlMVTD*48P1*$3a8^l*ZO0Q?*|JFN}Q&Fe)C{7Ue3 zX-Tnb0$h&kFN15uG!`oyo0(>+xH5Qh zq~-wnlHvQ+U0t!>OYkgeU@4g&2D1T_-M4O+jd{&0>JQKTc9o5z;5q1k!|DQj06^KS UNQEq>WB>pF07*qoM6N<$f(dlI<^TWy From 883dbe2933ae5de5cd78e54657a53ee2d601e16c Mon Sep 17 00:00:00 2001 From: Qaz Date: Wed, 19 Aug 2020 17:42:16 +0200 Subject: [PATCH 03/21] Update stone.png --- .../multimc/32x32/instances/stone.png | Bin 438 -> 1866 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/application/resources/multimc/32x32/instances/stone.png b/application/resources/multimc/32x32/instances/stone.png index 34f9a751e4bd663a13a400f2433391a36e0bfe5f..1b6ef7a4343f56efa133c025fc01e10d7f640014 100644 GIT binary patch delta 1841 zcmV-12hRAm1IiAN8Gi-<0047(dh`GQ1QvQ!SaechcOYu5ZR0@nxH!$2MT>EE77lX?Oxa-oo2@V_pGz19=RKyH_19xdQi zjKk6rS~S@dP+m>`UcNRnbZPp&s^5^S;+ z42mr>leG}b?h7w=(_*i1gyqUm6~<H>2_fZ0sz7L)SN*|H1I7J7<)O(CXG#|D51wiV8>1p~&j zRrYLxNMHtz5d>v;F4oBe23S=poD^rR7YY)k+s2x}i>|16>0;C-5TVv1pCTB_Aj>($ z`3WxK41Z;{>QvQh&`6pzd+VK7?|tyS$mL*z3mSX~A%+xkw9!S4K86@$iaANLsDYY% z3Mr}p_^H>@y^{3b6@dB8o%OAo|vOf z-T%QHfx0tq7p&EO&y|I-H48hY#v=Qs=9C?2znU<(=zXZm5O7M&`0Kad+D~EVsLP8C zH-Bx~w8O17f6>$1wo*?%e7hU{1hVw~2G*mC=RnRD$>gI+EkoNJ`VS~bq<;a&8zFJ{ zPkSJ#9p`>Tr)B3=bTqNUVD19k;Mq4@V50X(pTW(~tjT7<&nGC?zHVMwds3mBHOD@u zBLsGHcGmSkVrtud+O+*1N!&y_9k9Y(@_%ZKUaXc45qk=*xF_g$`j7oNQSVP~KdJO> z!s>%hbm2>Wt}FQ@qF*e(Lt*LZbItgWE(evX(4JH5VhJ6q5$E7g-K^FzoyXKdGwriAJUH=xYuVA&0cCxxphvCedC6Ia1#9kUyG1yutlFf0004n zX+uL$Nkc;*aB^>EX>4Tx0C=2zkv&MmKpe$iTg4)k4(%W!lA#KM1yK=4twIqhgj%6h z2a`*`ph-iL;^HW{799LotU9woItDhPrfAWn`>iY`*(|B^zB7!Qv7@$TN^?j7K7 zRG4aZjRUG?8R=v~$mUjso>v4BK^UVLl9;K_iDC+#F$ zXPItT#2duZo0iUbpE$}&l0tk=JZ8`Zi66NxyZpwv=&+w>MvY8*o;XS@6n{Hd?qF6j zRN^V(n4)Tw@6WodaNgpqR%)zuPyWJCURzn_I?X{Ov4|yz5Fn$5GAghTr&S}xM4I*! z9{vHxFOo|pR~d{P3#dYc+S`UD7nYy~c6;#tD{XiHL}8+ji?s)9lvQb&ZIKwrvmhIlSXxe8f-? zBQkVMw9e1xc|KHz-}}4*WUdqQ31CM8hx~c0t#5yJzj!I`#+i$SX_`*EM9+e}R>uQ`tEHH-TlhUpJ}M@q>n5SH zoHf+5lpw>bd+Ox?Yndfr=8>zYGYvClSDF8-(DMq&?V8_oH(jm$uHRj*)SZUBxv*dF z&Q5*4&ne07s+WWrqwIeIz2XwJP7b&l>4Z+1?8YN+xhYxaK5(_BnKvBVtf`X&cNsaQ fTuxBoa<}3i?mgQmyZ_f38Gix*008_L?V|ty00DDSM?wIu&K&6g000DMK}|sb0I`n?{9y$E z000SaNLh0L01m?d01m?e$8V@)0000QbVXQnQ*UN;cVTj608n9RZgehAMN}YmGcGkQ zF)%Rna-jeK0VPR9K~zXfy_Qi9gD?z3IqnXy|Lq35@+91kSAQ9YpwaaUH32(q?6AG| z^$bhV57uK}+UUHyb&_rXaHjkypH-?yRhhm+(xZaq0K(@*_zt=2nS4o+`=f&80PG6l z^JG0I^&aaR75oW6Ff}hmQ>STP)lU^H0U#sq3a>^vsq2-`=(Zey=O}jXeNl~`lN8{l zvMmSboV(vd(to)teDb2&Svy7&0g@rto>S{U(E}ZDq}&G3QEx{9bX?`1Of*+XEwKnd zH&1RumGVQiN)9I4%>Z69o3&PK9UX4E9H1{QKlck0t<$DI0dUlC9`TfGM`9-XYEm*e zcKV%`cLGo|O+(2Q;F*`*G%@vN8CH?5mzI})YElQ1#2_@2-SIoaGW{3`<_iII-#`=L R05Jdn002ovPDHLkV1iYKu4@1Q From f44bab0e0ce7425085a652c800081af3286c8da0 Mon Sep 17 00:00:00 2001 From: Qaz Date: Wed, 19 Aug 2020 17:45:50 +0200 Subject: [PATCH 04/21] Update brick.png --- .../multimc/32x32/instances/brick.png | Bin 713 -> 2388 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/application/resources/multimc/32x32/instances/brick.png b/application/resources/multimc/32x32/instances/brick.png index 0b534366bd0e93d8b414cccd2e080bb2da0a558f..c324fda06304c72b6ca19d95bbfc610b60d22a4b 100644 GIT binary patch delta 2367 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 delta 680 zcmV;Z0$2Ui63GRS86^S$008_L?V|ty00DDSM?wIu&K&6g000DMK}|sb0I`n?{9y%? zUI!R|8gxZibW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE-^4L^m3s900KBkL_t(YOTCtB zOH@%9h0m`EEYu8iyp5JJ4T_2wsUR2_Ar$pR2m(<_9Y-CN@-jE)5|ad(S1|o~E_{yi z+U|U72hWGiKJT1$_UyIxyMy9rulPFLB^dvI%I^rqrLlzA8txVc6G_4R&&htVF%%ak zrL17y)-V%z7nn`7+>z>U7ncVWaW*w5c=RFuSWLIo3uZp{JQ0h1ZNjc#{&`GLGj~Jq zp9C_4o#I_*qlo&VneHZGKZr5)pZi(`yTv>^6t2LdKy@=MDw!3rzqTaKDtS>}Tl#~4 zVtP?9SabZsc-UZNS-wQ8$ z1mm|I4TABf-ezIl#k}>^`*@?U9%C=VBzqT_iaiwRfp$S|k$e+-Bp6?OD~cbJNkI)s zCe>~}j*ELDT!BXc*YBjEw7M*;-`#wF*krix3HQLefa_)4l6~<^;IZ07Qk=gY5>fRw z4OE7wsdoW)_mA?sVrS&3aG%mMh$s0t%xw!+fDi4j?)3v6{9^&Wg;%5hyH*x9;jfzO z1U2*wPJd=Nb8J1U)mlb#vz^1r3ms${IU3hNqJa$YzY=?-tDe+Ej>0u8130wnQdo@^&_7f-o O0000 Date: Wed, 19 Aug 2020 17:45:53 +0200 Subject: [PATCH 05/21] Update diamond.png --- .../multimc/32x32/instances/diamond.png | Bin 708 -> 2444 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/application/resources/multimc/32x32/instances/diamond.png b/application/resources/multimc/32x32/instances/diamond.png index 376ab901aa5eebc0d81508906e41881b3f12888b..1eb26469788c26f4fb96a3a3fad652ca8b6e023c 100644 GIT binary patch delta 2424 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 From bb8869735432b5daa802880c3370689369e0bc3d Mon Sep 17 00:00:00 2001 From: Qaz Date: Wed, 19 Aug 2020 17:45:57 +0200 Subject: [PATCH 06/21] Update gold.png --- .../resources/multimc/32x32/instances/gold.png | Bin 978 -> 2366 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/application/resources/multimc/32x32/instances/gold.png b/application/resources/multimc/32x32/instances/gold.png index 9bedda168a1421bcfd781d9c177af478960a7a88..593410fac9a7a929696dee968e112d24780a01da 100644 GIT binary patch delta 2345 zcmV+^3D)+~2fh-J8Gi-<0047(dh`GQ1*CdZSaechcOY-*mFU#4#-fQf=t<@#x5mCPtrPUFgF$RViA-8jw#}n{l z)WduPPt-{lP+oP>8BZ}{2&{BvoT(<6ZrUu1DS+sxQ9wyl$j-KC0|^y7cyi-0oq`ox z!64Z}O@T9K>BM5DUzz@jiSS$vOvzv}gCQRu^;74cJb$Y9GD2i@JYxl1G?WV%gSqh! zD-dG(=8b27k7v`bZ~B2$!645tM=UVuyr#%(E^XP#vxOa_TwBPfQ1=7~5qvYi7z+lp zHurV5bcto5V_CYWhUOrAzFaubMP>#?6A7)l_^ zIfj0Mi+|8iV#|)1JqM18g_F15dG_81KayMuHn_mShY(_rkfMz)a`Z987$qhlvB-fe zUV=msNr_Z~qlCE<>=RltWt&~*>~qL5OHKvyDXwtwC6rjCq)OFRq>1WlsIf{-&8UV< z(Ol!^TWGOKOC4J4w!6;V_t0aPo=(;_t1r(VuzzMYYc!b}cHv|Vtty0L3Nz9P56-|C zIRnPSU;u)q!I_T6IU39j&a@CV1rtE>;6_z57z2f_8RBkE?k?uO;!SbAAj~tR;oYaWsZ13w4+H4znF71#}>~86y6K4 zlENJBo2LgCcj)SC?5+F=S-oIh;E=40UdGx-rbQn1?je_>taf#&fX)868W&6Hww%1@ z()MtWmvMVpJgJy(d0WdwV6CDRa#B?SFcV&HV-eMCYUjSlI}E$^iyy*4e}w_`Gb zuPub|M#;Cqx4n$WRihS(Gpimr!92@WdtyhH1-XR1cZx}JW_l-{SB$1^|6?Z6K=g7g zIMVq&n_u#{A$*XhderAB&-0MTtBrBbI@;c5aP`aCczJ!X4zjXhBrOQL9jd3ZYhL)xqS_FMnv#kfgXc3a$kQ zKNhPFF3!3-xC(;c2Z)oSlcI~1_`jskBF2N`e!RQ)xO)fq8x^LSUE_eNSw=dU5VE;d zq30DrL=eU(1|??dbE24n=lHsZkFR%ep5=Y+&(WvkO$PV`;#sB}7V!r0^roeA-Y1T- zlB5uy6OS2mLE=ZQ%YQDvaV|RS=b2F>lb$Dz5(~u+mOGf043&6_IHsr?<@>WPE1b7D ztCbpS-IKpCl-E|4xlVHkNi1RsA_T~&p^OSF#A($?F_EVIgol5?@r&e=$yEj;#{#NQ zAvu2VKlt6PS(uz~lR^og`^C0DhJl`4pjo%=?_=9;o&bSo;Al!~`>PFL=9Bb#TZ
mKh8cJ}t~nO1*4f)jGB+;`-K00006VoOIv0Qdm^0RIx5dxMca7=H(JNliruXvdG;^-41d8-@GHD| zFaAIky+{v&QiL=lP*@MmY?(2;+u$MN+%`KI_Pu%YcBA#vsevcr?+sgTCh=Z*GUR`6 z^AP}GfS$u1E4#P>0DqXlIZKGX?%4WZdf8rS^~l$sEB@cfHQ%4#D`S9=M~hpQVA5>+ z{qV|*v@AZnni;-7@H$QCVL(O*xhd-Hen9QR{Mf6N{u!X2k=iZtapFf_m8|!6n#MC$ z$4*m|52~wH1CcmkSLDd2TpMyqmP-IYUByZmAk|ujbM#zJM}LMHuhbyl*B}0Y4+!MH z)GQc5KqD@n(BlKt`_9N6`!3`(ElFA^*T7$q6H?NGy%R*fA_nLMLwA8h=5V-BWJhOA zTf|6RX=8v+*45!$JtyQLttg&?j^18^tKD^b>h%FaWOBc^yI#HaJs^55wX*XOZ4B63 z>h-1d)(RqbAU2k7M0#=6)mjMy&x;BBKqpJmQR{aZq~=|oYrkl%(>nt{);HggL}vFo P00000NkvXXu0mjfZ#IX7 delta 967 zcmV;&133J?64D2d8Gix*008_L?V|ty00DDSM?wIu&K&6g000DMK}|sb0I`n?{9y$E z000SaNLh0L01m?d01m?e$8V@)0000QbVXQnQ*UN;cVTj608n9RZgehAMN}YmGcGkQ zF)%Rna-jeK13^hdK~zXfwbom2R89B2LL1XS zP(h>Lzz1La5Pk$7G@AH;25L)fXQuU%LP#|2bOV+$ojGUD-fJ!Y>kJABiEk(QJ?!Kp z`@b&P$?<;r;$`^p^Os=xOSSpcD{%LlA=p_S1GAn`cgEns@+dsKH3knFNibVe@aXq6 z>~Ck_@!dQGe}C4&i#=fXb_&QW0GkUSf1d~L)|Fq2R8+634wZE3s#l9tRJWu$xkv`g z>Nt3@2ej8yAi>4R+p1pyb|rAG2-cO9Evv8!E~o*AC6Im=xR(aonSk)%B$%~f@L~@z zjTDHjC|3e^ul(6h&NK*|G|&FzA5&8KB;@>Zbl<8sp&M_Lu`2lcq7rTnC~8$idVz{j{jL z$b94+a6boRvyrz{I1jErr-C$?jRar^F$e56lVDvP!mtSc)~i)h7h|24Ag!M7Bg{yc z>D#oTS$}X&Q7{eMnE}#|huh;0$bXt2A4nDz zUk2uPK?W$|mx1@^p?&ihpo7>0@}`*=`s^A0RMaOCv~@$|BgNN%-4$h*K-?we*T6l> zLjSKB2<|0e=lfwm2XP0qa;B9VRLbr{pokFGa9w2J1Ldv)g-a?}1bI>cZqGq)`%O69 z8h?jgYZThwy$*N>aR+RkHJfKy7QnjqlvT_NAiNmCVPP#cfgd{oDw`jDw8cJKL_mRL4tzn71h&!x1w~4e2@coKdF8lf!_KN z=&rs7y`P6*=j&Gi9mE_U-8uDmRy|Cq-9QPj_fA3hM*{rD2y|ACLU-jj*ybsqJ0l>g pC)A3fTgSlOJPP3tN5G3a;2+xG&Ux92*#-ar002ovPDHLkV1gF9x#|D_ From f6097ef2b7385f87354a6fe70153da79ad4e7eaa Mon Sep 17 00:00:00 2001 From: Qaz Date: Wed, 19 Aug 2020 17:45:59 +0200 Subject: [PATCH 07/21] Update iron.png --- .../resources/multimc/32x32/instances/iron.png | Bin 532 -> 1772 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/application/resources/multimc/32x32/instances/iron.png b/application/resources/multimc/32x32/instances/iron.png index 28960782eeae27f740b44365c98fb14d7d4f89e5..3e811bd63f0b02e3246b5c13651a3249e5029229 100644 GIT binary patch delta 1746 zcmV;@1}*uN1ndov8Gi-<0047(dh`GQ1PFRmSaechcOYs44I z9G0Ususbwk<*`~l2MIlIda}z=Y+J|0;LoAv6>3?AGn93gw(XGCV&h$%71jf#DzGxl z%|MMOn-ziC?u0wwNhZRMj7Q%ZQ4nn0iUfc>ZEu%ap8J{YPYv{dgyGzyqQMWQms~w#&2ZkAtn>o#)4X1*> zpDm&Vopb@^RTrJn3PobD(iK^%l&DjivQR;YmK%FW=E7#`g7F-=n8A}BjXHZ1O$CE& z3O8j8)O^H3bKN-CD-^JDC73e78DYxDrhXdyO;f#>0e=zcaA1YFcw{cZ7|e|)tUw6$ z#hXlk_qOQQr~E;xfrZiXhn<<5+nPJl4h>Pt%r#9S=3mrcp)4p`HR5N+8QxLH>9f zkV8p~Sbq_5;w31FlALkYiF3}oamXcay!GOp_dfXOQ!v2>2`=~$LJTQ#G&ln#y69tw zF{Z>SVW9+H3HAw^%-Lj{CA;i%$T6pa^eMJTamANVVo8;&sW>L8tGFGgS!WFw|G+$Zt=$7m{Wtg|ARRN z>Rx$!!&)8RxiT5ss&HVc4XUq;P8?Jksc$(zCKQPk{An#cO%(;1Drmk)by3iZ&#OGv zcz-PKow4e@^;Lqc_XEal&hW`@tH)ntbLpyy?x9h)oZOHb)YPQl_OsH|_a9YJcWtX}si!GJgoo36YKd35nc<0LB%8Ef2GsE@1^+Fpe*w7gjknbSlY#&M0fcEoLr_UWLm+T+Z)Rz1 zWdHzpoPCi!NW(xJ#a~;+B9#v9AnK5zx@bXE#8InIgbJZnXw|{w(l2PzkfgXc3a$kQ zKNhPFF3!3-xC(;c2Z)oSlcI~1_T{x)g6H_UhmWs!ah~OU?$6Pulb$Dz5(~u+mOGf043&6_IHsr?<$wFLE-Re3 zIIEQ!Yu%H-FqGF;mbp%I2uUnr2_gi@sG*DsEW~NmNHLM7{e*{q!10UZlF3yDBgX=& zP$4;f@IUz7ty!3yaFap_p!>zPKZb#xU7%UF?eAmTZk_;vXW&X}`>PFL=9Bb#TZ
Yn*Kroct4|W$^nsEpm)vft+kKS2OvXTrEY+OLtvyx z+3Ozf4tDnT@0nJAKY|l-t=xCyg#Z8m24YJ`L;&~z{{a6IoqL0kJ{W%obV*G`2jmD7 z4=ozy$)qd*007lVL_t(o!|j(%3WG2Zg})XN-H0x#=kWfAkgh$1MI;6h+f|B)Ke3iJ zX)`Msn3piVk4H||qPPRx>Y8!IQN)p&>P<`OpZRim>ZW;~YYlW=H`^bE0f4^m0k~w@ zs!my!hHOB6G)?o-gQb3yrg)&L01!gFCg6Fq{VhG&wuWpVP7(mpG~G40M1$)4zP~yj zgyEl4pvpc9mRzsvetRfba`_ewTkdxh*iXT`GU0c#KsOT{1@=>LG!yKjK-cxUncyfe ohl1%_ZSTwG`A>sjwr~6f9u`)5kYH0D<^TWy07*qoM6N<$f`GzHL;wH) delta 517 zcmV+g0{Z>z4U`0s8Gix*008_L?V|ty00DDSM?wIu&K&6g000DMK}|sb0I`n?{9y$E z000SaNLh0L01m?d01m?e$8V@)0000QbVXQnQ*UN;cVTj608n9RZgehAMN}YmGcGkQ zF)%Rna-jeK0fR|IK~zXfy_QQ(fYnaq%AV+nz8HuDaU>?vp^Q!x{l;#%B@M^VxRaP(rliBIt*IKzh# z`m1;rHG_14GlAden#f9g3;#~*Zn&nJLAn4X!X5Q>kM7#D zfP-T443E)-!OGo*X{K_C*pw$~xvz3QWJNc0TyWmvRJ4hFxM80|a zCgK^7&86*nuCUEbqvuESgr|$GV{eE*RMxt~o5Gx*U#s4{&+qvLH zbYX1CAW?vy_O6d&-Y0nH?RGDC&0QHoQSTs8zz5BDdVJZjHSx|i#XF{1IlN+-;eAo( zz^~5NuaEve1#sjqvL|sT=nYyKUwEWh$R0ccUPN`9W(#ZpsPWA^Vg~K#00000NkvXX Hu0mjfFcRah From 88ce42bc0a170e97f77320e7ee5eb60b8dc0c135 Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Tue, 13 Apr 2021 13:53:21 +0100 Subject: [PATCH 08/21] NOISSUE Sort languages alphabetically by their key This will provide a consistent arrangement of languages in MultiMC. --- api/logic/translations/TranslationsModel.cpp | 25 +++++++------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/api/logic/translations/TranslationsModel.cpp b/api/logic/translations/TranslationsModel.cpp index 401b64d4..29a952b0 100644 --- a/api/logic/translations/TranslationsModel.cpp +++ b/api/logic/translations/TranslationsModel.cpp @@ -17,18 +17,6 @@ const static QLatin1Literal defaultLangCode("en_US"); -static QLocale getLocaleFromKey(const QString &key) { - if(key == "pt") { - return QLocale("pt_PT"); - } - else if (key == "en") { - return QLocale("en_GB"); - } - else { - return QLocale(key); - } -} - enum class FileType { NONE, @@ -45,7 +33,7 @@ struct Language Language(const QString & _key) { key = _key; - locale = getLocaleFromKey(key); + locale = QLocale(key); updated = (key == defaultLangCode); } @@ -310,11 +298,14 @@ void TranslationsModel::reloadLocalFiles() { return; } - beginInsertRows(QModelIndex(), d->m_languages.size(), d->m_languages.size() + languages.size() - 1); + beginInsertRows(QModelIndex(), 0, d->m_languages.size() + languages.size() - 1); for(auto & language: languages) { d->m_languages.append(language); } + std::sort(d->m_languages.begin(), d->m_languages.end(), [](const Language& a, const Language& b) { + return a.key.compare(b.key) < 0; + }); endInsertRows(); } @@ -347,7 +338,7 @@ QVariant TranslationsModel::data(const QModelIndex& index, int role) const { case Column::Language: { - return d->m_languages[row].locale.nativeLanguageName(); + return lang.locale.nativeLanguageName(); } case Column::Completeness: { @@ -362,7 +353,7 @@ QVariant TranslationsModel::data(const QModelIndex& index, int role) const return tr("%1:\n%2 translated\n%3 fuzzy\n%4 total").arg(lang.key, QString::number(lang.translated), QString::number(lang.fuzzy), QString::number(lang.total)); } case Qt::UserRole: - return d->m_languages[row].key; + return lang.key; default: return QVariant(); } @@ -459,7 +450,7 @@ bool TranslationsModel::selectLanguage(QString key) * In a multithreaded application, the default locale should be set at application startup, before any non-GUI threads are created. * This function is not reentrant. */ - QLocale locale = getLocaleFromKey(langCode); + QLocale locale = QLocale(langCode); QLocale::setDefault(locale); // if it's the default UI language, finish From 663a1a5a8383dd60ef3cf2c54ba8e8edca12c552 Mon Sep 17 00:00:00 2001 From: kb1000 Date: Tue, 1 Jun 2021 22:57:07 +0200 Subject: [PATCH 09/21] Add xrandr to the dependencies of the RPM package --- application/package/rpm/MultiMC5.spec | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/application/package/rpm/MultiMC5.spec b/application/package/rpm/MultiMC5.spec index 5b72c781..78b9000e 100644 --- a/application/package/rpm/MultiMC5.spec +++ b/application/package/rpm/MultiMC5.spec @@ -1,13 +1,13 @@ Name: MultiMC5 Version: 1.4 -Release: 1%{?dist} +Release: 2%{?dist} Summary: A local install wrapper for MultiMC License: ASL 2.0 URL: https://multimc.org BuildArch: x86_64 -Requires: zenity qt5-qtbase wget +Requires: zenity qt5-qtbase wget xrandr Provides: multimc MultiMC multimc5 %description @@ -37,6 +37,8 @@ install -m 0644 ../ubuntu/multimc/usr/share/metainfo/multimc.metainfo.xml %{buil %changelog +* Tue Jun 01 2021 kb1000 - 1.4-2 +- Add xrandr to the dependencies * Tue Dec 08 00:34:35 CET 2020 joshua-stone - Add metainfo.xml for improving package metadata From 665b9213c65fab4da667aadeb592bc52da530c6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebast=C3=ADan?= Date: Fri, 25 Jun 2021 20:15:19 -0500 Subject: [PATCH 10/21] NOISSUE Fix typo and remove SSH URL --- BUILD.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BUILD.md b/BUILD.md index 4360fdde..f6b66e70 100644 --- a/BUILD.md +++ b/BUILD.md @@ -12,7 +12,7 @@ Build Instructions # Note MultiMC is a portable application and is not supposed to be installed into any system folders. -That would be anything outside your home folder. Before runing `make install`, make sure +That would be anything outside your home folder. Before running `make install`, make sure you set the install path to something you have write access to. Never build this under an administrator/root level account. Don't use `sudo`. It won't work and it's not supposed to work. @@ -22,7 +22,7 @@ an administrator/root level account. Don't use `sudo`. It won't work and it's no Clone the source code using git and grab all the submodules: ``` -git clone git@github.com:MultiMC/MultiMC5.git +git clone https://github.com/MultiMC/MultiMC5.git git submodule init git submodule update ``` From e883cf2359428a46970437d0fa5fee676f130fcd Mon Sep 17 00:00:00 2001 From: Hamish Arblaster Date: Fri, 2 Jul 2021 09:19:55 +1000 Subject: [PATCH 11/21] GH-2529 Move data path on macOS to MultiMC.app/Data macOS seems to dislike changing files in the APPBUNDLE.app/Contents directory because it has to re-scan the directory every launch. As a result, large amounts of data there seems to cause freezes of MultiMC. Moving the default location outside of this directory, and thus the data, stops these freezes. There is also a dialogue when the user first opens the app that asks them if they'd like to migrate their data folder, if they select yes it will move it, and if they select no it will not move it and allow them to move it later with an option in settings. --- application/MultiMC.cpp | 61 ++++++++++++++++++++++++ application/pages/global/MultiMCPage.cpp | 17 +++++++ application/pages/global/MultiMCPage.h | 1 + application/pages/global/MultiMCPage.ui | 7 +++ 4 files changed, 86 insertions(+) diff --git a/application/MultiMC.cpp b/application/MultiMC.cpp index 2dd4f83f..932c7a76 100644 --- a/application/MultiMC.cpp +++ b/application/MultiMC.cpp @@ -262,6 +262,10 @@ MultiMC::MultiMC(int &argc, char **argv) : QApplication(argc, argv) xdgDataHome = QDir::homePath() + QLatin1String("/.local/share"); dataPath = xdgDataHome + "/multimc"; adjustedBy += "XDG standard " + dataPath; +#elif defined(Q_OS_MAC) + QDir foo(FS::PathCombine(applicationDirPath(), "../../Data")); + dataPath = foo.absolutePath(); + adjustedBy += "Fallback to special Mac location " + dataPath; #else dataPath = applicationDirPath(); adjustedBy += "Fallback to binary path " + dataPath; @@ -306,6 +310,63 @@ MultiMC::MultiMC(int &argc, char **argv) : QApplication(argc, argv) return; } +#if defined(Q_OS_MAC) + // move user data to new location if on macOS and it still exists in Contents/MacOS + QDir fi(applicationDirPath()); + QString originalData = fi.absolutePath(); + // if the config file exists in Contents/MacOS, then user data is still there and needs to moved + if (QFileInfo::exists(FS::PathCombine(originalData, "multimc.cfg"))) + { + if (!QFileInfo::exists(FS::PathCombine(originalData, "dontmovemacdata"))) + { + QMessageBox::StandardButton askMoveDialogue; + askMoveDialogue = QMessageBox::question(nullptr, "MultiMC 5", "Would you like to move application data to a new data location? It will improve MultiMC's performance, but if you switch to older versions it will look like instances have disappeared. If you select no, you can migrate later in settings. You should select yes unless you're commonly switching between different versions of MultiMC (eg. develop and stable).", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes); + if (askMoveDialogue == QMessageBox::Yes) + { + qDebug() << "On macOS and found config file in old location, moving user data..."; + QDir dir; + QStringList dataFiles { + "*.log", // MultiMC-@.log + "accounts.json", + "accounts", + "assets", + "cache", + "icons", + "instances", + "libraries", + "meta", + "metacache", + "mods", + "multimc.cfg", + "themes", + "translations" + }; + QDirIterator files(originalData, dataFiles); + while (files.hasNext()) { + QString filePath(files.next()); + QString fileName(files.fileName()); + if (!dir.rename(filePath, FS::PathCombine(dataPath, fileName))) + { + qWarning() << "Failed to move " << fileName; + } + } + } + else + { + dataPath = originalData; + QDir::setCurrent(dataPath); + QFile file(originalData + "/dontmovemacdata"); + file.open(QIODevice::WriteOnly); + } + } + else + { + dataPath = originalData; + QDir::setCurrent(dataPath); + } + } +#endif + /* * Establish the mechanism for communication with an already running MultiMC that uses the same data path. * If there is one, tell it what the user actually wanted to do and exit. diff --git a/application/pages/global/MultiMCPage.cpp b/application/pages/global/MultiMCPage.cpp index 80d5c544..d383e6ed 100644 --- a/application/pages/global/MultiMCPage.cpp +++ b/application/pages/global/MultiMCPage.cpp @@ -29,6 +29,9 @@ #include "BuildConfig.h" #include "themes/ITheme.h" +#include +#include + // FIXME: possibly move elsewhere enum InstSortMode { @@ -78,6 +81,13 @@ MultiMCPage::MultiMCPage(QWidget *parent) : QWidget(parent), ui(new Ui::MultiMCP } connect(ui->fontSizeBox, SIGNAL(valueChanged(int)), SLOT(refreshFontPreview())); connect(ui->consoleFont, SIGNAL(currentFontChanged(QFont)), SLOT(refreshFontPreview())); + + //move mac data button + QFile file(QDir::current().absolutePath() + "/dontmovemacdata"); + if (!file.exists()) + { + ui->migrateDataFolderMacBtn->setVisible(false); + } } MultiMCPage::~MultiMCPage() @@ -146,6 +156,13 @@ void MultiMCPage::on_modsDirBrowseBtn_clicked() ui->modsDirTextBox->setText(cooked_dir); } } +void MultiMCPage::on_migrateDataFolderMacBtn_clicked() +{ + QFile file(QDir::current().absolutePath() + "/dontmovemacdata"); + file.remove(); + QProcess::startDetached(qApp->arguments()[0]); + qApp->quit(); +} void MultiMCPage::refreshUpdateChannelList() { diff --git a/application/pages/global/MultiMCPage.h b/application/pages/global/MultiMCPage.h index e81832eb..fae75bf2 100644 --- a/application/pages/global/MultiMCPage.h +++ b/application/pages/global/MultiMCPage.h @@ -67,6 +67,7 @@ slots: void on_instDirBrowseBtn_clicked(); void on_modsDirBrowseBtn_clicked(); void on_iconsDirBrowseBtn_clicked(); + void on_migrateDataFolderMacBtn_clicked(); /*! * Updates the list of update channels in the combo box. diff --git a/application/pages/global/MultiMCPage.ui b/application/pages/global/MultiMCPage.ui index ea034919..4ad20242 100644 --- a/application/pages/global/MultiMCPage.ui +++ b/application/pages/global/MultiMCPage.ui @@ -157,6 +157,13 @@ + + + + Move MultiMC data to new location (will restart MultiMC) + + + From 20c393321c894adb4cb938a3f865f331c985cda9 Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Thu, 1 Jul 2021 19:24:29 +0100 Subject: [PATCH 12/21] NOISSUE Use constants for user agents Here lies yet another early-stage move to debrand the MultiMC codebase, as well as reducing the burden of updating strings across the codebase for a future MultiMC6. --- api/logic/net/Download.cpp | 3 ++- api/logic/net/PasteUpload.cpp | 3 ++- api/logic/screenshots/ImgurAlbumCreation.cpp | 2 +- api/logic/screenshots/ImgurUpload.cpp | 2 +- buildconfig/BuildConfig.h | 5 +++++ 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/api/logic/net/Download.cpp b/api/logic/net/Download.cpp index 340f8657..3f183b7d 100644 --- a/api/logic/net/Download.cpp +++ b/api/logic/net/Download.cpp @@ -15,6 +15,7 @@ #include "Download.h" +#include "BuildConfig.h" #include #include #include @@ -94,7 +95,7 @@ void Download::start() return; } - request.setHeader(QNetworkRequest::UserAgentHeader, "MultiMC/5.0"); + request.setHeader(QNetworkRequest::UserAgentHeader, BuildConfig.USER_AGENT); QNetworkReply *rep = ENV.qnam().get(request); diff --git a/api/logic/net/PasteUpload.cpp b/api/logic/net/PasteUpload.cpp index 3526e207..cb470c49 100644 --- a/api/logic/net/PasteUpload.cpp +++ b/api/logic/net/PasteUpload.cpp @@ -5,6 +5,7 @@ #include #include #include +#include PasteUpload::PasteUpload(QWidget *window, QString text, QString key) : m_window(window) { @@ -34,7 +35,7 @@ bool PasteUpload::validateText() void PasteUpload::executeTask() { QNetworkRequest request(QUrl("https://api.paste.ee/v1/pastes")); - request.setHeader(QNetworkRequest::UserAgentHeader, "MultiMC/5.0 (Uncached)"); + request.setHeader(QNetworkRequest::UserAgentHeader, BuildConfig.USER_AGENT_UNCACHED); request.setRawHeader("Content-Type", "application/json"); request.setRawHeader("Content-Length", QByteArray::number(m_jsonContent.size())); diff --git a/api/logic/screenshots/ImgurAlbumCreation.cpp b/api/logic/screenshots/ImgurAlbumCreation.cpp index ff9ec6fd..07ae6fe1 100644 --- a/api/logic/screenshots/ImgurAlbumCreation.cpp +++ b/api/logic/screenshots/ImgurAlbumCreation.cpp @@ -20,7 +20,7 @@ void ImgurAlbumCreation::start() { m_status = Job_InProgress; QNetworkRequest request(m_url); - request.setHeader(QNetworkRequest::UserAgentHeader, "MultiMC/5.0 (Uncached)"); + request.setHeader(QNetworkRequest::UserAgentHeader, BuildConfig.USER_AGENT_UNCACHED); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); request.setRawHeader("Authorization", "Client-ID 5b97b0713fba4a3"); request.setRawHeader("Accept", "application/json"); diff --git a/api/logic/screenshots/ImgurUpload.cpp b/api/logic/screenshots/ImgurUpload.cpp index 1585b061..062c589f 100644 --- a/api/logic/screenshots/ImgurUpload.cpp +++ b/api/logic/screenshots/ImgurUpload.cpp @@ -23,7 +23,7 @@ void ImgurUpload::start() finished = false; m_status = Job_InProgress; QNetworkRequest request(m_url); - request.setHeader(QNetworkRequest::UserAgentHeader, "MultiMC/5.0 (Uncached)"); + request.setHeader(QNetworkRequest::UserAgentHeader, BuildConfig.USER_AGENT_UNCACHED); request.setRawHeader("Authorization", "Client-ID 5b97b0713fba4a3"); request.setRawHeader("Accept", "application/json"); diff --git a/buildconfig/BuildConfig.h b/buildconfig/BuildConfig.h index 66d05ae0..07d7a23a 100644 --- a/buildconfig/BuildConfig.h +++ b/buildconfig/BuildConfig.h @@ -31,6 +31,11 @@ public: /// URL for the updater's channel QString CHANLIST_URL; + /// User-Agent to use. + QString USER_AGENT = "MultiMC/5.0"; + /// User-Agent to use for uncached requests. + QString USER_AGENT_UNCACHED = "MultiMC/5.0 (Uncached)"; + /// Google analytics ID QString ANALYTICS_ID; From 4401b9e137a92effb566a82cbe4b904b545f0cdf Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Thu, 1 Jul 2021 19:49:38 +0100 Subject: [PATCH 13/21] NOISSUE Specify Imgur client ID at build time --- CMakeLists.txt | 3 +++ api/logic/screenshots/ImgurAlbumCreation.cpp | 2 +- api/logic/screenshots/ImgurUpload.cpp | 2 +- buildconfig/BuildConfig.cpp.in | 1 + buildconfig/BuildConfig.h | 5 +++++ 5 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bcf931c0..5e3d6cea 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -75,6 +75,9 @@ set(MultiMC_META_URL "https://meta.multimc.org/v1/" CACHE STRING "URL to fetch M # paste.ee API key set(MultiMC_PASTE_EE_API_KEY "utLvciUouSURFzfjPxLBf5W4ISsUX4pwBDF7N1AfZ" CACHE STRING "API key you can get from paste.ee when you register an account") +# Imgur API Client ID +set(MultiMC_IMGUR_CLIENT_ID "5b97b0713fba4a3" CACHE STRING "Client ID you can get from Imgur when you register an application") + # Google analytics ID set(MultiMC_ANALYTICS_ID "UA-87731965-2" CACHE STRING "ID you can get from Google analytics") diff --git a/api/logic/screenshots/ImgurAlbumCreation.cpp b/api/logic/screenshots/ImgurAlbumCreation.cpp index 07ae6fe1..1f195f00 100644 --- a/api/logic/screenshots/ImgurAlbumCreation.cpp +++ b/api/logic/screenshots/ImgurAlbumCreation.cpp @@ -22,7 +22,7 @@ void ImgurAlbumCreation::start() QNetworkRequest request(m_url); request.setHeader(QNetworkRequest::UserAgentHeader, BuildConfig.USER_AGENT_UNCACHED); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); - request.setRawHeader("Authorization", "Client-ID 5b97b0713fba4a3"); + request.setRawHeader("Authorization", QString("Client-ID %1").arg(BuildConfig.IMGUR_CLIENT_ID).toStdString().c_str()); request.setRawHeader("Accept", "application/json"); QStringList hashes; diff --git a/api/logic/screenshots/ImgurUpload.cpp b/api/logic/screenshots/ImgurUpload.cpp index 062c589f..7e95d5ca 100644 --- a/api/logic/screenshots/ImgurUpload.cpp +++ b/api/logic/screenshots/ImgurUpload.cpp @@ -24,7 +24,7 @@ void ImgurUpload::start() m_status = Job_InProgress; QNetworkRequest request(m_url); request.setHeader(QNetworkRequest::UserAgentHeader, BuildConfig.USER_AGENT_UNCACHED); - request.setRawHeader("Authorization", "Client-ID 5b97b0713fba4a3"); + request.setRawHeader("Authorization", QString("Client-ID %1").arg(BuildConfig.IMGUR_CLIENT_ID).toStdString().c_str()); request.setRawHeader("Accept", "application/json"); QFile f(m_shot->m_file.absoluteFilePath()); diff --git a/buildconfig/BuildConfig.cpp.in b/buildconfig/BuildConfig.cpp.in index 577bdcb2..60d417a6 100644 --- a/buildconfig/BuildConfig.cpp.in +++ b/buildconfig/BuildConfig.cpp.in @@ -33,6 +33,7 @@ Config::Config() VERSION_STR = "@MultiMC_VERSION_STRING@"; NEWS_RSS_URL = "@MultiMC_NEWS_RSS_URL@"; PASTE_EE_KEY = "@MultiMC_PASTE_EE_API_KEY@"; + IMGUR_CLIENT_ID = "@MultiMC_IMGUR_CLIENT_ID@"; META_URL = "@MultiMC_META_URL@"; BUG_TRACKER_URL = "@MultiMC_BUG_TRACKER_URL@"; diff --git a/buildconfig/BuildConfig.h b/buildconfig/BuildConfig.h index 07d7a23a..185bebad 100644 --- a/buildconfig/BuildConfig.h +++ b/buildconfig/BuildConfig.h @@ -65,6 +65,11 @@ public: */ QString PASTE_EE_KEY; + /** + * Client ID you can get from Imgur when you register an application + */ + QString IMGUR_CLIENT_ID; + /** * MultiMC Metadata repository URL prefix */ From 66fde9e6b7cfb9fe7cdf30b0aa0432cd892b6a7a Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Tue, 13 Jul 2021 15:42:44 +0100 Subject: [PATCH 14/21] NOISSUE Correct trending URL string for Technic packs This seems to have just been an inadvertent mistake when copy-pasting. This commit just removes an annoying warning. --- application/pages/modplatform/technic/TechnicModel.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/application/pages/modplatform/technic/TechnicModel.cpp b/application/pages/modplatform/technic/TechnicModel.cpp index a240a94a..def30783 100644 --- a/application/pages/modplatform/technic/TechnicModel.cpp +++ b/application/pages/modplatform/technic/TechnicModel.cpp @@ -95,9 +95,7 @@ void Technic::ListModel::performSearch() NetJob *netJob = new NetJob("Technic::Search"); QString searchUrl = ""; if (currentSearchTerm.isEmpty()) { - searchUrl = QString( - "https://api.technicpack.net/trending?build=multimc" - ).arg(currentSearchTerm); + searchUrl = "https://api.technicpack.net/trending?build=multimc"; } else { From d63ef939bec200f9c510cbc2ae50531802ff7bfc Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Tue, 13 Jul 2021 16:02:04 +0100 Subject: [PATCH 15/21] NOISSUE Update Patreon logo The logo was taken from Patreon's brand assets [1] archive, and shrunk to size with KolourPaint. [1] https://www.patreon.com/brand --- .../resources/multimc/16x16/patreon.png | Bin 682 -> 840 bytes .../resources/multimc/22x22/patreon.png | Bin 976 -> 939 bytes .../resources/multimc/24x24/patreon.png | Bin 1034 -> 977 bytes .../resources/multimc/32x32/patreon.png | Bin 1450 -> 1086 bytes .../resources/multimc/48x48/patreon.png | Bin 2317 -> 1390 bytes .../resources/multimc/64x64/patreon.png | Bin 3212 -> 1667 bytes 6 files changed, 0 insertions(+), 0 deletions(-) diff --git a/application/resources/multimc/16x16/patreon.png b/application/resources/multimc/16x16/patreon.png index cde2b326d1ad6d8e36a4e1ca0ba189cfea87d04f..9150c478fae1b5da24d9c6c4921413e186571b1b 100644 GIT binary patch delta 817 zcmV-11J3-a1;_@FB!A&)Lqkw=Qb$4n02q~HU|>AW00c}93=Fw>B}GB*P6`o`Q3?!5 zAThbPfB`pPWMKGq4MZ|9T-FUNVdcl878~F!0$K>9KLD{vI+)GK0%9jY*b*Ric}YPD zkgWq^Cl?ff*gzLE@DzmvIRn`~K(<0U5<3ZroswFd3}oj3*?;i}zva(oV6gbYz`#5a zA(k|afnj?)1B1jJgqX@g1_u6C28L~y5n`YH!Tx0wJ5-WdQ34Y2(|2SjNGwVOOEZH4 zG%byR;nQ*k2Hr>p2H^_~3|!F=cYpzFF)*M>3@1VW0CLzigrgrvvj6}932;bRa{vGr z5&!@f5&>tQ(tlC_007;3R9JLaO-wptZ*4ANWN%_+E_iKl000=3Wl+lwf-n%g^A$}! z(*@K6P2nQ(W;C9>0v07oOWGRh-%EL!XivMd)0x?2mfEImxXF=io8h^cEu&)I(Z-ggPU8-LSMfUfIEw z?-{;+3zJ)4=+!7P>ttM)s%}j!1#*2}$d^elo;c$hjZ9sAorESsXi~}s+yp`rz@qKs z9ZHX?=DoAiPeTTO*qjA^!i<~3v})=xSk9JuA98A9@=(5APXGV`BuPX;R5*>Lk+Dhx zQ4~baJbxCu6n08_u~*SbHc6L_*jm|(g;o{{R(^u`88(}UAc>1M!A7waY(%h;G$KLb zUJKozyj@Aiz^m@exx;-hp=6b40dxU?X;Vqu%!XErDx_`)v51*N++ud3%T_D%IIsX| z`un9*!*De^B2^o)4wR8*L3L1UmB#TefG?{>8-L*Tk>q!lkhZNFZ50AA9Rhy%kKBQQ z^8gmsXE5gf4+BspY|Qx$Qdi2Yp5L_O1KisaSbv0gO7Q;Z0hApF8gxZibW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE-^7j^FlWO00J3F zL_t(IPkobJXw7jL$B#mk8@X}Gg}kJ*ElP?jZV-jSnX?cpN`EqYAUF3d|_!?fn?Z1(Ye&h!5#FUM2g{=et#`+uJ2_xvJ%3Q!=Vgf1Zy zz|QqTeh~Jz$T?bQV4#192N&V|J~&+h&E;^V2HLN}U}i`$$1OHUa|x1f(ftq(uY}rV zkc>l1CA3z-$$w3bQ=8%SQ-yL<7!{;v2^x6O4twW9VgcO0pu)dfpi3sL3a-J4^>B2x zNS>HA6($#C%icc^_RN7d9p-fDc`tkj6vzt|Zpy~-Rf&!2 zziyRAw-(OshHoF;cefP|%!hmDOgm--T^w2t8^=R`pMM!esU&O1s9)%tGX7I90CPDdh+47)rCRELaU9+I~v&R_W!Nqn;8-dE7>H#M2oD z6pw=~6JXn9D3iZb-`+1CQ@zM5%SjNEIYfLotQ({2UE%(|9uZH}jTD>Kk(jnqv{(*T7c4b^P+=a<>!8-lO0Y1Ayyb`@rieCqbV5IbkUk(hcu6P9hS s^0#+jEBQa@AAW00c}93=Fw>B}GB*P6`o`Q3?!5 zAThbPfB`pPWMKGq4MZ|9T-FUNVdcl878~F!0$K>9KLD{vI+)GK0%9jY*b*Ric}YPD zkgWq^Cl?ff*gzLE@DzmvIRn`~K(<0U5<3ZroswFd3}oj3*?;i}zva(oV6gbYz`#5a zA(k|afnj?)1B1jJgqX@g1_u6C28L~y5n`YH!Tx0wJ5-WdQ34Y2(|2SjNGwVOOEZH4 zG%byR;nQ*k2Hr>p2H^_~3|!F=cYpzFF)*M>3@1VW0CLzigrgrvvj6}932;bRa{vGr z5&!@f5&>tQ(tlC_007;3R9JLaO-wptZ*4ANWN%_+E_iKl000=3Wl+lwf-n%g^A$}! z(*@K6P2nQ(W;C9>0v07oOWGRh-%EL!XivMd)0x?2mfEImxXF=io8h^cEu&)I(Z-ggPU8-LSMfUfIEw z?-{;+3zJ)4=+!7P>ttM)s%}j!1#*2}$d^elo;c$hjZ9sAorESsXi~}s+yp`rz@qKs z9ZHX?=DoAiPeTTO*qjA^!i<~3v})=xSk9JuA98A9@=(5APXGV`he*)iFz3 zQ5eSY|9^W3C~_4CQ7B{*KS6a+p^bNthMF#gQb&i5egKzFE_N%@!L5s<5J?P@Lbxrc zi?)kjK)N`q2sV124mTo7y!R%U!3Xa0o^yWZJ@0a%M==1+l|Ew(#3k)nqgrXVS+5o* za2DdoBY%b2G5+F*MbX8>y}1^@42-mDUx9nD!hhm8 zbbWiqr9DaE+ZmKQ1d5nhn@0};tGK}(6$<^CV9maJ0d5;(IIRI-9t*x@>$uOaayOzZ zS<>s$R3fZGApjOTK*7v#`jiMmFbUTG`1+&xYzoX+$7r04(J$_8HVkxtut z5@MHTbJ~8@|K65!>79T@)v{hL)EVRhju0siTwxsJ*|MLNgNJ7_!2otty#&6uzSN|S rqT4(_IG(Xszxy?@*Q?8(B>w>pdUZm39}bY!00000NkvXXu0mjf`e=_h delta 954 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 bTD15OnQqQ+%qp!500000NkvXXu0mjfT>Vs> diff --git a/application/resources/multimc/64x64/patreon.png b/application/resources/multimc/64x64/patreon.png index 7b4814ec6d654099277a0e157ac5e145e65aa5b6..ef5d690ebf9e4dd895df66a08203c90271a5634d 100644 GIT binary patch delta 1650 zcmV-&295cQ8G{XwB!A&)Lqkw=Qb$4n02q~HU|>AW00c}93=Fw>B}GB*P6`o`Q3?!5 zAThbPfB`pPWMKGq4MZ|9T-FUNVdcl878~F!0$K>9KLD{vI+)GK0%9jY*b*Ric}YPD zkgWq^Cl?ff*gzLE@DzmvIRn`~K(<0U5<3ZroswFd3}oj3*?;i}zva(oV6gbYz`#5a zA(k|afnj?)1B1jJgqX@g1_u6C28L~y5n`YH!Tx0wJ5-WdQ34Y2(|2SjNGwVOOEZH4 zG%byR;nQ*k2Hr>p2H^_~3|!F=cYpzFF)*M>3@1VW0CLzigrgrvvj6}932;bRa{vGr z5&!@f5&>tQ(tlC_007;3R9JLaO-wptZ*4ANWN%_+E_iKl000=3Wl+lwf-n%g^A$}! z(*@K6P2nQ(W;C9>0v07oOWGRh-%EL!XivMd)0x?2mfEImxXF=io8h^cEu&)I(Z-ggPU8-LSMfUfIEw z?-{;+3zJ)4=+!7P>ttM)s%}j!1#*2}$d^elo;c$hjZ9sAorESsXi~}s+yp`rz@qKs z9ZHX?=DoAiPeTTO*qjA^!i<~3v})=xSk9JuA98A9@=(5APXGV}Ur9tkRCt{2np9v_P_$UI_#j51 zLQ7B)G*_&cOeVBqK?qWmLW>Q)7^Dv+X(G+c`F%*DGn30q(!J+IIv*skZ)>gdpLO;= zd(VLi6)N1wSZ+ay@QZHQaZ+)bIkH8%fGv*jQVRl26e z_B5!AD|}%;_fD-ghIsKV?hzP`?fZbkgxRf_8CXF+E{OqEz)rB8+`ua$){F2xU2%GG5Ip_;4H?Y4lcZq zErfijMDn=mk{e1LR2Bimo|qEJPY}nz)_ZegW|$pdlMSnR_id#N@h*Va6QgnZ1ZFRI zxa*5!)H9PARzqvi70rJJG){j6w$HntLVt|=2x5I|Zr-?DH?IPyq5UA(L7zT~@CY+i zpDowHn*d65)Dm!%QWrO07*DIAw4*tHF*-nCr^Y$Sfu^M#e}Gr+R@%YU}s zuM`XS7gl+A1gyioO-G0a^+a3VZr7;*YHYa&=`NQxonmIJ%b%RxW`N>#Yc~DoQBap# zbSr@AUZ?haP!OZz46r+#+Vg?Pi_vigu*s=CADF6hi;gp({3lE+Cx41^9k7#=TF>Mi zpt=@d+_63PC_hHmbHD|s_IywfqkmfgGTBl7J-}b1gc{8)x)mVZ|0{6WsZEziA`H{H zRZayk$N~c{Z92tljCB9G+$#6Wmco-rYx6NMby>k9>Ry1MzV9(xgOi~$%vfh(t#bhk zLPFkMds$#zmhSnzu-4O?+r;M>=Zg0$8&ia_*B5K>B7mh*8I*mA*-0^4B!7Y4veY-1 z7HjtQ?ruW^r$O)dvR`^2Hp1Y|N0w^#yLlPxeFLe_tB>UwBh2nKzFIO9y$WCua{1a` z(1=ezOE69*Y_U}TpUZXfzJ0Y{PF*FOY(@Icx3B-u7@06(>Av5J^(@Q&-BPJZG?@fG z@Vh)ph+!<)R?5Xg8NU#*RDUXCgFUYhS{rc5gNrE?yvoq}Ci|hg)lXR0N1RfT+3Q w1<2nFNk4)u`0-!?F|FMnKr2+JP+pF8gxZibW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE-^7j^FlWO01Nv` zL_t(|Ue%ikxK&jZ#~qu@Y%(j;GMi`3=6RmXY_ensM43Sm5q|_Ehy+1EL?q0N!~t;X z6Okb`Q%q13kVH^K5zP=$P(eV1R{!7Gd*8dyaPNKa-hI6H|Gxi+zI)C-XaDzFYp=ET zy?fOYW(MCQo+yqMXNvz8*NHES0o%l<#rwq@#B;@8iHD1Rv{nMW@IK;K#S6t%Vq@?> zaiut3{GzzGe}7ENgI?~<;sEh6v0gxoGsHLg$L@LPWtjLV@kOz@@Vq!&JjlOB^Ft5c zSL`Kj5F3W=Tg{$YVfMf+W(%(|n}50E-Pf8e`@7lNhs|DzLqkoh7rTi2_}6M4=z$*+ z?-r}$rHy6_W|;k{v)S37F+1(Oa*|J&4f~SWh;Peoet)3QD4zRWt*64qz@yCie!%Rv zUoe}}!|dL_nr+?W2dj$t;*tLK>IXdpb`Up<#n`#SZ1F6!amSnWezzv`d9w?CDG{_# zmv%M#b9Xnnzw|V_thd?JQ_U_vP3&WKMPIWk<>FWMGy7vFvva=b1iA3nvYJ~J5{Zcw z@q(xe>wmOsXkbkK0S_ z76~G6DhYxZr%Mb3kr>>A1)cp_vwNh1d(-=1PRt5L9iM`_}y2`Rxk1o zFT^x)fB*W8g9c*qa~L&;m$$f=?EVht$E-R6jQ_c8)UykUbf9M1m6AL0Sc=?+rDcPNC_P8?M^^a>e zSN03}Z~nG)p4qJzJCjevkJw#&{J=UGbAOyfKK=b>Pmp03Vx;J2wF}TqdU^ra!@IoI zZB<0+5#MrK+Q{!XH;4scb?>~w?71iX&AWj0Ys~JFD>KPb{P5P15=7R4MfFnIu<9Ov za|#5;6a2Iq2Hn6upWo_O`Oa@~E6=_?{A*^v|GM}MC&oEm49tA-P1XFf;n=P^X@7~v z!VOCCqrhEouU_wxB|PA7Oo7bt2tU2*(1rN@LhecdpYQ&5`TfymLzT#o%nbXo_d~=G z5n`TdplvVto0ys)&WEiae z5G6MxIJm)36=?{9|F2x&Z>S?4x_{G6JOtE4kZ8NbBC*V!ulO5M=;Wta3|&BBlh5tL zRyX(<$B>jj1R>hvv&{vpkvI^x+tLo>t)uS;&90|b%7LE4fquGq=tHWyG*G+P(yd~%t;IE5j8x@qVGR)0TT(vsd{ z`uNoV{mXwNL=XdWV+-3;Si90qI+uS)0Nj$moX2xw-U{?bni*-3+jn|{OLoZdA=Mm2 zgcTHFyNFGC{vs7iv&NWB*CVH&Wj1@9%MZ3t&+H=DmP76llCd!o13|hR?8eQbx1Y9y z{y-Zm-N|9~@g-7Da(oILn16^N&ZOpOAShmzD4S+w*hP3*qBeOySsf`bD@Q!RkCzj$ zcL6tyDCZw>G8Te#9uJCs_JaP09$p%hv>jjPB7eURdrAm6T&BORaz&iNx<}p0uxk*h zlk84=cSvGFz8?x7{$)EQsBLIqY{9Bnagwo-BxB+zFUZLUnLSe2x_>yvPd^cW24))g z6OkV)I0H(Egc4%m)&8Oyz&yDJ0YW_xD#cPlqhu!J{UkeNepm$}5od~DK9BiR%L!SW zow9HgSb2;JlZWZZ3M$n{_+H z6&pc_xs`h&C1Cc%4t9x<9w%n$eKaYSh}=YNUoi$jk}Qv;#+S?diwMtilu!dVj&|AU zuqZo45ZqwdZT_MXc8Z4}fR-Qw)JK58P6uj2T1|vta@9b45Zdib{%RxeIxry*VMtwM?3K_15;04FwS5anY5V7vX?;I*)1 zwkt|PwwR>Nyi`;>gd!^O*HB4@DDDM`-DSM21M4fU_R3)ALf~w=P8=xC35Fs7$5my} zx^Dlfya143ReuXi0+Wri#*jYqVx<})2;$AO6u=O~NAZ%oND%&xJJbRV)@-`YyHLXC zdx_IEt0WkdLEpY;@{nq*8a6%aQqYh%B?*(y9)lo*gCJN(5JV=Mm}~Ie5X5koD1H!> zYX#t2CYOZ|;={H|bzao_rLj=6N)9T^p#5AldARg%{(qthSahQ+nM2MHCr<++K?cTx zM5~nu;(fR%ew?a!UCRx~U*dF~#Ea*!tF2k;FDhZRW|canbtg7OlZW{M(wKFgSx@tcE#j>+5yK0Th#{Wo1&Q4ydEv-9vhjm)W}ojLRsr-DlQI3cVQd7**9BWN zs|>0MP-_e1REO(2D247WA^NPViXDz+(iuT((_Q)WUU7J7yTkj3x8s;vn{{fUsS>dy=4YXDL_nCpzGTd z$c`wBQB#m;5(sk2n^d#j=O0!99H_>ECZdXMv$AQkbSU$e_6e$g=Iet`C8^cT-N0h@#*}U$XM)j{_ASJ4seNtc_$Uk0E+u276k7 zLdtyU8r1>;5V2w_f(UxuFn>`B$7=KpTA~0{qVy`B_m0!&PAGV0#1(h=3x8AS z?q)CeKa^2#0h$tgxw5_LjodRmIU&k}FIOJmr{9VNpfQ5Wv<;-IoNs`F_I}!B_z%ixsRD2ePlq@+ zeuh+y`Kk}xEarc2;697c(gfh%8Gi${&&#KCV`oS^Ze8Ke6;R|bKjk#s=MkD*0FlFz zd@5QQY=?BGIVWt$#37R}&KmKBWwH4*A1K)p!7EB1MyY^%oajNEk*T7QcG?DKQ9 z)fGp3FhktWPqQ-IwGmo_0GuROKcisfYfm1y>mxKq0KVcT@B>+d}(0!e^HtY z)A~S3J4j3yHoJplxYh&Cwt9%K_pjf0B*V5`(7L8S#?M}k7X4c{Av7p`s69!3I?pdU u_|`SwikvR8mC?>oM6AQ4OW13#{{zOH$L_9F^ZEb)002ovPDHLkU;%;x%N()* From 74f5255eef8b14455ca741c5004a97cd00fed667 Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Tue, 13 Jul 2021 16:59:33 +0100 Subject: [PATCH 16/21] GH-3930 Track duration of previous game sessions --- api/logic/BaseInstance.cpp | 17 ++++++++++++++++- api/logic/BaseInstance.h | 1 + api/logic/minecraft/MinecraftInstance.cpp | 10 ++++++++-- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/api/logic/BaseInstance.cpp b/api/logic/BaseInstance.cpp index cff16631..46b45827 100644 --- a/api/logic/BaseInstance.cpp +++ b/api/logic/BaseInstance.cpp @@ -37,6 +37,7 @@ BaseInstance::BaseInstance(SettingsObjectPtr globalSettings, SettingsObjectPtr s m_settings->registerSetting("notes", ""); m_settings->registerSetting("lastLaunchTime", 0); m_settings->registerSetting("totalTimePlayed", 0); + m_settings->registerSetting("lastTimePlayed", 0); // Custom Commands auto commandSetting = m_settings->registerSetting({"OverrideCommands","OverrideLaunchCmd"}, false); @@ -146,9 +147,12 @@ void BaseInstance::setRunning(bool running) } else { - qint64 current = settings()->get("totalTimePlayed").toLongLong(); QDateTime timeEnded = QDateTime::currentDateTime(); + + qint64 current = settings()->get("totalTimePlayed").toLongLong(); settings()->set("totalTimePlayed", current + m_timeStarted.secsTo(timeEnded)); + settings()->set("lastTimePlayed", m_timeStarted.secsTo(timeEnded)); + emit propertiesChanged(this); } @@ -166,9 +170,20 @@ int64_t BaseInstance::totalTimePlayed() const return current; } +int64_t BaseInstance::lastTimePlayed() const +{ + if(m_isRunning) + { + QDateTime timeNow = QDateTime::currentDateTime(); + return m_timeStarted.secsTo(timeNow); + } + return settings()->get("lastTimePlayed").toLongLong(); +} + void BaseInstance::resetTimePlayed() { settings()->reset("totalTimePlayed"); + settings()->reset("lastTimePlayed"); } QString BaseInstance::instanceType() const diff --git a/api/logic/BaseInstance.h b/api/logic/BaseInstance.h index 64de4bb3..d250e03e 100644 --- a/api/logic/BaseInstance.h +++ b/api/logic/BaseInstance.h @@ -87,6 +87,7 @@ public: void setRunning(bool running); bool isRunning() const; int64_t totalTimePlayed() const; + int64_t lastTimePlayed() const; void resetTimePlayed(); /// get the type of this instance diff --git a/api/logic/minecraft/MinecraftInstance.cpp b/api/logic/minecraft/MinecraftInstance.cpp index ea1e47b6..dbf9f816 100644 --- a/api/logic/minecraft/MinecraftInstance.cpp +++ b/api/logic/minecraft/MinecraftInstance.cpp @@ -798,9 +798,15 @@ QString MinecraftInstance::getStatusbarDescription() QString description; description.append(tr("Minecraft %1 (%2)").arg(m_components->getComponentVersion("net.minecraft")).arg(typeName())); - if(m_settings->get("ShowGameTime").toBool() && totalTimePlayed() > 0) + if(m_settings->get("ShowGameTime").toBool()) { - description.append(tr(", played for %1").arg(prettifyTimeDuration(totalTimePlayed()))); + if (lastTimePlayed() > 0) { + description.append(tr(", last played for %1").arg(prettifyTimeDuration(lastTimePlayed()))); + } + + if (totalTimePlayed() > 0) { + description.append(tr(", total played for %1").arg(prettifyTimeDuration(totalTimePlayed()))); + } } if(hasCrashed()) { From 4b3305afbe7ef2c9b17b96da9ccb79bc0f656f23 Mon Sep 17 00:00:00 2001 From: Thomas Kain Date: Wed, 21 Jul 2021 13:46:21 -0400 Subject: [PATCH 17/21] Fix Windows icon scaling issues Recalculated the icon using the official logo SVG and GIMP. Appears visually identical to the old one at all resolutions. --- application/resources/MultiMC.ico | Bin 85182 -> 55224 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/application/resources/MultiMC.ico b/application/resources/MultiMC.ico index 1846964e963bbb7f2f2f4ff21f5691f137673568..a86a1f0d9acdead5a2eb37acea970a5717690d5b 100644 GIT binary patch delta 41315 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 From 1762d2fc7de99e38477a517c9b379447fd00b968 Mon Sep 17 00:00:00 2001 From: Leland Liu <14846866+lelandliu@users.noreply.github.com> Date: Tue, 9 Jul 2019 22:23:24 -0400 Subject: [PATCH 18/21] Added total playtime --- .gitignore | 1 + api/logic/InstanceList.cpp | 18 +++++++++++++++++- api/logic/InstanceList.h | 4 ++++ application/MainWindow.cpp | 20 +++++++++++++++++++- application/MainWindow.h | 2 ++ 5 files changed, 43 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 496c382e..e11168c3 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ CMakeLists.txt.user.* /.settings /.idea cmake-build-*/ +Debug # Build dirs build diff --git a/api/logic/InstanceList.cpp b/api/logic/InstanceList.cpp index 02fae6ac..cb38853b 100644 --- a/api/logic/InstanceList.cpp +++ b/api/logic/InstanceList.cpp @@ -387,9 +387,19 @@ InstanceList::InstListError InstanceList::loadList() add(newList); } m_dirty = false; + updateTotalPlayTime(); return NoError; } +void InstanceList::updateTotalPlayTime() +{ + totalPlayTime = 0; + for(auto const& itr : m_instances) + { + totalPlayTime += itr.get()->totalTimePlayed(); + } +} + void InstanceList::saveNow() { for(auto & item: m_instances) @@ -475,6 +485,7 @@ void InstanceList::propertiesChanged(BaseInstance *inst) if (i != -1) { emit dataChanged(index(i), index(i)); + updateTotalPlayTime(); } } @@ -848,4 +859,9 @@ bool InstanceList::destroyStagingPath(const QString& keyPath) return FS::deletePath(keyPath); } -#include "InstanceList.moc" \ No newline at end of file +int InstanceList::getTotalPlayTime() { + updateTotalPlayTime(); + return totalPlayTime; +} + +#include "InstanceList.moc" diff --git a/api/logic/InstanceList.h b/api/logic/InstanceList.h index 8215cb66..56ee3be4 100644 --- a/api/logic/InstanceList.h +++ b/api/logic/InstanceList.h @@ -128,6 +128,8 @@ public: */ bool destroyStagingPath(const QString & keyPath); + int getTotalPlayTime(); + signals: void dataIsInvalid(); void instancesChanged(); @@ -145,6 +147,7 @@ private slots: private: int getInstIndex(BaseInstance *inst) const; + void updateTotalPlayTime(); void suspendWatch(); void resumeWatch(); void add(const QList &list); @@ -155,6 +158,7 @@ private: private: int m_watchLevel = 0; + int totalPlayTime = 0; bool m_dirty = false; QList m_instances; QSet m_groupNameCache; diff --git a/application/MainWindow.cpp b/application/MainWindow.cpp index 13a7c7ae..1720ca89 100644 --- a/application/MainWindow.cpp +++ b/application/MainWindow.cpp @@ -259,6 +259,7 @@ public: actionAddInstance.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Add a new instance.")); all_actions.append(&actionAddInstance); mainToolBar->addAction(actionAddInstance); + actionAddInstance.setTextId(QT_TRANSLATE_NOOP("MainWindow", "A")); mainToolBar->addSeparator(); @@ -724,8 +725,10 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new MainWindow connect(MMC, &MultiMC::globalSettingsClosed, this, &MainWindow::globalSettingsClosed); m_statusLeft = new QLabel(tr("No instance selected"), this); + m_statusCenter = new QLabel(tr("Total playtime: 0s."), this); m_statusRight = new ServerStatus(this); statusBar()->addPermanentWidget(m_statusLeft, 1); + statusBar()->addPermanentWidget(m_statusCenter, 1); statusBar()->addPermanentWidget(m_statusRight, 0); // Add "manage accounts" button, right align @@ -1327,7 +1330,6 @@ void MainWindow::setCatBackground(bool enabled) { QDateTime now = QDateTime::currentDateTime(); QDateTime xmas(QDate(now.date().year(), 12, 25), QTime(0, 0)); - ; QString cat = (non_stupid_abs(now.daysTo(xmas)) <= 4) ? "catmas" : "kitteh"; view->setStyleSheet(QString(R"( GroupView @@ -1526,6 +1528,7 @@ void MainWindow::setSelectedInstanceById(const QString &id) { QModelIndex selectionIndex = proxymodel->mapFromSource(index); view->selectionModel()->setCurrentIndex(selectionIndex, QItemSelectionModel::ClearAndSelect); + updateStatusCenter(); } } @@ -1854,6 +1857,7 @@ void MainWindow::instanceChanged(const QModelIndex ¤t, const QModelIndex & ui->actionExportInstance->setEnabled(m_selectedInstance->canExport()); ui->renameButton->setText(m_selectedInstance->name()); m_statusLeft->setText(m_selectedInstance->getStatusbarDescription()); + updateStatusCenter(); updateInstanceToolIcon(m_selectedInstance->iconKey()); updateToolsMenu(); @@ -1932,3 +1936,17 @@ void MainWindow::checkInstancePathForProblems() warning.exec(); } } + +void MainWindow::updateStatusCenter() +{ + int timeplayed = MMC->instances()->getTotalPlayTime(); + int minutes = timeplayed / 60; + int hours = minutes / 60; + int seconds = timeplayed % 60; + if(hours != 0) + m_statusCenter->setText(tr("Total playtime: %1h %2m %3s").arg(hours).arg(minutes).arg(seconds)); + else if(minutes != 0) + m_statusCenter->setText(tr("Total playtime: %1m %2s").arg(minutes).arg(seconds)); + else if(seconds != 0) + m_statusCenter->setText(tr("Total playtime: %1s").arg(seconds)); +} diff --git a/application/MainWindow.h b/application/MainWindow.h index 08c6b969..c992ab94 100644 --- a/application/MainWindow.h +++ b/application/MainWindow.h @@ -194,6 +194,7 @@ private: void setCatBackground(bool enabled); void updateInstanceToolIcon(QString new_icon); void setSelectedInstanceById(const QString &id); + void updateStatusCenter(); void runModalTask(Task *task); void instanceFromInstanceTask(InstanceTask *task); @@ -207,6 +208,7 @@ private: InstanceProxyModel *proxymodel = nullptr; QToolButton *newsLabel = nullptr; QLabel *m_statusLeft = nullptr; + QLabel *m_statusCenter = nullptr; ServerStatus *m_statusRight = nullptr; QMenu *accountMenu = nullptr; QToolButton *accountMenuButton = nullptr; From c5d0348181f97c306a4fd5b2ae51619a414b8677 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Thu, 22 Jul 2021 21:16:32 +0200 Subject: [PATCH 19/21] NOISSUE Fix minutes display for total playtime --- application/MainWindow.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/application/MainWindow.cpp b/application/MainWindow.cpp index 1720ca89..a700d0c5 100644 --- a/application/MainWindow.cpp +++ b/application/MainWindow.cpp @@ -1940,9 +1940,10 @@ void MainWindow::checkInstancePathForProblems() void MainWindow::updateStatusCenter() { int timeplayed = MMC->instances()->getTotalPlayTime(); - int minutes = timeplayed / 60; - int hours = minutes / 60; + int minutesTotal = timeplayed / 60; int seconds = timeplayed % 60; + int minutes = minutesTotal % 60; + int hours = minutesTotal / 60; if(hours != 0) m_statusCenter->setText(tr("Total playtime: %1h %2m %3s").arg(hours).arg(minutes).arg(seconds)); else if(minutes != 0) From 211cfb4af785f2084c8d274eabf33551bb7c8643 Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Wed, 30 Jun 2021 14:52:00 +0100 Subject: [PATCH 20/21] NOISSUE Disable Install Forge button on 1.17 (and above) It appears that Minecraft Forge for Minecraft 1.17 will require setting JVM arguments to operate, this is not currently possible with MultiMC's meta. Therefore, when Forge for 1.17 is released a solution will need to be looked into. --- api/logic/minecraft/OneSixVersionFormat.cpp | 3 +-- application/pages/instance/VersionPage.cpp | 16 ++++++++++------ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/api/logic/minecraft/OneSixVersionFormat.cpp b/api/logic/minecraft/OneSixVersionFormat.cpp index d6aaa790..0329d70e 100644 --- a/api/logic/minecraft/OneSixVersionFormat.cpp +++ b/api/logic/minecraft/OneSixVersionFormat.cpp @@ -194,8 +194,7 @@ VersionFilePtr OneSixVersionFormat::versionFileFromJson(const QJsonDocument &doc LibDLInfo->artifact = out->mojangDownloads["client"]; lib->setMojangDownloadInfo(LibDLInfo); } - // we got nothing... guess based on ancient hardcoded Mojang behaviour - // FIXME: this will eventually break... + // we got nothing... else { out->addProblem( diff --git a/application/pages/instance/VersionPage.cpp b/application/pages/instance/VersionPage.cpp index eff12c9c..a98bfb7d 100644 --- a/application/pages/instance/VersionPage.cpp +++ b/application/pages/instance/VersionPage.cpp @@ -212,12 +212,16 @@ void VersionPage::updateVersionControls() { // FIXME: this is a dirty hack auto minecraftVersion = Version(m_profile->getComponentVersion("net.minecraft")); - bool newCraft = minecraftVersion >= Version("1.14"); - bool oldCraft = minecraftVersion <= Version("1.12.2"); - ui->actionInstall_Fabric->setEnabled(controlsEnabled && newCraft); - ui->actionInstall_Forge->setEnabled(controlsEnabled); - ui->actionInstall_LiteLoader->setEnabled(controlsEnabled && oldCraft); - ui->actionReload->setEnabled(true); + + bool supportsFabric = minecraftVersion >= Version("1.14"); + ui->actionInstall_Fabric->setEnabled(controlsEnabled && supportsFabric); + + bool supportsForge = minecraftVersion <= Version("1.16.5"); + ui->actionInstall_Forge->setEnabled(controlsEnabled && supportsForge); + + bool supportsLiteLoader = minecraftVersion <= Version("1.12.2"); + ui->actionInstall_LiteLoader->setEnabled(controlsEnabled && supportsLiteLoader); + updateButtons(); } From 34f74fff0a53d79ead838245133240aea5ef72f0 Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Thu, 22 Jul 2021 21:20:01 +0100 Subject: [PATCH 21/21] GH-3957 Fix 'Add Instance' label --- application/MainWindow.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/application/MainWindow.cpp b/application/MainWindow.cpp index a700d0c5..9225193e 100644 --- a/application/MainWindow.cpp +++ b/application/MainWindow.cpp @@ -259,7 +259,6 @@ public: actionAddInstance.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Add a new instance.")); all_actions.append(&actionAddInstance); mainToolBar->addAction(actionAddInstance); - actionAddInstance.setTextId(QT_TRANSLATE_NOOP("MainWindow", "A")); mainToolBar->addSeparator();