66import io .github .jumperonjava .customcursor .util .SliderWidget ;
77import io .github .jumperonjava .customcursor .util .VersionFunctions ;
88import net .minecraft .client .gui .DrawContext ;
9- import net .minecraft .client .gui .screen .GameModeSelectionScreen ;
109import net .minecraft .client .gui .screen .Screen ;
1110import net .minecraft .client .gui .widget .ButtonWidget ;
1211import net .minecraft .client .gui .widget .TextFieldWidget ;
13- import net .minecraft .client .render .RenderLayer ;
1412import net .minecraft .text .Text ;
1513import net .minecraft .util .Identifier ;
16- import net .minecraft .util .math .ColorHelper ;
1714import net .minecraft .util .math .MathHelper ;
1815import net .minecraft .util .math .Vec2f ;
1916
20- import java .util .Random ;
2117import java .util .function .Consumer ;
2218import java .util .function .Function ;
2319
@@ -26,7 +22,7 @@ public class CursorEditScreen extends Screen {
2622 private final CursorSettings targetConfig ;
2723 private final Screen parent ;
2824
29- public CursorEditScreen (Screen parent ,CursorSettings cursorConfig , Consumer <CursorSettings > onSuccess ) {
25+ public CursorEditScreen (Screen parent , CursorSettings cursorConfig , Consumer <CursorSettings > onSuccess ) {
3026 super (Text .empty ());
3127 this .parent = parent ;
3228 this .onSuccess = onSuccess ;
@@ -38,137 +34,196 @@ public void close() {
3834 client .setScreen (parent );
3935 }
4036
37+ private int centerX ;
38+ private int centerY ;
39+
40+ private final int previewSize = 128 ;
41+ private int previewPosX ;
42+ private int previewPosY ;
43+
4144 @ Override
4245 protected void init () {
46+
47+ centerX = width / 2 ;
48+ centerY = height / 2 ;
49+
50+ previewPosX = (width - previewSize ) / 2 ;
51+ previewPosY = centerY ;
52+
4353 super .init ();
44- int heightOffset = (int ) (24 *2.75 );
45- var field = new TextFieldWidget (client .textRenderer ,width /2 -128 ,height /2 +heightOffset -64 -24 -22 ,256 ,20 ,Text .empty ());
46- field .setMaxLength (512 );
47- field .setText (this .targetConfig .identifier .toString ());
48- field .setChangedListener ((s )->{
49- try {
50- setIdentifier ( Identifier .tryParse (s ));
51- }
52- catch (Exception e ){e .printStackTrace ();}
54+
55+ Function <Boolean , Text > textfunc = (Boolean b ) -> Text .translatable ("customcursor.edit.enabled." + b );
56+ var toggleWidget = new ButtonWidget .Builder (textfunc .apply (this .targetConfig .enabled ), (buttonWidget ) -> {
57+ this .targetConfig .enabled = !targetConfig .enabled ;
58+ buttonWidget .setMessage (textfunc .apply (this .targetConfig .enabled ));
5359 });
54- addDrawableChild (new ButtonWidget .Builder (Text .translatable ("customcursor.edit.confirm" ),this ::confirm )
55- .dimensions (width /2 -128 ,height /2 +heightOffset -64 -24 -22 *0 ,126 ,20 ).build ());
56- addDrawableChild (new ButtonWidget .Builder (Text .translatable ("customcursor.edit.cancel" ),(f )->close ())
57- .dimensions (width /2 +2 ,height /2 +heightOffset -64 -24 -22 *0 ,126 ,20 ).build ());
58- addDrawableChild (new ButtonWidget .Builder (Text .translatable ("customcursor.edit.folder" ),(b )->{
60+
61+ var confrmButton = new ButtonWidget .Builder (Text .translatable ("customcursor.edit.confirm" ), this ::confirm );
62+ var cancelButton = new ButtonWidget .Builder (Text .translatable ("customcursor.edit.cancel" ), (f ) -> close ());
63+ var folderButton = new ButtonWidget .Builder (Text .translatable ("customcursor.edit.folder" ), (b ) -> {
5964 AskScreen .ask (
6065 new FolderTextureAskList (
6166 CustomCursorInit .TEXTURE_FOLDER ,
6267 this ::setIdentifier ,
63- ()->{}
68+ () -> {
69+ }
6470 )
6571 );
66- })
67- .dimensions (width /2 -128 ,height /2 +heightOffset -64 -24 -22 *2 ,256 ,20 ).build ());
68- var xSlider = new SliderWidget (width /2 -128 ,height /2 +heightOffset -64 -24 -22 *3 ,126 ,20 ,Text .translatable ("customcursor.edit.x" ),0. ,1. ,this .targetConfig .x ,1 /64f );
69- var ySlider = new SliderWidget (width /2 +2 ,height /2 +heightOffset -64 -24 -22 *3 ,126 ,20 ,Text .translatable ("customcursor.edit.y" ),0. ,1. ,this .targetConfig .y ,1 /64f );
70- Function <Boolean ,Text > textfunc = (Boolean b ) -> {
71- return Text .translatable ("customcursor.edit.enabled." +b );
72- };
73- var enabledButtonWidget = new ButtonWidget .Builder (textfunc .apply (this .targetConfig .enabled ),(buttonWidget )->{
74- this .targetConfig .enabled =!targetConfig .enabled ;
75- buttonWidget .setMessage (textfunc .apply (this .targetConfig .enabled ));
76- })
77- .dimensions (width /2 -128 ,height /2 +heightOffset -64 -24 -22 *5 ,256 ,20 ).build ();
72+ });
73+
74+ int rowSize = 24 ;
75+ int columnSize = 128 ;
76+
77+ var rowCount = 6 ;
78+ var columnCount = 2 ;
79+
80+ var startColumnPos = centerX - (columnCount * columnSize ) / 2 ;
81+ var startRowPos = centerY - rowCount * rowSize ;
82+
83+ var rows = new int [rowCount ];
84+ var columns = new int [columnCount ];
85+
86+ var padding = 2 ;
87+ var sizePadding = padding *2 ;
88+
89+ for (int i = 0 ; i < rowCount ; i ++) {
90+ rows [i ] = startRowPos + rowSize * i + padding ;
91+ }
92+ for (int i = 0 ; i < columnCount ; i ++) {
93+ columns [i ] = startColumnPos + columnSize * i + padding ;
94+ }
95+
96+ int columnSizePadding = columnSize - sizePadding ;
97+ int twoColumnSizePadding = columnSize * 2 - sizePadding ;
98+ int rowSizePadding = rowSize - sizePadding ;
99+
100+ toggleWidget = toggleWidget .dimensions (columns [0 ], rows [0 ], twoColumnSizePadding , rowSizePadding );
101+ folderButton = folderButton .dimensions (columns [0 ], rows [3 ], twoColumnSizePadding , rowSizePadding );
102+ confrmButton = confrmButton .dimensions (columns [0 ], rows [5 ], columnSizePadding , rowSizePadding );
103+ cancelButton = cancelButton .dimensions (columns [1 ], rows [5 ], columnSizePadding , rowSizePadding );
104+
105+
78106 var maxsize = 256. ;
79- var size = new SliderWidget (width /2 -128 ,height /2 +heightOffset -64 -24 -22 *4 ,256 ,20 ,Text .translatable ("customcursor.edit.size" ),0 ,maxsize ,this .targetConfig .y ,1 );
80- size .setValueOwn (this .targetConfig .size /maxsize );
81- xSlider .setChangedListener (d ->this .targetConfig .x =(float )(double )d );
82- ySlider .setChangedListener (d ->this .targetConfig .y =(float )(double )d );
83- size .setChangedListener (d ->this .targetConfig .size =(int )(double )d );
84-
85- addDrawableChild (xSlider );
86- addDrawableChild (ySlider );
87- addDrawableChild (enabledButtonWidget );
88- addDrawableChild (size );
89- addDrawableChild (field );
107+ var imagePathField = new TextFieldWidget (client .textRenderer , columns [0 ], rows [4 ], twoColumnSizePadding , rowSizePadding , Text .empty ());
108+ var sizeSlider = new SliderWidget (columns [0 ], rows [1 ], twoColumnSizePadding , rowSizePadding , Text .translatable ("customcursor.edit.size" ), 0 , maxsize , this .targetConfig .y , 1 );
109+ var xPosSlider = new SliderWidget (columns [0 ], rows [2 ], columnSizePadding , rowSizePadding , Text .translatable ("customcursor.edit.x" ), 0. , 1. , this .targetConfig .x , 1 / 64f );
110+ var yPosSlider = new SliderWidget (columns [1 ], rows [2 ], columnSizePadding , rowSizePadding , Text .translatable ("customcursor.edit.y" ), 0. , 1. , this .targetConfig .y , 1 / 64f );
111+
112+
113+ sizeSlider .setValueOwn (this .targetConfig .size / maxsize );
114+
115+ xPosSlider .setChangedListener (d -> this .targetConfig .x = (float ) (double ) d );
116+ yPosSlider .setChangedListener (d -> this .targetConfig .y = (float ) (double ) d );
117+ sizeSlider .setChangedListener (d -> this .targetConfig .size = (int ) (double ) d );
118+
119+ imagePathField .setMaxLength (512 );
120+ imagePathField .setText (this .targetConfig .identifier .toString ());
121+ imagePathField .setChangedListener ((s ) -> {
122+ try {
123+ setIdentifier (Identifier .tryParse (s ));
124+ } catch (Exception e ) {
125+ e .printStackTrace ();
126+ }
127+ });
128+
129+ addDrawableChild (toggleWidget .build ());
130+ addDrawableChild (confrmButton .build ());
131+ addDrawableChild (cancelButton .build ());
132+ addDrawableChild (folderButton .build ());
133+ addDrawableChild (imagePathField );
134+ addDrawableChild (sizeSlider );
135+ addDrawableChild (xPosSlider );
136+ addDrawableChild (yPosSlider );
137+ addDrawable (this ::renderCheckerboard );
138+ addDrawable (this ::renderPreview );
90139 }
91140
92141 private void setIdentifier (Identifier identifier ) {
93142 this .targetConfig .identifier = identifier ;
94143 }
95144
96145 private void confirm (ButtonWidget buttonWidget ) {
97- try {
146+ try {
98147 onSuccess .accept (targetConfig );
148+ } catch (Exception e ) {
149+ e .printStackTrace ();
99150 }
100- catch (Exception e ){e .printStackTrace ();}
101151 this .close ();
102152 }
103- private float bgx =0 ,bgy =0 ,color ,rot ;
153+
154+
155+ //? if <= 1.20.1 {
104156 @ Override
105157 public void render (DrawContext context , int mouseX , int mouseY , float delta ) {
106- int heightOffset = (int ) (24 *2.75 );
107- //? if <= 1.20.1 {
108158 renderBackground (context );
109- //?} else {
110- /*renderBackground(context,mouseX,mouseY,delta);
111- */ //?}
112159 super .render (context , mouseX , mouseY , delta );
113- var vec = new Vec2f (mouseX -width /2 ,mouseY -height /2 ).normalize ().multiply (delta );
114- bgx += vec .x ;
115- bgy += vec .y ;
116- color +=delta *0.05 ;
117- var n = 2 ;
118- renderCheckerboard (
160+ }
161+ //?}
162+
163+ private void renderPreview (DrawContext context , int mouseX , int mouseY , float delta ){
164+
165+ VersionFunctions .drawTexture (context , this .targetConfig .identifier , previewPosX , previewPosY , 0 , 0 , previewSize , previewSize , previewSize , previewSize );
166+ VersionFunctions .drawTexture (
119167 context ,
120- delta ,
121- VersionFunctions .ColorHelper .getArgb (255 ,
122- (int ) (128 +64 *Math .pow (Math .sin (color +0 *Math .PI /3 ),n )),
123- (int ) (128 +64 *Math .pow (Math .sin (color +2 *Math .PI /3 ),n )),
124- (int ) (128 +64 *Math .pow (Math .sin (color +4 *Math .PI /3 ),n ))
125- ),
126- VersionFunctions .ColorHelper .getArgb (255 ,
127- (int ) ((192 +63 *Math .pow (Math .cos (color +0 *Math .PI /3 ),n ))),
128- (int ) ((192 +63 *Math .pow (Math .cos (color +2 *Math .PI /3 ),n ))),
129- (int ) ((192 +63 *Math .pow (Math .cos (color +4 *Math .PI /3 ),n )))
130- )
168+ Identifier .of ("customcursor" , "textures/gui/pointer.png" ),
169+ (int ) (previewPosX + this .targetConfig .x * previewSize ) - 4 ,
170+ (int ) (previewPosY + this .targetConfig .y * previewSize ) - 4 ,
171+ 0 , 0 ,
172+ 8 , 8 ,
173+ 8 , 8 );
174+ }
175+
176+ private float bgx = 0 , bgy = 0 , color ;
177+
178+ private void renderCheckerboard (DrawContext context , int mouseX , int mouseY , float delta ) {
179+
180+ //generates slowly changing pastel colors for backround
181+ color += delta * 0.05f ;
182+ var n = 2 ;
183+ var color1 = VersionFunctions .ColorHelper .getArgb (255 ,
184+ (int ) (128 + 64 * Math .pow (Math .sin (color + 0 * Math .PI / 3 ), n )),
185+ (int ) (128 + 64 * Math .pow (Math .sin (color + 2 * Math .PI / 3 ), n )),
186+ (int ) (128 + 64 * Math .pow (Math .sin (color + 4 * Math .PI / 3 ), n ))
187+ );
188+ var color2 = VersionFunctions .ColorHelper .getArgb (255 ,
189+ (int ) ((192 + 63 * Math .pow (Math .cos (color + 0 * Math .PI / 3 ), n ))),
190+ (int ) ((192 + 63 * Math .pow (Math .cos (color + 2 * Math .PI / 3 ), n ))),
191+ (int ) ((192 + 63 * Math .pow (Math .cos (color + 4 * Math .PI / 3 ), n )))
131192 );
132193
133- try {
134- //? if < 1.20.3 {
135- VersionFunctions .drawTexture (context ,this .targetConfig .identifier ,width /2 -64 ,height /2 +heightOffset -64 ,0 ,0 ,128 ,128 , 128 ,128 );
136- //?} else {
137- /*VersionFunctions.drawTexture(context,this.targetConfig.identifier,width/2-64,height/2+heightOffset-64,0,0,128,128, 128,128);
138- */ //?}
139- }
140- catch (Exception e ){
141- CustomCursorInit .LOGGER .warn ("Failed to find texture %s" .formatted (this .targetConfig .identifier .toString ()));
142- }
194+ float r = VersionFunctions .ColorHelper .getRed (color1 ) / 255f ;
195+ float g = VersionFunctions .ColorHelper .getGreen (color1 ) / 255f ;
196+ float b = VersionFunctions .ColorHelper .getBlue (color1 ) / 255f ;
143197
144- VersionFunctions .drawTexture (context ,Identifier .of ("customcursor" ,"textures/gui/pointer.png" ), (int ) (width /2 -64 +this .targetConfig .x *128 )-4 , (int ) (height /2 -64 +this .targetConfig .y *128 )+heightOffset -4 ,0 ,0 ,8 ,8 , 8 ,8 );
145- }
198+
199+ var vec = new Vec2f (mouseX - (previewPosX +previewSize /2f ), mouseY - (previewPosY +previewSize /2f )).normalize ().multiply (delta );
200+ bgx += vec .x ;
201+ bgy += vec .y ;
202+
203+ context .fill (previewPosX , previewPosY , previewPosX + previewSize , previewPosY + previewSize , color2 );
204+ context .enableScissor (previewPosX , previewPosY , previewPosX + previewSize , previewPosY + previewSize );
146205
147206
148- private void renderCheckerboard (DrawContext context , float delta , int color1 , int color2 ) {
149- int heightOffset = (int ) (24 *2.75 );
150- context .fill (width /2 -64 ,height /2 +heightOffset -64 ,width /2 +64 ,height /2 +heightOffset +64 ,color2 );
151- context .enableScissor (width /2 -64 ,height /2 +heightOffset -64 ,width /2 +64 ,height /2 +heightOffset +64 );
152- rot +=new Random ().nextFloat (-0.5f ,0.5f )*delta /4 ;
153- //bgx+=Math.sin(rot)/9;
154- //bgy+=Math.cos(rot)/9;
155- //bgx+=delta/9;
156- //bgy+=delta/9;
207+ var cellsize = previewSize /8 ;
157208 context .getMatrices ().push ();
158- context .getMatrices ().translate ((width /2 -64 +MathHelper .floorMod (bgx ,16 )-16 ),(height /2 +heightOffset -64 +MathHelper .floorMod (bgy ,16 )-16 ),0 );
159- float r = VersionFunctions .ColorHelper .getRed (color1 )/255f ;
160- float g = VersionFunctions .ColorHelper .getGreen (color1 )/255f ;
161- float b = VersionFunctions .ColorHelper .getBlue (color1 )/255f ;
162- RenderSystem .setShaderColor (r ,g ,b ,255 );
163- VersionFunctions .drawTexture (context ,Identifier .of ("customcursor" ,"textures/gui/backgroundcheckerboard.png" ),
209+ context .getMatrices ().translate (
210+ (previewPosX + MathHelper .floorMod (bgx , cellsize ) - cellsize ),
211+ (previewPosY + MathHelper .floorMod (bgy , cellsize ) - cellsize ),
212+ 0 );
213+ RenderSystem .setShaderColor (r , g , b , 255 );
214+
215+ int checkerRenderSize = previewSize + cellsize ;
216+ VersionFunctions .drawTexture (context , Identifier .of ("customcursor" , "textures/gui/backgroundcheckerboard.png" ),
164217 0 ,
165218 0 ,
166219 0 ,
167- 0 ,144 ,144 ,144 ,144 );
168- RenderSystem .setShaderColor (1 ,1 ,1 ,1 );
220+ 0 , checkerRenderSize , checkerRenderSize , checkerRenderSize , checkerRenderSize );
221+ RenderSystem .setShaderColor (1 , 1 , 1 , 1 );
222+
169223 context .getMatrices ().pop ();
170224 context .disableScissor ();
171225 }
226+
172227 public static CursorEditScreen createCursorEditScreen (Screen parent ) {
173228 return new CursorEditScreen (parent , CustomCursorInit .getConfig ().pointer , c -> {
174229 var cfg = new CursorConfigStorage ();
0 commit comments