11package io .github .jumperonjava .customcursor .util ;
22
3+ import net .minecraft .client .MinecraftClient ;
4+ import net .minecraft .client .gui .DrawContext ;
5+ import net .minecraft .client .gui .screen .Screen ;
36import net .minecraft .client .gui .widget .ButtonWidget ;
7+ import net .minecraft .client .gui .widget .TextFieldWidget ;
48import net .minecraft .text .Text ;
59import net .minecraft .util .Identifier ;
610import net .minecraft .util .Util ;
913import java .util .List ;
1014import java .util .function .Consumer ;
1115
12- public class FolderTextureAskList extends TextureListAsk {
16+ public class FolderTextureAskList extends Screen {
17+ public static final int gap = 2 ;
1318 private final TextureFolder folder ;
19+ private final Consumer <Identifier > onSuccess ;
20+
21+ ScrollListWidget list ;
22+
23+ protected Identifier EMPTY_TEXTURE = Identifier .of ("minecraft" , "empty" );
1424 private List <Identifier > textures = new ArrayList <>();
1525
16- public FolderTextureAskList (TextureFolder folder , Consumer <Identifier > onSuccess , Runnable onFail ) {
17- super (onSuccess , onFail );
26+ private Identifier selectedTexture = EMPTY_TEXTURE ;
27+
28+ private Screen parent ;
29+ private String lastFilter = "" ;
30+
31+ public FolderTextureAskList (TextureFolder folder , Consumer <Identifier > onSuccess ) {
32+ super (Text .empty ());
33+ this .onSuccess = onSuccess ;
1834 this .folder = folder ;
1935 }
2036
37+ public static void ask (FolderTextureAskList askScreen ) {
38+ var client = MinecraftClient .getInstance ();
39+ var currentScreen = client .currentScreen ;
40+ if (currentScreen == null ) {
41+ client .setScreen (askScreen );
42+ return ;
43+ }
44+ client .setScreen (askScreen );
45+ askScreen .parent = currentScreen ;
46+ }
2147 @ Override
2248 protected void init () {
23- super .init ();
24- var cancel = new ButtonWidget .Builder (Text .translatable ("customcursor.folder.openfolder" ), b ->openCursorFolder ())
25- .dimensions ((int ) (240 +gap *2 ),height -20 -gap ,100 ,20 ).build ();
26- addDrawableChild (cancel );
49+ // Initializations
50+ list = new ScrollListWidget (client , width , height - 64 , 0 , 22 , 40 );
51+ var search = new TextFieldWidget (client .textRenderer , 0 , 0 , width , 20 , Text .empty ());
52+ var accept = new ButtonWidget .Builder (Text .translatable ("customcursor.folder.accept" ), b1 -> {
53+ if (selectedTexture != EMPTY_TEXTURE )
54+ success (selectedTexture );
55+ });
56+ var cancel1 = new ButtonWidget .Builder (Text .translatable ("customcursor.folder.cancel" ), b1 -> closeScreen ());
57+ var cancel = new ButtonWidget .Builder (Text .translatable ("customcursor.folder.openfolder" ), b -> openCursorFolder ());
58+
59+ accept .dimensions (40 + gap , height - 20 - gap , 100 , 20 );
60+ cancel1 .dimensions ((int ) (140 + gap * 1.5 ), height - 20 - gap , 100 , 20 );
61+ cancel .dimensions (240 + gap * 2 , height - 20 - gap , 100 , 20 );
62+
63+ // Adding Widgets
64+ refreshListByFilter ("" );
65+ addDrawableChild (list );
66+ search .setChangedListener (this ::refreshListByFilter );
67+ addDrawableChild (search );
68+ addDrawableChild (accept .build ());
69+ addDrawableChild (cancel1 .build ());
70+ addDrawableChild (cancel .build ());
71+ addDrawableChild (((context , mouseX , mouseY , delta ) ->
72+ {
73+ var texture = selectedTexture == EMPTY_TEXTURE ? Identifier .of ("minecraft" , "textures/item/barrier.png" ) : selectedTexture ;
74+ TextureWidget .render (context ,texture , gap / 2 , height - 40 - gap / 2 , 40 , 40 );
75+ }));
76+
77+ setTexturesCallback (this ::setTextures );
78+ addDrawableChild (((context , mouseX , mouseY , delta ) -> context .drawText (
79+ textRenderer ,
80+ Text .translatable ("customcursor.folder.selected" ).append (": " ).append (selectedTexture .toString ()),
81+ 45 ,
82+ height - 30 - 6 - gap / 2 ,
83+ 0xFFFFFFFF ,
84+ true )));
2785 }
2886
87+
2988 private void openCursorFolder () {
3089 Util .getOperatingSystem ().open (folder .path .toFile ());
3190 }
@@ -39,4 +98,47 @@ public void setTexturesCallback(Consumer<List<Identifier>> consumer) {
3998 });
4099
41100 }
101+
102+ public void setTextures (List <Identifier > identifiers ) {
103+ this .textures = identifiers ;
104+ refreshListByFilter (lastFilter );
105+ }
106+
107+ private void refreshListByFilter (String s ) {
108+ lastFilter = s ;
109+ list .children ().clear ();
110+ //? if < 1.21.4 {
111+ list .setScrollAmount (0 );
112+ //?} else {
113+ /*list.setScrollY(0);
114+ */ //?}
115+ for (var key : textures ) {
116+ if (key == null ) continue ;
117+ var id = key .toString ();
118+ if (!id .toLowerCase ().contains (s .toLowerCase ()))
119+ continue ;
120+ Identifier finalKey = key ;
121+ var entry = new ScrollListWidget .ScrollListEntry (key , () -> {
122+ this .selectedTexture = finalKey ;
123+ });
124+ list .addEntry (entry );
125+ }
126+ }
127+
128+ //? if <= 1.20.1 {
129+ @ Override
130+ public void render (DrawContext context , int mouseX , int mouseY , float delta ) {
131+ renderBackground (context );
132+ super .render (context , mouseX , mouseY , delta );
133+ }
134+ //?}
135+
136+ public void success (Identifier ret ) {
137+ onSuccess .accept (ret );
138+ this .closeScreen ();
139+ }
140+
141+ private void closeScreen () {
142+ MinecraftClient .getInstance ().setScreen (this .parent );
143+ }
42144}
0 commit comments