From 90a137ea100e630e00f4bcbcbda9d1064acd7531 Mon Sep 17 00:00:00 2001 From: cooliojazz Date: Mon, 7 Aug 2017 15:07:57 -0600 Subject: [PATCH] InventoryTweaks Support 1.12 (#1405) * Added support for sorting with InventoryTweaks if it exists * Cleaned up formatting * Requested fixes. * Style updates * No logging --- build.gradle | 5 +++ .../api/network/grid/IGrid.java | 3 +- .../refinedstorage/gui/grid/GuiGrid.java | 5 +++ .../sorting/GridSortingInventoryTweaks.java | 29 ++++++++++++++++++ .../sidebutton/SideButtonGridSortingType.java | 8 +++++ .../assets/refinedstorage/lang/en_us.lang | 1 + .../assets/refinedstorage/textures/icons.png | Bin 6435 -> 6495 bytes 7 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/raoulvdberge/refinedstorage/gui/grid/sorting/GridSortingInventoryTweaks.java diff --git a/build.gradle b/build.gradle index 21a758079..d7bd86367 100755 --- a/build.gradle +++ b/build.gradle @@ -47,6 +47,10 @@ repositories { maven { url "https://dl.bintray.com/jaquadro/dev" } + maven { + name = "CurseForge" + url = "https://minecraft.curseforge.com/api/maven/" + } } dependencies { @@ -55,6 +59,7 @@ dependencies { deobfCompile "MCMultiPart2:MCMultiPart:2.2.2" // deobfCompile "li.cil.oc:OpenComputers:MC1.11.2-1.7.0.28:api" deobfCompile "com.jaquadro.minecraft.storagedrawers:StorageDrawers:1.12-5.2.9:api" + compile "inventory-tweaks:InventoryTweaks:1.63+beta.107:api" } processResources { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/IGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/IGrid.java index f3f1e1eb9..377618fc1 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/IGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/IGrid.java @@ -23,6 +23,7 @@ public interface IGrid { int SORTING_TYPE_QUANTITY = 0; int SORTING_TYPE_NAME = 1; int SORTING_TYPE_ID = 2; + int SORTING_TYPE_INVENTORYTWEAKS = 3; int SEARCH_BOX_MODE_NORMAL = 0; int SEARCH_BOX_MODE_NORMAL_AUTOSELECTED = 1; @@ -214,7 +215,7 @@ public interface IGrid { } static boolean isValidSortingType(int type) { - return type == SORTING_TYPE_QUANTITY || type == SORTING_TYPE_NAME || type == SORTING_TYPE_ID; + return type == SORTING_TYPE_QUANTITY || type == SORTING_TYPE_NAME || type == SORTING_TYPE_ID || type == SORTING_TYPE_INVENTORYTWEAKS; } static boolean isValidSortingDirection(int direction) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/GuiGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/GuiGrid.java index b80a365d7..98472c238 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/GuiGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/GuiGrid.java @@ -16,6 +16,7 @@ import com.raoulvdberge.refinedstorage.gui.Scrollbar; import com.raoulvdberge.refinedstorage.gui.grid.filtering.GridFilterParser; import com.raoulvdberge.refinedstorage.gui.grid.sorting.GridSorting; import com.raoulvdberge.refinedstorage.gui.grid.sorting.GridSortingID; +import com.raoulvdberge.refinedstorage.gui.grid.sorting.GridSortingInventoryTweaks; import com.raoulvdberge.refinedstorage.gui.grid.sorting.GridSortingName; import com.raoulvdberge.refinedstorage.gui.grid.sorting.GridSortingQuantity; import com.raoulvdberge.refinedstorage.gui.grid.stack.GridStackFluid; @@ -53,6 +54,7 @@ public class GuiGrid extends GuiBase implements IGridDisplay { private static final GridSorting SORTING_QUANTITY = new GridSortingQuantity(); private static final GridSorting SORTING_NAME = new GridSortingName(); private static final GridSorting SORTING_ID = new GridSortingID(); + private static final GridSorting SORTING_INVENTORYTWEAKS = new GridSortingInventoryTweaks(); private static final List SEARCH_HISTORY = new ArrayList<>(); @@ -206,6 +208,7 @@ public class GuiGrid extends GuiBase implements IGridDisplay { SORTING_NAME.setSortingDirection(grid.getSortingDirection()); SORTING_QUANTITY.setSortingDirection(grid.getSortingDirection()); SORTING_ID.setSortingDirection(grid.getSortingDirection()); + SORTING_INVENTORYTWEAKS.setSortingDirection(grid.getSortingDirection()); stacks.sort(SORTING_NAME); @@ -213,6 +216,8 @@ public class GuiGrid extends GuiBase implements IGridDisplay { stacks.sort(SORTING_QUANTITY); } else if (grid.getSortingType() == IGrid.SORTING_TYPE_ID) { stacks.sort(SORTING_ID); + } else if (grid.getSortingType() == IGrid.SORTING_TYPE_INVENTORYTWEAKS) { + stacks.sort(SORTING_INVENTORYTWEAKS); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/sorting/GridSortingInventoryTweaks.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/sorting/GridSortingInventoryTweaks.java new file mode 100644 index 000000000..74ccbcddf --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/sorting/GridSortingInventoryTweaks.java @@ -0,0 +1,29 @@ +package com.raoulvdberge.refinedstorage.gui.grid.sorting; + +import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNodeGrid; +import com.raoulvdberge.refinedstorage.gui.grid.stack.GridStackItem; +import com.raoulvdberge.refinedstorage.gui.grid.stack.IGridStack; +import invtweaks.api.InvTweaksAPI; +import net.minecraftforge.fml.common.Loader; + +public class GridSortingInventoryTweaks extends GridSorting { + private InvTweaksAPI api = null; + + public GridSortingInventoryTweaks() { + try { + api = (InvTweaksAPI) Class.forName("invtweaks.forge.InvTweaksMod", true, Loader.instance().getModClassLoader()).getField("instance").get(null); + } catch (Exception ex) { } + } + + @Override + public int compare(IGridStack o1, IGridStack o2) { + if (api != null && o1 instanceof GridStackItem && o2 instanceof GridStackItem) { + if (sortingDirection == NetworkNodeGrid.SORTING_DIRECTION_DESCENDING) { + return api.compareItems(((GridStackItem) o1).getStack(), ((GridStackItem) o2).getStack()); + } else if (sortingDirection == NetworkNodeGrid.SORTING_DIRECTION_ASCENDING) { + return api.compareItems(((GridStackItem) o2).getStack(), ((GridStackItem) o1).getStack()); + } + } + return 0; + } +} \ No newline at end of file diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/sidebutton/SideButtonGridSortingType.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/sidebutton/SideButtonGridSortingType.java index d12321a4d..51d8e5049 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/sidebutton/SideButtonGridSortingType.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/sidebutton/SideButtonGridSortingType.java @@ -2,8 +2,10 @@ package com.raoulvdberge.refinedstorage.gui.sidebutton; import com.raoulvdberge.refinedstorage.api.network.grid.GridType; import com.raoulvdberge.refinedstorage.api.network.grid.IGrid; +import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNodeGrid; import com.raoulvdberge.refinedstorage.gui.GuiBase; import net.minecraft.util.text.TextFormatting; +import net.minecraftforge.fml.common.Loader; public class SideButtonGridSortingType extends SideButton { private IGrid grid; @@ -37,6 +39,12 @@ public class SideButtonGridSortingType extends SideButton { type = IGrid.SORTING_TYPE_ID; } } else if (type == IGrid.SORTING_TYPE_ID) { + if (grid.getType() == GridType.FLUID || !Loader.isModLoaded("inventorytweaks")) { + type = IGrid.SORTING_TYPE_QUANTITY; + } else { + type = IGrid.SORTING_TYPE_INVENTORYTWEAKS; + } + } else if (type == NetworkNodeGrid.SORTING_TYPE_INVENTORYTWEAKS) { type = IGrid.SORTING_TYPE_QUANTITY; } diff --git a/src/main/resources/assets/refinedstorage/lang/en_us.lang b/src/main/resources/assets/refinedstorage/lang/en_us.lang index 2bc551ab4..872d113e0 100644 --- a/src/main/resources/assets/refinedstorage/lang/en_us.lang +++ b/src/main/resources/assets/refinedstorage/lang/en_us.lang @@ -129,6 +129,7 @@ sidebutton.refinedstorage:grid.sorting.type=Sorting type sidebutton.refinedstorage:grid.sorting.type.0=Quantity sidebutton.refinedstorage:grid.sorting.type.1=Name sidebutton.refinedstorage:grid.sorting.type.2=ID +sidebutton.refinedstorage:grid.sorting.type.3=InventoryTweaks sidebutton.refinedstorage:grid.search_box_mode=Search box mode sidebutton.refinedstorage:grid.search_box_mode.0=Normal sidebutton.refinedstorage:grid.search_box_mode.1=Normal (autoselected) diff --git a/src/main/resources/assets/refinedstorage/textures/icons.png b/src/main/resources/assets/refinedstorage/textures/icons.png index e181991516293effebae43660e3fd5f695237eed..02dd3728748a17dce803c25c230207c484f0e0f8 100755 GIT binary patch delta 5259 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 delta 5126 zcmZu#dpy(o|No5UHe$(L7D`9CUs6e1b4Z~a-P}UvAd7`Amaz$`5ZZ~M6Het&SW9z@ zk=WdciX>Ch$TcR*{rB0@Ii1JvyFd1L?EQJYU(eU`^?bhGpU-D(lY1s9TcjXi&Iiyy zal88GR82Lh7XYyS1%!pm_f56kENNoB4m%D2%H&ks3Fvt1weiB#W@iYWya{rUNT=li z(#%z_59~6fXyU@;CBsAN{Jr*mZrGO*h974BW=J*M5;0G|)8rlO>wQEI=<}-c$&2CV zl`=9{llOh|R<$^xL~5bNwOB(3Wz{M=oQ;eKQ(MvdV6}(xD~25W*faL|xyKnsdcWxd za|=}B(!G`g>{ZU&^0o%!Sk+ZxjYX!{{A(m3e12NIM*q}assKAuc4Cq5@q#j?^2UaC zAJw+i--M#3(kl-m&80u4d>%|KxG*k`h(g?C8Q1r$E|s+SBbJNLPZJW%=R0m?oM2lo zu2}WtRKOK(Y=s6I>?Xf0TiOs9aNAJY-V9c2xH4z@E#WyGI*45PL>x}9nJ+=67~I9t zbXHw&aBZfl>nRqIi#xV&w3mA25vmhYks5790|JPW2^s4(G8U$YE8Q(D#B!4(+{GPO z8DmG`=N}Zv@on8mk#F-Ld=HK|y|EK1QrJXH zYc1Elq(CxW5j&;SKqiw!6o})7QM(p5ks1p10k0JfD?NK@kbgg6*j*59+a0VAYn^9 z_xnDT)+Fii>rm99y-Vx(m$rU=Li@`qvt0kp&_LpU+Sb33l-_7Be_0HKGr3p%X&^jY z((rn^&aCu()K=Ijw9Z@y%OCP5MAs?k^X|x*rfum~A+ zILxn7Z0UY;&DeMS>$JPw-7pftW#R?fEF{Ui!i2qv!|?0Caj-P?p2Jx3o@4Hp4~@3!(A+e(sa{ZRphAG}z*OyWVn&u5^hefLLVkZ?}A3t5|Ih3T+L%JoN; zS2@o6$AJOF&jm<`GAI6IWjLcDlVEPcl3wIvMpWc9aijNKoOAlR!h9g%S^>DI4(z## zEU8AEt*R`UsRNXi`-NarQW0XffE?%94}yX{uHn`s((R41tCbt z`koM~01$()ar@nWZ9T9Sx0ep|#+z^8$n9%iu&*$&*cY72Onx7TIM~zIe5-)d@2rQH zekk#0^2@JB02;N3#bs4YhfrriM!w$K;%7RNHNd|xz^B{1nu*MQl`9bBh#}y5O_#}v z^r(Du!VQXYPdE(;*AO%-1`62q5Cv(iRLgdz^~(wx;SB+9|OYYQe!K;h>>dKn7VlcqT%sp9X4MCZ|Lr^tF*5A~9Z)rQ_ zR%@9l7SY63$A=V!98N)uh+*|1vB}mtyRQTUW8>6bVDAtoXv3i$77fhZp)f&3PQ1~Y zu1B^5&6CjDGW&1JrmUBg`L_OtA;I4eUlNyf-_*?YhE)t_&2ZE!ga*pT^S#}ikoRdg zgeRMi(ZB_cExKfnVLn|@3g=*nBiDS-_La5oP)v9X;t(x9vAzTOYdoVQyi5fwScTJ~6{GLU8G_3qBiXFaFn z9E-Y)gOoqu+r!hB5TTXr|MM|!IemBee z-|$();jw$N#ZwVi3gQ_ZWq3Bi>(YLsuTQ6@4X)yYF6^t<$|IJ&5O_rK^jjBTG8VK1hjf*p^z@5gtGYhnCKz@sfGUw>gDrfHBo|1o zLWtx7sU47I@@pw0;%WBev>MW98os*UtL`JK*Whs^^-Nh;Gp>57gcm^qla*MUGm@Wo zx(MleSKYX$>*>3q@l;%Wg{Sa%dDdhY_#?xj_q?pCFvpjOJyLJu%_d5jnM-gATU5|_ zj74sP=}TFRY)*Cc&Y|7nJpNMEF*tGU0!?=4WlnV}K{(05=mh^Ot>Nnea9a=p+O(|B zj~SayH6VRzO~T<79!ZUf2S{_aGs2;ICaHf{(u4#5IRy^7+$8rQEJY=`cIvvi@Kot_ z44Bs69M@pT7vN_n-eFhXadIIhZ*=(Ngn`_^T zHd}UH`!)Y!wR?5G{Q(oVJlkykd(@d5nF~`ZJdR4#cn1;xiIYs_q{V~fmm)&-jy?a%bUjQDK;9R-t#@A1-DNv)BisKUut&fziZ4V^ zflf{6^v7}LP}Iv^ihy&>A;rqrB1(ljIKE8nFA-X-{p5COG+APUjHP9`@$=c$a*RwG zKY%g&tai@&X568)O;r?B<~x{c%Nqi&PJ4fZ_PkTmlNcp=yRZmNiH*Ff@6M|_l0Z&V}g$L1hy#gf>D-2UFn zzJ;)lj7H-h7lc{Oz1n(2zmp#yY*<%Z$pYCjm7f?!HXTnqL z?AwA6cIL{8XwEeXU!t+q9fc(mgx#;R;trHZY&OL~iX3NhZz&j}T8)-7+7~nu5-0_9 z`mSuwqCGSxjk8Fmt(Pa(I}{l+aJv~D|8y{5bSv4g?LF)toN1AIX$y8Gxc@)*hUCNv zv`4zS==yQ{X0R{WPr>Hu`G>3_o<#ZYrtJZ&IA+v(Ia6K`mn;`g>TpuNP*%e8FH6yH}P5z*YBLX#e7 zh}V#EzHb9e&eZPc!Ze+{Q!bInxAEI6vZ^<chV6Nvs=}Pv*L%{eeP-yw zn)A@iD+_0zbP>+d%9jR-u2#ePdpx=_j<7@Qx3urF3$XK5JzO)( zL~=$d^Cf!s3ftX+U?`t92?^TUuEGF*sU(&vK#;|cffUtaPnJF;!2N8C+U7&F6#<)` z1K*E>Tc2dT5{;B!CF9e$kr3tdyBiaLe>2g5U+D7>L~>?+4$kPUDP@$J6Ch6KCwj}Y zYK1lw)I*UT_j31or-}tVrOFa4!vzBly$#;niC%)4?m&}kq-}}HK8c?@NbW9V>JO2? zL*fR-XCaHRVYuh9&PnbwKsctbQ&*II{Gzm(bQkhA-l^{@3&!IdhHxa&%g6C%>m}i_ z30f9(3GMByIf|fEADN2D0nPAS4uk40eOzUic+|HF);VCe@7R;ht;#;c#D^j7F2Put zjIlK{oR_?+j0uA{y%~BmfB8G~4o?zgf95=eX6E0Y1=bl|ZWtP{6M!1(M82g_k*H8wLp7Xg144`mpj(MfZe9&zBph(K}$G{)SA0;&7Ufw@)R8QpS0mmX+`o-&R5EShi<$wg9 zF@JoDU6ZX4{kg5}TP17)tG1OF)1(Hi{TOIB5@ew1e_)GaYUTypKo#E9h|v=SG5Ux- zat|=Oj*m^jLr~oJF()8K^0GxYKNl}iN?}mqppIfvt_QmP@FghflG)7;t_vXXHal2~ zG+FOUfE8;h`6cODhFQ9zscSp?Z2mAoh+j z7$Ub#!`7CP~+fxC31I(2KT5*Q3GW10hCXV+ODCF_x6qOzEVO zy)QZ}uPzzwl;cV6w$wUPEQo0k$+1+f`9QbKc+J0UDTTUCInwwRelSeIWJ*I%5irjS z9GA5;`8<|t4)wl4EJ|u1pxbZSWj;#5^K*^^IzI4oVfIk(=1cVzA1<_R8ya6@oe91i zZr{}XCV2-8>TPbEol^3HJ5RpW*I7Z8x{;Js4&S9ADCM56xF&D%`NM3$p$pNfmVkNy zY}Ui2QS1N3@^*wMU)(@^!0QWixCgW*dTI-J{@Udc*ZNHSQIv?&F&dI7jfA`0Jx!Cj zN|<2%wACJB)V)5S|4*oQ8cvY1J)n7iV^xHcKCs>N5-f?n*VX1t)*YG&H<>au~ehu=-p{WD99v+eDY z*QBY`1K!-kkk7DIx{d(WW1i&eO52D-ZyugM?7pcRbXTa@T3f3XNRY@-?D0N6k1pa} z-V-&cb2a7enm1-o0I%+gKJ4vLp123P7;C+y?Ks%fFMmmq4sl$7Misg59y)&%IOaF0 zsEWnMR-GtD@Px+65*H1$>57j>gcF2YLfTOhA_-{R6?r-GjZzY4fblUa? z%Wzb?8hH8|ZQF+6hh2e